@elizaos/plugin-local-inference 2.0.3-beta.2 → 2.0.3-beta.4
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,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native PCM capture coordinator for the Capacitor / AOSP voice path.
|
|
3
|
+
*
|
|
4
|
+
* Platform mic front-ends own capture and VAD/turn segmentation. This class is
|
|
5
|
+
* the TypeScript bridge they call with a completed PCM turn: it serializes the
|
|
6
|
+
* turn through {@link runDeviceVoiceTurn}, which joins ASR, speaker attribution,
|
|
7
|
+
* response policy, text generation, and TTS in the fused voice path.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { VoicePipelineEvents } from "../../services/voice/pipeline";
|
|
11
|
+
import type { TranscriptionAudio } from "../../services/voice/types";
|
|
12
|
+
import type { VoicePreloadPredictor } from "../../services/voice/voice-preload-predictor";
|
|
13
|
+
import type { CapacitorLlamaContext } from "./types";
|
|
14
|
+
import {
|
|
15
|
+
type CapacitorTextRunnerOptions,
|
|
16
|
+
type DeviceVoiceEngine,
|
|
17
|
+
runDeviceVoiceTurn,
|
|
18
|
+
type VoiceTurnExitReason,
|
|
19
|
+
} from "./voice-turn";
|
|
20
|
+
|
|
21
|
+
export interface NativePcmVoiceTurn {
|
|
22
|
+
/** Captured mic PCM for one VAD-completed native turn. */
|
|
23
|
+
audio: TranscriptionAudio;
|
|
24
|
+
/** Optional host turn id, useful for traces and logs. */
|
|
25
|
+
turnId?: string;
|
|
26
|
+
/** Per-turn event hooks. Falls back to coordinator defaults when omitted. */
|
|
27
|
+
events?: VoicePipelineEvents;
|
|
28
|
+
/** Per-turn generated-token cap. Falls back to coordinator defaults. */
|
|
29
|
+
maxGeneratedTokens?: number;
|
|
30
|
+
/** Per-turn sampling overrides. Falls back to coordinator defaults. */
|
|
31
|
+
generation?: CapacitorTextRunnerOptions;
|
|
32
|
+
/** Per-turn preload predictor. Falls back to coordinator defaults. */
|
|
33
|
+
preloadPredictor?: VoicePreloadPredictor;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface NativePcmVoiceTurnCoordinatorOptions {
|
|
37
|
+
/** The engine that owns the armed voice bridge (`startVoice` + `armVoice`). */
|
|
38
|
+
engine: DeviceVoiceEngine;
|
|
39
|
+
/** Loaded on-device text model context for the MTP target verifier. */
|
|
40
|
+
context: CapacitorLlamaContext;
|
|
41
|
+
/** Default pipeline events for every accepted native turn. */
|
|
42
|
+
events?: VoicePipelineEvents;
|
|
43
|
+
/** Default generated-token cap for every accepted native turn. */
|
|
44
|
+
maxGeneratedTokens?: number;
|
|
45
|
+
/** Default sampling overrides for the on-device text runner. */
|
|
46
|
+
generation?: CapacitorTextRunnerOptions;
|
|
47
|
+
/** Default next-stage preload predictor. */
|
|
48
|
+
preloadPredictor?: VoicePreloadPredictor;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface NativePcmVoiceTurnResult {
|
|
52
|
+
turnId?: string;
|
|
53
|
+
exitReason: VoiceTurnExitReason;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Serializes native completed PCM turns into the fused device voice engine.
|
|
58
|
+
*
|
|
59
|
+
* Native capture can emit turns quickly, especially when a flush returns more
|
|
60
|
+
* than one segment. The fused voice bridge only allows one active turn; this
|
|
61
|
+
* coordinator preserves order by queueing each accepted turn after the previous
|
|
62
|
+
* `runDeviceVoiceTurn` settles.
|
|
63
|
+
*/
|
|
64
|
+
export class NativePcmVoiceTurnCoordinator {
|
|
65
|
+
private readonly options: NativePcmVoiceTurnCoordinatorOptions;
|
|
66
|
+
private queue: Promise<void> = Promise.resolve();
|
|
67
|
+
private running = false;
|
|
68
|
+
|
|
69
|
+
constructor(options: NativePcmVoiceTurnCoordinatorOptions) {
|
|
70
|
+
this.options = options;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
get isRunning(): boolean {
|
|
74
|
+
return this.running;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
start(): void {
|
|
78
|
+
this.running = true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async stop(): Promise<void> {
|
|
82
|
+
this.running = false;
|
|
83
|
+
await this.queue;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Accept one VAD-completed native PCM turn and run it through the fused
|
|
88
|
+
* device voice path. Throws when the coordinator has not been started so
|
|
89
|
+
* callers cannot accidentally bypass the capture lifecycle.
|
|
90
|
+
*/
|
|
91
|
+
acceptTurn(turn: NativePcmVoiceTurn): Promise<NativePcmVoiceTurnResult> {
|
|
92
|
+
if (!this.running) {
|
|
93
|
+
return Promise.reject(
|
|
94
|
+
new Error(
|
|
95
|
+
"[native-voice-capture] cannot accept a PCM turn before start()",
|
|
96
|
+
),
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run = this.queue.then(async () => {
|
|
101
|
+
const exitReason = await runDeviceVoiceTurn({
|
|
102
|
+
engine: this.options.engine,
|
|
103
|
+
context: this.options.context,
|
|
104
|
+
audio: turn.audio,
|
|
105
|
+
...this.resolveTurnOptions(turn),
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
...(turn.turnId ? { turnId: turn.turnId } : {}),
|
|
109
|
+
exitReason,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
this.queue = run.then(
|
|
114
|
+
() => undefined,
|
|
115
|
+
() => undefined,
|
|
116
|
+
);
|
|
117
|
+
return run;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private resolveTurnOptions(
|
|
121
|
+
turn: NativePcmVoiceTurn,
|
|
122
|
+
): Pick<
|
|
123
|
+
Parameters<typeof runDeviceVoiceTurn>[0],
|
|
124
|
+
"events" | "generation" | "maxGeneratedTokens" | "preloadPredictor"
|
|
125
|
+
> {
|
|
126
|
+
const events = turn.events ?? this.options.events;
|
|
127
|
+
const maxGeneratedTokens =
|
|
128
|
+
turn.maxGeneratedTokens ?? this.options.maxGeneratedTokens;
|
|
129
|
+
const generation = turn.generation ?? this.options.generation;
|
|
130
|
+
const preloadPredictor =
|
|
131
|
+
turn.preloadPredictor ?? this.options.preloadPredictor;
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
...(events ? { events } : {}),
|
|
135
|
+
...(maxGeneratedTokens !== undefined ? { maxGeneratedTokens } : {}),
|
|
136
|
+
...(generation ? { generation } : {}),
|
|
137
|
+
...(preloadPredictor ? { preloadPredictor } : {}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -126,7 +126,7 @@ export function streamCapacitorPrompt(
|
|
|
126
126
|
const resolver = pendingResolve;
|
|
127
127
|
pendingResolve = null;
|
|
128
128
|
pendingReject = null;
|
|
129
|
-
resolver({ value: undefined
|
|
129
|
+
resolver({ value: undefined, done: true });
|
|
130
130
|
}
|
|
131
131
|
};
|
|
132
132
|
|
|
@@ -181,7 +181,7 @@ export function streamCapacitorPrompt(
|
|
|
181
181
|
}
|
|
182
182
|
if (promptDone) {
|
|
183
183
|
return Promise.resolve({
|
|
184
|
-
value: undefined
|
|
184
|
+
value: undefined,
|
|
185
185
|
done: true,
|
|
186
186
|
});
|
|
187
187
|
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-device fused voice-turn entry for the Capacitor / AOSP device bridge.
|
|
3
|
+
*
|
|
4
|
+
* This is the production caller for `LocalInferenceEngine.runVoiceTurn` (#8786):
|
|
5
|
+
* the in-process fused mic→speech loop (ASR → {MTP drafts ∥ target verify} →
|
|
6
|
+
* phrase chunker → OmniVoice/Kokoro → PCM ring buffer) that the engine's voice
|
|
7
|
+
* bridge owns. The engine bridge serves ASR + TTS from the fused
|
|
8
|
+
* `libelizainference` handle; the DEVICE supplies its own text runner so the
|
|
9
|
+
* draft/verify loop runs on the on-device text model (the
|
|
10
|
+
* `CapacitorLlamaContext`-backed decode) rather than the desktop dispatcher —
|
|
11
|
+
* exactly the seam `runVoiceTurn`'s `textRunner` option was built for.
|
|
12
|
+
*
|
|
13
|
+
* The native iOS/Android mic-capture layer hands captured PCM to
|
|
14
|
+
* {@link runDeviceVoiceTurn}; everything downstream is in-process JS + the
|
|
15
|
+
* fused FFI. No HTTP, no second voice path.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { GenerateArgs } from "../../services/backend";
|
|
19
|
+
import type { VoicePipelineEvents } from "../../services/voice/pipeline";
|
|
20
|
+
import type { MtpTextRunner } from "../../services/voice/pipeline-impls";
|
|
21
|
+
import type {
|
|
22
|
+
TranscriptionAudio,
|
|
23
|
+
VerifierStreamEvent,
|
|
24
|
+
} from "../../services/voice/types";
|
|
25
|
+
import type { VoicePreloadPredictor } from "../../services/voice/voice-preload-predictor";
|
|
26
|
+
import type { CapacitorLlamaContext } from "./types";
|
|
27
|
+
|
|
28
|
+
/** Turn exit reason, mirroring `LocalInferenceEngine.runVoiceTurn`. */
|
|
29
|
+
export type VoiceTurnExitReason = "done" | "token-cap" | "cancelled";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Structural view of `LocalInferenceEngine.runVoiceTurn` so the device bridge
|
|
33
|
+
* (and tests) depend on the call shape, not the concrete engine class.
|
|
34
|
+
*/
|
|
35
|
+
export interface DeviceVoiceEngine {
|
|
36
|
+
runVoiceTurn(
|
|
37
|
+
audio: TranscriptionAudio,
|
|
38
|
+
opts?: {
|
|
39
|
+
maxDraftTokens?: number;
|
|
40
|
+
maxGeneratedTokens?: number;
|
|
41
|
+
events?: VoicePipelineEvents;
|
|
42
|
+
textRunner?: MtpTextRunner;
|
|
43
|
+
},
|
|
44
|
+
): Promise<VoiceTurnExitReason>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface CapacitorTextRunnerOptions {
|
|
48
|
+
/** Default sampling temperature when the pipeline does not pin one. */
|
|
49
|
+
temperature?: number;
|
|
50
|
+
/** Default nucleus-sampling cutoff when the pipeline does not pin one. */
|
|
51
|
+
topP?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Adapt a live `CapacitorLlamaContext` to the {@link MtpTextRunner} contract the
|
|
56
|
+
* fused voice pipeline drives.
|
|
57
|
+
*
|
|
58
|
+
* `hasDrafter()` is `false`: the on-device `CapacitorLlamaContext` does not yet
|
|
59
|
+
* expose a separate speculative-draft window, so the pipeline runs plain decode
|
|
60
|
+
* through the target verifier (`MtpTargetVerifier` splits the returned text into
|
|
61
|
+
* tokens when no per-delta verifier events arrive — its documented non-streaming
|
|
62
|
+
* path). When the on-device fork exposes draft/verify events this flips to
|
|
63
|
+
* `true` with no change to the call sites.
|
|
64
|
+
*/
|
|
65
|
+
export function createCapacitorMtpTextRunner(
|
|
66
|
+
context: CapacitorLlamaContext,
|
|
67
|
+
options: CapacitorTextRunnerOptions = {},
|
|
68
|
+
): MtpTextRunner {
|
|
69
|
+
return {
|
|
70
|
+
hasDrafter() {
|
|
71
|
+
return false;
|
|
72
|
+
},
|
|
73
|
+
async generateWithVerifierEvents(
|
|
74
|
+
args: GenerateArgs & {
|
|
75
|
+
onVerifierEvent: (event: VerifierStreamEvent) => void | Promise<void>;
|
|
76
|
+
},
|
|
77
|
+
): Promise<{ text: string }> {
|
|
78
|
+
const { signal } = args;
|
|
79
|
+
if (signal?.aborted) return { text: "" };
|
|
80
|
+
|
|
81
|
+
// A barge-in / kill-switch aborts the in-flight on-device decode.
|
|
82
|
+
let onAbort: (() => void) | undefined;
|
|
83
|
+
if (signal) {
|
|
84
|
+
onAbort = () => {
|
|
85
|
+
void context.stopCompletion();
|
|
86
|
+
};
|
|
87
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const result = await context.completion({
|
|
92
|
+
prompt: args.prompt,
|
|
93
|
+
n_predict: args.maxTokens,
|
|
94
|
+
temperature: args.temperature ?? options.temperature,
|
|
95
|
+
top_p: args.topP ?? options.topP,
|
|
96
|
+
...(args.stopSequences ? { stop: args.stopSequences } : {}),
|
|
97
|
+
});
|
|
98
|
+
return { text: result.text };
|
|
99
|
+
} finally {
|
|
100
|
+
if (signal && onAbort) signal.removeEventListener("abort", onAbort);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface RunDeviceVoiceTurnArgs {
|
|
107
|
+
/** The engine that owns the armed voice bridge (`startVoice` + `armVoice`). */
|
|
108
|
+
engine: DeviceVoiceEngine;
|
|
109
|
+
/** The on-device text model context that backs the MTP target verifier. */
|
|
110
|
+
context: CapacitorLlamaContext;
|
|
111
|
+
/** Captured mic PCM for this turn. */
|
|
112
|
+
audio: TranscriptionAudio;
|
|
113
|
+
/** Pipeline events (first-audio, transcript, completion, cancel). */
|
|
114
|
+
events?: VoicePipelineEvents;
|
|
115
|
+
/** Upper bound on generated response tokens. */
|
|
116
|
+
maxGeneratedTokens?: number;
|
|
117
|
+
/** Default sampling overrides forwarded to the on-device text runner. */
|
|
118
|
+
generation?: CapacitorTextRunnerOptions;
|
|
119
|
+
/**
|
|
120
|
+
* Next-stage preload predictor (#8809 C5). On the mobile / Capacitor path the
|
|
121
|
+
* text-response model is owned by the {@link MemoryArbiter}; this turn's
|
|
122
|
+
* stages run sequentially (ASR → text → TTS), so the predictor warms the
|
|
123
|
+
* arbiter-managed text model the instant ASR finishes — during the ASR-stage
|
|
124
|
+
* page-trim window — collapsing the cold load off the post-ASR critical path.
|
|
125
|
+
* Wired to the pipeline's `onAsrComplete` event below. Omit to keep the turn
|
|
126
|
+
* unpredicted (the arbiter still loads the text model on first request).
|
|
127
|
+
*/
|
|
128
|
+
preloadPredictor?: VoicePreloadPredictor;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Run one fused on-device voice turn. The native capture layer calls this with
|
|
133
|
+
* the captured mic audio; it builds the device text runner from the loaded
|
|
134
|
+
* `CapacitorLlamaContext` and drives `engine.runVoiceTurn`, so ASR + MTP +
|
|
135
|
+
* TTS all run in-process through the fused handle. Resolves with the turn's
|
|
136
|
+
* exit reason.
|
|
137
|
+
*/
|
|
138
|
+
export function runDeviceVoiceTurn(
|
|
139
|
+
args: RunDeviceVoiceTurnArgs,
|
|
140
|
+
): Promise<VoiceTurnExitReason> {
|
|
141
|
+
const textRunner = createCapacitorMtpTextRunner(
|
|
142
|
+
args.context,
|
|
143
|
+
args.generation ?? {},
|
|
144
|
+
);
|
|
145
|
+
const events = composeAsrCompletePreload(args.events, args.preloadPredictor);
|
|
146
|
+
return args.engine.runVoiceTurn(args.audio, {
|
|
147
|
+
textRunner,
|
|
148
|
+
...(events ? { events } : {}),
|
|
149
|
+
...(args.maxGeneratedTokens !== undefined
|
|
150
|
+
? { maxGeneratedTokens: args.maxGeneratedTokens }
|
|
151
|
+
: {}),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Compose the caller's pipeline events with the next-stage preload prediction.
|
|
157
|
+
*
|
|
158
|
+
* When a predictor is supplied, its `onAsrStageComplete()` is invoked from the
|
|
159
|
+
* pipeline's `onAsrComplete` hook — the instant ASR emits its final token — so
|
|
160
|
+
* the arbiter-managed text model is warmed before the verifier issues its first
|
|
161
|
+
* request. The prediction is fire-and-forget: it must never delay the
|
|
162
|
+
* drafter/verifier kick-off, and a declined preload (pressure / no headroom) is
|
|
163
|
+
* a no-op, not an error. The caller's own `onAsrComplete` (if any) still runs.
|
|
164
|
+
*/
|
|
165
|
+
function composeAsrCompletePreload(
|
|
166
|
+
events: VoicePipelineEvents | undefined,
|
|
167
|
+
predictor: VoicePreloadPredictor | undefined,
|
|
168
|
+
): VoicePipelineEvents | undefined {
|
|
169
|
+
if (!predictor) return events;
|
|
170
|
+
const callerOnAsrComplete = events?.onAsrComplete;
|
|
171
|
+
return {
|
|
172
|
+
...events,
|
|
173
|
+
onAsrComplete(tokens) {
|
|
174
|
+
callerOnAsrComplete?.(tokens);
|
|
175
|
+
void predictor.onAsrStageComplete();
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `ComputerUse` bridge probe, we register a generate function that
|
|
11
11
|
* calls into Apple's framework for short prompts.
|
|
12
12
|
* - Otherwise we do nothing, and the existing llama-cpp-capacitor
|
|
13
|
-
* (
|
|
13
|
+
* (Gemma-VL / eliza-1 2b) path remains the active local-inference handler.
|
|
14
14
|
*
|
|
15
15
|
* Why this lives in plugin-local-inference (not plugin-capacitor-bridge):
|
|
16
16
|
*
|
|
@@ -124,6 +124,7 @@ import {
|
|
|
124
124
|
getLocalInferenceActiveSnapshot,
|
|
125
125
|
getLocalInferenceChatStatus,
|
|
126
126
|
handleLocalInferenceRoutes,
|
|
127
|
+
reauthorizeRedirectHeaders,
|
|
127
128
|
} from "./local-inference-routes.js";
|
|
128
129
|
|
|
129
130
|
const { aospMock, bridgeMock, serviceMock } = getRouteTestMocks();
|
|
@@ -234,7 +235,7 @@ describe("local inference chat status", () => {
|
|
|
234
235
|
|
|
235
236
|
it("uses the desktop active-model service state for chat status", async () => {
|
|
236
237
|
serviceMock.setActiveState({
|
|
237
|
-
modelId: "eliza-1-
|
|
238
|
+
modelId: "eliza-1-2b",
|
|
238
239
|
loadedAt: "2026-05-16T02:22:23.512Z",
|
|
239
240
|
status: "ready",
|
|
240
241
|
loadedContextSize: 131_072,
|
|
@@ -244,22 +245,22 @@ describe("local inference chat status", () => {
|
|
|
244
245
|
});
|
|
245
246
|
|
|
246
247
|
await expect(getLocalInferenceActiveSnapshot()).resolves.toMatchObject({
|
|
247
|
-
modelId: "eliza-1-
|
|
248
|
+
modelId: "eliza-1-2b",
|
|
248
249
|
status: "ready",
|
|
249
250
|
loadedContextSize: 131_072,
|
|
250
251
|
loadedGpuLayers: 99,
|
|
251
252
|
});
|
|
252
|
-
expect(getLocalInferenceActiveModelId()).toBe("eliza-1-
|
|
253
|
+
expect(getLocalInferenceActiveModelId()).toBe("eliza-1-2b");
|
|
253
254
|
|
|
254
255
|
const status = await getLocalInferenceChatStatus("status");
|
|
255
256
|
expect(status.localInference).toMatchObject({
|
|
256
257
|
intent: "status",
|
|
257
258
|
status: "ready",
|
|
258
|
-
modelId: "eliza-1-
|
|
259
|
-
activeModelId: "eliza-1-
|
|
259
|
+
modelId: "eliza-1-2b",
|
|
260
|
+
activeModelId: "eliza-1-2b",
|
|
260
261
|
provider: "eliza-local-inference",
|
|
261
262
|
});
|
|
262
|
-
expect(status.text).toContain("Model: eliza-1-
|
|
263
|
+
expect(status.text).toContain("Model: eliza-1-2b.");
|
|
263
264
|
expect(status.text).not.toMatch(/none is loaded|waiting to be activated/i);
|
|
264
265
|
});
|
|
265
266
|
|
|
@@ -268,9 +269,9 @@ describe("local inference chat status", () => {
|
|
|
268
269
|
const modelPath = path.join(
|
|
269
270
|
root,
|
|
270
271
|
"models",
|
|
271
|
-
"eliza-1-
|
|
272
|
+
"eliza-1-2b.bundle",
|
|
272
273
|
"text",
|
|
273
|
-
"eliza-1-
|
|
274
|
+
"eliza-1-2b-32k.gguf",
|
|
274
275
|
);
|
|
275
276
|
mkdirSync(path.dirname(modelPath), { recursive: true });
|
|
276
277
|
writeFileSync(modelPath, "GGUF");
|
|
@@ -280,8 +281,8 @@ describe("local inference chat status", () => {
|
|
|
280
281
|
version: 1,
|
|
281
282
|
models: [
|
|
282
283
|
{
|
|
283
|
-
id: "eliza-1-
|
|
284
|
-
displayName: "eliza-1-
|
|
284
|
+
id: "eliza-1-2b",
|
|
285
|
+
displayName: "eliza-1-2b",
|
|
285
286
|
path: modelPath,
|
|
286
287
|
runtimeRole: "chat",
|
|
287
288
|
},
|
|
@@ -301,7 +302,7 @@ describe("local inference chat status", () => {
|
|
|
301
302
|
);
|
|
302
303
|
|
|
303
304
|
await expect(getLocalInferenceActiveSnapshot()).resolves.toMatchObject({
|
|
304
|
-
modelId: "eliza-1-
|
|
305
|
+
modelId: "eliza-1-2b",
|
|
305
306
|
status: "ready",
|
|
306
307
|
loadedAt: "2026-05-16T02:09:05.833Z",
|
|
307
308
|
});
|
|
@@ -342,3 +343,48 @@ describe("local inference chat status", () => {
|
|
|
342
343
|
});
|
|
343
344
|
});
|
|
344
345
|
});
|
|
346
|
+
|
|
347
|
+
describe("reauthorizeRedirectHeaders — no HF token leak across redirects", () => {
|
|
348
|
+
const savedToken = process.env.HF_TOKEN;
|
|
349
|
+
beforeEach(() => {
|
|
350
|
+
process.env.HF_TOKEN = "hf-secret-token";
|
|
351
|
+
});
|
|
352
|
+
afterEach(() => {
|
|
353
|
+
if (savedToken === undefined) delete process.env.HF_TOKEN;
|
|
354
|
+
else process.env.HF_TOKEN = savedToken;
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
const baseHeaders = {
|
|
358
|
+
"user-agent": "Eliza-MobileLocalInference/1.0",
|
|
359
|
+
authorization: "Bearer hf-secret-token",
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
it.each([
|
|
363
|
+
"https://cdn-lfs-us-1.hf.co/repo/abc123",
|
|
364
|
+
"https://prod-cas-shard.s3.amazonaws.com/abc?X-Amz-Signature=z",
|
|
365
|
+
"https://example.cloudfront.net/model.gguf",
|
|
366
|
+
])("strips Authorization when redirected cross-host to %s", (nextUrl) => {
|
|
367
|
+
const next = reauthorizeRedirectHeaders(baseHeaders, nextUrl);
|
|
368
|
+
expect(next.authorization).toBeUndefined();
|
|
369
|
+
expect(next.Authorization).toBeUndefined();
|
|
370
|
+
// Non-auth headers are preserved.
|
|
371
|
+
expect(next["user-agent"]).toBe("Eliza-MobileLocalInference/1.0");
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it("keeps Authorization when the redirect target is still a HuggingFace host", () => {
|
|
375
|
+
const next = reauthorizeRedirectHeaders(
|
|
376
|
+
baseHeaders,
|
|
377
|
+
"https://huggingface.co/repo/resolve/main/model.gguf",
|
|
378
|
+
);
|
|
379
|
+
expect(next.authorization).toBe("Bearer hf-secret-token");
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
it("does not synthesize an Authorization header when none was configured", () => {
|
|
383
|
+
delete process.env.HF_TOKEN;
|
|
384
|
+
const next = reauthorizeRedirectHeaders(
|
|
385
|
+
{ "user-agent": "x" },
|
|
386
|
+
"https://huggingface.co/repo/resolve/main/model.gguf",
|
|
387
|
+
);
|
|
388
|
+
expect(next.authorization).toBeUndefined();
|
|
389
|
+
});
|
|
390
|
+
});
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from "@elizaos/core";
|
|
17
17
|
import {
|
|
18
18
|
buildHuggingFaceResolveUrl,
|
|
19
|
+
resolveHubAuthHeaders,
|
|
19
20
|
MODEL_CATALOG as SHARED_MODEL_CATALOG,
|
|
20
21
|
type CatalogModel as SharedCatalogModel,
|
|
21
22
|
} from "@elizaos/shared";
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
assertManifestEvalsPassed,
|
|
29
30
|
CandidateModelActivationError,
|
|
30
31
|
} from "./services/active-model.js";
|
|
32
|
+
import { classifyDeviceTier } from "./services/device-tier.js";
|
|
31
33
|
import { localInferenceService } from "./services/service.js";
|
|
32
34
|
import { prewarmLocalVoiceStackForModel } from "./services/voice-prewarm.js";
|
|
33
35
|
|
|
@@ -73,7 +75,7 @@ let aospLocalInferenceApiPromise: Promise<AospLocalInferenceApi> | null = null;
|
|
|
73
75
|
|
|
74
76
|
function getMobileDeviceBridgeApi(): Promise<MobileDeviceBridgeApi> {
|
|
75
77
|
mobileDeviceBridgeApiPromise ??= import(
|
|
76
|
-
"@elizaos/plugin-capacitor-bridge"
|
|
78
|
+
"@elizaos/plugin-capacitor-bridge/mobile-device-bridge-bootstrap"
|
|
77
79
|
) as Promise<MobileDeviceBridgeApi>;
|
|
78
80
|
return mobileDeviceBridgeApiPromise;
|
|
79
81
|
}
|
|
@@ -114,6 +116,14 @@ interface CatalogModel extends SharedCatalogModel {
|
|
|
114
116
|
role: ModelRole;
|
|
115
117
|
}
|
|
116
118
|
|
|
119
|
+
const ASSIGNMENT_SLOTS = new Set<keyof Assignments>([
|
|
120
|
+
"TEXT_SMALL",
|
|
121
|
+
"TEXT_LARGE",
|
|
122
|
+
"TEXT_EMBEDDING",
|
|
123
|
+
"TEXT_TO_SPEECH",
|
|
124
|
+
"TRANSCRIPTION",
|
|
125
|
+
]);
|
|
126
|
+
|
|
117
127
|
interface InstalledModel {
|
|
118
128
|
id: string;
|
|
119
129
|
displayName: string;
|
|
@@ -212,6 +222,27 @@ const CATALOG: CatalogModel[] = SHARED_MODEL_CATALOG.map((model) => ({
|
|
|
212
222
|
role: catalogRole(model),
|
|
213
223
|
}));
|
|
214
224
|
|
|
225
|
+
function isCuratedCatalogModelId(modelId: string): boolean {
|
|
226
|
+
return CATALOG.some(
|
|
227
|
+
(model) =>
|
|
228
|
+
model.id === modelId &&
|
|
229
|
+
!model.hiddenFromCatalog &&
|
|
230
|
+
model.runtimeRole !== "mtp-drafter",
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function sanitizeAssignments(assignments: Assignments): Assignments {
|
|
235
|
+
const next: Assignments = {};
|
|
236
|
+
for (const [slot, modelId] of Object.entries(assignments) as Array<
|
|
237
|
+
[keyof Assignments, string | undefined]
|
|
238
|
+
>) {
|
|
239
|
+
if (!modelId || !ASSIGNMENT_SLOTS.has(slot)) continue;
|
|
240
|
+
if (!isCuratedCatalogModelId(modelId)) continue;
|
|
241
|
+
next[slot] = modelId;
|
|
242
|
+
}
|
|
243
|
+
return next;
|
|
244
|
+
}
|
|
245
|
+
|
|
215
246
|
const activeDownloads = new Map<
|
|
216
247
|
string,
|
|
217
248
|
{ job: DownloadJob; abortController: AbortController }
|
|
@@ -297,6 +328,25 @@ const mobileLookup: http.RequestOptions["lookup"] = (
|
|
|
297
328
|
});
|
|
298
329
|
};
|
|
299
330
|
|
|
331
|
+
/**
|
|
332
|
+
* Recompute request headers when following a redirect. The HuggingFace bearer
|
|
333
|
+
* token must never leak past a cross-host redirect: HF `/resolve/` URLs 302 to
|
|
334
|
+
* cdn-lfs*.hf.co / *.amazonaws.com / *.cloudfront.net, none of which are HF
|
|
335
|
+
* hosts. Strip Authorization, then re-add it only if the redirect target is
|
|
336
|
+
* itself a HuggingFace host — mirroring the cross-origin auth stripping WHATWG
|
|
337
|
+
* fetch performs for the sibling `Downloader` path.
|
|
338
|
+
*/
|
|
339
|
+
export function reauthorizeRedirectHeaders(
|
|
340
|
+
headers: Record<string, string>,
|
|
341
|
+
nextUrl: string,
|
|
342
|
+
): Record<string, string> {
|
|
343
|
+
const next: Record<string, string> = { ...headers };
|
|
344
|
+
delete next.authorization;
|
|
345
|
+
delete next.Authorization;
|
|
346
|
+
Object.assign(next, resolveHubAuthHeaders(nextUrl));
|
|
347
|
+
return next;
|
|
348
|
+
}
|
|
349
|
+
|
|
300
350
|
async function openDownloadResponse(
|
|
301
351
|
url: string,
|
|
302
352
|
headers: Record<string, string>,
|
|
@@ -322,10 +372,11 @@ async function openDownloadResponse(
|
|
|
322
372
|
const location = response.headers.location;
|
|
323
373
|
if (location && [301, 302, 303, 307, 308].includes(statusCode)) {
|
|
324
374
|
response.resume();
|
|
375
|
+
const nextUrl = new URL(location, parsed).toString();
|
|
325
376
|
resolve(
|
|
326
377
|
openDownloadResponse(
|
|
327
|
-
|
|
328
|
-
headers,
|
|
378
|
+
nextUrl,
|
|
379
|
+
reauthorizeRedirectHeaders(headers, nextUrl),
|
|
329
380
|
signal,
|
|
330
381
|
redirectCount + 1,
|
|
331
382
|
),
|
|
@@ -446,7 +497,7 @@ async function readAssignments(): Promise<Assignments> {
|
|
|
446
497
|
assignments: {},
|
|
447
498
|
},
|
|
448
499
|
);
|
|
449
|
-
return file.assignments ?? {};
|
|
500
|
+
return sanitizeAssignments(file.assignments ?? {});
|
|
450
501
|
}
|
|
451
502
|
|
|
452
503
|
async function writeAssignments(
|
|
@@ -514,12 +565,14 @@ async function downloadModel(
|
|
|
514
565
|
record.updatedAt = new Date().toISOString();
|
|
515
566
|
|
|
516
567
|
try {
|
|
568
|
+
const downloadUrl = huggingFaceResolveUrl(model);
|
|
517
569
|
const headers: Record<string, string> = {
|
|
518
570
|
"user-agent": "Eliza-MobileLocalInference/1.0",
|
|
571
|
+
...resolveHubAuthHeaders(downloadUrl),
|
|
519
572
|
};
|
|
520
573
|
if (existingPartial > 0) headers.range = `bytes=${existingPartial}-`;
|
|
521
574
|
const response = await openDownloadResponse(
|
|
522
|
-
|
|
575
|
+
downloadUrl,
|
|
523
576
|
headers,
|
|
524
577
|
abortController.signal,
|
|
525
578
|
);
|
|
@@ -1178,6 +1231,12 @@ export async function handleLocalInferenceRoutes(
|
|
|
1178
1231
|
);
|
|
1179
1232
|
if (await handleVoiceFirstRunRoutes(req, res)) return true;
|
|
1180
1233
|
}
|
|
1234
|
+
if (pathname === "/api/voice/native-pcm-turn") {
|
|
1235
|
+
const { handleNativePcmTurnRoute } = await import(
|
|
1236
|
+
"./routes/native-pcm-turn-route.js"
|
|
1237
|
+
);
|
|
1238
|
+
if (await handleNativePcmTurnRoute(req, res)) return true;
|
|
1239
|
+
}
|
|
1181
1240
|
// Family-member capture route lives under /v1/voice/first-run/family-member.
|
|
1182
1241
|
if (pathname === "/v1/voice/first-run/family-member") {
|
|
1183
1242
|
const { handleFamilyMemberRoute } = await import(
|
|
@@ -1238,6 +1297,16 @@ export async function handleLocalInferenceRoutes(
|
|
|
1238
1297
|
sendJson(res, (await hubSnapshot()).hardware);
|
|
1239
1298
|
return true;
|
|
1240
1299
|
}
|
|
1300
|
+
// The authoritative device-tier assessment (tier + recommendedMode +
|
|
1301
|
+
// recommendedFit) — the same one the router's AUTO policy consumes. Mirrors
|
|
1302
|
+
// the app-core compat route so mobile (which mounts this upstream variant)
|
|
1303
|
+
// also gets the authoritative assessment instead of the coarse client estimate.
|
|
1304
|
+
if (method === "GET" && pathname === "/api/local-inference/device-tier") {
|
|
1305
|
+
sendJson(res, {
|
|
1306
|
+
tier: classifyDeviceTier(await localInferenceService.getHardware()),
|
|
1307
|
+
});
|
|
1308
|
+
return true;
|
|
1309
|
+
}
|
|
1241
1310
|
if (method === "GET" && pathname === "/api/local-inference/catalog") {
|
|
1242
1311
|
sendJson(res, {
|
|
1243
1312
|
models: CATALOG.filter((model) => !model.hiddenFromCatalog),
|
|
@@ -1307,13 +1376,22 @@ export async function handleLocalInferenceRoutes(
|
|
|
1307
1376
|
const body = await readJsonBody<Record<string, unknown>>(req, res);
|
|
1308
1377
|
if (!body) return true;
|
|
1309
1378
|
const slot = typeof body.slot === "string" ? body.slot : null;
|
|
1310
|
-
if (!slot) {
|
|
1379
|
+
if (!slot || !ASSIGNMENT_SLOTS.has(slot as keyof Assignments)) {
|
|
1311
1380
|
sendJsonError(res, "slot is required");
|
|
1312
1381
|
return true;
|
|
1313
1382
|
}
|
|
1314
1383
|
const assignments = await readAssignments();
|
|
1315
1384
|
if (typeof body.modelId === "string" && body.modelId.trim()) {
|
|
1316
|
-
|
|
1385
|
+
const modelId = body.modelId.trim();
|
|
1386
|
+
if (!isCuratedCatalogModelId(modelId)) {
|
|
1387
|
+
sendJsonError(
|
|
1388
|
+
res,
|
|
1389
|
+
"Local inference assignments are limited to curated Eliza-1 tiers.",
|
|
1390
|
+
400,
|
|
1391
|
+
);
|
|
1392
|
+
return true;
|
|
1393
|
+
}
|
|
1394
|
+
assignments[slot as keyof Assignments] = modelId;
|
|
1317
1395
|
} else {
|
|
1318
1396
|
delete assignments[slot as keyof Assignments];
|
|
1319
1397
|
}
|
|
@@ -1535,7 +1613,11 @@ export async function handleLocalInferenceRoutes(
|
|
|
1535
1613
|
return true;
|
|
1536
1614
|
}
|
|
1537
1615
|
if (method === "GET" && pathname === "/api/local-inference/hf-search") {
|
|
1538
|
-
sendJson(res, {
|
|
1616
|
+
sendJson(res, {
|
|
1617
|
+
models: [],
|
|
1618
|
+
disabled: true,
|
|
1619
|
+
reason: "custom-model-search-disabled",
|
|
1620
|
+
});
|
|
1539
1621
|
return true;
|
|
1540
1622
|
}
|
|
1541
1623
|
|