@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.11-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/package.json +81 -15
- package/src/actions/generate-media.d.ts +59 -0
- package/src/actions/generate-media.d.ts.map +1 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.d.ts +23 -0
- package/src/actions/identify-speaker.d.ts.map +1 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +807 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.d.ts +7 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +54 -0
- package/src/local-inference-routes.d.ts +38 -0
- package/src/local-inference-routes.d.ts.map +1 -0
- package/src/local-inference-routes.test.ts +344 -0
- package/src/local-inference-routes.ts +1543 -0
- package/src/provider.d.ts +21 -0
- package/src/provider.d.ts.map +1 -0
- package/src/provider.ts +1171 -0
- package/src/routes/compat-helpers.d.ts +18 -0
- package/src/routes/compat-helpers.d.ts.map +1 -0
- package/src/routes/compat-helpers.ts +274 -0
- package/src/routes/family-member-route.d.ts +62 -0
- package/src/routes/family-member-route.d.ts.map +1 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.d.ts +19 -0
- package/src/routes/index.d.ts.map +1 -0
- package/src/routes/index.ts +60 -0
- package/src/routes/live-diarization-route.d.ts +26 -0
- package/src/routes/live-diarization-route.d.ts.map +1 -0
- package/src/routes/live-diarization-route.test.ts +213 -0
- package/src/routes/live-diarization-route.ts +122 -0
- package/src/routes/local-inference-asr-route.d.ts +4 -0
- package/src/routes/local-inference-asr-route.d.ts.map +1 -0
- package/src/routes/local-inference-asr-route.test.ts +190 -0
- package/src/routes/local-inference-asr-route.ts +213 -0
- package/src/routes/local-inference-compat-routes.d.ts +16 -0
- package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/src/routes/local-inference-compat-routes.test.ts +423 -0
- package/src/routes/local-inference-compat-routes.ts +782 -0
- package/src/routes/local-inference-tts-route.d.ts +7 -0
- package/src/routes/local-inference-tts-route.d.ts.map +1 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/voice-first-run-routes.d.ts +62 -0
- package/src/routes/voice-first-run-routes.d.ts.map +1 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.d.ts +62 -0
- package/src/routes/voice-models-routes.d.ts.map +1 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.d.ts +52 -0
- package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.d.ts +77 -0
- package/src/runtime/embedding-manager-support.d.ts.map +1 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.d.ts +16 -0
- package/src/runtime/embedding-presets.d.ts.map +1 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.d.ts +14 -0
- package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.d.ts +53 -0
- package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
- package/src/runtime/ensure-local-inference-handler.ts +1398 -0
- package/src/runtime/index.d.ts +14 -0
- package/src/runtime/index.d.ts.map +1 -0
- package/src/runtime/index.ts +27 -0
- package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
- package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
- package/src/runtime/mobile-local-inference-gate.ts +44 -0
- package/src/runtime/voice-entity-binding.d.ts +103 -0
- package/src/runtime/voice-entity-binding.d.ts.map +1 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
- package/src/runtime/voice-entity-binding.ts +328 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.d.ts +282 -0
- package/src/services/active-model.d.ts.map +1 -0
- package/src/services/active-model.ts +1213 -0
- package/src/services/asr/errors.d.ts +21 -0
- package/src/services/asr/errors.d.ts.map +1 -0
- package/src/services/asr/errors.ts +50 -0
- package/src/services/asr/hash.d.ts +28 -0
- package/src/services/asr/hash.d.ts.map +1 -0
- package/src/services/asr/hash.ts +49 -0
- package/src/services/asr/index.d.ts +76 -0
- package/src/services/asr/index.d.ts.map +1 -0
- package/src/services/asr/index.ts +178 -0
- package/src/services/asr/types.d.ts +91 -0
- package/src/services/asr/types.d.ts.map +1 -0
- package/src/services/asr/types.ts +95 -0
- package/src/services/assignments.d.ts +71 -0
- package/src/services/assignments.d.ts.map +1 -0
- package/src/services/assignments.test.ts +80 -0
- package/src/services/assignments.ts +230 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.d.ts +346 -0
- package/src/services/backend.d.ts.map +1 -0
- package/src/services/backend.ts +612 -0
- package/src/services/bundled-models.d.ts +34 -0
- package/src/services/bundled-models.d.ts.map +1 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.d.ts +206 -0
- package/src/services/cache-bridge.d.ts.map +1 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.d.ts +10 -0
- package/src/services/catalog.d.ts.map +1 -0
- package/src/services/catalog.test.ts +240 -0
- package/src/services/catalog.ts +27 -0
- package/src/services/checkpoint-client.d.ts +109 -0
- package/src/services/checkpoint-client.d.ts.map +1 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.d.ts +102 -0
- package/src/services/cloud-fallback.d.ts.map +1 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/conversation-registry.d.ts +142 -0
- package/src/services/conversation-registry.d.ts.map +1 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts +92 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +333 -0
- package/src/services/device-bridge.d.ts +188 -0
- package/src/services/device-bridge.d.ts.map +1 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.d.ts +149 -0
- package/src/services/device-resource-metrics.d.ts.map +1 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.d.ts +115 -0
- package/src/services/device-tier.d.ts.map +1 -0
- package/src/services/device-tier.test.ts +371 -0
- package/src/services/device-tier.ts +410 -0
- package/src/services/downloader.d.ts +82 -0
- package/src/services/downloader.d.ts.map +1 -0
- package/src/services/downloader.test.ts +724 -0
- package/src/services/downloader.ts +899 -0
- package/src/services/engine-direct-bundle.test.ts +58 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.d.ts +534 -0
- package/src/services/engine.d.ts.map +1 -0
- package/src/services/engine.ts +1891 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.d.ts +17 -0
- package/src/services/external-scanner.d.ts.map +1 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +442 -0
- package/src/services/ffi-streaming-backend.d.ts +180 -0
- package/src/services/ffi-streaming-backend.d.ts.map +1 -0
- package/src/services/ffi-streaming-backend.ts +382 -0
- package/src/services/ffi-streaming-runner.d.ts +122 -0
- package/src/services/ffi-streaming-runner.d.ts.map +1 -0
- package/src/services/ffi-streaming-runner.test.ts +60 -0
- package/src/services/ffi-streaming-runner.ts +354 -0
- package/src/services/ffi-unload-ordering.test.ts +162 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.d.ts +72 -0
- package/src/services/handler-registry.d.ts.map +1 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.d.ts +63 -0
- package/src/services/hardware.d.ts.map +1 -0
- package/src/services/hardware.test.ts +183 -0
- package/src/services/hardware.ts +404 -0
- package/src/services/hf-search.d.ts +26 -0
- package/src/services/hf-search.d.ts.map +1 -0
- package/src/services/hf-search.test.ts +69 -0
- package/src/services/hf-search.ts +420 -0
- package/src/services/image-description-runtime.d.ts +14 -0
- package/src/services/image-description-runtime.d.ts.map +1 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.d.ts +118 -0
- package/src/services/imagegen/backend-selector.d.ts.map +1 -0
- package/src/services/imagegen/backend-selector.ts +281 -0
- package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.d.ts +16 -0
- package/src/services/imagegen/errors.d.ts.map +1 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.d.ts +58 -0
- package/src/services/imagegen/index.d.ts.map +1 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.d.ts +74 -0
- package/src/services/imagegen/mflux.d.ts.map +1 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.d.ts +180 -0
- package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/src/services/imagegen/sd-cpp.ts +718 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.d.ts +181 -0
- package/src/services/imagegen/types.d.ts.map +1 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.d.ts +30 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.ts +225 -0
- package/src/services/inference-capabilities.d.ts +132 -0
- package/src/services/inference-capabilities.d.ts.map +1 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.d.ts +59 -0
- package/src/services/inference-telemetry.d.ts.map +1 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.d.ts +189 -0
- package/src/services/kv-spill.d.ts.map +1 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +356 -0
- package/src/services/latency-trace.d.ts +346 -0
- package/src/services/latency-trace.d.ts.map +1 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- package/src/services/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.d.ts +96 -0
- package/src/services/llm-streaming-binding.d.ts.map +1 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.d.ts +82 -0
- package/src/services/load-args.d.ts.map +1 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
- package/src/services/manifest/index.d.ts +4 -0
- package/src/services/manifest/index.d.ts.map +1 -0
- package/src/services/manifest/index.ts +66 -0
- package/src/services/manifest/manifest.test.ts +693 -0
- package/src/services/manifest/schema.d.ts +715 -0
- package/src/services/manifest/schema.d.ts.map +1 -0
- package/src/services/manifest/schema.ts +655 -0
- package/src/services/manifest/types.d.ts +30 -0
- package/src/services/manifest/types.d.ts.map +1 -0
- package/src/services/manifest/types.ts +55 -0
- package/src/services/manifest/validator.d.ts +66 -0
- package/src/services/manifest/validator.d.ts.map +1 -0
- package/src/services/manifest/validator.ts +569 -0
- package/src/services/memory-arbiter.d.ts +343 -0
- package/src/services/memory-arbiter.d.ts.map +1 -0
- package/src/services/memory-arbiter.test.ts +419 -0
- package/src/services/memory-arbiter.ts +1000 -0
- package/src/services/memory-monitor.d.ts +119 -0
- package/src/services/memory-monitor.d.ts.map +1 -0
- package/src/services/memory-monitor.test.ts +208 -0
- package/src/services/memory-monitor.ts +296 -0
- package/src/services/memory-pressure.d.ts +127 -0
- package/src/services/memory-pressure.d.ts.map +1 -0
- package/src/services/memory-pressure.ts +413 -0
- package/src/services/mtp-doctor.d.ts +13 -0
- package/src/services/mtp-doctor.d.ts.map +1 -0
- package/src/services/mtp-doctor.ts +78 -0
- package/src/services/network-policy.d.ts +127 -0
- package/src/services/network-policy.d.ts.map +1 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.d.ts +6 -0
- package/src/services/paths.d.ts.map +1 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.d.ts +124 -0
- package/src/services/planner-skeleton.d.ts.map +1 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.d.ts +38 -0
- package/src/services/providers.d.ts.map +1 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +163 -0
- package/src/services/ram-budget.d.ts +110 -0
- package/src/services/ram-budget.d.ts.map +1 -0
- package/src/services/ram-budget.ts +0 -0
- package/src/services/readiness.d.ts +9 -0
- package/src/services/readiness.d.ts.map +1 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.d.ts +111 -0
- package/src/services/recommendation.d.ts.map +1 -0
- package/src/services/recommendation.ts +672 -0
- package/src/services/registry.d.ts +35 -0
- package/src/services/registry.d.ts.map +1 -0
- package/src/services/registry.ts +151 -0
- package/src/services/router-handler.d.ts +92 -0
- package/src/services/router-handler.d.ts.map +1 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +376 -0
- package/src/services/routing-policy.d.ts +55 -0
- package/src/services/routing-policy.d.ts.map +1 -0
- package/src/services/routing-policy.ts +228 -0
- package/src/services/routing-preferences.d.ts +8 -0
- package/src/services/routing-preferences.d.ts.map +1 -0
- package/src/services/routing-preferences.ts +15 -0
- package/src/services/runtime-target.d.ts +98 -0
- package/src/services/runtime-target.d.ts.map +1 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.d.ts +128 -0
- package/src/services/service.d.ts.map +1 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +735 -0
- package/src/services/session-pool.d.ts +72 -0
- package/src/services/session-pool.d.ts.map +1 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.d.ts +23 -0
- package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.d.ts +311 -0
- package/src/services/structured-output.d.ts.map +1 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/tts/errors.ts +46 -0
- package/src/services/tts/index.ts +214 -0
- package/src/services/tts/tts-audio-cache.ts +235 -0
- package/src/services/tts/types.ts +157 -0
- package/src/services/types.d.ts +19 -0
- package/src/services/types.d.ts.map +1 -0
- package/src/services/types.ts +55 -0
- package/src/services/verify-on-device.d.ts +34 -0
- package/src/services/verify-on-device.d.ts.map +1 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.d.ts +8 -0
- package/src/services/verify.d.ts.map +1 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.d.ts +115 -0
- package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.d.ts +99 -0
- package/src/services/vision/capacitor-llama.d.ts.map +1 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.d.ts +47 -0
- package/src/services/vision/cloud-fallback.d.ts.map +1 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.d.ts +71 -0
- package/src/services/vision/hash.d.ts.map +1 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.d.ts +95 -0
- package/src/services/vision/index.d.ts.map +1 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.d.ts +73 -0
- package/src/services/vision/llama-server.d.ts.map +1 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.d.ts +153 -0
- package/src/services/vision/types.d.ts.map +1 -0
- package/src/services/vision/types.ts +154 -0
- package/src/services/vision/vast-fallback.d.ts +18 -0
- package/src/services/vision/vast-fallback.d.ts.map +1 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.d.ts +98 -0
- package/src/services/vision-embedding-cache.d.ts.map +1 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +88 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +92 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +197 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- package/src/services/voice/audio-frame-consumer.d.ts +212 -0
- package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/src/services/voice/audio-frame-consumer.test.ts +343 -0
- package/src/services/voice/audio-frame-consumer.ts +491 -0
- package/src/services/voice/barge-in.d.ts +112 -0
- package/src/services/voice/barge-in.d.ts.map +1 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +336 -0
- package/src/services/voice/cancellation-coordinator.d.ts +127 -0
- package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.d.ts +199 -0
- package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- package/src/services/voice/e2e-harness.test.ts +182 -0
- package/src/services/voice/e2e-harness.ts +743 -0
- package/src/services/voice/eager-context-builder.d.ts +170 -0
- package/src/services/voice/eager-context-builder.d.ts.map +1 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/eliza1-eot-scorer.ts +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.d.ts +133 -0
- package/src/services/voice/embedding.d.ts.map +1 -0
- package/src/services/voice/embedding.test.ts +148 -0
- package/src/services/voice/embedding.ts +244 -0
- package/src/services/voice/emotion-attribution.d.ts +68 -0
- package/src/services/voice/emotion-attribution.d.ts.map +1 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge.d.ts +746 -0
- package/src/services/voice/engine-bridge.d.ts.map +1 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2226 -0
- package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/src/services/voice/eot-classifier-ggml.ts +566 -0
- package/src/services/voice/eot-classifier.d.ts +214 -0
- package/src/services/voice/eot-classifier.d.ts.map +1 -0
- package/src/services/voice/eot-classifier.ts +533 -0
- package/src/services/voice/errors.d.ts +20 -0
- package/src/services/voice/errors.d.ts.map +1 -0
- package/src/services/voice/errors.ts +32 -0
- package/src/services/voice/expressive-tags.d.ts +158 -0
- package/src/services/voice/expressive-tags.d.ts.map +1 -0
- package/src/services/voice/expressive-tags.ts +405 -0
- package/src/services/voice/ffi-bindings.d.ts +636 -0
- package/src/services/voice/ffi-bindings.d.ts.map +1 -0
- package/src/services/voice/ffi-bindings.test.ts +671 -0
- package/src/services/voice/ffi-bindings.ts +3050 -0
- package/src/services/voice/first-line-cache.d.ts +181 -0
- package/src/services/voice/first-line-cache.d.ts.map +1 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.d.ts +51 -0
- package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/fused-eot-scorer.ts +135 -0
- package/src/services/voice/index.d.ts +91 -0
- package/src/services/voice/index.d.ts.map +1 -0
- package/src/services/voice/index.ts +481 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
- package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/src/services/voice/kokoro/runtime-selection.ts +237 -0
- package/src/services/voice/kokoro/types.d.ts +82 -0
- package/src/services/voice/kokoro/types.d.ts.map +1 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.d.ts +30 -0
- package/src/services/voice/kokoro/voices.d.ts.map +1 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.d.ts +135 -0
- package/src/services/voice/lifecycle.d.ts.map +1 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.d.ts +96 -0
- package/src/services/voice/live-diarization-session.d.ts.map +1 -0
- package/src/services/voice/live-diarization-session.ts +289 -0
- package/src/services/voice/mic-source.d.ts +136 -0
- package/src/services/voice/mic-source.d.ts.map +1 -0
- package/src/services/voice/mic-source.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- package/src/services/voice/optimistic-policy.d.ts +109 -0
- package/src/services/voice/optimistic-policy.d.ts.map +1 -0
- package/src/services/voice/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.d.ts +73 -0
- package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.d.ts +76 -0
- package/src/services/voice/phrase-cache.d.ts.map +1 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.d.ts +62 -0
- package/src/services/voice/phrase-chunker.d.ts.map +1 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.d.ts +151 -0
- package/src/services/voice/pipeline-impls.d.ts.map +1 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.d.ts +216 -0
- package/src/services/voice/pipeline.d.ts.map +1 -0
- package/src/services/voice/pipeline.ts +505 -0
- package/src/services/voice/prefill-client.d.ts +123 -0
- package/src/services/voice/prefill-client.d.ts.map +1 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.d.ts +248 -0
- package/src/services/voice/profile-store.d.ts.map +1 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/ring-buffer.d.ts +40 -0
- package/src/services/voice/ring-buffer.d.ts.map +1 -0
- package/src/services/voice/ring-buffer.ts +105 -0
- package/src/services/voice/rollback-queue.d.ts +24 -0
- package/src/services/voice/rollback-queue.d.ts.map +1 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/scheduler.d.ts +146 -0
- package/src/services/voice/scheduler.d.ts.map +1 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -0
- package/src/services/voice/shared-resources.d.ts +190 -0
- package/src/services/voice/shared-resources.d.ts.map +1 -0
- package/src/services/voice/shared-resources.ts +320 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.d.ts +75 -0
- package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.d.ts +37 -0
- package/src/services/voice/speaker/encoder.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.d.ts +83 -0
- package/src/services/voice/speaker-imprint.d.ts.map +1 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.d.ts +77 -0
- package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.d.ts +73 -0
- package/src/services/voice/system-audio-sink.d.ts.map +1 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.d.ts +244 -0
- package/src/services/voice/transcriber.d.ts.map +1 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/turn-controller.d.ts +183 -0
- package/src/services/voice/turn-controller.d.ts.map +1 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.d.ts +643 -0
- package/src/services/voice/types.d.ts.map +1 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.d.ts +282 -0
- package/src/services/voice/vad.d.ts.map +1 -0
- package/src/services/voice/vad.test.ts +480 -0
- package/src/services/voice/vad.ts +827 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.d.ts +241 -0
- package/src/services/voice/voice-budget.d.ts.map +1 -0
- package/src/services/voice/voice-budget.test.ts +420 -0
- package/src/services/voice/voice-budget.ts +656 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
- package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- package/src/services/voice/voice-preset-format.d.ts +158 -0
- package/src/services/voice/voice-preset-format.d.ts.map +1 -0
- package/src/services/voice/voice-preset-format.ts +700 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.d.ts +116 -0
- package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.d.ts +83 -0
- package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.ts +154 -0
- package/src/services/voice/voice-settings.d.ts +82 -0
- package/src/services/voice/voice-settings.d.ts.map +1 -0
- package/src/services/voice/voice-settings.ts +172 -0
- package/src/services/voice/voice-state-machine.d.ts +364 -0
- package/src/services/voice/voice-state-machine.d.ts.map +1 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +326 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.d.ts +101 -0
- package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/src/services/voice/wake-word-ggml.ts +320 -0
- package/src/services/voice/wake-word.d.ts +255 -0
- package/src/services/voice/wake-word.d.ts.map +1 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.d.ts +240 -0
- package/src/services/voice-model-updater.d.ts.map +1 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.d.ts +3 -0
- package/src/services/voice-prewarm.d.ts.map +1 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/dist/index.d.ts +0 -37
- package/dist/index.js +0 -1098
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
// Runtime validator and capability-check helpers for Eliza-1 manifests.
|
|
2
|
+
//
|
|
3
|
+
// Two layers of validation:
|
|
4
|
+
//
|
|
5
|
+
// 1. Schema validation (Zod) — shape + types + per-field invariants.
|
|
6
|
+
// 2. Contract validation (this file) — cross-field rules from
|
|
7
|
+
// packages/inference/AGENTS.md §3 + §6:
|
|
8
|
+
// - required-kernel set per tier is satisfied,
|
|
9
|
+
// - long-context bundles (ctx > 64k) require `turbo3_tcq`,
|
|
10
|
+
// - structural bundle invariants (voice-preset cache present, lineage
|
|
11
|
+
// ↔ files consistency, base-v1 provenance coverage),
|
|
12
|
+
// - and — for a *production* release only (`base-v1` / `finetuned-v2` /
|
|
13
|
+
// `final`, or any `defaultEligible: true` manifest) — every supported
|
|
14
|
+
// backend kernel-verified `pass` and every eval green. A
|
|
15
|
+
// candidate/staging release (`base-v1-candidate` / `local-standin` /
|
|
16
|
+
// `upload-candidate`) is publishable + installable on a device whose
|
|
17
|
+
// backend it verified, but is not held to the full bar; its
|
|
18
|
+
// `defaultEligible` must stay false.
|
|
19
|
+
//
|
|
20
|
+
// `defaultEligible: true` is the strongest claim a manifest can make. The
|
|
21
|
+
// validator REFUSES the combination of `defaultEligible: true` and any
|
|
22
|
+
// failing contract rule. This mirrors the publish-side gate in
|
|
23
|
+
// `packages/training/scripts/manifest/eliza1_manifest.py`.
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
Eliza1ManifestSchema,
|
|
27
|
+
EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD,
|
|
28
|
+
EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT,
|
|
29
|
+
EMOTION_CLASSIFIER_MELD_F1_THRESHOLD,
|
|
30
|
+
REQUIRED_KERNELS_BY_TIER,
|
|
31
|
+
SUPPORTED_BACKENDS_BY_TIER,
|
|
32
|
+
TURN_DETECTOR_F1_THRESHOLD,
|
|
33
|
+
TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT,
|
|
34
|
+
VOICE_PRESET_CACHE_PATH,
|
|
35
|
+
} from "./schema";
|
|
36
|
+
import type {
|
|
37
|
+
Eliza1Backend,
|
|
38
|
+
Eliza1DeviceCaps,
|
|
39
|
+
Eliza1Kernel,
|
|
40
|
+
Eliza1Manifest,
|
|
41
|
+
Eliza1Tier,
|
|
42
|
+
} from "./types";
|
|
43
|
+
|
|
44
|
+
export interface ValidationOk {
|
|
45
|
+
ok: true;
|
|
46
|
+
manifest: Eliza1Manifest;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ValidationErr {
|
|
50
|
+
ok: false;
|
|
51
|
+
errors: ReadonlyArray<string>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type ValidationResult = ValidationOk | ValidationErr;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Schema + contract validation. Returns a Result-shaped object so callers
|
|
58
|
+
* can inspect every error rather than catching the first thrown one.
|
|
59
|
+
*
|
|
60
|
+
* Throws nothing for invalid input — invalid manifests are reported via
|
|
61
|
+
* `{ ok: false, errors }`. Truly exceptional cases (non-object input)
|
|
62
|
+
* surface as Zod issues, not exceptions.
|
|
63
|
+
*/
|
|
64
|
+
export function validateManifest(input: unknown): ValidationResult {
|
|
65
|
+
const parsed = Eliza1ManifestSchema.safeParse(input);
|
|
66
|
+
if (!parsed.success) {
|
|
67
|
+
return {
|
|
68
|
+
ok: false,
|
|
69
|
+
errors: parsed.error.issues.map(
|
|
70
|
+
(i) => `${i.path.join(".") || "<root>"}: ${i.message}`,
|
|
71
|
+
),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const errors = collectContractErrors(parsed.data, {
|
|
76
|
+
allowVersionStaging: true,
|
|
77
|
+
});
|
|
78
|
+
if (errors.length > 0) {
|
|
79
|
+
return { ok: false, errors };
|
|
80
|
+
}
|
|
81
|
+
return { ok: true, manifest: parsed.data };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Throws on invalid input. Use this from boot paths where a structured
|
|
86
|
+
* error is already attached at the boundary. Internal use only — UI
|
|
87
|
+
* code should prefer `validateManifest`.
|
|
88
|
+
*/
|
|
89
|
+
export function parseManifestOrThrow(input: unknown): Eliza1Manifest {
|
|
90
|
+
const result = validateManifest(input);
|
|
91
|
+
if (result.ok === false) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Invalid Eliza-1 manifest:\n - ${result.errors.join("\n - ")}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return result.manifest;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* `canSetAsDefault` is the recommendation-engine gate. A manifest that
|
|
101
|
+
* passes this is allowed to fill an empty default slot for the device:
|
|
102
|
+
*
|
|
103
|
+
* - the manifest is contract-valid (every required kernel declared, every
|
|
104
|
+
* required eval green for a strict release, lineage/files consistent),
|
|
105
|
+
* - the device RAM meets the manifest's `ramBudgetMb.min` floor,
|
|
106
|
+
* - the device exposes at least one backend the manifest verified `pass`
|
|
107
|
+
* on out of the tier's supported set.
|
|
108
|
+
*
|
|
109
|
+
* A `defaultEligible: true` manifest is the strict release: every supported
|
|
110
|
+
* backend kernel-verified `pass`, every required eval green. A
|
|
111
|
+
* `defaultEligible: false` manifest with an explicit candidate/staging
|
|
112
|
+
* `releaseState` (`base-v1-candidate`, `local-standin`, `upload-candidate`)
|
|
113
|
+
* is still permitted to fill an empty default slot **when this device can
|
|
114
|
+
* run it** — the recommender prefers a strict release over a candidate when
|
|
115
|
+
* both are installed (see `isStrictReleaseManifest`). Version-only staging
|
|
116
|
+
* stamps such as `1.0.0-weights-staged.2` are accepted by the install parser
|
|
117
|
+
* so QA bundles can be materialized, but they do not get this auto-default
|
|
118
|
+
* relaxation unless the manifest also carries an explicit staging
|
|
119
|
+
* `releaseState`.
|
|
120
|
+
*
|
|
121
|
+
* The device-caps check rejects "this device has Vulkan only but the
|
|
122
|
+
* manifest only verified Metal/CUDA" — a manifest may be contract-valid
|
|
123
|
+
* but not runnable on this device.
|
|
124
|
+
*/
|
|
125
|
+
export function canSetAsDefault(
|
|
126
|
+
manifest: Eliza1Manifest,
|
|
127
|
+
device: Eliza1DeviceCaps,
|
|
128
|
+
): boolean {
|
|
129
|
+
if (
|
|
130
|
+
collectContractErrors(manifest, { allowVersionStaging: false }).length > 0
|
|
131
|
+
) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (manifest.ramBudgetMb.min > device.ramMb) return false;
|
|
135
|
+
|
|
136
|
+
// The device must expose at least one backend that the manifest verified
|
|
137
|
+
// pass on. Pre-check against the tier's supported set so we don't accept
|
|
138
|
+
// a tier-server bundle on a Mac via the cpu fallback alone.
|
|
139
|
+
const supported = new Set<Eliza1Backend>(
|
|
140
|
+
SUPPORTED_BACKENDS_BY_TIER[manifest.tier],
|
|
141
|
+
);
|
|
142
|
+
const overlapping = device.availableBackends.filter(
|
|
143
|
+
(b) =>
|
|
144
|
+
supported.has(b) &&
|
|
145
|
+
manifest.kernels.verifiedBackends[b].status === "pass",
|
|
146
|
+
);
|
|
147
|
+
return overlapping.length > 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Strict release identifier: a `defaultEligible: true` manifest. The
|
|
152
|
+
* recommender uses this to prefer a strict release over a candidate
|
|
153
|
+
* bundle when both are installed and contract-valid. Mirrors the
|
|
154
|
+
* publish-side `eliza1_gates.yaml` strict bar.
|
|
155
|
+
*/
|
|
156
|
+
export function isStrictReleaseManifest(manifest: Eliza1Manifest): boolean {
|
|
157
|
+
return manifest.defaultEligible === true;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Internal: contract rules from AGENTS.md §3 + §6
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
|
|
164
|
+
// Release states that make the full "production" claim: every supported
|
|
165
|
+
// backend kernel-verified `pass`, every eval green. `base-v1` / `finetuned-v2`
|
|
166
|
+
// / `final` are published releases; `defaultEligible: true` always implies it
|
|
167
|
+
// (it is the device auto-default). A manifest with no `provenance` block is
|
|
168
|
+
// treated as production too — that was the only behaviour before this guard,
|
|
169
|
+
// so back-compat holds. `base-v1-candidate` / `local-standin` /
|
|
170
|
+
// `upload-candidate` are publishable + installable on a device whose backend
|
|
171
|
+
// they *did* verify, but are not held to the full bar — their `defaultEligible`
|
|
172
|
+
// must stay false (the schema's `releaseChannel=base-v1 → defaultEligible:false`
|
|
173
|
+
// refinement already enforces that for the base-v1 channel; the validator now
|
|
174
|
+
// honours the release-state vocabulary instead of applying the auto-default
|
|
175
|
+
// bar to every manifest).
|
|
176
|
+
const STRICT_RELEASE_STATES: ReadonlySet<string> = new Set([
|
|
177
|
+
"base-v1",
|
|
178
|
+
"finetuned-v2",
|
|
179
|
+
"final",
|
|
180
|
+
]);
|
|
181
|
+
|
|
182
|
+
const VISION_TIERS: ReadonlySet<Eliza1Tier> = new Set([
|
|
183
|
+
"0_8b",
|
|
184
|
+
"2b",
|
|
185
|
+
"4b",
|
|
186
|
+
"9b",
|
|
187
|
+
"27b",
|
|
188
|
+
"27b-256k",
|
|
189
|
+
]);
|
|
190
|
+
|
|
191
|
+
const MTP_TIERS: ReadonlySet<Eliza1Tier> = new Set([
|
|
192
|
+
"0_8b",
|
|
193
|
+
"2b",
|
|
194
|
+
"4b",
|
|
195
|
+
"9b",
|
|
196
|
+
"27b",
|
|
197
|
+
"27b-256k",
|
|
198
|
+
]);
|
|
199
|
+
|
|
200
|
+
const MIN_TEXT_CONTEXT = 131072;
|
|
201
|
+
|
|
202
|
+
const STAGING_VERSION_TOKENS: ReadonlySet<string> = new Set([
|
|
203
|
+
"candidate",
|
|
204
|
+
"staged",
|
|
205
|
+
"dev",
|
|
206
|
+
"local",
|
|
207
|
+
]);
|
|
208
|
+
|
|
209
|
+
function isStagingManifestVersion(version: string): boolean {
|
|
210
|
+
const prerelease = version.match(
|
|
211
|
+
/^[0-9]+\.[0-9]+\.[0-9]+-([^+]+)(?:\+.*)?$/,
|
|
212
|
+
)?.[1];
|
|
213
|
+
if (!prerelease) return false;
|
|
214
|
+
return prerelease
|
|
215
|
+
.split(/[.-]/)
|
|
216
|
+
.some((token) => STAGING_VERSION_TOKENS.has(token.toLowerCase()));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function collectContractErrors(
|
|
220
|
+
m: Eliza1Manifest,
|
|
221
|
+
options: { allowVersionStaging?: boolean } = {},
|
|
222
|
+
): string[] {
|
|
223
|
+
const errors: string[] = [];
|
|
224
|
+
|
|
225
|
+
const releaseState = m.provenance?.releaseState;
|
|
226
|
+
const strictRelease =
|
|
227
|
+
m.defaultEligible === true ||
|
|
228
|
+
(releaseState === undefined &&
|
|
229
|
+
!(
|
|
230
|
+
options.allowVersionStaging === true &&
|
|
231
|
+
isStagingManifestVersion(m.version)
|
|
232
|
+
)) ||
|
|
233
|
+
(releaseState !== undefined && STRICT_RELEASE_STATES.has(releaseState));
|
|
234
|
+
|
|
235
|
+
// Required-kernel coverage.
|
|
236
|
+
const declaredRequired = new Set<Eliza1Kernel>(m.kernels.required);
|
|
237
|
+
const tierRequired = REQUIRED_KERNELS_BY_TIER[m.tier];
|
|
238
|
+
for (const k of tierRequired) {
|
|
239
|
+
if (!declaredRequired.has(k)) {
|
|
240
|
+
errors.push(
|
|
241
|
+
`kernels.required: missing required kernel for tier ${m.tier}: ${k}`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
for (const [i, entry] of m.files.text.entries()) {
|
|
247
|
+
if (typeof entry.ctx !== "number") {
|
|
248
|
+
errors.push(`files.text[${i}].ctx: required for text GGUFs`);
|
|
249
|
+
} else if (entry.ctx < MIN_TEXT_CONTEXT) {
|
|
250
|
+
errors.push(
|
|
251
|
+
`files.text[${i}].ctx: ${entry.ctx} is below the 128k text GGUF floor`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
if (/-(32k|64k)\.gguf$/i.test(entry.path)) {
|
|
255
|
+
errors.push(
|
|
256
|
+
`files.text[${i}].path: 32k/64k text GGUFs are below the Eliza-1 release floor`,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Long-context tiers MUST require turbo3_tcq once any text variant has
|
|
262
|
+
// ctx > 64k. AGENTS.md §3 Required for desktop/pro/server (#6).
|
|
263
|
+
const hasLongContextVariant = m.files.text.some(
|
|
264
|
+
(f) => typeof f.ctx === "number" && f.ctx > 65536,
|
|
265
|
+
);
|
|
266
|
+
if (hasLongContextVariant) {
|
|
267
|
+
if (!declaredRequired.has("turbo3_tcq")) {
|
|
268
|
+
errors.push(
|
|
269
|
+
"kernels.required: text variant with ctx > 64k requires turbo3_tcq",
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const visionEnabled = VISION_TIERS.has(m.tier);
|
|
275
|
+
if (visionEnabled) {
|
|
276
|
+
if (m.files.vision.length === 0) {
|
|
277
|
+
errors.push(`files.vision: required for vision-enabled tier ${m.tier}`);
|
|
278
|
+
}
|
|
279
|
+
} else if (m.files.vision.length > 0) {
|
|
280
|
+
errors.push(`files.vision: unsupported for non-vision tier ${m.tier}`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const mtpEnabled = MTP_TIERS.has(m.tier);
|
|
284
|
+
if (mtpEnabled) {
|
|
285
|
+
if (m.files.mtp.length === 0) {
|
|
286
|
+
errors.push(`files.mtp: required for MTP-enabled tier ${m.tier}`);
|
|
287
|
+
}
|
|
288
|
+
if (!m.lineage.drafter) {
|
|
289
|
+
errors.push(`lineage.drafter: required for MTP-enabled tier ${m.tier}`);
|
|
290
|
+
}
|
|
291
|
+
if (!m.evals.mtp) {
|
|
292
|
+
errors.push(`evals.mtp: required for MTP-enabled tier ${m.tier}`);
|
|
293
|
+
} else {
|
|
294
|
+
if (
|
|
295
|
+
m.evals.mtp.passed &&
|
|
296
|
+
(m.evals.mtp.acceptanceRate == null || m.evals.mtp.speedup == null)
|
|
297
|
+
) {
|
|
298
|
+
errors.push(
|
|
299
|
+
"evals.mtp.passed: cannot be true when acceptanceRate or speedup is null (needs-hardware bench)",
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
if (strictRelease && !m.evals.mtp.passed) {
|
|
303
|
+
errors.push("evals.mtp.passed: false");
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
} else if (m.files.mtp.length > 0) {
|
|
307
|
+
errors.push(`files.mtp: unsupported for non-MTP tier ${m.tier}`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Backend kernel-verify coverage. A production release must verify every
|
|
311
|
+
// backend the tier supports; a candidate/staging bundle need only verify at
|
|
312
|
+
// least one supported backend (the device-side `canSetAsDefault` /
|
|
313
|
+
// installability check then matches the device's available backends against
|
|
314
|
+
// the verified-`pass` set, so a CUDA-only candidate installs on CUDA hosts
|
|
315
|
+
// and is rejected on a Mac whose Metal it never verified).
|
|
316
|
+
const supportedBackends = SUPPORTED_BACKENDS_BY_TIER[m.tier];
|
|
317
|
+
if (strictRelease) {
|
|
318
|
+
for (const b of supportedBackends) {
|
|
319
|
+
const status = m.kernels.verifiedBackends[b].status;
|
|
320
|
+
if (status !== "pass") {
|
|
321
|
+
errors.push(
|
|
322
|
+
`kernels.verifiedBackends.${b}: status is "${status}", expected "pass" for tier ${m.tier}`,
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
} else if (
|
|
327
|
+
!supportedBackends.some(
|
|
328
|
+
(b) => m.kernels.verifiedBackends[b].status === "pass",
|
|
329
|
+
)
|
|
330
|
+
) {
|
|
331
|
+
errors.push(
|
|
332
|
+
`kernels.verifiedBackends: a publishable bundle must report status="pass" on at least one supported backend for tier ${m.tier} (got [${supportedBackends
|
|
333
|
+
.map((b) => `${b}:${m.kernels.verifiedBackends[b].status}`)
|
|
334
|
+
.join(", ")}])`,
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// The precomputed default-voice speaker preset (`cache/voice-preset-default.bin`)
|
|
339
|
+
// is a mandatory bundle artifact — `EngineVoiceBridge.start()` hard-fails
|
|
340
|
+
// without it (AGENTS.md §4 / inference/AGENTS.md §2). It must be listed in
|
|
341
|
+
// `files.cache` so the downloader fetches it, and when the manifest declares
|
|
342
|
+
// a `voice` block its `cache.speakerPreset` must point at the same path.
|
|
343
|
+
if (!m.files.cache.some((f) => f.path === VOICE_PRESET_CACHE_PATH)) {
|
|
344
|
+
errors.push(`files.cache: missing required ${VOICE_PRESET_CACHE_PATH}`);
|
|
345
|
+
}
|
|
346
|
+
if (m.voice && m.voice.cache.speakerPreset !== VOICE_PRESET_CACHE_PATH) {
|
|
347
|
+
errors.push(
|
|
348
|
+
`voice.cache.speakerPreset: must be ${VOICE_PRESET_CACHE_PATH}, got ${m.voice.cache.speakerPreset}`,
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Eval gates. Enforced as pass/fail only for a production release; a
|
|
353
|
+
// candidate/staging bundle still carries the eval blobs (Zod-shape-checked,
|
|
354
|
+
// measured-or-`not-run`) but a non-green eval does not block publish/install
|
|
355
|
+
// — only `defaultEligible` promotion (which requires `strictRelease`).
|
|
356
|
+
if (strictRelease) {
|
|
357
|
+
if (!m.evals.textEval.passed) errors.push("evals.textEval.passed: false");
|
|
358
|
+
if (!m.evals.voiceRtf.passed) errors.push("evals.voiceRtf.passed: false");
|
|
359
|
+
if (!m.evals.e2eLoopOk) errors.push("evals.e2eLoopOk: false");
|
|
360
|
+
if (!m.evals.thirtyTurnOk) errors.push("evals.thirtyTurnOk: false");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Optional component slots must be internally consistent: a shipped
|
|
364
|
+
// component needs auditable lineage, and lineage may not point at a
|
|
365
|
+
// component absent from the bundle. Components that affect runtime quality
|
|
366
|
+
// also require their own publish gate to pass.
|
|
367
|
+
if (m.defaultEligible) {
|
|
368
|
+
if (m.files.asr.length === 0) {
|
|
369
|
+
errors.push(
|
|
370
|
+
"files.asr: required for defaultEligible local voice bundles",
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
if ((m.files.vad ?? []).length === 0) {
|
|
374
|
+
errors.push(
|
|
375
|
+
"files.vad: required for defaultEligible local voice bundles",
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
for (const slot of [
|
|
381
|
+
"asr",
|
|
382
|
+
"embedding",
|
|
383
|
+
"imagegen",
|
|
384
|
+
"vision",
|
|
385
|
+
"vad",
|
|
386
|
+
"wakeword",
|
|
387
|
+
"turn",
|
|
388
|
+
"emotion",
|
|
389
|
+
] as const) {
|
|
390
|
+
const files = m.files[slot] ?? [];
|
|
391
|
+
const lineage = m.lineage[slot];
|
|
392
|
+
if (files.length > 0 && !lineage) {
|
|
393
|
+
errors.push(`lineage.${slot}: required when files.${slot} is non-empty`);
|
|
394
|
+
}
|
|
395
|
+
if (lineage && files.length === 0) {
|
|
396
|
+
errors.push(`files.${slot}: required when lineage.${slot} is present`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (m.lineage.drafter && m.files.mtp.length === 0) {
|
|
400
|
+
errors.push("files.mtp: required when lineage.drafter is present");
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (m.files.asr.length > 0) {
|
|
404
|
+
if (!m.evals.asrWer) {
|
|
405
|
+
errors.push("evals.asrWer: required when files.asr is non-empty");
|
|
406
|
+
} else if (strictRelease && !m.evals.asrWer.passed) {
|
|
407
|
+
errors.push("evals.asrWer.passed: false");
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if ((m.files.embedding ?? []).length > 0) {
|
|
411
|
+
if (!m.evals.embedMteb) {
|
|
412
|
+
errors.push(
|
|
413
|
+
"evals.embedMteb: required when files.embedding is non-empty",
|
|
414
|
+
);
|
|
415
|
+
} else if (strictRelease && !m.evals.embedMteb.passed) {
|
|
416
|
+
errors.push("evals.embedMteb.passed: false");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if ((m.files.vad ?? []).length > 0) {
|
|
420
|
+
if (!m.evals.vadLatencyMs) {
|
|
421
|
+
errors.push("evals.vadLatencyMs: required when files.vad is non-empty");
|
|
422
|
+
} else if (strictRelease && !m.evals.vadLatencyMs.passed) {
|
|
423
|
+
errors.push("evals.vadLatencyMs.passed: false");
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Voice Wave 2 (2026-05-14): turn-detector eval gate. When the bundle
|
|
427
|
+
// ships `files.turn` (the LiveKit/Turnsense ONNX) the manifest MUST
|
|
428
|
+
// declare a `turnDetector` eval block; a strict release additionally
|
|
429
|
+
// requires `passed=true` AND the precomputed `passed` field to be
|
|
430
|
+
// internally consistent with the threshold constants.
|
|
431
|
+
if ((m.files.turn ?? []).length > 0) {
|
|
432
|
+
const td = m.evals.turnDetector;
|
|
433
|
+
if (!td) {
|
|
434
|
+
errors.push("evals.turnDetector: required when files.turn is non-empty");
|
|
435
|
+
} else {
|
|
436
|
+
const gateMet =
|
|
437
|
+
td.f1 >= TURN_DETECTOR_F1_THRESHOLD &&
|
|
438
|
+
td.meanLatencyMs <= TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT;
|
|
439
|
+
if (td.passed !== gateMet) {
|
|
440
|
+
errors.push(
|
|
441
|
+
`evals.turnDetector.passed: ${td.passed} disagrees with measured gate (f1=${td.f1} ≥ ${TURN_DETECTOR_F1_THRESHOLD} && meanLatencyMs=${td.meanLatencyMs} ≤ ${TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT} → ${gateMet})`,
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
if (strictRelease && !td.passed) {
|
|
445
|
+
errors.push("evals.turnDetector.passed: false");
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const expressiveVoice =
|
|
450
|
+
m.voice?.capabilities.includes("emotion-tags") ||
|
|
451
|
+
m.voice?.capabilities.includes("singing");
|
|
452
|
+
if (expressiveVoice) {
|
|
453
|
+
if (!m.evals.expressive) {
|
|
454
|
+
errors.push(
|
|
455
|
+
"evals.expressive: required when voice capabilities include emotion-tags or singing",
|
|
456
|
+
);
|
|
457
|
+
} else if (strictRelease && !m.evals.expressive.passed) {
|
|
458
|
+
errors.push("evals.expressive.passed: false");
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// Voice Wave 2 (2026-05-14): acoustic-emotion classifier eval gate. Same
|
|
463
|
+
// shape as `turnDetector`: a bundle that ships `files.emotion` MUST
|
|
464
|
+
// declare a precomputed `emotionClassifier` block; a strict release
|
|
465
|
+
// additionally requires `passed=true` and internal consistency with the
|
|
466
|
+
// threshold constants. The MELD bar is intentionally low (~0.35) per
|
|
467
|
+
// R3-emotion §6 — refusing to publish a real improvement is worse than
|
|
468
|
+
// admitting 7-class conversational SER is hard.
|
|
469
|
+
if ((m.files.emotion ?? []).length > 0) {
|
|
470
|
+
const ec = m.evals.emotionClassifier;
|
|
471
|
+
if (!ec) {
|
|
472
|
+
errors.push(
|
|
473
|
+
"evals.emotionClassifier: required when files.emotion is non-empty",
|
|
474
|
+
);
|
|
475
|
+
} else {
|
|
476
|
+
const gateMet =
|
|
477
|
+
ec.macroF1Meld >= EMOTION_CLASSIFIER_MELD_F1_THRESHOLD &&
|
|
478
|
+
ec.macroF1Iemocap >= EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD &&
|
|
479
|
+
ec.meanLatencyMs <= EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT;
|
|
480
|
+
if (ec.passed !== gateMet) {
|
|
481
|
+
errors.push(
|
|
482
|
+
`evals.emotionClassifier.passed: ${ec.passed} disagrees with measured gate (` +
|
|
483
|
+
`macroF1Meld=${ec.macroF1Meld} ≥ ${EMOTION_CLASSIFIER_MELD_F1_THRESHOLD} && ` +
|
|
484
|
+
`macroF1Iemocap=${ec.macroF1Iemocap} ≥ ${EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD} && ` +
|
|
485
|
+
`meanLatencyMs=${ec.meanLatencyMs} ≤ ${EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT} → ${gateMet})`,
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
if (strictRelease && !ec.passed) {
|
|
489
|
+
errors.push("evals.emotionClassifier.passed: false");
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// base-v1 provenance coverage. A `base-v1` manifest (the upstream base
|
|
495
|
+
// models, GGUF-converted + fully optimized, NOT fine-tuned) MUST record
|
|
496
|
+
// where every shipped component comes from — that is the whole point of
|
|
497
|
+
// the release state.
|
|
498
|
+
if (m.provenance) {
|
|
499
|
+
if (
|
|
500
|
+
m.provenance.releaseState === "base-v1" &&
|
|
501
|
+
m.provenance.finetuned !== false
|
|
502
|
+
) {
|
|
503
|
+
errors.push(
|
|
504
|
+
"provenance.finetuned: must be false for releaseState=base-v1",
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
if (m.provenance.releaseState === "base-v1") {
|
|
508
|
+
const requiredSlots: Array<keyof typeof m.provenance.sourceModels> = [
|
|
509
|
+
"text",
|
|
510
|
+
"voice",
|
|
511
|
+
];
|
|
512
|
+
for (const slot of ["asr", "vad", "embedding", "vision"] as const) {
|
|
513
|
+
if ((m.files[slot] ?? []).length > 0) requiredSlots.push(slot);
|
|
514
|
+
}
|
|
515
|
+
if (m.files.mtp.length > 0) {
|
|
516
|
+
requiredSlots.push("drafter");
|
|
517
|
+
}
|
|
518
|
+
if ((m.files.imagegen ?? []).length > 0) {
|
|
519
|
+
requiredSlots.push("imagegen");
|
|
520
|
+
}
|
|
521
|
+
for (const slot of requiredSlots) {
|
|
522
|
+
if (!m.provenance.sourceModels[slot]) {
|
|
523
|
+
errors.push(
|
|
524
|
+
`provenance.sourceModels.${slot}: required for releaseState=base-v1 (component is in files.${slot})`,
|
|
525
|
+
);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// EAGLE3 bench metadata is always optional. When
|
|
532
|
+
// present, it may record a not-run/failure state; only a passing claim must
|
|
533
|
+
// include measured acceptance/speedup values.
|
|
534
|
+
if (m.evals.eagle3) {
|
|
535
|
+
const eagle3Passed = m.evals.eagle3.passed ?? m.evals.eagle3.pass;
|
|
536
|
+
if (
|
|
537
|
+
eagle3Passed === true &&
|
|
538
|
+
(m.evals.eagle3.acceptanceRate == null || m.evals.eagle3.speedup == null)
|
|
539
|
+
) {
|
|
540
|
+
errors.push(
|
|
541
|
+
"evals.eagle3: passed=true requires measured acceptanceRate and speedup",
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// The strongest claim: defaultEligible. If anything above failed, this
|
|
547
|
+
// flag must be false. (Contract errors are already accumulated; we add
|
|
548
|
+
// an explicit message so callers can identify the violation cleanly.)
|
|
549
|
+
if (m.defaultEligible && errors.length > 0) {
|
|
550
|
+
errors.unshift(
|
|
551
|
+
"defaultEligible: true requires all required kernels, supported backends, and evals to pass",
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
return errors;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* Convenience: list missing required kernels for a tier without doing
|
|
560
|
+
* full validation. Used by the recommendation engine when surfacing
|
|
561
|
+
* "this bundle is broken" diagnostics.
|
|
562
|
+
*/
|
|
563
|
+
export function missingRequiredKernels(
|
|
564
|
+
tier: Eliza1Tier,
|
|
565
|
+
declaredRequired: ReadonlyArray<Eliza1Kernel>,
|
|
566
|
+
): ReadonlyArray<Eliza1Kernel> {
|
|
567
|
+
const declared = new Set(declaredRequired);
|
|
568
|
+
return REQUIRED_KERNELS_BY_TIER[tier].filter((k) => !declared.has(k));
|
|
569
|
+
}
|