@agimon-ai/po-voice 0.0.0-alpha.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +13 -0
  3. package/README.md +249 -0
  4. package/dist/apiContracts.cjs +809 -0
  5. package/dist/apiContracts.cjs.map +1 -0
  6. package/dist/apiContracts.d.mts +53 -0
  7. package/dist/apiContracts.d.mts.map +1 -0
  8. package/dist/apiContracts.mjs +805 -0
  9. package/dist/apiContracts.mjs.map +1 -0
  10. package/dist/assets/browserCaptureWorklet-Droj0fW0.js +13 -0
  11. package/dist/assets/silero_vad_v6.2.1-SjbCxFXk.onnx +0 -0
  12. package/dist/clientCaptureActivity-DN4xQtmw.d.mts +234 -0
  13. package/dist/clientCaptureActivity-DN4xQtmw.d.mts.map +1 -0
  14. package/dist/clientMedia-CfTfc9_4.mjs +49 -0
  15. package/dist/clientMedia-CfTfc9_4.mjs.map +1 -0
  16. package/dist/clientMedia-DuA4aYhD.cjs +156 -0
  17. package/dist/clientMedia-DuA4aYhD.cjs.map +1 -0
  18. package/dist/clientMedia.cjs +134 -0
  19. package/dist/clientMedia.cjs.map +1 -0
  20. package/dist/clientMedia.d.mts +2 -0
  21. package/dist/clientMedia.mjs +114 -0
  22. package/dist/clientMedia.mjs.map +1 -0
  23. package/dist/extensions/server.cjs +8975 -0
  24. package/dist/extensions/server.cjs.map +1 -0
  25. package/dist/extensions/server.d.mts +5 -0
  26. package/dist/extensions/server.d.mts.map +1 -0
  27. package/dist/extensions/server.mjs +8968 -0
  28. package/dist/extensions/server.mjs.map +1 -0
  29. package/dist/extensions/web.mjs +4530 -0
  30. package/dist/extensions/web.mjs.map +1 -0
  31. package/dist/index-C95HCjmT.d.mts +212 -0
  32. package/dist/index-C95HCjmT.d.mts.map +1 -0
  33. package/dist/index.cjs +637 -0
  34. package/dist/index.cjs.map +1 -0
  35. package/dist/index.d.mts +603 -0
  36. package/dist/index.d.mts.map +1 -0
  37. package/dist/index.mjs +557 -0
  38. package/dist/index.mjs.map +1 -0
  39. package/dist/narrationBargeIn-C_Po8fgw.mjs +62 -0
  40. package/dist/narrationBargeIn-C_Po8fgw.mjs.map +1 -0
  41. package/dist/narrationBargeIn-Dje82XOm.cjs +73 -0
  42. package/dist/narrationBargeIn-Dje82XOm.cjs.map +1 -0
  43. package/dist/sileroVadWorker-D894njUe.mjs +110 -0
  44. package/dist/sileroVadWorker-D894njUe.mjs.map +1 -0
  45. package/dist/vad-DDe4RIdW.mjs +315 -0
  46. package/dist/vad-DDe4RIdW.mjs.map +1 -0
  47. package/dist/vad-n2RlruzB.cjs +332 -0
  48. package/dist/vad-n2RlruzB.cjs.map +1 -0
  49. package/dist/voiceReloadHandoff.cjs +9 -0
  50. package/dist/voiceReloadHandoff.d.mts +1 -0
  51. package/dist/voiceReloadHandoff.mjs +2 -0
  52. package/dist/voiceTools-CRQHK_Uc.cjs +616 -0
  53. package/dist/voiceTools-CRQHK_Uc.cjs.map +1 -0
  54. package/dist/voiceTools-aCCREMjS.mjs +611 -0
  55. package/dist/voiceTools-aCCREMjS.mjs.map +1 -0
  56. package/dist/voiceTools.cjs +12 -0
  57. package/dist/voiceTools.d.mts +7 -0
  58. package/dist/voiceTools.d.mts.map +1 -0
  59. package/dist/voiceTools.mjs +3 -0
  60. package/dist/voiceWorker.cjs +1929 -0
  61. package/dist/voiceWorker.cjs.map +1 -0
  62. package/dist/voiceWorker.d.mts +200 -0
  63. package/dist/voiceWorker.d.mts.map +1 -0
  64. package/dist/voiceWorker.mjs +1925 -0
  65. package/dist/voiceWorker.mjs.map +1 -0
  66. package/dist/voiceWorkerProtocol-0H3czPjt.cjs +2385 -0
  67. package/dist/voiceWorkerProtocol-0H3czPjt.cjs.map +1 -0
  68. package/dist/voiceWorkerProtocol-B_4B2_fR.mjs +2085 -0
  69. package/dist/voiceWorkerProtocol-B_4B2_fR.mjs.map +1 -0
  70. package/dist/voiceWorkerSessionController-DaYemiL3.cjs +1800 -0
  71. package/dist/voiceWorkerSessionController-DaYemiL3.cjs.map +1 -0
  72. package/dist/voiceWorkerSessionController-GB3SJ6YE.mjs +1734 -0
  73. package/dist/voiceWorkerSessionController-GB3SJ6YE.mjs.map +1 -0
  74. package/licenses/Codex-Apache-2.0.txt +201 -0
  75. package/llms.txt +9 -0
  76. package/package.json +153 -0
  77. package/src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/models/README.md +11 -0
  78. package/src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/models/SILERO-LICENSE +21 -0
  79. package/src/prompts/po-use-voice/SKILL.md +35 -0
  80. package/src/types/clientCaptureActivity.ts +155 -0
  81. package/src/types/clientMedia.ts +226 -0
  82. package/src/types/manualTranscription.ts +53 -0
  83. package/src/types/realtime.ts +107 -0
  84. package/src/types/voiceOwnership.ts +315 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceWorkerProtocol-B_4B2_fR.mjs","names":["PCM_CHANNELS","PCM_BITS_PER_SAMPLE","isRecord"],"sources":["../src/services/pcm/index.ts","../src/services/infrastructure/index.ts","../src/services/clientMedia/index.ts","../src/services/whisper/index.ts","../src/services/semanticEcho/index.ts","../src/services/turnTranscriber/index.ts","../src/services/voiceWorkerMedia/index.ts","../src/services/voiceWorkerProtocol/index.ts"],"sourcesContent":["export const PCM_SAMPLE_RATE = 16_000;\nexport const PCM_CHANNELS = 1;\nexport const PCM_BITS_PER_SAMPLE = 16;\nexport const PCM_FRAME_MS = 20;\nexport const PCM_BYTES_PER_SAMPLE = PCM_BITS_PER_SAMPLE / 8;\nexport const PCM_FRAME_BYTES = (PCM_SAMPLE_RATE * PCM_CHANNELS * PCM_BYTES_PER_SAMPLE * PCM_FRAME_MS) / 1_000;\n\nconst WAV_HEADER_BYTES = 44;\nconst WAV_RIFF_CHUNK = 'RIFF';\nconst WAV_FORMAT = 'WAVE';\nconst WAV_FORMAT_CHUNK = 'fmt ';\nconst WAV_DATA_CHUNK = 'data';\nconst PCM_FORMAT = 1;\n\nexport class PcmFrameAssembler {\n private pending = Buffer.alloc(0);\n\n push(chunk: Buffer): Buffer[] {\n if (chunk.length === 0) return [];\n const combined = this.pending.length === 0 ? chunk : Buffer.concat([this.pending, chunk]);\n const completeBytes = combined.length - (combined.length % PCM_FRAME_BYTES);\n const frames: Buffer[] = [];\n for (let offset = 0; offset < completeBytes; offset += PCM_FRAME_BYTES) {\n frames.push(Buffer.from(combined.subarray(offset, offset + PCM_FRAME_BYTES)));\n }\n this.pending = Buffer.from(combined.subarray(completeBytes));\n return frames;\n }\n\n flush(): Buffer {\n const remainder = this.pending;\n this.pending = Buffer.alloc(0);\n return remainder;\n }\n}\n\nexport function encodePcm16Wav(pcm: Buffer): Buffer {\n if (pcm.length % PCM_BYTES_PER_SAMPLE !== 0) throw new Error('PCM input must contain complete 16-bit samples');\n const byteRate = PCM_SAMPLE_RATE * PCM_CHANNELS * PCM_BYTES_PER_SAMPLE;\n const blockAlign = PCM_CHANNELS * PCM_BYTES_PER_SAMPLE;\n const wav = Buffer.alloc(WAV_HEADER_BYTES + pcm.length);\n wav.write(WAV_RIFF_CHUNK, 0);\n wav.writeUInt32LE(WAV_HEADER_BYTES - 8 + pcm.length, 4);\n wav.write(WAV_FORMAT, 8);\n wav.write(WAV_FORMAT_CHUNK, 12);\n wav.writeUInt32LE(16, 16);\n wav.writeUInt16LE(PCM_FORMAT, 20);\n wav.writeUInt16LE(PCM_CHANNELS, 22);\n wav.writeUInt32LE(PCM_SAMPLE_RATE, 24);\n wav.writeUInt32LE(byteRate, 28);\n wav.writeUInt16LE(blockAlign, 32);\n wav.writeUInt16LE(PCM_BITS_PER_SAMPLE, 34);\n wav.write(WAV_DATA_CHUNK, 36);\n wav.writeUInt32LE(pcm.length, 40);\n pcm.copy(wav, WAV_HEADER_BYTES);\n return wav;\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport type { ResolvedVoiceConfig, VoiceTtsConfig } from '@agimon-ai/po-config';\n\nimport {\n type AudioAnalysis,\n type BinaryProcessStartOptions,\n type BinaryRunningProcess,\n type IAudioAnalyzer,\n type IAudioRecorder,\n type IBinaryProcessSpawner,\n type IClock,\n type IExecutableResolver,\n type IPcmAudioRecorder,\n type IProcessSpawner,\n type ITemporaryWorkspace,\n type ITtsAdapter,\n type LiveRecordingHandle,\n type ProcessResult,\n type ProcessStartOptions,\n type RecordingHandle,\n type RunningProcess,\n type TimerHandle,\n type TtsPlayback,\n type TtsPlaybackOutcome,\n type TtsPlaybackReference,\n type TtsPlaybackResult,\n type TtsSpeakRequest,\n} from '../../types';\nimport type { ClientNarrationSynthesizer } from '../clientMedia';\nimport { encodePcm16Wav, PcmFrameAssembler } from '../pcm';\n\nconst SAMPLE_RATE = '16000';\nconst STOP_GRACE_MS = 1_500;\nconst FFMPEG_BINARY = 'ffmpeg';\nconst RECORDING_FILE = 'recording.wav';\nconst MACOS_SAY_BINARY = '/usr/bin/say';\nconst MACOS_SAY_FALLBACK = 'say';\nconst MACOS_PLATFORM = 'darwin';\nconst MACOS_SAY_AUDIO_FILE = 'narration.wav';\nconst MACOS_SAY_PCM_FORMAT = 'LEI16@16000';\nconst MACOS_RECORDING_ONLY_ERROR = 'Voice recording is supported on macOS only';\nconst INTERRUPT_SIGNAL = 'SIGINT';\nconst TERMINATE_SIGNAL = 'SIGTERM';\nconst KILL_SIGNAL = 'SIGKILL';\nconst ASCII_ENCODING = 'ascii';\nconst FFMPEG_INPUT_OPTIONS = ['-hide_banner', '-loglevel', 'error', '-f', 'avfoundation', '-i'] as const;\n// Browser capture requests speech cleanup from getUserMedia. Apply conservative conditioning here so\n// standalone macOS capture does not feed raw room rumble, steady noise, and low gain into ASR.\nconst FFMPEG_SPEECH_FILTER = 'highpass=f=80,afftdn=nr=10:nf=-40:tn=1,speechnorm';\nconst FFMPEG_PCM_OPTIONS = [\n '-af',\n FFMPEG_SPEECH_FILTER,\n '-ac',\n '1',\n '-ar',\n SAMPLE_RATE,\n '-c:a',\n 'pcm_s16le',\n '-y',\n] as const;\nconst FFMPEG_RAW_PCM_OPTIONS = [\n '-af',\n FFMPEG_SPEECH_FILTER,\n '-ac',\n '1',\n '-ar',\n SAMPLE_RATE,\n '-c:a',\n 'pcm_s16le',\n '-f',\n 's16le',\n 'pipe:1',\n] as const;\nconst PCM_CHANNELS = 1;\nconst PCM_BITS_PER_SAMPLE = 16;\nconst PCM_VALUE_LIMIT = 32_768;\nconst ANALYSIS_FRAME_MS = 20;\nconst DBFS_SCALE = 20;\nconst VOICED_DBFS_THRESHOLD = -50;\nconst MINIMUM_VOICED_MS = 200;\nexport class SystemClock implements IClock {\n now(): number {\n return Date.now();\n }\n setInterval(callback: () => void, milliseconds: number): TimerHandle {\n return setInterval(callback, milliseconds);\n }\n setTimeout(callback: () => void, milliseconds: number): TimerHandle {\n return setTimeout(callback, milliseconds);\n }\n clear(handle: TimerHandle): void {\n clearTimeout(handle);\n }\n}\nexport class ExecutableResolver implements IExecutableResolver {\n public constructor(private readonly searchPath: string = process.env.PATH ?? '') {}\n resolve(configured: string | undefined, fallback: string): string {\n if (configured) {\n fs.accessSync(configured, fs.constants.X_OK);\n return configured;\n }\n let lastAccessError: unknown;\n for (const directory of this.searchPath.split(path.delimiter)) {\n const candidate = path.join(directory, fallback);\n try {\n fs.accessSync(candidate, fs.constants.X_OK);\n return candidate;\n } catch (error) {\n lastAccessError = error;\n }\n }\n throw new Error(`Required executable not found on PATH: ${fallback}`, { cause: lastAccessError });\n }\n}\nexport class NodeProcessSpawner implements IProcessSpawner {\n start(executable: string, args: readonly string[], options: ProcessStartOptions = {}): RunningProcess {\n const child = spawn(executable, [...args], { shell: false, stdio: ['ignore', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n const abort = (): void => {\n child.kill(KILL_SIGNAL);\n };\n options.signal?.addEventListener('abort', abort, { once: true });\n if (options.signal?.aborted) abort();\n const completion = new Promise<ProcessResult>((resolve, reject) => {\n child.once('error', reject);\n child.once('close', (code) => resolve({ code: code ?? 1, stdout, stderr }));\n }).finally(() => options.signal?.removeEventListener('abort', abort));\n return { completion, signal: (signal) => child.kill(signal) };\n }\n async run(executable: string, args: readonly string[], options: ProcessStartOptions = {}): Promise<ProcessResult> {\n return this.start(executable, args, options).completion;\n }\n}\nexport class NodeBinaryProcessSpawner implements IBinaryProcessSpawner {\n start(executable: string, args: readonly string[], options: BinaryProcessStartOptions = {}): BinaryRunningProcess {\n const child = spawn(executable, [...args], {\n shell: false,\n stdio: [options.stdin === 'pipe' ? 'pipe' : 'ignore', 'pipe', 'pipe'],\n });\n let stderr = '';\n let stdinError = '';\n child.stderr!.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.stdin?.on('error', (error: Error) => {\n stdinError = error.message;\n });\n const abort = (): void => {\n child.kill(KILL_SIGNAL);\n };\n options.signal?.addEventListener('abort', abort, { once: true });\n if (options.signal?.aborted) abort();\n const completion = new Promise<ProcessResult>((resolve, reject) => {\n child.once('error', reject);\n child.once('close', (code) =>\n resolve({\n code: code ?? 1,\n stdout: '',\n stderr: [stderr, stdinError].filter(Boolean).join('\\n'),\n }),\n );\n }).finally(() => options.signal?.removeEventListener('abort', abort));\n return {\n completion,\n signal: (signal) => child.kill(signal),\n onStdout: (listener) => {\n child.stdout!.on('data', listener);\n return () => child.stdout!.off('data', listener);\n },\n writeStdin: (data) => child.stdin?.write(data) ?? false,\n closeStdin: () => child.stdin?.end(),\n };\n }\n}\nexport class TemporaryWorkspace implements ITemporaryWorkspace {\n create(): string {\n const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'doom-voice-'));\n fs.chmodSync(directory, 0o700);\n return directory;\n }\n writeFile(directory: string, fileName: string, data: Buffer): string {\n const filePath = path.join(directory, fileName);\n fs.writeFileSync(filePath, data, { mode: 0o600 });\n return filePath;\n }\n remove(directory: string): void {\n fs.rmSync(directory, { recursive: true, force: true });\n }\n}\nclass FfmpegRecording implements RecordingHandle {\n constructor(\n readonly filePath: string,\n private readonly process: RunningProcess,\n private readonly clock: IClock,\n ) {}\n async stop(): Promise<void> {\n this.process.signal(INTERRUPT_SIGNAL);\n let escalation: TimerHandle | undefined = this.clock.setTimeout(() => {\n this.process.signal(TERMINATE_SIGNAL);\n escalation = this.clock.setTimeout(() => {\n this.process.signal(KILL_SIGNAL);\n }, STOP_GRACE_MS);\n }, STOP_GRACE_MS);\n try {\n const result = await this.process.completion;\n if (result.code !== 0 && !fs.existsSync(this.filePath))\n throw new Error(result.stderr || `FFmpeg exited with code ${result.code}`);\n } finally {\n if (escalation) this.clock.clear(escalation);\n }\n }\n async abort(): Promise<void> {\n this.process.signal(KILL_SIGNAL);\n await this.process.completion.catch(() => undefined);\n }\n}\nexport class FfmpegAudioRecorder implements IAudioRecorder {\n constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IProcessSpawner,\n private readonly clock: IClock,\n ) {}\n preflight(config: ResolvedVoiceConfig): void {\n if (process.platform !== MACOS_PLATFORM) throw new Error(MACOS_RECORDING_ONLY_ERROR);\n this.executables.resolve(config.recorder.binary, FFMPEG_BINARY);\n }\n start(config: ResolvedVoiceConfig, workspace: string): RecordingHandle {\n const executable = this.executables.resolve(config.recorder.binary, FFMPEG_BINARY);\n const filePath = path.join(workspace, RECORDING_FILE);\n const args = [...FFMPEG_INPUT_OPTIONS, config.recorder.device, ...FFMPEG_PCM_OPTIONS, filePath];\n return new FfmpegRecording(filePath, this.spawner.start(executable, args), this.clock);\n }\n}\nclass FfmpegPcmRecording implements LiveRecordingHandle {\n readonly completion: Promise<ProcessResult>;\n private readonly assembler = new PcmFrameAssembler();\n private readonly disposeStdout: () => void;\n private accepting = true;\n private stopping?: Promise<Buffer>;\n\n constructor(\n private readonly process: BinaryRunningProcess,\n private readonly clock: IClock,\n onFrame: (frame: Buffer) => void,\n ) {\n this.disposeStdout = process.onStdout((chunk) => {\n if (!this.accepting) return;\n for (const frame of this.assembler.push(chunk)) onFrame(frame);\n });\n this.completion = process.completion.finally(() => {\n this.accepting = false;\n this.disposeStdout();\n });\n }\n\n stop(): Promise<Buffer> {\n this.stopping ??= this.stopProcess();\n return this.stopping;\n }\n\n async abort(): Promise<Buffer> {\n this.accepting = false;\n this.disposeStdout();\n this.process.signal(KILL_SIGNAL);\n await this.completion.catch(() => undefined);\n return this.assembler.flush();\n }\n\n private async stopProcess(): Promise<Buffer> {\n this.process.signal(INTERRUPT_SIGNAL);\n let terminateTimer: TimerHandle | undefined;\n let killTimer: TimerHandle | undefined;\n terminateTimer = this.clock.setTimeout(() => {\n this.process.signal(TERMINATE_SIGNAL);\n killTimer = this.clock.setTimeout(() => {\n this.process.signal(KILL_SIGNAL);\n }, STOP_GRACE_MS);\n }, STOP_GRACE_MS);\n try {\n await this.completion;\n return this.assembler.flush();\n } finally {\n if (terminateTimer) this.clock.clear(terminateTimer);\n if (killTimer) this.clock.clear(killTimer);\n }\n }\n}\nexport class FfmpegPcmAudioRecorder implements IPcmAudioRecorder {\n constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IBinaryProcessSpawner,\n private readonly clock: IClock,\n ) {}\n preflight(config: ResolvedVoiceConfig): void {\n if (process.platform !== MACOS_PLATFORM) throw new Error(MACOS_RECORDING_ONLY_ERROR);\n this.executables.resolve(config.recorder.binary, FFMPEG_BINARY);\n }\n start(config: ResolvedVoiceConfig, onFrame: (frame: Buffer) => void): LiveRecordingHandle {\n const executable = this.executables.resolve(config.recorder.binary, FFMPEG_BINARY);\n const args = [...FFMPEG_INPUT_OPTIONS, config.recorder.device, ...FFMPEG_RAW_PCM_OPTIONS];\n return new FfmpegPcmRecording(this.spawner.start(executable, args), this.clock, onFrame);\n }\n}\nclass MacOsSayPlayback implements TtsPlayback {\n readonly reference: TtsPlaybackReference;\n readonly completion: Promise<TtsPlaybackResult>;\n private requestedOutcome: TtsPlaybackOutcome | undefined;\n private stopping?: Promise<void>;\n private aborting?: Promise<void>;\n\n constructor(\n request: TtsSpeakRequest,\n private readonly process: BinaryRunningProcess,\n private readonly clock: IClock,\n ) {\n this.reference = {\n id: request.id,\n kind: request.kind,\n text: request.text,\n startedAt: clock.now(),\n };\n this.completion = process.completion.then((result) => ({\n outcome: this.requestedOutcome ?? (result.code === 0 ? 'completed' : 'failed'),\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: result,\n }));\n }\n\n stop(): Promise<void> {\n this.stopping ??= this.stopProcess();\n return this.stopping;\n }\n\n abort(): Promise<void> {\n this.aborting ??= this.abortProcess();\n return this.aborting;\n }\n\n private async abortProcess(): Promise<void> {\n this.requestedOutcome = 'aborted';\n this.process.signal(KILL_SIGNAL);\n await this.completion.then(() => undefined);\n }\n\n private async stopProcess(): Promise<void> {\n this.requestedOutcome ??= 'stopped';\n this.process.signal(INTERRUPT_SIGNAL);\n let terminateTimer: TimerHandle | undefined;\n let killTimer: TimerHandle | undefined;\n terminateTimer = this.clock.setTimeout(() => {\n this.process.signal(TERMINATE_SIGNAL);\n killTimer = this.clock.setTimeout(() => {\n this.process.signal(KILL_SIGNAL);\n }, STOP_GRACE_MS);\n }, STOP_GRACE_MS);\n try {\n await this.completion;\n } finally {\n if (terminateTimer) this.clock.clear(terminateTimer);\n if (killTimer) this.clock.clear(killTimer);\n }\n }\n}\n\nexport class MacOsSayTtsAdapter implements ITtsAdapter {\n constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IBinaryProcessSpawner,\n private readonly clock: IClock,\n ) {}\n\n preflight(_config: VoiceTtsConfig): void {\n if (process.platform !== MACOS_PLATFORM) throw new Error('Voice narration is supported on macOS only');\n this.executables.resolve(MACOS_SAY_BINARY, MACOS_SAY_FALLBACK);\n }\n\n speak(request: TtsSpeakRequest): TtsPlayback {\n const text = request.text.trim();\n if (!text) throw new Error('Voice narration text must not be empty');\n const args: string[] = [];\n if (request.config.voice) args.push('-v', request.config.voice);\n if (request.config.rate !== undefined) args.push('-r', String(request.config.rate));\n const executable = this.executables.resolve(MACOS_SAY_BINARY, MACOS_SAY_FALLBACK);\n const processHandle = this.spawner.start(executable, args, { stdin: 'pipe' });\n processHandle.writeStdin(text);\n processHandle.closeStdin();\n return new MacOsSayPlayback({ ...request, text }, processHandle, this.clock);\n }\n}\n\nexport class MacOsSayPcmSynthesizer implements ClientNarrationSynthesizer {\n public constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IBinaryProcessSpawner,\n ) {}\n\n public async synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer> {\n const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'doom-voice-narration-'));\n fs.chmodSync(directory, 0o700);\n const filePath = path.join(directory, MACOS_SAY_AUDIO_FILE);\n try {\n const args = ['-o', filePath, '--file-format=WAVE', `--data-format=${MACOS_SAY_PCM_FORMAT}`];\n if (request.config.voice) args.push('-v', request.config.voice);\n if (request.config.rate !== undefined) args.push('-r', String(request.config.rate));\n const executable = this.executables.resolve(MACOS_SAY_BINARY, MACOS_SAY_FALLBACK);\n const processHandle = this.spawner.start(executable, args, { signal, stdin: 'pipe' });\n processHandle.writeStdin(request.text);\n processHandle.closeStdin();\n const result = await processHandle.completion;\n if (result.code !== 0) throw new Error(result.stderr || `macOS say exited with code ${String(result.code)}.`);\n fs.chmodSync(filePath, 0o600);\n return pcm16FromWav(fs.readFileSync(filePath));\n } finally {\n fs.rmSync(directory, { recursive: true, force: true });\n }\n }\n}\n\nfunction pcm16FromWav(buffer: Buffer): Buffer {\n if (\n buffer.length < 12 ||\n buffer.toString(ASCII_ENCODING, 0, 4) !== 'RIFF' ||\n buffer.toString(ASCII_ENCODING, 8, 12) !== 'WAVE'\n )\n throw new Error('Narration synthesis did not produce a PCM WAV file.');\n let offset = 12;\n let validFormat = false;\n let audio: Buffer | undefined;\n while (offset + 8 <= buffer.length) {\n const id = buffer.toString(ASCII_ENCODING, offset, offset + 4);\n const size = buffer.readUInt32LE(offset + 4);\n const start = offset + 8;\n if (id === 'fmt ' && size >= 16) {\n validFormat =\n buffer.readUInt16LE(start) === 1 &&\n buffer.readUInt16LE(start + 2) === PCM_CHANNELS &&\n buffer.readUInt32LE(start + 4) === Number(SAMPLE_RATE) &&\n buffer.readUInt16LE(start + 14) === PCM_BITS_PER_SAMPLE;\n } else if (id === 'data') audio = buffer.subarray(start, Math.min(start + size, buffer.length));\n offset = start + size + (size % 2);\n }\n if (!validFormat || audio === undefined || audio.byteLength % 2 !== 0)\n throw new Error('Narration synthesis must produce PCM16 16 kHz mono audio.');\n return Buffer.from(audio);\n}\n\nexport function writePrivatePcm16Wav(filePath: string, pcm: Buffer): void {\n fs.writeFileSync(filePath, encodePcm16Wav(pcm), { mode: 0o600 });\n fs.chmodSync(filePath, 0o600);\n}\nexport function analyzePcmWav(buffer: Buffer): AudioAnalysis {\n if (\n buffer.length < 12 ||\n buffer.toString(ASCII_ENCODING, 0, 4) !== 'RIFF' ||\n buffer.toString(ASCII_ENCODING, 8, 12) !== 'WAVE'\n )\n throw new Error('Recording is not a PCM WAV file');\n let offset = 12;\n let sampleRate = 0;\n let channels = 0;\n let bitsPerSample = 0;\n let audio: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n while (offset + 8 <= buffer.length) {\n const id = buffer.toString(ASCII_ENCODING, offset, offset + 4);\n const size = buffer.readUInt32LE(offset + 4);\n const start = offset + 8;\n if (id === 'fmt ' && size >= 16) {\n if (buffer.readUInt16LE(start) !== 1) throw new Error('Recording must use PCM encoding');\n channels = buffer.readUInt16LE(start + 2);\n sampleRate = buffer.readUInt32LE(start + 4);\n bitsPerSample = buffer.readUInt16LE(start + 14);\n } else if (id === 'data') audio = buffer.subarray(start, Math.min(start + size, buffer.length));\n offset = start + size + (size % 2);\n }\n if (channels !== PCM_CHANNELS || bitsPerSample !== PCM_BITS_PER_SAMPLE || sampleRate <= 0)\n throw new Error('Recording must be 16-bit mono PCM');\n const frameSamples = Math.floor((sampleRate * ANALYSIS_FRAME_MS) / 1_000);\n let voicedFrames = 0;\n for (let sample = 0; sample + frameSamples <= audio.length / 2; sample += frameSamples) {\n let squareSum = 0;\n for (let index = 0; index < frameSamples; index += 1) {\n const value = audio.readInt16LE((sample + index) * 2) / PCM_VALUE_LIMIT;\n squareSum += value * value;\n }\n const rms = Math.sqrt(squareSum / frameSamples);\n const dbfs = rms === 0 ? Number.NEGATIVE_INFINITY : DBFS_SCALE * Math.log10(rms);\n if (dbfs > VOICED_DBFS_THRESHOLD) voicedFrames += 1;\n }\n const voicedMilliseconds = voicedFrames * ANALYSIS_FRAME_MS;\n return { silent: audio.length === 0 || voicedMilliseconds < MINIMUM_VOICED_MS, voicedMilliseconds };\n}\nexport class PcmWavAnalyzer implements IAudioAnalyzer {\n analyze(filePath: string): AudioAnalysis {\n return analyzePcmWav(fs.readFileSync(filePath));\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { ResolvedVoiceConfig, VoiceTtsConfig } from '@agimon-ai/po-config';\n\nimport type {\n IClock,\n IPcmAudioRecorder,\n ITtsAdapter,\n IVoiceMediaHostConnection,\n LiveRecordingHandle,\n PcmAudioRecorderStartOptions,\n ProcessResult,\n TtsPlayback,\n TtsPlaybackReference,\n TtsPlaybackResult,\n TtsSpeakRequest,\n} from '../../types';\nimport type { VoiceMediaPlaybackDelivery, VoiceMediaPlaybackResult } from '../../types/clientMedia';\nimport { PcmFrameAssembler } from '../pcm';\n\nconst CAPTURE_ID_PREFIX = 'client-capture';\nconst PLAYBACK_ID_PREFIX = 'client-playback';\nconst PLAYBACK_AUDIO_CHUNK_BYTES = 64 * 1024;\n\nexport interface ClientNarrationSynthesizer {\n synthesize(request: TtsSpeakRequest, signal: AbortSignal): Promise<Buffer>;\n}\n\n/** Uses an injected browser/device media host without crossing an internal HTTP boundary. */\nexport function voiceMediaHostConnection(host?: IVoiceMediaHostConnection): IVoiceMediaHostConnection | undefined {\n return host;\n}\n\nfunction describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction failedProcess(error: unknown): ProcessResult {\n return { code: 1, stdout: '', stderr: describeError(error) };\n}\n\nclass ClientPcmRecording implements LiveRecordingHandle {\n public readonly completion: Promise<ProcessResult>;\n private readonly captureId = `${CAPTURE_ID_PREFIX}-${randomUUID()}`;\n private readonly assembler = new PcmFrameAssembler();\n private readonly started: Promise<void>;\n private aborting = false;\n private stopOperation: Promise<Buffer> | undefined;\n private abortOperation: Promise<Buffer> | undefined;\n\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n onFrame: (frame: Buffer) => void,\n private readonly options: PcmAudioRecorderStartOptions,\n ) {\n this.started = connection.startCapture(this.captureId, options.capture);\n this.completion = this.consume(onFrame).catch(failedProcess);\n }\n\n public stop(): Promise<Buffer> {\n this.stopOperation ??= this.stopCapture();\n return this.stopOperation;\n }\n\n public abort(): Promise<Buffer> {\n this.abortOperation ??= this.abortCapture();\n return this.abortOperation;\n }\n\n private async consume(onFrame: (frame: Buffer) => void): Promise<ProcessResult> {\n await this.started;\n while (!this.aborting) {\n const batch = await this.connection.readCapture(this.captureId);\n if (batch.activity !== undefined) this.options.onClientActivity?.(batch.activity);\n for (const frame of this.assembler.push(batch.pcm)) onFrame(frame);\n if (batch.state === 'stopped') return { code: 0, stdout: '', stderr: '' };\n }\n return { code: 0, stdout: '', stderr: '' };\n }\n\n private async stopCapture(): Promise<Buffer> {\n await this.started;\n await this.connection.stopCapture(this.captureId);\n const result = await this.completion;\n if (result.code !== 0) throw new Error(result.stderr || 'Voice media client stopped unexpectedly.');\n return this.assembler.flush();\n }\n\n private async abortCapture(): Promise<Buffer> {\n this.aborting = true;\n await this.started.then(\n () => this.connection.abortCapture(this.captureId),\n () => undefined,\n );\n await this.completion.catch(() => undefined);\n return this.assembler.flush();\n }\n}\n\nexport class ClientPcmAudioRecorder implements IPcmAudioRecorder {\n public constructor(private readonly connection: IVoiceMediaHostConnection) {}\n\n public preflight(_config: ResolvedVoiceConfig): void {}\n\n public start(\n _config: ResolvedVoiceConfig,\n onFrame: (frame: Buffer) => void,\n options: PcmAudioRecorderStartOptions = {\n capture: { mode: 'manual', activityControl: 'host' },\n },\n ): LiveRecordingHandle {\n return new ClientPcmRecording(this.connection, onFrame, options);\n }\n}\n\nclass ClientTtsPlayback implements TtsPlayback {\n public readonly reference: TtsPlaybackReference;\n public readonly completion: Promise<TtsPlaybackResult>;\n private readonly started: Promise<VoiceMediaPlaybackDelivery | void>;\n private readonly synthesisController = new AbortController();\n private stopOperation: Promise<void> | undefined;\n private abortOperation: Promise<void> | undefined;\n\n public constructor(\n private readonly request: TtsSpeakRequest,\n private readonly playbackId: string,\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {\n this.reference = {\n id: request.id,\n kind: request.kind,\n text: request.text,\n startedAt: clock.now(),\n };\n this.started = connection.startPlayback({\n playbackId,\n text: request.text,\n ...(request.config.voice ? { voice: request.config.voice } : {}),\n ...(request.config.rate === undefined ? {} : { rate: request.config.rate }),\n });\n this.completion = this.settle();\n }\n\n public stop(): Promise<void> {\n this.stopOperation ??= this.stopPlayback(false);\n return this.stopOperation;\n }\n\n public abort(): Promise<void> {\n this.abortOperation ??= this.stopPlayback(true);\n return this.abortOperation;\n }\n\n private async settle(): Promise<TtsPlaybackResult> {\n try {\n const delivery = await this.started;\n if (delivery === 'streamed') await this.uploadNarration();\n let result: VoiceMediaPlaybackResult | undefined;\n while (result === undefined) result = await this.connection.readPlayback(this.playbackId);\n return {\n outcome: result.outcome,\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: { code: result.outcome === 'failed' ? 1 : 0, stdout: '', stderr: result.error ?? '' },\n };\n } catch (error) {\n return {\n outcome: 'failed',\n reference: { ...this.reference, endedAt: this.clock.now() },\n process: failedProcess(error),\n };\n }\n }\n\n private async uploadNarration(): Promise<void> {\n if (\n this.synthesizer === undefined ||\n this.connection.sendPlaybackAudio === undefined ||\n this.connection.sealPlaybackAudio === undefined\n ) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, 'Backend narration synthesis is unavailable.');\n return;\n }\n try {\n const pcm = await this.synthesizer.synthesize(this.request, this.synthesisController.signal);\n for (let offset = 0; offset < pcm.byteLength; offset += PLAYBACK_AUDIO_CHUNK_BYTES) {\n await this.connection.sendPlaybackAudio(\n this.playbackId,\n pcm.subarray(offset, offset + PLAYBACK_AUDIO_CHUNK_BYTES),\n );\n }\n await this.connection.sealPlaybackAudio(this.playbackId);\n } catch (error) {\n await this.connection.sealPlaybackAudio?.(this.playbackId, describeError(error)).catch(() => undefined);\n }\n }\n\n private async stopPlayback(abort: boolean): Promise<void> {\n this.synthesisController.abort();\n await this.started;\n if (abort) await this.connection.abortPlayback(this.playbackId);\n else await this.connection.stopPlayback(this.playbackId);\n await this.completion;\n }\n}\n\nexport class ClientTtsAdapter implements ITtsAdapter {\n public constructor(\n private readonly connection: IVoiceMediaHostConnection,\n private readonly clock: IClock,\n private readonly synthesizer?: ClientNarrationSynthesizer,\n ) {}\n\n public preflight(_config: VoiceTtsConfig): void {}\n\n public speak(request: TtsSpeakRequest): TtsPlayback {\n const text = request.text.trim();\n if (!text) throw new Error('Voice narration text must not be empty');\n return new ClientTtsPlayback(\n { ...request, text },\n `${PLAYBACK_ID_PREFIX}-${String(request.id)}-${randomUUID()}`,\n this.connection,\n this.clock,\n this.synthesizer,\n );\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { ResolvedVoiceConfig, VoiceAdapterConfig, VoiceEngine } from '@agimon-ai/po-config';\n\nimport {\n type AsrDecodingEvidence,\n type IExecutableResolver,\n type IProcessSpawner,\n type ITranscriberAdapter,\n type ITranscriberRegistry,\n type SelectedTranscriber,\n type TranscriptionRequest,\n type TranscriptionResult,\n} from '../../types';\n\nconst AUTO_LANGUAGE = 'auto';\nconst WHISPER_CPP_ENGINE = 'whisper-cpp' as const;\nconst OPENAI_WHISPER_ENGINE = 'openai-whisper' as const;\nconst MLX_WHISPER_ENGINE = 'mlx-whisper' as const;\nconst WHISPER_CPP_BINARY = 'whisper-cli';\nconst OPENAI_WHISPER_BINARY = 'whisper';\nconst MLX_WHISPER_BINARY = 'mlx_whisper';\nconst TEXT_OUTPUT_FORMAT = 'txt';\nconst JSON_OUTPUT_FORMAT = 'json';\nconst MAX_ASR_SEGMENTS = 10_000;\nconst MAX_ASR_DURATION_MS = 300_000;\n\nfunction assertModelPath(config: VoiceAdapterConfig): void {\n if (config.model.path && !fs.existsSync(config.model.path))\n throw new Error(`Voice model not found: ${config.model.path}`);\n}\n\nfunction requireModel(config: VoiceAdapterConfig): string {\n const model = config.model.path ?? config.model.id;\n if (!model) throw new Error('Voice adapter requires a model path or id');\n return model;\n}\n\nfunction assertSuccess(engine: string, result: { code: number; stderr: string }): void {\n if (result.code !== 0)\n throw new Error(`${engine} transcription failed: ${result.stderr || `exit code ${result.code}`}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction segmentMetadataNumber(\n segment: Record<string, unknown>,\n key: string,\n minimum: number,\n maximum: number,\n): number | undefined {\n const value = segment[key];\n if (value === undefined) return undefined;\n if (typeof value !== 'number' || !Number.isFinite(value) || value < minimum || value > maximum)\n throw new Error(`mlx-whisper returned invalid ${key} metadata`);\n return value;\n}\n\nfunction parseMlxOutput(raw: string): TranscriptionResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new Error('mlx-whisper returned invalid JSON output', { cause: error });\n }\n if (!isRecord(parsed) || typeof parsed.text !== 'string') throw new Error('mlx-whisper returned invalid JSON fields');\n if (parsed.segments === undefined) return { transcript: parsed.text.trim() };\n if (!Array.isArray(parsed.segments) || parsed.segments.length > MAX_ASR_SEGMENTS)\n throw new Error('mlx-whisper returned invalid segment metadata');\n\n let totalWeight = 0;\n let segmentDurationMs = 0;\n let speechDurationMs = 0;\n let noSpeechWeighted = 0;\n let noSpeechWeight = 0;\n let logProbabilityWeighted = 0;\n let logProbabilityWeight = 0;\n let compressionRatio: number | undefined;\n for (const segment of parsed.segments) {\n if (!isRecord(segment)) throw new Error('mlx-whisper returned invalid segment metadata');\n const start = segmentMetadataNumber(segment, 'start', 0, MAX_ASR_DURATION_MS / 1_000);\n const end = segmentMetadataNumber(segment, 'end', 0, MAX_ASR_DURATION_MS / 1_000);\n if (start !== undefined && end !== undefined && end < start)\n throw new Error('mlx-whisper returned invalid segment duration metadata');\n const durationMs = start !== undefined && end !== undefined ? (end - start) * 1_000 : 0;\n const weight = durationMs > 0 ? durationMs : 1;\n totalWeight += weight;\n segmentDurationMs = Math.min(MAX_ASR_DURATION_MS, segmentDurationMs + durationMs);\n const noSpeechProbability = segmentMetadataNumber(segment, 'no_speech_prob', 0, 1);\n if (noSpeechProbability !== undefined) {\n noSpeechWeighted += noSpeechProbability * weight;\n noSpeechWeight += weight;\n speechDurationMs = Math.min(MAX_ASR_DURATION_MS, speechDurationMs + durationMs * (1 - noSpeechProbability));\n }\n const averageLogProbability = segmentMetadataNumber(segment, 'avg_logprob', -20, 0);\n if (averageLogProbability !== undefined) {\n logProbabilityWeighted += averageLogProbability * weight;\n logProbabilityWeight += weight;\n }\n const segmentCompressionRatio = segmentMetadataNumber(segment, 'compression_ratio', 0, 100);\n if (segmentCompressionRatio !== undefined)\n compressionRatio = Math.max(compressionRatio ?? segmentCompressionRatio, segmentCompressionRatio);\n }\n const evidence: AsrDecodingEvidence = {\n ...(noSpeechWeight > 0 ? { noSpeechProbability: noSpeechWeighted / noSpeechWeight } : {}),\n ...(logProbabilityWeight > 0 ? { averageLogProbability: logProbabilityWeighted / logProbabilityWeight } : {}),\n ...(compressionRatio !== undefined ? { compressionRatio } : {}),\n ...(segmentDurationMs > 0 ? { segmentDurationMs } : {}),\n ...(noSpeechWeight > 0 ? { speechDurationMs } : {}),\n };\n return {\n transcript: parsed.text.trim(),\n ...(totalWeight > 0 && Object.keys(evidence).length > 0 ? { evidence } : {}),\n };\n}\n\nexport class WhisperCppAdapter implements ITranscriberAdapter {\n public readonly engine = WHISPER_CPP_ENGINE;\n\n public constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IProcessSpawner,\n ) {}\n\n public preflight(config: VoiceAdapterConfig): void {\n this.executables.resolve(config.binary, WHISPER_CPP_BINARY);\n assertModelPath(config);\n if (!config.model.path) throw new Error('whisper-cpp requires a local model path');\n }\n\n public async transcribe(request: TranscriptionRequest): Promise<string> {\n const outputPrefix = path.join(request.workspace, WHISPER_CPP_ENGINE);\n const args = [\n '--model',\n requireModel(request.config),\n '--file',\n request.audioPath,\n '--output-txt',\n '--output-file',\n outputPrefix,\n '--no-timestamps',\n ];\n if (request.language !== AUTO_LANGUAGE) args.push('--language', request.language);\n const result = await this.spawner.run(this.executables.resolve(request.config.binary, WHISPER_CPP_BINARY), args, {\n signal: request.signal,\n });\n assertSuccess(this.engine, result);\n return fs.readFileSync(`${outputPrefix}.txt`, 'utf8').trim();\n }\n}\n\nexport class OpenAiWhisperAdapter implements ITranscriberAdapter {\n public readonly engine = OPENAI_WHISPER_ENGINE;\n\n public constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IProcessSpawner,\n ) {}\n\n public preflight(config: VoiceAdapterConfig): void {\n this.executables.resolve(config.binary, OPENAI_WHISPER_BINARY);\n assertModelPath(config);\n requireModel(config);\n }\n\n public async transcribe(request: TranscriptionRequest): Promise<string> {\n const args = [\n request.audioPath,\n '--model',\n requireModel(request.config),\n '--output_format',\n TEXT_OUTPUT_FORMAT,\n '--output_dir',\n request.workspace,\n ];\n if (request.language !== AUTO_LANGUAGE) args.push('--language', request.language);\n const result = await this.spawner.run(\n this.executables.resolve(request.config.binary, OPENAI_WHISPER_BINARY),\n args,\n { signal: request.signal },\n );\n assertSuccess(this.engine, result);\n return fs.readFileSync(path.join(request.workspace, `${path.parse(request.audioPath).name}.txt`), 'utf8').trim();\n }\n}\n\nexport class MlxWhisperAdapter implements ITranscriberAdapter {\n public readonly engine = MLX_WHISPER_ENGINE;\n\n public constructor(\n private readonly executables: IExecutableResolver,\n private readonly spawner: IProcessSpawner,\n ) {}\n\n public preflight(config: VoiceAdapterConfig): void {\n this.executables.resolve(config.binary, MLX_WHISPER_BINARY);\n assertModelPath(config);\n requireModel(config);\n }\n\n public async transcribe(request: TranscriptionRequest): Promise<TranscriptionResult> {\n const outputName = MLX_WHISPER_ENGINE;\n const args = [\n request.audioPath,\n '--model',\n requireModel(request.config),\n '--output-dir',\n request.workspace,\n '--output-name',\n outputName,\n '--output-format',\n JSON_OUTPUT_FORMAT,\n ];\n if (request.language !== AUTO_LANGUAGE) args.push('--language', request.language);\n const result = await this.spawner.run(this.executables.resolve(request.config.binary, MLX_WHISPER_BINARY), args, {\n signal: request.signal,\n });\n assertSuccess(this.engine, result);\n return parseMlxOutput(fs.readFileSync(path.join(request.workspace, `${outputName}.json`), 'utf8'));\n }\n}\n\nexport class TranscriberRegistry implements ITranscriberRegistry {\n private readonly adapters: Record<Exclude<VoiceEngine, 'auto'>, ITranscriberAdapter>;\n\n public constructor(whisperCpp: ITranscriberAdapter, openAi: ITranscriberAdapter, mlx: ITranscriberAdapter) {\n this.adapters = {\n [WHISPER_CPP_ENGINE]: whisperCpp,\n [OPENAI_WHISPER_ENGINE]: openAi,\n [MLX_WHISPER_ENGINE]: mlx,\n };\n }\n\n public select(config: ResolvedVoiceConfig): SelectedTranscriber {\n const engines: Exclude<VoiceEngine, 'auto'>[] =\n config.engine === AUTO_LANGUAGE\n ? [WHISPER_CPP_ENGINE, OPENAI_WHISPER_ENGINE, MLX_WHISPER_ENGINE]\n : [config.engine];\n const errors: string[] = [];\n for (const engine of engines) {\n const adapterConfig = config.adapters[engine];\n if (!adapterConfig) {\n errors.push(`${engine}: not configured`);\n continue;\n }\n try {\n const adapter = this.adapters[engine];\n adapter.preflight(adapterConfig);\n return { adapter, config: adapterConfig };\n } catch (error) {\n errors.push(`${engine}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n throw new Error(`No usable voice transcription adapter. ${errors.join('; ')}`);\n }\n}\n","import type {\n EchoProbeAction,\n EchoProbeClassification,\n EchoReference,\n EchoProbeInput,\n EchoProbeResult,\n ControlPhraseMatch,\n NarrationAlignment,\n NarrationResidualAnalysis,\n RollingEchoProbeState,\n IEchoProbeClassifier,\n} from './type';\nexport type {\n EchoProbeAction,\n EchoProbeClassification,\n EchoReference,\n EchoProbeInput,\n EchoProbeResult,\n ControlPhraseMatch,\n NarrationAlignment,\n NarrationResidualAnalysis,\n RollingEchoProbeState,\n IEchoProbeClassifier,\n} from './type';\nimport type { TtsPlaybackReference } from '../../types';\n\nconst DEFAULT_ECHO_TAIL_MS = 800;\nconst MIN_ALIGNMENT_SIMILARITY = 0.75;\n\ninterface QueuedProbe {\n input: EchoProbeInput;\n controller: AbortController;\n resolve: (result: EchoProbeResult) => void;\n}\n\nfunction resultFor(\n input: Pick<EchoProbeInput, 'generation' | 'revision'>,\n action: EchoProbeAction,\n classification: EchoProbeClassification,\n): EchoProbeResult {\n return { generation: input.generation, revision: input.revision, action, classification };\n}\n\nfunction tokenize(value: string): string[] {\n const normalized = normalizeEchoText(value);\n return normalized.length === 0 ? [] : normalized.split(' ');\n}\n\nfunction tokenDistance(left: readonly string[], right: readonly string[]): number {\n let previous = Array.from({ length: right.length + 1 }, (_, index) => index);\n for (let leftIndex = 0; leftIndex < left.length; leftIndex += 1) {\n const current = [leftIndex + 1];\n for (let rightIndex = 0; rightIndex < right.length; rightIndex += 1) {\n const substitution = previous[rightIndex] + (left[leftIndex] === right[rightIndex] ? 0 : 1);\n current.push(Math.min(previous[rightIndex + 1] + 1, current[rightIndex] + 1, substitution));\n }\n previous = current;\n }\n return previous[right.length];\n}\n\nfunction controlPhraseDrift(tokenCount: number): number {\n if (tokenCount < 3) return 0;\n return Math.min(2, Math.floor(tokenCount / 3));\n}\n\nfunction findPhraseAt(\n transcriptTokens: readonly string[],\n phraseTokens: readonly string[],\n startIndex: number,\n): ControlPhraseMatch | undefined {\n if (phraseTokens.length === 0 || startIndex >= transcriptTokens.length) return undefined;\n const allowedDrift = controlPhraseDrift(phraseTokens.length);\n const minimumLength = Math.max(1, phraseTokens.length - allowedDrift);\n const maximumLength = Math.min(transcriptTokens.length - startIndex, phraseTokens.length + allowedDrift);\n\n for (let candidateLength = minimumLength; candidateLength <= maximumLength; candidateLength += 1) {\n const candidate = transcriptTokens.slice(startIndex, startIndex + candidateLength);\n if (tokenDistance(phraseTokens, candidate) <= allowedDrift) {\n return { tokenIndex: startIndex, tokenLength: candidateLength, phraseTokenLength: phraseTokens.length };\n }\n }\n return undefined;\n}\n\nfunction referenceCoversObservation(reference: EchoReference, observedAt: number): boolean {\n if (observedAt < reference.playback.startedAt) return false;\n const audibleUntil = reference.echoTailUntil ?? reference.playback.endedAt;\n return audibleUntil === undefined || observedAt <= audibleUntil;\n}\n\nexport function normalizeEchoText(value: string): string {\n return value\n .normalize('NFKC')\n .toLocaleLowerCase('en-US')\n .replace(/[\\p{P}\\p{S}]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\n\nexport function matchStartPhrase(\n transcript: string,\n phrases: readonly string[],\n newUtterance: boolean,\n): ControlPhraseMatch | undefined {\n if (!newUtterance) return undefined;\n const transcriptTokens = tokenize(transcript);\n for (const phrase of phrases) {\n const match = findPhraseAt(transcriptTokens, tokenize(phrase), 0);\n if (match) return match;\n }\n return undefined;\n}\n\nexport function matchStopPhrase(transcript: string, phrases: readonly string[]): ControlPhraseMatch | undefined {\n const transcriptTokens = tokenize(transcript);\n for (const phrase of phrases) {\n const phraseTokens = tokenize(phrase);\n for (let startIndex = 0; startIndex < transcriptTokens.length; startIndex += 1) {\n const match = findPhraseAt(transcriptTokens, phraseTokens, startIndex);\n if (match) return match;\n }\n }\n return undefined;\n}\n\nexport function matchPlaybackStopPhrase(\n residualRun: string,\n phrases: readonly string[],\n): ControlPhraseMatch | undefined {\n const transcriptTokens = tokenize(residualRun);\n for (const phrase of phrases) {\n const phraseTokens = tokenize(phrase);\n if (phraseTokens.length === 0 || phraseTokens.length > transcriptTokens.length) continue;\n for (let tokenIndex = 0; tokenIndex + phraseTokens.length <= transcriptTokens.length; tokenIndex += 1) {\n if (phraseTokens.every((token, offset) => transcriptTokens[tokenIndex + offset] === token)) {\n return {\n tokenIndex,\n tokenLength: phraseTokens.length,\n phraseTokenLength: phraseTokens.length,\n };\n }\n }\n }\n return undefined;\n}\n\nexport function alignNarrationSpan(transcript: string, narration: string): NarrationAlignment {\n const transcriptTokens = tokenize(transcript);\n const narrationTokens = tokenize(narration);\n if (transcriptTokens.length === 0) return { aligned: true, similarity: 1 };\n if (narrationTokens.length === 0) return { aligned: false, similarity: 0 };\n\n const allowedLengthDrift = Math.min(2, Math.floor(transcriptTokens.length / 4));\n const minimumLength = Math.max(1, transcriptTokens.length - allowedLengthDrift);\n const maximumLength = Math.min(narrationTokens.length, transcriptTokens.length + allowedLengthDrift);\n let bestSimilarity = 0;\n\n for (let candidateLength = minimumLength; candidateLength <= maximumLength; candidateLength += 1) {\n for (let startIndex = 0; startIndex + candidateLength <= narrationTokens.length; startIndex += 1) {\n const candidate = narrationTokens.slice(startIndex, startIndex + candidateLength);\n const scale = Math.max(transcriptTokens.length, candidate.length);\n const similarity = 1 - tokenDistance(transcriptTokens, candidate) / scale;\n bestSimilarity = Math.max(bestSimilarity, similarity);\n }\n }\n\n return { aligned: bestSimilarity >= MIN_ALIGNMENT_SIMILARITY, similarity: bestSimilarity };\n}\n\nexport function extractNovelNarrationResidual(transcript: string, narration: string): NarrationResidualAnalysis {\n const transcriptTokens = tokenize(transcript);\n const narrationTokens = tokenize(narration);\n if (transcriptTokens.length === 0) return { echoAligned: true, residualRuns: [], residual: '' };\n if (narrationTokens.length === 0) {\n const residual = transcriptTokens.join(' ');\n return { echoAligned: false, residualRuns: [residual], residual };\n }\n if (\n transcriptTokens.length <= narrationTokens.length &&\n alignNarrationSpan(transcriptTokens.join(' '), narrationTokens.join(' ')).aligned\n ) {\n return { echoAligned: true, residualRuns: [], residual: '' };\n }\n\n const echoed = Array.from({ length: transcriptTokens.length }, () => false);\n let alignedTokenCount = 0;\n for (let transcriptIndex = 0; transcriptIndex < transcriptTokens.length;) {\n let longest = 0;\n for (let narrationIndex = 0; narrationIndex < narrationTokens.length; narrationIndex += 1) {\n let length = 0;\n while (\n transcriptIndex + length < transcriptTokens.length &&\n narrationIndex + length < narrationTokens.length &&\n transcriptTokens[transcriptIndex + length] === narrationTokens[narrationIndex + length]\n ) {\n length += 1;\n }\n longest = Math.max(longest, length);\n }\n const confident = longest >= 2 || (transcriptTokens.length === 1 && longest === 1);\n if (!confident) {\n transcriptIndex += 1;\n continue;\n }\n for (let offset = 0; offset < longest; offset += 1) echoed[transcriptIndex + offset] = true;\n alignedTokenCount += longest;\n transcriptIndex += longest;\n }\n\n const residualRuns: string[] = [];\n for (let index = 0; index < transcriptTokens.length;) {\n while (index < transcriptTokens.length && echoed[index]) index += 1;\n const start = index;\n while (index < transcriptTokens.length && !echoed[index]) index += 1;\n if (index > start) residualRuns.push(transcriptTokens.slice(start, index).join(' '));\n }\n const residual = residualRuns.join(' ');\n return { echoAligned: alignedTokenCount > 0, residualRuns, residual };\n}\n\nexport class EchoTailTimeline {\n private reference: EchoReference | undefined;\n\n constructor(private readonly echoTailMs = DEFAULT_ECHO_TAIL_MS) {}\n\n begin(generation: number, playback: TtsPlaybackReference): void {\n this.reference = { generation, playback: { ...playback, endedAt: undefined } };\n }\n\n finish(generation: number, playbackId: number, endedAt: number): boolean {\n if (this.reference?.generation !== generation || this.reference.playback.id !== playbackId) return false;\n const safeEndedAt = Math.max(endedAt, this.reference.playback.startedAt);\n this.reference = {\n generation,\n playback: { ...this.reference.playback, endedAt: safeEndedAt },\n echoTailUntil: safeEndedAt + this.echoTailMs,\n };\n return true;\n }\n\n current(observedAt: number): EchoReference | undefined {\n if (!this.reference) return undefined;\n if (!referenceCoversObservation(this.reference, observedAt)) {\n this.reference = undefined;\n return undefined;\n }\n return {\n ...this.reference,\n playback: { ...this.reference.playback },\n };\n }\n\n playbackOverlapMs(windowStartedAt: number, windowEndedAt: number): number {\n if (!this.reference || windowEndedAt <= windowStartedAt) return 0;\n const referenceEnd = this.reference.echoTailUntil ?? this.reference.playback.endedAt ?? windowEndedAt;\n return Math.max(\n 0,\n Math.min(windowEndedAt, referenceEnd) - Math.max(windowStartedAt, this.reference.playback.startedAt),\n );\n }\n\n clear(generation: number): void {\n if (this.reference?.generation === generation) this.reference = undefined;\n }\n}\n\nexport class SemanticEchoAdjudicator implements IEchoProbeClassifier {\n async classify(input: EchoProbeInput, signal: AbortSignal): Promise<EchoProbeResult> {\n if (signal.aborted) return resultFor(input, 'ignore', 'stale');\n if (normalizeEchoText(input.transcript).length === 0) return resultFor(input, 'continue', 'no_speech');\n if (\n !input.reference ||\n input.reference.generation !== input.generation ||\n !referenceCoversObservation(input.reference, input.observedAt)\n ) {\n return resultFor(input, 'continue', 'no_reference');\n }\n\n const analysis = extractNovelNarrationResidual(input.transcript, input.reference.playback.text);\n if (analysis.residualRuns.length === 0) return resultFor(input, 'continue', 'echo');\n if (analysis.residualRuns.some((run) => matchPlaybackStopPhrase(run, input.stopPhrases))) {\n return resultFor(input, 'interrupt', 'stop_phrase');\n }\n return resultFor(input, 'continue', 'residual_speech');\n }\n}\n\nexport class RollingEchoProbeCoordinator {\n private generation: number | undefined;\n private highestRevision = 0;\n private latestActionableRevision = 0;\n private latestNormalizedTranscript = '';\n private active: QueuedProbe | undefined;\n private pending: QueuedProbe | undefined;\n\n constructor(private readonly classifier: IEchoProbeClassifier) {}\n\n beginGeneration(generation: number): void {\n if (this.generation === generation) return;\n this.cancelQueued();\n this.generation = generation;\n this.highestRevision = 0;\n this.latestActionableRevision = 0;\n this.latestNormalizedTranscript = '';\n }\n\n submit(input: EchoProbeInput): Promise<EchoProbeResult> {\n if (this.generation !== input.generation || input.revision <= this.highestRevision) {\n return Promise.resolve(resultFor(input, 'ignore', 'stale'));\n }\n this.highestRevision = input.revision;\n const normalizedTranscript = normalizeEchoText(input.transcript);\n if (normalizedTranscript === this.latestNormalizedTranscript) {\n return Promise.resolve(resultFor(input, 'ignore', 'duplicate'));\n }\n this.latestNormalizedTranscript = normalizedTranscript;\n this.latestActionableRevision = input.revision;\n\n return new Promise((resolve) => {\n const queued: QueuedProbe = { input, controller: new AbortController(), resolve };\n if (!this.active) {\n this.start(queued);\n return;\n }\n if (this.pending) this.pending.resolve(resultFor(this.pending.input, 'ignore', 'pressure'));\n this.pending = queued;\n });\n }\n\n stopGeneration(generation: number): void {\n if (this.generation !== generation) return;\n this.cancelQueued();\n this.generation = undefined;\n }\n\n state(): RollingEchoProbeState {\n return {\n generation: this.generation,\n activeRevision: this.active?.input.revision,\n pendingRevision: this.pending?.input.revision,\n highestRevision: this.highestRevision,\n };\n }\n\n private start(queued: QueuedProbe): void {\n this.active = queued;\n void this.run(queued);\n }\n\n private async run(queued: QueuedProbe): Promise<void> {\n let result: EchoProbeResult;\n try {\n result = await this.classifier.classify(queued.input, queued.controller.signal);\n } catch {\n result = resultFor(queued.input, 'continue', 'classifier_error');\n }\n if (this.active !== queued) return;\n this.active = undefined;\n if (\n this.generation !== queued.input.generation ||\n this.latestActionableRevision !== queued.input.revision ||\n queued.controller.signal.aborted\n ) {\n queued.resolve(resultFor(queued.input, 'ignore', 'stale'));\n } else {\n queued.resolve(result);\n }\n const next = this.pending;\n this.pending = undefined;\n if (next && this.generation === next.input.generation) this.start(next);\n else if (next) next.resolve(resultFor(next.input, 'ignore', 'stale'));\n }\n\n private cancelQueued(): void {\n if (this.active) {\n const active = this.active;\n this.active = undefined;\n active.controller.abort();\n active.resolve(resultFor(active.input, 'ignore', 'stale'));\n }\n if (this.pending) {\n const pending = this.pending;\n this.pending = undefined;\n pending.resolve(resultFor(pending.input, 'ignore', 'stale'));\n }\n }\n}\n","import type { AsrDecodingEvidence, IClock, TimerHandle, TranscriptionAdapterOutput } from '../../types';\n\nexport const DEFAULT_TRANSCRIPTION_TIMEOUT_MS = 120_000;\n\nexport type TurnTranscriptionOutcome =\n | { kind: 'success'; transcript: string; evidence?: AsrDecodingEvidence }\n | { kind: 'empty'; evidence?: AsrDecodingEvidence }\n | { kind: 'timeout' }\n | { kind: 'failure'; code: 'transcription_aborted' | 'transcription_failed' };\n\nexport interface TurnTranscriptionRequest {\n transcribe(signal: AbortSignal): Promise<TranscriptionAdapterOutput>;\n retryNormalized?(this: void, signal: AbortSignal): Promise<TranscriptionAdapterOutput>;\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\nfunction abortError(): Error {\n const error = new Error('Voice transcription was aborted.');\n error.name = 'AbortError';\n return error;\n}\n\nfunction normalizedOutput(output: TranscriptionAdapterOutput): { transcript: string; evidence?: AsrDecodingEvidence } {\n if (typeof output === 'string') return { transcript: output.trim() };\n const transcript = output.transcript.trim();\n return { transcript, ...(output.evidence ? { evidence: output.evidence } : {}) };\n}\nexport class TurnTranscriber {\n public constructor(private readonly clock: IClock) {}\n\n public async transcribe(request: TurnTranscriptionRequest): Promise<TurnTranscriptionOutcome> {\n const controller = new AbortController();\n let timedOut = false;\n let timeout: TimerHandle | undefined;\n const abortFromCaller = (): void => controller.abort();\n request.signal?.addEventListener('abort', abortFromCaller, { once: true });\n if (request.signal?.aborted) controller.abort();\n timeout = this.clock.setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, request.timeoutMs ?? DEFAULT_TRANSCRIPTION_TIMEOUT_MS);\n\n try {\n const first = normalizedOutput(\n await this.runBounded(() => request.transcribe(controller.signal), controller.signal),\n );\n if (first.transcript)\n return {\n kind: 'success',\n transcript: first.transcript,\n ...(first.evidence ? { evidence: first.evidence } : {}),\n };\n const retryNormalized = request.retryNormalized;\n if (!retryNormalized) return { kind: 'empty', ...(first.evidence ? { evidence: first.evidence } : {}) };\n const retried = normalizedOutput(\n await this.runBounded(() => retryNormalized(controller.signal), controller.signal),\n );\n if (retried.transcript)\n return {\n kind: 'success',\n transcript: retried.transcript,\n ...(retried.evidence ? { evidence: retried.evidence } : {}),\n };\n const evidence = retried.evidence ?? first.evidence;\n return { kind: 'empty', ...(evidence ? { evidence } : {}) };\n } catch {\n if (timedOut) return { kind: 'timeout' };\n if (controller.signal.aborted) return { kind: 'failure', code: 'transcription_aborted' };\n return { kind: 'failure', code: 'transcription_failed' };\n } finally {\n if (timeout) this.clock.clear(timeout);\n request.signal?.removeEventListener('abort', abortFromCaller);\n }\n }\n\n private runBounded<T>(operation: () => Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(abortError());\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(abortError());\n signal.addEventListener('abort', onAbort, { once: true });\n void Promise.resolve()\n .then(operation)\n .then(resolve, reject)\n .finally(() => signal.removeEventListener('abort', onAbort));\n });\n }\n}\n","import type { MessagePort } from 'node:worker_threads';\n\nimport type { IVoiceMediaHostConnection } from '../../types';\n\ntype CaptureHost = Pick<IVoiceMediaHostConnection, 'startCapture' | 'readCapture' | 'stopCapture' | 'abortCapture'>;\ntype MediaCall = { id: number; method: keyof CaptureHost; args: unknown[] };\n\n/** A dedicated worker port carries capture data, separate from the audio-free worker control protocol. */\nexport function serveVoiceWorkerMedia(port: MessagePort, host: IVoiceMediaHostConnection): () => void {\n const captures = new Set<string>();\n let closed = false;\n port.on('message', (call: MediaCall) => {\n if (closed || !Number.isSafeInteger(call?.id) || !Array.isArray(call.args)) return;\n const run = async (): Promise<unknown> => {\n const id = call.args[0];\n if (typeof id !== 'string') throw new Error('Invalid worker capture id.');\n if (call.method === 'startCapture') {\n captures.add(id);\n await host.startCapture(id, call.args[1] as Parameters<CaptureHost['startCapture']>[1]);\n if (closed) await host.abortCapture(id);\n return undefined;\n }\n if (!captures.has(id)) throw new Error('Worker does not own this capture.');\n if (call.method === 'readCapture') {\n const result = await host.readCapture(id);\n if (result.state === 'stopped') captures.delete(id);\n return result;\n }\n if (call.method === 'stopCapture') return host.stopCapture(id);\n if (call.method === 'abortCapture') {\n await host.abortCapture(id);\n captures.delete(id);\n return undefined;\n }\n throw new Error('Invalid worker media operation.');\n };\n void run().then(\n (value) => {\n if (!closed) port.postMessage({ id: call.id, value });\n },\n (error: unknown) => {\n if (!closed) port.postMessage({ id: call.id, error: error instanceof Error ? error.message : String(error) });\n },\n );\n });\n const close = (): void => {\n if (closed) return;\n closed = true;\n for (const id of captures) void host.abortCapture(id).catch(() => undefined);\n captures.clear();\n port.close();\n };\n port.once('close', close);\n return close;\n}\n\nexport function connectVoiceWorkerMedia(port: MessagePort): IVoiceMediaHostConnection {\n let sequence = 0;\n let closed = false;\n const pending = new Map<number, { resolve(value: unknown): void; reject(error: Error): void }>();\n port.on('message', (response: { id: number; value?: unknown; error?: string }) => {\n const request = pending.get(response.id);\n if (!request) return;\n pending.delete(response.id);\n if (response.error) request.reject(new Error(response.error));\n else request.resolve(response.value);\n });\n port.once('close', () => {\n closed = true;\n for (const request of pending.values()) request.reject(new Error('Worker media transport closed.'));\n pending.clear();\n });\n const call = <T>(method: keyof CaptureHost, ...args: unknown[]): Promise<T> =>\n new Promise((resolve, reject) => {\n if (closed) {\n reject(new Error('Worker media transport closed.'));\n return;\n }\n const id = ++sequence;\n pending.set(id, { resolve: (value) => resolve(value as T), reject });\n port.postMessage({ id, method, args });\n });\n const noPlayback = async (): Promise<never> => {\n throw new Error('Playback belongs to the session host.');\n };\n return {\n startCapture: (id, config) => call('startCapture', id, config),\n readCapture: async (id) => {\n const result = await call<Awaited<ReturnType<CaptureHost['readCapture']>>>('readCapture', id);\n return { ...result, pcm: Buffer.from(result.pcm) };\n },\n stopCapture: (id) => call('stopCapture', id),\n abortCapture: (id) => call('abortCapture', id),\n startPlayback: noPlayback,\n readPlayback: noPlayback,\n stopPlayback: noPlayback,\n abortPlayback: noPlayback,\n };\n}\n","import type { NarrationBargeInEvidence } from '../../models/narrationBargeIn';\nimport type { AsrDecodingEvidence } from '../../types';\nimport type { VoiceTranscriptSignalEvidence } from '../transcriptAdmission';\n\nexport const VOICE_WORKER_PROTOCOL_VERSION = 1 as const;\nexport const VOICE_WORKER_TRANSCRIPTION_TIMEOUT_CAPABILITY = 'transcription-timeout';\nexport const VOICE_WORKER_RANKED_BARGE_IN_CAPABILITY = 'ranked-barge-in';\nexport const VOICE_WORKER_INTENTIONAL_BARGE_IN_CAPABILITY = 'intentional-barge-in';\n\nexport type VoiceWorkerMode = 'manual' | 'autonomous';\nexport type VoiceWorkerEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';\n\nexport interface VoiceWorkerAdapterConfiguration {\n binary?: string;\n model: { path?: string; id?: string };\n}\n\nexport interface VoiceWorkerCaptureConfiguration {\n engine: VoiceWorkerEngine;\n language: string;\n recorder: { device: string; binary?: string };\n adapters: Partial<Record<Exclude<VoiceWorkerEngine, 'auto'>, VoiceWorkerAdapterConfiguration>>;\n}\nexport type VoiceCaptureState = 'starting' | 'listening' | 'speech' | 'processing' | 'draining' | 'idle';\nexport type VoiceFinalizeReason = 'explicit-stop' | 'soft-endpoint' | 'duration-limit' | 'auto-disabled';\nexport type VoiceCandidateOutcome = 'committed' | 'discarded' | 'retry';\n\ninterface VoiceWorkerEnvelope {\n version: typeof VOICE_WORKER_PROTOCOL_VERSION;\n sequence: number;\n}\n\nexport type VoiceWorkerCommand =\n | (VoiceWorkerEnvelope & {\n kind: 'initialize';\n spoolDirectory: string;\n activityHz: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'begin-capture';\n sessionId: string;\n captureId: string;\n mode: VoiceWorkerMode;\n turnId: string;\n config: VoiceWorkerCaptureConfiguration;\n maxDurationMs: number;\n utteranceIdleMs: number;\n transcriptionTimeoutMs?: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'finalize-capture';\n sessionId: string;\n captureId: string;\n reason: VoiceFinalizeReason;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'cancel-capture';\n sessionId: string;\n captureId: string;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'acknowledge-candidate';\n sessionId: string;\n turnId: string;\n revision: number;\n outcome: VoiceCandidateOutcome;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'playback-state';\n sessionId: string;\n playbackGeneration: number;\n active: boolean;\n referenceText?: string;\n startPhrases?: string[];\n stopPhrases?: string[];\n })\n | (VoiceWorkerEnvelope & {\n kind: 'confirm-barge-in';\n sessionId: string;\n captureId: string;\n turnId: string;\n playbackGeneration: number;\n outcome: 'promote' | 'discard';\n })\n | (VoiceWorkerEnvelope & {\n kind: 'shutdown';\n reason: 'session-shutdown' | 'extension-dispose';\n });\n\nexport type VoiceWorkerCommandPayload = VoiceWorkerCommand extends infer Command\n ? Command extends VoiceWorkerEnvelope\n ? Omit<Command, 'version' | 'sequence'>\n : never\n : never;\n\nexport type VoiceWorkerEvent =\n | (VoiceWorkerEnvelope & {\n kind: 'ready';\n capabilities: string[];\n })\n | (VoiceWorkerEnvelope & {\n kind: 'heartbeat';\n workerUptimeMs: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'activity';\n sessionId: string;\n captureId: string;\n state: VoiceCaptureState;\n elapsedMs: number;\n levelDbfs: number;\n speechProbability: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'capture-state';\n sessionId: string;\n captureId: string;\n state: VoiceCaptureState;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'endpoint-reached';\n sessionId: string;\n captureId: string;\n turnId: string;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'transcript-candidate';\n sessionId: string;\n captureId: string;\n turnId: string;\n revision: number;\n transcript: string;\n final: boolean;\n evidence?: VoiceTranscriptSignalEvidence;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'candidate-acknowledged';\n sessionId: string;\n captureId: string;\n turnId: string;\n revision: number;\n outcome: Exclude<VoiceCandidateOutcome, 'retry'>;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'barge-in-evidence';\n sessionId: string;\n captureId: string;\n turnId: string;\n playbackGeneration: number;\n evidence: NarrationBargeInEvidence;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'failure';\n code: string;\n recoverable: boolean;\n sessionId?: string;\n captureId?: string;\n turnId?: string;\n revision?: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'drained';\n sessionId: string;\n captureId: string;\n turnId?: string;\n revision?: number;\n })\n | (VoiceWorkerEnvelope & {\n kind: 'recovered';\n sessionId: string;\n turnId: string;\n revision: number;\n gapCount: number;\n });\n\nexport type VoiceWorkerEventPayload = VoiceWorkerEvent extends infer Event\n ? Event extends VoiceWorkerEnvelope\n ? Omit<Event, 'version' | 'sequence'>\n : never\n : never;\n\nconst RAW_AUDIO_KEYS = new Set(['audio', 'pcm', 'wav', 'buffer', 'arrayBuffer', 'rawAudio']);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction assertNoRawAudio(value: unknown, seen = new WeakSet<object>()): void {\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n throw new Error('Voice worker control messages must not contain binary audio data.');\n }\n if (typeof value !== 'object' || value === null) return;\n if (seen.has(value)) return;\n seen.add(value);\n if (Array.isArray(value)) {\n for (const item of value) assertNoRawAudio(item, seen);\n return;\n }\n for (const [key, item] of Object.entries(value)) {\n if (RAW_AUDIO_KEYS.has(key)) throw new Error(`Voice worker control messages must not contain ${key}.`);\n assertNoRawAudio(item, seen);\n }\n}\n\nfunction assertExactKeys(record: Record<string, unknown>, keys: readonly string[]): void {\n const allowed = new Set(keys);\n const unexpected = Object.keys(record).find((key) => !allowed.has(key));\n if (unexpected) throw new Error(`Unexpected voice worker message field: ${unexpected}.`);\n}\n\nfunction requireString(record: Record<string, unknown>, key: string): string {\n const value = record[key];\n if (typeof value !== 'string' || value.length === 0) throw new Error(`Voice worker field ${key} must be a string.`);\n return value;\n}\n\nfunction requireBoolean(record: Record<string, unknown>, key: string): boolean {\n const value = record[key];\n if (typeof value !== 'boolean') throw new Error(`Voice worker field ${key} must be a boolean.`);\n return value;\n}\n\nfunction requireNumber(record: Record<string, unknown>, key: string): number {\n const value = record[key];\n if (typeof value !== 'number' || !Number.isFinite(value))\n throw new Error(`Voice worker field ${key} must be a finite number.`);\n return value;\n}\n\nfunction requireBoundedNumber(record: Record<string, unknown>, key: string, minimum: number, maximum: number): number {\n const value = requireNumber(record, key);\n if (value < minimum || value > maximum) throw new Error(`Voice worker field ${key} is out of range.`);\n return value;\n}\n\nfunction requireNonNegativeInteger(record: Record<string, unknown>, key: string): number {\n const value = requireNumber(record, key);\n if (!Number.isSafeInteger(value) || value < 0)\n throw new Error(`Voice worker field ${key} must be a non-negative integer.`);\n return value;\n}\n\nfunction optionalString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n if (value === undefined) return undefined;\n return requireString(record, key);\n}\n\nfunction optionalInteger(record: Record<string, unknown>, key: string): number | undefined {\n const value = record[key];\n if (value === undefined) return undefined;\n return requireNonNegativeInteger(record, key);\n}\n\nfunction optionalStrings(record: Record<string, unknown>, key: string): string[] | undefined {\n const value = record[key];\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || item.length === 0))\n throw new Error(`Voice worker field ${key} must contain non-empty strings.`);\n return [...value];\n}\n\nfunction parseBargeInEvidence(value: unknown): NarrationBargeInEvidence {\n if (!isRecord(value)) throw new Error('Voice worker barge-in evidence must be an object.');\n assertExactKeys(value, [\n 'exactStopCommand',\n 'intentionalAddress',\n 'classifierConfirmed',\n 'classifierSpeechMs',\n 'residualTokenCount',\n 'residualRatio',\n 'voicedMs',\n 'peakDbAboveNoise',\n 'signalVariationDb',\n 'narrationSimilarity',\n ]);\n return {\n exactStopCommand: requireBoolean(value, 'exactStopCommand'),\n intentionalAddress: value.intentionalAddress === undefined ? false : requireBoolean(value, 'intentionalAddress'),\n ...(value.classifierConfirmed === undefined\n ? {}\n : { classifierConfirmed: requireBoolean(value, 'classifierConfirmed') }),\n ...(value.classifierSpeechMs === undefined\n ? {}\n : { classifierSpeechMs: requireNonNegativeInteger(value, 'classifierSpeechMs') }),\n residualTokenCount: requireNonNegativeInteger(value, 'residualTokenCount'),\n residualRatio: requireNumber(value, 'residualRatio'),\n voicedMs: requireNonNegativeInteger(value, 'voicedMs'),\n peakDbAboveNoise: requireNumber(value, 'peakDbAboveNoise'),\n signalVariationDb: requireNumber(value, 'signalVariationDb'),\n narrationSimilarity: requireNumber(value, 'narrationSimilarity'),\n };\n}\n\nfunction parseAsrEvidence(value: unknown): AsrDecodingEvidence {\n if (!isRecord(value)) throw new Error('Voice worker ASR evidence must be an object.');\n assertExactKeys(value, [\n 'noSpeechProbability',\n 'averageLogProbability',\n 'compressionRatio',\n 'segmentDurationMs',\n 'speechDurationMs',\n ]);\n return {\n ...(value.noSpeechProbability === undefined\n ? {}\n : { noSpeechProbability: requireBoundedNumber(value, 'noSpeechProbability', 0, 1) }),\n ...(value.averageLogProbability === undefined\n ? {}\n : { averageLogProbability: requireBoundedNumber(value, 'averageLogProbability', -20, 0) }),\n ...(value.compressionRatio === undefined\n ? {}\n : { compressionRatio: requireBoundedNumber(value, 'compressionRatio', 0, 100) }),\n ...(value.segmentDurationMs === undefined\n ? {}\n : { segmentDurationMs: requireBoundedNumber(value, 'segmentDurationMs', 0, 300_000) }),\n ...(value.speechDurationMs === undefined\n ? {}\n : { speechDurationMs: requireBoundedNumber(value, 'speechDurationMs', 0, 300_000) }),\n };\n}\n\nfunction parseTranscriptEvidence(value: unknown): VoiceTranscriptSignalEvidence {\n if (!isRecord(value)) throw new Error('Voice worker transcript evidence must be an object.');\n assertExactKeys(value, [\n 'durationMs',\n 'voicedMs',\n 'classifierSpeechMs',\n 'rmsDbfs',\n 'peakDbfs',\n 'signalVariationDb',\n 'nonZeroRatio',\n 'gapCount',\n 'playbackOverlapMs',\n 'classifier',\n 'asr',\n ]);\n return {\n durationMs: requireNumber(value, 'durationMs'),\n voicedMs: requireNumber(value, 'voicedMs'),\n classifierSpeechMs: requireNumber(value, 'classifierSpeechMs'),\n rmsDbfs: requireNumber(value, 'rmsDbfs'),\n peakDbfs: requireNumber(value, 'peakDbfs'),\n signalVariationDb: requireNumber(value, 'signalVariationDb'),\n nonZeroRatio: requireNumber(value, 'nonZeroRatio'),\n gapCount: requireNonNegativeInteger(value, 'gapCount'),\n playbackOverlapMs: requireNumber(value, 'playbackOverlapMs'),\n classifier: requireLiteral(value, 'classifier', ['client', 'host', 'energy']),\n ...(value.asr === undefined ? {} : { asr: parseAsrEvidence(value.asr) }),\n };\n}\n\nfunction requireLiteral<T extends string>(record: Record<string, unknown>, key: string, values: readonly T[]): T {\n const value = requireString(record, key);\n if (!values.includes(value as T)) throw new Error(`Voice worker field ${key} has an unsupported value.`);\n return value as T;\n}\n\nfunction parseAdapterConfiguration(value: unknown): VoiceWorkerAdapterConfiguration {\n if (!isRecord(value)) throw new Error('Voice worker adapter configuration must be an object.');\n assertExactKeys(value, ['binary', 'model']);\n if (!isRecord(value.model)) throw new Error('Voice worker adapter model must be an object.');\n assertExactKeys(value.model, ['path', 'id']);\n const binary = optionalString(value, 'binary');\n const modelPath = optionalString(value.model, 'path');\n const modelId = optionalString(value.model, 'id');\n if (!modelPath && !modelId) throw new Error('Voice worker adapter model requires a path or id.');\n return {\n ...(binary ? { binary } : {}),\n model: { ...(modelPath ? { path: modelPath } : {}), ...(modelId ? { id: modelId } : {}) },\n };\n}\n\nfunction parseCaptureConfiguration(value: unknown): VoiceWorkerCaptureConfiguration {\n if (!isRecord(value)) throw new Error('Voice worker capture configuration must be an object.');\n assertExactKeys(value, ['engine', 'language', 'recorder', 'adapters']);\n if (!isRecord(value.recorder)) throw new Error('Voice worker recorder configuration must be an object.');\n assertExactKeys(value.recorder, ['device', 'binary']);\n if (!isRecord(value.adapters)) throw new Error('Voice worker adapters configuration must be an object.');\n assertExactKeys(value.adapters, ['whisper-cpp', 'openai-whisper', 'mlx-whisper']);\n const recorderBinary = optionalString(value.recorder, 'binary');\n const adapters: VoiceWorkerCaptureConfiguration['adapters'] = {};\n for (const engine of ['whisper-cpp', 'openai-whisper', 'mlx-whisper'] as const) {\n const adapter = value.adapters[engine];\n if (adapter !== undefined) adapters[engine] = parseAdapterConfiguration(adapter);\n }\n return {\n engine: requireLiteral(value, 'engine', ['auto', 'whisper-cpp', 'openai-whisper', 'mlx-whisper']),\n language: requireString(value, 'language'),\n recorder: {\n device: requireString(value.recorder, 'device'),\n ...(recorderBinary ? { binary: recorderBinary } : {}),\n },\n adapters,\n };\n}\n\nfunction parseEnvelope(value: unknown): Record<string, unknown> {\n assertNoRawAudio(value);\n if (!isRecord(value)) throw new Error('Voice worker message must be an object.');\n if (value.version !== VOICE_WORKER_PROTOCOL_VERSION)\n throw new Error(`Unsupported voice worker protocol version: ${String(value.version)}.`);\n requireNonNegativeInteger(value, 'sequence');\n requireString(value, 'kind');\n return value;\n}\n\nexport function parseVoiceWorkerCommand(value: unknown): VoiceWorkerCommand {\n const record = parseEnvelope(value);\n const envelope = {\n version: VOICE_WORKER_PROTOCOL_VERSION,\n sequence: requireNonNegativeInteger(record, 'sequence'),\n } as const;\n switch (record.kind) {\n case 'initialize':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'spoolDirectory', 'activityHz']);\n return {\n ...envelope,\n kind: 'initialize',\n spoolDirectory: requireString(record, 'spoolDirectory'),\n activityHz: requireNumber(record, 'activityHz'),\n };\n case 'begin-capture':\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'mode',\n 'turnId',\n 'config',\n 'maxDurationMs',\n 'utteranceIdleMs',\n 'transcriptionTimeoutMs',\n ]);\n return {\n ...envelope,\n kind: 'begin-capture',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n mode: requireLiteral(record, 'mode', ['manual', 'autonomous']),\n turnId: requireString(record, 'turnId'),\n config: parseCaptureConfiguration(record.config),\n maxDurationMs: requireNonNegativeInteger(record, 'maxDurationMs'),\n utteranceIdleMs: requireNonNegativeInteger(record, 'utteranceIdleMs'),\n ...(record.transcriptionTimeoutMs === undefined\n ? {}\n : { transcriptionTimeoutMs: requireNonNegativeInteger(record, 'transcriptionTimeoutMs') }),\n };\n case 'finalize-capture':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'captureId', 'reason']);\n return {\n ...envelope,\n kind: 'finalize-capture',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n reason: requireLiteral(record, 'reason', ['explicit-stop', 'soft-endpoint', 'duration-limit', 'auto-disabled']),\n };\n case 'cancel-capture':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'captureId']);\n return {\n ...envelope,\n kind: 'cancel-capture',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n };\n case 'acknowledge-candidate':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'turnId', 'revision', 'outcome']);\n return {\n ...envelope,\n kind: 'acknowledge-candidate',\n sessionId: requireString(record, 'sessionId'),\n turnId: requireString(record, 'turnId'),\n revision: requireNonNegativeInteger(record, 'revision'),\n outcome: requireLiteral(record, 'outcome', ['committed', 'discarded', 'retry']),\n };\n case 'playback-state': {\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'playbackGeneration',\n 'active',\n 'referenceText',\n 'startPhrases',\n 'stopPhrases',\n ]);\n const referenceText = optionalString(record, 'referenceText');\n const startPhrases = optionalStrings(record, 'startPhrases');\n const stopPhrases = optionalStrings(record, 'stopPhrases');\n return {\n ...envelope,\n kind: 'playback-state',\n sessionId: requireString(record, 'sessionId'),\n playbackGeneration: requireNonNegativeInteger(record, 'playbackGeneration'),\n active: requireBoolean(record, 'active'),\n ...(referenceText ? { referenceText } : {}),\n ...(startPhrases ? { startPhrases } : {}),\n ...(stopPhrases ? { stopPhrases } : {}),\n };\n }\n case 'confirm-barge-in':\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'turnId',\n 'playbackGeneration',\n 'outcome',\n ]);\n return {\n ...envelope,\n kind: 'confirm-barge-in',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n turnId: requireString(record, 'turnId'),\n playbackGeneration: requireNonNegativeInteger(record, 'playbackGeneration'),\n outcome: requireLiteral(record, 'outcome', ['promote', 'discard']),\n };\n case 'shutdown':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'reason']);\n return {\n ...envelope,\n kind: 'shutdown',\n reason: requireLiteral(record, 'reason', ['session-shutdown', 'extension-dispose']),\n };\n default:\n throw new Error(`Unsupported voice worker command: ${String(record.kind)}.`);\n }\n}\n\nexport function parseVoiceWorkerEvent(value: unknown): VoiceWorkerEvent {\n const record = parseEnvelope(value);\n const envelope = {\n version: VOICE_WORKER_PROTOCOL_VERSION,\n sequence: requireNonNegativeInteger(record, 'sequence'),\n } as const;\n switch (record.kind) {\n case 'ready': {\n assertExactKeys(record, ['version', 'sequence', 'kind', 'capabilities']);\n const capabilities = record.capabilities;\n if (!Array.isArray(capabilities) || capabilities.some((item) => typeof item !== 'string'))\n throw new Error('Voice worker capabilities must be strings.');\n return { ...envelope, kind: 'ready', capabilities: [...capabilities] };\n }\n case 'heartbeat':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'workerUptimeMs']);\n return { ...envelope, kind: 'heartbeat', workerUptimeMs: requireNonNegativeInteger(record, 'workerUptimeMs') };\n case 'activity':\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'state',\n 'elapsedMs',\n 'levelDbfs',\n 'speechProbability',\n ]);\n return {\n ...envelope,\n kind: 'activity',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n state: requireLiteral(record, 'state', ['starting', 'listening', 'speech', 'processing', 'draining', 'idle']),\n elapsedMs: requireNonNegativeInteger(record, 'elapsedMs'),\n levelDbfs: requireNumber(record, 'levelDbfs'),\n speechProbability: requireNumber(record, 'speechProbability'),\n };\n case 'capture-state':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'captureId', 'state']);\n return {\n ...envelope,\n kind: 'capture-state',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n state: requireLiteral(record, 'state', ['starting', 'listening', 'speech', 'processing', 'draining', 'idle']),\n };\n case 'endpoint-reached':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'captureId', 'turnId']);\n return {\n ...envelope,\n kind: 'endpoint-reached',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n turnId: requireString(record, 'turnId'),\n };\n case 'transcript-candidate': {\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'turnId',\n 'revision',\n 'transcript',\n 'final',\n 'evidence',\n ]);\n return {\n ...envelope,\n kind: 'transcript-candidate',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n turnId: requireString(record, 'turnId'),\n revision: requireNonNegativeInteger(record, 'revision'),\n transcript: requireString(record, 'transcript'),\n final: requireBoolean(record, 'final'),\n ...(record.evidence === undefined ? {} : { evidence: parseTranscriptEvidence(record.evidence) }),\n };\n }\n case 'candidate-acknowledged':\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'turnId',\n 'revision',\n 'outcome',\n ]);\n return {\n ...envelope,\n kind: 'candidate-acknowledged',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n turnId: requireString(record, 'turnId'),\n revision: requireNonNegativeInteger(record, 'revision'),\n outcome: requireLiteral(record, 'outcome', ['committed', 'discarded']),\n };\n case 'barge-in-evidence':\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'sessionId',\n 'captureId',\n 'turnId',\n 'playbackGeneration',\n 'evidence',\n ]);\n return {\n ...envelope,\n kind: 'barge-in-evidence',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n turnId: requireString(record, 'turnId'),\n playbackGeneration: requireNonNegativeInteger(record, 'playbackGeneration'),\n evidence: parseBargeInEvidence(record.evidence),\n };\n case 'failure': {\n assertExactKeys(record, [\n 'version',\n 'sequence',\n 'kind',\n 'code',\n 'recoverable',\n 'sessionId',\n 'captureId',\n 'turnId',\n 'revision',\n ]);\n const sessionId = optionalString(record, 'sessionId');\n const captureId = optionalString(record, 'captureId');\n const turnId = optionalString(record, 'turnId');\n const revision = optionalInteger(record, 'revision');\n return {\n ...envelope,\n kind: 'failure',\n code: requireString(record, 'code'),\n recoverable: requireBoolean(record, 'recoverable'),\n ...(sessionId ? { sessionId } : {}),\n ...(captureId ? { captureId } : {}),\n ...(turnId ? { turnId } : {}),\n ...(revision === undefined ? {} : { revision }),\n };\n }\n case 'drained': {\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'captureId', 'turnId', 'revision']);\n const turnId = optionalString(record, 'turnId');\n const revision = optionalInteger(record, 'revision');\n return {\n ...envelope,\n kind: 'drained',\n sessionId: requireString(record, 'sessionId'),\n captureId: requireString(record, 'captureId'),\n ...(turnId ? { turnId } : {}),\n ...(revision === undefined ? {} : { revision }),\n };\n }\n case 'recovered':\n assertExactKeys(record, ['version', 'sequence', 'kind', 'sessionId', 'turnId', 'revision', 'gapCount']);\n return {\n ...envelope,\n kind: 'recovered',\n sessionId: requireString(record, 'sessionId'),\n turnId: requireString(record, 'turnId'),\n revision: requireNonNegativeInteger(record, 'revision'),\n gapCount: requireNonNegativeInteger(record, 'gapCount'),\n };\n default:\n throw new Error(`Unsupported voice worker event: ${String(record.kind)}.`);\n }\n}\n"],"mappings":"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"}