@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.
- package/LICENSE +21 -0
- package/NOTICE +13 -0
- package/README.md +249 -0
- package/dist/apiContracts.cjs +809 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +805 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/assets/browserCaptureWorklet-Droj0fW0.js +13 -0
- package/dist/assets/silero_vad_v6.2.1-SjbCxFXk.onnx +0 -0
- package/dist/clientCaptureActivity-DN4xQtmw.d.mts +234 -0
- package/dist/clientCaptureActivity-DN4xQtmw.d.mts.map +1 -0
- package/dist/clientMedia-CfTfc9_4.mjs +49 -0
- package/dist/clientMedia-CfTfc9_4.mjs.map +1 -0
- package/dist/clientMedia-DuA4aYhD.cjs +156 -0
- package/dist/clientMedia-DuA4aYhD.cjs.map +1 -0
- package/dist/clientMedia.cjs +134 -0
- package/dist/clientMedia.cjs.map +1 -0
- package/dist/clientMedia.d.mts +2 -0
- package/dist/clientMedia.mjs +114 -0
- package/dist/clientMedia.mjs.map +1 -0
- package/dist/extensions/server.cjs +8975 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +8968 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +4530 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index-C95HCjmT.d.mts +212 -0
- package/dist/index-C95HCjmT.d.mts.map +1 -0
- package/dist/index.cjs +637 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +603 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +557 -0
- package/dist/index.mjs.map +1 -0
- package/dist/narrationBargeIn-C_Po8fgw.mjs +62 -0
- package/dist/narrationBargeIn-C_Po8fgw.mjs.map +1 -0
- package/dist/narrationBargeIn-Dje82XOm.cjs +73 -0
- package/dist/narrationBargeIn-Dje82XOm.cjs.map +1 -0
- package/dist/sileroVadWorker-D894njUe.mjs +110 -0
- package/dist/sileroVadWorker-D894njUe.mjs.map +1 -0
- package/dist/vad-DDe4RIdW.mjs +315 -0
- package/dist/vad-DDe4RIdW.mjs.map +1 -0
- package/dist/vad-n2RlruzB.cjs +332 -0
- package/dist/vad-n2RlruzB.cjs.map +1 -0
- package/dist/voiceReloadHandoff.cjs +9 -0
- package/dist/voiceReloadHandoff.d.mts +1 -0
- package/dist/voiceReloadHandoff.mjs +2 -0
- package/dist/voiceTools-CRQHK_Uc.cjs +616 -0
- package/dist/voiceTools-CRQHK_Uc.cjs.map +1 -0
- package/dist/voiceTools-aCCREMjS.mjs +611 -0
- package/dist/voiceTools-aCCREMjS.mjs.map +1 -0
- package/dist/voiceTools.cjs +12 -0
- package/dist/voiceTools.d.mts +7 -0
- package/dist/voiceTools.d.mts.map +1 -0
- package/dist/voiceTools.mjs +3 -0
- package/dist/voiceWorker.cjs +1929 -0
- package/dist/voiceWorker.cjs.map +1 -0
- package/dist/voiceWorker.d.mts +200 -0
- package/dist/voiceWorker.d.mts.map +1 -0
- package/dist/voiceWorker.mjs +1925 -0
- package/dist/voiceWorker.mjs.map +1 -0
- package/dist/voiceWorkerProtocol-0H3czPjt.cjs +2385 -0
- package/dist/voiceWorkerProtocol-0H3czPjt.cjs.map +1 -0
- package/dist/voiceWorkerProtocol-B_4B2_fR.mjs +2085 -0
- package/dist/voiceWorkerProtocol-B_4B2_fR.mjs.map +1 -0
- package/dist/voiceWorkerSessionController-DaYemiL3.cjs +1800 -0
- package/dist/voiceWorkerSessionController-DaYemiL3.cjs.map +1 -0
- package/dist/voiceWorkerSessionController-GB3SJ6YE.mjs +1734 -0
- package/dist/voiceWorkerSessionController-GB3SJ6YE.mjs.map +1 -0
- package/licenses/Codex-Apache-2.0.txt +201 -0
- package/llms.txt +9 -0
- package/package.json +153 -0
- package/src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/models/README.md +11 -0
- package/src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/models/SILERO-LICENSE +21 -0
- package/src/prompts/po-use-voice/SKILL.md +35 -0
- package/src/types/clientCaptureActivity.ts +155 -0
- package/src/types/clientMedia.ts +226 -0
- package/src/types/manualTranscription.ts +53 -0
- package/src/types/realtime.ts +107 -0
- package/src/types/voiceOwnership.ts +315 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceWorker.mjs","names":[],"sources":["../src/services/autonomousEndpoint/index.ts","../src/services/captureSession/index.ts","../src/services/fileTurnSpool/index.ts","../src/services/narrationBargeIn/index.ts","../src/services/playbackGate/index.ts","../src/services/silero/index.ts","../src/services/transcriptionCoordinator/index.ts","../src/services/voiceWorkerPipeline/index.ts","../src/services/voiceWorker/index.ts"],"sourcesContent":["import type { IClock, TimerHandle } from '../../types';\nimport { DEFAULT_VAD_CONFIGURATION } from '../vad';\n\nconst ENDPOINT_TRANSITION_SCORE = 8;\n\nexport interface EndpointBoundaryEvidence {\n segmentClosed: boolean;\n forcedClose: boolean;\n trailingSilenceMs: number;\n}\n\ninterface WeightedEndpointGuard {\n matched: boolean;\n weight: number;\n}\n\nfunction endpointGuardScore(guards: readonly WeightedEndpointGuard[]): number {\n return guards.reduce((score, guard) => score + (guard.matched ? guard.weight : 0), 0);\n}\n\nexport class AutonomousEndpoint {\n private timer: TimerHandle | undefined;\n private currentGeneration = 0;\n\n public constructor(\n private readonly clock: IClock,\n private readonly onEndpoint: (speechGeneration: number) => void,\n ) {}\n\n public get speechGeneration(): number {\n return this.currentGeneration;\n }\n\n public speechStarted(): number {\n this.currentGeneration += 1;\n this.cancelTimer();\n return this.currentGeneration;\n }\n\n public speechEnded(utteranceIdleMs: number, evidence: EndpointBoundaryEvidence): void {\n this.cancelTimer();\n const transitionScore = endpointGuardScore([\n { matched: this.currentGeneration > 0, weight: 3 },\n { matched: evidence.segmentClosed, weight: 3 },\n { matched: evidence.trailingSilenceMs >= DEFAULT_VAD_CONFIGURATION.trailingSilenceMs, weight: 2 },\n { matched: evidence.forcedClose, weight: 2 },\n ]);\n if (transitionScore < ENDPOINT_TRANSITION_SCORE) return;\n const generation = this.currentGeneration;\n const observedSilenceMs = Math.min(utteranceIdleMs, Math.max(0, evidence.trailingSilenceMs));\n const delayMs = Math.max(0, utteranceIdleMs - observedSilenceMs);\n this.timer = this.clock.setTimeout(() => {\n this.timer = undefined;\n if (generation === this.currentGeneration) this.onEndpoint(generation);\n }, delayMs);\n }\n\n public invalidate(): number {\n this.currentGeneration += 1;\n this.cancelTimer();\n return this.currentGeneration;\n }\n\n public cancel(): void {\n this.cancelTimer();\n }\n\n private cancelTimer(): void {\n if (!this.timer) return;\n this.clock.clear(this.timer);\n this.timer = undefined;\n }\n}\n","import type { ResolvedVoiceConfig } from '@agimon-ai/po-config';\n\nimport type { IClock, IPcmAudioRecorder, LiveRecordingHandle, TimerHandle } from '../../types';\nimport type { VoiceMediaCaptureActivity, VoiceMediaCaptureConfiguration } from '../../types/clientMedia';\nimport type { ITurnSpool, TurnSnapshot } from '../../types/turnSpool';\nimport { PCM_BYTES_PER_SAMPLE } from '../pcm';\n\nconst DEFAULT_FIRST_FRAME_TIMEOUT_MS = 8_000;\nconst DEFAULT_LIVENESS_CHECK_MS = 1_000;\nconst DEFAULT_STALE_FRAME_MS = 4_000;\nconst DEFAULT_MAX_RECOVERY_ATTEMPTS = 3;\n\nexport type CaptureSessionState = 'idle' | 'starting' | 'capturing' | 'recovering' | 'draining' | 'closed';\n\nexport interface CaptureSessionOptions {\n recorder: IPcmAudioRecorder;\n config: ResolvedVoiceConfig;\n spool: ITurnSpool;\n clock: IClock;\n firstFrameTimeoutMs?: number;\n livenessCheckMs?: number;\n staleFrameMs?: number;\n maxRecoveryAttempts?: number;\n onFrame?: (frame: Buffer, captureGeneration: number) => void;\n capture?: VoiceMediaCaptureConfiguration;\n onClientActivity?: (activity: VoiceMediaCaptureActivity, captureGeneration: number) => void;\n shouldPersistPcm?(captureGeneration: number): boolean;\n onGap?: (gapCount: number) => void;\n onRecoveryExhausted?: (error: Error, captureGeneration: number) => void;\n onStateChange?: (state: CaptureSessionState) => void;\n}\n\ninterface Readiness {\n promise: Promise<void>;\n resolve(): void;\n reject(error: Error): void;\n}\n\nfunction readiness(): Readiness {\n let resolve!: () => void;\n let reject!: (error: Error) => void;\n const promise = new Promise<void>((ready, failed) => {\n resolve = ready;\n reject = failed;\n });\n return { promise, resolve, reject };\n}\n\nfunction processError(result: { code: number; stderr: string }): Error {\n return new Error(result.stderr || `Voice recorder exited with code ${result.code}.`);\n}\n\nexport class CaptureSession {\n private readonly options: CaptureSessionOptions;\n private handle: LiveRecordingHandle | undefined;\n private livenessTimer: TimerHandle | undefined;\n private startupTimer: TimerHandle | undefined;\n private recovery: Promise<void> | undefined;\n private startupReadiness: Readiness | undefined;\n private terminalOperation:\n | { kind: 'drain'; promise: Promise<TurnSnapshot | undefined> }\n | { kind: 'abort'; promise: Promise<TurnSnapshot | undefined> }\n | undefined;\n private captureGeneration = 0;\n private recoveryAttempts = 0;\n private lastFrameAt = 0;\n private accepting = false;\n private stopping = false;\n private recoveryExhaustionReported = false;\n private currentState: CaptureSessionState = 'idle';\n\n public constructor(options: CaptureSessionOptions) {\n this.options = options;\n this.captureGeneration = options.spool.snapshotManifest().captureGeneration;\n }\n\n public get state(): CaptureSessionState {\n return this.currentState;\n }\n\n public async start(): Promise<void> {\n if (this.currentState !== 'idle') throw new Error('Voice capture session has already started.');\n this.accepting = true;\n this.stopping = false;\n await this.launchWithRecovery();\n }\n\n public async drain(): Promise<TurnSnapshot> {\n const terminal = this.terminalOperation;\n if (terminal) {\n if (terminal.kind !== 'drain') {\n await terminal.promise;\n throw new Error('Voice capture session was aborted.');\n }\n const snapshot = await terminal.promise;\n if (!snapshot) throw new Error('Voice capture drain did not produce a snapshot.');\n return snapshot;\n }\n if (this.currentState !== 'capturing' && this.currentState !== 'recovering')\n throw new Error('Voice capture session is not active.');\n const promise = this.performDrain();\n this.terminalOperation = { kind: 'drain', promise };\n const snapshot = await promise;\n if (!snapshot) throw new Error('Voice capture drain did not produce a snapshot.');\n return snapshot;\n }\n\n public async abort(): Promise<void> {\n const terminal = this.terminalOperation;\n if (terminal) {\n await terminal.promise;\n return;\n }\n if (this.currentState === 'closed') return;\n const promise = this.performAbort();\n this.terminalOperation = { kind: 'abort', promise };\n await promise;\n }\n\n private async performDrain(): Promise<TurnSnapshot> {\n this.stopping = true;\n this.setState('draining');\n this.clearStartup();\n this.clearLiveness();\n await this.recovery?.catch(() => undefined);\n const handle = this.handle;\n this.handle = undefined;\n const remainder = handle ? await handle.stop() : Buffer.alloc(0);\n const discardedBytes = this.appendCompleteSamples(remainder, this.captureGeneration);\n this.accepting = false;\n this.setState('closed');\n if (discardedBytes > 0) throw new Error('Voice recorder returned an incomplete trailing PCM sample.');\n return this.options.spool.createSnapshot();\n }\n\n private async performAbort(): Promise<undefined> {\n this.stopping = true;\n this.accepting = false;\n this.clearStartup();\n this.clearLiveness();\n this.startupReadiness?.reject(new Error('Voice capture startup was aborted.'));\n await this.recovery?.catch(() => undefined);\n const handle = this.handle;\n this.handle = undefined;\n if (handle) await handle.abort();\n this.options.spool.close();\n this.setState('closed');\n return undefined;\n }\n\n private async launchWithRecovery(): Promise<void> {\n let lastError: Error | undefined;\n while (\n !this.stopping &&\n this.recoveryAttempts <= (this.options.maxRecoveryAttempts ?? DEFAULT_MAX_RECOVERY_ATTEMPTS)\n ) {\n try {\n await this.launchRecorder();\n this.recoveryAttempts = 0;\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n const failedHandle = this.handle;\n this.handle = undefined;\n if (failedHandle) {\n const remainder = await failedHandle.abort().catch(() => undefined);\n this.appendCompleteSamples(remainder ?? Buffer.alloc(0), this.captureGeneration);\n }\n if (this.stopping) break;\n this.recordGap();\n this.recoveryAttempts += 1;\n this.setState('recovering');\n }\n }\n this.accepting = false;\n this.setState('closed');\n throw lastError ?? new Error('Voice recorder recovery was exhausted.');\n }\n\n private async launchRecorder(): Promise<void> {\n this.setState('starting');\n const generation = this.captureGeneration + 1;\n this.captureGeneration = generation;\n this.options.spool.setCaptureGeneration(generation);\n const ready = readiness();\n this.startupReadiness = ready;\n let sawFirstFrame = false;\n const handle = this.options.recorder.start(\n this.options.config,\n (frame) => {\n if (!this.accepting || generation !== this.captureGeneration) return;\n if (this.options.shouldPersistPcm?.(generation) !== false) this.options.spool.append(frame);\n this.lastFrameAt = this.options.clock.now();\n this.options.onFrame?.(frame, generation);\n if (!sawFirstFrame) {\n sawFirstFrame = true;\n ready.resolve();\n }\n },\n {\n capture: this.options.capture ?? { mode: 'manual', activityControl: 'host' },\n onClientActivity: (activity) => {\n if (this.accepting && generation === this.captureGeneration)\n this.options.onClientActivity?.(activity, generation);\n },\n },\n );\n this.handle = handle;\n this.startupTimer = this.options.clock.setTimeout(() => {\n if (!sawFirstFrame && generation === this.captureGeneration)\n ready.reject(new Error('Voice recorder did not produce its first PCM frame in time.'));\n }, this.options.firstFrameTimeoutMs ?? DEFAULT_FIRST_FRAME_TIMEOUT_MS);\n\n void handle.completion.then(\n (result) => {\n if (this.stopping || generation !== this.captureGeneration) return;\n if (!sawFirstFrame) {\n ready.reject(processError(result));\n return;\n }\n void this.recover(processError(result));\n },\n (error: unknown) => {\n if (this.stopping || generation !== this.captureGeneration) return;\n const recorderError = error instanceof Error ? error : new Error(String(error));\n if (!sawFirstFrame) ready.reject(recorderError);\n else void this.recover(recorderError);\n },\n );\n\n try {\n await ready.promise;\n } finally {\n if (this.startupReadiness === ready) this.startupReadiness = undefined;\n this.clearStartup();\n }\n if (this.stopping || generation !== this.captureGeneration) return;\n this.setState('capturing');\n this.startLiveness(generation);\n }\n\n private recover(_error: Error): Promise<void> {\n if (this.stopping) return Promise.resolve();\n this.recovery ??= this.performRecovery()\n .catch((error: unknown) => {\n if (this.stopping || this.recoveryExhaustionReported) return;\n this.recoveryExhaustionReported = true;\n const failure = error instanceof Error ? error : new Error(String(error));\n this.options.onRecoveryExhausted?.(failure, this.captureGeneration);\n })\n .finally(() => {\n this.recovery = undefined;\n });\n return this.recovery;\n }\n\n private async performRecovery(): Promise<void> {\n this.clearLiveness();\n this.setState('recovering');\n const failedHandle = this.handle;\n this.handle = undefined;\n if (failedHandle) {\n const remainder = await failedHandle.abort().catch(() => undefined);\n this.appendCompleteSamples(remainder ?? Buffer.alloc(0), this.captureGeneration);\n }\n if (this.stopping) return;\n this.recordGap();\n this.recoveryAttempts += 1;\n await this.launchWithRecovery();\n }\n\n private appendCompleteSamples(pcm: Buffer, captureGeneration: number): number {\n const completeBytes = pcm.length - (pcm.length % PCM_BYTES_PER_SAMPLE);\n if (completeBytes > 0 && this.options.shouldPersistPcm?.(captureGeneration) !== false)\n this.options.spool.append(pcm.subarray(0, completeBytes));\n return pcm.length - completeBytes;\n }\n\n private recordGap(): void {\n this.options.spool.recordGap();\n this.options.onGap?.(this.options.spool.snapshotManifest().gapCount);\n }\n\n private startLiveness(generation: number): void {\n this.clearLiveness();\n this.lastFrameAt = this.options.clock.now();\n this.livenessTimer = this.options.clock.setInterval(() => {\n if (this.stopping || generation !== this.captureGeneration) return;\n const staleMs = this.options.staleFrameMs ?? DEFAULT_STALE_FRAME_MS;\n if (this.options.clock.now() - this.lastFrameAt > staleMs)\n void this.recover(new Error('Voice recorder stopped producing PCM frames.'));\n }, this.options.livenessCheckMs ?? DEFAULT_LIVENESS_CHECK_MS);\n }\n\n private clearStartup(): void {\n if (!this.startupTimer) return;\n this.options.clock.clear(this.startupTimer);\n this.startupTimer = undefined;\n }\n\n private clearLiveness(): void {\n if (!this.livenessTimer) return;\n this.options.clock.clear(this.livenessTimer);\n this.livenessTimer = undefined;\n }\n\n private setState(state: CaptureSessionState): void {\n if (this.currentState === state) return;\n this.currentState = state;\n this.options.onStateChange?.(state);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { ITurnSpool, TurnSnapshot, TurnSpoolIdentity, TurnSpoolManifest } from '../../types/turnSpool';\nimport { encodePcm16Wav, PCM_BYTES_PER_SAMPLE } from '../pcm';\n\nconst MANIFEST_VERSION = 1 as const;\nconst MANIFEST_FILE = 'manifest.json';\nconst PCM_FILE = 'turn.pcm';\nconst SNAPSHOT_DIRECTORY = 'snapshots';\n\nfunction assertIdentifier(value: string, label: string): void {\n if (!/^[A-Za-z0-9._-]{1,128}$/u.test(value)) throw new Error(`Invalid voice spool ${label}.`);\n}\n\nfunction nonNegativeInteger(value: unknown, label: string): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)\n throw new Error(`Voice spool manifest ${label} must be a non-negative integer.`);\n return value;\n}\n\nfunction parseManifest(value: unknown): TurnSpoolManifest {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n throw new Error('Voice spool manifest must be an object.');\n const record = value as Record<string, unknown>;\n if (record.version !== MANIFEST_VERSION) throw new Error('Unsupported voice spool manifest version.');\n for (const key of ['sessionId', 'captureId', 'turnId'] as const) {\n if (typeof record[key] !== 'string') throw new Error(`Voice spool manifest ${key} must be a string.`);\n assertIdentifier(record[key], key);\n }\n const committedBytes = nonNegativeInteger(record.committedBytes, 'committedBytes');\n if (committedBytes % PCM_BYTES_PER_SAMPLE !== 0)\n throw new Error('Voice spool committed length must contain complete samples.');\n const utteranceStartByte =\n record.utteranceStartByte === undefined\n ? undefined\n : nonNegativeInteger(record.utteranceStartByte, 'utteranceStartByte');\n if (utteranceStartByte !== undefined) {\n if (utteranceStartByte % PCM_BYTES_PER_SAMPLE !== 0)\n throw new Error('Voice spool utterance start must contain complete samples.');\n if (utteranceStartByte > committedBytes) throw new Error('Voice spool utterance start exceeds committed length.');\n }\n const captureGeneration = nonNegativeInteger(record.captureGeneration, 'captureGeneration');\n const revision = nonNegativeInteger(record.revision, 'revision');\n const gapCount = nonNegativeInteger(record.gapCount, 'gapCount');\n const acknowledgedRevision = record.acknowledgedRevision;\n if (\n acknowledgedRevision !== undefined &&\n nonNegativeInteger(acknowledgedRevision, 'acknowledgedRevision') !== revision\n )\n throw new Error('Voice spool acknowledged revision must match the frozen revision.');\n const acknowledgedOutcome = record.acknowledgedOutcome;\n if (acknowledgedOutcome !== undefined && acknowledgedOutcome !== 'committed' && acknowledgedOutcome !== 'discarded')\n throw new Error('Voice spool acknowledged outcome is invalid.');\n if ((acknowledgedRevision === undefined) !== (acknowledgedOutcome === undefined))\n throw new Error('Voice spool acknowledgement state is incomplete.');\n return {\n version: MANIFEST_VERSION,\n sessionId: record.sessionId as string,\n captureId: record.captureId as string,\n turnId: record.turnId as string,\n committedBytes,\n ...(utteranceStartByte === undefined ? {} : { utteranceStartByte }),\n captureGeneration,\n revision,\n gapCount,\n ...(acknowledgedRevision === undefined ? {} : { acknowledgedRevision: acknowledgedRevision as number }),\n ...(acknowledgedOutcome === undefined ? {} : { acknowledgedOutcome }),\n };\n}\n\nfunction writePrivateFile(filePath: string, contents: string | Buffer): void {\n fs.writeFileSync(filePath, contents, { mode: 0o600 });\n fs.chmodSync(filePath, 0o600);\n}\n\nexport class NodeTurnSpool implements ITurnSpool {\n public readonly directory: string;\n private readonly pcmPath: string;\n private readonly manifestPath: string;\n private manifest: TurnSpoolManifest;\n private closed = false;\n\n private constructor(directory: string, manifest: TurnSpoolManifest) {\n this.directory = directory;\n this.pcmPath = path.join(directory, PCM_FILE);\n this.manifestPath = path.join(directory, MANIFEST_FILE);\n this.manifest = manifest;\n }\n\n public static create(rootDirectory: string, identity: TurnSpoolIdentity): NodeTurnSpool {\n assertIdentifier(identity.sessionId, 'sessionId');\n assertIdentifier(identity.captureId, 'captureId');\n assertIdentifier(identity.turnId, 'turnId');\n fs.mkdirSync(rootDirectory, { recursive: true, mode: 0o700 });\n fs.chmodSync(rootDirectory, 0o700);\n const directory = fs.mkdtempSync(path.join(rootDirectory, 'turn-'));\n fs.chmodSync(directory, 0o700);\n fs.mkdirSync(path.join(directory, SNAPSHOT_DIRECTORY), { mode: 0o700 });\n writePrivateFile(path.join(directory, PCM_FILE), Buffer.alloc(0));\n const spool = new NodeTurnSpool(directory, {\n version: MANIFEST_VERSION,\n ...identity,\n committedBytes: 0,\n captureGeneration: 0,\n revision: 0,\n gapCount: 0,\n });\n spool.publishManifest();\n return spool;\n }\n\n public static recover(directory: string): NodeTurnSpool {\n const manifest = parseManifest(JSON.parse(fs.readFileSync(path.join(directory, MANIFEST_FILE), 'utf8')));\n const pcmPath = path.join(directory, PCM_FILE);\n const availableBytes = fs.statSync(pcmPath).size;\n if (availableBytes < manifest.committedBytes)\n throw new Error('Voice spool PCM is shorter than its committed length.');\n if (availableBytes !== manifest.committedBytes) fs.truncateSync(pcmPath, manifest.committedBytes);\n fs.chmodSync(directory, 0o700);\n fs.chmodSync(pcmPath, 0o600);\n return new NodeTurnSpool(directory, manifest);\n }\n\n public snapshotManifest(): TurnSpoolManifest {\n return { ...this.manifest };\n }\n\n public setCaptureGeneration(generation: number): void {\n this.assertOpen();\n if (!Number.isSafeInteger(generation) || generation < this.manifest.captureGeneration)\n throw new Error('Voice spool capture generation must be monotonic.');\n this.manifest.captureGeneration = generation;\n this.publishManifest();\n }\n\n public markUtteranceStart(byteOffset: number): void {\n this.assertOpen();\n if (!Number.isSafeInteger(byteOffset) || byteOffset < 0)\n throw new Error('Voice spool utterance start must be a non-negative integer.');\n if (byteOffset % PCM_BYTES_PER_SAMPLE !== 0)\n throw new Error('Voice spool utterance start must contain complete samples.');\n if (byteOffset > this.manifest.committedBytes)\n throw new Error('Voice spool utterance start exceeds committed length.');\n if (this.manifest.utteranceStartByte !== undefined) {\n if (this.manifest.utteranceStartByte !== byteOffset)\n throw new Error('Voice spool utterance start is already set.');\n return;\n }\n this.manifest.utteranceStartByte = byteOffset;\n this.publishManifest();\n }\n\n public append(pcm: Buffer): void {\n this.assertOpen();\n if (pcm.length === 0) return;\n if (pcm.length % PCM_BYTES_PER_SAMPLE !== 0)\n throw new Error('Voice spool PCM must contain complete 16-bit samples.');\n const descriptor = fs.openSync(this.pcmPath, 'a', 0o600);\n try {\n fs.writeSync(descriptor, pcm);\n fs.fsyncSync(descriptor);\n } finally {\n fs.closeSync(descriptor);\n }\n this.manifest.committedBytes += pcm.length;\n this.publishManifest();\n }\n\n public recordGap(): void {\n this.assertOpen();\n this.manifest.gapCount += 1;\n this.publishManifest();\n }\n\n public createSnapshot(): TurnSnapshot {\n this.assertOpen();\n this.manifest.revision += 1;\n const pcm = this.readCommittedPcm();\n const utterancePcm = pcm.subarray(this.manifest.utteranceStartByte ?? 0);\n const wavPath = path.join(this.directory, SNAPSHOT_DIRECTORY, `revision-${this.manifest.revision}.wav`);\n writePrivateFile(wavPath, encodePcm16Wav(utterancePcm));\n this.publishManifest();\n return { revision: this.manifest.revision, wavPath, pcmBytes: utterancePcm.length };\n }\n\n public getSnapshot(revision: number): TurnSnapshot {\n this.assertOpen();\n if (!Number.isSafeInteger(revision) || revision <= 0 || revision !== this.manifest.revision)\n throw new Error('Voice spool snapshot revision is invalid.');\n const wavPath = path.join(this.directory, SNAPSHOT_DIRECTORY, `revision-${revision}.wav`);\n if (!fs.statSync(wavPath).isFile()) throw new Error('Voice spool snapshot is unavailable.');\n return {\n revision,\n wavPath,\n pcmBytes: this.manifest.committedBytes - (this.manifest.utteranceStartByte ?? 0),\n };\n }\n\n public acknowledge(revision: number, outcome: 'committed' | 'discarded'): void {\n this.assertOpen();\n if (!Number.isSafeInteger(revision) || revision <= 0 || revision !== this.manifest.revision)\n throw new Error('Voice spool acknowledgement revision is invalid.');\n if (this.manifest.acknowledgedRevision !== undefined) {\n if (this.manifest.acknowledgedRevision !== revision || this.manifest.acknowledgedOutcome !== outcome)\n throw new Error('Voice spool acknowledgement conflicts with the durable outcome.');\n return;\n }\n this.manifest.acknowledgedRevision = revision;\n this.manifest.acknowledgedOutcome = outcome;\n this.publishManifest();\n }\n\n public readCommittedPcm(): Buffer {\n this.assertOpen();\n const pcm = fs.readFileSync(this.pcmPath);\n if (pcm.length < this.manifest.committedBytes) throw new Error('Voice spool PCM lost committed bytes.');\n return pcm.subarray(0, this.manifest.committedBytes);\n }\n\n public close(): void {\n this.closed = true;\n }\n\n public remove(): void {\n this.closed = true;\n fs.rmSync(this.directory, { recursive: true, force: true });\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error('Voice spool is closed.');\n }\n\n private publishManifest(): void {\n const temporaryPath = `${this.manifestPath}.tmp`;\n writePrivateFile(temporaryPath, `${JSON.stringify(this.manifest)}\\n`);\n fs.renameSync(temporaryPath, this.manifestPath);\n fs.chmodSync(this.manifestPath, 0o600);\n }\n}\n","import {\n narrationBargeInIsActionable,\n rankNarrationBargeInEvidence,\n type NarrationBargeInEvidence,\n} from '../../models/narrationBargeIn';\nimport { PCM_FRAME_BYTES, PCM_FRAME_MS } from '../pcm';\nimport { alignNarrationSpan, extractNovelNarrationResidual, normalizeEchoText } from '../semanticEcho';\nimport { AdaptiveVoiceActivityDetector, type AudioActivityHistogram, type VadNoiseProfile } from '../vad';\n\nconst OVERLAP_RING_FRAMES = 2_000 / PCM_FRAME_MS;\nconst PROBE_FRAMES = 1_200 / PCM_FRAME_MS;\nconst PROBE_INTERVAL_MS = 500;\n\nconst MAX_MISALIGNED_NARRATION_TAIL_TOKENS = 4;\n\nexport type NarrationBargeInSpeechSource = 'narration' | 'user' | 'ambiguous';\n\nexport interface NarrationBargeInDecision {\n actionable: boolean;\n score: number;\n speechSource: NarrationBargeInSpeechSource;\n evidence: NarrationBargeInEvidence;\n}\n\nexport interface NarrationBargeInReference {\n generation: number;\n text: string;\n startPhrases: readonly string[];\n stopPhrases: readonly string[];\n}\n\nexport interface NarrationBargeInProbe {\n generation: number;\n revision: number;\n observedAt: number;\n pcm: Buffer;\n referenceText: string;\n startPhrases: readonly string[];\n stopPhrases: readonly string[];\n noiseProfile?: VadNoiseProfile;\n classifierSpeechMs?: number;\n classifierConfirmed?: boolean;\n}\n\nexport interface NarrationBargeInMonitorDependencies {\n transcribe(probe: NarrationBargeInProbe, signal: AbortSignal): Promise<string>;\n onEvidence(generation: number, decision: NarrationBargeInDecision): void;\n}\n\ninterface ActiveProbe {\n probe: NarrationBargeInProbe;\n controller: AbortController;\n}\n\nfunction tokenCount(value: string): number {\n const normalized = normalizeEchoText(value);\n return normalized ? normalized.split(' ').length : 0;\n}\n\nfunction overlapActivity(pcm: Buffer, noiseProfile?: VadNoiseProfile): AudioActivityHistogram {\n const vad = new AdaptiveVoiceActivityDetector(undefined, noiseProfile);\n let completed: AudioActivityHistogram | undefined;\n for (let offset = 0; offset + PCM_FRAME_BYTES <= pcm.length; offset += PCM_FRAME_BYTES) {\n const result = vad.push(pcm.subarray(offset, offset + PCM_FRAME_BYTES), { playbackOverlapMs: PCM_FRAME_MS });\n completed = result.segment?.activityHistogram ?? completed;\n }\n return (\n completed ??\n vad.flush()?.activityHistogram ?? {\n bucketMs: 100,\n buckets: [],\n durationMs: (pcm.length / PCM_FRAME_BYTES) * PCM_FRAME_MS,\n noiseFloorDbfs: noiseProfile?.averageDbfs ?? -60,\n speechThresholdDbfs: (noiseProfile?.averageDbfs ?? -60) + 10,\n voicedMs: 0,\n leadingSilenceMs: (pcm.length / PCM_FRAME_BYTES) * PCM_FRAME_MS,\n trailingSilenceMs: (pcm.length / PCM_FRAME_BYTES) * PCM_FRAME_MS,\n forcedClose: false,\n }\n );\n}\n\nfunction phraseTokens(phrase: string): string[] {\n return normalizeEchoText(phrase).split(' ').filter(Boolean);\n}\n\nfunction tokensMatchAt(tokens: readonly string[], phrase: readonly string[], offset: number): boolean {\n return phrase.length > 0 && phrase.every((token, index) => tokens[offset + index] === token);\n}\n\nfunction intentionalAddress(\n residualRuns: readonly string[],\n startPhrases: readonly string[],\n echoAligned: boolean,\n): { detected: boolean; contentTokenCount: number } {\n const tokens = residualRuns.flatMap((run) => phraseTokens(run));\n const maximumOffset = echoAligned ? MAX_MISALIGNED_NARRATION_TAIL_TOKENS : 0;\n for (const phrase of startPhrases.map(phraseTokens)) {\n for (let offset = 0; offset <= Math.min(maximumOffset, tokens.length - phrase.length); offset += 1) {\n if (tokensMatchAt(tokens, phrase, offset))\n return { detected: true, contentTokenCount: tokens.length - offset - phrase.length };\n }\n }\n return { detected: false, contentTokenCount: tokens.length };\n}\n\nfunction exactResidualStopCommand(\n residualRuns: readonly string[],\n startPhrases: readonly string[],\n stopPhrases: readonly string[],\n echoAligned: boolean,\n): boolean {\n const commands = stopPhrases.map(phraseTokens);\n const addresses = startPhrases.map(phraseTokens);\n return residualRuns.some((run) => {\n const tokens = phraseTokens(run);\n return commands.some((command) => {\n if (tokens.length < command.length) return false;\n const commandOffset = tokens.length - command.length;\n if (!tokensMatchAt(tokens, command, commandOffset)) return false;\n if (commandOffset === 0) return true;\n const commandPrefix = tokens.slice(0, commandOffset);\n if (\n addresses.some(\n (address) =>\n commandPrefix.length >= address.length &&\n tokensMatchAt(commandPrefix, address, commandPrefix.length - address.length) &&\n (commandPrefix.length === address.length ||\n (echoAligned && commandPrefix.length - address.length <= MAX_MISALIGNED_NARRATION_TAIL_TOKENS)),\n )\n )\n return true;\n return echoAligned && commandOffset <= MAX_MISALIGNED_NARRATION_TAIL_TOKENS;\n });\n });\n}\n\nexport function classifyNarrationBargeInSource(evidence: NarrationBargeInEvidence): NarrationBargeInSpeechSource {\n if (evidence.exactStopCommand || evidence.intentionalAddress === true) return 'user';\n if (evidence.residualTokenCount === 0 || evidence.narrationSimilarity >= 0.6) return 'narration';\n const classifierConfirmed = evidence.classifierConfirmed === true || (evidence.classifierSpeechMs ?? 0) >= 120;\n if (classifierConfirmed && evidence.residualTokenCount >= 3 && evidence.residualRatio >= 0.3) return 'user';\n return 'ambiguous';\n}\n\nexport function analyzeNarrationBargeIn(input: {\n transcript: string;\n referenceText: string;\n startPhrases: readonly string[];\n stopPhrases: readonly string[];\n pcm: Buffer;\n noiseProfile?: VadNoiseProfile;\n classifierSpeechMs?: number;\n classifierConfirmed?: boolean;\n}): NarrationBargeInDecision {\n const activity = overlapActivity(input.pcm, input.noiseProfile);\n const analysis = extractNovelNarrationResidual(input.transcript, input.referenceText);\n const address = intentionalAddress(analysis.residualRuns, input.startPhrases, analysis.echoAligned);\n const residualTokenCount = address.contentTokenCount;\n const transcriptTokenCount = tokenCount(input.transcript);\n const levels = activity.buckets.map((bucket) => bucket.levelDbAboveNoise);\n const peakDbAboveNoise = levels.length > 0 ? Math.max(...levels) : 0;\n const signalVariationDb = levels.length > 1 ? Math.max(...levels) - Math.min(...levels) : 0;\n const classifierSpeechMs = Math.max(0, input.classifierSpeechMs ?? 0);\n const evidence: NarrationBargeInEvidence = {\n exactStopCommand: exactResidualStopCommand(\n analysis.residualRuns,\n input.startPhrases,\n input.stopPhrases,\n analysis.echoAligned,\n ),\n intentionalAddress: address.detected,\n classifierConfirmed: input.classifierConfirmed === true,\n classifierSpeechMs,\n residualTokenCount,\n residualRatio: transcriptTokenCount > 0 ? residualTokenCount / transcriptTokenCount : 0,\n voicedMs: activity.voicedMs,\n peakDbAboveNoise,\n signalVariationDb,\n narrationSimilarity: alignNarrationSpan(input.transcript, input.referenceText).similarity,\n };\n const score = rankNarrationBargeInEvidence(evidence);\n return {\n actionable: narrationBargeInIsActionable(evidence),\n score,\n speechSource: classifyNarrationBargeInSource(evidence),\n evidence,\n };\n}\n\nexport class NarrationBargeInMonitor {\n private readonly frames: Buffer[] = [];\n private reference: NarrationBargeInReference | undefined;\n private activeProbe: ActiveProbe | undefined;\n private pendingProbe: NarrationBargeInProbe | undefined;\n private revision = 0;\n private nextProbeAt = 0;\n private awaitingAuthority = false;\n private promoted = false;\n private discarded = false;\n private classifierSpeechMs = 0;\n private classifierConfirmed = false;\n\n public constructor(private readonly dependencies: NarrationBargeInMonitorDependencies) {}\n\n public get confirmed(): boolean {\n return this.promoted;\n }\n\n public begin(reference: NarrationBargeInReference, observedAt: number): void {\n this.reset();\n this.reference = {\n ...reference,\n startPhrases: [...reference.startPhrases],\n stopPhrases: [...reference.stopPhrases],\n };\n this.nextProbeAt = observedAt;\n }\n\n public finish(generation: number): void {\n if (this.reference?.generation !== generation) return;\n this.cancelProbes();\n if (!this.promoted) this.reset();\n }\n\n public observe(\n frame: Buffer,\n observedAt: number,\n noiseProfile?: VadNoiseProfile,\n classifierSpeechMs = 0,\n classifierConfirmed = false,\n ): void {\n if (!this.reference || this.promoted || this.discarded) return;\n if (frame.length !== PCM_FRAME_BYTES)\n throw new Error(`Barge-in monitor requires ${PCM_FRAME_BYTES}-byte PCM frames`);\n this.classifierSpeechMs = Math.max(this.classifierSpeechMs, classifierSpeechMs);\n this.classifierConfirmed ||= classifierConfirmed;\n this.frames.push(Buffer.from(frame));\n while (this.frames.length > OVERLAP_RING_FRAMES) this.frames.shift();\n if (this.awaitingAuthority || observedAt < this.nextProbeAt || this.frames.length < PROBE_FRAMES) return;\n this.nextProbeAt = observedAt + PROBE_INTERVAL_MS;\n const probe: NarrationBargeInProbe = {\n generation: this.reference.generation,\n revision: ++this.revision,\n observedAt,\n pcm: Buffer.concat(this.frames.slice(-PROBE_FRAMES)),\n referenceText: this.reference.text,\n startPhrases: [...this.reference.startPhrases],\n stopPhrases: [...this.reference.stopPhrases],\n ...(noiseProfile ? { noiseProfile: { ...noiseProfile } } : {}),\n classifierSpeechMs: this.classifierSpeechMs,\n classifierConfirmed: this.classifierConfirmed,\n };\n this.schedule(probe);\n }\n\n public promote(generation: number): Buffer | undefined {\n if (this.reference?.generation !== generation || !this.awaitingAuthority || this.promoted) return undefined;\n this.promoted = true;\n this.awaitingAuthority = false;\n this.cancelProbes();\n const pcm = Buffer.concat(this.frames);\n this.frames.length = 0;\n return pcm;\n }\n\n public discard(generation: number): boolean {\n if (this.reference?.generation !== generation || !this.awaitingAuthority || this.promoted) return false;\n this.cancelProbes();\n this.frames.length = 0;\n this.awaitingAuthority = false;\n this.discarded = true;\n return true;\n }\n\n public reopenCleanLane(): void {\n if (!this.promoted) return;\n this.reset();\n }\n\n public stop(): void {\n this.reset();\n }\n\n private schedule(probe: NarrationBargeInProbe): void {\n if (this.activeProbe) {\n this.pendingProbe = probe;\n return;\n }\n const active = { probe, controller: new AbortController() };\n this.activeProbe = active;\n void this.run(active);\n }\n\n private async run(active: ActiveProbe): Promise<void> {\n const transcript = await this.dependencies\n .transcribe(active.probe, active.controller.signal)\n .catch(() => undefined);\n if (this.activeProbe !== active) return;\n this.activeProbe = undefined;\n if (\n transcript !== undefined &&\n !active.controller.signal.aborted &&\n this.reference?.generation === active.probe.generation\n ) {\n const decision = analyzeNarrationBargeIn({\n transcript,\n referenceText: active.probe.referenceText,\n startPhrases: active.probe.startPhrases,\n stopPhrases: active.probe.stopPhrases,\n pcm: active.probe.pcm,\n ...(active.probe.noiseProfile ? { noiseProfile: active.probe.noiseProfile } : {}),\n ...(active.probe.classifierSpeechMs === undefined\n ? {}\n : { classifierSpeechMs: active.probe.classifierSpeechMs }),\n ...(active.probe.classifierConfirmed === undefined\n ? {}\n : { classifierConfirmed: active.probe.classifierConfirmed }),\n });\n if (decision.actionable) {\n this.awaitingAuthority = true;\n this.pendingProbe = undefined;\n this.dependencies.onEvidence(active.probe.generation, decision);\n return;\n }\n }\n const pending = this.pendingProbe;\n this.pendingProbe = undefined;\n if (pending && this.reference?.generation === pending.generation) this.schedule(pending);\n }\n\n private cancelProbes(): void {\n this.activeProbe?.controller.abort();\n this.activeProbe = undefined;\n this.pendingProbe = undefined;\n }\n\n private reset(): void {\n this.cancelProbes();\n this.frames.length = 0;\n this.reference = undefined;\n this.revision = 0;\n this.nextProbeAt = 0;\n this.awaitingAuthority = false;\n this.promoted = false;\n this.discarded = false;\n this.classifierSpeechMs = 0;\n this.classifierConfirmed = false;\n }\n}\n","export const PLAYBACK_ECHO_TAIL_MS = 800;\n\nexport interface PlaybackGateSnapshot {\n sessionId?: string;\n generation: number;\n phase: 'open' | 'playing' | 'echoTail';\n suppressUntil: number;\n}\n\nexport interface PlaybackGateUpdate {\n sessionId: string;\n playbackGeneration: number;\n active: boolean;\n}\n\nexport class PlaybackGate {\n private current: PlaybackGateSnapshot = {\n generation: 0,\n phase: 'open',\n suppressUntil: 0,\n };\n\n public update(update: PlaybackGateUpdate, now: number): boolean {\n if (this.current.sessionId === update.sessionId) {\n if (update.playbackGeneration < this.current.generation) return false;\n if (\n update.playbackGeneration === this.current.generation &&\n !(this.current.phase === 'playing' && !update.active)\n )\n return false;\n }\n this.current = {\n sessionId: update.sessionId,\n generation: update.playbackGeneration,\n phase: update.active ? 'playing' : 'echoTail',\n suppressUntil: update.active ? Number.POSITIVE_INFINITY : now + PLAYBACK_ECHO_TAIL_MS,\n };\n return true;\n }\n\n public suppresses(sessionId: string, now: number): boolean {\n if (this.current.sessionId !== sessionId) return false;\n if (this.current.phase === 'playing') return true;\n if (this.current.phase === 'echoTail' && now < this.current.suppressUntil) return true;\n return false;\n }\n\n public snapshot(now: number): PlaybackGateSnapshot {\n if (this.current.phase === 'echoTail' && now >= this.current.suppressUntil) {\n return { ...this.current, phase: 'open' };\n }\n return { ...this.current };\n }\n\n public reset(): void {\n this.current = { generation: 0, phase: 'open', suppressUntil: 0 };\n }\n}\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { ISpeechPresenceDetector } from '../../types';\nimport { PCM_BYTES_PER_SAMPLE, PCM_FRAME_BYTES, PCM_SAMPLE_RATE } from '../pcm';\n\nconst SHERPA_ONNX_PACKAGE = 'sherpa-onnx-node';\nconst SILERO_MODEL_FILE = 'silero_vad_v6.2.1.onnx';\n/**\n * The one copy of the model, colocated with the browser capture device that\n * also loads it. Node reads the same file from disk, so the segments are\n * spelled out rather than resolved through the browser import.\n */\nconst SILERO_MODEL_SEGMENTS = [\n 'src',\n 'extensions',\n 'workspaces',\n 'sessions',\n '(frontend)',\n 'lifecycle',\n '_lib',\n 'models',\n SILERO_MODEL_FILE,\n];\nconst SILERO_THRESHOLD = 0.5;\nconst SILERO_WINDOW_SAMPLES = 512;\nconst SILERO_WINDOW_BYTES = SILERO_WINDOW_SAMPLES * PCM_BYTES_PER_SAMPLE;\nconst SILERO_MINIMUM_SPEECH_SECONDS = 0.12;\nconst SILERO_MINIMUM_SILENCE_SECONDS = 0.1;\nconst SILERO_MAXIMUM_SPEECH_SECONDS = 30;\nconst SILERO_BUFFER_SECONDS = 60;\nconst PCM_VALUE_LIMIT = 32_768;\n\ninterface NativeVadConfig {\n sileroVad: {\n model: string;\n threshold: number;\n minSpeechDuration: number;\n minSilenceDuration: number;\n maxSpeechDuration: number;\n windowSize: number;\n };\n sampleRate: number;\n numThreads: number;\n provider: string;\n debug: boolean;\n}\n\ninterface NativeVad {\n acceptWaveform(samples: Float32Array): void;\n isDetected(): boolean;\n isEmpty(): boolean;\n pop(): void;\n reset(): void;\n}\n\ninterface SherpaOnnxModule {\n Vad: new (configuration: NativeVadConfig, bufferSizeInSeconds: number) => NativeVad;\n}\n\nexport interface SileroSpeechPresenceDetectorOptions {\n modelPath?: string;\n loadRuntime?: () => SherpaOnnxModule;\n}\n\nfunction loadSherpaOnnx(): SherpaOnnxModule {\n return createRequire(import.meta.url)(SHERPA_ONNX_PACKAGE) as SherpaOnnxModule;\n}\n\nexport function findSileroVadModelPath(importFileUrl: string | URL): string {\n let directory = path.dirname(fileURLToPath(importFileUrl));\n while (true) {\n const candidate = path.join(directory, ...SILERO_MODEL_SEGMENTS);\n if (fs.existsSync(candidate)) return candidate;\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n throw new Error(`Silero VAD model is missing: ${SILERO_MODEL_FILE}`);\n}\n\nexport class SileroSpeechPresenceDetector implements ISpeechPresenceDetector {\n private readonly nativeVad: NativeVad;\n private readonly pcmWindow = Buffer.alloc(SILERO_WINDOW_BYTES);\n private readonly floatWindow = new Float32Array(SILERO_WINDOW_SAMPLES);\n private bufferedBytes = 0;\n private speechDetected = false;\n\n public constructor(options: SileroSpeechPresenceDetectorOptions = {}) {\n const model = options.modelPath ?? findSileroVadModelPath(import.meta.url);\n const runtime = (options.loadRuntime ?? loadSherpaOnnx)();\n this.nativeVad = new runtime.Vad(\n {\n sileroVad: {\n model,\n threshold: SILERO_THRESHOLD,\n minSpeechDuration: SILERO_MINIMUM_SPEECH_SECONDS,\n minSilenceDuration: SILERO_MINIMUM_SILENCE_SECONDS,\n maxSpeechDuration: SILERO_MAXIMUM_SPEECH_SECONDS,\n windowSize: SILERO_WINDOW_SAMPLES,\n },\n sampleRate: PCM_SAMPLE_RATE,\n numThreads: 1,\n provider: 'cpu',\n debug: false,\n },\n SILERO_BUFFER_SECONDS,\n );\n }\n\n public push(frame: Buffer): boolean {\n if (frame.length !== PCM_FRAME_BYTES) throw new Error(`Silero VAD requires ${PCM_FRAME_BYTES}-byte PCM frames`);\n let frameOffset = 0;\n while (frameOffset < frame.length) {\n const copiedBytes = Math.min(SILERO_WINDOW_BYTES - this.bufferedBytes, frame.length - frameOffset);\n frame.copy(this.pcmWindow, this.bufferedBytes, frameOffset, frameOffset + copiedBytes);\n this.bufferedBytes += copiedBytes;\n frameOffset += copiedBytes;\n if (this.bufferedBytes === SILERO_WINDOW_BYTES) this.processWindow();\n }\n return this.speechDetected;\n }\n\n public reset(): void {\n this.nativeVad.reset();\n this.bufferedBytes = 0;\n this.speechDetected = false;\n }\n\n private processWindow(): void {\n for (let sample = 0; sample < SILERO_WINDOW_SAMPLES; sample += 1)\n this.floatWindow[sample] = this.pcmWindow.readInt16LE(sample * PCM_BYTES_PER_SAMPLE) / PCM_VALUE_LIMIT;\n this.nativeVad.acceptWaveform(this.floatWindow);\n this.speechDetected = this.nativeVad.isDetected();\n while (!this.nativeVad.isEmpty()) this.nativeVad.pop();\n this.bufferedBytes = 0;\n }\n}\n","const PCM_LIMIT = 32_767;\nconst PCM_SCALE = 32_768;\nconst DEFAULT_SAMPLE_RATE = 16_000;\nconst SIGNAL_FRAME_MS = 20;\nconst DEFAULT_TARGET_PEAK = 0.82;\nconst DEFAULT_MAX_GAIN = 8;\n\nexport interface PcmSignalSummary {\n sampleCount: number;\n nonZeroSamples: number;\n peak: number;\n}\n\nexport interface PcmSignalEvidence extends PcmSignalSummary {\n durationMs: number;\n voicedMs: number;\n rmsDbfs: number;\n peakDbfs: number;\n signalVariationDb: number;\n nonZeroRatio: number;\n}\n\nfunction dbfs(amplitude: number): number {\n return amplitude > 0 ? 20 * Math.log10(amplitude) : -120;\n}\n\nexport function analyzePcm16(pcm: Buffer, sampleRate = DEFAULT_SAMPLE_RATE): PcmSignalEvidence {\n if (pcm.length % 2 !== 0) throw new Error('PCM signal must contain complete 16-bit samples.');\n if (!Number.isFinite(sampleRate) || sampleRate <= 0) throw new Error('PCM sample rate must be positive.');\n const sampleCount = pcm.length / 2;\n const frameSamples = Math.max(1, Math.round((sampleRate * SIGNAL_FRAME_MS) / 1_000));\n let nonZeroSamples = 0;\n let peak = 0;\n let squareSum = 0;\n let frameSquareSum = 0;\n let frameSampleCount = 0;\n const frameLevels: number[] = [];\n for (let offset = 0; offset < pcm.length; offset += 2) {\n const sample = pcm.readInt16LE(offset);\n const normalized = sample / PCM_SCALE;\n if (sample !== 0) nonZeroSamples += 1;\n peak = Math.max(peak, Math.abs(sample));\n squareSum += normalized * normalized;\n frameSquareSum += normalized * normalized;\n frameSampleCount += 1;\n if (frameSampleCount === frameSamples || offset + 2 === pcm.length) {\n frameLevels.push(dbfs(Math.sqrt(frameSquareSum / frameSampleCount)));\n frameSquareSum = 0;\n frameSampleCount = 0;\n }\n }\n const sortedLevels = [...frameLevels].sort((left, right) => left - right);\n const noiseIndex = Math.max(0, Math.floor(sortedLevels.length * 0.2) - 1);\n const noiseFloor = sortedLevels[noiseIndex] ?? -120;\n const speechThreshold = Math.max(-58, Math.min(-40, noiseFloor + 8));\n const voicedFrames = frameLevels.filter((level) => level >= speechThreshold).length;\n const minimumLevel = frameLevels.length > 0 ? Math.min(...frameLevels) : -120;\n const maximumLevel = frameLevels.length > 0 ? Math.max(...frameLevels) : -120;\n return {\n sampleCount,\n nonZeroSamples,\n peak,\n durationMs: (sampleCount / sampleRate) * 1_000,\n voicedMs: Math.min((sampleCount / sampleRate) * 1_000, voicedFrames * SIGNAL_FRAME_MS),\n rmsDbfs: dbfs(sampleCount > 0 ? Math.sqrt(squareSum / sampleCount) : 0),\n peakDbfs: dbfs(peak / PCM_SCALE),\n signalVariationDb: maximumLevel - minimumLevel,\n nonZeroRatio: sampleCount > 0 ? nonZeroSamples / sampleCount : 0,\n };\n}\n\nexport function summarizePcm16(pcm: Buffer): PcmSignalSummary {\n const evidence = analyzePcm16(pcm);\n return {\n sampleCount: evidence.sampleCount,\n nonZeroSamples: evidence.nonZeroSamples,\n peak: evidence.peak,\n };\n}\nexport function normalizePcm16(pcm: Buffer, targetPeak = DEFAULT_TARGET_PEAK, maxGain = DEFAULT_MAX_GAIN): Buffer {\n if (!(targetPeak > 0 && targetPeak <= 1)) throw new Error('PCM normalization target peak must be in (0, 1].');\n if (!(maxGain >= 1 && Number.isFinite(maxGain))) throw new Error('PCM normalization maximum gain must be finite.');\n const summary = summarizePcm16(pcm);\n if (summary.peak === 0) return Buffer.from(pcm);\n const gain = Math.min(maxGain, (PCM_LIMIT * targetPeak) / summary.peak);\n if (gain <= 1) return Buffer.from(pcm);\n const normalized = Buffer.alloc(pcm.length);\n for (let offset = 0; offset < pcm.length; offset += 2) {\n const amplified = Math.round(pcm.readInt16LE(offset) * gain);\n normalized.writeInt16LE(Math.max(-PCM_LIMIT - 1, Math.min(PCM_LIMIT, amplified)), offset);\n }\n return normalized;\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport type { ResolvedVoiceConfig } from '@agimon-ai/po-config';\n\nimport { type NarrationBargeInEvidence } from '../../models/narrationBargeIn';\nimport type {\n IClock,\n IPcmAudioRecorder,\n ISpeechPresenceDetector,\n ITranscriberRegistry,\n IVoiceMediaHostConnection,\n SelectedTranscriber,\n TimerHandle,\n TranscriptionAdapterOutput,\n} from '../../types';\nimport type { VoiceMediaCaptureActivity } from '../../types/clientMedia';\nimport { AutonomousEndpoint } from '../autonomousEndpoint';\nimport { CaptureSession } from '../captureSession';\nimport { ClientPcmAudioRecorder } from '../clientMedia';\nimport { NodeTurnSpool } from '../fileTurnSpool';\nimport {\n ExecutableResolver,\n FfmpegPcmAudioRecorder,\n NodeBinaryProcessSpawner,\n NodeProcessSpawner,\n SystemClock,\n writePrivatePcm16Wav,\n} from '../infrastructure';\nimport { NarrationBargeInMonitor, type NarrationBargeInProbe } from '../narrationBargeIn';\nimport { PCM_FRAME_BYTES, PCM_FRAME_MS } from '../pcm';\nimport { PlaybackGate } from '../playbackGate';\nimport { SileroSpeechPresenceDetector } from '../silero';\nimport type { VoiceTranscriptSignalEvidence } from '../transcriptAdmission';\nimport { analyzePcm16, normalizePcm16 } from '../transcriptionCoordinator';\nimport { DEFAULT_TRANSCRIPTION_TIMEOUT_MS, TurnTranscriber, type TurnTranscriptionOutcome } from '../turnTranscriber';\nimport {\n AdaptiveVoiceActivityDetector,\n calculatePcmFrameDbfs,\n DEFAULT_VAD_CONFIGURATION,\n type VadNoiseProfile,\n} from '../vad';\nimport type { VoiceWorkerPublish, VoiceWorkerRuntimeHooks } from '../voiceWorker';\nimport {\n VOICE_WORKER_INTENTIONAL_BARGE_IN_CAPABILITY,\n VOICE_WORKER_RANKED_BARGE_IN_CAPABILITY,\n VOICE_WORKER_TRANSCRIPTION_TIMEOUT_CAPABILITY,\n type VoiceWorkerCommand,\n} from '../voiceWorkerProtocol';\nimport { MlxWhisperAdapter, OpenAiWhisperAdapter, TranscriberRegistry, WhisperCppAdapter } from '../whisper';\n\nconst MAX_SESSION_NOISE_PROFILES = 8;\nconst BARGE_IN_PROBE_TIMEOUT_MS = 5_000;\n// ponytail: Browser permission and input selection have 25 seconds before the first-frame retry; a client-ready acknowledgement would remove this ceiling.\nconst CLIENT_FIRST_FRAME_TIMEOUT_MS = 25_000;\nconst AUTONOMOUS_PRE_ROLL_BYTES = (DEFAULT_VAD_CONFIGURATION.preRollMs / PCM_FRAME_MS) * PCM_FRAME_BYTES;\n\ninterface ActiveWorkerCapture {\n command: Extract<VoiceWorkerCommand, { kind: 'begin-capture' }>;\n config: ResolvedVoiceConfig;\n selected: SelectedTranscriber;\n spool: NodeTurnSpool;\n session: CaptureSession;\n transcriptionAbort: AbortController;\n vad?: AdaptiveVoiceActivityDetector;\n speechDetector?: ISpeechPresenceDetector;\n bargeIn?: NarrationBargeInMonitor;\n limitTimer?: TimerHandle;\n endpoint: AutonomousEndpoint;\n endpointReported: boolean;\n endpointGeneration?: number;\n clientActivityState?: VoiceMediaCaptureActivity['state'];\n clientActivityElapsedMs: number;\n clientActivityEpoch: number;\n clientActivityGeneration: number;\n clientActivityObserved: boolean;\n clientActivitySpeechMs: number;\n clientActivityEchoDiscriminatedSpeechMs: number;\n clientClassifierSpeechMs: number;\n clientEchoDiscriminatedSpeechMs: number;\n hostClassifierSpeechMs: number;\n bargeInClientClassifierBaselineMs: number;\n bargeInEchoDiscriminatedBaselineMs: number;\n bargeInHostClassifierBaselineMs: number;\n bargeInEchoDiscriminationAvailable: boolean;\n playbackOverlapMs: number;\n clientSpeechStarted: boolean;\n finalized: boolean;\n startedAt: number;\n nextActivityAt: number;\n}\n\nfunction spoolKey(identity: { sessionId: string; turnId: string }): string {\n return `${identity.sessionId}\\u0000${identity.turnId}`;\n}\n\nfunction recoverTurnSpool(directory: string): NodeTurnSpool | undefined {\n try {\n return NodeTurnSpool.recover(directory);\n } catch {\n return undefined;\n }\n}\n\nfunction resolvedConfig(command: Extract<VoiceWorkerCommand, { kind: 'begin-capture' }>): ResolvedVoiceConfig {\n return {\n mode: 'legacy',\n engine: command.config.engine,\n language: command.config.language,\n recorder: { ...command.config.recorder },\n adapters: { ...command.config.adapters },\n };\n}\n\nfunction matchesCapture(active: ActiveWorkerCapture, command: { sessionId: string; captureId?: string }): boolean {\n return (\n active.command.sessionId === command.sessionId &&\n (command.captureId === undefined || active.command.captureId === command.captureId)\n );\n}\n\nfunction clientActivityOrder(state: VoiceMediaCaptureActivity['state']): number {\n return state === 'listening' ? 0 : state === 'speech' ? 1 : 2;\n}\nfunction isDeterministicNoSpeech(summary: ReturnType<typeof analyzePcm16>, classifierSpeechMs: number): boolean {\n if (summary.nonZeroSamples === 0) return true;\n if (classifierSpeechMs >= 80) return false;\n const stableAmbient =\n classifierSpeechMs === 0 && summary.durationMs >= 200 && summary.signalVariationDb < 1.5 && summary.rmsDbfs < -42;\n const isolatedTransient = summary.voicedMs < 120 && summary.nonZeroRatio < 0.05;\n return stableAmbient || isolatedTransient;\n}\n\nexport interface VoiceWorkerPipelineDependencies {\n clock?: IClock;\n clientMedia?: IVoiceMediaHostConnection;\n recorder?: IPcmAudioRecorder;\n registry?: ITranscriberRegistry;\n speechDetectorFactory?: () => ISpeechPresenceDetector;\n}\n\nexport class VoiceWorkerPipeline implements VoiceWorkerRuntimeHooks {\n private readonly clock: IClock;\n private readonly recorder: IPcmAudioRecorder;\n private readonly registry: ITranscriberRegistry;\n private readonly speechDetectorFactory: () => ISpeechPresenceDetector;\n private readonly turnTranscriber: TurnTranscriber;\n private spoolDirectory: string | undefined;\n private activityIntervalMs = 125;\n private active: ActiveWorkerCapture | undefined;\n private readonly playbackGate = new PlaybackGate();\n private readonly recovered = new Map<string, NodeTurnSpool>();\n private readonly sessionNoiseProfiles = new Map<string, VadNoiseProfile>();\n private activePlaybackReference: Extract<VoiceWorkerCommand, { kind: 'playback-state' }> | undefined;\n private speechDetector: ISpeechPresenceDetector | undefined;\n private speechDetectorUnavailable = false;\n private operations: Promise<void> = Promise.resolve();\n private closing = false;\n private shutdownPromise: Promise<void> | undefined;\n\n public constructor(dependencies: VoiceWorkerPipelineDependencies = {}) {\n this.clock = dependencies.clock ?? new SystemClock();\n this.speechDetectorFactory = dependencies.speechDetectorFactory ?? (() => new SileroSpeechPresenceDetector());\n this.turnTranscriber = new TurnTranscriber(this.clock);\n if (dependencies.recorder && dependencies.registry) {\n this.recorder = dependencies.recorder;\n this.registry = dependencies.registry;\n return;\n }\n const executables = new ExecutableResolver();\n const processSpawner = new NodeProcessSpawner();\n const clientMedia = dependencies.clientMedia;\n this.recorder =\n dependencies.recorder ??\n (clientMedia\n ? new ClientPcmAudioRecorder(clientMedia)\n : new FfmpegPcmAudioRecorder(executables, new NodeBinaryProcessSpawner(), this.clock));\n this.registry =\n dependencies.registry ??\n new TranscriberRegistry(\n new WhisperCppAdapter(executables, processSpawner),\n new OpenAiWhisperAdapter(executables, processSpawner),\n new MlxWhisperAdapter(executables, processSpawner),\n );\n }\n\n public initialize(\n command: Extract<VoiceWorkerCommand, { kind: 'initialize' }>,\n publish: VoiceWorkerPublish = () => undefined,\n ): void {\n this.spoolDirectory = command.spoolDirectory;\n this.activityIntervalMs = Math.max(1, Math.ceil(1_000 / command.activityHz));\n this.playbackGate.reset();\n this.activePlaybackReference = undefined;\n this.recoverSpools(command.spoolDirectory, publish);\n }\n\n public capabilities(): readonly string[] {\n const speechDetectorAvailable = this.ensureSpeechDetector() !== undefined;\n return [\n 'capture',\n 'transcription',\n 'durable-spool',\n 'adaptive-vad',\n ...(speechDetectorAvailable ? ['silero-vad'] : []),\n VOICE_WORKER_TRANSCRIPTION_TIMEOUT_CAPABILITY,\n VOICE_WORKER_RANKED_BARGE_IN_CAPABILITY,\n VOICE_WORKER_INTENTIONAL_BARGE_IN_CAPABILITY,\n ];\n }\n\n public handle(\n command: Exclude<VoiceWorkerCommand, { kind: 'initialize' | 'shutdown' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> {\n if (this.closing) return Promise.reject(new Error('voice_worker_pipeline_closed'));\n const operation = this.operations.then(() => this.handleOrdered(command, publish));\n this.operations = operation.catch(() => undefined);\n return operation;\n }\n\n public shutdown(): Promise<void> {\n this.shutdownPromise ??= this.performShutdown();\n return this.shutdownPromise;\n }\n\n private async performShutdown(): Promise<void> {\n this.closing = true;\n const cancellation = this.cancelActive();\n await Promise.all([this.operations, cancellation]);\n for (const spool of this.recovered.values()) {\n if (spool.snapshotManifest().acknowledgedRevision !== undefined) spool.remove();\n else spool.close();\n }\n this.recovered.clear();\n }\n\n private async handleOrdered(\n command: Exclude<VoiceWorkerCommand, { kind: 'initialize' | 'shutdown' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> {\n if (this.closing) return;\n switch (command.kind) {\n case 'begin-capture':\n await this.begin(command, publish);\n return;\n case 'finalize-capture':\n await this.finalize(command, publish);\n return;\n case 'cancel-capture':\n if (this.active && matchesCapture(this.active, command)) await this.cancelActive();\n return;\n case 'acknowledge-candidate': {\n if (command.outcome === 'retry') return;\n if (this.active && matchesCapture(this.active, command) && this.active.command.turnId === command.turnId) {\n const { command: activeCommand, spool } = this.active;\n spool.acknowledge(command.revision, command.outcome);\n this.recovered.set(spoolKey(activeCommand), spool);\n this.active = undefined;\n publish({\n kind: 'candidate-acknowledged',\n sessionId: activeCommand.sessionId,\n captureId: activeCommand.captureId,\n turnId: activeCommand.turnId,\n revision: command.revision,\n outcome: command.outcome,\n });\n return;\n }\n const recovered = this.recovered.get(spoolKey(command));\n if (!recovered) return;\n const manifest = recovered.snapshotManifest();\n recovered.acknowledge(command.revision, command.outcome);\n publish({\n kind: 'candidate-acknowledged',\n sessionId: manifest.sessionId,\n captureId: manifest.captureId,\n turnId: manifest.turnId,\n revision: command.revision,\n outcome: command.outcome,\n });\n return;\n }\n case 'playback-state':\n this.updatePlaybackGate(command);\n return;\n case 'confirm-barge-in':\n this.promoteBargeIn(command, publish);\n return;\n }\n }\n\n private async begin(\n command: Extract<VoiceWorkerCommand, { kind: 'begin-capture' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> {\n if (this.active) throw new Error('capture_already_active');\n if (!this.spoolDirectory) throw new Error('spool_not_initialized');\n const config = resolvedConfig(command);\n this.recorder.preflight(config);\n const selected = this.registry.select(config);\n const speechDetector = command.mode === 'autonomous' ? this.prepareSpeechDetector() : undefined;\n this.pruneAcknowledgedSpools(command.sessionId, command.turnId);\n const recoveredKey = spoolKey(command);\n const recovered = this.recovered.get(recoveredKey);\n const recoveredManifest = recovered?.snapshotManifest();\n if (recoveredManifest?.captureId !== undefined && recoveredManifest.captureId !== command.captureId)\n throw new Error('recovered_capture_identity_mismatch');\n if (recoveredManifest?.acknowledgedRevision !== undefined) throw new Error('recovered_turn_already_acknowledged');\n const spool =\n recovered ??\n NodeTurnSpool.create(this.spoolDirectory, {\n sessionId: command.sessionId,\n captureId: command.captureId,\n turnId: command.turnId,\n });\n const frozenSnapshot =\n recoveredManifest && recoveredManifest.revision > 0 ? spool.getSnapshot(recoveredManifest.revision) : undefined;\n if (recovered) {\n this.recovered.delete(recoveredKey);\n if (!frozenSnapshot) spool.recordGap();\n }\n let activeReference: ActiveWorkerCapture | undefined;\n const bargeIn =\n command.mode === 'autonomous'\n ? new NarrationBargeInMonitor({\n transcribe: (probe, signal) => {\n if (!activeReference) return Promise.reject(new Error('barge_in_capture_unavailable'));\n return this.transcribeBargeInProbe(activeReference, probe, signal);\n },\n onEvidence: (playbackGeneration, decision) => {\n if (activeReference)\n this.publishBargeInEvidence(activeReference, playbackGeneration, decision.evidence, publish);\n },\n })\n : undefined;\n const session = new CaptureSession({\n recorder: this.recorder,\n config,\n spool,\n clock: this.clock,\n ...(this.recorder instanceof ClientPcmAudioRecorder\n ? { firstFrameTimeoutMs: CLIENT_FIRST_FRAME_TIMEOUT_MS }\n : {}),\n onFrame: (frame) => {\n if (activeReference) this.observeFrame(activeReference, frame, publish);\n },\n capture: {\n mode: command.mode,\n activityControl: command.mode === 'autonomous' ? 'client' : 'host',\n ...(command.mode === 'autonomous' ? { endpointSilenceMs: command.utteranceIdleMs } : {}),\n },\n onClientActivity: (activity, captureGeneration) => {\n if (activeReference) this.observeClientActivity(activeReference, activity, captureGeneration, publish);\n },\n shouldPersistPcm: () =>\n !this.isPlaybackSuppressed(command.sessionId) || activeReference?.bargeIn?.confirmed === true,\n onRecoveryExhausted: (_error, captureGeneration) => {\n const current = activeReference;\n if (\n !current ||\n this.active !== current ||\n current.spool.snapshotManifest().captureGeneration !== captureGeneration\n )\n return;\n current.finalized = true;\n current.endpoint.cancel();\n current.bargeIn?.stop();\n publish({\n kind: 'failure',\n code: 'recorder_recovery_exhausted',\n recoverable: false,\n sessionId: command.sessionId,\n captureId: command.captureId,\n turnId: command.turnId,\n });\n },\n onStateChange: (state) => {\n if (state === 'starting' || state === 'recovering')\n publish({\n kind: 'capture-state',\n sessionId: command.sessionId,\n captureId: command.captureId,\n state: 'starting',\n });\n },\n });\n const active: ActiveWorkerCapture = {\n command,\n config,\n selected,\n spool,\n session,\n transcriptionAbort: new AbortController(),\n ...(command.mode === 'autonomous'\n ? {\n vad: this.createVad(command.sessionId),\n ...(speechDetector ? { speechDetector } : {}),\n bargeIn,\n }\n : {}),\n endpoint: new AutonomousEndpoint(this.clock, (speechGeneration) => {\n if (activeReference) this.requestEndpoint(activeReference, publish, speechGeneration);\n }),\n endpointReported: false,\n clientActivityElapsedMs: -1,\n clientActivityEpoch: -1,\n clientActivityGeneration: 0,\n clientActivityObserved: false,\n clientActivitySpeechMs: 0,\n clientActivityEchoDiscriminatedSpeechMs: 0,\n clientClassifierSpeechMs: 0,\n clientEchoDiscriminatedSpeechMs: 0,\n hostClassifierSpeechMs: 0,\n bargeInClientClassifierBaselineMs: 0,\n bargeInEchoDiscriminatedBaselineMs: 0,\n bargeInHostClassifierBaselineMs: 0,\n bargeInEchoDiscriminationAvailable: false,\n playbackOverlapMs: 0,\n clientSpeechStarted: false,\n finalized: false,\n startedAt: this.clock.now(),\n nextActivityAt: this.clock.now(),\n };\n activeReference = active;\n this.active = active;\n if (frozenSnapshot) {\n active.finalized = true;\n publish({\n kind: 'drained',\n sessionId: command.sessionId,\n captureId: command.captureId,\n turnId: command.turnId,\n revision: frozenSnapshot.revision,\n });\n publish({\n kind: 'capture-state',\n sessionId: command.sessionId,\n captureId: command.captureId,\n state: 'processing',\n });\n await this.processSnapshot(active, frozenSnapshot, publish);\n return;\n }\n const playbackReference = this.activePlaybackReference;\n if (bargeIn && playbackReference?.active && playbackReference.referenceText) {\n bargeIn.begin(\n {\n generation: playbackReference.playbackGeneration,\n text: playbackReference.referenceText,\n startPhrases: playbackReference.startPhrases ?? [],\n stopPhrases: playbackReference.stopPhrases ?? [],\n },\n this.clock.now(),\n );\n }\n try {\n await session.start();\n } catch (error) {\n spool.remove();\n this.active = undefined;\n throw error;\n }\n publish({\n kind: 'capture-state',\n sessionId: command.sessionId,\n captureId: command.captureId,\n state: 'listening',\n });\n active.limitTimer = this.clock.setTimeout(() => {\n if (this.active !== active || active.finalized) return;\n if (command.mode === 'autonomous') {\n publish({\n kind: 'failure',\n code: 'capture_duration_limit',\n recoverable: true,\n sessionId: command.sessionId,\n captureId: command.captureId,\n turnId: command.turnId,\n });\n return;\n }\n void this.handle(\n {\n version: command.version,\n sequence: command.sequence,\n kind: 'finalize-capture',\n sessionId: command.sessionId,\n captureId: command.captureId,\n reason: 'duration-limit',\n },\n publish,\n );\n }, command.maxDurationMs);\n }\n\n private async finalize(\n command: Extract<VoiceWorkerCommand, { kind: 'finalize-capture' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> {\n const active = this.active;\n if (!active || !matchesCapture(active, command) || active.finalized) return;\n if (\n command.reason === 'soft-endpoint' &&\n (!active.endpointReported || active.endpointGeneration !== active.endpoint.speechGeneration)\n )\n return;\n active.finalized = true;\n if (active.limitTimer) this.clock.clear(active.limitTimer);\n active.endpoint.cancel();\n active.bargeIn?.stop();\n publish({\n kind: 'capture-state',\n sessionId: command.sessionId,\n captureId: command.captureId,\n state: 'draining',\n });\n const snapshot = await active.session.drain();\n publish({\n kind: 'drained',\n sessionId: command.sessionId,\n captureId: command.captureId,\n turnId: active.command.turnId,\n revision: snapshot.revision,\n });\n publish({\n kind: 'capture-state',\n sessionId: command.sessionId,\n captureId: command.captureId,\n state: 'processing',\n });\n await this.processSnapshot(active, snapshot, publish);\n }\n\n private async processSnapshot(\n active: ActiveWorkerCapture,\n snapshot: { revision: number; wavPath: string },\n publish: VoiceWorkerPublish,\n ): Promise<void> {\n if (this.active !== active || active.transcriptionAbort.signal.aborted) return;\n const transcription = await this.transcribe(active, snapshot.wavPath, snapshot.revision);\n const { outcome } = transcription;\n if (this.active !== active || active.transcriptionAbort.signal.aborted) return;\n if (outcome.kind === 'success') {\n publish({\n kind: 'transcript-candidate',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n turnId: active.command.turnId,\n revision: snapshot.revision,\n transcript: outcome.transcript,\n final: true,\n evidence: transcription.evidence,\n });\n return;\n }\n publish({\n kind: 'failure',\n code:\n outcome.kind === 'empty'\n ? 'empty_transcript'\n : outcome.kind === 'timeout'\n ? 'transcription_timed_out'\n : outcome.code,\n recoverable: outcome.kind === 'empty',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n turnId: active.command.turnId,\n revision: snapshot.revision,\n });\n }\n\n private observeFrame(active: ActiveWorkerCapture, frame: Buffer, publish: VoiceWorkerPublish): void {\n if (this.isPlaybackSuppressed(active.command.sessionId)) {\n if (active.bargeIn?.confirmed) {\n if (active.clientActivityState === undefined)\n this.observeAutonomousFrame(active, frame, publish, {\n playbackOverlapMs: PCM_FRAME_MS,\n narrationHandoff: true,\n });\n } else {\n if (active.clientActivityState === undefined) {\n const speechDetected = this.detectSpeech(active, frame);\n if (speechDetected === true) active.hostClassifierSpeechMs += PCM_FRAME_MS;\n }\n const ordinaryClassifierSpeechMs = Math.max(\n 0,\n active.clientClassifierSpeechMs - active.bargeInClientClassifierBaselineMs,\n active.hostClassifierSpeechMs - active.bargeInHostClassifierBaselineMs,\n );\n const trustedClassifierSpeechMs = active.bargeInEchoDiscriminationAvailable\n ? Math.max(0, active.clientEchoDiscriminatedSpeechMs - active.bargeInEchoDiscriminatedBaselineMs)\n : undefined;\n active.bargeIn?.observe(\n frame,\n this.clock.now(),\n active.vad?.noiseProfile,\n ordinaryClassifierSpeechMs,\n trustedClassifierSpeechMs !== undefined && trustedClassifierSpeechMs >= 300,\n );\n }\n return;\n }\n active.bargeIn?.reopenCleanLane();\n if (active.clientActivityState === undefined) this.observeAutonomousFrame(active, frame, publish);\n const now = this.clock.now();\n if (now < active.nextActivityAt) return;\n active.nextActivityAt = now + this.activityIntervalMs;\n const measuredDbfs = calculatePcmFrameDbfs(frame);\n const levelDbfs = Number.isFinite(measuredDbfs) ? measuredDbfs : -120;\n publish({\n kind: 'activity',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state:\n active.clientActivityState === 'speech'\n ? 'speech'\n : active.clientActivityState === undefined && active.vad?.hasPendingSpeech\n ? 'speech'\n : 'listening',\n elapsedMs: Math.max(0, now - active.startedAt),\n levelDbfs,\n speechProbability: Math.max(0, Math.min(1, (levelDbfs + 60) / 35)),\n });\n }\n\n private observeClientActivity(\n active: ActiveWorkerCapture,\n activity: VoiceMediaCaptureActivity,\n captureGeneration: number,\n publish: VoiceWorkerPublish,\n ): void {\n if (active.command.mode !== 'autonomous' || active.finalized) return;\n if (captureGeneration !== active.clientActivityGeneration) {\n this.invalidateEndpoint(active);\n active.clientActivityGeneration = captureGeneration;\n active.clientActivityElapsedMs = -1;\n active.clientActivityEpoch = -1;\n active.clientActivityState = undefined;\n active.clientActivityObserved = false;\n active.clientActivitySpeechMs = 0;\n active.clientActivityEchoDiscriminatedSpeechMs = 0;\n active.clientEchoDiscriminatedSpeechMs = 0;\n active.bargeInEchoDiscriminatedBaselineMs = 0;\n active.bargeInEchoDiscriminationAvailable = false;\n active.clientSpeechStarted = false;\n }\n const activityEpoch = activity.epoch ?? 0;\n if (activityEpoch < active.clientActivityEpoch) return;\n if (activityEpoch > active.clientActivityEpoch) {\n this.invalidateEndpoint(active);\n active.clientActivityEpoch = activityEpoch;\n active.clientActivityElapsedMs = -1;\n active.clientActivityState = undefined;\n active.clientActivitySpeechMs = 0;\n active.clientActivityEchoDiscriminatedSpeechMs = 0;\n active.clientEchoDiscriminatedSpeechMs = 0;\n active.bargeInEchoDiscriminatedBaselineMs = 0;\n active.bargeInEchoDiscriminationAvailable = false;\n if (!active.bargeIn?.confirmed) active.clientSpeechStarted = false;\n }\n if (\n activity.elapsedMs < active.clientActivityElapsedMs ||\n (active.clientActivityState !== undefined &&\n clientActivityOrder(activity.state) < clientActivityOrder(active.clientActivityState))\n )\n return;\n const previousElapsedMs = active.clientActivityElapsedMs;\n const previousSpeechMs = active.clientActivitySpeechMs;\n const previousEchoDiscriminatedSpeechMs = active.clientActivityEchoDiscriminatedSpeechMs;\n active.clientActivityElapsedMs = activity.elapsedMs;\n active.clientActivityState = activity.state;\n active.clientActivityObserved = true;\n const epochSpeechMs =\n activity.classifiedSpeechMs ??\n (activity.state === 'speech'\n ? previousSpeechMs +\n (previousElapsedMs < 0 ? 120 : Math.max(PCM_FRAME_MS, activity.elapsedMs - previousElapsedMs))\n : previousSpeechMs);\n if (epochSpeechMs >= previousSpeechMs) {\n active.clientClassifierSpeechMs += epochSpeechMs - previousSpeechMs;\n active.clientActivitySpeechMs = epochSpeechMs;\n }\n const epochEchoDiscriminatedSpeechMs = activity.echoDiscriminatedSpeechMs;\n if (\n epochEchoDiscriminatedSpeechMs !== undefined &&\n epochEchoDiscriminatedSpeechMs >= previousEchoDiscriminatedSpeechMs\n ) {\n active.clientEchoDiscriminatedSpeechMs += epochEchoDiscriminatedSpeechMs - previousEchoDiscriminatedSpeechMs;\n active.clientActivityEchoDiscriminatedSpeechMs = epochEchoDiscriminatedSpeechMs;\n if (this.isPlaybackSuppressed(active.command.sessionId) && !active.bargeIn?.confirmed)\n active.bargeInEchoDiscriminationAvailable = true;\n }\n publish({\n kind: 'activity',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state: activity.state === 'speech' ? 'speech' : 'listening',\n elapsedMs: activity.elapsedMs,\n levelDbfs: activity.levelDbfs,\n speechProbability: Math.max(0, Math.min(1, (activity.levelDbfs + 60) / 35)),\n });\n if (this.isPlaybackSuppressed(active.command.sessionId) && !active.bargeIn?.confirmed) return;\n if (activity.state === 'speech') {\n if (active.clientSpeechStarted) return;\n active.clientSpeechStarted = true;\n const manifest = active.spool.snapshotManifest();\n if (manifest.utteranceStartByte === undefined)\n active.spool.markUtteranceStart(Math.max(0, manifest.committedBytes - AUTONOMOUS_PRE_ROLL_BYTES));\n this.startSpeechGeneration(active);\n publish({\n kind: 'capture-state',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state: 'speech',\n });\n return;\n }\n if (activity.state !== 'endpoint' || !active.clientSpeechStarted || active.endpointReported) return;\n this.requestEndpoint(active, publish);\n }\n\n private observeAutonomousFrame(\n active: ActiveWorkerCapture,\n frame: Buffer,\n publish: VoiceWorkerPublish,\n metadata: { playbackOverlapMs?: number; narrationHandoff?: boolean } = {},\n persistedFrameEndByte = active.spool.snapshotManifest().committedBytes,\n ): void {\n if (!active.vad) return;\n const speechDetected = this.detectSpeech(active, frame);\n if (speechDetected === true) active.hostClassifierSpeechMs += PCM_FRAME_MS;\n const result = active.vad.push(frame, {\n ...metadata,\n ...(speechDetected === undefined ? {} : { speechDetected }),\n });\n this.rememberNoiseProfile(active.command.sessionId, active.vad.noiseProfile);\n if (result.speechStarted) {\n const manifest = active.spool.snapshotManifest();\n if (manifest.utteranceStartByte === undefined)\n active.spool.markUtteranceStart(Math.max(0, persistedFrameEndByte - AUTONOMOUS_PRE_ROLL_BYTES));\n this.startSpeechGeneration(active);\n publish({\n kind: 'capture-state',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state: 'speech',\n });\n }\n if (!result.segment) return;\n publish({\n kind: 'capture-state',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state: 'listening',\n });\n active.endpoint.speechEnded(active.command.utteranceIdleMs, {\n segmentClosed: true,\n forcedClose: result.segment.activityHistogram.forcedClose,\n trailingSilenceMs: result.segment.activityHistogram.trailingSilenceMs,\n });\n }\n\n private startSpeechGeneration(active: ActiveWorkerCapture): number {\n const speechGeneration = active.endpoint.speechStarted();\n active.endpointReported = false;\n delete active.endpointGeneration;\n return speechGeneration;\n }\n\n private invalidateEndpoint(active: ActiveWorkerCapture): void {\n active.endpoint.invalidate();\n active.endpointReported = false;\n delete active.endpointGeneration;\n }\n\n private requestEndpoint(\n active: ActiveWorkerCapture,\n publish: VoiceWorkerPublish,\n speechGeneration = active.endpoint.speechGeneration,\n ): void {\n if (\n this.active !== active ||\n active.command.mode !== 'autonomous' ||\n active.endpointReported ||\n speechGeneration !== active.endpoint.speechGeneration\n )\n return;\n active.endpointReported = true;\n active.endpointGeneration = speechGeneration;\n publish({\n kind: 'endpoint-reached',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n turnId: active.command.turnId,\n });\n }\n\n private async transcribe(\n active: ActiveWorkerCapture,\n audioPath: string,\n revision: number,\n ): Promise<{ outcome: TurnTranscriptionOutcome; evidence: VoiceTranscriptSignalEvidence }> {\n const manifest = active.spool.snapshotManifest();\n const pcm = active.spool.readCommittedPcm().subarray(manifest.utteranceStartByte ?? 0);\n const summary = analyzePcm16(pcm);\n const classifierSpeechMs = Math.max(active.clientClassifierSpeechMs, active.hostClassifierSpeechMs);\n const baseEvidence: VoiceTranscriptSignalEvidence = {\n durationMs: summary.durationMs,\n voicedMs: summary.voicedMs,\n classifierSpeechMs,\n rmsDbfs: summary.rmsDbfs,\n peakDbfs: summary.peakDbfs,\n signalVariationDb: summary.signalVariationDb,\n nonZeroRatio: summary.nonZeroRatio,\n gapCount: manifest.gapCount,\n playbackOverlapMs: active.playbackOverlapMs,\n classifier: active.clientActivityObserved ? 'client' : active.speechDetector ? 'host' : 'energy',\n };\n if (active.command.mode === 'autonomous' && isDeterministicNoSpeech(summary, classifierSpeechMs))\n return { outcome: { kind: 'empty' }, evidence: baseEvidence };\n\n const transcribePath = (targetPath: string, signal: AbortSignal): Promise<TranscriptionAdapterOutput> =>\n active.selected.adapter.transcribe({\n audioPath: targetPath,\n workspace: active.spool.directory,\n config: active.selected.config,\n language: active.config.language,\n signal,\n });\n const outcome = await this.turnTranscriber.transcribe({\n signal: active.transcriptionAbort.signal,\n timeoutMs: active.command.transcriptionTimeoutMs ?? DEFAULT_TRANSCRIPTION_TIMEOUT_MS,\n transcribe: (signal) => transcribePath(audioPath, signal),\n ...(summary.nonZeroSamples === 0\n ? {}\n : {\n retryNormalized: (signal: AbortSignal) => {\n const normalizedPath = path.join(active.spool.directory, `normalized-${revision}.wav`);\n writePrivatePcm16Wav(normalizedPath, normalizePcm16(pcm));\n return transcribePath(normalizedPath, signal);\n },\n }),\n });\n return {\n outcome,\n evidence: {\n ...baseEvidence,\n ...(outcome.kind === 'success' && outcome.evidence ? { asr: outcome.evidence } : {}),\n },\n };\n }\n\n private pruneAcknowledgedSpools(sessionId: string, currentTurnId: string): void {\n for (const [key, spool] of this.recovered) {\n const manifest = spool.snapshotManifest();\n if (\n manifest.sessionId === sessionId &&\n manifest.turnId !== currentTurnId &&\n manifest.acknowledgedRevision !== undefined\n ) {\n spool.remove();\n this.recovered.delete(key);\n }\n }\n }\n\n private recoverSpools(rootDirectory: string, publish: VoiceWorkerPublish): void {\n this.recovered.clear();\n if (!fs.existsSync(rootDirectory)) return;\n let recoveryFailureCount = 0;\n for (const entry of fs.readdirSync(rootDirectory, { withFileTypes: true })) {\n if (!entry.isDirectory() || !entry.name.startsWith('turn-')) continue;\n const spool = recoverTurnSpool(path.join(rootDirectory, entry.name));\n if (!spool) {\n recoveryFailureCount += 1;\n continue;\n }\n const manifest = spool.snapshotManifest();\n this.recovered.set(spoolKey(manifest), spool);\n if (manifest.acknowledgedRevision !== undefined && manifest.acknowledgedOutcome !== undefined) {\n publish({\n kind: 'candidate-acknowledged',\n sessionId: manifest.sessionId,\n captureId: manifest.captureId,\n turnId: manifest.turnId,\n revision: manifest.acknowledgedRevision,\n outcome: manifest.acknowledgedOutcome,\n });\n continue;\n }\n publish({\n kind: 'recovered',\n sessionId: manifest.sessionId,\n turnId: manifest.turnId,\n revision: manifest.revision,\n gapCount: manifest.gapCount,\n });\n }\n if (recoveryFailureCount > 0) {\n publish({ kind: 'failure', code: 'spool_recovery_failed', recoverable: true });\n }\n }\n\n private createVad(sessionId: string): AdaptiveVoiceActivityDetector {\n return new AdaptiveVoiceActivityDetector(undefined, this.sessionNoiseProfiles.get(sessionId));\n }\n\n private ensureSpeechDetector(): ISpeechPresenceDetector | undefined {\n if (this.speechDetectorUnavailable) return undefined;\n try {\n this.speechDetector ??= this.speechDetectorFactory();\n return this.speechDetector;\n } catch {\n this.markSpeechDetectorUnavailable();\n return undefined;\n }\n }\n\n private prepareSpeechDetector(): ISpeechPresenceDetector | undefined {\n const detector = this.ensureSpeechDetector();\n if (!detector) return undefined;\n try {\n detector.reset();\n return detector;\n } catch {\n this.markSpeechDetectorUnavailable();\n return undefined;\n }\n }\n\n private detectSpeech(active: ActiveWorkerCapture, frame: Buffer): boolean | undefined {\n if (!active.speechDetector) return undefined;\n try {\n return active.speechDetector.push(frame);\n } catch {\n this.disableSpeechDetector(active);\n return undefined;\n }\n }\n\n private resetVoiceActivity(active: ActiveWorkerCapture): void {\n active.vad?.reset();\n try {\n active.speechDetector?.reset();\n } catch {\n this.disableSpeechDetector(active);\n }\n }\n\n private disableSpeechDetector(active: ActiveWorkerCapture): void {\n delete active.speechDetector;\n this.markSpeechDetectorUnavailable();\n }\n\n private markSpeechDetectorUnavailable(): void {\n this.speechDetector = undefined;\n this.speechDetectorUnavailable = true;\n }\n\n private rememberNoiseProfile(sessionId: string, profile: VadNoiseProfile): void {\n this.sessionNoiseProfiles.delete(sessionId);\n this.sessionNoiseProfiles.set(sessionId, profile);\n while (this.sessionNoiseProfiles.size > MAX_SESSION_NOISE_PROFILES) {\n const oldestSessionId = this.sessionNoiseProfiles.keys().next().value;\n if (oldestSessionId === undefined) return;\n this.sessionNoiseProfiles.delete(oldestSessionId);\n }\n }\n\n private publishBargeInEvidence(\n active: ActiveWorkerCapture,\n playbackGeneration: number,\n evidence: NarrationBargeInEvidence,\n publish: VoiceWorkerPublish,\n ): void {\n if (\n this.active !== active ||\n active.finalized ||\n this.activePlaybackReference?.playbackGeneration !== playbackGeneration\n )\n return;\n publish({\n kind: 'barge-in-evidence',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n turnId: active.command.turnId,\n playbackGeneration,\n evidence,\n });\n }\n\n private promoteBargeIn(\n command: Extract<VoiceWorkerCommand, { kind: 'confirm-barge-in' }>,\n publish: VoiceWorkerPublish,\n ): void {\n const active = this.active;\n if (\n !active?.vad ||\n !matchesCapture(active, command) ||\n active.command.turnId !== command.turnId ||\n active.finalized\n )\n return;\n if (command.outcome === 'discard') {\n active.bargeIn?.discard(command.playbackGeneration);\n return;\n }\n const pcm = active.bargeIn?.promote(command.playbackGeneration);\n if (!pcm || pcm.length === 0) return;\n const committedBeforePromotion = active.spool.snapshotManifest().committedBytes;\n active.playbackOverlapMs += (pcm.length / PCM_FRAME_BYTES) * PCM_FRAME_MS;\n active.spool.append(pcm);\n this.resetVoiceActivity(active);\n if (active.clientActivityObserved) {\n const manifest = active.spool.snapshotManifest();\n if (manifest.utteranceStartByte === undefined) active.spool.markUtteranceStart(committedBeforePromotion);\n active.clientSpeechStarted = true;\n this.startSpeechGeneration(active);\n publish({\n kind: 'capture-state',\n sessionId: active.command.sessionId,\n captureId: active.command.captureId,\n state: 'speech',\n });\n if (active.clientActivityState === 'endpoint') this.requestEndpoint(active, publish);\n return;\n }\n active.hostClassifierSpeechMs = 0;\n for (let offset = 0; offset + PCM_FRAME_BYTES <= pcm.length; offset += PCM_FRAME_BYTES) {\n this.observeAutonomousFrame(\n active,\n pcm.subarray(offset, offset + PCM_FRAME_BYTES),\n publish,\n {\n playbackOverlapMs: PCM_FRAME_MS,\n narrationHandoff: true,\n },\n committedBeforePromotion + offset + PCM_FRAME_BYTES,\n );\n }\n }\n\n private async transcribeBargeInProbe(\n active: ActiveWorkerCapture,\n probe: NarrationBargeInProbe,\n signal: AbortSignal,\n ): Promise<string> {\n const workspace = fs.mkdtempSync(path.join(os.tmpdir(), 'doom-voice-barge-in-'));\n fs.chmodSync(workspace, 0o700);\n try {\n const audioPath = path.join(workspace, `probe-${probe.generation}-${probe.revision}.wav`);\n writePrivatePcm16Wav(audioPath, probe.pcm);\n const outcome = await this.turnTranscriber.transcribe({\n signal,\n timeoutMs: Math.min(\n active.command.transcriptionTimeoutMs ?? DEFAULT_TRANSCRIPTION_TIMEOUT_MS,\n BARGE_IN_PROBE_TIMEOUT_MS,\n ),\n transcribe: (ownedSignal) =>\n active.selected.adapter.transcribe({\n audioPath,\n workspace,\n config: active.selected.config,\n language: active.config.language,\n signal: ownedSignal,\n }),\n });\n return outcome.kind === 'success' ? outcome.transcript : '';\n } finally {\n fs.rmSync(workspace, { recursive: true, force: true });\n }\n }\n\n private updatePlaybackGate(command: Extract<VoiceWorkerCommand, { kind: 'playback-state' }>): void {\n const now = this.clock.now();\n const changed = this.playbackGate.update(command, now);\n if (!changed) return;\n this.activePlaybackReference = command.active ? { ...command } : undefined;\n const active = this.active;\n if (!active?.vad || active.command.sessionId !== command.sessionId) return;\n if (command.active) {\n active.bargeInClientClassifierBaselineMs = active.clientClassifierSpeechMs;\n active.bargeInEchoDiscriminatedBaselineMs = active.clientEchoDiscriminatedSpeechMs;\n active.bargeInHostClassifierBaselineMs = active.hostClassifierSpeechMs;\n active.bargeInEchoDiscriminationAvailable = false;\n this.resetVoiceActivity(active);\n this.invalidateEndpoint(active);\n if (command.referenceText)\n active.bargeIn?.begin(\n {\n generation: command.playbackGeneration,\n text: command.referenceText,\n startPhrases: command.startPhrases ?? [],\n stopPhrases: command.stopPhrases ?? [],\n },\n now,\n );\n else active.bargeIn?.stop();\n return;\n }\n active.bargeIn?.finish(command.playbackGeneration);\n if (active.bargeIn?.confirmed) return;\n this.resetVoiceActivity(active);\n this.invalidateEndpoint(active);\n }\n\n private isPlaybackSuppressed(sessionId: string): boolean {\n return this.playbackGate.suppresses(sessionId, this.clock.now());\n }\n\n private async cancelActive(): Promise<void> {\n const active = this.active;\n this.active = undefined;\n if (!active) return;\n if (active.limitTimer) this.clock.clear(active.limitTimer);\n active.endpoint.cancel();\n active.bargeIn?.stop();\n active.transcriptionAbort.abort();\n await active.session.abort();\n active.spool.remove();\n }\n}\n","import type { MessagePort } from 'node:worker_threads';\nimport { isMainThread, parentPort, workerData } from 'node:worker_threads';\n\nimport { connectVoiceWorkerMedia } from '../voiceWorkerMedia';\nimport { VoiceWorkerPipeline } from '../voiceWorkerPipeline';\nimport {\n parseVoiceWorkerCommand,\n type VoiceWorkerCommand,\n type VoiceWorkerEvent,\n type VoiceWorkerEventPayload,\n VOICE_WORKER_PROTOCOL_VERSION,\n} from '../voiceWorkerProtocol';\n\nconst HEARTBEAT_INTERVAL_MS = 1_000;\n\nexport type VoiceWorkerPublish = (event: VoiceWorkerEventPayload) => void;\n\nexport interface VoiceWorkerRuntimeHooks {\n initialize?(\n command: Extract<VoiceWorkerCommand, { kind: 'initialize' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> | void;\n capabilities?(): readonly string[];\n handle(\n command: Exclude<VoiceWorkerCommand, { kind: 'initialize' | 'shutdown' }>,\n publish: VoiceWorkerPublish,\n ): Promise<void> | void;\n shutdown(reason: 'session-shutdown' | 'extension-dispose'): Promise<void> | void;\n}\n\nexport interface VoiceWorkerRuntimeHandle {\n dispose(): Promise<void>;\n}\n\ninterface MessagePortLike {\n on(event: 'message', listener: (value: unknown) => void): this;\n off(event: 'message', listener: (value: unknown) => void): this;\n postMessage(value: VoiceWorkerEvent): void;\n close(): void;\n}\n\nfunction errorCode(error: unknown): string {\n if (error instanceof Error && error.message) return error.message.replace(/[^a-z0-9]+/giu, '_').toLowerCase();\n return 'voice_worker_command_failed';\n}\n\nfunction invalidControlMessageCode(error: unknown): string {\n if (!(error instanceof Error)) return 'invalid_control_message';\n if (error.message.startsWith('Unsupported voice worker protocol version:'))\n return 'invalid_control_message_protocol_version';\n const field = /^(?:Unexpected voice worker message field:|Voice worker field) ([a-zA-Z0-9_-]+)/u.exec(\n error.message,\n )?.[1];\n if (field) return `invalid_control_message_${field.replace(/[^a-z0-9]+/giu, '_').toLowerCase()}`;\n if (error.message.startsWith('Unsupported voice worker command:')) return 'invalid_control_message_command';\n if (error.message.includes('binary audio data')) return 'invalid_control_message_binary_audio';\n return 'invalid_control_message';\n}\n\nexport function startVoiceWorker(\n port: MessagePortLike = parentPort as MessagePort,\n hooks: VoiceWorkerRuntimeHooks = new VoiceWorkerPipeline(),\n): VoiceWorkerRuntimeHandle {\n if (!port) throw new Error('Voice worker requires a parent MessagePort.');\n\n const startedAt = Date.now();\n let eventSequence = 0;\n let initialized = false;\n let initializing = false;\n let disposed = false;\n let lastCommandSequence = -1;\n let heartbeat: ReturnType<typeof setInterval> | undefined;\n let disposePromise: Promise<void> | undefined;\n\n const publish = (event: VoiceWorkerEventPayload): void => {\n if (disposed) return;\n port.postMessage({\n ...event,\n version: VOICE_WORKER_PROTOCOL_VERSION,\n sequence: eventSequence,\n } as VoiceWorkerEvent);\n eventSequence += 1;\n };\n\n const stopHeartbeat = (): void => {\n if (!heartbeat) return;\n clearInterval(heartbeat);\n heartbeat = undefined;\n };\n\n const dispose = (reason: 'session-shutdown' | 'extension-dispose' = 'extension-dispose'): Promise<void> => {\n disposePromise ??= (async () => {\n disposed = true;\n stopHeartbeat();\n port.off('message', onMessage);\n await hooks.shutdown(reason);\n port.close();\n })();\n return disposePromise;\n };\n\n const onMessage = (value: unknown): void => {\n let command: VoiceWorkerCommand;\n try {\n command = parseVoiceWorkerCommand(value);\n } catch (error) {\n publish({ kind: 'failure', code: invalidControlMessageCode(error), recoverable: true });\n return;\n }\n\n if (command.sequence <= lastCommandSequence) {\n publish({ kind: 'failure', code: 'non_monotonic_sequence', recoverable: true });\n return;\n }\n lastCommandSequence = command.sequence;\n\n if (command.kind === 'initialize') {\n if (initialized || initializing) {\n publish({ kind: 'failure', code: 'already_initialized', recoverable: true });\n return;\n }\n initializing = true;\n void Promise.resolve(hooks.initialize?.(command, publish)).then(\n () => {\n initializing = false;\n if (disposed) return;\n initialized = true;\n publish({\n kind: 'ready',\n capabilities: [...(hooks.capabilities?.() ?? ['capture', 'transcription', 'durable-spool'])],\n });\n heartbeat = setInterval(() => {\n publish({ kind: 'heartbeat', workerUptimeMs: Math.max(0, Date.now() - startedAt) });\n }, HEARTBEAT_INTERVAL_MS);\n heartbeat.unref();\n },\n () => {\n initializing = false;\n if (disposed) return;\n publish({ kind: 'failure', code: 'initialization_failed', recoverable: false });\n },\n );\n return;\n }\n\n if (!initialized) {\n publish({ kind: 'failure', code: 'not_initialized', recoverable: true });\n return;\n }\n\n if (command.kind === 'shutdown') {\n void dispose(command.reason);\n return;\n }\n\n void Promise.resolve(hooks.handle(command, publish)).catch((error: unknown) => {\n publish({\n kind: 'failure',\n code: errorCode(error),\n recoverable: true,\n ...('sessionId' in command ? { sessionId: command.sessionId } : {}),\n ...('captureId' in command ? { captureId: command.captureId } : {}),\n ...('turnId' in command ? { turnId: command.turnId } : {}),\n ...('revision' in command ? { revision: command.revision } : {}),\n });\n });\n };\n\n port.on('message', onMessage);\n return { dispose };\n}\n\nif (!isMainThread) {\n const mediaPort = (workerData as { mediaPort?: MessagePort } | undefined)?.mediaPort;\n startVoiceWorker(\n parentPort as MessagePort,\n new VoiceWorkerPipeline(mediaPort ? { clientMedia: connectVoiceWorkerMedia(mediaPort) } : {}),\n );\n}\n"],"mappings":"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"}
|