@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.3
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/README.md +157 -0
- package/dist/actions/generate-media.d.ts +59 -0
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts +23 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -0
- package/dist/actions/transcription-control.d.ts +29 -0
- package/dist/actions/transcription-control.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
- package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.d.ts +18 -0
- package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
- package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/types.d.ts +338 -0
- package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
- package/dist/backends/apple-foundation.d.ts +56 -0
- package/dist/backends/apple-foundation.d.ts.map +1 -0
- package/dist/index.d.ts +8 -37
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38979 -430
- package/dist/index.js.map +217 -0
- package/dist/local-inference-routes.d.ts +47 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts +21 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/routes/compat-helpers.d.ts +18 -0
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts +62 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/dist/routes/index.d.ts +20 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +42040 -0
- package/dist/routes/index.js.map +236 -0
- package/dist/routes/live-diarization-route.d.ts +33 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts +4 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts +20 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts +16 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/dist/routes/local-inference-tts-route.d.ts +7 -0
- package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
- package/dist/routes/native-pcm-turn-route.d.ts +3 -0
- package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
- package/dist/routes/transcript-audio-store.d.ts +15 -0
- package/dist/routes/transcript-audio-store.d.ts.map +1 -0
- package/dist/routes/transcripts-routes.d.ts +44 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts +62 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts +62 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts +52 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts +77 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts +16 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts +14 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts +70 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +15 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +38768 -0
- package/dist/runtime/index.js.map +217 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/dist/runtime/voice-entity-binding.d.ts +113 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/dist/services/active-model.d.ts +310 -0
- package/dist/services/active-model.d.ts.map +1 -0
- package/dist/services/asr-provenance.d.ts +5 -0
- package/dist/services/asr-provenance.d.ts.map +1 -0
- package/dist/services/assignments.d.ts +84 -0
- package/dist/services/assignments.d.ts.map +1 -0
- package/dist/services/backend-selector.d.ts +55 -0
- package/dist/services/backend-selector.d.ts.map +1 -0
- package/dist/services/backend.d.ts +440 -0
- package/dist/services/backend.d.ts.map +1 -0
- package/dist/services/bionic-host-loader.d.ts +67 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts +34 -0
- package/dist/services/bundled-models.d.ts.map +1 -0
- package/dist/services/cache-bridge.d.ts +206 -0
- package/dist/services/cache-bridge.d.ts.map +1 -0
- package/dist/services/catalog.d.ts +10 -0
- package/dist/services/catalog.d.ts.map +1 -0
- package/dist/services/checkpoint-client.d.ts +109 -0
- package/dist/services/checkpoint-client.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.d.ts +217 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/cloud-fallback.d.ts +102 -0
- package/dist/services/cloud-fallback.d.ts.map +1 -0
- package/dist/services/context-fit.d.ts +36 -0
- package/dist/services/context-fit.d.ts.map +1 -0
- package/dist/services/conversation-registry.d.ts +142 -0
- package/dist/services/conversation-registry.d.ts.map +1 -0
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts +111 -0
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts +188 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts +149 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/dist/services/device-tier.d.ts +133 -0
- package/dist/services/device-tier.d.ts.map +1 -0
- package/dist/services/downloader.d.ts +94 -0
- package/dist/services/downloader.d.ts.map +1 -0
- package/dist/services/engine.d.ts +579 -0
- package/dist/services/engine.d.ts.map +1 -0
- package/dist/services/ensure-local-artifacts.d.ts +82 -0
- package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
- package/dist/services/external-scanner.d.ts +17 -0
- package/dist/services/external-scanner.d.ts.map +1 -0
- package/dist/services/ffi-llm-mock.d.ts +90 -0
- package/dist/services/ffi-llm-mock.d.ts.map +1 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
- package/dist/services/ffi-streaming-backend.d.ts +201 -0
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/dist/services/ffi-streaming-runner.d.ts +146 -0
- package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
- package/dist/services/gpu-autotune.d.ts +150 -0
- package/dist/services/gpu-autotune.d.ts.map +1 -0
- package/dist/services/gpu-detect.d.ts +56 -0
- package/dist/services/gpu-detect.d.ts.map +1 -0
- package/dist/services/handler-registry.d.ts +72 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts +63 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts +14 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts +118 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts +16 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts +58 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts +74 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts +181 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts +181 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/dist/services/index.d.ts +31 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39453 -0
- package/dist/services/index.js.map +227 -0
- package/dist/services/inference-capabilities.d.ts +132 -0
- package/dist/services/inference-capabilities.d.ts.map +1 -0
- package/dist/services/inference-telemetry.d.ts +59 -0
- package/dist/services/inference-telemetry.d.ts.map +1 -0
- package/dist/services/ios-llama-streaming.d.ts +119 -0
- package/dist/services/ios-llama-streaming.d.ts.map +1 -0
- package/dist/services/kv-spill.d.ts +189 -0
- package/dist/services/kv-spill.d.ts.map +1 -0
- package/dist/services/latency-trace.d.ts +346 -0
- package/dist/services/latency-trace.d.ts.map +1 -0
- package/dist/services/lib-target.d.ts +55 -0
- package/dist/services/lib-target.d.ts.map +1 -0
- package/dist/services/live-signals.d.ts +86 -0
- package/dist/services/live-signals.d.ts.map +1 -0
- package/dist/services/llama-server-metrics.d.ts +114 -0
- package/dist/services/llama-server-metrics.d.ts.map +1 -0
- package/dist/services/llm-streaming-binding.d.ts +96 -0
- package/dist/services/llm-streaming-binding.d.ts.map +1 -0
- package/dist/services/load-args.d.ts +82 -0
- package/dist/services/load-args.d.ts.map +1 -0
- package/dist/services/manifest/index.d.ts +4 -0
- package/dist/services/manifest/index.d.ts.map +1 -0
- package/dist/services/manifest/schema.d.ts +903 -0
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/dist/services/manifest/types.d.ts +32 -0
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts +66 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/dist/services/memory-arbiter.d.ts +348 -0
- package/dist/services/memory-arbiter.d.ts.map +1 -0
- package/dist/services/memory-benchmark.d.ts +76 -0
- package/dist/services/memory-benchmark.d.ts.map +1 -0
- package/dist/services/memory-monitor.d.ts +128 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts +130 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts +13 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts +127 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts +6 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts +124 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts +38 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts +110 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts +9 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts +111 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/dist/services/registry.d.ts +33 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/router-handler.d.ts +92 -0
- package/dist/services/router-handler.d.ts.map +1 -0
- package/dist/services/routing-policy.d.ts +92 -0
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts +8 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts +98 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/dist/services/service.d.ts +128 -0
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts +72 -0
- package/dist/services/session-pool.d.ts.map +1 -0
- package/dist/services/structured-output/deterministic-repair.d.ts +23 -0
- package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/dist/services/structured-output/index.d.ts +2 -0
- package/dist/services/structured-output/index.d.ts.map +1 -0
- package/dist/services/structured-output.d.ts +311 -0
- package/dist/services/structured-output.d.ts.map +1 -0
- package/dist/services/system-memory.d.ts +33 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/dist/services/types.d.ts +19 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts +34 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts +8 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts +115 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts +99 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts +47 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts +71 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/dist/services/vision/index.d.ts +95 -0
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts +73 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/dist/services/vision/types.d.ts +162 -0
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts +18 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/dist/services/vision-embedding-cache.d.ts +98 -0
- package/dist/services/vision-embedding-cache.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
- package/dist/services/voice/audio-frame-consumer.d.ts +294 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts +112 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts +127 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-manager.d.ts +199 -0
- package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-policy.d.ts +178 -0
- package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
- package/dist/services/voice/corpus-augment.d.ts +111 -0
- package/dist/services/voice/corpus-augment.d.ts.map +1 -0
- package/dist/services/voice/corpus-generator.d.ts +134 -0
- package/dist/services/voice/corpus-generator.d.ts.map +1 -0
- package/dist/services/voice/diarization-error-rate.d.ts +40 -0
- package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
- package/dist/services/voice/e2e-harness.d.ts +297 -0
- package/dist/services/voice/e2e-harness.d.ts.map +1 -0
- package/dist/services/voice/eager-context-builder.d.ts +170 -0
- package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
- package/dist/services/voice/echo-delay.d.ts +67 -0
- package/dist/services/voice/echo-delay.d.ts.map +1 -0
- package/dist/services/voice/echo-metrics.d.ts +7 -0
- package/dist/services/voice/echo-metrics.d.ts.map +1 -0
- package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
- package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
- package/dist/services/voice/eliza1-eot-scorer.d.ts +124 -0
- package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/embedding-server.d.ts +37 -0
- package/dist/services/voice/embedding-server.d.ts.map +1 -0
- package/dist/services/voice/embedding.d.ts +132 -0
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts +68 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/dist/services/voice/engine-bridge.d.ts +762 -0
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/dist/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/dist/services/voice/eot-classifier.d.ts +211 -0
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/dist/services/voice/errors.d.ts +20 -0
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/dist/services/voice/expressive-tags.d.ts +158 -0
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/dist/services/voice/ffi-bindings.d.ts +696 -0
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts +181 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/dist/services/voice/fused-eot-scorer.d.ts +51 -0
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/index.d.ts +96 -0
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/kokoro/index.d.ts +24 -0
- package/dist/services/voice/kokoro/index.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts +87 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts +50 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/dist/services/voice/kokoro/pick-runtime.d.ts +61 -0
- package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/dist/services/voice/kokoro/types.d.ts +82 -0
- package/dist/services/voice/kokoro/types.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts +30 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
- package/dist/services/voice/lifecycle.d.ts +135 -0
- package/dist/services/voice/lifecycle.d.ts.map +1 -0
- package/dist/services/voice/live-diarization-session.d.ts +196 -0
- package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
- package/dist/services/voice/metric-math.d.ts +10 -0
- package/dist/services/voice/metric-math.d.ts.map +1 -0
- package/dist/services/voice/mic-source.d.ts +136 -0
- package/dist/services/voice/mic-source.d.ts.map +1 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
- package/dist/services/voice/optimistic-policy.d.ts +109 -0
- package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
- package/dist/services/voice/optimistic-rollback.d.ts +151 -0
- package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
- package/dist/services/voice/partial-stabilizer.d.ts +73 -0
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts +76 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts +62 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts +151 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts +216 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts +123 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts +248 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts +40 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts +24 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/dist/services/voice/scheduler.d.ts +146 -0
- package/dist/services/voice/scheduler.d.ts.map +1 -0
- package/dist/services/voice/self-voice-imprint.d.ts +33 -0
- package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
- package/dist/services/voice/shared-resources.d.ts +204 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts +75 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts +37 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts +83 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
- package/dist/services/voice/speaker-preset-cache.d.ts +77 -0
- package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
- package/dist/services/voice/system-audio-sink.d.ts +73 -0
- package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
- package/dist/services/voice/transcriber.d.ts +244 -0
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts +37 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/dist/services/voice/transcript-service.d.ts +60 -0
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/dist/services/voice/transcript-store.d.ts +64 -0
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts +183 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/dist/services/voice/types.d.ts +643 -0
- package/dist/services/voice/types.d.ts.map +1 -0
- package/dist/services/voice/vad.d.ts +283 -0
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts +241 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts +95 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
- package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
- package/dist/services/voice/voice-preset-format.d.ts +158 -0
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts +116 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-routes.d.ts +83 -0
- package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/dist/services/voice/voice-scenario.d.ts +131 -0
- package/dist/services/voice/voice-scenario.d.ts.map +1 -0
- package/dist/services/voice/voice-state-machine.d.ts +364 -0
- package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
- package/dist/services/voice/voice-workbench-report.d.ts +117 -0
- package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
- package/dist/services/voice/wake-word-ggml.d.ts +100 -0
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/dist/services/voice/wake-word.d.ts +255 -0
- package/dist/services/voice/wake-word.d.ts.map +1 -0
- package/dist/services/voice/wav-codec.d.ts +11 -0
- package/dist/services/voice/wav-codec.d.ts.map +1 -0
- package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
- package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
- package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
- package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
- package/dist/services/voice/workbench-logic-services.d.ts +36 -0
- package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-real-services.d.ts +17 -0
- package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-scenarios.d.ts +24 -0
- package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts +70 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/dist/services/voice-model-updater.d.ts +240 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -0
- package/dist/services/voice-prewarm.d.ts +3 -0
- package/dist/services/voice-prewarm.d.ts.map +1 -0
- package/dist/voice-workbench.d.ts +18 -0
- package/dist/voice-workbench.d.ts.map +1 -0
- package/dist/voice-workbench.js +5259 -0
- package/dist/voice-workbench.js.map +34 -0
- package/package.json +101 -15
- package/registry-entry.json +137 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/actions/transcription-control.test.ts +100 -0
- package/src/actions/transcription-control.ts +127 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +831 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.ts +62 -0
- package/src/local-inference-routes.test.ts +390 -0
- package/src/local-inference-routes.ts +1625 -0
- package/src/provider.ts +1111 -0
- package/src/routes/compat-helpers.ts +275 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.ts +61 -0
- package/src/routes/live-diarization-route.test.ts +347 -0
- package/src/routes/live-diarization-route.ts +198 -0
- package/src/routes/local-inference-asr-route.test.ts +246 -0
- package/src/routes/local-inference-asr-route.ts +166 -0
- package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
- package/src/routes/local-inference-asr-transcribe.ts +97 -0
- package/src/routes/local-inference-compat-routes.test.ts +485 -0
- package/src/routes/local-inference-compat-routes.ts +775 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcript-audio-store.ts +27 -0
- package/src/routes/transcripts-routes.test.ts +195 -0
- package/src/routes/transcripts-routes.ts +191 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +726 -0
- package/src/runtime/ensure-local-inference-handler.ts +1640 -0
- package/src/runtime/index.ts +36 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +152 -0
- package/src/runtime/mobile-local-inference-gate.ts +99 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +98 -0
- package/src/runtime/voice-entity-binding.ts +368 -0
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.ts +1416 -0
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +106 -0
- package/src/services/assignments.ts +278 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +791 -0
- package/src/services/bionic-host-loader.test.ts +226 -0
- package/src/services/bionic-host-loader.ts +252 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.test.ts +259 -0
- package/src/services/catalog.ts +33 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +431 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.test.ts +458 -0
- package/src/services/device-tier.ts +502 -0
- package/src/services/downloader.test.ts +888 -0
- package/src/services/downloader.ts +1039 -0
- package/src/services/engine-direct-bundle.test.ts +90 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.ts +2096 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +445 -0
- package/src/services/ffi-streaming-backend.ts +418 -0
- package/src/services/ffi-streaming-runner.test.ts +220 -0
- package/src/services/ffi-streaming-runner.ts +407 -0
- package/src/services/ffi-unload-ordering.test.ts +166 -0
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.test.ts +236 -0
- package/src/services/hardware.ts +438 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/backend-selector.ts +277 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.ts +715 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.ts +229 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +357 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- package/src/services/lib-target.test.ts +145 -0
- package/src/services/lib-target.ts +102 -0
- package/src/services/live-signals.test.ts +132 -0
- package/src/services/live-signals.ts +177 -0
- package/src/services/llama-server-metrics.test.ts +168 -0
- package/src/services/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +790 -0
- package/src/services/manifest/index.ts +72 -0
- package/src/services/manifest/manifest.test.ts +791 -0
- package/src/services/manifest/schema.ts +761 -0
- package/src/services/manifest/types.ts +61 -0
- package/src/services/manifest/validator.ts +633 -0
- package/src/services/memory-arbiter.test.ts +558 -0
- package/src/services/memory-arbiter.ts +991 -0
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +232 -0
- package/src/services/memory-monitor.ts +309 -0
- package/src/services/memory-pressure.ts +414 -0
- package/src/services/mtp-doctor.ts +86 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +164 -0
- package/src/services/ram-budget.ts +309 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/recommendation.ts +671 -0
- package/src/services/registry.ts +157 -0
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +426 -0
- package/src/services/routing-policy.test.ts +352 -0
- package/src/services/routing-policy.ts +367 -0
- package/src/services/routing-preferences.ts +17 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +750 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/system-memory.test.ts +47 -0
- package/src/services/system-memory.ts +67 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/types.ts +59 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.ts +163 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +133 -0
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +194 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
- package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
- package/src/services/voice/asr-timed.real.test.ts +139 -0
- package/src/services/voice/audio-frame-consumer.test.ts +669 -0
- package/src/services/voice/audio-frame-consumer.ts +651 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +335 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- package/src/services/voice/corpus-augment.test.ts +276 -0
- package/src/services/voice/corpus-augment.ts +451 -0
- package/src/services/voice/corpus-generator.test.ts +201 -0
- package/src/services/voice/corpus-generator.ts +413 -0
- package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
- package/src/services/voice/diarization-error-rate.test.ts +100 -0
- package/src/services/voice/diarization-error-rate.ts +249 -0
- package/src/services/voice/e2e-harness.der.test.ts +94 -0
- package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
- package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
- package/src/services/voice/e2e-harness.test.ts +182 -0
- package/src/services/voice/e2e-harness.ts +902 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- package/src/services/voice/echo-delay.test.ts +118 -0
- package/src/services/voice/echo-delay.ts +135 -0
- package/src/services/voice/echo-metrics.test.ts +17 -0
- package/src/services/voice/echo-metrics.ts +20 -0
- package/src/services/voice/echo-reference-buffer.test.ts +86 -0
- package/src/services/voice/echo-reference-buffer.ts +165 -0
- package/src/services/voice/eliza1-eot-scorer.ts +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.test.ts +131 -0
- package/src/services/voice/embedding.ts +242 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2343 -0
- package/src/services/voice/eot-classifier-ggml.ts +569 -0
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +422 -0
- package/src/services/voice/errors.ts +34 -0
- package/src/services/voice/expressive-tags.asr.test.ts +77 -0
- package/src/services/voice/expressive-tags.test.ts +102 -0
- package/src/services/voice/expressive-tags.ts +405 -0
- package/src/services/voice/ffi-bindings.test.ts +735 -0
- package/src/services/voice/ffi-bindings.ts +3387 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.ts +139 -0
- package/src/services/voice/index.ts +502 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +262 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +236 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +67 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +223 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.ts +64 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +622 -0
- package/src/services/voice/metric-math.test.ts +61 -0
- package/src/services/voice/metric-math.ts +25 -0
- package/src/services/voice/mic-source.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
- package/src/services/voice/nlms-echo-canceller.ts +317 -0
- package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
- package/src/services/voice/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.ts +504 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/real-audio-decode.test.ts +148 -0
- package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
- package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
- package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
- package/src/services/voice/ring-buffer.test.ts +129 -0
- package/src/services/voice/ring-buffer.ts +123 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -0
- package/src/services/voice/self-voice-imprint.test.ts +59 -0
- package/src/services/voice/self-voice-imprint.ts +102 -0
- package/src/services/voice/shared-resources.ts +343 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +449 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/transcript-knowledge.test.ts +68 -0
- package/src/services/voice/transcript-knowledge.ts +75 -0
- package/src/services/voice/transcript-service.test.ts +195 -0
- package/src/services/voice/transcript-service.ts +205 -0
- package/src/services/voice/transcript-store.test.ts +189 -0
- package/src/services/voice/transcript-store.ts +164 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.test.ts +498 -0
- package/src/services/voice/vad.ts +832 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.test.ts +415 -0
- package/src/services/voice/voice-budget.ts +635 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
- package/src/services/voice/voice-preload-predictor.test.ts +130 -0
- package/src/services/voice/voice-preload-predictor.ts +113 -0
- package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
- package/src/services/voice/voice-preset-format.test.ts +75 -0
- package/src/services/voice/voice-preset-format.ts +713 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +280 -0
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +367 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.ts +319 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
- package/src/services/voice/wav-codec.test.ts +32 -0
- package/src/services/voice/wav-codec.ts +101 -0
- package/src/services/voice/workbench-entrypoint.test.ts +55 -0
- package/src/services/voice/workbench-entrypoint.ts +88 -0
- package/src/services/voice/workbench-headless-runner.test.ts +162 -0
- package/src/services/voice/workbench-headless-runner.ts +396 -0
- package/src/services/voice/workbench-logic-services.test.ts +225 -0
- package/src/services/voice/workbench-logic-services.ts +184 -0
- package/src/services/voice/workbench-real-services.ts +629 -0
- package/src/services/voice/workbench-scenarios.ts +407 -0
- package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/src/voice-workbench.ts +71 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice-emotion types and pure projection functions — consumed by the
|
|
3
|
+
* attribution pipeline (`emotion-attribution.ts`).
|
|
4
|
+
*
|
|
5
|
+
* The ONNX-backed `VoiceEmotionClassifier` class was removed when
|
|
6
|
+
* `onnxruntime-node` was dropped. No resident voice-emotion classifier
|
|
7
|
+
* remains; only the pure types and projection helpers below are kept.
|
|
8
|
+
*
|
|
9
|
+
* Pure exports here:
|
|
10
|
+
* - Model id constants (`WAV2SMALL_INT8_MODEL_ID`, etc.)
|
|
11
|
+
* - Sample rate / window constants
|
|
12
|
+
* - `VoiceEmotionVad`, `VoiceEmotionClassifierOutput` interfaces
|
|
13
|
+
* - `VoiceEmotionHead` type
|
|
14
|
+
* - `VoiceEmotionClassifierError` error class
|
|
15
|
+
* - `projectVadToExpressiveEmotion` — V-A-D → ExpressiveEmotion projection
|
|
16
|
+
* - `interpretCls7Output` — 7-class logit → structured output
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
EXPRESSIVE_EMOTION_TAGS,
|
|
21
|
+
type ExpressiveEmotion,
|
|
22
|
+
} from "./expressive-tags";
|
|
23
|
+
|
|
24
|
+
/** Stable identifier for the Wav2Small student head we ship. */
|
|
25
|
+
export const WAV2SMALL_INT8_MODEL_ID = "wav2small-msp-dim-int8" as const;
|
|
26
|
+
/** Stable identifier for the floating-point parent we use in eval. */
|
|
27
|
+
export const WAV2SMALL_FP32_MODEL_ID = "wav2small-msp-dim-fp32" as const;
|
|
28
|
+
export type VoiceEmotionModelId =
|
|
29
|
+
| typeof WAV2SMALL_INT8_MODEL_ID
|
|
30
|
+
| typeof WAV2SMALL_FP32_MODEL_ID;
|
|
31
|
+
|
|
32
|
+
/** Required sample rate for the Wav2Small log-mel front-end. */
|
|
33
|
+
export const WAV2SMALL_SAMPLE_RATE = 16_000;
|
|
34
|
+
/** Hard minimum window: anything shorter is rejected. */
|
|
35
|
+
export const WAV2SMALL_MIN_SAMPLES = WAV2SMALL_SAMPLE_RATE; // 1.0 s
|
|
36
|
+
/** Soft maximum window: longer inputs are truncated to the trailing window. */
|
|
37
|
+
export const WAV2SMALL_MAX_SAMPLES = WAV2SMALL_SAMPLE_RATE * 12; // 12 s
|
|
38
|
+
|
|
39
|
+
/** Raised when the bundled model file can not be loaded or run. */
|
|
40
|
+
export class VoiceEmotionClassifierError extends Error {
|
|
41
|
+
constructor(message: string) {
|
|
42
|
+
super(message);
|
|
43
|
+
this.name = "VoiceEmotionClassifierError";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Continuous V-A-D output. All three are in [0, 1]. */
|
|
48
|
+
export interface VoiceEmotionVad {
|
|
49
|
+
valence: number;
|
|
50
|
+
arousal: number;
|
|
51
|
+
dominance: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** One classifier inference output. */
|
|
55
|
+
export interface VoiceEmotionClassifierOutput {
|
|
56
|
+
vad: VoiceEmotionVad;
|
|
57
|
+
/** Projected discrete label, or null when no projection is confident. */
|
|
58
|
+
emotion: ExpressiveEmotion | null;
|
|
59
|
+
/** Confidence in the projected discrete label, [0, 1]. */
|
|
60
|
+
confidence: number;
|
|
61
|
+
/** Per-class soft scores aligned with `EXPRESSIVE_EMOTION_TAGS`. */
|
|
62
|
+
scores: Record<ExpressiveEmotion, number>;
|
|
63
|
+
/** Model id used for this inference (for the attribution evidence row). */
|
|
64
|
+
modelId: VoiceEmotionModelId;
|
|
65
|
+
/** Inference wall-time in ms (CPU side; useful for the bench harness). */
|
|
66
|
+
latencyMs: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Clamp `value` into the unit interval. Non-finite inputs become 0 — the
|
|
71
|
+
* downstream attribution will see 0-confidence and reject the read.
|
|
72
|
+
*/
|
|
73
|
+
function clamp01(value: number): number {
|
|
74
|
+
if (!Number.isFinite(value)) return 0;
|
|
75
|
+
if (value < 0) return 0;
|
|
76
|
+
if (value > 1) return 1;
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Project a continuous V-A-D triple into the 7-class
|
|
82
|
+
* `ExpressiveEmotion` tag set. Returns soft scores per tag and the best
|
|
83
|
+
* discrete pick with a confidence score.
|
|
84
|
+
*
|
|
85
|
+
* The projection is Plutchik-aligned and deterministic. The thresholds
|
|
86
|
+
* are tuned against the MSP-Podcast V-A-D mean/std reported in the
|
|
87
|
+
* audeering model card and Wav2Small paper; small enough to be stable but
|
|
88
|
+
* wide enough to give every class some mass on conversational speech.
|
|
89
|
+
*
|
|
90
|
+
* Sign convention (audeering teacher, mirrored by Wav2Small):
|
|
91
|
+
* valence — high = positive affect (happy, calm), low = negative (sad, angry).
|
|
92
|
+
* arousal — high = energetic (excited, angry), low = subdued (calm, sad).
|
|
93
|
+
* dominance — high = assertive (angry), low = submissive (nervous, whisper).
|
|
94
|
+
*/
|
|
95
|
+
export function projectVadToExpressiveEmotion(vad: VoiceEmotionVad): {
|
|
96
|
+
emotion: ExpressiveEmotion | null;
|
|
97
|
+
confidence: number;
|
|
98
|
+
scores: Record<ExpressiveEmotion, number>;
|
|
99
|
+
} {
|
|
100
|
+
// Non-finite inputs cannot be reasoned about — abstain explicitly rather
|
|
101
|
+
// than coerce to a default corner. The classifier is the source of truth
|
|
102
|
+
// for V-A-D; a non-finite read means the upstream forward pass diverged
|
|
103
|
+
// and the downstream attribution should not pretend the read happened.
|
|
104
|
+
if (
|
|
105
|
+
!Number.isFinite(vad.valence) ||
|
|
106
|
+
!Number.isFinite(vad.arousal) ||
|
|
107
|
+
!Number.isFinite(vad.dominance)
|
|
108
|
+
) {
|
|
109
|
+
const emptyScores: Record<ExpressiveEmotion, number> = {
|
|
110
|
+
happy: 0,
|
|
111
|
+
sad: 0,
|
|
112
|
+
angry: 0,
|
|
113
|
+
nervous: 0,
|
|
114
|
+
calm: 0,
|
|
115
|
+
excited: 0,
|
|
116
|
+
whisper: 0,
|
|
117
|
+
};
|
|
118
|
+
return { emotion: null, confidence: 0, scores: emptyScores };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const v = clamp01(vad.valence);
|
|
122
|
+
const a = clamp01(vad.arousal);
|
|
123
|
+
const d = clamp01(vad.dominance);
|
|
124
|
+
|
|
125
|
+
// Center each axis at 0.5; magnitudes in [-0.5, 0.5].
|
|
126
|
+
const vC = v - 0.5;
|
|
127
|
+
const aC = a - 0.5;
|
|
128
|
+
const dC = d - 0.5;
|
|
129
|
+
|
|
130
|
+
const scores: Record<ExpressiveEmotion, number> = {
|
|
131
|
+
happy: 0,
|
|
132
|
+
sad: 0,
|
|
133
|
+
angry: 0,
|
|
134
|
+
nervous: 0,
|
|
135
|
+
calm: 0,
|
|
136
|
+
excited: 0,
|
|
137
|
+
whisper: 0,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// Each class scores only from off-center signal — a fully-neutral
|
|
141
|
+
// (0.5, 0.5, 0.5) read produces all-zero scores and we abstain. Magnitudes
|
|
142
|
+
// are tuned so that a confident corner of V-A-D space lands ≥ 0.5
|
|
143
|
+
// (the bench gate threshold for "discrete label confident enough to
|
|
144
|
+
// surface").
|
|
145
|
+
// happy — high V, mid-high A, low |D| spread.
|
|
146
|
+
scores.happy = clamp01(vC * 1.4 + Math.max(0, aC) * 0.6 - Math.abs(dC) * 0.4);
|
|
147
|
+
// excited — high V, very high A.
|
|
148
|
+
scores.excited = clamp01(vC * 0.9 + aC * 1.6);
|
|
149
|
+
// calm — high V, low A.
|
|
150
|
+
scores.calm = clamp01(Math.max(0, vC) * 1.4 - aC * 1.2 - Math.abs(dC) * 0.3);
|
|
151
|
+
// sad — low V, low A, low D.
|
|
152
|
+
scores.sad = clamp01(-vC * 1.4 - aC * 0.8 - dC * 0.4);
|
|
153
|
+
// angry — low V, high A, high D.
|
|
154
|
+
scores.angry = clamp01(-vC * 1.1 + aC * 1.2 + dC * 1.0);
|
|
155
|
+
// nervous — low-mid V, mid-high A, low D.
|
|
156
|
+
scores.nervous = clamp01(-vC * 0.7 + aC * 0.9 - dC * 1.2);
|
|
157
|
+
// whisper — very low A and very low D (both at the floor). Valence-agnostic
|
|
158
|
+
// (we have no energy axis here). The double-negative gating means a low
|
|
159
|
+
// arousal alone does NOT trigger whisper — only the very low-A + low-D
|
|
160
|
+
// corner does.
|
|
161
|
+
scores.whisper = clamp01(-aC * 1.4 - dC * 1.4);
|
|
162
|
+
|
|
163
|
+
let best: ExpressiveEmotion | null = null;
|
|
164
|
+
let bestScore = 0;
|
|
165
|
+
for (const tag of EXPRESSIVE_EMOTION_TAGS) {
|
|
166
|
+
if (scores[tag] > bestScore) {
|
|
167
|
+
bestScore = scores[tag];
|
|
168
|
+
best = tag;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Require a minimum mass before we attribute a discrete label.
|
|
172
|
+
if (bestScore < 0.35) {
|
|
173
|
+
return { emotion: null, confidence: bestScore, scores };
|
|
174
|
+
}
|
|
175
|
+
return { emotion: best, confidence: bestScore, scores };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Stable model-head identifier — declares whether the model emits
|
|
180
|
+
* V-A-D triples or 7-class logits. `vad` = continuous [valence, arousal,
|
|
181
|
+
* dominance]; `cls7` = 7-class logits in `EXPRESSIVE_EMOTION_TAGS` order.
|
|
182
|
+
*/
|
|
183
|
+
export type VoiceEmotionHead = "vad" | "cls7";
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Convert the 7-class logits from the `cls7` head into a structured
|
|
187
|
+
* emotion read. Applies a numerically-stable softmax (max-subtraction)
|
|
188
|
+
* over `EXPRESSIVE_EMOTION_TAGS` and selects the argmax.
|
|
189
|
+
*
|
|
190
|
+
* Confidence is the softmax probability of the picked class (in [0, 1]),
|
|
191
|
+
* which gives downstream consumers a calibrated mass to compare against
|
|
192
|
+
* the V-A-D-projection path's 0.35 abstain floor.
|
|
193
|
+
*
|
|
194
|
+
* The `vad` field is synthesised at the neutral midpoint (0.5, 0.5, 0.5).
|
|
195
|
+
* The cls7 head is the ground truth for the picked emotion — the V-A-D
|
|
196
|
+
* triple is left at neutral because we no longer regress to a V-A-D
|
|
197
|
+
* target. Consumers that need real V-A-D must use a `head=vad` model.
|
|
198
|
+
*/
|
|
199
|
+
export function interpretCls7Output(
|
|
200
|
+
logits: Float32Array,
|
|
201
|
+
modelId: VoiceEmotionModelId,
|
|
202
|
+
latencyMs: number,
|
|
203
|
+
): VoiceEmotionClassifierOutput {
|
|
204
|
+
const n = EXPRESSIVE_EMOTION_TAGS.length;
|
|
205
|
+
if (logits.length !== n) {
|
|
206
|
+
throw new VoiceEmotionClassifierError(
|
|
207
|
+
`[voice-emotion] interpretCls7Output: expected ${n} logits, got ${logits.length}`,
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
let maxLogit = Number.NEGATIVE_INFINITY;
|
|
211
|
+
for (let i = 0; i < n; i++) {
|
|
212
|
+
const v = logits[i] ?? 0;
|
|
213
|
+
if (Number.isFinite(v) && v > maxLogit) maxLogit = v;
|
|
214
|
+
}
|
|
215
|
+
if (!Number.isFinite(maxLogit)) {
|
|
216
|
+
// All-NaN/Inf logits — abstain rather than coerce.
|
|
217
|
+
const emptyScores = makeEmptyScoresRecord();
|
|
218
|
+
return {
|
|
219
|
+
vad: { valence: 0.5, arousal: 0.5, dominance: 0.5 },
|
|
220
|
+
emotion: null,
|
|
221
|
+
confidence: 0,
|
|
222
|
+
scores: emptyScores,
|
|
223
|
+
modelId,
|
|
224
|
+
latencyMs,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
const exps = new Float32Array(n);
|
|
228
|
+
let sum = 0;
|
|
229
|
+
for (let i = 0; i < n; i++) {
|
|
230
|
+
const v = logits[i] ?? 0;
|
|
231
|
+
const e = Math.exp((Number.isFinite(v) ? v : maxLogit) - maxLogit);
|
|
232
|
+
exps[i] = e;
|
|
233
|
+
sum += e;
|
|
234
|
+
}
|
|
235
|
+
const denom = sum > 0 ? sum : 1;
|
|
236
|
+
let bestIdx = 0;
|
|
237
|
+
let bestProb = 0;
|
|
238
|
+
const scores = makeEmptyScoresRecord();
|
|
239
|
+
for (let i = 0; i < n; i++) {
|
|
240
|
+
const tag = EXPRESSIVE_EMOTION_TAGS[i];
|
|
241
|
+
if (!tag) continue;
|
|
242
|
+
const p = (exps[i] ?? 0) / denom;
|
|
243
|
+
scores[tag] = p;
|
|
244
|
+
if (p > bestProb) {
|
|
245
|
+
bestProb = p;
|
|
246
|
+
bestIdx = i;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const emotionTag = EXPRESSIVE_EMOTION_TAGS[bestIdx];
|
|
250
|
+
return {
|
|
251
|
+
// The cls7 head doesn't regress V-A-D — surface the neutral
|
|
252
|
+
// midpoint so callers can still destructure but know not to trust
|
|
253
|
+
// these floats as anything other than "head was cls7".
|
|
254
|
+
vad: { valence: 0.5, arousal: 0.5, dominance: 0.5 },
|
|
255
|
+
emotion: emotionTag ?? null,
|
|
256
|
+
confidence: bestProb,
|
|
257
|
+
scores,
|
|
258
|
+
modelId,
|
|
259
|
+
latencyMs,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function makeEmptyScoresRecord(): Record<ExpressiveEmotion, number> {
|
|
264
|
+
return {
|
|
265
|
+
happy: 0,
|
|
266
|
+
sad: 0,
|
|
267
|
+
angry: 0,
|
|
268
|
+
nervous: 0,
|
|
269
|
+
calm: 0,
|
|
270
|
+
excited: 0,
|
|
271
|
+
whisper: 0,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// Fuzz / hardening pass for the pure voice decision + validation helpers.
|
|
2
|
+
// validateVoiceScenario gates an arbitrary (possibly malformed) scenario object
|
|
3
|
+
// before the corpus build, and turnSignalFromProbability maps an arbitrary
|
|
4
|
+
// model probability (including NaN / +-Infinity) onto the speak/stay decision.
|
|
5
|
+
// Invariants under any input: never throw, and always return a value honoring
|
|
6
|
+
// the declared contract. A seeded LCG makes failures reproducible.
|
|
7
|
+
|
|
8
|
+
import { describe, expect, it } from "vitest";
|
|
9
|
+
import { clampProbability, turnSignalFromProbability } from "./eot-classifier";
|
|
10
|
+
import { type VoiceScenario, validateVoiceScenario } from "./voice-scenario";
|
|
11
|
+
|
|
12
|
+
function makeRng(seed: number): () => number {
|
|
13
|
+
let s = seed >>> 0;
|
|
14
|
+
return () => {
|
|
15
|
+
s = (Math.imul(s, 1664525) + 1013904223) >>> 0;
|
|
16
|
+
return s / 0x100000000;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const KEYS = [
|
|
21
|
+
"id",
|
|
22
|
+
"classes",
|
|
23
|
+
"participants",
|
|
24
|
+
"turns",
|
|
25
|
+
"agents",
|
|
26
|
+
"environment",
|
|
27
|
+
"label",
|
|
28
|
+
"speaker",
|
|
29
|
+
"text",
|
|
30
|
+
"audioRef",
|
|
31
|
+
"expectRespond",
|
|
32
|
+
"expectEndOfTurn",
|
|
33
|
+
"reverb",
|
|
34
|
+
"farFieldDb",
|
|
35
|
+
];
|
|
36
|
+
const PRIMS = ["1", '"s"', "true", "false", "null", "-3.5", '""', '"alice"'];
|
|
37
|
+
|
|
38
|
+
function randomJson(rng: () => number, depth: number): string {
|
|
39
|
+
if (depth <= 0 || rng() < 0.4) return PRIMS[Math.floor(rng() * PRIMS.length)];
|
|
40
|
+
const k = 1 + Math.floor(rng() * 4);
|
|
41
|
+
if (rng() < 0.5) {
|
|
42
|
+
const items: string[] = [];
|
|
43
|
+
for (let i = 0; i < k; i++) items.push(randomJson(rng, depth - 1));
|
|
44
|
+
return `[${items.join(",")}]`;
|
|
45
|
+
}
|
|
46
|
+
const entries: string[] = [];
|
|
47
|
+
for (let i = 0; i < k; i++) {
|
|
48
|
+
const key = KEYS[Math.floor(rng() * KEYS.length)];
|
|
49
|
+
entries.push(`${JSON.stringify(key)}:${randomJson(rng, depth - 1)}`);
|
|
50
|
+
}
|
|
51
|
+
return `{${entries.join(",")}}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
describe("validateVoiceScenario - fuzz", () => {
|
|
55
|
+
it("never throws and always returns a consistent {valid, errors} report", () => {
|
|
56
|
+
const rng = makeRng(0x5ce4a);
|
|
57
|
+
for (let i = 0; i < 3000; i++) {
|
|
58
|
+
const value = JSON.parse(randomJson(rng, 4)) as unknown;
|
|
59
|
+
const result = validateVoiceScenario(value as VoiceScenario);
|
|
60
|
+
expect(typeof result.valid).toBe("boolean");
|
|
61
|
+
expect(Array.isArray(result.errors)).toBe(true);
|
|
62
|
+
for (const e of result.errors) expect(typeof e).toBe("string");
|
|
63
|
+
// valid is exactly the no-errors case.
|
|
64
|
+
expect(result.valid).toBe(result.errors.length === 0);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe("turnSignalFromProbability / clampProbability - fuzz", () => {
|
|
70
|
+
const EXTREMES = [
|
|
71
|
+
Number.NaN,
|
|
72
|
+
Number.POSITIVE_INFINITY,
|
|
73
|
+
Number.NEGATIVE_INFINITY,
|
|
74
|
+
Number.MAX_VALUE,
|
|
75
|
+
-Number.MAX_VALUE,
|
|
76
|
+
0,
|
|
77
|
+
1,
|
|
78
|
+
-1,
|
|
79
|
+
2,
|
|
80
|
+
1e-12,
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
it("clampProbability always yields a finite value in [0,1]", () => {
|
|
84
|
+
const rng = makeRng(0x110b);
|
|
85
|
+
for (let i = 0; i < 3000; i++) {
|
|
86
|
+
const p =
|
|
87
|
+
rng() < 0.3
|
|
88
|
+
? EXTREMES[Math.floor(rng() * EXTREMES.length)]
|
|
89
|
+
: (rng() - 0.5) * 1e6;
|
|
90
|
+
const c = clampProbability(p);
|
|
91
|
+
expect(Number.isFinite(c)).toBe(true);
|
|
92
|
+
expect(c).toBeGreaterThanOrEqual(0);
|
|
93
|
+
expect(c).toBeLessThanOrEqual(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("turnSignalFromProbability always returns a well-formed signal", () => {
|
|
98
|
+
const rng = makeRng(0xd00d);
|
|
99
|
+
const speakers = new Set(["agent", "user", "unknown"]);
|
|
100
|
+
for (let i = 0; i < 3000; i++) {
|
|
101
|
+
const probability =
|
|
102
|
+
rng() < 0.3
|
|
103
|
+
? EXTREMES[Math.floor(rng() * EXTREMES.length)]
|
|
104
|
+
: (rng() - 0.5) * 1e6;
|
|
105
|
+
const sig = turnSignalFromProbability({
|
|
106
|
+
probability,
|
|
107
|
+
transcript: "x",
|
|
108
|
+
source: "heuristic",
|
|
109
|
+
});
|
|
110
|
+
expect(speakers.has(sig.nextSpeaker)).toBe(true);
|
|
111
|
+
expect(sig.endOfTurnProbability).toBeGreaterThanOrEqual(0);
|
|
112
|
+
expect(sig.endOfTurnProbability).toBeLessThanOrEqual(1);
|
|
113
|
+
expect([true, false, null]).toContain(sig.agentShouldSpeak);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice next-stage preload predictor — real-MemoryArbiter test (#8809 C5).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors `packages/benchmarks/memperf/co-residency.test.ts`: drives the REAL
|
|
5
|
+
* `MemoryArbiter` (no models, no FFI) with a synthetic, SIZED "text" capability
|
|
6
|
+
* and a real `capacitorPressureSource`, then asserts the predictor's
|
|
7
|
+
* `onAsrStageComplete()` warms the next-stage text model under nominal pressure
|
|
8
|
+
* (resident before its first request) and is REFUSED under critical pressure
|
|
9
|
+
* (not resident). This exercises the genuine `preload` guard — not a stub.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
|
|
14
|
+
import { MemoryArbiter } from "../memory-arbiter";
|
|
15
|
+
import { capacitorPressureSource } from "../memory-pressure";
|
|
16
|
+
import { SharedResourceRegistry } from "./shared-resources";
|
|
17
|
+
import { VoicePreloadPredictor } from "./voice-preload-predictor";
|
|
18
|
+
|
|
19
|
+
const TEXT_MODEL_KEY = "eliza-1-4b";
|
|
20
|
+
const TEXT_MODEL_MB = 1200;
|
|
21
|
+
|
|
22
|
+
function makeHarness(budgetMb: number) {
|
|
23
|
+
const pressure = capacitorPressureSource();
|
|
24
|
+
const arbiter = new MemoryArbiter({
|
|
25
|
+
registry: new SharedResourceRegistry(),
|
|
26
|
+
pressureSource: pressure,
|
|
27
|
+
budgetMb: () => budgetMb,
|
|
28
|
+
});
|
|
29
|
+
// Synthetic SIZED text loader — the next-stage model the arbiter owns on the
|
|
30
|
+
// mobile path. No FFI; load() just yields a marker object.
|
|
31
|
+
arbiter.registerCapability({
|
|
32
|
+
capability: "text",
|
|
33
|
+
estimatedMb: TEXT_MODEL_MB,
|
|
34
|
+
load: async () => ({ cap: "text" as const }),
|
|
35
|
+
unload: async () => {},
|
|
36
|
+
run: async () => ({}),
|
|
37
|
+
});
|
|
38
|
+
arbiter.start();
|
|
39
|
+
const predictor = new VoicePreloadPredictor({
|
|
40
|
+
arbiter,
|
|
41
|
+
resolveTextModelKey: () => TEXT_MODEL_KEY,
|
|
42
|
+
});
|
|
43
|
+
return { arbiter, pressure, predictor };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function textResident(arbiter: MemoryArbiter): boolean {
|
|
47
|
+
return arbiter
|
|
48
|
+
.residentSnapshot()
|
|
49
|
+
.some((e) => e.capability === "text" && e.modelKey === TEXT_MODEL_KEY);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
describe("VoicePreloadPredictor — real arbiter next-stage preload", () => {
|
|
53
|
+
it("warms the next-stage text model under nominal pressure + sufficient budget", async () => {
|
|
54
|
+
const { arbiter, predictor } = makeHarness(8000);
|
|
55
|
+
try {
|
|
56
|
+
// Before the ASR stage finishes the text model is not resident.
|
|
57
|
+
expect(textResident(arbiter)).toBe(false);
|
|
58
|
+
|
|
59
|
+
const warmed = await predictor.onAsrStageComplete();
|
|
60
|
+
|
|
61
|
+
// The predictor warmed the text model: it is RESIDENT before its first
|
|
62
|
+
// request, so the post-ASR verifier pays no cold load.
|
|
63
|
+
expect(warmed).toBe(TEXT_MODEL_KEY);
|
|
64
|
+
expect(textResident(arbiter)).toBe(true);
|
|
65
|
+
} finally {
|
|
66
|
+
await arbiter.shutdown();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("refuses the preload under critical pressure (next-stage model not resident)", async () => {
|
|
71
|
+
const { arbiter, pressure, predictor } = makeHarness(8000);
|
|
72
|
+
try {
|
|
73
|
+
// The OS flags critical memory pressure while ASR is running.
|
|
74
|
+
pressure.dispatch("critical", 32);
|
|
75
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
76
|
+
expect(arbiter.currentPressureLevel()).toBe("critical");
|
|
77
|
+
|
|
78
|
+
const warmed = await predictor.onAsrStageComplete();
|
|
79
|
+
|
|
80
|
+
// preload is REFUSED: returns null (not the key), and the text model is
|
|
81
|
+
// NOT resident — the predictor never forces a load onto a system the OS
|
|
82
|
+
// has already flagged as in trouble.
|
|
83
|
+
expect(warmed).toBeNull();
|
|
84
|
+
expect(textResident(arbiter)).toBe(false);
|
|
85
|
+
} finally {
|
|
86
|
+
await arbiter.shutdown();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("refuses the preload when the next-stage footprint exceeds the budget", async () => {
|
|
91
|
+
// Budget below the text model's footprint → preload declines (no eviction
|
|
92
|
+
// theatre, no forced load) even under nominal pressure.
|
|
93
|
+
const { arbiter, predictor } = makeHarness(TEXT_MODEL_MB - 1);
|
|
94
|
+
try {
|
|
95
|
+
const warmed = await predictor.onAsrStageComplete();
|
|
96
|
+
expect(warmed).toBeNull();
|
|
97
|
+
expect(textResident(arbiter)).toBe(false);
|
|
98
|
+
} finally {
|
|
99
|
+
await arbiter.shutdown();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("declines to predict when no text model is assigned", async () => {
|
|
104
|
+
const pressure = capacitorPressureSource();
|
|
105
|
+
const noModelArbiter = new MemoryArbiter({
|
|
106
|
+
registry: new SharedResourceRegistry(),
|
|
107
|
+
pressureSource: pressure,
|
|
108
|
+
budgetMb: () => 8000,
|
|
109
|
+
});
|
|
110
|
+
noModelArbiter.registerCapability({
|
|
111
|
+
capability: "text",
|
|
112
|
+
estimatedMb: TEXT_MODEL_MB,
|
|
113
|
+
load: async () => ({ cap: "text" as const }),
|
|
114
|
+
unload: async () => {},
|
|
115
|
+
run: async () => ({}),
|
|
116
|
+
});
|
|
117
|
+
noModelArbiter.start();
|
|
118
|
+
const predictor = new VoicePreloadPredictor({
|
|
119
|
+
arbiter: noModelArbiter,
|
|
120
|
+
resolveTextModelKey: () => null,
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
const warmed = await predictor.onAsrStageComplete();
|
|
124
|
+
expect(warmed).toBeNull();
|
|
125
|
+
expect(textResident(noModelArbiter)).toBe(false);
|
|
126
|
+
} finally {
|
|
127
|
+
await noModelArbiter.shutdown();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice next-stage preload predictor (#8809 C5).
|
|
3
|
+
*
|
|
4
|
+
* A voice turn runs its stages sequentially on a memory-constrained device:
|
|
5
|
+
* ASR → text-response → TTS (AGENTS.md §4). The text-response model is the one
|
|
6
|
+
* the {@link MemoryArbiter} owns on the mobile / Capacitor path (where text
|
|
7
|
+
* generation routes through `arbiter` rather than the desktop direct-engine
|
|
8
|
+
* dispatcher). That model is NOT resident while ASR is running — so the first
|
|
9
|
+
* text request of the turn pays the full cold load on the critical path,
|
|
10
|
+
* stalling time-to-first-token right when the user has stopped speaking.
|
|
11
|
+
*
|
|
12
|
+
* This predictor closes that gap with a single, deterministic prediction: the
|
|
13
|
+
* instant ASR finishes, the next arbiter-managed stage is the `"text"` model,
|
|
14
|
+
* so warm it now. It calls {@link ArbiterPreloader.preload} with the resolved
|
|
15
|
+
* text model key. `preload` is intentionally conservative — it only loads under
|
|
16
|
+
* nominal pressure when the configured budget proves the footprint fits, and
|
|
17
|
+
* returns `false` otherwise (low / critical pressure, or no headroom). The
|
|
18
|
+
* predictor never forces a load; it never touches the engine directly; it owns
|
|
19
|
+
* no model handle. It is the prediction, nothing more.
|
|
20
|
+
*
|
|
21
|
+
* Injectable by construction: it depends only on the `preload` surface of the
|
|
22
|
+
* arbiter and the resolved text model key, so it is unit-testable against the
|
|
23
|
+
* real arbiter with a synthetic capability and carries no transitive coupling
|
|
24
|
+
* to the FFI engine, the voice pipeline, or the device bridge.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { ArbiterCapability } from "../memory-arbiter";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The slice of {@link MemoryArbiter} the predictor needs. Narrowed to `preload`
|
|
31
|
+
* so the predictor can be injected with the real arbiter (which satisfies this
|
|
32
|
+
* structurally) or a test double, with no other surface area in scope.
|
|
33
|
+
*/
|
|
34
|
+
export interface ArbiterPreloader {
|
|
35
|
+
preload(capability: ArbiterCapability, modelKey: string): Promise<boolean>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface VoicePreloadPredictorOptions {
|
|
39
|
+
/** The arbiter (or anything exposing its `preload`) to warm the model on. */
|
|
40
|
+
arbiter: ArbiterPreloader;
|
|
41
|
+
/**
|
|
42
|
+
* Resolves the arbiter-managed text-response model key for the current turn.
|
|
43
|
+
* A function (not a bare string) so the predictor reflects a model swap
|
|
44
|
+
* between turns without being rebuilt. Returning `null` means "no text model
|
|
45
|
+
* is assigned yet" — the predictor then declines to predict rather than
|
|
46
|
+
* guessing a key.
|
|
47
|
+
*/
|
|
48
|
+
resolveTextModelKey: () => string | null;
|
|
49
|
+
/** Optional structured logger. Messages are prefixed `[voice-preload-predictor]`. */
|
|
50
|
+
logger?: {
|
|
51
|
+
debug?: (message: string) => void;
|
|
52
|
+
warn?: (message: string) => void;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The capability the next voice stage uses. On the arbiter-routed mobile path
|
|
58
|
+
* the response after ASR is plain text generation.
|
|
59
|
+
*/
|
|
60
|
+
const NEXT_STAGE_CAPABILITY: ArbiterCapability = "text";
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Predicts the next arbiter-managed model for a voice turn and warms it.
|
|
64
|
+
*
|
|
65
|
+
* Wire {@link VoicePreloadPredictor.onAsrStageComplete} to the voice pipeline's
|
|
66
|
+
* `onAsrComplete` event (the instant ASR emits its final token, which is also
|
|
67
|
+
* the drafter/verifier kick-off point): that is the genuine seam where the next
|
|
68
|
+
* stage is known and the arbiter owns its model.
|
|
69
|
+
*/
|
|
70
|
+
export class VoicePreloadPredictor {
|
|
71
|
+
private readonly arbiter: ArbiterPreloader;
|
|
72
|
+
private readonly resolveTextModelKey: () => string | null;
|
|
73
|
+
private readonly logger: VoicePreloadPredictorOptions["logger"];
|
|
74
|
+
|
|
75
|
+
constructor(options: VoicePreloadPredictorOptions) {
|
|
76
|
+
this.arbiter = options.arbiter;
|
|
77
|
+
this.resolveTextModelKey = options.resolveTextModelKey;
|
|
78
|
+
this.logger = options.logger;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Called when the ASR stage of the current turn completes. Predicts the
|
|
83
|
+
* next-stage text model and asks the arbiter to warm it.
|
|
84
|
+
*
|
|
85
|
+
* Resolves to the model key that was warmed (resident or freshly loaded), or
|
|
86
|
+
* `null` when no prediction was made or the arbiter declined the preload
|
|
87
|
+
* (pressure / no budget headroom). Never throws on a declined preload — a
|
|
88
|
+
* predictor that breaks the voice loop is worse than one that does nothing.
|
|
89
|
+
*/
|
|
90
|
+
async onAsrStageComplete(): Promise<string | null> {
|
|
91
|
+
const textModelKey = this.resolveTextModelKey();
|
|
92
|
+
if (!textModelKey) {
|
|
93
|
+
this.logger?.debug?.(
|
|
94
|
+
"[voice-preload-predictor] no text model assigned; skipping next-stage preload",
|
|
95
|
+
);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const warmed = await this.arbiter.preload(
|
|
99
|
+
NEXT_STAGE_CAPABILITY,
|
|
100
|
+
textModelKey,
|
|
101
|
+
);
|
|
102
|
+
if (!warmed) {
|
|
103
|
+
this.logger?.debug?.(
|
|
104
|
+
`[voice-preload-predictor] arbiter declined preload of text/${textModelKey} (pressure or no budget headroom)`,
|
|
105
|
+
);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
this.logger?.debug?.(
|
|
109
|
+
`[voice-preload-predictor] warmed next-stage text/${textModelKey} during ASR stage`,
|
|
110
|
+
);
|
|
111
|
+
return textModelKey;
|
|
112
|
+
}
|
|
113
|
+
}
|