agents 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +20 -1
  2. package/dist/{agent-routing-CnkaHb-v.d.ts → agent-routing-DE5zmCQ8.d.ts} +1038 -394
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +26 -26
  5. package/dist/{agent-tools-C0XJqWzB.d.ts → agent-tools-DtXMTDGM.d.ts} +7 -7
  6. package/dist/agent-tools.d.ts +21 -21
  7. package/dist/browser/ai.js +4 -1
  8. package/dist/browser/ai.js.map +1 -1
  9. package/dist/browser/tanstack-ai.js.map +1 -1
  10. package/dist/callable-decorator-DP__HhBA.d.ts +72 -0
  11. package/dist/callable-decorator.d.ts +18 -0
  12. package/dist/callable-decorator.js +71 -0
  13. package/dist/callable-decorator.js.map +1 -0
  14. package/dist/capability-BjSKYpzg.js.map +1 -1
  15. package/dist/capability-runner-Be_-PLR1.d.ts +459 -0
  16. package/dist/channel-Bnm4S7T2.d.ts +491 -0
  17. package/dist/channels/ai-sdk.d.ts +46 -0
  18. package/dist/channels/ai-sdk.js +120 -0
  19. package/dist/channels/ai-sdk.js.map +1 -0
  20. package/dist/channels/email.d.ts +95 -0
  21. package/dist/channels/email.js +323 -0
  22. package/dist/channels/email.js.map +1 -0
  23. package/dist/channels/index.d.ts +233 -0
  24. package/dist/channels/index.js +608 -0
  25. package/dist/channels/index.js.map +1 -0
  26. package/dist/channels/slack.d.ts +140 -0
  27. package/dist/channels/slack.js +614 -0
  28. package/dist/channels/slack.js.map +1 -0
  29. package/dist/channels/tanstack-ai.d.ts +39 -0
  30. package/dist/channels/tanstack-ai.js +17 -0
  31. package/dist/channels/tanstack-ai.js.map +1 -0
  32. package/dist/channels/telegram.d.ts +106 -0
  33. package/dist/channels/telegram.js +427 -0
  34. package/dist/channels/telegram.js.map +1 -0
  35. package/dist/channels/voice.d.ts +45 -0
  36. package/dist/channels/voice.js +122 -0
  37. package/dist/channels/voice.js.map +1 -0
  38. package/dist/chat/index.d.ts +2325 -2019
  39. package/dist/chat/index.js +888 -518
  40. package/dist/chat/index.js.map +1 -1
  41. package/dist/chat-sdk/index.d.ts +7 -7
  42. package/dist/chat-sdk/index.js +1 -1
  43. package/dist/client.d.ts +1 -1
  44. package/dist/context/index.d.ts +216 -0
  45. package/dist/context/index.js +454 -0
  46. package/dist/context/index.js.map +1 -0
  47. package/dist/{current-agent-CuMErtly.d.ts → current-agent-Da_C9a3b.d.ts} +90 -107
  48. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  49. package/dist/{diagnostics-CaBjfz4J.js → diagnostics-BzvaX2UT.js} +5 -1
  50. package/dist/diagnostics-BzvaX2UT.js.map +1 -0
  51. package/dist/diagnostics-C4jcz3VK.js +360 -0
  52. package/dist/diagnostics-C4jcz3VK.js.map +1 -0
  53. package/dist/index-BB0kqhIz.d.ts +101 -0
  54. package/dist/index-BVVgDSdq.d.ts +1 -0
  55. package/dist/index-XDkuQ7zm.d.ts +89 -0
  56. package/dist/{index-DcSAZKsB.d.ts → index-YSKgfgg9.d.ts} +3 -1
  57. package/dist/index.d.ts +91 -82
  58. package/dist/index.js +3 -2
  59. package/dist/ingress-BfetZbMO.js +83 -0
  60. package/dist/ingress-BfetZbMO.js.map +1 -0
  61. package/dist/internal-CYlgHl1l.js +59 -0
  62. package/dist/internal-CYlgHl1l.js.map +1 -0
  63. package/dist/internal_context.d.ts +1 -1
  64. package/dist/lifecycle/index.d.ts +35 -17
  65. package/dist/lifecycle/index.js +1 -1
  66. package/dist/lifecycle-CMRGjZdw.js +1299 -0
  67. package/dist/lifecycle-CMRGjZdw.js.map +1 -0
  68. package/dist/mcp/client/index.d.ts +20 -20
  69. package/dist/mcp/index.d.ts +35 -35
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/observability/index.d.ts +1 -1
  72. package/dist/observability/index.js +1 -1
  73. package/dist/react.d.ts +4 -4
  74. package/dist/{retries-CAvxtG9d.d.ts → retries-D9Ds-1lz.d.ts} +17 -6
  75. package/dist/retries.d.ts +8 -6
  76. package/dist/retries.js +13 -1
  77. package/dist/retries.js.map +1 -1
  78. package/dist/routing/index.d.ts +137 -0
  79. package/dist/routing/index.js +244 -0
  80. package/dist/routing/index.js.map +1 -0
  81. package/dist/sanitize-D9TujEK8.js +79 -0
  82. package/dist/sanitize-D9TujEK8.js.map +1 -0
  83. package/dist/scheduler-DD9NdYbF.js +665 -0
  84. package/dist/scheduler-DD9NdYbF.js.map +1 -0
  85. package/dist/{scheduler-DQoTGoAW.d.ts → scheduler-Dwh85ZGl.d.ts} +21 -22
  86. package/dist/schedules/index.d.ts +1 -1
  87. package/dist/schedules/index.js +1 -1
  88. package/dist/sentence-chunker-BAidJ4DA.d.ts +68 -0
  89. package/dist/serializable.d.ts +1 -1
  90. package/dist/sessions/index.d.ts +441 -0
  91. package/dist/sessions/index.js +2063 -0
  92. package/dist/sessions/index.js.map +1 -0
  93. package/dist/skills/index.d.ts +99 -0
  94. package/dist/skills/index.js +254 -5
  95. package/dist/skills/index.js.map +1 -1
  96. package/dist/{src-5W6JNKVb.js → src-DlSHshb2.js} +1460 -1110
  97. package/dist/src-DlSHshb2.js.map +1 -0
  98. package/dist/streams/index.d.ts +120 -0
  99. package/dist/streams/index.js +107 -0
  100. package/dist/streams/index.js.map +1 -0
  101. package/dist/streams-D6tJ0NN9.d.ts +370 -0
  102. package/dist/streams-DZKgAj9b.js +709 -0
  103. package/dist/streams-DZKgAj9b.js.map +1 -0
  104. package/dist/sub-routing.d.ts +12 -12
  105. package/dist/surface-bZZJqBka.js +17 -0
  106. package/dist/surface-bZZJqBka.js.map +1 -0
  107. package/dist/tasks/index.d.ts +64 -0
  108. package/dist/tasks/index.js +2 -0
  109. package/dist/tasks-BRJ5zgya.d.ts +517 -0
  110. package/dist/tasks-ylZgBjhj.js +1656 -0
  111. package/dist/tasks-ylZgBjhj.js.map +1 -0
  112. package/dist/text-segment-joiner-BtAFQSA_.js +57 -0
  113. package/dist/text-segment-joiner-BtAFQSA_.js.map +1 -0
  114. package/dist/text-stream-CpdiKrJB.js +272 -0
  115. package/dist/text-stream-CpdiKrJB.js.map +1 -0
  116. package/dist/tokens-nHAKcN6M.js +52 -0
  117. package/dist/tokens-nHAKcN6M.js.map +1 -0
  118. package/dist/tool-schema-CBjGPrsQ.js +31 -0
  119. package/dist/tool-schema-CBjGPrsQ.js.map +1 -0
  120. package/dist/types-B7LojTe4.d.ts +202 -0
  121. package/dist/types-_Faxb570.d.ts +439 -0
  122. package/dist/voice/client.d.ts +226 -0
  123. package/dist/voice/client.js +932 -0
  124. package/dist/voice/client.js.map +1 -0
  125. package/dist/voice/errors.d.ts +43 -0
  126. package/dist/voice/errors.js +41 -0
  127. package/dist/voice/errors.js.map +1 -0
  128. package/dist/voice/index.d.ts +271 -0
  129. package/dist/voice/index.js +1812 -0
  130. package/dist/voice/index.js.map +1 -0
  131. package/dist/voice/react.d.ts +167 -0
  132. package/dist/voice/react.js +234 -0
  133. package/dist/voice/react.js.map +1 -0
  134. package/dist/voice/sfu.d.ts +71 -0
  135. package/dist/voice/sfu.js +157 -0
  136. package/dist/voice/sfu.js.map +1 -0
  137. package/dist/voice/text.d.ts +6 -0
  138. package/dist/voice/text.js +2 -0
  139. package/dist/voice/types.d.ts +58 -0
  140. package/dist/voice/types.js +18 -0
  141. package/dist/voice/types.js.map +1 -0
  142. package/dist/voice/workers-ai.d.ts +136 -0
  143. package/dist/voice/workers-ai.js +568 -0
  144. package/dist/voice/workers-ai.js.map +1 -0
  145. package/dist/websockets/index.d.ts +192 -0
  146. package/dist/websockets/index.js +2 -0
  147. package/dist/websockets-DUfRHPRq.js +502 -0
  148. package/dist/websockets-DUfRHPRq.js.map +1 -0
  149. package/dist/workflow-types.d.ts +25 -25
  150. package/dist/workflows.d.ts +21 -21
  151. package/dist/workflows.js +1 -1
  152. package/docs/agent-class.md +2 -2
  153. package/docs/agent-tools.md +2 -1
  154. package/docs/channels.md +323 -0
  155. package/docs/chat-agents.md +6 -13
  156. package/docs/context.md +131 -0
  157. package/docs/index.md +15 -12
  158. package/docs/lifecycle.md +102 -55
  159. package/docs/long-running-agents.md +2 -2
  160. package/docs/mcp-servers.md +5 -1
  161. package/docs/resumable-streaming.md +1 -1
  162. package/docs/routing.md +105 -0
  163. package/docs/sessions.md +237 -871
  164. package/docs/streams.md +213 -0
  165. package/docs/sub-agents.md +184 -124
  166. package/docs/tasks.md +246 -0
  167. package/docs/voice.md +745 -0
  168. package/package.json +115 -13
  169. package/dist/capability-runner-CvHGZqUu.d.ts +0 -150
  170. package/dist/compaction-helpers-iiKMr2TQ.js +0 -340
  171. package/dist/compaction-helpers-iiKMr2TQ.js.map +0 -1
  172. package/dist/compaction-helpers-wUz6M3us.d.ts +0 -621
  173. package/dist/diagnostics-CaBjfz4J.js.map +0 -1
  174. package/dist/durable-object-lifecycle-D6nNQJJd.js +0 -862
  175. package/dist/durable-object-lifecycle-D6nNQJJd.js.map +0 -1
  176. package/dist/experimental/memory/session/index.d.ts +0 -671
  177. package/dist/experimental/memory/session/index.js +0 -2379
  178. package/dist/experimental/memory/session/index.js.map +0 -1
  179. package/dist/experimental/memory/utils/index.d.ts +0 -96
  180. package/dist/experimental/memory/utils/index.js +0 -79
  181. package/dist/experimental/memory/utils/index.js.map +0 -1
  182. package/dist/scheduler-CR9RHGos.js +0 -857
  183. package/dist/scheduler-CR9RHGos.js.map +0 -1
  184. package/dist/src-5W6JNKVb.js.map +0 -1
  185. package/dist/tool-output-truncation-CNnnGZQ3.js +0 -98
  186. package/dist/tool-output-truncation-CNnnGZQ3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["parsed"],"sources":["../../src/voice/audio-pipeline.ts","../../src/voice/voice-input.ts","../../src/voice/index.ts"],"sourcesContent":["/**\n * Shared audio pipeline utilities and per-connection state management.\n * Used internally by both withVoice and withVoiceInput mixins.\n */\n\nimport { logVoiceError, toVoiceError } from \"./errors\";\nimport type {\n Transcriber,\n TranscriberSession,\n TranscriberSessionOptions\n} from \"./types\";\n\n/** Max audio buffer size per connection: 30 seconds at 16kHz mono 16-bit = 960KB. */\nexport const MAX_AUDIO_BUFFER_BYTES = 960_000;\n\n// --- Teardown-aware background task helper ---\n\n/**\n * True when an error is the platform's signal that a connection (or its\n * Durable Object) was torn down while an operation was in flight. A client\n * can drop at any moment — including mid-`start_call` while a `keepAlive()`\n * alarm write is still pending — and the runtime surfaces that as a\n * retryable \"Network connection lost.\" rejection (or a Durable Object reset).\n * These are expected races during shutdown, not bugs.\n */\nexport function isConnectionTeardownError(err: unknown): boolean {\n if (typeof err !== \"object\" || err === null) return false;\n const e = err as { message?: unknown; retryable?: unknown };\n const message = typeof e.message === \"string\" ? e.message : \"\";\n return (\n e.retryable === true ||\n message.includes(\"Network connection lost\") ||\n message.includes(\"Durable Object reset\") ||\n message.includes(\"Durable Object is overloaded\") ||\n message.includes(\"cannot access storage\")\n );\n}\n\n/**\n * Run a fire-and-forget task triggered by a WebSocket message so that it can\n * never surface as an unhandled rejection. Voice lifecycle handlers (start\n * call, end call, interrupt, transcript emission) do async work — storage\n * writes for `keepAlive()`, user-defined hooks — but are dispatched without\n * being awaited from the synchronous `onMessage` handler. If the connection\n * is torn down before that work settles, the rejection would otherwise be\n * unhandled. Expected teardown races are swallowed; anything else is logged.\n */\nexport function runBackground(\n label: string,\n fn: () => void | Promise<void>\n): void {\n Promise.resolve()\n .then(fn)\n .catch((error: unknown) => {\n if (isConnectionTeardownError(error)) return;\n logVoiceError({\n component: \"voice\",\n stage: \"background_task\",\n message: `${label} failed`,\n error: toVoiceError(error, `${label} failed`)\n });\n });\n}\n\n// --- Protocol helper ---\n\nexport function sendVoiceJSON(\n connection: { send(data: string | ArrayBuffer): void },\n data: unknown,\n _logPrefix: string,\n _skipLog = false\n): void {\n const json = JSON.stringify(data);\n connection.send(json);\n}\n\n// --- Connection audio state manager ---\n\n/**\n * Manages per-connection audio pipeline state for voice mixins.\n * Owns the Maps for audio buffers, transcriber sessions, and abort controllers.\n * Does not own pipeline orchestration — that stays in each mixin.\n */\nexport class AudioConnectionManager {\n #audioBuffers = new Map<string, ArrayBuffer[]>();\n #transcriberSessions = new Map<string, TranscriberSession>();\n #activePipeline = new Map<string, AbortController>();\n constructor(_logPrefix: string) {}\n\n // --- Connection lifecycle ---\n\n initConnection(connectionId: string): void {\n if (!this.#audioBuffers.has(connectionId)) {\n this.#audioBuffers.set(connectionId, []);\n }\n }\n\n isInCall(connectionId: string): boolean {\n return this.#audioBuffers.has(connectionId);\n }\n\n cleanup(connectionId: string): void {\n this.abortPipeline(connectionId);\n this.#audioBuffers.delete(connectionId);\n this.closeTranscriberSession(connectionId);\n }\n\n // --- Audio buffering ---\n\n bufferAudio(connectionId: string, chunk: ArrayBuffer): void {\n const buffer = this.#audioBuffers.get(connectionId);\n if (!buffer) return;\n buffer.push(chunk);\n\n let totalBytes = 0;\n for (const buf of buffer) totalBytes += buf.byteLength;\n\n // Trim to max buffer size\n while (totalBytes > MAX_AUDIO_BUFFER_BYTES && buffer.length > 1) {\n totalBytes -= buffer.shift()!.byteLength;\n }\n\n // Feed to transcriber session if active\n const session = this.#transcriberSessions.get(connectionId);\n if (session) {\n session.feed(chunk);\n }\n }\n\n clearAudioBuffer(connectionId: string): void {\n if (this.#audioBuffers.has(connectionId)) {\n this.#audioBuffers.set(connectionId, []);\n }\n }\n\n // --- Transcriber sessions ---\n\n hasTranscriberSession(connectionId: string): boolean {\n return this.#transcriberSessions.has(connectionId);\n }\n\n startTranscriberSession(\n connectionId: string,\n transcriber: Transcriber,\n options: TranscriberSessionOptions\n ): TranscriberSession {\n const hadSession = this.closeTranscriberSession(connectionId);\n const session = transcriber.createSession(options);\n this.#transcriberSessions.set(connectionId, session);\n\n // Replay audio that arrived before the first transcriber session was ready.\n const buffer = this.#audioBuffers.get(connectionId);\n if (!hadSession && buffer) {\n for (const chunk of buffer) {\n session.feed(chunk);\n }\n }\n\n return session;\n }\n\n closeTranscriberSession(connectionId: string): boolean {\n const session = this.#transcriberSessions.get(connectionId);\n if (!session) return false;\n session.close();\n this.#transcriberSessions.delete(connectionId);\n return true;\n }\n\n /**\n * Forward the agent's most recent spoken reply to the active transcriber\n * session for conversational context carryover. No-op when there is no\n * session or the provider does not implement `updateAgentContext`.\n */\n updateAgentContext(connectionId: string, text: string): void {\n const session = this.#transcriberSessions.get(connectionId);\n session?.updateAgentContext?.(text);\n }\n\n // --- Pipeline abort ---\n\n /**\n * Abort any in-flight pipeline and create a new AbortController.\n * Returns the new AbortSignal.\n */\n createPipelineAbort(connectionId: string): AbortSignal {\n this.abortPipeline(connectionId);\n const controller = new AbortController();\n this.#activePipeline.set(connectionId, controller);\n return controller.signal;\n }\n\n abortPipeline(connectionId: string): boolean {\n const controller = this.#activePipeline.get(connectionId);\n if (!controller) return false;\n controller.abort();\n this.#activePipeline.delete(connectionId);\n return true;\n }\n\n /**\n * Clear a pipeline abort controller only if it still matches the\n * given signal. Prevents a finished pipeline from deleting a\n * successor pipeline's controller in a concurrent scenario.\n */\n clearPipelineAbort(connectionId: string, signal?: AbortSignal): void {\n if (signal) {\n const controller = this.#activePipeline.get(connectionId);\n if (controller && controller.signal === signal) {\n this.#activePipeline.delete(connectionId);\n }\n } else {\n this.#activePipeline.delete(connectionId);\n }\n }\n}\n","/**\n * Voice-to-text input mixin for the Agents SDK.\n *\n * Unlike `withVoice` (which builds a full conversational voice agent with\n * STT → LLM → TTS), `withVoiceInput` only does STT and sends the\n * transcript back to the client. There is no TTS, no `onTurn`, and no\n * response generation — making it ideal for dictation / voice input UIs.\n *\n * Usage:\n * import { Agent } from \"../index\";\n * import { withVoiceInput, WorkersAINova3STT } from \"agents/voice\";\n *\n * const InputAgent = withVoiceInput(Agent);\n *\n * class MyAgent extends InputAgent<Env> {\n * transcriber = new WorkersAINova3STT(this.env.AI);\n *\n * onTranscript(text, connection) {\n * console.log(\"User said:\", text);\n * }\n * }\n *\n * @experimental This API is not yet stable and may change.\n */\n\nimport type { Agent, Connection, WSMessage } from \"../index\";\nimport { logVoiceError, toVoiceError, voiceErrorMessage } from \"./errors\";\nimport {\n ServerDiagnostics,\n type DiagnosticData,\n type TurnDiagnostics\n} from \"./diagnostics\";\nimport { VOICE_PROTOCOL_VERSION } from \"./types\";\nimport type {\n Transcriber,\n VoiceDiagnosticsOptions,\n VoiceTurnOutcome\n} from \"./types\";\nimport {\n AudioConnectionManager,\n runBackground,\n sendVoiceJSON\n} from \"./audio-pipeline\";\n\n// --- Mixin ---\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor constraint\ntype Constructor<T = object> = new (...args: any[]) => T;\n\ntype AgentLike = Constructor<Pick<Agent<Cloudflare.Env>, \"keepAlive\">>;\n\n/** Configuration options for the voice input mixin. */\nexport interface VoiceInputOptions {\n /** Optional diagnostic output. Diagnostic event names and metadata are not stable API. */\n diagnostics?: VoiceDiagnosticsOptions;\n}\n\n/** Public surface of the voice input mixin, used as an explicit return type to satisfy TS6 declaration emit. */\nexport interface VoiceInputMixinMembers {\n transcriber?: Transcriber;\n onTranscript(text: string, connection: Connection): void | Promise<void>;\n createTranscriber(connection: Connection): Transcriber | null;\n beforeCallStart(connection: Connection): boolean | Promise<boolean>;\n onCallStart(connection: Connection): void | Promise<void>;\n onCallEnd(connection: Connection): void | Promise<void>;\n onInterrupt(connection: Connection): void | Promise<void>;\n afterTranscribe(\n transcript: string,\n connection: Connection\n ): string | null | Promise<string | null>;\n}\n\ntype VoiceInputMixinReturn<TBase extends AgentLike> = TBase &\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor must accept any args\n (new (...args: any[]) => VoiceInputMixinMembers);\n\n/**\n * Voice-to-text input mixin. Adds STT-only voice input to an Agent class.\n *\n * Subclasses must set a `transcriber` property (or override `createTranscriber`).\n * No TTS provider is needed. Override `onTranscript` to handle each\n * transcribed utterance.\n *\n * @param Base - The Agent class to extend (e.g. `Agent`).\n * @param voiceInputOptions - Optional pipeline configuration.\n *\n * @example\n * ```typescript\n * import { Agent } from \"../index\";\n * import { withVoiceInput, WorkersAINova3STT } from \"agents/voice\";\n *\n * const InputAgent = withVoiceInput(Agent);\n *\n * class MyAgent extends InputAgent<Env> {\n * transcriber = new WorkersAINova3STT(this.env.AI);\n *\n * onTranscript(text, connection) {\n * console.log(\"User said:\", text);\n * }\n * }\n * ```\n */\nexport function withVoiceInput<TBase extends AgentLike>(\n Base: TBase,\n voiceInputOptions?: VoiceInputOptions\n): VoiceInputMixinReturn<TBase> {\n const diagnostics = new ServerDiagnostics(\n voiceInputOptions?.diagnostics?.browserConsole === true\n );\n\n class VoiceInputMixin extends Base {\n /** Continuous transcriber provider. */\n transcriber?: Transcriber;\n\n #cm = new AudioConnectionManager(\"VoiceInput\");\n #keepAliveDispose = new Map<string, () => void>();\n\n // Current async start_call identity per connection, used to ignore stale startup work.\n #startupTokens = new Map<string, symbol>();\n // Persists after readiness so callbacks from replaced sessions cannot affect a newer call.\n #callTokens = new Map<string, symbol>();\n #turnSequence = 0;\n #inputTurns = new Map<string, TurnDiagnostics>();\n #activeTurns = new Map<\n string,\n { signal: AbortSignal; turn: TurnDiagnostics }\n >();\n\n static #VOICE_MESSAGES = new Set([\n \"hello\",\n \"start_call\",\n \"end_call\",\n \"start_of_speech\",\n \"end_of_speech\",\n \"interrupt\"\n ]);\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor must accept any args\n constructor(...args: any[]) {\n super(...args);\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onConnect = (this as any).onConnect?.bind(this);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onClose = (this as any).onClose?.bind(this);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onMessage = (this as any).onMessage?.bind(this);\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onConnect = (\n connection: Connection,\n ...rest: unknown[]\n ) => {\n sendVoiceJSON(\n connection,\n {\n type: \"welcome\",\n protocol_version: VOICE_PROTOCOL_VERSION,\n ...(diagnostics.browserConsole\n ? { diagnostics: { browser_console: true as const } }\n : {})\n },\n \"VoiceInput\"\n );\n this.#diagnose(connection, \"connection.opened\");\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"idle\" },\n \"VoiceInput\"\n );\n return _onConnect?.(connection, ...rest);\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onClose = (connection: Connection, ...rest: unknown[]) => {\n this.#diagnose(connection, \"connection.closed\", {\n in_call: this.#cm.isInCall(connection.id)\n });\n this.#abortInputTurn(connection, \"connection_closed\");\n this.#requestActiveTurnAbort(connection, \"connection_closed\");\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#cm.cleanup(connection.id);\n return _onClose?.(connection, ...rest);\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onMessage = (\n connection: Connection,\n message: WSMessage\n ) => {\n if (message instanceof ArrayBuffer) {\n this.#cm.bufferAudio(connection.id, message);\n return;\n }\n\n if (typeof message !== \"string\") {\n return _onMessage?.(connection, message);\n }\n\n let parsed: { type: string };\n try {\n parsed = JSON.parse(message);\n } catch {\n return _onMessage?.(connection, message);\n }\n\n if (VoiceInputMixin.#VOICE_MESSAGES.has(parsed.type)) {\n switch (parsed.type) {\n case \"hello\":\n break;\n case \"start_call\":\n runBackground(\"start_call\", () =>\n this.#handleStartCall(connection)\n );\n break;\n case \"end_call\":\n runBackground(\"end_call\", () => this.#handleEndCall(connection));\n break;\n case \"start_of_speech\":\n case \"end_of_speech\":\n break;\n case \"interrupt\":\n runBackground(\"interrupt\", () =>\n this.#handleInterrupt(connection)\n );\n break;\n }\n return;\n }\n\n return _onMessage?.(connection, message);\n };\n }\n\n // --- User-overridable hooks ---\n\n onTranscript(\n _text: string,\n _connection: Connection\n ): void | Promise<void> {}\n\n /**\n * Override to create a transcriber dynamically per connection.\n * Return null to fall back to the `transcriber` property.\n */\n createTranscriber(_connection: Connection): Transcriber | null {\n return null;\n }\n\n beforeCallStart(_connection: Connection): boolean | Promise<boolean> {\n return true;\n }\n\n onCallStart(_connection: Connection): void | Promise<void> {}\n onCallEnd(_connection: Connection): void | Promise<void> {}\n onInterrupt(_connection: Connection): void | Promise<void> {}\n\n afterTranscribe(\n transcript: string,\n _connection: Connection\n ): string | null | Promise<string | null> {\n return transcript;\n }\n\n #diagnose(\n connection: Connection,\n event: string,\n data?: DiagnosticData\n ): void {\n diagnostics.emit(connection, event, data);\n }\n\n // --- Internal: call lifecycle ---\n\n async #handleStartCall(connection: Connection) {\n if (this.#cm.isInCall(connection.id)) {\n this.#diagnose(connection, \"call.start_ignored\", {\n reason: \"already_active\"\n });\n return;\n }\n\n this.#diagnose(connection, \"call.starting\");\n this.#abortInputTurn(connection, \"call_restarted\");\n const startupToken = Symbol(connection.id);\n this.#startupTokens.set(connection.id, startupToken);\n this.#callTokens.set(connection.id, startupToken);\n\n this.#cm.initConnection(connection.id);\n\n let startingTranscriber = false;\n try {\n const allowed = await this.beforeCallStart(connection);\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n if (!allowed) {\n await this.#handleStartupFailure(\n connection,\n startupToken,\n undefined,\n \"Voice call was rejected\",\n null\n );\n return;\n }\n\n const provider = this.createTranscriber(connection) ?? this.transcriber;\n if (!provider) {\n const message =\n \"No transcriber configured. Set 'transcriber' on your VoiceInput subclass or override createTranscriber().\";\n logVoiceError({\n component: \"VoiceInput\",\n stage: \"configuration\",\n message,\n connectionId: connection.id,\n error: new Error(message)\n });\n await this.#handleStartupFailure(\n connection,\n startupToken,\n undefined,\n message,\n null\n );\n return;\n }\n\n const dispose = await this.keepAlive();\n if (!this.#isCurrentStartup(connection.id, startupToken)) {\n dispose();\n return;\n }\n this.#keepAliveDispose.set(connection.id, dispose);\n\n startingTranscriber = true;\n this.#diagnose(connection, \"stt.starting\");\n const session = this.#cm.startTranscriberSession(\n connection.id,\n provider,\n {\n onInterim: (text: string) => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#getOrCreateInputTurn(connection);\n turn.firstInterim(text.length);\n sendVoiceJSON(\n connection,\n { type: \"transcript_interim\", text },\n \"VoiceInput\"\n );\n },\n onSpeechStart: () => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#replaceInputTurn(connection);\n turn.speechStarted();\n },\n onUtterance: (transcript: string) => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#takeInputTurn(connection);\n turn.finalInput(transcript.length);\n runBackground(\"emitTranscript\", () =>\n this.#emitTranscript(connection, transcript, turn)\n );\n },\n onFatalError: (error: Error) => {\n runBackground(\"transcriber_fatal\", () =>\n this.#handleTranscriberFatal(connection, startupToken, error)\n );\n }\n }\n );\n await session.waitUntilReady?.();\n startingTranscriber = false;\n } catch (error) {\n const clientMessage = startingTranscriber\n ? \"Speech recognition failed to start\"\n : \"Voice input failed to start\";\n await this.#handleStartupFailure(\n connection,\n startupToken,\n toVoiceError(error, clientMessage),\n clientMessage,\n startingTranscriber ? \"transcriber_startup\" : \"call_startup\",\n startingTranscriber\n ? {\n code: \"stt_startup_failed\",\n stage: \"stt\",\n retryable: false\n }\n : undefined\n );\n return;\n }\n\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n this.#startupTokens.delete(connection.id);\n\n this.#diagnose(connection, \"stt.ready\");\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"listening\" },\n \"VoiceInput\"\n );\n\n this.#diagnose(connection, \"call.ready\");\n await this.onCallStart(connection);\n }\n\n #isCurrentStartup(connectionId: string, startupToken: symbol): boolean {\n return (\n this.#startupTokens.get(connectionId) === startupToken &&\n this.#cm.isInCall(connectionId)\n );\n }\n\n async #handleStartupFailure(\n connection: Connection,\n startupToken: symbol,\n error: Error | undefined,\n clientMessage: string,\n logStage: string | null = \"call_startup\",\n structuredError?: {\n code: \"stt_startup_failed\";\n stage: \"stt\";\n retryable: false;\n }\n ): Promise<void> {\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n\n // The client starts local audio optimistically on start_call. Every\n // terminal startup path must send error + idle so it tears that down.\n if (logStage && error !== undefined) {\n logVoiceError({\n component: \"VoiceInput\",\n stage: logStage,\n message: clientMessage,\n connectionId: connection.id,\n error\n });\n }\n this.#startupTokens.delete(connection.id);\n if (this.#callTokens.get(connection.id) === startupToken) {\n this.#callTokens.delete(connection.id);\n }\n this.#diagnose(connection, \"call.start_failed\", {\n stage: logStage ?? \"authorization\",\n retryable: structuredError?.retryable ?? false,\n ...(error === undefined ? {} : { error })\n });\n sendVoiceJSON(\n connection,\n { type: \"error\", message: clientMessage, ...structuredError },\n \"VoiceInput\"\n );\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n this.#diagnose(connection, \"call.ended\", {\n reason: \"startup_failed\"\n });\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"idle\" },\n \"VoiceInput\"\n );\n await this.onCallEnd(connection);\n }\n\n async #handleTranscriberFatal(\n connection: Connection,\n callToken: symbol,\n error: Error\n ): Promise<void> {\n if (\n this.#callTokens.get(connection.id) !== callToken ||\n !this.#cm.isInCall(connection.id)\n ) {\n return;\n }\n\n const isStarting = this.#startupTokens.get(connection.id) === callToken;\n const message = isStarting\n ? \"Speech recognition failed to start\"\n : \"Speech recognition connection was lost\";\n logVoiceError({\n component: \"VoiceInput\",\n stage: isStarting ? \"transcriber_startup\" : \"transcriber_runtime\",\n message,\n connectionId: connection.id,\n error\n });\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#abortInputTurn(connection, \"stt_fatal\");\n this.#requestActiveTurnAbort(connection, \"stt_fatal\");\n this.#diagnose(connection, \"stt.fatal\", {\n stage: isStarting ? \"startup\" : \"runtime\",\n retryable: !isStarting,\n error\n });\n sendVoiceJSON(\n connection,\n {\n type: \"error\",\n message,\n code: isStarting ? \"stt_startup_failed\" : \"stt_connection_lost\",\n stage: \"stt\",\n retryable: !isStarting\n },\n \"VoiceInput\"\n );\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n this.#diagnose(connection, \"call.ended\", { reason: \"stt_fatal\" });\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"idle\" },\n \"VoiceInput\"\n );\n await this.onCallEnd(connection);\n }\n\n #createTurn(connection: Connection): TurnDiagnostics {\n const turn = diagnostics.turn(\n connection,\n `turn_${(++this.#turnSequence).toString(36)}`,\n \"speech\"\n );\n turn.emit(\"turn.started\", { source: \"speech\" });\n return turn;\n }\n\n #replaceInputTurn(connection: Connection): TurnDiagnostics {\n this.#abortInputTurn(connection, \"replaced\");\n const turn = this.#createTurn(connection);\n this.#inputTurns.set(connection.id, turn);\n return turn;\n }\n\n #getOrCreateInputTurn(connection: Connection): TurnDiagnostics {\n const current = this.#inputTurns.get(connection.id);\n if (current) return current;\n const turn = this.#createTurn(connection);\n this.#inputTurns.set(connection.id, turn);\n return turn;\n }\n\n #takeInputTurn(connection: Connection): TurnDiagnostics {\n const turn = this.#getOrCreateInputTurn(connection);\n this.#inputTurns.delete(connection.id);\n return turn;\n }\n\n #abortInputTurn(connection: Connection, reason: string): void {\n const turn = this.#inputTurns.get(connection.id);\n if (!turn) return;\n this.#inputTurns.delete(connection.id);\n turn.emit(\"turn.aborted\", { reason });\n turn.finish(\"aborted\");\n }\n\n #activateTurn(\n connection: Connection,\n turn: TurnDiagnostics\n ): { signal: AbortSignal; turn: TurnDiagnostics } {\n this.#requestActiveTurnAbort(connection, \"replaced\");\n const signal = this.#cm.createPipelineAbort(connection.id);\n const active = { signal, turn };\n this.#activeTurns.set(connection.id, active);\n return active;\n }\n\n #requestActiveTurnAbort(connection: Connection, reason: string): void {\n const active = this.#activeTurns.get(connection.id);\n if (!active) return;\n active.turn.emit(\"turn.abort_requested\", { reason });\n }\n\n #clearActiveTurn(\n connectionId: string,\n active: { signal: AbortSignal; turn: TurnDiagnostics }\n ): void {\n if (this.#activeTurns.get(connectionId) === active) {\n this.#activeTurns.delete(connectionId);\n }\n }\n\n #releaseKeepAlive(connectionId: string) {\n const dispose = this.#keepAliveDispose.get(connectionId);\n if (dispose) {\n dispose();\n this.#keepAliveDispose.delete(connectionId);\n }\n }\n\n #handleEndCall(connection: Connection) {\n this.#diagnose(connection, \"call.ended\", { reason: \"requested\" });\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#abortInputTurn(connection, \"call_ended\");\n this.#requestActiveTurnAbort(connection, \"call_ended\");\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"idle\" },\n \"VoiceInput\"\n );\n // Return the (possibly async) consumer hook so its rejections are\n // caught by the runBackground wrapper around this handler.\n return this.onCallEnd(connection);\n }\n\n #handleInterrupt(connection: Connection) {\n this.#abortInputTurn(connection, \"client_interrupt\");\n this.#requestActiveTurnAbort(connection, \"client_interrupt\");\n const interrupted = this.#cm.abortPipeline(connection.id);\n this.#diagnose(connection, \"turn.interrupt_requested\", {\n active_turn: interrupted\n });\n this.#cm.clearAudioBuffer(connection.id);\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"listening\" },\n \"VoiceInput\"\n );\n return this.onInterrupt(connection);\n }\n\n // --- Internal: transcript emission ---\n\n async #emitTranscript(\n connection: Connection,\n transcript: string,\n turn: TurnDiagnostics\n ) {\n const active = this.#activateTurn(connection, turn);\n const { signal } = active;\n let outcome: VoiceTurnOutcome = \"completed\";\n let restoreListening = true;\n try {\n const afterTranscribeStart = Date.now();\n const userText = await this.afterTranscribe(transcript, connection);\n turn.recordAfterTranscribe(\n Date.now() - afterTranscribeStart,\n userText ? \"accepted\" : \"skipped\",\n userText?.length ?? 0\n );\n if (signal.aborted) return;\n if (!userText) {\n outcome = \"skipped\";\n restoreListening = false;\n return;\n }\n\n sendVoiceJSON(\n connection,\n { type: \"transcript_interim\", text: \"\" },\n \"VoiceInput\"\n );\n\n sendVoiceJSON(\n connection,\n { type: \"transcript\", role: \"user\", text: userText },\n \"VoiceInput\"\n );\n\n await this.onTranscript(userText, connection);\n } catch (error) {\n if (signal.aborted) return;\n const voiceError = toVoiceError(error, \"Transcript processing failed\");\n outcome = \"error\";\n turn.emit(\"turn.error\", {\n stage: \"transcript\",\n error: voiceError\n });\n logVoiceError({\n component: \"VoiceInput\",\n stage: \"transcript\",\n message: \"Transcript processing failed\",\n connectionId: connection.id,\n error: voiceError\n });\n sendVoiceJSON(\n connection,\n {\n type: \"error\",\n message: voiceErrorMessage(\n voiceError,\n \"Transcript processing failed\"\n )\n },\n \"VoiceInput\"\n );\n } finally {\n if (signal.aborted) {\n outcome = \"aborted\";\n turn.emit(\"turn.aborted\");\n }\n turn.finish(outcome);\n this.#cm.clearPipelineAbort(connection.id, signal);\n this.#clearActiveTurn(connection.id, active);\n if (restoreListening && this.#cm.isInCall(connection.id)) {\n sendVoiceJSON(\n connection,\n { type: \"status\", status: \"listening\" },\n \"VoiceInput\"\n );\n }\n }\n }\n }\n\n return VoiceInputMixin as unknown as VoiceInputMixinReturn<TBase>;\n}\n","/**\n * Voice pipeline mixin for the Agents SDK.\n *\n * Usage:\n * import { Agent } from \"../index\";\n * import { withVoice, WorkersAIFluxSTT, WorkersAITTS } from \"agents/voice\";\n *\n * const VoiceAgent = withVoice(Agent);\n *\n * class MyAgent extends VoiceAgent<Env> {\n * transcriber = new WorkersAIFluxSTT(this.env.AI);\n * tts = new WorkersAITTS(this.env.AI);\n *\n * async onTurn(transcript, context) {\n * const result = streamText({ ... });\n * return result.stream;\n * }\n * }\n *\n * This mixin adds the full voice pipeline: continuous STT, streaming TTS,\n * interruption handling, conversation persistence, and the WebSocket\n * voice protocol. The transcriber session is per-call — created at\n * start_call, closed at end_call. The model handles turn detection.\n *\n * @experimental This API is not yet stable and may change.\n */\n\nimport type { Agent, Connection, WSMessage } from \"../index\";\nimport { SentenceChunker } from \"./sentence-chunker\";\nimport { logVoiceError, toVoiceError, voiceErrorMessage } from \"./errors\";\nimport {\n ServerDiagnostics,\n type DiagnosticData,\n type ModelDiagnosticTracker,\n type TurnDiagnostics\n} from \"./diagnostics\";\nimport {\n iterateTextEvents,\n type TextSource,\n type TextStreamEvent\n} from \"./text-stream\";\nimport { VOICE_PROTOCOL_VERSION } from \"./types\";\nimport type {\n VoiceRole,\n VoiceAudioFormat,\n TTSProvider,\n StreamingTTSProvider,\n Transcriber,\n TranscriberSession,\n VoiceCompletionOutcome,\n VoiceModelFinishReason,\n VoiceDiagnosticsOptions,\n VoiceTurnOutcome\n} from \"./types\";\nimport {\n AudioConnectionManager,\n runBackground,\n sendVoiceJSON\n} from \"./audio-pipeline\";\n\n// Re-export SentenceChunker for direct use\nexport { SentenceChunker } from \"./sentence-chunker\";\n\n// Re-export protocol version constant\nexport { VOICE_PROTOCOL_VERSION } from \"./types\";\n\n// Re-export shared types\nexport type {\n VoiceStatus,\n VoiceRole,\n VoiceAudioFormat,\n VoiceAudioInput,\n VoiceTransport,\n VoiceTransportCloseInfo,\n VoiceError,\n VoiceErrorCode,\n VoiceErrorStage,\n VoiceCompletionOutcome,\n VoiceCompletionOutcomeCode,\n VoiceModelFinishReason,\n VoiceDiagnosticsOptions,\n VoiceDiagnosticEvent,\n VoiceTurnMetrics,\n VoiceTurnOutcome,\n VoiceTurnSource,\n VoiceClientMessage,\n VoiceServerMessage,\n VoicePipelineMetrics,\n TranscriptMessage,\n TTSProvider,\n StreamingTTSProvider,\n Transcriber,\n TranscriberSession,\n TranscriberSessionOptions\n} from \"./types\";\n\n// Re-export voice input mixin (STT-only, no TTS/LLM)\nexport { withVoiceInput, type VoiceInputOptions } from \"./voice-input\";\n\n// Re-export text stream utility\nexport { iterateText, type TextSource } from \"./text-stream\";\n\n// Re-export SFU utility functions\nexport {\n decodeVarint,\n encodeVarint,\n extractPayloadFromProtobuf,\n encodePayloadToProtobuf,\n downsample48kStereoTo16kMono,\n upsample16kMonoTo48kStereo,\n sfuFetch,\n createSFUSession,\n addSFUTracks,\n renegotiateSFUSession,\n createSFUWebSocketAdapter\n} from \"./sfu\";\nexport type { SFUConfig } from \"./sfu\";\n\n// Re-export Workers AI providers\nexport {\n WorkersAITTS,\n WorkersAIFluxSTT,\n WorkersAINova3STT\n} from \"./workers-ai\";\nexport type {\n WorkersAITTSOptions,\n WorkersAIFluxSTTOptions,\n WorkersAINova3STTOptions\n} from \"./workers-ai\";\n\n// --- Public types ---\n\n/** Context passed to the `onTurn()` hook. */\nexport interface VoiceTurnContext {\n connection: Connection;\n /** Completed conversation history before the current transcript. */\n messages: Array<{ role: VoiceRole; content: string }>;\n signal: AbortSignal;\n}\n\n/** Configuration options for the voice mixin. Passed to `withVoice()`. */\nexport interface VoiceAgentOptions {\n /** Max conversation history messages loaded for context. @default 20 */\n historyLimit?: number;\n /** Audio format used for binary audio payloads sent to the client. @default \"mp3\" */\n audioFormat?: VoiceAudioFormat;\n /**\n * Sample rate (Hz) of raw PCM audio payloads sent to the client.\n * Declared in the `audio_config` message so the client can play `pcm16`\n * at the provider's native rate (e.g. 24000 for Gemini TTS).\n * Encoded formats (mp3/wav/opus) carry their own rate and ignore this.\n * @default 16000\n */\n sampleRate?: number;\n /** Max conversation messages to keep in SQLite. Oldest are pruned. @default 1000 */\n maxMessageCount?: number;\n /** Optional diagnostic output. Diagnostic event names and metadata are not stable API. */\n diagnostics?: VoiceDiagnosticsOptions;\n}\n\n// --- Default option values ---\n\nconst DEFAULT_HISTORY_LIMIT = 20;\nconst DEFAULT_MAX_MESSAGE_COUNT = 1000;\nconst DEFAULT_SAMPLE_RATE = 16000;\n\nclass ModelStreamError extends Error {\n readonly streamError: Error;\n readonly partialOutput: boolean;\n\n constructor(streamError: Error, partialOutput: boolean) {\n super(streamError.message, { cause: streamError });\n this.name = \"ModelStreamError\";\n this.streamError = streamError;\n this.partialOutput = partialOutput;\n }\n}\n\nfunction completionOutcomeCode(\n finishReason: VoiceModelFinishReason | undefined,\n hasOutput: boolean\n): VoiceCompletionOutcome[\"code\"] | null {\n if (finishReason === \"length\") return \"output_limit\";\n if (finishReason === \"content-filter\") return \"content_filtered\";\n if (finishReason === \"error\") return \"model_error\";\n return hasOutput ? null : \"no_output\";\n}\n\nfunction stableTurnOutcome(\n finishReason: VoiceModelFinishReason | undefined,\n hasOutput: boolean\n): VoiceTurnOutcome {\n return completionOutcomeCode(finishReason, hasOutput) ?? \"completed\";\n}\n\nfunction createCompletionOutcome(\n finishReason: VoiceModelFinishReason | undefined,\n partialOutput: boolean\n): VoiceCompletionOutcome | null {\n const code = completionOutcomeCode(finishReason, partialOutput);\n return code === null\n ? null\n : {\n code,\n stage: \"llm\",\n ...(finishReason === undefined ? {} : { finishReason }),\n partialOutput\n };\n}\n\n// --- Mixin ---\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor constraint\ntype Constructor<T = object> = new (...args: any[]) => T;\n\ntype AgentLike = Constructor<\n Pick<Agent<Cloudflare.Env>, \"sql\" | \"getConnections\" | \"keepAlive\">\n>;\n\ntype ActiveTurnDiagnostics = {\n signal: AbortSignal;\n turn: TurnDiagnostics;\n model?: ModelDiagnosticTracker;\n};\n\n/** Public surface of the voice mixin, used as an explicit return type to satisfy TS6 declaration emit. */\nexport interface VoiceAgentMixinMembers {\n transcriber?: Transcriber;\n tts?: (TTSProvider & Partial<StreamingTTSProvider>) | undefined;\n onTurn(transcript: string, context: VoiceTurnContext): Promise<TextSource>;\n createTranscriber(connection: Connection): Transcriber | null;\n beforeCallStart(connection: Connection): boolean | Promise<boolean>;\n onCallStart(connection: Connection): void | Promise<void>;\n onCallEnd(connection: Connection): void | Promise<void>;\n onInterrupt(connection: Connection): void | Promise<void>;\n afterTranscribe(\n transcript: string,\n connection: Connection\n ): string | null | Promise<string | null>;\n beforeSynthesize(\n text: string,\n connection: Connection\n ): string | null | Promise<string | null>;\n afterSynthesize(\n audio: ArrayBuffer | null,\n text: string,\n connection: Connection\n ): ArrayBuffer | null | Promise<ArrayBuffer | null>;\n saveMessage(role: \"user\" | \"assistant\", text: string): void;\n getConversationHistory(\n limit?: number\n ): Array<{ role: VoiceRole; content: string }>;\n forceEndCall(connection: Connection): void;\n speak(connection: Connection, text: string): Promise<void>;\n speakAll(text: string): Promise<void>;\n}\n\ntype VoiceAgentMixinReturn<TBase extends AgentLike> = TBase &\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor must accept any args\n (new (...args: any[]) => VoiceAgentMixinMembers);\n\n/**\n * Voice pipeline mixin. Adds the full voice pipeline to an Agent class.\n *\n * Subclasses must set a `transcriber` property (or override `createTranscriber`)\n * and a `tts` provider property. The transcriber session is per-call — created\n * at start_call and closed at end_call. The model handles turn detection.\n *\n * @param Base - The Agent class to extend (e.g. `Agent`).\n * @param voiceOptions - Optional pipeline configuration.\n *\n * @example\n * ```typescript\n * import { Agent } from \"../index\";\n * import { withVoice, WorkersAIFluxSTT, WorkersAITTS } from \"agents/voice\";\n *\n * const VoiceAgent = withVoice(Agent);\n *\n * class MyAgent extends VoiceAgent<Env> {\n * transcriber = new WorkersAIFluxSTT(this.env.AI);\n * tts = new WorkersAITTS(this.env.AI);\n *\n * async onTurn(transcript, context) {\n * return \"Hello! I heard you say: \" + transcript;\n * }\n * }\n * ```\n */\nexport function withVoice<TBase extends AgentLike>(\n Base: TBase,\n voiceOptions?: VoiceAgentOptions\n): VoiceAgentMixinReturn<TBase> {\n const opts = voiceOptions ?? {};\n const diagnostics = new ServerDiagnostics(\n opts.diagnostics?.browserConsole === true\n );\n\n function opt<K extends keyof VoiceAgentOptions>(\n key: K,\n fallback: NonNullable<VoiceAgentOptions[K]>\n ): NonNullable<VoiceAgentOptions[K]> {\n return (opts[key] ?? fallback) as NonNullable<VoiceAgentOptions[K]>;\n }\n\n class VoiceAgentMixin extends Base {\n // --- Provider properties (set by subclass) ---\n\n /** Continuous transcriber provider. */\n transcriber?: Transcriber;\n /** Text-to-speech provider. Required. May also implement StreamingTTSProvider. */\n tts?: TTSProvider & Partial<StreamingTTSProvider>;\n\n // Shared per-connection audio state manager\n #cm = new AudioConnectionManager(\"VoiceAgent\");\n\n // keepAlive dispose functions per connection (prevents DO eviction during calls)\n #keepAliveDispose = new Map<string, () => void>();\n\n // Current async start_call identity per connection, used to ignore stale readiness.\n #startupTokens = new Map<string, symbol>();\n // Persists after readiness so callbacks from replaced sessions cannot affect a newer call.\n #callTokens = new Map<string, symbol>();\n #turnSequence = 0;\n #inputTurns = new Map<string, TurnDiagnostics>();\n #activeTurnDiagnostics = new Map<string, ActiveTurnDiagnostics>();\n\n // Voice protocol message types handled internally\n static #VOICE_MESSAGES = new Set([\n \"hello\",\n \"start_call\",\n \"end_call\",\n \"start_of_speech\",\n \"end_of_speech\",\n \"interrupt\",\n \"text_message\"\n ]);\n\n // --- Agent lifecycle ---\n\n #schemaReady = false;\n\n #ensureSchema() {\n if (this.#schemaReady) return;\n this.sql`\n CREATE TABLE IF NOT EXISTS cf_voice_messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n role TEXT NOT NULL,\n text TEXT NOT NULL,\n timestamp INTEGER NOT NULL\n )\n `;\n this.#schemaReady = true;\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- mixin constructor must accept any args\n constructor(...args: any[]) {\n super(...args);\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onConnect = (this as any).onConnect?.bind(this);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onClose = (this as any).onClose?.bind(this);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- binding consumer methods\n const _onMessage = (this as any).onMessage?.bind(this);\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onConnect = (\n connection: Connection,\n ...rest: unknown[]\n ) => {\n this.#sendJSON(connection, {\n type: \"welcome\",\n protocol_version: VOICE_PROTOCOL_VERSION,\n ...(diagnostics.browserConsole\n ? { diagnostics: { browser_console: true as const } }\n : {})\n });\n this.#diagnose(connection, \"connection.opened\");\n this.#sendJSON(connection, { type: \"status\", status: \"idle\" });\n return _onConnect?.(connection, ...rest);\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onClose = (connection: Connection, ...rest: unknown[]) => {\n this.#diagnose(connection, \"connection.closed\", {\n in_call: this.#cm.isInCall(connection.id)\n });\n this.#requestActiveTurnAbort(\n connection,\n \"turn.abort_requested\",\n \"connection_closed\"\n );\n this.#abortInputTurn(connection, \"connection_closed\");\n this.#activeTurnDiagnostics.delete(connection.id);\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#cm.cleanup(connection.id);\n return _onClose?.(connection, ...rest);\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- overwriting lifecycle\n (this as any).onMessage = (\n connection: Connection,\n message: WSMessage\n ) => {\n if (message instanceof ArrayBuffer) {\n this.#cm.bufferAudio(connection.id, message);\n return;\n }\n\n if (typeof message !== \"string\") {\n return _onMessage?.(connection, message);\n }\n\n let parsed: { type: string };\n try {\n parsed = JSON.parse(message);\n } catch {\n return _onMessage?.(connection, message);\n }\n\n if (VoiceAgentMixin.#VOICE_MESSAGES.has(parsed.type)) {\n switch (parsed.type) {\n case \"hello\":\n break;\n case \"start_call\":\n runBackground(\"start_call\", () =>\n this.#handleStartCall(\n connection,\n (parsed as { preferred_format?: string }).preferred_format\n )\n );\n break;\n case \"end_call\":\n runBackground(\"end_call\", () => this.#handleEndCall(connection));\n break;\n case \"start_of_speech\":\n case \"end_of_speech\":\n break;\n case \"interrupt\":\n runBackground(\"interrupt\", () =>\n this.#handleInterrupt(connection)\n );\n break;\n case \"text_message\": {\n const text = (parsed as unknown as { text?: string }).text;\n if (typeof text === \"string\") {\n runBackground(\"text_message\", () =>\n this.#handleTextMessage(connection, text)\n );\n }\n break;\n }\n }\n return;\n }\n\n return _onMessage?.(connection, message);\n };\n }\n\n // --- User-overridable hooks ---\n\n onTurn(\n _transcript: string,\n _context: VoiceTurnContext\n ): Promise<TextSource> {\n throw new Error(\n \"VoiceAgent subclass must implement onTurn(). Return a string, AI SDK stream, AsyncIterable<string>, or ReadableStream.\"\n );\n }\n\n /**\n * Override to create a transcriber dynamically per connection.\n * Useful for runtime model switching (e.g. Flux vs Nova 3 dropdown).\n * Return null to fall back to the `transcriber` property.\n */\n createTranscriber(_connection: Connection): Transcriber | null {\n return null;\n }\n\n beforeCallStart(_connection: Connection): boolean | Promise<boolean> {\n return true;\n }\n\n onCallStart(_connection: Connection): void | Promise<void> {}\n onCallEnd(_connection: Connection): void | Promise<void> {}\n onInterrupt(_connection: Connection): void | Promise<void> {}\n\n afterTranscribe(\n transcript: string,\n _connection: Connection\n ): string | null | Promise<string | null> {\n return transcript;\n }\n\n beforeSynthesize(\n text: string,\n _connection: Connection\n ): string | null | Promise<string | null> {\n return text;\n }\n\n afterSynthesize(\n audio: ArrayBuffer | null,\n _text: string,\n _connection: Connection\n ): ArrayBuffer | null | Promise<ArrayBuffer | null> {\n return audio;\n }\n\n // --- Conversation persistence ---\n\n saveMessage(role: \"user\" | \"assistant\", text: string) {\n this.#ensureSchema();\n this.sql`\n INSERT INTO cf_voice_messages (role, text, timestamp)\n VALUES (${role}, ${text}, ${Date.now()})\n `;\n\n const maxMessages = opt(\"maxMessageCount\", DEFAULT_MAX_MESSAGE_COUNT);\n this.sql`\n DELETE FROM cf_voice_messages\n WHERE id NOT IN (\n SELECT id FROM cf_voice_messages\n ORDER BY id DESC LIMIT ${maxMessages}\n )\n `;\n }\n\n getConversationHistory(\n limit?: number\n ): Array<{ role: VoiceRole; content: string }> {\n this.#ensureSchema();\n const historyLimit = limit ?? opt(\"historyLimit\", DEFAULT_HISTORY_LIMIT);\n const rows = this.sql<{ role: VoiceRole; text: string }>`\n SELECT role, text FROM cf_voice_messages\n ORDER BY id DESC LIMIT ${historyLimit}\n `;\n return rows.reverse().map((row) => ({\n role: row.role,\n content: row.text\n }));\n }\n\n // --- Convenience methods ---\n\n forceEndCall(connection: Connection): void {\n if (!this.#cm.isInCall(connection.id)) return;\n this.#handleEndCall(connection);\n }\n\n async speak(connection: Connection, text: string): Promise<void> {\n const signal = this.#cm.createPipelineAbort(connection.id);\n try {\n this.#sendJSON(connection, {\n type: \"transcript_start\",\n role: \"assistant\"\n });\n this.#sendJSON(connection, { type: \"transcript_end\", text });\n\n const audio = await this.#synthesizeWithHooks(text, connection, signal);\n if (audio && !signal.aborted) {\n this.#sendJSON(connection, { type: \"status\", status: \"speaking\" });\n this.#diagnose(connection, \"audio.first_sent\", {\n bytes: audio.byteLength\n });\n connection.send(audio);\n this.#diagnose(connection, \"audio.completed\", {\n bytes: audio.byteLength\n });\n }\n\n if (!signal.aborted) {\n this.#cm.updateAgentContext(connection.id, text);\n this.saveMessage(\"assistant\", text);\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n }\n } finally {\n this.#cm.clearPipelineAbort(connection.id, signal);\n }\n }\n\n async speakAll(text: string): Promise<void> {\n this.saveMessage(\"assistant\", text);\n\n const connections = [...this.getConnections()];\n if (connections.length === 0) return;\n\n for (const connection of connections) {\n const signal = this.#cm.createPipelineAbort(connection.id);\n try {\n this.#sendJSON(connection, {\n type: \"transcript_start\",\n role: \"assistant\"\n });\n this.#sendJSON(connection, { type: \"transcript_end\", text });\n\n const audio = await this.#synthesizeWithHooks(\n text,\n connection,\n signal\n );\n if (audio && !signal.aborted) {\n this.#sendJSON(connection, {\n type: \"status\",\n status: \"speaking\"\n });\n this.#diagnose(connection, \"audio.first_sent\", {\n bytes: audio.byteLength\n });\n connection.send(audio);\n this.#diagnose(connection, \"audio.completed\", {\n bytes: audio.byteLength\n });\n }\n\n if (!signal.aborted) {\n this.#cm.updateAgentContext(connection.id, text);\n this.#sendJSON(connection, {\n type: \"status\",\n status: \"listening\"\n });\n }\n } finally {\n this.#cm.clearPipelineAbort(connection.id, signal);\n }\n }\n }\n\n #requireTTS(): TTSProvider & Partial<StreamingTTSProvider> {\n if (!this.tts) {\n throw new Error(\n \"No TTS provider configured. Set 'tts' on your VoiceAgent subclass.\"\n );\n }\n return this.tts;\n }\n\n async #synthesizeWithHooks(\n text: string,\n connection: Connection,\n signal?: AbortSignal,\n turn?: TurnDiagnostics\n ): Promise<ArrayBuffer | null> {\n const sentence = turn?.beginTtsSentence();\n let sentenceOutcome: \"completed\" | \"skipped\" | \"failed\" = \"completed\";\n try {\n let textToSpeak: string | null;\n try {\n textToSpeak = await this.beforeSynthesize(text, connection);\n } catch (error) {\n const voiceError = toVoiceError(error, \"TTS preparation failed\");\n this.#emitTurnDiagnostic(connection, turn, \"tts.failed\", {\n stage: \"before_synthesize\",\n error: voiceError\n });\n throw voiceError;\n }\n\n if (!textToSpeak) {\n sentenceOutcome = \"skipped\";\n this.#emitTurnDiagnostic(connection, turn, \"tts.skipped\", {\n reason: \"before_synthesize\"\n });\n return null;\n }\n\n let tts: TTSProvider & Partial<StreamingTTSProvider>;\n try {\n tts = this.#requireTTS();\n } catch (error) {\n const voiceError = toVoiceError(error, \"TTS is not configured\");\n this.#emitTurnDiagnostic(connection, turn, \"tts.failed\", {\n stage: \"configuration\",\n error: voiceError\n });\n throw voiceError;\n }\n\n const startedAt = Date.now();\n this.#emitTurnDiagnostic(connection, turn, \"tts.started\", {\n characters: textToSpeak.length\n });\n sentence?.providerStarted();\n try {\n const rawAudio = await tts.synthesize(textToSpeak, signal);\n const audio = await this.afterSynthesize(\n rawAudio,\n textToSpeak,\n connection\n );\n this.#emitTurnDiagnostic(connection, turn, \"tts.completed\", {\n duration_ms: Date.now() - startedAt,\n outcome: audio ? \"audio\" : \"no_audio\",\n bytes: audio?.byteLength ?? 0\n });\n return audio;\n } catch (error) {\n const voiceError = toVoiceError(error, \"TTS failed\");\n this.#emitTurnDiagnostic(connection, turn, \"tts.failed\", {\n duration_ms: Date.now() - startedAt,\n error: voiceError\n });\n throw voiceError;\n }\n } catch (error) {\n sentenceOutcome = \"failed\";\n throw error;\n } finally {\n sentence?.settle(sentenceOutcome);\n }\n }\n\n // --- Internal: call lifecycle ---\n\n async #handleStartCall(connection: Connection, _preferredFormat?: string) {\n if (this.#cm.isInCall(connection.id)) {\n this.#diagnose(connection, \"call.start_ignored\", {\n reason: \"already_active\"\n });\n return;\n }\n\n this.#diagnose(connection, \"call.starting\");\n this.#abortInputTurn(connection, \"call_restarted\");\n const startupToken = Symbol(connection.id);\n this.#startupTokens.set(connection.id, startupToken);\n this.#callTokens.set(connection.id, startupToken);\n\n // Mark as in-call before any await to prevent duplicate start_call\n // from leaking keepAlive refs during the beforeCallStart window.\n this.#cm.initConnection(connection.id);\n\n let provider: Transcriber | undefined;\n\n try {\n const allowed = await this.beforeCallStart(connection);\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n if (!allowed) {\n await this.#handleStartupFailure(\n connection,\n startupToken,\n undefined,\n \"Voice call was rejected\",\n null\n );\n return;\n }\n\n provider = this.createTranscriber(connection) ?? this.transcriber;\n if (!provider) {\n const message =\n \"No transcriber configured. Set 'transcriber' on your VoiceAgent subclass or override createTranscriber().\";\n logVoiceError({\n component: \"VoiceAgent\",\n stage: \"configuration\",\n message,\n connectionId: connection.id,\n error: new Error(message)\n });\n await this.#handleStartupFailure(\n connection,\n startupToken,\n undefined,\n message,\n null\n );\n return;\n }\n\n const dispose = await this.keepAlive();\n if (!this.#isCurrentStartup(connection.id, startupToken)) {\n dispose();\n return;\n }\n this.#keepAliveDispose.set(connection.id, dispose);\n\n const configuredFormat = opt(\"audioFormat\", \"mp3\") as VoiceAudioFormat;\n const configuredSampleRate = opt(\"sampleRate\", DEFAULT_SAMPLE_RATE);\n this.#sendJSON(connection, {\n type: \"audio_config\",\n format: configuredFormat,\n sampleRate: configuredSampleRate\n });\n } catch (error) {\n await this.#handleStartupFailure(\n connection,\n startupToken,\n toVoiceError(error, \"Voice call failed to start\"),\n \"Voice call failed to start\"\n );\n return;\n }\n\n if (!provider) return;\n\n let session: TranscriberSession;\n try {\n this.#diagnose(connection, \"stt.starting\");\n session = this.#cm.startTranscriberSession(connection.id, provider, {\n onInterim: (text: string) => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#getOrCreateInputTurn(connection);\n turn.firstInterim(text.length);\n this.#sendJSON(connection, {\n type: \"transcript_interim\",\n text\n });\n },\n onSpeechStart: () => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#replaceInputTurn(connection);\n turn.speechStarted();\n this.#handleBargeIn(connection);\n },\n onUtterance: (transcript: string) => {\n if (this.#callTokens.get(connection.id) !== startupToken) return;\n const turn = this.#takeInputTurn(connection);\n turn.finalInput(transcript.length);\n this.#sendJSON(connection, {\n type: \"transcript_interim\",\n text: \"\"\n });\n this.#runPipeline(connection, transcript, turn);\n },\n onFatalError: (error: Error) => {\n runBackground(\"transcriber_fatal\", () =>\n this.#handleTranscriberFatal(connection, startupToken, error)\n );\n }\n });\n\n await session.waitUntilReady?.();\n } catch (error) {\n await this.#handleTranscriberStartupFailure(\n connection,\n startupToken,\n toVoiceError(error, \"Speech recognition failed to start\")\n );\n return;\n }\n\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n this.#startupTokens.delete(connection.id);\n\n this.#diagnose(connection, \"stt.ready\");\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n this.#diagnose(connection, \"call.ready\");\n await this.onCallStart(connection);\n }\n\n #isCurrentStartup(connectionId: string, startupToken: symbol): boolean {\n return (\n this.#startupTokens.get(connectionId) === startupToken &&\n this.#cm.isInCall(connectionId)\n );\n }\n\n async #handleTranscriberStartupFailure(\n connection: Connection,\n startupToken: symbol,\n error: Error\n ): Promise<void> {\n await this.#handleStartupFailure(\n connection,\n startupToken,\n error,\n \"Speech recognition failed to start\",\n \"transcriber_startup\",\n {\n code: \"stt_startup_failed\",\n stage: \"stt\",\n retryable: false\n }\n );\n }\n\n async #handleStartupFailure(\n connection: Connection,\n startupToken: symbol,\n error: Error | undefined,\n clientMessage: string,\n logStage: string | null = \"call_startup\",\n structuredError?: {\n code: \"stt_startup_failed\";\n stage: \"stt\";\n retryable: false;\n }\n ): Promise<void> {\n if (!this.#isCurrentStartup(connection.id, startupToken)) return;\n\n // The client starts local audio optimistically on start_call. Every\n // terminal startup path must send error + idle so it tears that down.\n if (logStage && error !== undefined) {\n logVoiceError({\n component: \"VoiceAgent\",\n stage: logStage,\n message: clientMessage,\n connectionId: connection.id,\n error\n });\n }\n this.#startupTokens.delete(connection.id);\n if (this.#callTokens.get(connection.id) === startupToken) {\n this.#callTokens.delete(connection.id);\n }\n this.#diagnose(connection, \"call.start_failed\", {\n stage: logStage ?? \"authorization\",\n retryable: structuredError?.retryable ?? false,\n ...(error === undefined ? {} : { error })\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message: clientMessage,\n ...structuredError\n });\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n this.#diagnose(connection, \"call.ended\", {\n reason: \"startup_failed\"\n });\n this.#sendJSON(connection, { type: \"status\", status: \"idle\" });\n await this.onCallEnd(connection);\n }\n\n async #handleTranscriberFatal(\n connection: Connection,\n callToken: symbol,\n error: Error\n ): Promise<void> {\n if (\n this.#callTokens.get(connection.id) !== callToken ||\n !this.#cm.isInCall(connection.id)\n ) {\n return;\n }\n\n const isStarting = this.#startupTokens.get(connection.id) === callToken;\n const message = isStarting\n ? \"Speech recognition failed to start\"\n : \"Speech recognition connection was lost\";\n logVoiceError({\n component: \"VoiceAgent\",\n stage: isStarting ? \"transcriber_startup\" : \"transcriber_runtime\",\n message,\n connectionId: connection.id,\n error\n });\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#abortInputTurn(connection, \"stt_fatal\");\n this.#diagnose(connection, \"stt.fatal\", {\n stage: isStarting ? \"startup\" : \"runtime\",\n retryable: !isStarting,\n error\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message,\n code: isStarting ? \"stt_startup_failed\" : \"stt_connection_lost\",\n stage: \"stt\",\n retryable: !isStarting\n });\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n this.#diagnose(connection, \"call.ended\", { reason: \"stt_fatal\" });\n this.#sendJSON(connection, { type: \"status\", status: \"idle\" });\n await this.onCallEnd(connection);\n }\n\n #releaseKeepAlive(connectionId: string) {\n const dispose = this.#keepAliveDispose.get(connectionId);\n if (dispose) {\n dispose();\n this.#keepAliveDispose.delete(connectionId);\n }\n }\n\n #handleEndCall(connection: Connection): void | Promise<void> {\n this.#diagnose(connection, \"call.ended\", { reason: \"requested\" });\n this.#requestActiveTurnAbort(\n connection,\n \"turn.abort_requested\",\n \"call_ended\"\n );\n this.#startupTokens.delete(connection.id);\n this.#callTokens.delete(connection.id);\n this.#abortInputTurn(connection, \"call_ended\");\n this.#cm.cleanup(connection.id);\n this.#releaseKeepAlive(connection.id);\n this.#diagnose(connection, \"cleanup.completed\");\n this.#sendJSON(connection, { type: \"status\", status: \"idle\" });\n return this.onCallEnd(connection);\n }\n\n #handleInterrupt(connection: Connection): void | Promise<void> {\n this.#abortInputTurn(connection, \"client_interrupt\");\n this.#requestActiveTurnAbort(\n connection,\n \"turn.interrupt_requested\",\n \"client_interrupt\"\n );\n this.#cm.abortPipeline(connection.id);\n this.#cm.clearAudioBuffer(connection.id);\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n return this.onInterrupt(connection);\n }\n\n #handleBargeIn(connection: Connection) {\n this.#requestActiveTurnAbort(\n connection,\n \"turn.abort_requested\",\n \"barge_in\"\n );\n if (!this.#cm.abortPipeline(connection.id)) return;\n this.#sendJSON(connection, { type: \"playback_interrupt\" });\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n this.onInterrupt(connection);\n }\n\n #createTurn(\n connection: Connection,\n source: \"speech\" | \"text\"\n ): TurnDiagnostics {\n const turn = diagnostics.turn(\n connection,\n `turn_${(++this.#turnSequence).toString(36)}`,\n source\n );\n if (source === \"text\") turn.markTextInput();\n turn.emit(\"turn.started\", { source });\n return turn;\n }\n\n #replaceInputTurn(connection: Connection): TurnDiagnostics {\n this.#abortInputTurn(connection, \"replaced\");\n const turn = this.#createTurn(connection, \"speech\");\n this.#inputTurns.set(connection.id, turn);\n return turn;\n }\n\n #getOrCreateInputTurn(connection: Connection): TurnDiagnostics {\n const current = this.#inputTurns.get(connection.id);\n if (current) return current;\n const turn = this.#createTurn(connection, \"speech\");\n this.#inputTurns.set(connection.id, turn);\n return turn;\n }\n\n #takeInputTurn(connection: Connection): TurnDiagnostics {\n const turn = this.#getOrCreateInputTurn(connection);\n this.#inputTurns.delete(connection.id);\n return turn;\n }\n\n #abortInputTurn(connection: Connection, reason: string): void {\n const turn = this.#inputTurns.get(connection.id);\n if (!turn) return;\n this.#inputTurns.delete(connection.id);\n turn.emit(\"turn.aborted\", { reason });\n turn.finish(\"aborted\");\n }\n\n #beginTurnDiagnostics(\n connection: Connection,\n source: \"speech\" | \"text\",\n turn = this.#createTurn(connection, source)\n ): ActiveTurnDiagnostics {\n const previous = this.#activeTurnDiagnostics.get(connection.id);\n if (previous) {\n previous.turn.emit(\"turn.abort_requested\", { reason: \"replaced\" });\n previous.model?.abort();\n }\n\n const signal = this.#cm.createPipelineAbort(connection.id);\n const active: ActiveTurnDiagnostics = { signal, turn };\n this.#activeTurnDiagnostics.set(connection.id, active);\n return active;\n }\n\n #requestActiveTurnAbort(\n connection: Connection,\n event: \"turn.abort_requested\" | \"turn.interrupt_requested\",\n reason: string\n ): void {\n const active = this.#activeTurnDiagnostics.get(connection.id);\n if (!active) return;\n active.turn.emit(event, { reason });\n active.model?.abort();\n }\n\n #clearActiveTurn(\n connectionId: string,\n active: ActiveTurnDiagnostics\n ): void {\n if (this.#activeTurnDiagnostics.get(connectionId) === active) {\n this.#activeTurnDiagnostics.delete(connectionId);\n }\n }\n\n #emitTurnDiagnostic(\n connection: Connection,\n turn: TurnDiagnostics | undefined,\n event: string,\n data?: DiagnosticData\n ): void {\n if (turn) {\n turn.emit(event, data);\n } else {\n this.#diagnose(connection, event, data);\n }\n }\n\n // --- Internal: text message handling ---\n\n async #handleTextMessage(connection: Connection, text: string) {\n if (!text || text.trim().length === 0) return;\n\n const userText = text.trim();\n const pipelineStart = Date.now();\n const active = this.#beginTurnDiagnostics(connection, \"text\");\n const { signal, turn } = active;\n let turnOutcome: VoiceTurnOutcome = \"completed\";\n\n this.#sendJSON(connection, { type: \"status\", status: \"thinking\" });\n\n const priorMessages = this.getConversationHistory();\n this.saveMessage(\"user\", userText);\n this.#sendJSON(connection, {\n type: \"transcript\",\n role: \"user\",\n text: userText\n });\n\n try {\n const context: VoiceTurnContext = {\n connection,\n messages: priorMessages,\n signal\n };\n\n const model = turn.startModel();\n active.model = model;\n const turnResult = await this.onTurn(userText, context);\n\n if (signal.aborted) return;\n\n const isInCall = this.#cm.isInCall(connection.id);\n\n if (isInCall) {\n const { text: fullText, finishReason } = await this.#streamResponse(\n connection,\n turnResult,\n pipelineStart,\n signal,\n turn,\n model\n );\n\n if (signal.aborted) return;\n\n const hasOutput = fullText.trim().length > 0;\n turnOutcome = stableTurnOutcome(finishReason, hasOutput);\n if (turnOutcome === \"completed\" && turn.hasTtsFailures) {\n turnOutcome = \"tts_error\";\n }\n if (hasOutput) {\n this.#cm.updateAgentContext(connection.id, fullText);\n this.saveMessage(\"assistant\", fullText);\n }\n const completionOutcome = createCompletionOutcome(\n finishReason,\n hasOutput\n );\n if (completionOutcome) {\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n ...completionOutcome\n });\n }\n if (!hasOutput) {\n this.#sendJSON(connection, {\n type: \"error\",\n message: \"No response generated\"\n });\n }\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n } else {\n let fullText = \"\";\n let pendingText = \"\";\n let transcriptStarted = false;\n\n const sendAssistantDelta = (token: string) => {\n if (!transcriptStarted) {\n pendingText += token;\n if (pendingText.trim().length === 0) return;\n\n this.#sendJSON(connection, {\n type: \"transcript_start\",\n role: \"assistant\"\n });\n transcriptStarted = true;\n token = pendingText;\n pendingText = \"\";\n }\n\n this.#sendJSON(connection, {\n type: \"transcript_delta\",\n text: token\n });\n };\n\n let finishReason: VoiceModelFinishReason | undefined;\n for await (const event of iterateTextEvents(turnResult)) {\n if (signal.aborted) break;\n model.observe(event);\n if (event.type === \"finish\") {\n finishReason = event.finishReason;\n } else if (event.type === \"error\") {\n if (transcriptStarted) {\n this.#sendJSON(connection, {\n type: \"transcript_end\",\n text: fullText\n });\n }\n throw new ModelStreamError(\n event.error,\n fullText.trim().length > 0\n );\n } else if (event.type === \"text\") {\n fullText += event.text;\n sendAssistantDelta(event.text);\n }\n }\n\n const hasOutput = fullText.trim().length > 0;\n model.complete(hasOutput ? \"output\" : \"no_output\", finishReason);\n turnOutcome = stableTurnOutcome(finishReason, hasOutput);\n if (hasOutput) {\n if (transcriptStarted) {\n this.#sendJSON(connection, {\n type: \"transcript_end\",\n text: fullText\n });\n }\n this.saveMessage(\"assistant\", fullText);\n }\n const completionOutcome = createCompletionOutcome(\n finishReason,\n hasOutput\n );\n if (completionOutcome) {\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n ...completionOutcome\n });\n }\n if (!hasOutput) {\n this.#sendJSON(connection, {\n type: \"error\",\n message: \"No response generated\"\n });\n }\n this.#sendJSON(connection, { type: \"status\", status: \"idle\" });\n }\n } catch (error) {\n if (signal.aborted) return;\n turnOutcome =\n error instanceof ModelStreamError\n ? \"model_error\"\n : turn.hasTtsFailures\n ? \"tts_error\"\n : \"error\";\n const pipelineError =\n error instanceof ModelStreamError\n ? error.streamError\n : toVoiceError(error, \"Text turn failed\");\n active.model?.fail(pipelineError);\n turn.emit(\"turn.error\", {\n stage: error instanceof ModelStreamError ? \"model\" : \"pipeline\",\n error: pipelineError\n });\n if (error instanceof ModelStreamError) {\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n code: \"model_error\",\n stage: \"llm\",\n partialOutput: error.partialOutput\n });\n }\n logVoiceError({\n component: \"VoiceAgent\",\n stage: \"text_pipeline\",\n message: \"Text pipeline failed\",\n connectionId: connection.id,\n error: pipelineError\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message: voiceErrorMessage(pipelineError, \"Text pipeline failed\")\n });\n this.#sendJSON(connection, {\n type: \"status\",\n status: this.#cm.isInCall(connection.id) ? \"listening\" : \"idle\"\n });\n } finally {\n if (signal.aborted) {\n turnOutcome = \"aborted\";\n active.model?.abort();\n turn.emit(\"turn.aborted\");\n }\n turn.finish(turnOutcome);\n this.#cm.clearPipelineAbort(connection.id, signal);\n this.#clearActiveTurn(connection.id, active);\n }\n }\n\n // --- Internal: voice pipeline ---\n\n async #runPipeline(\n connection: Connection,\n transcript: string,\n turn: TurnDiagnostics\n ) {\n const pipelineStart = Date.now();\n const active = this.#beginTurnDiagnostics(connection, \"speech\", turn);\n const { signal } = active;\n let turnOutcome: VoiceTurnOutcome = \"completed\";\n\n try {\n const afterTranscribeStart = Date.now();\n const userText = await this.afterTranscribe(transcript, connection);\n turn.recordAfterTranscribe(\n Date.now() - afterTranscribeStart,\n userText ? \"accepted\" : \"skipped\",\n userText?.length ?? 0\n );\n if (signal.aborted) return;\n if (!userText) {\n turnOutcome = \"skipped\";\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n return;\n }\n\n const priorMessages = this.getConversationHistory();\n this.saveMessage(\"user\", userText);\n this.#sendJSON(connection, {\n type: \"transcript\",\n role: \"user\",\n text: userText\n });\n\n this.#sendJSON(connection, { type: \"status\", status: \"thinking\" });\n\n const context: VoiceTurnContext = {\n connection,\n messages: priorMessages,\n signal\n };\n\n const model = turn.startModel();\n active.model = model;\n const turnResult = await this.onTurn(userText, context);\n\n if (signal.aborted) return;\n\n const {\n text: fullText,\n llmMs,\n ttsMs,\n firstAudioMs,\n finishReason\n } = await this.#streamResponse(\n connection,\n turnResult,\n pipelineStart,\n signal,\n turn,\n model\n );\n\n if (signal.aborted) return;\n\n const hasOutput = fullText.trim().length > 0;\n turnOutcome = stableTurnOutcome(finishReason, hasOutput);\n if (turnOutcome === \"completed\" && turn.hasTtsFailures) {\n turnOutcome = \"tts_error\";\n }\n\n if (!hasOutput) {\n const completionOutcome = createCompletionOutcome(\n finishReason,\n false\n );\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n ...completionOutcome\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message: \"No response generated\"\n });\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n return;\n }\n\n const completionOutcome = createCompletionOutcome(finishReason, true);\n if (completionOutcome) {\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n ...completionOutcome\n });\n }\n\n const totalMs = Date.now() - pipelineStart;\n\n this.#sendJSON(connection, {\n type: \"metrics\",\n llm_ms: llmMs,\n tts_ms: ttsMs,\n first_audio_ms: firstAudioMs,\n total_ms: totalMs\n });\n\n // Feed the agent's spoken reply back to the transcriber as context for\n // the user's next turn (no-op for providers without context carryover).\n this.#cm.updateAgentContext(connection.id, fullText);\n this.saveMessage(\"assistant\", fullText);\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n } catch (error) {\n if (signal.aborted) return;\n turnOutcome =\n error instanceof ModelStreamError\n ? \"model_error\"\n : turn.hasTtsFailures\n ? \"tts_error\"\n : \"error\";\n const pipelineError =\n error instanceof ModelStreamError\n ? error.streamError\n : toVoiceError(error, \"Voice turn failed\");\n active.model?.fail(pipelineError);\n turn.emit(\"turn.error\", {\n stage: error instanceof ModelStreamError ? \"model\" : \"pipeline\",\n error: pipelineError\n });\n if (error instanceof ModelStreamError) {\n this.#sendJSON(connection, {\n type: \"completion_outcome\",\n code: \"model_error\",\n stage: \"llm\",\n partialOutput: error.partialOutput\n });\n }\n logVoiceError({\n component: \"VoiceAgent\",\n stage: \"pipeline\",\n message: \"Voice pipeline failed\",\n connectionId: connection.id,\n error: pipelineError\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message: voiceErrorMessage(pipelineError, \"Voice pipeline failed\")\n });\n this.#sendJSON(connection, { type: \"status\", status: \"listening\" });\n } finally {\n if (signal.aborted) {\n turnOutcome = \"aborted\";\n active.model?.abort();\n turn.emit(\"turn.aborted\");\n }\n turn.finish(turnOutcome);\n this.#cm.clearPipelineAbort(connection.id, signal);\n this.#clearActiveTurn(connection.id, active);\n }\n }\n\n // --- Internal: streaming TTS pipeline ---\n\n async #streamResponse(\n connection: Connection,\n response: TextSource,\n pipelineStart: number,\n signal: AbortSignal,\n turn: TurnDiagnostics,\n model: ModelDiagnosticTracker\n ): Promise<{\n text: string;\n llmMs: number;\n ttsMs: number;\n firstAudioMs: number;\n finishReason?: VoiceModelFinishReason;\n }> {\n if (typeof response === \"string\") {\n const llmMs = model.elapsedMs();\n\n if (response.trim().length === 0) {\n model.complete(\"no_output\");\n return { text: response, llmMs, ttsMs: 0, firstAudioMs: 0 };\n }\n\n model.observe({ type: \"text\", text: response });\n model.complete(\"output\");\n this.#sendJSON(connection, {\n type: \"transcript_start\",\n role: \"assistant\"\n });\n this.#sendJSON(connection, {\n type: \"transcript_end\",\n text: response\n });\n\n const ttsStart = Date.now();\n let audio: ArrayBuffer | null;\n try {\n audio = await this.#synthesizeWithHooks(\n response,\n connection,\n undefined,\n turn\n );\n } finally {\n turn.finishTts();\n }\n const ttsMs = Date.now() - ttsStart;\n\n let firstAudioMs = 0;\n if (audio && !signal.aborted) {\n this.#sendJSON(connection, { type: \"status\", status: \"speaking\" });\n firstAudioMs = Date.now() - pipelineStart;\n turn.emit(\"audio.first_sent\", {\n bytes: audio.byteLength,\n elapsed_ms: firstAudioMs\n });\n turn.audioSent();\n connection.send(audio);\n turn.emit(\"audio.completed\", {\n bytes: audio.byteLength\n });\n }\n\n return { text: response, llmMs, ttsMs, firstAudioMs };\n }\n\n try {\n return await this.#streamingTTSPipeline(\n connection,\n iterateTextEvents(response),\n pipelineStart,\n signal,\n turn,\n model\n );\n } finally {\n turn.finishTts();\n }\n }\n\n async #streamingTTSPipeline(\n connection: Connection,\n tokenStream: AsyncIterable<TextStreamEvent>,\n pipelineStart: number,\n signal: AbortSignal,\n turn: TurnDiagnostics,\n model: ModelDiagnosticTracker\n ): Promise<{\n text: string;\n llmMs: number;\n ttsMs: number;\n firstAudioMs: number;\n finishReason?: VoiceModelFinishReason;\n }> {\n const chunker = new SentenceChunker();\n const ttsQueue: AsyncIterable<ArrayBuffer>[] = [];\n let fullText = \"\";\n let pendingTranscriptText = \"\";\n let transcriptStarted = false;\n let firstAudioSentAt: number | null = null;\n let firstTtsStartedAt: number | null = null;\n let cumulativeTtsMs = 0;\n let totalAudioBytes = 0;\n let skippedSentences = 0;\n let ttsFailures = 0;\n let finishReason: VoiceModelFinishReason | undefined;\n\n let streamComplete = false;\n let drainNotify: (() => void) | null = null;\n let drainPending = false;\n let drainedCount = 0;\n const drainWaiters = new Map<number, (() => void)[]>();\n\n const notifyDrain = () => {\n if (drainNotify) {\n const resolve = drainNotify;\n drainNotify = null;\n resolve();\n } else {\n drainPending = true;\n }\n };\n\n const notifyDrained = () => {\n for (const [target, waiters] of drainWaiters) {\n if (drainedCount < target) continue;\n drainWaiters.delete(target);\n for (const resolve of waiters) resolve();\n }\n };\n\n const waitForDrained = (target: number): Promise<void> => {\n if (drainedCount >= target) return Promise.resolve();\n\n return new Promise<void>((resolve) => {\n const waiters = drainWaiters.get(target) ?? [];\n waiters.push(resolve);\n drainWaiters.set(target, waiters);\n });\n };\n\n const tts = this.#requireTTS();\n const hasStreamingTTS = typeof tts.synthesizeStream === \"function\";\n\n const drainPromise = (async () => {\n let i = 0;\n while (true) {\n while (i >= ttsQueue.length) {\n if (streamComplete && i >= ttsQueue.length) return;\n if (drainPending) {\n drainPending = false;\n continue;\n }\n await new Promise<void>((r) => {\n drainNotify = r;\n });\n if (streamComplete && i >= ttsQueue.length) return;\n }\n\n if (signal.aborted) return;\n\n try {\n for await (const chunk of ttsQueue[i]) {\n if (signal.aborted) return;\n if (firstAudioSentAt === null) {\n this.#sendJSON(connection, {\n type: \"status\",\n status: \"speaking\"\n });\n firstAudioSentAt = Date.now();\n turn.emit(\"audio.first_sent\", {\n bytes: chunk.byteLength,\n elapsed_ms: firstAudioSentAt - pipelineStart\n });\n }\n totalAudioBytes += chunk.byteLength;\n turn.audioSent();\n connection.send(chunk);\n }\n } catch (error) {\n if (signal.aborted) return;\n const voiceError = toVoiceError(error, \"TTS sentence failed\");\n ttsFailures++;\n turn.emit(\"tts.failed\", { error: voiceError });\n logVoiceError({\n component: \"VoiceAgent\",\n stage: \"tts\",\n message: \"TTS failed for a sentence\",\n connectionId: connection.id,\n error: voiceError\n });\n this.#sendJSON(connection, {\n type: \"error\",\n message: voiceErrorMessage(\n voiceError,\n \"TTS failed for a sentence\"\n )\n });\n }\n i++;\n drainedCount = i;\n notifyDrained();\n }\n })();\n\n const makeSentenceTTS = (\n sentence: string\n ): AsyncIterable<ArrayBuffer> => {\n const self = this;\n async function* generate() {\n const attempt = turn.beginTtsSentence();\n let sentenceOutcome: \"completed\" | \"skipped\" | \"failed\" = \"completed\";\n try {\n const text = await self.beforeSynthesize(sentence, connection);\n if (!text) {\n sentenceOutcome = \"skipped\";\n skippedSentences++;\n return;\n }\n\n if (firstTtsStartedAt === null) {\n firstTtsStartedAt = Date.now();\n turn.emit(\"tts.started\", {\n mode: hasStreamingTTS ? \"streaming\" : \"buffered\",\n characters: text.length\n });\n }\n attempt.providerStarted();\n\n if (hasStreamingTTS) {\n for await (const chunk of tts.synthesizeStream!(text, signal)) {\n const processed = await self.afterSynthesize(\n chunk,\n text,\n connection\n );\n if (processed) yield processed;\n }\n } else {\n const rawAudio = await tts.synthesize(text, signal);\n const processed = await self.afterSynthesize(\n rawAudio,\n text,\n connection\n );\n if (processed) yield processed;\n }\n } catch (error) {\n sentenceOutcome = \"failed\";\n throw error;\n } finally {\n cumulativeTtsMs += attempt.settle(sentenceOutcome);\n }\n }\n\n return eagerAsyncIterable(generate());\n };\n\n const enqueueSentence = (sentence: string) => {\n ttsQueue.push(makeSentenceTTS(sentence));\n notifyDrain();\n };\n\n const sendAssistantDelta = (token: string) => {\n if (!transcriptStarted) {\n pendingTranscriptText += token;\n if (pendingTranscriptText.trim().length === 0) return;\n\n this.#sendJSON(connection, {\n type: \"transcript_start\",\n role: \"assistant\"\n });\n transcriptStarted = true;\n token = pendingTranscriptText;\n pendingTranscriptText = \"\";\n }\n\n this.#sendJSON(connection, { type: \"transcript_delta\", text: token });\n };\n\n for await (const event of tokenStream) {\n if (signal.aborted) break;\n model.observe(event);\n\n if (event.type === \"boundary\") {\n for (const sentence of chunker.flush()) {\n enqueueSentence(sentence);\n }\n await waitForDrained(ttsQueue.length);\n continue;\n }\n\n if (event.type === \"finish\") {\n finishReason = event.finishReason;\n continue;\n }\n\n if (event.type === \"error\") {\n for (const sentence of chunker.flush()) {\n enqueueSentence(sentence);\n }\n await waitForDrained(ttsQueue.length);\n if (transcriptStarted) {\n this.#sendJSON(connection, {\n type: \"transcript_end\",\n text: fullText\n });\n }\n streamComplete = true;\n notifyDrain();\n await drainPromise;\n throw new ModelStreamError(event.error, fullText.trim().length > 0);\n }\n\n if (event.type !== \"text\") continue;\n const token = event.text;\n\n fullText += token;\n sendAssistantDelta(token);\n\n const sentences = chunker.add(token);\n for (const sentence of sentences) {\n enqueueSentence(sentence);\n }\n }\n\n const llmMs = model.elapsedMs();\n model.complete(\n fullText.trim().length > 0 ? \"output\" : \"no_output\",\n finishReason\n );\n\n const remaining = chunker.flush();\n for (const sentence of remaining) {\n enqueueSentence(sentence);\n }\n\n streamComplete = true;\n notifyDrain();\n if (transcriptStarted) {\n this.#sendJSON(connection, { type: \"transcript_end\", text: fullText });\n }\n\n await drainPromise;\n\n if (firstTtsStartedAt === null) {\n turn.emit(\"tts.skipped\", {\n reason:\n fullText.trim().length === 0\n ? \"no_output\"\n : ttsFailures > 0\n ? \"preparation_failed\"\n : \"before_synthesize\",\n sentences: skippedSentences,\n failures: ttsFailures\n });\n } else {\n turn.emit(\"tts.completed\", {\n duration_ms: Date.now() - firstTtsStartedAt,\n outcome:\n totalAudioBytes > 0\n ? ttsFailures > 0\n ? \"partial\"\n : \"audio\"\n : ttsFailures > 0\n ? \"failed\"\n : \"no_audio\",\n bytes: totalAudioBytes,\n failures: ttsFailures,\n skipped_sentences: skippedSentences\n });\n }\n if (totalAudioBytes > 0) {\n turn.emit(\"audio.completed\", {\n bytes: totalAudioBytes\n });\n }\n\n const firstAudioMs = firstAudioSentAt\n ? firstAudioSentAt - pipelineStart\n : 0;\n\n return {\n text: fullText,\n llmMs,\n ttsMs: cumulativeTtsMs,\n firstAudioMs,\n ...(finishReason === undefined ? {} : { finishReason })\n };\n }\n\n // --- Internal: protocol helpers ---\n\n #diagnose(\n connection: Connection,\n event: string,\n data?: DiagnosticData\n ): void {\n diagnostics.emit(connection, event, data);\n }\n\n #sendJSON(connection: Connection, data: unknown) {\n const parsed = data as Record<string, unknown>;\n sendVoiceJSON(\n connection,\n data,\n \"VoiceAgent\",\n parsed.type === \"transcript_delta\"\n );\n }\n }\n\n return VoiceAgentMixin as unknown as VoiceAgentMixinReturn<TBase>;\n}\n\n// --- Eager async iterable ---\n\nfunction eagerAsyncIterable<T>(source: AsyncIterable<T>): AsyncIterable<T> {\n const buffer: T[] = [];\n let finished = false;\n let error: unknown = null;\n let waitResolve: (() => void) | null = null;\n\n const notify = () => {\n if (waitResolve) {\n const resolve = waitResolve;\n waitResolve = null;\n resolve();\n }\n };\n\n (async () => {\n try {\n for await (const item of source) {\n buffer.push(item);\n notify();\n }\n } catch (err) {\n error = err;\n } finally {\n finished = true;\n notify();\n }\n })();\n\n return {\n [Symbol.asyncIterator]() {\n let index = 0;\n return {\n async next(): Promise<IteratorResult<T>> {\n while (index >= buffer.length && !finished) {\n await new Promise<void>((r) => {\n waitResolve = r;\n });\n }\n if (error) {\n throw error;\n }\n if (index >= buffer.length) {\n return { done: true, value: undefined };\n }\n return { done: false, value: buffer[index++] };\n }\n };\n }\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import {
2
+ C as VoiceTransport,
3
+ D as VoiceTurnSource,
4
+ E as VoiceTurnOutcome,
5
+ S as VoiceStatus,
6
+ T as VoiceTurnMetrics,
7
+ _ as VoiceErrorStage,
8
+ b as VoiceRole,
9
+ c as VoiceAudioFormat,
10
+ g as VoiceErrorCode,
11
+ h as VoiceError,
12
+ l as VoiceAudioInput,
13
+ o as TranscriptMessage,
14
+ w as VoiceTransportCloseInfo,
15
+ y as VoicePipelineMetrics
16
+ } from "../types-_Faxb570.js";
17
+ import {
18
+ VoiceClientEvent,
19
+ VoiceClientEventMap,
20
+ VoiceClientOptions,
21
+ VoiceConnectionDiagnostic,
22
+ WebSocketVoiceTransport
23
+ } from "./client.js";
24
+
25
+ //#region src/voice/react.d.ts
26
+ /** Options accepted by useVoiceAgent. */
27
+ interface UseVoiceAgentOptions extends VoiceClientOptions {
28
+ /**
29
+ * Whether the hook should create and connect a VoiceClient.
30
+ *
31
+ * @default true
32
+ */
33
+ enabled?: boolean;
34
+ /**
35
+ * Called when the hook reconnects due to option changes (e.g., agent name
36
+ * or instance name changed). Use this to show a toast or notification.
37
+ */
38
+ onReconnect?: () => void;
39
+ }
40
+ interface UseVoiceAgentReturn {
41
+ status: VoiceStatus;
42
+ transcript: TranscriptMessage[];
43
+ /**
44
+ * The current interim (partial) transcript from streaming STT.
45
+ * Updates in real time as the user speaks. null when not available.
46
+ */
47
+ interimTranscript: string | null;
48
+ metrics: VoicePipelineMetrics | null;
49
+ /** Last stable terminal summary for a speech or text turn. */
50
+ turnMetrics: VoiceTurnMetrics | null;
51
+ audioLevel: number;
52
+ isMuted: boolean;
53
+ connected: boolean;
54
+ error: string | null;
55
+ outputDeviceError: string | null;
56
+ startCall: () => Promise<void>;
57
+ endCall: () => void;
58
+ toggleMute: () => void;
59
+ sendText: (text: string) => void;
60
+ /** Send arbitrary JSON to the agent (app-level messages). */
61
+ sendJSON: (data: Record<string, unknown>) => void;
62
+ /** The last non-voice-protocol message received from the server. */
63
+ lastCustomMessage: unknown;
64
+ }
65
+ /** Options accepted by useVoiceInput. */
66
+ interface UseVoiceInputOptions {
67
+ /** Agent name (matches the server-side Durable Object class). */
68
+ agent: string;
69
+ /** Instance name for the agent. @default "default" */
70
+ name?: string;
71
+ /** Host to connect to. @default window.location.host */
72
+ host?: string;
73
+ /** RMS threshold below which audio is considered silence. @default 0.04 */
74
+ silenceThreshold?: number;
75
+ /** How long silence must last before sending end_of_speech (ms). @default 500 */
76
+ silenceDurationMs?: number;
77
+ }
78
+ interface UseVoiceInputReturn {
79
+ /** Accumulated final transcript text from all utterances. */
80
+ transcript: string;
81
+ /**
82
+ * Current interim (partial) transcript from streaming STT.
83
+ * Updates in real time as the user speaks. null when not available.
84
+ */
85
+ interimTranscript: string | null;
86
+ /** Last stable terminal summary for a speech turn. */
87
+ turnMetrics: VoiceTurnMetrics | null;
88
+ /** Whether the mic is actively listening. */
89
+ isListening: boolean;
90
+ /** Current audio level (0–1) for visual feedback (e.g. waveform). */
91
+ audioLevel: number;
92
+ /** Whether the mic is muted. */
93
+ isMuted: boolean;
94
+ /** Any error message. */
95
+ error: string | null;
96
+ /** Start listening — requests mic permission and begins streaming audio. */
97
+ start: () => Promise<void>;
98
+ /** Stop listening — releases the mic. */
99
+ stop: () => void;
100
+ /** Toggle mute (mic stays open but audio is not sent). */
101
+ toggleMute: () => void;
102
+ /** Clear the accumulated transcript. */
103
+ clear: () => void;
104
+ }
105
+ /**
106
+ * React hook for voice-to-text input. Captures microphone audio, streams it
107
+ * to a server-side VoiceAgent for STT, and returns the transcript as a string.
108
+ *
109
+ * Unlike `useVoiceAgent`, this hook is optimised for dictation — it accumulates
110
+ * user transcripts into a single string and ignores assistant responses / TTS.
111
+ *
112
+ * @example
113
+ * ```tsx
114
+ * const { transcript, interimTranscript, isListening, start, stop } = useVoiceInput({
115
+ * agent: "voice-input-agent"
116
+ * });
117
+ *
118
+ * <textarea value={transcript + (interimTranscript ? " " + interimTranscript : "")} />
119
+ * <button onClick={isListening ? stop : start}>
120
+ * {isListening ? "Stop" : "Dictate"}
121
+ * </button>
122
+ * ```
123
+ */
124
+ declare function useVoiceInput(
125
+ options: UseVoiceInputOptions
126
+ ): UseVoiceInputReturn;
127
+ /**
128
+ * React hook that wraps VoiceClient, syncing its state into React state.
129
+ * All audio infrastructure (mic capture, playback, silence/interrupt detection,
130
+ * voice protocol) is handled by VoiceClient — this hook just bridges to React.
131
+ *
132
+ * When the connection identity changes (agent, name, or host), the hook
133
+ * automatically disconnects the old client, creates a new one, and reconnects.
134
+ * The `onReconnect` callback fires when this happens.
135
+ */
136
+ declare function useVoiceAgent(
137
+ options: UseVoiceAgentOptions
138
+ ): UseVoiceAgentReturn;
139
+ //#endregion
140
+ export {
141
+ type TranscriptMessage,
142
+ UseVoiceAgentOptions,
143
+ UseVoiceAgentReturn,
144
+ UseVoiceInputOptions,
145
+ UseVoiceInputReturn,
146
+ type VoiceAudioFormat,
147
+ type VoiceAudioInput,
148
+ type VoiceClientEvent,
149
+ type VoiceClientEventMap,
150
+ type VoiceClientOptions,
151
+ type VoiceConnectionDiagnostic,
152
+ type VoiceError,
153
+ type VoiceErrorCode,
154
+ type VoiceErrorStage,
155
+ type VoicePipelineMetrics,
156
+ type VoiceRole,
157
+ type VoiceStatus,
158
+ type VoiceTransport,
159
+ type VoiceTransportCloseInfo,
160
+ type VoiceTurnMetrics,
161
+ type VoiceTurnOutcome,
162
+ type VoiceTurnSource,
163
+ WebSocketVoiceTransport,
164
+ useVoiceAgent,
165
+ useVoiceInput
166
+ };
167
+ //# sourceMappingURL=react.d.ts.map