@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,59 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { AgentSelfVoiceImprint } from "./self-voice-imprint";
|
|
3
|
+
import type { SpeakerEncoder } from "./speaker/encoder";
|
|
4
|
+
|
|
5
|
+
function unitEmbedding(index: number): Float32Array {
|
|
6
|
+
const out = new Float32Array(256);
|
|
7
|
+
out[index] = 1;
|
|
8
|
+
return out;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function queuedEncoder(
|
|
12
|
+
embeddings: readonly Float32Array[],
|
|
13
|
+
seen: Float32Array[] = [],
|
|
14
|
+
): SpeakerEncoder {
|
|
15
|
+
let cursor = 0;
|
|
16
|
+
return {
|
|
17
|
+
embeddingDim: 256,
|
|
18
|
+
sampleRate: 16_000,
|
|
19
|
+
async encode(pcm: Float32Array): Promise<Float32Array> {
|
|
20
|
+
seen.push(new Float32Array(pcm));
|
|
21
|
+
return embeddings[cursor++] ?? embeddings.at(-1) ?? unitEmbedding(0);
|
|
22
|
+
},
|
|
23
|
+
async dispose(): Promise<void> {},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe("AgentSelfVoiceImprint", () => {
|
|
28
|
+
it("buffers TTS audio, resamples to WeSpeaker rate, and scores similarity", async () => {
|
|
29
|
+
const encodedWindows: Float32Array[] = [];
|
|
30
|
+
const imprint = new AgentSelfVoiceImprint({
|
|
31
|
+
encoder: queuedEncoder([unitEmbedding(0)], encodedWindows),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
await imprint.observeAudio(new Float32Array(12_000).fill(0.1), 24_000);
|
|
35
|
+
expect(await imprint.similarity(unitEmbedding(0))).toBeNull();
|
|
36
|
+
|
|
37
|
+
await imprint.observeAudio(new Float32Array(12_000).fill(0.1), 24_000);
|
|
38
|
+
|
|
39
|
+
expect(encodedWindows).toHaveLength(1);
|
|
40
|
+
expect(encodedWindows[0]?.length).toBe(16_000);
|
|
41
|
+
await expect(imprint.similarity(unitEmbedding(0))).resolves.toBeCloseTo(1);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("maintains a normalized rolling centroid of recent agent voice embeddings", async () => {
|
|
45
|
+
const imprint = new AgentSelfVoiceImprint({
|
|
46
|
+
encoder: queuedEncoder([unitEmbedding(0), unitEmbedding(1)]),
|
|
47
|
+
minSamples: 16_000,
|
|
48
|
+
maxEmbeddings: 2,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
await imprint.observeAudio(new Float32Array(16_000).fill(0.1), 16_000);
|
|
52
|
+
await imprint.observeAudio(new Float32Array(16_000).fill(0.2), 16_000);
|
|
53
|
+
|
|
54
|
+
const diagonal = new Float32Array(256);
|
|
55
|
+
diagonal[0] = Math.SQRT1_2;
|
|
56
|
+
diagonal[1] = Math.SQRT1_2;
|
|
57
|
+
await expect(imprint.similarity(diagonal)).resolves.toBeCloseTo(1);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { averageEmbeddings, type SpeakerEncoder } from "./speaker/encoder";
|
|
2
|
+
import {
|
|
3
|
+
SPEAKER_GGML_MIN_SAMPLES,
|
|
4
|
+
SPEAKER_GGML_SAMPLE_RATE,
|
|
5
|
+
} from "./speaker/encoder-ggml";
|
|
6
|
+
import { cosineSimilarity } from "./speaker-imprint";
|
|
7
|
+
import { resampleLinear } from "./transcriber";
|
|
8
|
+
|
|
9
|
+
export interface AgentSelfVoiceImprintOptions {
|
|
10
|
+
encoder: SpeakerEncoder;
|
|
11
|
+
/** Minimum 16 kHz samples before one self-voice embedding is encoded. */
|
|
12
|
+
minSamples?: number;
|
|
13
|
+
/** Maximum 16 kHz samples to encode for one centroid update. */
|
|
14
|
+
maxSamples?: number;
|
|
15
|
+
/** Number of recent agent-TTS embeddings retained in the centroid. */
|
|
16
|
+
maxEmbeddings?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function concatSegments(
|
|
20
|
+
segments: readonly Float32Array[],
|
|
21
|
+
totalSamples: number,
|
|
22
|
+
): Float32Array {
|
|
23
|
+
const out = new Float32Array(totalSamples);
|
|
24
|
+
let offset = 0;
|
|
25
|
+
for (const segment of segments) {
|
|
26
|
+
out.set(segment, offset);
|
|
27
|
+
offset += segment.length;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Maintains a bounded centroid of the agent's own synthesized voice.
|
|
34
|
+
*
|
|
35
|
+
* The live mic path already gets WeSpeaker embeddings from attribution. This
|
|
36
|
+
* helper observes the PCM that the scheduler hands to audio output, embeds that
|
|
37
|
+
* actual TTS audio, and exposes cosine similarity against future mic turns.
|
|
38
|
+
*/
|
|
39
|
+
export class AgentSelfVoiceImprint {
|
|
40
|
+
private readonly encoder: SpeakerEncoder;
|
|
41
|
+
private readonly minSamples: number;
|
|
42
|
+
private readonly maxSamples: number;
|
|
43
|
+
private readonly maxEmbeddings: number;
|
|
44
|
+
private readonly pendingSegments: Float32Array[] = [];
|
|
45
|
+
private pendingSamples = 0;
|
|
46
|
+
private readonly embeddings: Float32Array[] = [];
|
|
47
|
+
private centroid: Float32Array | null = null;
|
|
48
|
+
private queue: Promise<void> = Promise.resolve();
|
|
49
|
+
|
|
50
|
+
constructor(options: AgentSelfVoiceImprintOptions) {
|
|
51
|
+
this.encoder = options.encoder;
|
|
52
|
+
this.minSamples = options.minSamples ?? SPEAKER_GGML_MIN_SAMPLES;
|
|
53
|
+
this.maxSamples = options.maxSamples ?? SPEAKER_GGML_SAMPLE_RATE * 6;
|
|
54
|
+
this.maxEmbeddings = Math.max(1, options.maxEmbeddings ?? 8);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
observeAudio(pcm: Float32Array, sampleRate: number): Promise<void> {
|
|
58
|
+
const work = this.queue.then(() =>
|
|
59
|
+
this.observeAudioLocked(pcm, sampleRate),
|
|
60
|
+
);
|
|
61
|
+
this.queue = work.catch(() => {});
|
|
62
|
+
return work;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async similarity(embedding: Float32Array): Promise<number | null> {
|
|
66
|
+
await this.queue;
|
|
67
|
+
if (!this.centroid) return null;
|
|
68
|
+
if (embedding.length !== this.centroid.length) return null;
|
|
69
|
+
return cosineSimilarity(embedding, this.centroid);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async observeAudioLocked(
|
|
73
|
+
pcm: Float32Array,
|
|
74
|
+
sampleRate: number,
|
|
75
|
+
): Promise<void> {
|
|
76
|
+
if (pcm.length === 0 || sampleRate <= 0) return;
|
|
77
|
+
const speakerPcm =
|
|
78
|
+
sampleRate === SPEAKER_GGML_SAMPLE_RATE
|
|
79
|
+
? new Float32Array(pcm)
|
|
80
|
+
: resampleLinear(pcm, sampleRate, SPEAKER_GGML_SAMPLE_RATE);
|
|
81
|
+
if (speakerPcm.length === 0) return;
|
|
82
|
+
|
|
83
|
+
this.pendingSegments.push(speakerPcm);
|
|
84
|
+
this.pendingSamples += speakerPcm.length;
|
|
85
|
+
if (this.pendingSamples < this.minSamples) return;
|
|
86
|
+
|
|
87
|
+
const toEncode = concatSegments(this.pendingSegments, this.pendingSamples);
|
|
88
|
+
this.pendingSegments.length = 0;
|
|
89
|
+
this.pendingSamples = 0;
|
|
90
|
+
|
|
91
|
+
const window =
|
|
92
|
+
toEncode.length > this.maxSamples
|
|
93
|
+
? toEncode.subarray(0, this.maxSamples)
|
|
94
|
+
: toEncode;
|
|
95
|
+
const embedding = await this.encoder.encode(window);
|
|
96
|
+
this.embeddings.push(embedding);
|
|
97
|
+
while (this.embeddings.length > this.maxEmbeddings) {
|
|
98
|
+
this.embeddings.shift();
|
|
99
|
+
}
|
|
100
|
+
this.centroid = averageEmbeddings(this.embeddings);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-cut resource sharing between the text + voice surfaces of a
|
|
3
|
+
* single Eliza-1 bundle.
|
|
4
|
+
*
|
|
5
|
+
* Per `packages/inference/AGENTS.md` §4 ("shared KV cache scheduling,
|
|
6
|
+
* not shared KV memory" + "one process, one llama.cpp build, one GGML
|
|
7
|
+
* pin"), text and voice MUST share:
|
|
8
|
+
* - the tokenizer (Eliza-1/OmniVoice share a vocabulary in this lineage),
|
|
9
|
+
* - the mmap regions for weights (deduplicated by absolute path),
|
|
10
|
+
* - the kernel set (same shipped llama.cpp library after fusion),
|
|
11
|
+
* - the scheduler queue (one queue, prioritised),
|
|
12
|
+
* - the native MTP draft path (always wired for Eliza-1).
|
|
13
|
+
*
|
|
14
|
+
* What they do NOT share:
|
|
15
|
+
* - KV cache memory (different layer counts, different head configs,
|
|
16
|
+
* different quantizations — separate caches, shared scheduler).
|
|
17
|
+
*
|
|
18
|
+
* This module owns reference counts on each shared resource and is the
|
|
19
|
+
* single arbiter of when a voice-only region can be released. It does
|
|
20
|
+
* NOT do any I/O itself — the actual mmap, madvise, or full model-unload
|
|
21
|
+
* behavior lives behind the `MmapRegionHandle` interface so platform
|
|
22
|
+
* bindings can choose the right memory policy.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** Minimal structural logger — keeps this module free of upstream deps. */
|
|
26
|
+
interface Logger {
|
|
27
|
+
debug?(message: string): void;
|
|
28
|
+
warn?(message: string): void;
|
|
29
|
+
info?(message: string): void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The model roles that can be resident at once on the local-inference
|
|
34
|
+
* path. The `MemoryMonitor` evicts them in *ascending priority* under RAM
|
|
35
|
+
* pressure (lowest first): low-cost voice auxiliaries are cheapest to drop,
|
|
36
|
+
* the text target is the last thing to go. Voice TTS/ASR weights are evicted
|
|
37
|
+
* via `MmapRegionHandle.evictPages()`; the embedding model is unloaded by
|
|
38
|
+
* its owner.
|
|
39
|
+
*/
|
|
40
|
+
export type ResidentModelRole =
|
|
41
|
+
| "drafter"
|
|
42
|
+
| "emotion"
|
|
43
|
+
| "speaker-id"
|
|
44
|
+
| "vision"
|
|
45
|
+
| "embedding"
|
|
46
|
+
| "vad"
|
|
47
|
+
| "asr"
|
|
48
|
+
| "tts"
|
|
49
|
+
| "text-target";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Eviction priority by role — lower evicts first. Matches the brief's
|
|
53
|
+
* `emotion < speaker-id < vision/mmproj < embedding < vad < ASR <
|
|
54
|
+
* TTS < text-target`. The cold-3 set (`emotion`, `speaker-id`) is cheap to
|
|
55
|
+
* load on demand, so evicting them is the first reclamation step under
|
|
56
|
+
* sustained pressure. See `.swarm/research/R9-memory.md` §4.1.
|
|
57
|
+
*/
|
|
58
|
+
export const RESIDENT_ROLE_PRIORITY: Readonly<
|
|
59
|
+
Record<ResidentModelRole, number>
|
|
60
|
+
> = {
|
|
61
|
+
drafter: 10,
|
|
62
|
+
emotion: 15,
|
|
63
|
+
"speaker-id": 18,
|
|
64
|
+
vision: 20,
|
|
65
|
+
embedding: 25,
|
|
66
|
+
vad: 35,
|
|
67
|
+
asr: 40,
|
|
68
|
+
tts: 50,
|
|
69
|
+
"text-target": 100,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* An evictable resident model role. The registry walks these in ascending
|
|
74
|
+
* `evictionPriority` under memory pressure and calls `evict()` until enough
|
|
75
|
+
* RAM has been reclaimed. `evict()` MUST be idempotent (a no-op when already
|
|
76
|
+
* evicted) and the role MUST re-load lazily on next use — the monitor only
|
|
77
|
+
* frees memory, it never re-loads.
|
|
78
|
+
*/
|
|
79
|
+
export interface EvictableModelRole extends RefCountedResource {
|
|
80
|
+
readonly role: ResidentModelRole;
|
|
81
|
+
/** Lower evicts first. Defaults to `RESIDENT_ROLE_PRIORITY[role]`. */
|
|
82
|
+
readonly evictionPriority: number;
|
|
83
|
+
/** True while the underlying weights/pages are still resident. */
|
|
84
|
+
isResident(): boolean;
|
|
85
|
+
/** Drop the resident weights/pages. Idempotent; re-loads lazily on demand. */
|
|
86
|
+
evict(): Promise<void>;
|
|
87
|
+
/** Best-effort estimate of RAM (MB) reclaimed by `evict()`. 0 when unknown. */
|
|
88
|
+
estimatedResidentMb(): number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function isEvictableModelRole(
|
|
92
|
+
value: RefCountedResource,
|
|
93
|
+
): value is EvictableModelRole {
|
|
94
|
+
const candidate = value as Partial<EvictableModelRole>;
|
|
95
|
+
return (
|
|
96
|
+
typeof candidate.role === "string" &&
|
|
97
|
+
typeof candidate.evictionPriority === "number" &&
|
|
98
|
+
typeof candidate.isResident === "function" &&
|
|
99
|
+
typeof candidate.evict === "function" &&
|
|
100
|
+
typeof candidate.estimatedResidentMb === "function"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Build an `EvictableModelRole` from a role + an `evict` callback. `release()`
|
|
106
|
+
* defaults to a no-op (the registry's refcount, not `release`, gates eviction
|
|
107
|
+
* for these); pass one if the role owns disposable state. `estimatedMb` lets
|
|
108
|
+
* the monitor know roughly how much it will reclaim — pass 0 when unknown.
|
|
109
|
+
*/
|
|
110
|
+
export function createEvictableModelRole(args: {
|
|
111
|
+
id?: string;
|
|
112
|
+
role: ResidentModelRole;
|
|
113
|
+
evictionPriority?: number;
|
|
114
|
+
estimatedMb?: number;
|
|
115
|
+
isResident: () => boolean;
|
|
116
|
+
evict: () => Promise<void>;
|
|
117
|
+
release?: () => Promise<void>;
|
|
118
|
+
}): EvictableModelRole {
|
|
119
|
+
const id = args.id ?? `model-role:${args.role}`;
|
|
120
|
+
const priority = args.evictionPriority ?? RESIDENT_ROLE_PRIORITY[args.role];
|
|
121
|
+
const estimatedMb = args.estimatedMb ?? 0;
|
|
122
|
+
return {
|
|
123
|
+
id,
|
|
124
|
+
role: args.role,
|
|
125
|
+
evictionPriority: priority,
|
|
126
|
+
isResident: args.isResident,
|
|
127
|
+
estimatedResidentMb: () => (args.isResident() ? estimatedMb : 0),
|
|
128
|
+
async evict(): Promise<void> {
|
|
129
|
+
if (!args.isResident()) return;
|
|
130
|
+
await args.evict();
|
|
131
|
+
},
|
|
132
|
+
async release(): Promise<void> {
|
|
133
|
+
await args.release?.();
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Anything ref-counted by the registry implements this. The caller of
|
|
140
|
+
* `release()` MUST guarantee that no further reads happen on the
|
|
141
|
+
* underlying resource — for mmap regions that means no kernel call has
|
|
142
|
+
* a pointer into the freed range.
|
|
143
|
+
*/
|
|
144
|
+
export interface RefCountedResource {
|
|
145
|
+
readonly id: string;
|
|
146
|
+
/** Released for real when the last ref drops. Idempotent. */
|
|
147
|
+
release(): Promise<void>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* mmap region handle. The fused omnivoice/llama.cpp build owns the real
|
|
152
|
+
* mmap call (it happens inside the FFI) — this interface is the JS-side
|
|
153
|
+
* proxy for it, so the lifecycle code can request page eviction without
|
|
154
|
+
* binding to a specific backend.
|
|
155
|
+
*/
|
|
156
|
+
export interface MmapRegionHandle extends RefCountedResource {
|
|
157
|
+
/** Absolute path of the file backing the mmap region. */
|
|
158
|
+
readonly path: string;
|
|
159
|
+
/** Byte size of the mapped region. */
|
|
160
|
+
readonly sizeBytes: number;
|
|
161
|
+
/**
|
|
162
|
+
* Release memory pressure for this region. Backends may implement this
|
|
163
|
+
* as a page hint or as a full voice-runtime unload. Common mappings:
|
|
164
|
+
* - POSIX (Linux/Android/macOS-bg): `madvise(addr, len, MADV_DONTNEED)`
|
|
165
|
+
* - macOS (foreground / iOS): `madvise(addr, len, MADV_FREE_REUSABLE)`
|
|
166
|
+
* - Windows: `VirtualUnlock` + `OfferVirtualMemory`
|
|
167
|
+
*
|
|
168
|
+
* The lifecycle test mocks this to assert the call happened.
|
|
169
|
+
*/
|
|
170
|
+
evictPages(): Promise<void>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Minimal tokenizer surface text + voice both consume. */
|
|
174
|
+
export interface SharedTokenizer extends RefCountedResource {
|
|
175
|
+
readonly vocabSize: number;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Kernel set descriptor. The actual kernels are inside the fused
|
|
180
|
+
* llama.cpp build; this is the metadata the runtime reads at startup
|
|
181
|
+
* (AGENTS.md §3 #5: "the runtime MUST log the kernel set on startup").
|
|
182
|
+
*/
|
|
183
|
+
export interface KernelSet extends RefCountedResource {
|
|
184
|
+
readonly kernels: ReadonlyArray<string>;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Scheduler graph slot. One per active engine, refcounted by surface. */
|
|
188
|
+
export interface SchedulerSlot extends RefCountedResource {
|
|
189
|
+
/** Surface (text/voice) currently holding a ref. */
|
|
190
|
+
surfaces(): ReadonlyArray<"text" | "voice">;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** Native MTP draft state is shared between text-only and voice modes. */
|
|
194
|
+
export interface MtpDraftHandle extends RefCountedResource {
|
|
195
|
+
readonly modelId: string;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function createMtpDraftHandle(args: {
|
|
199
|
+
modelId: string;
|
|
200
|
+
}): MtpDraftHandle {
|
|
201
|
+
return {
|
|
202
|
+
id: `mtp:${args.modelId}`,
|
|
203
|
+
modelId: args.modelId,
|
|
204
|
+
async release(): Promise<void> {
|
|
205
|
+
// MTP state lifetime is owned by the active native text runtime.
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
interface RegistryEntry<T extends RefCountedResource> {
|
|
211
|
+
readonly resource: T;
|
|
212
|
+
refCount: number;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Owns the shared resources for one engine. Voice + text both `acquire`
|
|
217
|
+
* and `release` against the same registry; the registry only releases
|
|
218
|
+
* the underlying resource when refcount hits zero.
|
|
219
|
+
*
|
|
220
|
+
* Thread-safety: all methods run on the single Node event loop; no
|
|
221
|
+
* locks needed. Promises returned from `release()` MUST be awaited so
|
|
222
|
+
* the lifecycle state machine can observe completion.
|
|
223
|
+
*/
|
|
224
|
+
export class SharedResourceRegistry {
|
|
225
|
+
private readonly entries = new Map<
|
|
226
|
+
string,
|
|
227
|
+
RegistryEntry<RefCountedResource>
|
|
228
|
+
>();
|
|
229
|
+
private readonly log?: Logger;
|
|
230
|
+
/**
|
|
231
|
+
* When a higher-level component (the `MemoryArbiter`) owns the eviction
|
|
232
|
+
* decision for this registry, it claims ownership here so the simpler
|
|
233
|
+
* `MemoryMonitor` poll defers instead of evicting in parallel — a single
|
|
234
|
+
* eviction decision point, no double-eviction on one pressure event
|
|
235
|
+
* (#8809 AC#2). Null = no external owner, the monitor evicts itself.
|
|
236
|
+
*/
|
|
237
|
+
private evictionOwner: string | null = null;
|
|
238
|
+
|
|
239
|
+
constructor(opts: { logger?: Logger } = {}) {
|
|
240
|
+
this.log = opts.logger;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Claim the single eviction-decision ownership for this registry. */
|
|
244
|
+
claimEvictionOwnership(owner: string): void {
|
|
245
|
+
this.evictionOwner = owner;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Release ownership (only the current owner may release it). */
|
|
249
|
+
releaseEvictionOwnership(owner: string): void {
|
|
250
|
+
if (this.evictionOwner === owner) this.evictionOwner = null;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** True when an external component owns the eviction decision. */
|
|
254
|
+
hasExternalEvictionOwner(): boolean {
|
|
255
|
+
return this.evictionOwner !== null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Register a resource if absent, increment refcount otherwise. Returns
|
|
260
|
+
* the canonical instance — callers MUST use the returned value, not the
|
|
261
|
+
* one passed in, so a second registration with the same id resolves to
|
|
262
|
+
* the original (deduplication by id).
|
|
263
|
+
*/
|
|
264
|
+
acquire<T extends RefCountedResource>(resource: T): T {
|
|
265
|
+
const existing = this.entries.get(resource.id);
|
|
266
|
+
if (existing) {
|
|
267
|
+
existing.refCount++;
|
|
268
|
+
return existing.resource as T;
|
|
269
|
+
}
|
|
270
|
+
this.entries.set(resource.id, { resource, refCount: 1 });
|
|
271
|
+
return resource;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Decrement refcount; release the resource when it hits zero. Throws
|
|
276
|
+
* on unknown id — silent no-ops would hide leaks.
|
|
277
|
+
*/
|
|
278
|
+
async release(id: string): Promise<void> {
|
|
279
|
+
const entry = this.entries.get(id);
|
|
280
|
+
if (!entry) {
|
|
281
|
+
throw new Error(
|
|
282
|
+
`[shared-resources] release(${id}): unknown resource — possible double release or registry desync`,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
entry.refCount--;
|
|
286
|
+
if (entry.refCount > 0) return;
|
|
287
|
+
this.entries.delete(id);
|
|
288
|
+
await entry.resource.release();
|
|
289
|
+
this.log?.debug?.(`[SharedResourceRegistry] released ${id}`);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/** Diagnostic: current refcount, or 0 when not present. */
|
|
293
|
+
refCount(id: string): number {
|
|
294
|
+
return this.entries.get(id)?.refCount ?? 0;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/** Diagnostic: snapshot of currently-tracked resource ids. */
|
|
298
|
+
ids(): ReadonlyArray<string> {
|
|
299
|
+
return Array.from(this.entries.keys());
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** Total tracked resources. */
|
|
303
|
+
size(): number {
|
|
304
|
+
return this.entries.size;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Currently-resident evictable model roles, ascending by eviction
|
|
309
|
+
* priority (cheapest-to-evict first). Used by `MemoryMonitor` to walk
|
|
310
|
+
* roles under RAM pressure. Non-resident roles are filtered out — there's
|
|
311
|
+
* nothing to reclaim.
|
|
312
|
+
*/
|
|
313
|
+
evictableRoles(): ReadonlyArray<EvictableModelRole> {
|
|
314
|
+
const out: EvictableModelRole[] = [];
|
|
315
|
+
for (const entry of this.entries.values()) {
|
|
316
|
+
if (isEvictableModelRole(entry.resource) && entry.resource.isResident()) {
|
|
317
|
+
out.push(entry.resource);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return out.sort((a, b) => a.evictionPriority - b.evictionPriority);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Evict the lowest-priority resident role and return its `id`, or `null`
|
|
325
|
+
* when nothing is evictable. Observable: emits an `info` log line so the
|
|
326
|
+
* eviction is visible in the dev console. The role re-loads lazily on
|
|
327
|
+
* next use — this only frees memory.
|
|
328
|
+
*/
|
|
329
|
+
async evictLowestPriorityRole(): Promise<{
|
|
330
|
+
id: string;
|
|
331
|
+
role: ResidentModelRole;
|
|
332
|
+
estimatedMb: number;
|
|
333
|
+
} | null> {
|
|
334
|
+
const [target] = this.evictableRoles();
|
|
335
|
+
if (!target) return null;
|
|
336
|
+
const estimatedMb = target.estimatedResidentMb();
|
|
337
|
+
await target.evict();
|
|
338
|
+
this.log?.info?.(
|
|
339
|
+
`[SharedResourceRegistry] evicted role ${target.role} (${target.id}); reclaimed ~${estimatedMb} MB`,
|
|
340
|
+
);
|
|
341
|
+
return { id: target.id, role: target.role, estimatedMb };
|
|
342
|
+
}
|
|
343
|
+
}
|