@backbay/glia-agent 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/audio/types.ts","../src/audio/schema.ts","../src/audio/planner.ts","../src/audio/overlay.ts","../src/audio/providers/httpSpeechSynthesisProvider.ts","../src/audio/hooks/useAudioPlayer.ts","../src/audio/hooks/useBargeIn.ts","../src/audio/hooks/useSpeechSynthesis.ts","../src/audio/hooks/useAudioOverlay.ts","../src/audio/hooks/useHybridSpeech.ts"],"sourcesContent":["import type { AVO } from '../emotion/types.js';\n\n// =============================================================================\n// Core Types\n// =============================================================================\n\nexport type AudioFormat = 'wav' | 'pcm_s16le' | 'opus' | 'mp3' | 'flac';\n\nexport type VoiceLicenseCategory = 'cc0' | 'cc-by' | 'cc-by-nc' | 'custom' | 'unknown';\n\nexport const DEFAULT_TARGET_AVO: AVO = {\n // Match the emotion system's \"idle\" anchor for a stable neutral baseline.\n arousal: 0.25,\n valence: 0.6,\n openness: 0.35,\n};\n\nexport interface VoiceCatalogEntry {\n voiceId: string;\n displayName?: string;\n language?: string;\n tags?: string[];\n licenseCategory: VoiceLicenseCategory;\n licenseText?: string;\n source?: string;\n}\n\nexport interface VoiceCatalog {\n get: (voiceId: string) => VoiceCatalogEntry | null;\n list: () => VoiceCatalogEntry[];\n}\n\n// =============================================================================\n// Policy\n// =============================================================================\n\nexport interface AudioPolicy {\n safetyMode: boolean;\n trustTier?: string;\n voiceCloningAllowed: boolean;\n\n /**\n * If true, callers should avoid playing unverified audio.\n * Typically derived from trust tier and safety mode.\n */\n requireProofBeforePlayback?: boolean;\n\n /**\n * Optional allowlist; if set, speech plans must use one of these voice IDs.\n */\n allowedVoiceIds?: string[];\n}\n\n// =============================================================================\n// Planning + Synthesis\n// =============================================================================\n\nexport type AudioPlannerMode =\n | 'idle'\n | 'listening'\n | 'deliberating'\n | 'acting'\n | 'explaining'\n | 'recovering'\n | 'blocked';\n\nexport interface SpeechControls {\n /**\n * Expressiveness/diversity knob, when supported by the backend.\n * Recommended range: 0..1 (provider may map differently).\n */\n temperature?: number;\n\n /**\n * Decode quality / steps knob, when supported by the backend.\n */\n quality?: number;\n\n /**\n * Free-form provider-specific controls.\n */\n [key: string]: unknown;\n}\n\nexport interface SpeechSynthesisRequest {\n traceId: string;\n runId?: string;\n\n text: string;\n language?: string;\n\n voiceId: string;\n targetAffect: AVO;\n controls?: SpeechControls;\n\n /**\n * Optional client policy context. Including this enables the server to emit a more accurate\n * `AudioProof.manifest.policy` without having to guess.\n */\n policy?: {\n safetyMode: boolean;\n trustTier?: string;\n voiceCloningAllowed: boolean;\n };\n}\n\nexport interface AudioArtifact {\n id: string;\n uri?: string;\n format: AudioFormat;\n sha256: string;\n durationMs: number;\n sampleRateHz?: number;\n channels?: number;\n}\n\nexport interface SpeechSynthesisResult {\n audio: Blob;\n artifact: AudioArtifact;\n proof?: AudioProof;\n}\n\nexport interface SpeechSynthesisProvider {\n providerId: string;\n synthesizeSpeech: (\n request: SpeechSynthesisRequest,\n options?: { signal?: AbortSignal }\n ) => Promise<SpeechSynthesisResult>;\n}\n\nexport interface AudioVerifier {\n verifierId: string;\n verifySpeech: (args: {\n request: SpeechSynthesisRequest;\n result: SpeechSynthesisResult;\n policy: AudioPolicy;\n }) => Promise<AudioProof>;\n}\n\n// =============================================================================\n// AudioProof (verification-first artifact)\n// =============================================================================\n\nexport interface AudioGateResult {\n passed: boolean;\n metrics?: Record<string, unknown>;\n reason?: string;\n}\n\nexport interface AudioGates {\n quality: AudioGateResult;\n semantic: AudioGateResult;\n affect: AudioGateResult;\n\n multimodalConsistency?: AudioGateResult;\n watermark?: AudioGateResult;\n speakerConsistency?: AudioGateResult;\n antiSpoof?: AudioGateResult;\n mos?: AudioGateResult;\n safetyText?: AudioGateResult;\n safetyAudio?: AudioGateResult;\n}\n\nexport interface EvidenceRef {\n type: 'run' | 'run_receipt' | 'artifact' | 'ui';\n runId?: string;\n receiptHash?: string;\n path?: string;\n digest?: string;\n componentId?: string;\n note?: string;\n}\n\nexport interface AudioProof {\n version: '1.0';\n createdAt: string;\n\n manifest: {\n traceId?: string;\n runId?: string;\n text: string;\n language?: string;\n targetAffect: AVO;\n policy: {\n safetyMode: boolean;\n trustTier?: string;\n voiceCloningAllowed: boolean;\n };\n cognitionSnapshot?: {\n snapshotVersion?: string;\n snapshotId?: string;\n [key: string]: unknown;\n };\n };\n\n proof: {\n synthesis: {\n providerId: string;\n model: {\n id: string;\n revision?: string;\n sha256?: string;\n };\n voice: {\n voiceId: string;\n licenseCategory: VoiceLicenseCategory;\n licenseText?: string;\n source?: string;\n };\n controls?: SpeechControls;\n seed?: number;\n };\n\n attempts?: Array<{\n attempt: number;\n artifactRef: string;\n notes?: string;\n gates: AudioGates;\n }>;\n\n artifacts: AudioArtifact[];\n gates: AudioGates;\n evidence?: EvidenceRef[];\n };\n\n verdict: {\n passed: boolean;\n reason?: string;\n score?: number;\n };\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nexport function clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function createTraceId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return `trace_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n}\n","/**\n * Zod schemas for audio proof validation.\n *\n * This is the runtime counterpart of `docs/schemas/audio-proof.schema.json`.\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Enums\n// =============================================================================\n\nexport const AudioProofVersionSchema = z.enum(['1.0']);\nexport const AudioFormatSchema = z.enum(['wav', 'pcm_s16le', 'opus', 'mp3', 'flac']);\nexport const VoiceLicenseCategorySchema = z.enum(['cc0', 'cc-by', 'cc-by-nc', 'custom', 'unknown']);\n\n// =============================================================================\n// Nested Schemas\n// =============================================================================\n\nexport const AvoSchema = z.object({\n valence: z.number().min(0).max(1),\n arousal: z.number().min(0).max(1),\n openness: z.number().min(0).max(1),\n});\n\nexport const AudioArtifactSchema = z.object({\n id: z.string().min(1),\n uri: z.string().optional(),\n format: AudioFormatSchema,\n sha256: z.string().min(32),\n sampleRateHz: z.number().int().min(8000).optional(),\n channels: z.number().int().min(1).max(8).optional(),\n durationMs: z.number().int().min(1),\n});\n\nexport const AudioGateResultSchema = z.object({\n passed: z.boolean(),\n metrics: z.record(z.string(), z.unknown()).optional(),\n reason: z.string().optional(),\n});\n\nexport const AudioGatesSchema = z.object({\n quality: AudioGateResultSchema,\n semantic: AudioGateResultSchema,\n affect: AudioGateResultSchema,\n\n multimodalConsistency: AudioGateResultSchema.optional(),\n watermark: AudioGateResultSchema.optional(),\n speakerConsistency: AudioGateResultSchema.optional(),\n antiSpoof: AudioGateResultSchema.optional(),\n mos: AudioGateResultSchema.optional(),\n safetyText: AudioGateResultSchema.optional(),\n safetyAudio: AudioGateResultSchema.optional(),\n});\n\nexport const EvidenceRefSchema = z.object({\n type: z.enum(['run', 'run_receipt', 'artifact', 'ui']),\n runId: z.string().optional(),\n receiptHash: z.string().optional(),\n path: z.string().optional(),\n digest: z.string().optional(),\n componentId: z.string().optional(),\n note: z.string().optional(),\n});\n\n// =============================================================================\n// Main Schema\n// =============================================================================\n\nexport const AudioProofSchema = z.object({\n version: AudioProofVersionSchema,\n createdAt: z.string().datetime(),\n\n manifest: z.object({\n traceId: z.string().optional(),\n runId: z.string().optional(),\n text: z.string().min(1),\n language: z.string().optional(),\n targetAffect: AvoSchema,\n policy: z.object({\n safetyMode: z.boolean(),\n trustTier: z.string().optional(),\n voiceCloningAllowed: z.boolean(),\n }),\n cognitionSnapshot: z.record(z.string(), z.unknown()).optional(),\n }),\n\n proof: z.object({\n synthesis: z.object({\n providerId: z.string().min(1),\n model: z.object({\n id: z.string().min(1),\n revision: z.string().optional(),\n sha256: z.string().optional(),\n }),\n voice: z.object({\n voiceId: z.string().min(1),\n licenseCategory: VoiceLicenseCategorySchema,\n licenseText: z.string().optional(),\n source: z.string().optional(),\n }),\n controls: z.record(z.string(), z.unknown()).optional(),\n seed: z.number().int().min(0).optional(),\n }),\n\n attempts: z\n .array(\n z.object({\n attempt: z.number().int().min(1),\n artifactRef: z.string().min(1),\n notes: z.string().optional(),\n gates: AudioGatesSchema,\n })\n )\n .optional(),\n\n artifacts: z.array(AudioArtifactSchema).min(1),\n gates: AudioGatesSchema,\n evidence: z.array(EvidenceRefSchema).optional(),\n }),\n\n verdict: z.object({\n passed: z.boolean(),\n reason: z.string().optional(),\n score: z.number().optional(),\n }),\n});\n\nexport type AudioProofInput = z.input<typeof AudioProofSchema>;\nexport type AudioProofOutput = z.output<typeof AudioProofSchema>;\n\nexport type AudioProofValidationResult =\n | { success: true; data: AudioProofOutput }\n | { success: false; errors: z.ZodError };\n\nexport function validateAudioProof(audioProof: unknown): AudioProofValidationResult {\n const result = AudioProofSchema.safeParse(audioProof);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n\n","import type { AVO } from '../emotion/types.js';\nimport type { CognitionState } from '../cognition/types.js';\nimport type {\n AudioPolicy,\n AudioPlannerMode,\n SpeechControls,\n SpeechSynthesisRequest,\n VoiceCatalog,\n} from './types.js';\nimport { clamp01, createTraceId, DEFAULT_TARGET_AVO } from './types.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AudioPlannerSignals {\n mode?: AudioPlannerMode;\n personaDriftRisk?: number;\n confidence?: number;\n risk?: number;\n}\n\nexport interface AudioPlannerInput {\n text: string;\n language?: string;\n runId?: string;\n\n targetAffect?: AVO;\n\n policy: AudioPolicy;\n voices: VoiceCatalog;\n\n signals?: AudioPlannerSignals;\n defaults?: {\n voiceId?: string;\n groundedVoiceTag?: string;\n defaultVoiceTag?: string;\n temperature?: number;\n };\n}\n\n// =============================================================================\n// Planning Helpers\n// =============================================================================\n\nfunction pickFirstAllowedVoiceId(voices: VoiceCatalog, allowedVoiceIds?: string[]): string | null {\n const list = voices.list();\n for (const entry of list) {\n if (!allowedVoiceIds || allowedVoiceIds.includes(entry.voiceId)) {\n return entry.voiceId;\n }\n }\n return null;\n}\n\nfunction pickVoiceId(args: {\n voices: VoiceCatalog;\n allowedVoiceIds?: string[];\n preferredVoiceId?: string;\n requiredTag?: string;\n}): string | null {\n const { voices, allowedVoiceIds, preferredVoiceId, requiredTag } = args;\n\n if (preferredVoiceId) {\n const entry = voices.get(preferredVoiceId);\n if (entry && (!allowedVoiceIds || allowedVoiceIds.includes(entry.voiceId))) {\n if (!requiredTag || (entry.tags ?? []).includes(requiredTag)) {\n return entry.voiceId;\n }\n }\n }\n\n for (const entry of voices.list()) {\n if (allowedVoiceIds && !allowedVoiceIds.includes(entry.voiceId)) continue;\n if (requiredTag && !(entry.tags ?? []).includes(requiredTag)) continue;\n return entry.voiceId;\n }\n\n return null;\n}\n\nfunction stripExcessPunctuation(text: string): string {\n return (\n text\n // Collapse repeated punctuation which can cause prosody weirdness.\n .replace(/[!?]{2,}/g, (m) => m[0] ?? '!')\n .replace(/\\.{3,}/g, '…')\n );\n}\n\nfunction clampTextForSafetyMode(text: string): string {\n // Keep semantics unchanged; only reduce overly-emphatic punctuation.\n return stripExcessPunctuation(text).replace(/!/g, '.');\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Default planner for Architecture A (modular pipeline).\n *\n * Produces a `SpeechSynthesisRequest` that a self-hosted backend can execute.\n */\nexport function planSpeech(input: AudioPlannerInput): SpeechSynthesisRequest {\n const {\n text,\n language,\n runId,\n targetAffect,\n policy,\n voices,\n signals,\n defaults,\n } = input;\n\n const personaDriftRisk = clamp01(signals?.personaDriftRisk ?? 0);\n const confidence = clamp01(signals?.confidence ?? 0.8);\n const risk = clamp01(signals?.risk ?? (1 - confidence));\n\n const groundedVoiceTag = defaults?.groundedVoiceTag ?? 'grounded';\n const defaultVoiceTag = defaults?.defaultVoiceTag ?? 'default';\n\n const requireGrounded =\n policy.safetyMode || personaDriftRisk >= 0.6 || (risk >= 0.7 && confidence <= 0.5);\n\n const voiceId =\n (requireGrounded\n ? pickVoiceId({\n voices,\n allowedVoiceIds: policy.allowedVoiceIds,\n preferredVoiceId: defaults?.voiceId,\n requiredTag: groundedVoiceTag,\n })\n : pickVoiceId({\n voices,\n allowedVoiceIds: policy.allowedVoiceIds,\n preferredVoiceId: defaults?.voiceId,\n requiredTag: defaultVoiceTag,\n })) ??\n pickVoiceId({\n voices,\n allowedVoiceIds: policy.allowedVoiceIds,\n preferredVoiceId: defaults?.voiceId,\n }) ??\n pickFirstAllowedVoiceId(voices, policy.allowedVoiceIds);\n\n if (!voiceId) {\n throw new Error('No available voices (voice catalog is empty or policy blocks all voices)');\n }\n\n const baseTemperature = clamp01(defaults?.temperature ?? 0.65);\n const temperature = requireGrounded ? Math.min(baseTemperature, 0.25) : baseTemperature;\n\n const controls: SpeechControls = {\n temperature,\n };\n\n const plannedText =\n policy.safetyMode || personaDriftRisk >= 0.7\n ? clampTextForSafetyMode(text)\n : stripExcessPunctuation(text);\n\n return {\n traceId: createTraceId(),\n runId,\n text: plannedText,\n language,\n voiceId,\n targetAffect: targetAffect ?? DEFAULT_TARGET_AVO,\n controls,\n policy: {\n safetyMode: policy.safetyMode,\n trustTier: policy.trustTier,\n voiceCloningAllowed: policy.voiceCloningAllowed,\n },\n };\n}\n\n// =============================================================================\n// CognitionState Integration\n// =============================================================================\n\nexport interface AudioPlannerCognitionInput {\n text: string;\n language?: string;\n runId?: string;\n targetAffect?: AVO;\n cognition: CognitionState;\n policy: AudioPolicy;\n voices: VoiceCatalog;\n defaults?: {\n voiceId?: string;\n groundedVoiceTag?: string;\n defaultVoiceTag?: string;\n temperature?: number;\n };\n}\n\n/**\n * Plan speech from full CognitionState.\n * Extracts relevant signals and delegates to planSpeech.\n */\nexport function planSpeechFromCognition(\n input: AudioPlannerCognitionInput\n): SpeechSynthesisRequest {\n const { cognition, ...rest } = input;\n\n const signals: AudioPlannerSignals = {\n mode: cognition.mode,\n personaDriftRisk: cognition.personaDriftRisk,\n confidence: cognition.confidence,\n risk: cognition.risk,\n };\n\n const targetAffect = rest.targetAffect ?? cognition.emotionAVO;\n\n return planSpeech({\n ...rest,\n targetAffect,\n signals,\n });\n}\n","export type OverlayToken =\n | 'ack'\n | 'hold'\n | 'done'\n | 'error'\n | 'warning';\n\nexport type OverlayPhraseLibrary = Record<OverlayToken, string[]>;\n\nexport const DEFAULT_OVERLAY_PHRASES: OverlayPhraseLibrary = {\n ack: ['Got it.', 'Okay.', 'Understood.'],\n hold: ['One moment.', 'Give me a second.', 'Hang on.'],\n done: ['Done.', 'All set.', 'Finished.'],\n error: ['I hit an error.', 'Something went wrong.', 'I ran into a problem.'],\n warning: ['Careful.', 'Heads up.', 'Just a note.'],\n};\n\nexport function pickOverlayPhrase(args: {\n token: OverlayToken;\n library?: Partial<OverlayPhraseLibrary>;\n index?: number;\n}): string {\n const { token, library, index = 0 } = args;\n\n const phrases = library?.[token] ?? DEFAULT_OVERLAY_PHRASES[token];\n if (!phrases || phrases.length === 0) {\n return DEFAULT_OVERLAY_PHRASES[token][0];\n }\n\n return phrases[index % phrases.length] ?? phrases[0]!;\n}\n\n","import { validateAudioProof } from '../schema.js';\nimport type { AudioArtifact, AudioProof, SpeechSynthesisProvider, SpeechSynthesisRequest, SpeechSynthesisResult } from '../types.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface HttpSpeechSynthesisProviderOptions {\n baseUrl: string;\n headers?: Record<string, string>;\n\n /**\n * Endpoint path for synthesis.\n *\n * Expected behavior:\n * - Returns JSON containing:\n * - `audioBase64` (optional) OR `audioUrl` (optional)\n * - `artifact` (required): { id, format, sha256, durationMs, ... }\n * - `proof` (optional): AudioProof (validated if present)\n */\n synthPath?: string;\n}\n\nexport interface HttpSynthesisResponse {\n audioBase64?: string;\n audioUrl?: string;\n artifact: AudioArtifact;\n proof?: AudioProof;\n}\n\n// =============================================================================\n// Provider\n// =============================================================================\n\nexport class HttpSpeechSynthesisProvider implements SpeechSynthesisProvider {\n public readonly providerId = 'http';\n\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly synthPath: string;\n\n constructor(options: HttpSpeechSynthesisProviderOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.headers = options.headers ?? {};\n this.synthPath = options.synthPath ?? '/v1/tts';\n }\n\n async synthesizeSpeech(\n request: SpeechSynthesisRequest,\n options?: { signal?: AbortSignal }\n ): Promise<SpeechSynthesisResult> {\n const response = await fetch(`${this.baseUrl}${this.synthPath}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(request),\n signal: options?.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`TTS request failed: HTTP ${response.status} ${response.statusText}${text ? ` - ${text}` : ''}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n\n // Allow audio responses directly (e.g. audio/wav). Artifact/proof are then unknown.\n if (contentType.startsWith('audio/') || contentType === 'application/octet-stream') {\n throw new Error(\n 'TTS endpoint returned raw audio bytes; bb-ui requires a JSON response with artifact metadata for verification-first operation'\n );\n }\n\n const payload = (await response.json()) as HttpSynthesisResponse;\n\n if (!payload?.artifact?.id || !payload?.artifact?.sha256 || !payload?.artifact?.durationMs) {\n throw new Error('TTS endpoint response missing required `artifact` fields');\n }\n\n const audio = await this.resolveAudio(payload);\n\n let proof: AudioProof | undefined = payload.proof;\n if (proof) {\n const parsed = validateAudioProof(proof);\n if (!parsed.success) {\n throw new Error('Invalid AudioProof from TTS endpoint');\n }\n proof = parsed.data as AudioProof;\n }\n\n return {\n audio,\n artifact: payload.artifact,\n proof,\n };\n }\n\n private async resolveAudio(payload: HttpSynthesisResponse): Promise<Blob> {\n if (payload.audioBase64) {\n const bytes =\n typeof atob !== 'undefined'\n ? (() => {\n const byteString = atob(payload.audioBase64 ?? '');\n const arr = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n arr[i] = byteString.charCodeAt(i);\n }\n return arr;\n })()\n : (() => {\n const BufferCtor = (globalThis as unknown as { Buffer?: { from: (s: string, enc: string) => Uint8Array } })\n .Buffer;\n if (!BufferCtor) {\n throw new Error('Base64 decoding is not supported in this environment');\n }\n return Uint8Array.from(BufferCtor.from(payload.audioBase64, 'base64'));\n })();\n return new Blob([bytes], { type: 'audio/wav' });\n }\n\n if (payload.audioUrl) {\n const res = await fetch(payload.audioUrl);\n if (!res.ok) {\n throw new Error(`Failed to fetch audioUrl: HTTP ${res.status}`);\n }\n return await res.blob();\n }\n\n throw new Error('TTS endpoint response missing `audioBase64` or `audioUrl`');\n }\n}\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseAudioPlayerOptions {\n volume?: number;\n onEnded?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseAudioPlayerReturn {\n isPlaying: boolean;\n error: string | null;\n play: (source: Blob | string) => Promise<void>;\n stop: () => void;\n audioElement: HTMLAudioElement | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useAudioPlayer(options: UseAudioPlayerOptions = {}): UseAudioPlayerReturn {\n const { volume = 1, onEnded, onError } = options;\n\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const objectUrlRef = useRef<string | null>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Ensure we have an audio element.\n if (!audioRef.current && typeof Audio !== 'undefined') {\n audioRef.current = new Audio();\n }\n\n const stop = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n try {\n audio.pause();\n audio.currentTime = 0;\n } catch {\n // Ignore.\n } finally {\n setIsPlaying(false);\n }\n }, []);\n\n const play = useCallback(\n async (source: Blob | string) => {\n const audio = audioRef.current;\n if (!audio) {\n throw new Error('Audio playback not supported in this environment');\n }\n\n setError(null);\n\n // Clean up previous object URL.\n if (objectUrlRef.current) {\n URL.revokeObjectURL(objectUrlRef.current);\n objectUrlRef.current = null;\n }\n\n const src = typeof source === 'string' ? source : URL.createObjectURL(source);\n if (typeof source !== 'string') {\n objectUrlRef.current = src;\n }\n\n audio.volume = volume;\n audio.src = src;\n\n try {\n await audio.play();\n setIsPlaying(true);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to play audio';\n setIsPlaying(false);\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n throw err instanceof Error ? err : new Error(message);\n }\n },\n [volume, onError]\n );\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handleEnded = () => {\n setIsPlaying(false);\n onEnded?.();\n };\n\n const handleError = () => {\n setIsPlaying(false);\n const message = 'Audio element error';\n setError(message);\n onError?.(new Error(message));\n };\n\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('error', handleError);\n\n return () => {\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('error', handleError);\n };\n }, [onEnded, onError]);\n\n useEffect(() => {\n return () => {\n stop();\n if (objectUrlRef.current) {\n URL.revokeObjectURL(objectUrlRef.current);\n objectUrlRef.current = null;\n }\n };\n }, [stop]);\n\n return {\n isPlaying,\n error,\n play,\n stop,\n audioElement: audioRef.current,\n };\n}\n\n","import { useEffect, useRef, useState } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseBargeInOptions {\n /**\n * Microphone or remote user stream.\n * You must request user consent in the host app (getUserMedia) and pass it in.\n */\n stream: MediaStream | null;\n\n enabled?: boolean;\n\n /**\n * RMS threshold in 0..1.\n * Typical values are small; start around 0.02 and calibrate per environment.\n */\n threshold?: number;\n\n /**\n * Keep \"speaking\" true for this long after signal drops below threshold.\n */\n hangoverMs?: number;\n\n /**\n * Called on the rising edge (silence -> speaking).\n */\n onBargeIn?: () => void;\n}\n\nexport interface UseBargeInReturn {\n isUserSpeaking: boolean;\n levelRms: number;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useBargeIn(options: UseBargeInOptions): UseBargeInReturn {\n const { stream, enabled = true, threshold = 0.02, hangoverMs = 250, onBargeIn } = options;\n\n const [isUserSpeaking, setIsUserSpeaking] = useState(false);\n const [levelRms, setLevelRms] = useState(0);\n\n const rafRef = useRef<number | null>(null);\n const lastAboveRef = useRef<number>(0);\n const prevSpeakingRef = useRef(false);\n\n useEffect(() => {\n if (!enabled || !stream) {\n setIsUserSpeaking(false);\n setLevelRms(0);\n return;\n }\n\n if (typeof AudioContext === 'undefined') {\n // Cannot compute RMS without Web Audio; degrade gracefully.\n return;\n }\n\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 2048;\n source.connect(analyser);\n\n const buffer = new Float32Array(analyser.fftSize);\n\n const tick = () => {\n analyser.getFloatTimeDomainData(buffer);\n let sum = 0;\n for (let i = 0; i < buffer.length; i++) {\n const x = buffer[i];\n sum += x * x;\n }\n const rms = Math.sqrt(sum / buffer.length);\n setLevelRms(rms);\n\n const now = performance.now();\n\n if (rms >= threshold) {\n lastAboveRef.current = now;\n }\n\n const speaking = rms >= threshold || now - lastAboveRef.current <= hangoverMs;\n setIsUserSpeaking(speaking);\n\n if (!prevSpeakingRef.current && speaking) {\n onBargeIn?.();\n }\n prevSpeakingRef.current = speaking;\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n\n return () => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n try {\n source.disconnect();\n analyser.disconnect();\n } catch {\n // Ignore.\n }\n audioContext.close().catch(() => {});\n };\n }, [stream, enabled, threshold, hangoverMs, onBargeIn]);\n\n return { isUserSpeaking, levelRms };\n}\n\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { AVO } from '../../emotion/types.js';\nimport { planSpeech, type AudioPlannerSignals } from '../planner.js';\nimport { validateAudioProof } from '../schema.js';\nimport type {\n AudioPolicy,\n AudioProof,\n AudioVerifier,\n SpeechSynthesisProvider,\n SpeechSynthesisRequest,\n SpeechSynthesisResult,\n VoiceCatalog,\n} from '../types.js';\nimport { useAudioPlayer } from './useAudioPlayer.js';\nimport { useBargeIn } from './useBargeIn.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseSpeechSynthesisOptions {\n provider: SpeechSynthesisProvider;\n verifier?: AudioVerifier;\n\n voices: VoiceCatalog;\n policy: AudioPolicy;\n\n signals?: AudioPlannerSignals;\n defaults?: {\n voiceId?: string;\n groundedVoiceTag?: string;\n defaultVoiceTag?: string;\n temperature?: number;\n };\n\n /**\n * If provided, enables barge-in (user speech cancels synthesis and playback).\n */\n bargeIn?: {\n stream: MediaStream | null;\n threshold?: number;\n hangoverMs?: number;\n };\n\n /**\n * Playback volume 0..1\n */\n volume?: number;\n\n /**\n * Controls when verification happens.\n *\n * - \"before_playback\": verify first; only play if verified (best for high-trust lanes)\n * - \"after_playback\": play immediately; verify in background (best UX when trust allows)\n * - \"never\": do not verify (not recommended)\n *\n * Default: derived from policy (`requireProofBeforePlayback`).\n */\n verificationMode?: 'before_playback' | 'after_playback' | 'never';\n\n onProof?: (proof: AudioProof) => void;\n onBargeIn?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface SpeakOptions {\n runId?: string;\n language?: string;\n targetAffect?: AVO;\n}\n\nexport interface UseSpeechSynthesisReturn {\n isSynthesizing: boolean;\n isSpeaking: boolean;\n error: string | null;\n\n lastRequest: SpeechSynthesisRequest | null;\n lastResult: SpeechSynthesisResult | null;\n lastProof: AudioProof | null;\n\n speak: (text: string, options?: SpeakOptions) => Promise<void>;\n cancel: () => void;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useSpeechSynthesis(options: UseSpeechSynthesisOptions): UseSpeechSynthesisReturn {\n const {\n provider,\n verifier,\n voices,\n policy,\n signals,\n defaults,\n bargeIn,\n volume = 1,\n verificationMode,\n onProof,\n onBargeIn,\n onError,\n } = options;\n\n const effectiveVerificationMode = useMemo(() => {\n if (verificationMode) return verificationMode;\n if (policy.requireProofBeforePlayback) return 'before_playback';\n if (verifier) return 'after_playback';\n return 'never';\n }, [verificationMode, policy.requireProofBeforePlayback, verifier]);\n\n const abortRef = useRef<AbortController | null>(null);\n\n const [isSynthesizing, setIsSynthesizing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [lastRequest, setLastRequest] = useState<SpeechSynthesisRequest | null>(null);\n const [lastResult, setLastResult] = useState<SpeechSynthesisResult | null>(null);\n const [lastProof, setLastProof] = useState<AudioProof | null>(null);\n\n const player = useAudioPlayer({\n volume,\n onError: (err) => {\n setError(err.message);\n onError?.(err);\n },\n });\n\n const bargeInState = useBargeIn({\n stream: bargeIn?.stream ?? null,\n enabled: !!bargeIn?.stream,\n threshold: bargeIn?.threshold,\n hangoverMs: bargeIn?.hangoverMs,\n onBargeIn: () => {\n onBargeIn?.();\n },\n });\n\n const cancel = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setIsSynthesizing(false);\n player.stop();\n }, [player]);\n\n useEffect(() => {\n if (!bargeIn?.stream) return;\n if (!bargeInState.isUserSpeaking) return;\n\n cancel();\n }, [bargeIn?.stream, bargeInState.isUserSpeaking, cancel]);\n\n const speak = useCallback(\n async (text: string, speakOptions?: SpeakOptions) => {\n cancel();\n setError(null);\n setIsSynthesizing(true);\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n try {\n const request = planSpeech({\n text,\n language: speakOptions?.language,\n runId: speakOptions?.runId,\n targetAffect: speakOptions?.targetAffect,\n policy,\n voices,\n signals,\n defaults,\n });\n\n setLastRequest(request);\n\n const result = await provider.synthesizeSpeech(request, { signal: controller.signal });\n setLastResult(result);\n\n // If provider included proof, validate it before trusting it.\n let proof: AudioProof | undefined = result.proof;\n if (proof) {\n const parsed = validateAudioProof(proof);\n if (!parsed.success) {\n throw new Error('Provider returned invalid AudioProof');\n }\n proof = parsed.data as AudioProof;\n }\n\n const verifyNow =\n effectiveVerificationMode === 'before_playback' &&\n (!proof || !proof.verdict?.passed) &&\n !!verifier;\n\n if (verifyNow && verifier) {\n proof = await verifier.verifySpeech({ request, result, policy });\n const parsed = validateAudioProof(proof);\n if (!parsed.success) {\n throw new Error('Verifier returned invalid AudioProof');\n }\n proof = parsed.data as AudioProof;\n }\n\n if (policy.requireProofBeforePlayback && (!proof || proof.verdict.passed !== true)) {\n throw new Error('Playback blocked by policy: missing or failing AudioProof');\n }\n\n // Playback\n await player.play(result.audio);\n\n // Background verification (if allowed).\n if (effectiveVerificationMode === 'after_playback' && verifier && !proof) {\n void (async () => {\n try {\n const p = await verifier.verifySpeech({ request, result, policy });\n const parsed = validateAudioProof(p);\n if (!parsed.success) return;\n setLastProof(parsed.data as AudioProof);\n onProof?.(parsed.data as AudioProof);\n } catch {\n // Ignore background verification errors.\n }\n })();\n }\n\n if (proof) {\n setLastProof(proof);\n onProof?.(proof);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Speech synthesis failed';\n setError(message);\n onError?.(err instanceof Error ? err : new Error(message));\n throw err instanceof Error ? err : new Error(message);\n } finally {\n setIsSynthesizing(false);\n abortRef.current = null;\n }\n },\n [\n cancel,\n policy,\n voices,\n signals,\n defaults,\n provider,\n verifier,\n effectiveVerificationMode,\n player,\n onProof,\n onError,\n ]\n );\n\n return {\n isSynthesizing,\n isSpeaking: player.isPlaying,\n error,\n\n lastRequest,\n lastResult,\n lastProof,\n\n speak,\n cancel,\n };\n}\n\n","import { useCallback, useMemo, useRef } from 'react';\nimport type { AVO } from '../../emotion/types.js';\nimport type { AudioPlannerSignals } from '../planner.js';\nimport { pickOverlayPhrase, type OverlayPhraseLibrary, type OverlayToken } from '../overlay.js';\nimport type {\n AudioPolicy,\n AudioProof,\n AudioVerifier,\n SpeechSynthesisProvider,\n VoiceCatalog,\n} from '../types.js';\nimport { useSpeechSynthesis, type SpeakOptions } from './useSpeechSynthesis.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseAudioOverlayOptions {\n provider: SpeechSynthesisProvider;\n verifier?: AudioVerifier;\n\n voices: VoiceCatalog;\n policy: AudioPolicy;\n\n signals?: AudioPlannerSignals;\n\n defaults?: {\n voiceId?: string;\n groundedVoiceTag?: string;\n defaultVoiceTag?: string;\n temperature?: number;\n };\n\n phrases?: Partial<OverlayPhraseLibrary>;\n\n bargeIn?: {\n stream: MediaStream | null;\n threshold?: number;\n hangoverMs?: number;\n };\n\n volume?: number;\n verificationMode?: 'before_playback' | 'after_playback' | 'never';\n\n onProof?: (proof: AudioProof) => void;\n onBargeIn?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface OverlaySpeakOptions extends SpeakOptions {\n targetAffect?: AVO;\n}\n\nexport interface UseAudioOverlayReturn {\n isSynthesizing: boolean;\n isSpeaking: boolean;\n error: string | null;\n\n lastProof: AudioProof | null;\n\n speakToken: (token: OverlayToken, options?: OverlaySpeakOptions) => Promise<void>;\n speakText: (text: string, options?: OverlaySpeakOptions) => Promise<void>;\n cancel: () => void;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useAudioOverlay(options: UseAudioOverlayOptions): UseAudioOverlayReturn {\n const {\n provider,\n verifier,\n voices,\n policy,\n signals,\n defaults,\n phrases,\n bargeIn,\n volume,\n verificationMode,\n onProof,\n onBargeIn,\n onError,\n } = options;\n\n const phraseIndexRef = useRef(0);\n\n const overlayDefaults = useMemo(() => {\n return {\n ...defaults,\n // Default to low temperature so overlay cues are stable and “assistant-like”.\n temperature: defaults?.temperature ?? 0.2,\n };\n }, [defaults]);\n\n const speech = useSpeechSynthesis({\n provider,\n verifier,\n voices,\n policy,\n signals,\n defaults: overlayDefaults,\n bargeIn,\n volume,\n verificationMode,\n onProof,\n onBargeIn,\n onError,\n });\n\n const speakToken = useCallback(\n async (token: OverlayToken, overlaySpeakOptions?: OverlaySpeakOptions) => {\n const idx = phraseIndexRef.current++;\n const text = pickOverlayPhrase({ token, library: phrases, index: idx });\n await speech.speak(text, overlaySpeakOptions);\n },\n [speech, phrases]\n );\n\n const speakText = useCallback(\n async (text: string, overlaySpeakOptions?: OverlaySpeakOptions) => {\n await speech.speak(text, overlaySpeakOptions);\n },\n [speech]\n );\n\n return {\n isSynthesizing: speech.isSynthesizing,\n isSpeaking: speech.isSpeaking,\n error: speech.error,\n lastProof: speech.lastProof,\n speakToken,\n speakText,\n cancel: speech.cancel,\n };\n}\n\n","import { useCallback, useEffect } from 'react';\nimport type { UseSpeechSynthesisOptions, UseSpeechSynthesisReturn, SpeakOptions } from './useSpeechSynthesis.js';\nimport { useSpeechSynthesis } from './useSpeechSynthesis.js';\nimport type { UseAudioOverlayOptions, UseAudioOverlayReturn } from './useAudioOverlay.js';\nimport { useAudioOverlay } from './useAudioOverlay.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseHybridSpeechOptions {\n main: UseSpeechSynthesisOptions;\n overlay: UseAudioOverlayOptions & { enabled?: boolean };\n\n /**\n * If true, automatically stops overlay playback when main speech starts.\n */\n stopOverlayOnMainSpeak?: boolean;\n}\n\nexport interface UseHybridSpeechReturn {\n main: UseSpeechSynthesisReturn;\n overlay: UseAudioOverlayReturn;\n\n /**\n * Convenience: play a quick acknowledgement (overlay) while synthesizing main speech.\n * Overlay is best-effort and will not block main speech if it fails.\n */\n speakWithAck: (text: string, options?: SpeakOptions) => Promise<void>;\n\n cancelAll: () => void;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport function useHybridSpeech(options: UseHybridSpeechOptions): UseHybridSpeechReturn {\n const { main: mainOptions, overlay: overlayOptions, stopOverlayOnMainSpeak = true } = options;\n\n const main = useSpeechSynthesis(mainOptions);\n\n const overlayEnabled = overlayOptions.enabled !== false;\n const overlay = useAudioOverlay(overlayOptions);\n\n useEffect(() => {\n if (!stopOverlayOnMainSpeak) return;\n if (!overlayEnabled) return;\n if (!main.isSpeaking) return;\n\n overlay.cancel();\n }, [stopOverlayOnMainSpeak, overlayEnabled, main.isSpeaking, overlay]);\n\n const speakWithAck = useCallback(\n async (text: string, speakOptions?: SpeakOptions) => {\n if (overlayEnabled) {\n void overlay.speakToken('ack', speakOptions).catch(() => {});\n }\n\n try {\n await main.speak(text, speakOptions);\n } catch (err) {\n if (overlayEnabled) overlay.cancel();\n throw err;\n }\n },\n [overlayEnabled, overlay, main]\n );\n\n const cancelAll = useCallback(() => {\n main.cancel();\n if (overlayEnabled) overlay.cancel();\n }, [main, overlayEnabled, overlay]);\n\n return { main, overlay, speakWithAck, cancelAll };\n}\n\n"],"mappings":"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","names":["useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useRef","useState","useCallback","useEffect","useCallback","useMemo","useRef","useRef","useMemo","useCallback","useCallback","useEffect","useEffect","useCallback"]}