Skip to content

v1.0.4 — voice barge-in, voice memory, and chat_vision body rules

Choose a tag to compare

@enriquephl enriquephl released this 11 Aug 13:16
· 98 commits to main since this release
v1.0.4
3635244

Features

  • Manual voice barge-in (#240) — a new POST /comp/voice/{session_id}/turn/interrupt. Aborting the SSE already stopped generation; what was missing was persisting the interrupted reply, so history recorded a companion that never spoke. The client now reports what TTS actually played, and that is what lands in history. The same change makes a turn lost to a dropped connection regenerable instead of stranded — which also fixes a live bug where the engine emitted retryable: true on upstream failure and then refused the retry.
  • Voice memory: bootstrap + recall (#235) — first-turn bootstrap snapshot frozen into the session, plus per-turn vector recall, so a call is no longer memoryless.
  • Voice post-call memory ingestion (#236) — an ended call feeds the dreaming-lite sweeper, so what a user says on a call becomes reachable from later conversations.
  • chat_vision reaches [[providers.*.body]] (#239) — the vision pre-stage built its own wire body and bypassed body rules entirely, so no deployer knob could reach it. Notably this unlocks reasoning_effort on models that ignore reasoning = { enabled = false }, reason anyway, and bill for it.

Fixes

  • Affinity resolved via user×instance (#234) — the relationship line was dead on voice-channel sessions.
  • Text stream refuses a voice-channel session (#241) — 409 wrong_channel. Without it a text turn could land in a voice conversation, interleaving both channels in one transcript.

Docs

  • Corrected 14 inaccurate claims found by a docs-wide audit (#237), plus a 15-finding polish pass (#238).
  • Brought the voice surface — README, architecture, memory-layers — up to date with barge-in (#242).

Upgrading

This release contains migration 0041 (a partial unique index on engine.chat_messages, enforcing one assistant reply per voice turn). Apply it before the new binary serves traffic: without it the voice reply path's ON CONFLICT ... WHERE ... raises Postgres 42P10 and every voice reply is dropped. The persist failure logs at error! so it will not be silent, but the ordering still has to hold. The index build takes a write lock on chat_messages proportional to table size, consistent with the repo's other index migrations.

No API breaking changes. The new interrupt endpoint is additive, and the text stream's new 409 wrong_channel only fires on a session it should never have been writing to.