@elizaos/plugin-local-inference 2.0.3-beta.2 → 2.0.3-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -10
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -0
- package/dist/actions/transcription-control.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
- package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.d.ts +18 -0
- package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
- package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/types.d.ts +338 -0
- package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
- package/dist/backends/apple-foundation.d.ts +56 -0
- package/dist/backends/apple-foundation.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39647 -0
- package/dist/index.js.map +217 -0
- package/{src → dist}/local-inference-routes.d.ts +9 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts.map +1 -0
- package/{src → dist}/routes/compat-helpers.d.ts +1 -1
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/{src → dist}/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +42040 -0
- package/dist/routes/index.js.map +236 -0
- package/{src → dist}/routes/live-diarization-route.d.ts +7 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
- package/dist/routes/native-pcm-turn-route.d.ts +3 -0
- package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
- package/dist/routes/transcript-audio-store.d.ts.map +1 -0
- package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/{src → dist}/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +38768 -0
- package/dist/runtime/index.js.map +217 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/{src → dist}/services/active-model.d.ts +28 -0
- package/dist/services/active-model.d.ts.map +1 -0
- package/dist/services/asr-provenance.d.ts +5 -0
- package/dist/services/asr-provenance.d.ts.map +1 -0
- package/{src → dist}/services/assignments.d.ts +16 -3
- package/dist/services/assignments.d.ts.map +1 -0
- package/dist/services/backend-selector.d.ts +55 -0
- package/dist/services/backend-selector.d.ts.map +1 -0
- package/{src → dist}/services/backend.d.ts +110 -16
- package/dist/services/backend.d.ts.map +1 -0
- package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts.map +1 -0
- package/dist/services/cache-bridge.d.ts.map +1 -0
- package/dist/services/catalog.d.ts +10 -0
- package/dist/services/catalog.d.ts.map +1 -0
- package/dist/services/checkpoint-client.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.d.ts +217 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/cloud-fallback.d.ts.map +1 -0
- package/dist/services/context-fit.d.ts +36 -0
- package/dist/services/context-fit.d.ts.map +1 -0
- package/dist/services/conversation-registry.d.ts.map +1 -0
- package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/{src → dist}/services/device-tier.d.ts +19 -1
- package/dist/services/device-tier.d.ts.map +1 -0
- package/{src → dist}/services/downloader.d.ts +16 -4
- package/dist/services/downloader.d.ts.map +1 -0
- package/{src → dist}/services/engine.d.ts +43 -4
- package/dist/services/engine.d.ts.map +1 -0
- package/dist/services/ensure-local-artifacts.d.ts +82 -0
- package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
- package/dist/services/external-scanner.d.ts.map +1 -0
- package/dist/services/ffi-llm-mock.d.ts +90 -0
- package/dist/services/ffi-llm-mock.d.ts.map +1 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -0
- package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
- package/dist/services/gpu-autotune.d.ts +150 -0
- package/dist/services/gpu-autotune.d.ts.map +1 -0
- package/dist/services/gpu-detect.d.ts.map +1 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/{src → dist}/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39453 -0
- package/dist/services/index.js.map +227 -0
- package/dist/services/inference-capabilities.d.ts.map +1 -0
- package/dist/services/inference-telemetry.d.ts.map +1 -0
- package/dist/services/ios-llama-streaming.d.ts +119 -0
- package/dist/services/ios-llama-streaming.d.ts.map +1 -0
- package/dist/services/kv-spill.d.ts.map +1 -0
- package/dist/services/latency-trace.d.ts.map +1 -0
- package/dist/services/lib-target.d.ts +55 -0
- package/dist/services/lib-target.d.ts.map +1 -0
- package/dist/services/live-signals.d.ts +86 -0
- package/dist/services/live-signals.d.ts.map +1 -0
- package/dist/services/llama-server-metrics.d.ts +114 -0
- package/dist/services/llama-server-metrics.d.ts.map +1 -0
- package/dist/services/llm-streaming-binding.d.ts.map +1 -0
- package/dist/services/load-args.d.ts.map +1 -0
- package/dist/services/manifest/index.d.ts +4 -0
- package/dist/services/manifest/index.d.ts.map +1 -0
- package/{src → dist}/services/manifest/schema.d.ts +196 -6
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/{src → dist}/services/manifest/types.d.ts +3 -1
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/{src → dist}/services/memory-arbiter.d.ts +33 -3
- package/dist/services/memory-arbiter.d.ts.map +1 -0
- package/dist/services/memory-benchmark.d.ts +76 -0
- package/dist/services/memory-benchmark.d.ts.map +1 -0
- package/{src → dist}/services/memory-monitor.d.ts +6 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/{src → dist}/services/registry.d.ts +11 -13
- package/dist/services/registry.d.ts.map +1 -0
- package/{src → dist}/services/router-handler.d.ts +2 -2
- package/dist/services/router-handler.d.ts.map +1 -0
- package/{src → dist}/services/routing-policy.d.ts +32 -9
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/{src → dist}/services/service.d.ts +1 -1
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts.map +1 -0
- package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/dist/services/structured-output/index.d.ts +2 -0
- package/dist/services/structured-output/index.d.ts.map +1 -0
- package/dist/services/structured-output.d.ts.map +1 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/{src → dist}/services/types.d.ts +1 -1
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/{src → dist}/services/vision/index.d.ts +1 -1
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/{src → dist}/services/vision/types.d.ts +13 -4
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
- package/dist/services/vision-embedding-cache.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-policy.d.ts +178 -0
- package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
- package/dist/services/voice/corpus-augment.d.ts +111 -0
- package/dist/services/voice/corpus-augment.d.ts.map +1 -0
- package/dist/services/voice/corpus-generator.d.ts +134 -0
- package/dist/services/voice/corpus-generator.d.ts.map +1 -0
- package/dist/services/voice/diarization-error-rate.d.ts +40 -0
- package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
- package/dist/services/voice/e2e-harness.d.ts +297 -0
- package/dist/services/voice/e2e-harness.d.ts.map +1 -0
- package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
- package/dist/services/voice/echo-delay.d.ts +67 -0
- package/dist/services/voice/echo-delay.d.ts.map +1 -0
- package/dist/services/voice/echo-metrics.d.ts +7 -0
- package/dist/services/voice/echo-metrics.d.ts.map +1 -0
- package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
- package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
- package/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
- package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/embedding-server.d.ts +37 -0
- package/dist/services/voice/embedding-server.d.ts.map +1 -0
- package/{src → dist}/services/voice/embedding.d.ts +2 -3
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/{src → dist}/services/voice/errors.d.ts +1 -1
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/{src → dist}/services/voice/index.d.ts +8 -3
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/kokoro/index.d.ts +24 -0
- package/dist/services/voice/kokoro/index.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
- package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/dist/services/voice/kokoro/types.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
- package/dist/services/voice/lifecycle.d.ts.map +1 -0
- package/dist/services/voice/live-diarization-session.d.ts +196 -0
- package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
- package/dist/services/voice/metric-math.d.ts +10 -0
- package/dist/services/voice/metric-math.d.ts.map +1 -0
- package/{src → dist}/services/voice/mic-source.d.ts +1 -1
- package/dist/services/voice/mic-source.d.ts.map +1 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
- package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
- package/dist/services/voice/optimistic-rollback.d.ts +151 -0
- package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
- package/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/dist/services/voice/scheduler.d.ts.map +1 -0
- package/dist/services/voice/self-voice-imprint.d.ts +33 -0
- package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
- package/{src → dist}/services/voice/shared-resources.d.ts +14 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
- package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
- package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcriber.d.ts +4 -4
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/{src → dist}/services/voice/types.d.ts +6 -6
- package/dist/services/voice/types.d.ts.map +1 -0
- package/{src → dist}/services/voice/vad.d.ts +6 -5
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
- package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
- package/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/dist/services/voice/voice-scenario.d.ts +131 -0
- package/dist/services/voice/voice-scenario.d.ts.map +1 -0
- package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
- package/dist/services/voice/voice-workbench-report.d.ts +117 -0
- package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
- package/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/dist/services/voice/wake-word.d.ts.map +1 -0
- package/dist/services/voice/wav-codec.d.ts +11 -0
- package/dist/services/voice/wav-codec.d.ts.map +1 -0
- package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
- package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
- package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
- package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
- package/dist/services/voice/workbench-logic-services.d.ts +36 -0
- package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-real-services.d.ts +17 -0
- package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-scenarios.d.ts +24 -0
- package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -0
- package/dist/services/voice-prewarm.d.ts.map +1 -0
- package/dist/voice-workbench.d.ts +18 -0
- package/dist/voice-workbench.d.ts.map +1 -0
- package/dist/voice-workbench.js +5259 -0
- package/dist/voice-workbench.js.map +34 -0
- package/package.json +28 -9
- package/registry-entry.json +137 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +1 -1
- package/src/adapters/capacitor-llama/index.ts +28 -4
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +1 -1
- package/src/local-inference-routes.test.ts +57 -11
- package/src/local-inference-routes.ts +90 -8
- package/src/provider.ts +32 -3
- package/src/routes/compat-helpers.ts +2 -1
- package/src/routes/index.ts +1 -0
- package/src/routes/live-diarization-route.test.ts +134 -0
- package/src/routes/live-diarization-route.ts +79 -3
- package/src/routes/local-inference-asr-route.test.ts +43 -2
- package/src/routes/local-inference-asr-route.ts +7 -4
- package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
- package/src/routes/local-inference-asr-transcribe.ts +1 -1
- package/src/routes/local-inference-compat-routes.test.ts +3 -3
- package/src/routes/local-inference-compat-routes.ts +23 -56
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcripts-routes.test.ts +51 -0
- package/src/routes/transcripts-routes.ts +35 -3
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
- package/src/runtime/ensure-local-inference-handler.ts +203 -11
- package/src/runtime/index.ts +4 -1
- package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
- package/src/runtime/mobile-local-inference-gate.ts +60 -5
- package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
- package/src/runtime/voice-entity-binding.ts +46 -6
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +2 -2
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model.ts +211 -8
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +26 -0
- package/src/services/assignments.ts +52 -4
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +198 -19
- package/src/services/bionic-host-loader.test.ts +94 -1
- package/src/services/bionic-host-loader.ts +72 -0
- package/src/services/cache-bridge.test.ts +7 -7
- package/src/services/catalog.test.ts +32 -11
- package/src/services/catalog.ts +6 -0
- package/src/services/cloud-fallback.ts +1 -1
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
- package/src/services/device-tier.test.ts +89 -2
- package/src/services/device-tier.ts +103 -11
- package/src/services/downloader.test.ts +199 -58
- package/src/services/downloader.ts +141 -27
- package/src/services/engine-direct-bundle.test.ts +38 -6
- package/src/services/engine.ts +291 -104
- package/src/services/ensure-local-artifacts.ts +1 -1
- package/src/services/ffi-llm-streaming-abi.ts +6 -3
- package/src/services/ffi-streaming-backend.ts +44 -8
- package/src/services/ffi-streaming-runner.test.ts +163 -3
- package/src/services/ffi-streaming-runner.ts +54 -1
- package/src/services/ffi-unload-ordering.test.ts +5 -1
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/hardware.test.ts +7 -2
- package/src/services/hardware.ts +28 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/sd-cpp.ts +6 -9
- package/src/services/index.ts +18 -0
- package/src/services/ios-llama-streaming.ts +1 -1
- package/src/services/kv-spill.ts +6 -5
- package/src/services/lib-target.test.ts +145 -0
- package/src/services/lib-target.ts +102 -0
- package/src/services/live-signals.test.ts +132 -0
- package/src/services/live-signals.ts +177 -0
- package/src/services/llama-server-metrics.test.ts +168 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +84 -2
- package/src/services/manifest/index.ts +6 -0
- package/src/services/manifest/manifest.test.ts +156 -54
- package/src/services/manifest/schema.ts +160 -52
- package/src/services/manifest/types.ts +6 -0
- package/src/services/manifest/validator.ts +91 -25
- package/src/services/memory-arbiter.test.ts +139 -0
- package/src/services/memory-arbiter.ts +81 -15
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +24 -0
- package/src/services/memory-monitor.ts +12 -0
- package/src/services/mtp-doctor.ts +10 -2
- package/src/services/network-policy.ts +5 -5
- package/src/services/ram-budget-cache.test.ts +2 -1
- package/src/services/ram-budget.ts +0 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/registry.ts +25 -19
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.ts +43 -24
- package/src/services/routing-policy.test.ts +211 -23
- package/src/services/routing-policy.ts +92 -22
- package/src/services/service.test.ts +3 -3
- package/src/services/service.ts +22 -7
- package/src/services/transcription-priority.test.ts +2 -2
- package/src/services/types.ts +4 -0
- package/src/services/verify-on-device.test.ts +2 -2
- package/src/services/vision/hash.ts +1 -1
- package/src/services/vision/index.ts +2 -2
- package/src/services/vision/llama-server.ts +1 -1
- package/src/services/vision/types.ts +13 -4
- package/src/services/vision-embedding-cache.ts +1 -1
- package/src/services/voice/VOICE_WORKBENCH.md +71 -26
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
- package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
- package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
- package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
- package/src/services/voice/asr-timed.real.test.ts +6 -8
- package/src/services/voice/audio-frame-consumer.test.ts +327 -1
- package/src/services/voice/audio-frame-consumer.ts +165 -5
- package/src/services/voice/barge-in.ts +2 -3
- package/src/services/voice/corpus-augment.test.ts +276 -0
- package/src/services/voice/corpus-augment.ts +451 -0
- package/src/services/voice/corpus-generator.test.ts +201 -0
- package/src/services/voice/corpus-generator.ts +413 -0
- package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
- package/src/services/voice/diarization-error-rate.test.ts +100 -0
- package/src/services/voice/diarization-error-rate.ts +249 -0
- package/src/services/voice/e2e-harness.der.test.ts +94 -0
- package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
- package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
- package/src/services/voice/e2e-harness.test.ts +2 -2
- package/src/services/voice/e2e-harness.ts +175 -16
- package/src/services/voice/echo-delay.test.ts +118 -0
- package/src/services/voice/echo-delay.ts +135 -0
- package/src/services/voice/echo-metrics.test.ts +17 -0
- package/src/services/voice/echo-metrics.ts +20 -0
- package/src/services/voice/echo-reference-buffer.test.ts +86 -0
- package/src/services/voice/echo-reference-buffer.ts +165 -0
- package/src/services/voice/eliza1-eot-scorer.ts +22 -22
- package/src/services/voice/embedding.ts +2 -3
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.ts +151 -110
- package/src/services/voice/eot-classifier-ggml.ts +42 -39
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +11 -122
- package/src/services/voice/errors.ts +2 -0
- package/src/services/voice/expressive-tags.asr.test.ts +77 -0
- package/src/services/voice/expressive-tags.test.ts +102 -0
- package/src/services/voice/expressive-tags.ts +8 -8
- package/src/services/voice/ffi-bindings.test.ts +10 -3
- package/src/services/voice/ffi-bindings.ts +177 -15
- package/src/services/voice/fused-eot-scorer.ts +17 -13
- package/src/services/voice/index.ts +33 -12
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
- package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
- package/src/services/voice/kokoro/pick-runtime.ts +1 -1
- package/src/services/voice/kokoro/runtime-selection.ts +28 -201
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +335 -2
- package/src/services/voice/metric-math.test.ts +61 -0
- package/src/services/voice/metric-math.ts +25 -0
- package/src/services/voice/mic-source.ts +1 -1
- package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
- package/src/services/voice/nlms-echo-canceller.ts +317 -0
- package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
- package/src/services/voice/partial-stabilizer.ts +1 -1
- package/src/services/voice/pipeline.ts +3 -4
- package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
- package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
- package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
- package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
- package/src/services/voice/self-voice-imprint.test.ts +59 -0
- package/src/services/voice/self-voice-imprint.ts +102 -0
- package/src/services/voice/shared-resources.ts +23 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.ts +4 -4
- package/src/services/voice/transcript-service.test.ts +58 -0
- package/src/services/voice/transcript-service.ts +64 -0
- package/src/services/voice/transcript-store.test.ts +36 -0
- package/src/services/voice/transcript-store.ts +32 -0
- package/src/services/voice/types.ts +7 -7
- package/src/services/voice/vad.test.ts +33 -15
- package/src/services/voice/vad.ts +25 -20
- package/src/services/voice/voice-budget.test.ts +0 -3
- package/src/services/voice/voice-budget.ts +6 -6
- package/src/services/voice/voice-duet.test.ts +1 -1
- package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
- package/src/services/voice/voice-preload-predictor.test.ts +130 -0
- package/src/services/voice/voice-preload-predictor.ts +113 -0
- package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
- package/src/services/voice/voice-preset-format.test.ts +75 -0
- package/src/services/voice/voice-preset-format.ts +17 -4
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +133 -7
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-workbench-report.ts +58 -17
- package/src/services/voice/wake-word-ggml.ts +12 -13
- package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
- package/src/services/voice/wav-codec.test.ts +32 -0
- package/src/services/voice/wav-codec.ts +101 -0
- package/src/services/voice/workbench-entrypoint.test.ts +55 -0
- package/src/services/voice/workbench-entrypoint.ts +88 -0
- package/src/services/voice/workbench-headless-runner.test.ts +162 -0
- package/src/services/voice/workbench-headless-runner.ts +396 -0
- package/src/services/voice/workbench-logic-services.test.ts +225 -0
- package/src/services/voice/workbench-logic-services.ts +184 -0
- package/src/services/voice/workbench-real-services.ts +629 -0
- package/src/services/voice/workbench-scenarios.ts +407 -0
- package/src/services/voice-prewarm.ts +1 -1
- package/src/voice-workbench.ts +71 -0
- package/src/actions/generate-media.d.ts.map +0 -1
- package/src/actions/identify-speaker.d.ts.map +0 -1
- package/src/actions/transcription-control.d.ts.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/local-inference-routes.d.ts.map +0 -1
- package/src/provider.d.ts.map +0 -1
- package/src/routes/compat-helpers.d.ts.map +0 -1
- package/src/routes/family-member-route.d.ts.map +0 -1
- package/src/routes/index.d.ts.map +0 -1
- package/src/routes/live-diarization-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
- package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
- package/src/routes/local-inference-tts-route.d.ts.map +0 -1
- package/src/routes/transcript-audio-store.d.ts.map +0 -1
- package/src/routes/transcripts-routes.d.ts.map +0 -1
- package/src/routes/voice-first-run-routes.d.ts.map +0 -1
- package/src/routes/voice-models-routes.d.ts.map +0 -1
- package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
- package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
- package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
- package/src/runtime/embedding-manager-support.d.ts.map +0 -1
- package/src/runtime/embedding-presets.d.ts.map +0 -1
- package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
- package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
- package/src/runtime/index.d.ts.map +0 -1
- package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
- package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
- package/src/runtime/voice-entity-binding.d.ts.map +0 -1
- package/src/services/active-model.d.ts.map +0 -1
- package/src/services/assignments.d.ts.map +0 -1
- package/src/services/backend.d.ts.map +0 -1
- package/src/services/bionic-host-loader.d.ts.map +0 -1
- package/src/services/bundled-models.d.ts.map +0 -1
- package/src/services/cache-bridge.d.ts.map +0 -1
- package/src/services/catalog.d.ts +0 -10
- package/src/services/catalog.d.ts.map +0 -1
- package/src/services/checkpoint-client.d.ts.map +0 -1
- package/src/services/cloud-fallback.d.ts.map +0 -1
- package/src/services/conversation-registry.d.ts.map +0 -1
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
- package/src/services/device-bridge.d.ts.map +0 -1
- package/src/services/device-resource-metrics.d.ts.map +0 -1
- package/src/services/device-tier.d.ts.map +0 -1
- package/src/services/downloader.d.ts.map +0 -1
- package/src/services/engine.d.ts.map +0 -1
- package/src/services/external-scanner.d.ts.map +0 -1
- package/src/services/ffi-streaming-backend.d.ts.map +0 -1
- package/src/services/ffi-streaming-runner.d.ts.map +0 -1
- package/src/services/gpu-detect.d.ts.map +0 -1
- package/src/services/handler-registry.d.ts.map +0 -1
- package/src/services/hardware.d.ts.map +0 -1
- package/src/services/hf-search.d.ts +0 -26
- package/src/services/hf-search.d.ts.map +0 -1
- package/src/services/hf-search.test.ts +0 -69
- package/src/services/hf-search.ts +0 -420
- package/src/services/image-description-runtime.d.ts.map +0 -1
- package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/backend-selector.d.ts.map +0 -1
- package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/errors.d.ts.map +0 -1
- package/src/services/imagegen/index.d.ts.map +0 -1
- package/src/services/imagegen/mflux.d.ts.map +0 -1
- package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/types.d.ts.map +0 -1
- package/src/services/index.d.ts.map +0 -1
- package/src/services/inference-capabilities.d.ts.map +0 -1
- package/src/services/inference-telemetry.d.ts.map +0 -1
- package/src/services/kv-spill.d.ts.map +0 -1
- package/src/services/latency-trace.d.ts.map +0 -1
- package/src/services/llm-streaming-binding.d.ts.map +0 -1
- package/src/services/load-args.d.ts.map +0 -1
- package/src/services/manifest/index.d.ts +0 -4
- package/src/services/manifest/index.d.ts.map +0 -1
- package/src/services/manifest/schema.d.ts.map +0 -1
- package/src/services/manifest/types.d.ts.map +0 -1
- package/src/services/manifest/validator.d.ts.map +0 -1
- package/src/services/memory-arbiter.d.ts.map +0 -1
- package/src/services/memory-monitor.d.ts.map +0 -1
- package/src/services/memory-pressure.d.ts.map +0 -1
- package/src/services/mtp-doctor.d.ts.map +0 -1
- package/src/services/network-policy.d.ts.map +0 -1
- package/src/services/paths.d.ts.map +0 -1
- package/src/services/planner-skeleton.d.ts.map +0 -1
- package/src/services/providers.d.ts.map +0 -1
- package/src/services/ram-budget.d.ts.map +0 -1
- package/src/services/readiness.d.ts.map +0 -1
- package/src/services/recommendation.d.ts.map +0 -1
- package/src/services/registry.d.ts.map +0 -1
- package/src/services/router-handler.d.ts.map +0 -1
- package/src/services/routing-policy.d.ts.map +0 -1
- package/src/services/routing-preferences.d.ts.map +0 -1
- package/src/services/runtime-target.d.ts.map +0 -1
- package/src/services/service.d.ts.map +0 -1
- package/src/services/session-pool.d.ts.map +0 -1
- package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
- package/src/services/structured-output.d.ts.map +0 -1
- package/src/services/system-memory.d.ts.map +0 -1
- package/src/services/types.d.ts.map +0 -1
- package/src/services/verify-on-device.d.ts.map +0 -1
- package/src/services/verify.d.ts.map +0 -1
- package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
- package/src/services/vision/capacitor-llama.d.ts.map +0 -1
- package/src/services/vision/cloud-fallback.d.ts.map +0 -1
- package/src/services/vision/hash.d.ts.map +0 -1
- package/src/services/vision/index.d.ts.map +0 -1
- package/src/services/vision/llama-server.d.ts.map +0 -1
- package/src/services/vision/types.d.ts.map +0 -1
- package/src/services/vision/vast-fallback.d.ts.map +0 -1
- package/src/services/vision-embedding-cache.d.ts.map +0 -1
- package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
- package/src/services/voice/barge-in.d.ts.map +0 -1
- package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
- package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
- package/src/services/voice/eager-context-builder.d.ts.map +0 -1
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/embedding.d.ts.map +0 -1
- package/src/services/voice/emotion-attribution.d.ts.map +0 -1
- package/src/services/voice/engine-bridge.d.ts.map +0 -1
- package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
- package/src/services/voice/eot-classifier.d.ts.map +0 -1
- package/src/services/voice/errors.d.ts.map +0 -1
- package/src/services/voice/expressive-tags.d.ts.map +0 -1
- package/src/services/voice/ffi-bindings.d.ts.map +0 -1
- package/src/services/voice/first-line-cache.d.ts.map +0 -1
- package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/index.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
- package/src/services/voice/kokoro/types.d.ts.map +0 -1
- package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
- package/src/services/voice/kokoro/voices.d.ts.map +0 -1
- package/src/services/voice/lifecycle.d.ts.map +0 -1
- package/src/services/voice/live-diarization-session.d.ts +0 -96
- package/src/services/voice/live-diarization-session.d.ts.map +0 -1
- package/src/services/voice/mic-source.d.ts.map +0 -1
- package/src/services/voice/optimistic-policy.d.ts.map +0 -1
- package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
- package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
- package/src/services/voice/phrase-cache.d.ts.map +0 -1
- package/src/services/voice/phrase-chunker.d.ts.map +0 -1
- package/src/services/voice/pipeline-impls.d.ts.map +0 -1
- package/src/services/voice/pipeline.d.ts.map +0 -1
- package/src/services/voice/prefill-client.d.ts.map +0 -1
- package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
- package/src/services/voice/profile-store.d.ts.map +0 -1
- package/src/services/voice/ring-buffer.d.ts.map +0 -1
- package/src/services/voice/rollback-queue.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
- package/src/services/voice/scheduler.d.ts.map +0 -1
- package/src/services/voice/shared-resources.d.ts.map +0 -1
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder.d.ts.map +0 -1
- package/src/services/voice/speaker-imprint.d.ts.map +0 -1
- package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
- package/src/services/voice/system-audio-sink.d.ts.map +0 -1
- package/src/services/voice/transcriber.d.ts.map +0 -1
- package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
- package/src/services/voice/transcript-service.d.ts.map +0 -1
- package/src/services/voice/transcript-store.d.ts.map +0 -1
- package/src/services/voice/turn-controller.d.ts.map +0 -1
- package/src/services/voice/types.d.ts.map +0 -1
- package/src/services/voice/vad.d.ts.map +0 -1
- package/src/services/voice/voice-budget.d.ts.map +0 -1
- package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
- package/src/services/voice/voice-preset-format.d.ts.map +0 -1
- package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
- package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
- package/src/services/voice/voice-settings.d.ts +0 -82
- package/src/services/voice/voice-settings.d.ts.map +0 -1
- package/src/services/voice/voice-settings.ts +0 -172
- package/src/services/voice/voice-state-machine.d.ts.map +0 -1
- package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
- package/src/services/voice/wake-word.d.ts.map +0 -1
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
- package/src/services/voice-model-updater.d.ts.map +0 -1
- package/src/services/voice-prewarm.d.ts.map +0 -1
- /package/{src → dist}/actions/generate-media.d.ts +0 -0
- /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
- /package/{src → dist}/actions/transcription-control.d.ts +0 -0
- /package/{src → dist}/index.d.ts +0 -0
- /package/{src → dist}/provider.d.ts +0 -0
- /package/{src → dist}/routes/family-member-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
- /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
- /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
- /package/{src → dist}/services/bundled-models.d.ts +0 -0
- /package/{src → dist}/services/cache-bridge.d.ts +0 -0
- /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
- /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/conversation-registry.d.ts +0 -0
- /package/{src → dist}/services/device-bridge.d.ts +0 -0
- /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
- /package/{src → dist}/services/external-scanner.d.ts +0 -0
- /package/{src → dist}/services/gpu-detect.d.ts +0 -0
- /package/{src → dist}/services/handler-registry.d.ts +0 -0
- /package/{src → dist}/services/hardware.d.ts +0 -0
- /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
- /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
- /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
- /package/{src → dist}/services/imagegen/index.d.ts +0 -0
- /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
- /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/types.d.ts +0 -0
- /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
- /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
- /package/{src → dist}/services/kv-spill.d.ts +0 -0
- /package/{src → dist}/services/latency-trace.d.ts +0 -0
- /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
- /package/{src → dist}/services/load-args.d.ts +0 -0
- /package/{src → dist}/services/manifest/validator.d.ts +0 -0
- /package/{src → dist}/services/memory-pressure.d.ts +0 -0
- /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
- /package/{src → dist}/services/network-policy.d.ts +0 -0
- /package/{src → dist}/services/paths.d.ts +0 -0
- /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
- /package/{src → dist}/services/providers.d.ts +0 -0
- /package/{src → dist}/services/ram-budget.d.ts +0 -0
- /package/{src → dist}/services/readiness.d.ts +0 -0
- /package/{src → dist}/services/recommendation.d.ts +0 -0
- /package/{src → dist}/services/routing-preferences.d.ts +0 -0
- /package/{src → dist}/services/runtime-target.d.ts +0 -0
- /package/{src → dist}/services/session-pool.d.ts +0 -0
- /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
- /package/{src → dist}/services/structured-output.d.ts +0 -0
- /package/{src → dist}/services/system-memory.d.ts +0 -0
- /package/{src → dist}/services/verify-on-device.d.ts +0 -0
- /package/{src → dist}/services/verify.d.ts +0 -0
- /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
- /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/vision/hash.d.ts +0 -0
- /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
- /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
- /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
- /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
- /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
- /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
- /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
- /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
- /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
- /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
- /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
- /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
- /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
- /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
- /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
- /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
- /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
- /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
- /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
- /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
* 3–4 GB ceiling; Android foreground-service requirement).
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
import { isMobilePlatform } from "@elizaos/shared";
|
|
31
|
+
import {
|
|
32
|
+
type Eliza1Fit,
|
|
33
|
+
// Aliased to a distinct name (no shared `selectBestEliza1Fit*` prefix with the
|
|
34
|
+
// local `selectBestEliza1FitForDevice`) — the mobile Bun.build minifier was
|
|
35
|
+
// observed to mangle the same-prefix pair into a dangling `…Fit2` reference.
|
|
36
|
+
selectBestEliza1Fit as resolveBestEliza1FitForRam,
|
|
37
|
+
} from "@elizaos/shared/local-inference";
|
|
30
38
|
import type { HardwareProbe } from "./types";
|
|
31
39
|
|
|
32
40
|
/** The four device tiers used by the runtime + UI. */
|
|
@@ -67,7 +75,11 @@ export const DEVICE_TIER_THRESHOLDS = {
|
|
|
67
75
|
effectiveModelMemoryGb: 6,
|
|
68
76
|
freeRamGbAtSession: 3,
|
|
69
77
|
minTotalRamGb: 16,
|
|
70
|
-
|
|
78
|
+
// A phone can run eliza-1 2B (≈2.5 GB resident) locally — 6 GB+ total /
|
|
79
|
+
// ≈3 GB effective is enough — so an 8 GB Pixel is OKAY (local-capable),
|
|
80
|
+
// not POOR/cloud-only. The desktop floors stay higher.
|
|
81
|
+
mobileMinTotalRamGb: 6,
|
|
82
|
+
mobileEffectiveModelMemoryGb: 3,
|
|
71
83
|
},
|
|
72
84
|
} as const;
|
|
73
85
|
|
|
@@ -87,6 +99,12 @@ export interface DeviceTierAssessment {
|
|
|
87
99
|
canRunLocalVoice: boolean;
|
|
88
100
|
/** Default backend mode for the user. */
|
|
89
101
|
recommendedMode: RecommendedMode;
|
|
102
|
+
/**
|
|
103
|
+
* The biggest eliza-1 tier (+ 128k-targeted QJL context) that fits this device,
|
|
104
|
+
* or `null` when nothing local fits and the modality should route to Cloud.
|
|
105
|
+
* This is the single forced-model decision the consumer UI renders read-only.
|
|
106
|
+
*/
|
|
107
|
+
recommendedFit: Eliza1Fit | null;
|
|
90
108
|
/** Numeric snapshot to drive UI badges and first-run copy. */
|
|
91
109
|
numericContext: {
|
|
92
110
|
totalRamGb: number;
|
|
@@ -114,6 +132,72 @@ export function effectiveModelMemoryGb(probe: HardwareProbe): number {
|
|
|
114
132
|
return probe.totalRamGb * 0.5;
|
|
115
133
|
}
|
|
116
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Mobile OS background-task model makes large local tiers unsafe regardless of how
|
|
137
|
+
* much RAM the phone reports, so cap mobile fit at the 4B floor. A strong phone may
|
|
138
|
+
* run 4B; a typical one lands on 2B; both still flow through `selectBestEliza1Fit`.
|
|
139
|
+
*/
|
|
140
|
+
const MOBILE_FIT_CEILING_GB = 6;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Largest context window we advertise on a phone. A full 128k QJL KV cache does
|
|
144
|
+
* not fit alongside the weights in a handset's real free RAM (the resident agent +
|
|
145
|
+
* WebView + OS leave well under `totalRam × 0.5`), so we clamp mobile windows here
|
|
146
|
+
* even when the coarse RAM math would allow more.
|
|
147
|
+
*/
|
|
148
|
+
const MOBILE_CONTEXT_CEILING = 65536; // 64k
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* True when this host should be treated as a phone for fit purposes. The on-device
|
|
152
|
+
* bun agent's hardware probe often reports `platform: "linux"` with no `mobile`
|
|
153
|
+
* field (it sees the bionic/musl env as linux), so the probe alone under-detects
|
|
154
|
+
* Android/iOS — fall back to the runtime `ELIZA_PLATFORM` signal so the mobile cap
|
|
155
|
+
* still applies. Without this, a high-RAM phone would be handed a 9B+ tier.
|
|
156
|
+
*/
|
|
157
|
+
function isMobileHost(probe: HardwareProbe): boolean {
|
|
158
|
+
return isMobile(probe) || isMobilePlatform();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The canonical "biggest eliza-1 that fits this device" decision: normalize the
|
|
163
|
+
* hardware probe to usable model memory, then pick the largest tier at a 128k QJL
|
|
164
|
+
* window (or a downscaled 2B window, or `null` → route to Cloud). This is the one
|
|
165
|
+
* function callers should use to answer "what local model runs here" — it always
|
|
166
|
+
* applies TurboQuant weights + the QJL KV cache and targets a 128k window. On
|
|
167
|
+
* mobile it caps the tier at 4B and the context at 64k (a phone cannot hold a 128k
|
|
168
|
+
* cache).
|
|
169
|
+
*/
|
|
170
|
+
export function selectBestEliza1FitForDevice(
|
|
171
|
+
probe: HardwareProbe,
|
|
172
|
+
): Eliza1Fit | null {
|
|
173
|
+
const mobile = isMobileHost(probe);
|
|
174
|
+
let memGb = effectiveModelMemoryGb(probe);
|
|
175
|
+
if (mobile) memGb = Math.min(memGb, MOBILE_FIT_CEILING_GB);
|
|
176
|
+
let fit: Eliza1Fit | null;
|
|
177
|
+
try {
|
|
178
|
+
fit = resolveBestEliza1FitForRam(memGb);
|
|
179
|
+
} catch (err) {
|
|
180
|
+
// `recommendedFit` is an advisory hint, never a routing gate — but
|
|
181
|
+
// `classifyDeviceTier` (which embeds it) IS called on the routing hot path.
|
|
182
|
+
// A mobile-bundle minifier artifact has been observed to leave a dangling
|
|
183
|
+
// reference at this cross-module call, so guard it: degrade to no
|
|
184
|
+
// recommendation rather than letting an undefined-symbol error crash the
|
|
185
|
+
// whole device-tier assessment (and with it the AUTO router) on-device.
|
|
186
|
+
console.warn(
|
|
187
|
+
`[device-tier] recommendedFit unavailable: ${err instanceof Error ? err.message : String(err)}`,
|
|
188
|
+
);
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
if (fit && mobile && fit.contextLength > MOBILE_CONTEXT_CEILING) {
|
|
192
|
+
return {
|
|
193
|
+
...fit,
|
|
194
|
+
contextLength: MOBILE_CONTEXT_CEILING,
|
|
195
|
+
contextDownscaled: true,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return fit;
|
|
199
|
+
}
|
|
200
|
+
|
|
117
201
|
/**
|
|
118
202
|
* Treat the host as a mobile device. Mobile clamps to OKAY at best
|
|
119
203
|
* regardless of RAM because the OS background-task model breaks
|
|
@@ -127,19 +211,22 @@ function isMobile(probe: HardwareProbe): boolean {
|
|
|
127
211
|
|
|
128
212
|
/**
|
|
129
213
|
* Compute the CPU SIMD baseline. The hardware probe has no direct AVX2 field
|
|
130
|
-
* today for x86_64, so Linux/Win x86_64 ≥ 4 cores qualifies.
|
|
131
|
-
*
|
|
132
|
-
*
|
|
214
|
+
* today for x86_64, so Linux/Win x86_64 ≥ 4 cores qualifies.
|
|
215
|
+
*
|
|
216
|
+
* **arm64 / ARMv8-A architecturally MANDATES NEON (Advanced SIMD)** — every arm64
|
|
217
|
+
* phone has it — so we trust the architecture rather than the probe's
|
|
218
|
+
* `cpuFeatures.neon` (the on-device os-fallback probe omits it, which used to
|
|
219
|
+
* misclassify every Pixel as POOR → cloud-only even though it runs local 2B fine).
|
|
220
|
+
* We do not support 32-bit ARM (ARMv7), so it (and any other non-x64 arch) is
|
|
221
|
+
* treated as unsupported.
|
|
133
222
|
*
|
|
134
223
|
* This is a coarse heuristic; the precise check belongs in the FFI layer
|
|
135
224
|
* (it can `cpuid` the actual flags). The tier classifier just refuses POOR
|
|
136
225
|
* when the probe is clearly under-equipped.
|
|
137
226
|
*/
|
|
138
227
|
function hasAvx2Baseline(probe: HardwareProbe): boolean {
|
|
139
|
-
if (probe.arch === "arm64"
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
if (probe.arch !== "x64") return false;
|
|
228
|
+
if (probe.arch === "arm64") return probe.cpuCores >= 4;
|
|
229
|
+
if (probe.arch !== "x64") return false; // 32-bit ARM + others: unsupported
|
|
143
230
|
return probe.cpuCores >= 4;
|
|
144
231
|
}
|
|
145
232
|
|
|
@@ -167,7 +254,9 @@ function isAppleSilicon8gb(probe: HardwareProbe): boolean {
|
|
|
167
254
|
export function classifyDeviceTier(probe: HardwareProbe): DeviceTierAssessment {
|
|
168
255
|
const reasons: string[] = [];
|
|
169
256
|
const effective = effectiveModelMemoryGb(probe);
|
|
170
|
-
|
|
257
|
+
// isMobileHost (not isMobile) so a phone whose bun-agent probe reports
|
|
258
|
+
// platform:"linux" with no mobile field still gets mobile thresholds + clamp.
|
|
259
|
+
const mobile = isMobileHost(probe);
|
|
171
260
|
const avx2 = hasAvx2Baseline(probe);
|
|
172
261
|
const vramGb = probe.gpu?.totalVramGb ?? null;
|
|
173
262
|
const cpuCores = probe.cpuCores;
|
|
@@ -230,6 +319,7 @@ export function classifyDeviceTier(probe: HardwareProbe): DeviceTierAssessment {
|
|
|
230
319
|
canRunLocalLm,
|
|
231
320
|
canRunLocalVoice,
|
|
232
321
|
recommendedMode,
|
|
322
|
+
recommendedFit: selectBestEliza1FitForDevice(probe),
|
|
233
323
|
numericContext: {
|
|
234
324
|
totalRamGb,
|
|
235
325
|
freeRamGb,
|
|
@@ -319,8 +409,10 @@ function classifyRawTier(args: ClassifyArgs): DeviceTier {
|
|
|
319
409
|
return "GOOD";
|
|
320
410
|
}
|
|
321
411
|
|
|
322
|
-
// OKAY gate.
|
|
323
|
-
const meetsOkayEffective =
|
|
412
|
+
// OKAY gate. Mobile uses lower effective/total floors — a phone runs 2B fine.
|
|
413
|
+
const meetsOkayEffective =
|
|
414
|
+
effective >=
|
|
415
|
+
(mobile ? okay.mobileEffectiveModelMemoryGb : okay.effectiveModelMemoryGb);
|
|
324
416
|
const meetsOkayFree = freeRamGb >= okay.freeRamGbAtSession;
|
|
325
417
|
const meetsOkayTotal =
|
|
326
418
|
totalRamGb >= (mobile ? okay.mobileMinTotalRamGb : okay.minTotalRamGb);
|
|
@@ -7,8 +7,29 @@ import { readAssignments } from "./assignments";
|
|
|
7
7
|
import { findCatalogModel } from "./catalog";
|
|
8
8
|
import { Downloader } from "./downloader";
|
|
9
9
|
import type { Eliza1DeviceCaps } from "./manifest";
|
|
10
|
-
import {
|
|
11
|
-
import type {
|
|
10
|
+
import { registryPath } from "./paths";
|
|
11
|
+
import type {
|
|
12
|
+
CatalogModel,
|
|
13
|
+
DownloadJob,
|
|
14
|
+
HardwareProbe,
|
|
15
|
+
InstalledModel,
|
|
16
|
+
} from "./types";
|
|
17
|
+
|
|
18
|
+
/** Minimal HardwareProbe with a controllable free-disk value for preflight tests. */
|
|
19
|
+
function fakeProbe(freeDiskGb: number): HardwareProbe {
|
|
20
|
+
return {
|
|
21
|
+
totalRamGb: 32,
|
|
22
|
+
freeRamGb: 16,
|
|
23
|
+
freeDiskGb,
|
|
24
|
+
gpu: null,
|
|
25
|
+
cpuCores: 8,
|
|
26
|
+
platform: "darwin",
|
|
27
|
+
arch: "arm64",
|
|
28
|
+
appleSilicon: true,
|
|
29
|
+
recommendedBucket: "mid",
|
|
30
|
+
source: "os-fallback",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
12
33
|
|
|
13
34
|
function eliza1Manifest(overrides: {
|
|
14
35
|
ramBudgetMin?: number;
|
|
@@ -22,7 +43,6 @@ function eliza1Manifest(overrides: {
|
|
|
22
43
|
const textPath = "text/eliza-1-2b-128k.gguf";
|
|
23
44
|
const voicePath = "tts/voice.gguf";
|
|
24
45
|
const asrPath = "asr/asr.gguf";
|
|
25
|
-
const drafterPath = "mtp/drafter-2b.gguf";
|
|
26
46
|
const cachePath = "cache/voice-preset-default.bin";
|
|
27
47
|
const vadPath = "vad/eliza-1-vad.onnx";
|
|
28
48
|
const visionPath = "vision/mmproj-2b.gguf";
|
|
@@ -43,10 +63,14 @@ function eliza1Manifest(overrides: {
|
|
|
43
63
|
voice: { base: "eliza-1-voice", license: "test" },
|
|
44
64
|
asr: { base: "eliza-1-asr", license: "test" },
|
|
45
65
|
vad: { base: "eliza-1-vad", license: "test" },
|
|
46
|
-
drafter: { base: "eliza-1-drafter", license: "test" },
|
|
47
66
|
vision: { base: "eliza-1-vision", license: "test" },
|
|
48
67
|
},
|
|
49
68
|
defaultEligible: true,
|
|
69
|
+
// Downloader-mechanics fixture: MTP mode is incidental here, so this
|
|
70
|
+
// bundle is the legacy embedded-draft-head shape (no separate drafter
|
|
71
|
+
// GGUF to serve). The Gemma-4 separate-drafter contract is exercised in
|
|
72
|
+
// manifest.test.ts.
|
|
73
|
+
mtp: "embedded-draft-head",
|
|
50
74
|
files: {
|
|
51
75
|
text: [
|
|
52
76
|
{
|
|
@@ -58,12 +82,7 @@ function eliza1Manifest(overrides: {
|
|
|
58
82
|
voice: [{ path: voicePath, sha256: overrides.shaFor("voice") }],
|
|
59
83
|
asr: [{ path: asrPath, sha256: overrides.shaFor("asr") }],
|
|
60
84
|
vision: [{ path: visionPath, sha256: overrides.shaFor("vision") }],
|
|
61
|
-
mtp: [
|
|
62
|
-
{
|
|
63
|
-
path: drafterPath,
|
|
64
|
-
sha256: overrides.shaFor("drafter"),
|
|
65
|
-
},
|
|
66
|
-
],
|
|
85
|
+
mtp: [],
|
|
67
86
|
cache: [
|
|
68
87
|
{
|
|
69
88
|
path: cachePath,
|
|
@@ -167,6 +186,14 @@ function sha256(content: string): string {
|
|
|
167
186
|
return createHash("sha256").update(content).digest("hex");
|
|
168
187
|
}
|
|
169
188
|
|
|
189
|
+
function readOwnedRegistryModels(): InstalledModel[] {
|
|
190
|
+
if (!fs.existsSync(registryPath())) return [];
|
|
191
|
+
const parsed = JSON.parse(fs.readFileSync(registryPath(), "utf8")) as {
|
|
192
|
+
models?: InstalledModel[];
|
|
193
|
+
};
|
|
194
|
+
return parsed.models ?? [];
|
|
195
|
+
}
|
|
196
|
+
|
|
170
197
|
function installFetchFixture(files: Map<string, string>): void {
|
|
171
198
|
globalThis.fetch = vi.fn(async (url: string | URL | Request) => {
|
|
172
199
|
const href =
|
|
@@ -243,7 +270,7 @@ describe("local inference downloader status", () => {
|
|
|
243
270
|
expect(job?.error).toBe("network reset");
|
|
244
271
|
});
|
|
245
272
|
|
|
246
|
-
it("installs Eliza-1 manifest bundles with
|
|
273
|
+
it("installs Eliza-1 manifest bundles with embedded-draft-head MTP metadata", async () => {
|
|
247
274
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
|
|
248
275
|
process.env.ELIZA_STATE_DIR = root;
|
|
249
276
|
const model = findCatalogModel("eliza-1-2b");
|
|
@@ -256,14 +283,12 @@ describe("local inference downloader status", () => {
|
|
|
256
283
|
const voice = "GGUF voice model";
|
|
257
284
|
const asr = "GGUF ASR model";
|
|
258
285
|
const vad = "VAD model";
|
|
259
|
-
const drafter = "GGUF drafter model";
|
|
260
286
|
const cache = "voice preset";
|
|
261
287
|
const vision = "vision projector";
|
|
262
288
|
const textPath = "text/eliza-1-2b-128k.gguf";
|
|
263
289
|
const voicePath = "tts/voice.gguf";
|
|
264
290
|
const asrPath = "asr/asr.gguf";
|
|
265
291
|
const vadPath = "vad/eliza-1-vad.onnx";
|
|
266
|
-
const drafterPath = "mtp/drafter-2b.gguf";
|
|
267
292
|
const cachePath = "cache/voice-preset-default.bin";
|
|
268
293
|
const visionPath = "vision/mmproj-2b.gguf";
|
|
269
294
|
const manifest = JSON.stringify({
|
|
@@ -276,10 +301,10 @@ describe("local inference downloader status", () => {
|
|
|
276
301
|
voice: { base: "eliza-1-voice", license: "test" },
|
|
277
302
|
asr: { base: "eliza-1-asr", license: "test" },
|
|
278
303
|
vad: { base: "eliza-1-vad", license: "test" },
|
|
279
|
-
drafter: { base: "eliza-1-drafter", license: "test" },
|
|
280
304
|
vision: { base: "eliza-1-vision", license: "test" },
|
|
281
305
|
},
|
|
282
306
|
defaultEligible: true,
|
|
307
|
+
mtp: "embedded-draft-head",
|
|
283
308
|
files: {
|
|
284
309
|
text: [
|
|
285
310
|
{
|
|
@@ -291,12 +316,7 @@ describe("local inference downloader status", () => {
|
|
|
291
316
|
voice: [{ path: voicePath, sha256: sha256(voice) }],
|
|
292
317
|
asr: [{ path: asrPath, sha256: sha256(asr) }],
|
|
293
318
|
vision: [{ path: visionPath, sha256: sha256(vision) }],
|
|
294
|
-
mtp: [
|
|
295
|
-
{
|
|
296
|
-
path: drafterPath,
|
|
297
|
-
sha256: sha256(drafter),
|
|
298
|
-
},
|
|
299
|
-
],
|
|
319
|
+
mtp: [],
|
|
300
320
|
cache: [
|
|
301
321
|
{
|
|
302
322
|
path: cachePath,
|
|
@@ -354,7 +374,6 @@ describe("local inference downloader status", () => {
|
|
|
354
374
|
[bundleRemotePath(model, voicePath), voice],
|
|
355
375
|
[bundleRemotePath(model, asrPath), asr],
|
|
356
376
|
[bundleRemotePath(model, vadPath), vad],
|
|
357
|
-
[bundleRemotePath(model, drafterPath), drafter],
|
|
358
377
|
[bundleRemotePath(model, cachePath), cache],
|
|
359
378
|
[bundleRemotePath(model, visionPath), vision],
|
|
360
379
|
]),
|
|
@@ -366,7 +385,7 @@ describe("local inference downloader status", () => {
|
|
|
366
385
|
const completed = waitForTerminal(downloader, model.id);
|
|
367
386
|
await downloader.start(model);
|
|
368
387
|
const job = await completed;
|
|
369
|
-
const installed =
|
|
388
|
+
const installed = readOwnedRegistryModels();
|
|
370
389
|
const main = installed.find((entry) => entry.id === model.id);
|
|
371
390
|
expect(main).toBeDefined();
|
|
372
391
|
const bundleRoot = main?.bundleRoot;
|
|
@@ -389,7 +408,6 @@ describe("local inference downloader status", () => {
|
|
|
389
408
|
expect(fs.existsSync(path.join(bundleRoot, asrPath))).toBe(true);
|
|
390
409
|
expect(fs.existsSync(path.join(bundleRoot, vadPath))).toBe(true);
|
|
391
410
|
expect(fs.existsSync(path.join(bundleRoot, visionPath))).toBe(true);
|
|
392
|
-
expect(fs.existsSync(path.join(bundleRoot, drafterPath))).toBe(true);
|
|
393
411
|
expect(installed.some((entry) => entry.id.endsWith("-drafter"))).toBe(
|
|
394
412
|
false,
|
|
395
413
|
);
|
|
@@ -406,7 +424,6 @@ describe("local inference downloader status", () => {
|
|
|
406
424
|
const fetchSpy = installManifestOnlyFetch("tampered manifest");
|
|
407
425
|
const pinnedModel = {
|
|
408
426
|
...model,
|
|
409
|
-
id: "eliza-1-2b-manifest-hash-test",
|
|
410
427
|
companionModelIds: [],
|
|
411
428
|
bundleManifestSha256: sha256("expected manifest"),
|
|
412
429
|
};
|
|
@@ -415,7 +432,7 @@ describe("local inference downloader status", () => {
|
|
|
415
432
|
});
|
|
416
433
|
const failed = new Promise<DownloadJob>((resolve) => {
|
|
417
434
|
const unsub = downloader.subscribe((event) => {
|
|
418
|
-
if (event.job.modelId ===
|
|
435
|
+
if (event.job.modelId === model.id && event.type === "failed") {
|
|
419
436
|
unsub();
|
|
420
437
|
resolve(event.job);
|
|
421
438
|
}
|
|
@@ -431,12 +448,12 @@ describe("local inference downloader status", () => {
|
|
|
431
448
|
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
432
449
|
});
|
|
433
450
|
|
|
434
|
-
it("
|
|
451
|
+
it("rejects custom CatalogModel specs before starting a download", async () => {
|
|
435
452
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
|
|
436
453
|
process.env.ELIZA_STATE_DIR = root;
|
|
437
454
|
const baseModel = findCatalogModel("eliza-1-2b");
|
|
438
455
|
if (!baseModel) throw new Error("missing test catalog model");
|
|
439
|
-
const
|
|
456
|
+
const customSpec: CatalogModel = {
|
|
440
457
|
...baseModel,
|
|
441
458
|
id: "hf:test/partial::model.gguf",
|
|
442
459
|
displayName: "Partial Test Model",
|
|
@@ -447,28 +464,13 @@ describe("local inference downloader status", () => {
|
|
|
447
464
|
runtimeRole: undefined,
|
|
448
465
|
};
|
|
449
466
|
|
|
450
|
-
const body = "complete model";
|
|
451
|
-
installFetchFixture(
|
|
452
|
-
new Map([[bundleRemotePath(model, model.ggufFile), body]]),
|
|
453
|
-
);
|
|
454
|
-
|
|
455
|
-
const downloadsDir = path.join(root, "local-inference", "downloads");
|
|
456
|
-
fs.mkdirSync(downloadsDir, { recursive: true });
|
|
457
|
-
fs.writeFileSync(
|
|
458
|
-
path.join(downloadsDir, "hf_test_partial__model.gguf.part"),
|
|
459
|
-
"stale partial",
|
|
460
|
-
);
|
|
461
|
-
|
|
462
467
|
const downloader = new Downloader();
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
468
|
+
await expect(downloader.start(customSpec)).rejects.toThrow(
|
|
469
|
+
/Custom model downloads are disabled/i,
|
|
470
|
+
);
|
|
466
471
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
expect(entry).toBeDefined();
|
|
470
|
-
if (!entry) throw new Error("missing installed model");
|
|
471
|
-
expect(fs.readFileSync(entry.path, "utf8")).toBe(body);
|
|
472
|
+
expect(fs.existsSync(registryPath())).toBe(false);
|
|
473
|
+
expect(downloader.snapshot()).toEqual([]);
|
|
472
474
|
});
|
|
473
475
|
|
|
474
476
|
it("aborts before any weight byte when no verified backend overlaps the device", async () => {
|
|
@@ -492,7 +494,6 @@ describe("local inference downloader status", () => {
|
|
|
492
494
|
|
|
493
495
|
const textPath = model.ggufFile;
|
|
494
496
|
const voicePath = "tts/voice.gguf";
|
|
495
|
-
const drafterPath = "mtp/drafter-27b-256k.gguf";
|
|
496
497
|
const cachePath = "cache/voice-preset-default.bin";
|
|
497
498
|
const visionPath = "vision/mmproj-27b-256k.gguf";
|
|
498
499
|
const manifest = JSON.stringify({
|
|
@@ -503,7 +504,6 @@ describe("local inference downloader status", () => {
|
|
|
503
504
|
lineage: {
|
|
504
505
|
text: { base: "eliza-1-text", license: "test" },
|
|
505
506
|
voice: { base: "eliza-1-voice", license: "test" },
|
|
506
|
-
drafter: { base: "eliza-1-drafter", license: "test" },
|
|
507
507
|
vision: { base: "eliza-1-vision", license: "test" },
|
|
508
508
|
},
|
|
509
509
|
defaultEligible: false,
|
|
@@ -518,7 +518,7 @@ describe("local inference downloader status", () => {
|
|
|
518
518
|
voice: [{ path: voicePath, sha256: sha256("v") }],
|
|
519
519
|
asr: [],
|
|
520
520
|
vision: [{ path: visionPath, sha256: sha256("vision") }],
|
|
521
|
-
mtp: [
|
|
521
|
+
mtp: [],
|
|
522
522
|
cache: [{ path: cachePath, sha256: sha256("c") }],
|
|
523
523
|
},
|
|
524
524
|
kernels: {
|
|
@@ -565,7 +565,7 @@ describe("local inference downloader status", () => {
|
|
|
565
565
|
([u]) => remotePathOf(u) !== bundleRemotePath(model, manifestFile),
|
|
566
566
|
);
|
|
567
567
|
expect(weightFetches).toHaveLength(0);
|
|
568
|
-
expect((
|
|
568
|
+
expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
|
|
569
569
|
false,
|
|
570
570
|
);
|
|
571
571
|
});
|
|
@@ -597,7 +597,7 @@ describe("local inference downloader status", () => {
|
|
|
597
597
|
await downloader.start(model.id);
|
|
598
598
|
const job = await failed;
|
|
599
599
|
expect(job.error).toMatch(/needs at least 999999 MB RAM/);
|
|
600
|
-
expect((
|
|
600
|
+
expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
|
|
601
601
|
false,
|
|
602
602
|
);
|
|
603
603
|
});
|
|
@@ -613,7 +613,6 @@ describe("local inference downloader status", () => {
|
|
|
613
613
|
voice: "GGUF voice",
|
|
614
614
|
asr: "GGUF asr",
|
|
615
615
|
vad: "VAD onnx",
|
|
616
|
-
drafter: "GGUF drafter",
|
|
617
616
|
cache: "voice preset",
|
|
618
617
|
vision: "vision projector",
|
|
619
618
|
} as const;
|
|
@@ -627,7 +626,6 @@ describe("local inference downloader status", () => {
|
|
|
627
626
|
[eliza1BundleRemotePath("tts/voice.gguf"), bytes.voice],
|
|
628
627
|
[eliza1BundleRemotePath("asr/asr.gguf"), bytes.asr],
|
|
629
628
|
[eliza1BundleRemotePath("vad/eliza-1-vad.onnx"), bytes.vad],
|
|
630
|
-
[eliza1BundleRemotePath("mtp/drafter-2b.gguf"), bytes.drafter],
|
|
631
629
|
[eliza1BundleRemotePath("cache/voice-preset-default.bin"), bytes.cache],
|
|
632
630
|
[eliza1BundleRemotePath("vision/mmproj-2b.gguf"), bytes.vision],
|
|
633
631
|
]),
|
|
@@ -662,7 +660,7 @@ describe("local inference downloader status", () => {
|
|
|
662
660
|
.normalize(verifyCalls[0]?.textGgufPath ?? "")
|
|
663
661
|
.endsWith(path.normalize("text/eliza-1-2b-128k.gguf")),
|
|
664
662
|
).toBe(true);
|
|
665
|
-
const installed =
|
|
663
|
+
const installed = readOwnedRegistryModels();
|
|
666
664
|
const main = installed.find((m) => m.id === model.id);
|
|
667
665
|
expect(main?.bundleVerifiedAt).toBeTruthy();
|
|
668
666
|
expect(verifyCalls[0]?.bundleRoot).toBe(main?.bundleRoot);
|
|
@@ -680,7 +678,6 @@ describe("local inference downloader status", () => {
|
|
|
680
678
|
voice: "GGUF voice",
|
|
681
679
|
asr: "GGUF asr",
|
|
682
680
|
vad: "VAD onnx",
|
|
683
|
-
drafter: "GGUF drafter",
|
|
684
681
|
cache: "voice preset",
|
|
685
682
|
vision: "vision projector",
|
|
686
683
|
} as const;
|
|
@@ -694,7 +691,6 @@ describe("local inference downloader status", () => {
|
|
|
694
691
|
[eliza1BundleRemotePath("tts/voice.gguf"), bytes.voice],
|
|
695
692
|
[eliza1BundleRemotePath("asr/asr.gguf"), bytes.asr],
|
|
696
693
|
[eliza1BundleRemotePath("vad/eliza-1-vad.onnx"), bytes.vad],
|
|
697
|
-
[eliza1BundleRemotePath("mtp/drafter-2b.gguf"), bytes.drafter],
|
|
698
694
|
[eliza1BundleRemotePath("cache/voice-preset-default.bin"), bytes.cache],
|
|
699
695
|
[eliza1BundleRemotePath("vision/mmproj-2b.gguf"), bytes.vision],
|
|
700
696
|
]),
|
|
@@ -717,7 +713,7 @@ describe("local inference downloader status", () => {
|
|
|
717
713
|
await downloader.start(model.id);
|
|
718
714
|
const job = await failed;
|
|
719
715
|
expect(job.error).toMatch(/barge-in cancel test failed/);
|
|
720
|
-
expect((
|
|
716
|
+
expect(readOwnedRegistryModels().some((m) => m.id === model.id)).toBe(
|
|
721
717
|
false,
|
|
722
718
|
);
|
|
723
719
|
});
|
|
@@ -744,4 +740,149 @@ describe("local inference downloader status", () => {
|
|
|
744
740
|
).toHaveLength(1);
|
|
745
741
|
downloader.cancel(model.id);
|
|
746
742
|
});
|
|
743
|
+
|
|
744
|
+
it("rejects a non-GGUF (HTML) body on the single-file path", async () => {
|
|
745
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
|
|
746
|
+
process.env.ELIZA_STATE_DIR = root;
|
|
747
|
+
const base = findCatalogModel("eliza-1-2b");
|
|
748
|
+
if (!base) throw new Error("missing test catalog model");
|
|
749
|
+
// Decorate a default-eligible id as a single-file (non-bundle) download so
|
|
750
|
+
// it routes through runJob's single-file path.
|
|
751
|
+
const singleFileSpec: CatalogModel = {
|
|
752
|
+
...base,
|
|
753
|
+
hfRepo: "test/single-file",
|
|
754
|
+
ggufFile: "model.gguf",
|
|
755
|
+
sizeGb: 0.000001,
|
|
756
|
+
bundleManifestFile: undefined,
|
|
757
|
+
bundleManifestSha256: undefined,
|
|
758
|
+
companionModelIds: [],
|
|
759
|
+
runtimeRole: undefined,
|
|
760
|
+
};
|
|
761
|
+
|
|
762
|
+
// A gated repo can answer HTTP 200 with an HTML login page.
|
|
763
|
+
globalThis.fetch = vi.fn(
|
|
764
|
+
async () =>
|
|
765
|
+
new Response("<html><body>Sign in to HuggingFace</body></html>", {
|
|
766
|
+
status: 200,
|
|
767
|
+
headers: { "content-type": "text/html" },
|
|
768
|
+
}),
|
|
769
|
+
) as unknown as typeof fetch;
|
|
770
|
+
|
|
771
|
+
const downloader = new Downloader({
|
|
772
|
+
probeDeviceCaps: async () => cpuOnlyCaps,
|
|
773
|
+
probeHardware: async () => fakeProbe(100),
|
|
774
|
+
});
|
|
775
|
+
const failed = new Promise<DownloadJob>((resolve) => {
|
|
776
|
+
const unsub = downloader.subscribe((event) => {
|
|
777
|
+
if (event.job.modelId === base.id && event.type === "failed") {
|
|
778
|
+
unsub();
|
|
779
|
+
resolve(event.job);
|
|
780
|
+
}
|
|
781
|
+
});
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
await downloader.start(singleFileSpec);
|
|
785
|
+
const job = await failed;
|
|
786
|
+
|
|
787
|
+
expect(job.error).toContain("not a valid GGUF");
|
|
788
|
+
// The HTML body must never be registered or left on disk as a model.
|
|
789
|
+
const finalPath = path.join(
|
|
790
|
+
root,
|
|
791
|
+
"local-inference",
|
|
792
|
+
"models",
|
|
793
|
+
"eliza-1-2b.gguf",
|
|
794
|
+
);
|
|
795
|
+
// (registry path lives elsewhere; the rejected file is removed regardless)
|
|
796
|
+
expect(fs.existsSync(finalPath)).toBe(false);
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
it("forwards the Eliza Cloud bearer on a single-file download when cloud-linked", async () => {
|
|
800
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
|
|
801
|
+
process.env.ELIZA_STATE_DIR = root;
|
|
802
|
+
// The product never holds a local HF token. When cloud-linked, all HF
|
|
803
|
+
// resolve traffic is routed through the cloud HF proxy and authenticated
|
|
804
|
+
// with the Eliza Cloud API key (the proxy attaches the cloud-side HF_TOKEN).
|
|
805
|
+
const savedKey = process.env.ELIZAOS_CLOUD_API_KEY;
|
|
806
|
+
process.env.ELIZAOS_CLOUD_API_KEY = "secret-token";
|
|
807
|
+
|
|
808
|
+
const base = findCatalogModel("eliza-1-2b");
|
|
809
|
+
if (!base) throw new Error("missing test catalog model");
|
|
810
|
+
const singleFileSpec: CatalogModel = {
|
|
811
|
+
...base,
|
|
812
|
+
hfRepo: "test/single-file",
|
|
813
|
+
ggufFile: "model.gguf",
|
|
814
|
+
sizeGb: 0.000001,
|
|
815
|
+
bundleManifestFile: undefined,
|
|
816
|
+
bundleManifestSha256: undefined,
|
|
817
|
+
companionModelIds: [],
|
|
818
|
+
runtimeRole: undefined,
|
|
819
|
+
};
|
|
820
|
+
|
|
821
|
+
const ggufBody = Buffer.concat([Buffer.from("GGUF"), Buffer.alloc(60, 0)]);
|
|
822
|
+
let capturedAuth: string | undefined;
|
|
823
|
+
globalThis.fetch = vi.fn(
|
|
824
|
+
async (_url: string | URL | Request, init?: RequestInit) => {
|
|
825
|
+
const headers = (init?.headers ?? {}) as Record<string, string>;
|
|
826
|
+
capturedAuth = headers.authorization;
|
|
827
|
+
return new Response(ggufBody, {
|
|
828
|
+
status: 200,
|
|
829
|
+
headers: { "content-length": String(ggufBody.length) },
|
|
830
|
+
});
|
|
831
|
+
},
|
|
832
|
+
) as unknown as typeof fetch;
|
|
833
|
+
|
|
834
|
+
const downloader = new Downloader({
|
|
835
|
+
probeDeviceCaps: async () => cpuOnlyCaps,
|
|
836
|
+
probeHardware: async () => fakeProbe(100),
|
|
837
|
+
});
|
|
838
|
+
const completed = new Promise<DownloadJob>((resolve) => {
|
|
839
|
+
const unsub = downloader.subscribe((event) => {
|
|
840
|
+
if (event.job.modelId === base.id && event.type === "completed") {
|
|
841
|
+
unsub();
|
|
842
|
+
resolve(event.job);
|
|
843
|
+
}
|
|
844
|
+
});
|
|
845
|
+
});
|
|
846
|
+
|
|
847
|
+
try {
|
|
848
|
+
await downloader.start(singleFileSpec);
|
|
849
|
+
await completed;
|
|
850
|
+
expect(capturedAuth).toBe("Bearer secret-token");
|
|
851
|
+
} finally {
|
|
852
|
+
if (savedKey === undefined) delete process.env.ELIZAOS_CLOUD_API_KEY;
|
|
853
|
+
else process.env.ELIZAOS_CLOUD_API_KEY = savedKey;
|
|
854
|
+
}
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
it("blocks a download that does not fit on the models volume", async () => {
|
|
858
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-download-test-"));
|
|
859
|
+
process.env.ELIZA_STATE_DIR = root;
|
|
860
|
+
const model = findCatalogModel("eliza-1-2b");
|
|
861
|
+
if (!model) throw new Error("missing test catalog model");
|
|
862
|
+
|
|
863
|
+
// Fetch must never be called: the preflight fails before any byte.
|
|
864
|
+
const fetchSpy = vi.fn(async () => {
|
|
865
|
+
throw new Error("network must not be touched when disk is full");
|
|
866
|
+
});
|
|
867
|
+
globalThis.fetch = fetchSpy as unknown as typeof fetch;
|
|
868
|
+
|
|
869
|
+
const downloader = new Downloader({
|
|
870
|
+
probeDeviceCaps: async () => cpuOnlyCaps,
|
|
871
|
+
probeHardware: async () => fakeProbe(0.05),
|
|
872
|
+
});
|
|
873
|
+
const failed = new Promise<DownloadJob>((resolve) => {
|
|
874
|
+
const unsub = downloader.subscribe((event) => {
|
|
875
|
+
if (event.job.modelId === model.id && event.type === "failed") {
|
|
876
|
+
unsub();
|
|
877
|
+
resolve(event.job);
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
await downloader.start(model.id);
|
|
883
|
+
const job = await failed;
|
|
884
|
+
|
|
885
|
+
expect(job.error).toContain("Not enough disk space");
|
|
886
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
887
|
+
});
|
|
747
888
|
});
|