@elizaos/plugin-local-inference 2.0.3-beta.2 → 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/README.md +84 -10
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -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.map +1 -0
- package/dist/index.js +39647 -0
- package/dist/index.js.map +217 -0
- package/{src → dist}/local-inference-routes.d.ts +9 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts.map +1 -0
- package/{src → dist}/routes/compat-helpers.d.ts +1 -1
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/{src → dist}/routes/index.d.ts +1 -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/{src → dist}/routes/live-diarization-route.d.ts +7 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -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.map +1 -0
- package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/{src → dist}/runtime/index.d.ts +1 -1
- 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/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/{src → dist}/services/active-model.d.ts +28 -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/{src → dist}/services/assignments.d.ts +16 -3
- 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/{src → dist}/services/backend.d.ts +110 -16
- package/dist/services/backend.d.ts.map +1 -0
- package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts.map +1 -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.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.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.map +1 -0
- package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/{src → dist}/services/device-tier.d.ts +19 -1
- package/dist/services/device-tier.d.ts.map +1 -0
- package/{src → dist}/services/downloader.d.ts +16 -4
- package/dist/services/downloader.d.ts.map +1 -0
- package/{src → dist}/services/engine.d.ts +43 -4
- 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.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/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -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.map +1 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/{src → dist}/services/index.d.ts +3 -1
- 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.map +1 -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.map +1 -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.map +1 -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/{src → dist}/services/manifest/schema.d.ts +196 -6
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/{src → dist}/services/manifest/types.d.ts +3 -1
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/{src → dist}/services/memory-arbiter.d.ts +33 -3
- 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/{src → dist}/services/memory-monitor.d.ts +6 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/{src → dist}/services/registry.d.ts +11 -13
- package/dist/services/registry.d.ts.map +1 -0
- package/{src → dist}/services/router-handler.d.ts +2 -2
- package/dist/services/router-handler.d.ts.map +1 -0
- package/{src → dist}/services/routing-policy.d.ts +32 -9
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/{src → dist}/services/service.d.ts +1 -1
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts.map +1 -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.map +1 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/{src → dist}/services/types.d.ts +1 -1
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/{src → dist}/services/vision/index.d.ts +1 -1
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/{src → dist}/services/vision/types.d.ts +13 -4
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
- 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/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -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.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/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
- 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/{src → dist}/services/voice/embedding.d.ts +2 -3
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/{src → dist}/services/voice/errors.d.ts +1 -1
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/{src → dist}/services/voice/index.d.ts +8 -3
- 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/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -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.map +1 -0
- package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
- 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.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -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/{src → dist}/services/voice/mic-source.d.ts +1 -1
- 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.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/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -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/{src → dist}/services/voice/shared-resources.d.ts +14 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -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.map +1 -0
- package/{src → dist}/services/voice/transcriber.d.ts +4 -4
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/{src → dist}/services/voice/types.d.ts +6 -6
- package/dist/services/voice/types.d.ts.map +1 -0
- package/{src → dist}/services/voice/vad.d.ts +6 -5
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -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/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -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.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/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -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.map +1 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -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 +28 -9
- package/registry-entry.json +137 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +1 -1
- package/src/adapters/capacitor-llama/index.ts +28 -4
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +1 -1
- package/src/local-inference-routes.test.ts +57 -11
- package/src/local-inference-routes.ts +90 -8
- package/src/provider.ts +32 -3
- package/src/routes/compat-helpers.ts +2 -1
- package/src/routes/index.ts +1 -0
- package/src/routes/live-diarization-route.test.ts +134 -0
- package/src/routes/live-diarization-route.ts +79 -3
- package/src/routes/local-inference-asr-route.test.ts +43 -2
- package/src/routes/local-inference-asr-route.ts +7 -4
- package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
- package/src/routes/local-inference-asr-transcribe.ts +1 -1
- package/src/routes/local-inference-compat-routes.test.ts +3 -3
- package/src/routes/local-inference-compat-routes.ts +23 -56
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcripts-routes.test.ts +51 -0
- package/src/routes/transcripts-routes.ts +35 -3
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
- package/src/runtime/ensure-local-inference-handler.ts +203 -11
- package/src/runtime/index.ts +4 -1
- package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
- package/src/runtime/mobile-local-inference-gate.ts +60 -5
- package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
- package/src/runtime/voice-entity-binding.ts +46 -6
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +2 -2
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model.ts +211 -8
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +26 -0
- package/src/services/assignments.ts +52 -4
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +198 -19
- package/src/services/bionic-host-loader.test.ts +94 -1
- package/src/services/bionic-host-loader.ts +72 -0
- package/src/services/cache-bridge.test.ts +7 -7
- package/src/services/catalog.test.ts +32 -11
- package/src/services/catalog.ts +6 -0
- package/src/services/cloud-fallback.ts +1 -1
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
- package/src/services/device-tier.test.ts +89 -2
- package/src/services/device-tier.ts +103 -11
- package/src/services/downloader.test.ts +199 -58
- package/src/services/downloader.ts +141 -27
- package/src/services/engine-direct-bundle.test.ts +38 -6
- package/src/services/engine.ts +291 -104
- package/src/services/ensure-local-artifacts.ts +1 -1
- package/src/services/ffi-llm-streaming-abi.ts +6 -3
- package/src/services/ffi-streaming-backend.ts +44 -8
- package/src/services/ffi-streaming-runner.test.ts +163 -3
- package/src/services/ffi-streaming-runner.ts +54 -1
- package/src/services/ffi-unload-ordering.test.ts +5 -1
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/hardware.test.ts +7 -2
- package/src/services/hardware.ts +28 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/sd-cpp.ts +6 -9
- package/src/services/index.ts +18 -0
- package/src/services/ios-llama-streaming.ts +1 -1
- package/src/services/kv-spill.ts +6 -5
- 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/manifest/eliza-1.manifest.v1.json +84 -2
- package/src/services/manifest/index.ts +6 -0
- package/src/services/manifest/manifest.test.ts +156 -54
- package/src/services/manifest/schema.ts +160 -52
- package/src/services/manifest/types.ts +6 -0
- package/src/services/manifest/validator.ts +91 -25
- package/src/services/memory-arbiter.test.ts +139 -0
- package/src/services/memory-arbiter.ts +81 -15
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +24 -0
- package/src/services/memory-monitor.ts +12 -0
- package/src/services/mtp-doctor.ts +10 -2
- package/src/services/network-policy.ts +5 -5
- package/src/services/ram-budget-cache.test.ts +2 -1
- package/src/services/ram-budget.ts +0 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/registry.ts +25 -19
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.ts +43 -24
- package/src/services/routing-policy.test.ts +211 -23
- package/src/services/routing-policy.ts +92 -22
- package/src/services/service.test.ts +3 -3
- package/src/services/service.ts +22 -7
- package/src/services/transcription-priority.test.ts +2 -2
- package/src/services/types.ts +4 -0
- package/src/services/verify-on-device.test.ts +2 -2
- package/src/services/vision/hash.ts +1 -1
- package/src/services/vision/index.ts +2 -2
- package/src/services/vision/llama-server.ts +1 -1
- package/src/services/vision/types.ts +13 -4
- package/src/services/vision-embedding-cache.ts +1 -1
- package/src/services/voice/VOICE_WORKBENCH.md +71 -26
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
- package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
- 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 +6 -8
- package/src/services/voice/audio-frame-consumer.test.ts +327 -1
- package/src/services/voice/audio-frame-consumer.ts +165 -5
- package/src/services/voice/barge-in.ts +2 -3
- 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 +2 -2
- package/src/services/voice/e2e-harness.ts +175 -16
- 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 +22 -22
- package/src/services/voice/embedding.ts +2 -3
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.ts +151 -110
- package/src/services/voice/eot-classifier-ggml.ts +42 -39
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +11 -122
- package/src/services/voice/errors.ts +2 -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 +8 -8
- package/src/services/voice/ffi-bindings.test.ts +10 -3
- package/src/services/voice/ffi-bindings.ts +177 -15
- package/src/services/voice/fused-eot-scorer.ts +17 -13
- package/src/services/voice/index.ts +33 -12
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
- package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
- package/src/services/voice/kokoro/pick-runtime.ts +1 -1
- package/src/services/voice/kokoro/runtime-selection.ts +28 -201
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +335 -2
- 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.ts +1 -1
- 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/partial-stabilizer.ts +1 -1
- package/src/services/voice/pipeline.ts +3 -4
- 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/samantha-preset-regenerator.wav.test.ts +90 -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 +23 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.ts +4 -4
- package/src/services/voice/transcript-service.test.ts +58 -0
- package/src/services/voice/transcript-service.ts +64 -0
- package/src/services/voice/transcript-store.test.ts +36 -0
- package/src/services/voice/transcript-store.ts +32 -0
- package/src/services/voice/types.ts +7 -7
- package/src/services/voice/vad.test.ts +33 -15
- package/src/services/voice/vad.ts +25 -20
- package/src/services/voice/voice-budget.test.ts +0 -3
- package/src/services/voice/voice-budget.ts +6 -6
- package/src/services/voice/voice-duet.test.ts +1 -1
- 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 +17 -4
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +133 -7
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-workbench-report.ts +58 -17
- package/src/services/voice/wake-word-ggml.ts +12 -13
- 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-prewarm.ts +1 -1
- package/src/voice-workbench.ts +71 -0
- package/src/actions/generate-media.d.ts.map +0 -1
- package/src/actions/identify-speaker.d.ts.map +0 -1
- package/src/actions/transcription-control.d.ts.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/local-inference-routes.d.ts.map +0 -1
- package/src/provider.d.ts.map +0 -1
- package/src/routes/compat-helpers.d.ts.map +0 -1
- package/src/routes/family-member-route.d.ts.map +0 -1
- package/src/routes/index.d.ts.map +0 -1
- package/src/routes/live-diarization-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
- package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
- package/src/routes/local-inference-tts-route.d.ts.map +0 -1
- package/src/routes/transcript-audio-store.d.ts.map +0 -1
- package/src/routes/transcripts-routes.d.ts.map +0 -1
- package/src/routes/voice-first-run-routes.d.ts.map +0 -1
- package/src/routes/voice-models-routes.d.ts.map +0 -1
- package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
- package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
- package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
- package/src/runtime/embedding-manager-support.d.ts.map +0 -1
- package/src/runtime/embedding-presets.d.ts.map +0 -1
- package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
- package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
- package/src/runtime/index.d.ts.map +0 -1
- package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
- package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
- package/src/runtime/voice-entity-binding.d.ts.map +0 -1
- package/src/services/active-model.d.ts.map +0 -1
- package/src/services/assignments.d.ts.map +0 -1
- package/src/services/backend.d.ts.map +0 -1
- package/src/services/bionic-host-loader.d.ts.map +0 -1
- package/src/services/bundled-models.d.ts.map +0 -1
- package/src/services/cache-bridge.d.ts.map +0 -1
- package/src/services/catalog.d.ts +0 -10
- package/src/services/catalog.d.ts.map +0 -1
- package/src/services/checkpoint-client.d.ts.map +0 -1
- package/src/services/cloud-fallback.d.ts.map +0 -1
- package/src/services/conversation-registry.d.ts.map +0 -1
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
- package/src/services/device-bridge.d.ts.map +0 -1
- package/src/services/device-resource-metrics.d.ts.map +0 -1
- package/src/services/device-tier.d.ts.map +0 -1
- package/src/services/downloader.d.ts.map +0 -1
- package/src/services/engine.d.ts.map +0 -1
- package/src/services/external-scanner.d.ts.map +0 -1
- package/src/services/ffi-streaming-backend.d.ts.map +0 -1
- package/src/services/ffi-streaming-runner.d.ts.map +0 -1
- package/src/services/gpu-detect.d.ts.map +0 -1
- package/src/services/handler-registry.d.ts.map +0 -1
- package/src/services/hardware.d.ts.map +0 -1
- package/src/services/hf-search.d.ts +0 -26
- package/src/services/hf-search.d.ts.map +0 -1
- package/src/services/hf-search.test.ts +0 -69
- package/src/services/hf-search.ts +0 -420
- package/src/services/image-description-runtime.d.ts.map +0 -1
- package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/backend-selector.d.ts.map +0 -1
- package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/errors.d.ts.map +0 -1
- package/src/services/imagegen/index.d.ts.map +0 -1
- package/src/services/imagegen/mflux.d.ts.map +0 -1
- package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/types.d.ts.map +0 -1
- package/src/services/index.d.ts.map +0 -1
- package/src/services/inference-capabilities.d.ts.map +0 -1
- package/src/services/inference-telemetry.d.ts.map +0 -1
- package/src/services/kv-spill.d.ts.map +0 -1
- package/src/services/latency-trace.d.ts.map +0 -1
- package/src/services/llm-streaming-binding.d.ts.map +0 -1
- package/src/services/load-args.d.ts.map +0 -1
- package/src/services/manifest/index.d.ts +0 -4
- package/src/services/manifest/index.d.ts.map +0 -1
- package/src/services/manifest/schema.d.ts.map +0 -1
- package/src/services/manifest/types.d.ts.map +0 -1
- package/src/services/manifest/validator.d.ts.map +0 -1
- package/src/services/memory-arbiter.d.ts.map +0 -1
- package/src/services/memory-monitor.d.ts.map +0 -1
- package/src/services/memory-pressure.d.ts.map +0 -1
- package/src/services/mtp-doctor.d.ts.map +0 -1
- package/src/services/network-policy.d.ts.map +0 -1
- package/src/services/paths.d.ts.map +0 -1
- package/src/services/planner-skeleton.d.ts.map +0 -1
- package/src/services/providers.d.ts.map +0 -1
- package/src/services/ram-budget.d.ts.map +0 -1
- package/src/services/readiness.d.ts.map +0 -1
- package/src/services/recommendation.d.ts.map +0 -1
- package/src/services/registry.d.ts.map +0 -1
- package/src/services/router-handler.d.ts.map +0 -1
- package/src/services/routing-policy.d.ts.map +0 -1
- package/src/services/routing-preferences.d.ts.map +0 -1
- package/src/services/runtime-target.d.ts.map +0 -1
- package/src/services/service.d.ts.map +0 -1
- package/src/services/session-pool.d.ts.map +0 -1
- package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
- package/src/services/structured-output.d.ts.map +0 -1
- package/src/services/system-memory.d.ts.map +0 -1
- package/src/services/types.d.ts.map +0 -1
- package/src/services/verify-on-device.d.ts.map +0 -1
- package/src/services/verify.d.ts.map +0 -1
- package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
- package/src/services/vision/capacitor-llama.d.ts.map +0 -1
- package/src/services/vision/cloud-fallback.d.ts.map +0 -1
- package/src/services/vision/hash.d.ts.map +0 -1
- package/src/services/vision/index.d.ts.map +0 -1
- package/src/services/vision/llama-server.d.ts.map +0 -1
- package/src/services/vision/types.d.ts.map +0 -1
- package/src/services/vision/vast-fallback.d.ts.map +0 -1
- package/src/services/vision-embedding-cache.d.ts.map +0 -1
- package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
- package/src/services/voice/barge-in.d.ts.map +0 -1
- package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
- package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
- package/src/services/voice/eager-context-builder.d.ts.map +0 -1
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/embedding.d.ts.map +0 -1
- package/src/services/voice/emotion-attribution.d.ts.map +0 -1
- package/src/services/voice/engine-bridge.d.ts.map +0 -1
- package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
- package/src/services/voice/eot-classifier.d.ts.map +0 -1
- package/src/services/voice/errors.d.ts.map +0 -1
- package/src/services/voice/expressive-tags.d.ts.map +0 -1
- package/src/services/voice/ffi-bindings.d.ts.map +0 -1
- package/src/services/voice/first-line-cache.d.ts.map +0 -1
- package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/index.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
- package/src/services/voice/kokoro/types.d.ts.map +0 -1
- package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
- package/src/services/voice/kokoro/voices.d.ts.map +0 -1
- package/src/services/voice/lifecycle.d.ts.map +0 -1
- package/src/services/voice/live-diarization-session.d.ts +0 -96
- package/src/services/voice/live-diarization-session.d.ts.map +0 -1
- package/src/services/voice/mic-source.d.ts.map +0 -1
- package/src/services/voice/optimistic-policy.d.ts.map +0 -1
- package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
- package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
- package/src/services/voice/phrase-cache.d.ts.map +0 -1
- package/src/services/voice/phrase-chunker.d.ts.map +0 -1
- package/src/services/voice/pipeline-impls.d.ts.map +0 -1
- package/src/services/voice/pipeline.d.ts.map +0 -1
- package/src/services/voice/prefill-client.d.ts.map +0 -1
- package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
- package/src/services/voice/profile-store.d.ts.map +0 -1
- package/src/services/voice/ring-buffer.d.ts.map +0 -1
- package/src/services/voice/rollback-queue.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
- package/src/services/voice/scheduler.d.ts.map +0 -1
- package/src/services/voice/shared-resources.d.ts.map +0 -1
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder.d.ts.map +0 -1
- package/src/services/voice/speaker-imprint.d.ts.map +0 -1
- package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
- package/src/services/voice/system-audio-sink.d.ts.map +0 -1
- package/src/services/voice/transcriber.d.ts.map +0 -1
- package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
- package/src/services/voice/transcript-service.d.ts.map +0 -1
- package/src/services/voice/transcript-store.d.ts.map +0 -1
- package/src/services/voice/turn-controller.d.ts.map +0 -1
- package/src/services/voice/types.d.ts.map +0 -1
- package/src/services/voice/vad.d.ts.map +0 -1
- package/src/services/voice/voice-budget.d.ts.map +0 -1
- package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
- package/src/services/voice/voice-preset-format.d.ts.map +0 -1
- package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
- package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
- package/src/services/voice/voice-settings.d.ts +0 -82
- package/src/services/voice/voice-settings.d.ts.map +0 -1
- package/src/services/voice/voice-settings.ts +0 -172
- package/src/services/voice/voice-state-machine.d.ts.map +0 -1
- package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
- package/src/services/voice/wake-word.d.ts.map +0 -1
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
- package/src/services/voice-model-updater.d.ts.map +0 -1
- package/src/services/voice-prewarm.d.ts.map +0 -1
- /package/{src → dist}/actions/generate-media.d.ts +0 -0
- /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
- /package/{src → dist}/actions/transcription-control.d.ts +0 -0
- /package/{src → dist}/index.d.ts +0 -0
- /package/{src → dist}/provider.d.ts +0 -0
- /package/{src → dist}/routes/family-member-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
- /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
- /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
- /package/{src → dist}/services/bundled-models.d.ts +0 -0
- /package/{src → dist}/services/cache-bridge.d.ts +0 -0
- /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
- /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/conversation-registry.d.ts +0 -0
- /package/{src → dist}/services/device-bridge.d.ts +0 -0
- /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
- /package/{src → dist}/services/external-scanner.d.ts +0 -0
- /package/{src → dist}/services/gpu-detect.d.ts +0 -0
- /package/{src → dist}/services/handler-registry.d.ts +0 -0
- /package/{src → dist}/services/hardware.d.ts +0 -0
- /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
- /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
- /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
- /package/{src → dist}/services/imagegen/index.d.ts +0 -0
- /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
- /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/types.d.ts +0 -0
- /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
- /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
- /package/{src → dist}/services/kv-spill.d.ts +0 -0
- /package/{src → dist}/services/latency-trace.d.ts +0 -0
- /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
- /package/{src → dist}/services/load-args.d.ts +0 -0
- /package/{src → dist}/services/manifest/validator.d.ts +0 -0
- /package/{src → dist}/services/memory-pressure.d.ts +0 -0
- /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
- /package/{src → dist}/services/network-policy.d.ts +0 -0
- /package/{src → dist}/services/paths.d.ts +0 -0
- /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
- /package/{src → dist}/services/providers.d.ts +0 -0
- /package/{src → dist}/services/ram-budget.d.ts +0 -0
- /package/{src → dist}/services/readiness.d.ts +0 -0
- /package/{src → dist}/services/recommendation.d.ts +0 -0
- /package/{src → dist}/services/routing-preferences.d.ts +0 -0
- /package/{src → dist}/services/runtime-target.d.ts +0 -0
- /package/{src → dist}/services/session-pool.d.ts +0 -0
- /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
- /package/{src → dist}/services/structured-output.d.ts +0 -0
- /package/{src → dist}/services/system-memory.d.ts +0 -0
- /package/{src → dist}/services/verify-on-device.d.ts +0 -0
- /package/{src → dist}/services/verify.d.ts +0 -0
- /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
- /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/vision/hash.d.ts +0 -0
- /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
- /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
- /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
- /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
- /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
- /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
- /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
- /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
- /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
- /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
- /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
- /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
- /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
- /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
- /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
- /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
- /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
- /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
- /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
- /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Mutation + random-byte fuzz for the voice-preset binary parser.
|
|
2
|
+
// readVoicePresetFile is documented as "the single defensive boundary for the
|
|
3
|
+
// format", so the hardening invariant is: on ANY bytes it either returns a
|
|
4
|
+
// well-formed VoicePresetFile or throws a VoicePresetFormatError -- never an
|
|
5
|
+
// unexpected RangeError/TypeError from an unchecked DataView read. A seeded LCG
|
|
6
|
+
// makes failures reproducible.
|
|
7
|
+
|
|
8
|
+
import { describe, expect, it } from "vitest";
|
|
9
|
+
import {
|
|
10
|
+
readVoicePresetFile,
|
|
11
|
+
VoicePresetFormatError,
|
|
12
|
+
writeVoicePresetFileV2,
|
|
13
|
+
} from "./voice-preset-format";
|
|
14
|
+
|
|
15
|
+
function makeRng(seed: number): () => number {
|
|
16
|
+
let s = seed >>> 0;
|
|
17
|
+
return () => {
|
|
18
|
+
s = (Math.imul(s, 1664525) + 1013904223) >>> 0;
|
|
19
|
+
return s / 0x100000000;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function randomFloat32(rng: () => number, n: number): Float32Array {
|
|
24
|
+
const out = new Float32Array(n);
|
|
25
|
+
for (let i = 0; i < n; i++) out[i] = (rng() - 0.5) * 4;
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function validBlob(rng: () => number): Uint8Array {
|
|
30
|
+
const phrases = Array.from({ length: Math.floor(rng() * 3) }, (_, i) => ({
|
|
31
|
+
text: `phrase ${i}`,
|
|
32
|
+
sampleRate: 24000,
|
|
33
|
+
pcm: randomFloat32(rng, Math.floor(rng() * 8)),
|
|
34
|
+
}));
|
|
35
|
+
return writeVoicePresetFileV2({
|
|
36
|
+
embedding: randomFloat32(rng, Math.floor(rng() * 10)),
|
|
37
|
+
phrases,
|
|
38
|
+
refText: rng() < 0.5 ? "reference" : "",
|
|
39
|
+
instruct: rng() < 0.5 ? "speak" : "",
|
|
40
|
+
metadata: rng() < 0.5 ? { voice: "af" } : {},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Either a valid parse or the format's own error -- never anything else. */
|
|
45
|
+
function assertSafeParse(bytes: Uint8Array): void {
|
|
46
|
+
let result: ReturnType<typeof readVoicePresetFile> | undefined;
|
|
47
|
+
try {
|
|
48
|
+
result = readVoicePresetFile(bytes);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
expect(
|
|
51
|
+
err instanceof VoicePresetFormatError,
|
|
52
|
+
`expected VoicePresetFormatError, got ${(err as Error)?.name}: ${(err as Error)?.message}`,
|
|
53
|
+
).toBe(true);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// A non-throwing parse must still be a well-formed record.
|
|
57
|
+
expect(typeof result.version).toBe("number");
|
|
58
|
+
expect(result.embedding).toBeInstanceOf(Float32Array);
|
|
59
|
+
expect(Array.isArray(result.phrases)).toBe(true);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
describe("readVoicePresetFile - fuzz", () => {
|
|
63
|
+
it("never throws anything but VoicePresetFormatError on random bytes", () => {
|
|
64
|
+
const rng = makeRng(0xb10b);
|
|
65
|
+
for (let i = 0; i < 1500; i++) {
|
|
66
|
+
const len = Math.floor(rng() * 96);
|
|
67
|
+
const bytes = new Uint8Array(len);
|
|
68
|
+
for (let j = 0; j < len; j++) bytes[j] = Math.floor(rng() * 256);
|
|
69
|
+
assertSafeParse(bytes);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("never throws anything but VoicePresetFormatError on mutated valid blobs", () => {
|
|
74
|
+
const rng = makeRng(0x7a11);
|
|
75
|
+
for (let i = 0; i < 1500; i++) {
|
|
76
|
+
const blob = validBlob(rng);
|
|
77
|
+
// Round-trip sanity: an unmutated blob parses cleanly.
|
|
78
|
+
expect(() => readVoicePresetFile(blob)).not.toThrow();
|
|
79
|
+
// Now flip a handful of random bytes and re-parse.
|
|
80
|
+
const mutated = blob.slice();
|
|
81
|
+
const flips = 1 + Math.floor(rng() * 6);
|
|
82
|
+
for (let f = 0; f < flips && mutated.length > 0; f++) {
|
|
83
|
+
const idx = Math.floor(rng() * mutated.length);
|
|
84
|
+
mutated[idx] = Math.floor(rng() * 256);
|
|
85
|
+
}
|
|
86
|
+
assertSafeParse(mutated);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Round-trip coverage for the voice-preset binary (de)serializer. The format is
|
|
2
|
+
// the on-disk shape for enrolled TTS voice presets, and readVoicePresetFile is
|
|
3
|
+
// "the single defensive boundary for the format" — so we pin that a written
|
|
4
|
+
// preset reads back byte-for-byte (v1 + v2) and that malformed input throws.
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import {
|
|
8
|
+
readVoicePresetFile,
|
|
9
|
+
VOICE_PRESET_VERSION_V1,
|
|
10
|
+
VOICE_PRESET_VERSION_V2,
|
|
11
|
+
VoicePresetFormatError,
|
|
12
|
+
writeVoicePresetFile,
|
|
13
|
+
writeVoicePresetFileV2,
|
|
14
|
+
} from "./voice-preset-format";
|
|
15
|
+
|
|
16
|
+
// Values chosen to be exactly representable in float32 so the round-trip is
|
|
17
|
+
// bit-exact (no rounding to reason about).
|
|
18
|
+
const embedding = new Float32Array([0.5, -0.25, 0.75, -1]);
|
|
19
|
+
const phrases = [
|
|
20
|
+
{
|
|
21
|
+
text: "hello there",
|
|
22
|
+
sampleRate: 24000,
|
|
23
|
+
pcm: new Float32Array([0.5, -0.5]),
|
|
24
|
+
},
|
|
25
|
+
{ text: "", sampleRate: 16000, pcm: new Float32Array([0.25]) },
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
describe("voice-preset-format round-trip", () => {
|
|
29
|
+
it("writes and reads back a v1 preset (embedding + phrases)", () => {
|
|
30
|
+
const parsed = readVoicePresetFile(
|
|
31
|
+
writeVoicePresetFile({ embedding, phrases }),
|
|
32
|
+
);
|
|
33
|
+
expect(parsed.version).toBe(VOICE_PRESET_VERSION_V1);
|
|
34
|
+
expect(Array.from(parsed.embedding)).toEqual(Array.from(embedding));
|
|
35
|
+
expect(parsed.phrases).toHaveLength(2);
|
|
36
|
+
expect(parsed.phrases[0].text).toBe("hello there");
|
|
37
|
+
expect(parsed.phrases[0].sampleRate).toBe(24000);
|
|
38
|
+
expect(Array.from(parsed.phrases[0].pcm)).toEqual([0.5, -0.5]);
|
|
39
|
+
expect(parsed.phrases[1].text).toBe("");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("writes and reads back a v2 preset (refText/instruct/metadata/tokens)", () => {
|
|
43
|
+
const parsed = readVoicePresetFile(
|
|
44
|
+
writeVoicePresetFileV2({
|
|
45
|
+
embedding,
|
|
46
|
+
phrases,
|
|
47
|
+
refText: "reference line",
|
|
48
|
+
instruct: "speak warmly",
|
|
49
|
+
metadata: { voiceId: "af_bella", lang: "en" },
|
|
50
|
+
refAudioTokens: { K: 2, refT: 2, tokens: new Int32Array([1, 2, 3, 4]) },
|
|
51
|
+
}),
|
|
52
|
+
);
|
|
53
|
+
expect(parsed.version).toBe(VOICE_PRESET_VERSION_V2);
|
|
54
|
+
expect(Array.from(parsed.embedding)).toEqual(Array.from(embedding));
|
|
55
|
+
expect(parsed.refText).toBe("reference line");
|
|
56
|
+
expect(parsed.instruct).toBe("speak warmly");
|
|
57
|
+
expect(parsed.metadata).toEqual({ voiceId: "af_bella", lang: "en" });
|
|
58
|
+
expect(parsed.refAudioTokens.K).toBe(2);
|
|
59
|
+
expect(Array.from(parsed.refAudioTokens.tokens)).toEqual([1, 2, 3, 4]);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("rejects a ref_audio_tokens shape mismatch", () => {
|
|
63
|
+
expect(() =>
|
|
64
|
+
writeVoicePresetFileV2({
|
|
65
|
+
refAudioTokens: { K: 2, refT: 2, tokens: new Int32Array([1, 2, 3]) },
|
|
66
|
+
}),
|
|
67
|
+
).toThrow(VoicePresetFormatError);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("throws on a malformed blob (the single defensive boundary)", () => {
|
|
71
|
+
expect(() => readVoicePresetFile(new Uint8Array([1, 2, 3, 4]))).toThrow(
|
|
72
|
+
VoicePresetFormatError,
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -133,7 +133,8 @@ export class VoicePresetFormatError extends Error {
|
|
|
133
133
|
| "bad-phrase-record"
|
|
134
134
|
| "bad-embedding-length"
|
|
135
135
|
| "bad-ref-tokens"
|
|
136
|
-
| "bad-metadata"
|
|
136
|
+
| "bad-metadata"
|
|
137
|
+
| "bad-utf8",
|
|
137
138
|
) {
|
|
138
139
|
super(message);
|
|
139
140
|
this.name = "VoicePresetFormatError";
|
|
@@ -349,10 +350,23 @@ function readRefAudioTokens(
|
|
|
349
350
|
return { K, refT, tokens };
|
|
350
351
|
}
|
|
351
352
|
|
|
353
|
+
/** Strict UTF-8 decode that surfaces invalid bytes as the format's own error
|
|
354
|
+
* rather than leaking a raw TextDecoder TypeError past the defensive boundary. */
|
|
355
|
+
function decodeUtf8Strict(bytes: Uint8Array): string {
|
|
356
|
+
try {
|
|
357
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
358
|
+
} catch {
|
|
359
|
+
throw new VoicePresetFormatError(
|
|
360
|
+
"voice preset contains invalid UTF-8 text",
|
|
361
|
+
"bad-utf8",
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
352
366
|
function readUtf8(bytes: Uint8Array, sec: SectionView): string {
|
|
353
367
|
if (sec.length === 0) return "";
|
|
354
368
|
const slice = bytes.subarray(sec.offset, sec.offset + sec.length);
|
|
355
|
-
return
|
|
369
|
+
return decodeUtf8Strict(slice);
|
|
356
370
|
}
|
|
357
371
|
|
|
358
372
|
function readMetadata(
|
|
@@ -389,7 +403,6 @@ function readPhrases(
|
|
|
389
403
|
bytes.byteOffset + sec.offset,
|
|
390
404
|
sec.length,
|
|
391
405
|
);
|
|
392
|
-
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
393
406
|
let pos = 0;
|
|
394
407
|
if (sec.length < 4) {
|
|
395
408
|
throw new VoicePresetFormatError(
|
|
@@ -420,7 +433,7 @@ function readPhrases(
|
|
|
420
433
|
bytes.byteOffset + sec.offset + pos,
|
|
421
434
|
textLen,
|
|
422
435
|
);
|
|
423
|
-
const text =
|
|
436
|
+
const text = decodeUtf8Strict(textBytes);
|
|
424
437
|
pos += textLen;
|
|
425
438
|
if (pos + 8 > sec.length) {
|
|
426
439
|
throw new VoicePresetFormatError(
|