@qvac/sdk 0.9.2 → 0.10.0
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/NOTICE +15 -68
- package/dist/client/api/cancel.d.ts +1 -1
- package/dist/client/api/cancel.js +1 -1
- package/dist/client/api/completion-stream.d.ts +51 -12
- package/dist/client/api/completion-stream.js +129 -56
- package/dist/client/api/delete-cache.d.ts +1 -0
- package/dist/client/api/delete-cache.js +1 -0
- package/dist/client/api/diffusion.d.ts +17 -2
- package/dist/client/api/diffusion.js +21 -4
- package/dist/client/api/embed.d.ts +4 -0
- package/dist/client/api/finetune.d.ts +21 -0
- package/dist/client/api/get-loaded-model-info.d.ts +25 -0
- package/dist/client/api/get-loaded-model-info.js +36 -0
- package/dist/client/api/get-model-info.d.ts +9 -1
- package/dist/client/api/get-model-info.js +8 -0
- package/dist/client/api/heartbeat.d.ts +2 -2
- package/dist/client/api/heartbeat.js +2 -2
- package/dist/client/api/index.d.ts +3 -1
- package/dist/client/api/index.js +3 -1
- package/dist/client/api/invoke-plugin.d.ts +16 -0
- package/dist/client/api/invoke-plugin.js +16 -0
- package/dist/client/api/load-model.d.ts +36 -3
- package/dist/client/api/load-model.js +31 -10
- package/dist/client/api/provide.d.ts +11 -5
- package/dist/client/api/provide.js +11 -6
- package/dist/client/api/rag.d.ts +9 -0
- package/dist/client/api/rag.js +9 -0
- package/dist/client/api/registry.d.ts +26 -0
- package/dist/client/api/registry.js +26 -0
- package/dist/client/api/resume.d.ts +20 -4
- package/dist/client/api/resume.js +20 -4
- package/dist/client/api/state.d.ts +23 -0
- package/dist/client/api/state.js +29 -0
- package/dist/client/api/stop-provider.d.ts +11 -5
- package/dist/client/api/stop-provider.js +11 -5
- package/dist/client/api/suspend.d.ts +21 -3
- package/dist/client/api/suspend.js +21 -3
- package/dist/client/api/text-to-speech.d.ts +64 -6
- package/dist/client/api/text-to-speech.js +423 -47
- package/dist/client/api/transcribe.d.ts +29 -4
- package/dist/client/api/transcribe.js +86 -28
- package/dist/client/api/translate.d.ts +1 -0
- package/dist/client/api/translate.js +1 -0
- package/dist/client/rpc/bare-client.js +22 -1
- package/dist/client/rpc/expo-rpc-client.d.ts +1 -1
- package/dist/client/rpc/expo-rpc-client.js +96 -4
- package/dist/client/rpc/node-rpc-client.js +36 -0
- package/dist/examples/audio/mic-input.d.ts +9 -0
- package/dist/examples/audio/mic-input.js +111 -0
- package/dist/examples/completion-events.d.ts +18 -0
- package/dist/examples/completion-events.js +79 -0
- package/dist/examples/delegated-inference/composite.js +12 -18
- package/dist/examples/delegated-inference/consumer-profiled.js +4 -11
- package/dist/examples/delegated-inference/consumer.js +8 -13
- package/dist/examples/delegated-inference/provider.js +11 -16
- package/dist/examples/diffusion-flux2-klein-img2img.d.ts +2 -0
- package/dist/examples/diffusion-flux2-klein-img2img.js +60 -0
- package/dist/examples/diffusion-flux2-klein.js +1 -0
- package/dist/examples/diffusion-img2img.d.ts +2 -0
- package/dist/examples/diffusion-img2img.js +49 -0
- package/dist/examples/diffusion-txt2img.js +2 -1
- package/dist/examples/kv-cache-example.js +11 -12
- package/dist/examples/llamacpp-cache.d.ts +2 -0
- package/dist/examples/llamacpp-cache.js +107 -0
- package/dist/examples/llamacpp-dynamic-tools.d.ts +2 -0
- package/dist/examples/llamacpp-dynamic-tools.js +144 -0
- package/dist/examples/llamacpp-native-tools.js +2 -8
- package/dist/examples/llamacpp-structured-output.d.ts +2 -0
- package/dist/examples/llamacpp-structured-output.js +106 -0
- package/dist/examples/llamacpp-tools-pythonic.d.ts +2 -0
- package/dist/examples/llamacpp-tools-pythonic.js +69 -0
- package/dist/examples/plugins.js +4 -4
- package/dist/examples/suspend-resume.js +21 -4
- package/dist/examples/transcription/parakeet-microphone-record.js +6 -33
- package/dist/examples/transcription/whispercpp-filesystem-streaming.js +7 -5
- package/dist/examples/transcription/whispercpp-filesystem.js +12 -3
- package/dist/examples/transcription/whispercpp-microphone-record.js +6 -29
- package/dist/examples/translation/translation-stream.js +5 -5
- package/dist/examples/tts/llm-to-tts-streaming.d.ts +16 -0
- package/dist/examples/tts/llm-to-tts-streaming.js +143 -0
- package/dist/examples/tts/supertonic-multilingual.js +3 -3
- package/dist/examples/tts/supertonic.js +3 -3
- package/dist/examples/tts/utils.d.ts +11 -1
- package/dist/examples/tts/utils.js +70 -17
- package/dist/examples/voice-assistant/voice-assistant.d.ts +2 -0
- package/dist/examples/voice-assistant/voice-assistant.js +207 -0
- package/dist/expo/plugins/withMobileBundle.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/logging/logger.d.ts +11 -0
- package/dist/logging/logger.js +11 -0
- package/dist/logging/types.d.ts +18 -0
- package/dist/models/registry/models.d.ts +6620 -6185
- package/dist/models/registry/models.js +6296 -5318
- package/dist/models/update-models/codegen.js +84 -23
- package/dist/models/update-models/companions.d.ts +18 -0
- package/dist/models/update-models/companions.js +175 -0
- package/dist/models/update-models/naming.js +0 -25
- package/dist/models/update-models/registry.js +4 -2
- package/dist/models/update-models/types.d.ts +37 -9
- package/dist/profiling/index.d.ts +49 -0
- package/dist/profiling/index.js +49 -0
- package/dist/schemas/cancel.d.ts +6 -2
- package/dist/schemas/cancel.js +14 -7
- package/dist/schemas/common.d.ts +353 -271
- package/dist/schemas/common.js +26 -5
- package/dist/schemas/completion-event.d.ts +225 -0
- package/dist/schemas/completion-event.js +79 -0
- package/dist/schemas/completion-stream.d.ts +122 -31
- package/dist/schemas/completion-stream.js +137 -36
- package/dist/schemas/delegate.d.ts +0 -2
- package/dist/schemas/delegate.js +25 -6
- package/dist/schemas/download-asset.d.ts +5 -5
- package/dist/schemas/embed.js +21 -9
- package/dist/schemas/engine-addon-map.d.ts +11 -1
- package/dist/schemas/engine-addon-map.js +2 -2
- package/dist/schemas/get-loaded-model-info.d.ts +52 -0
- package/dist/schemas/get-loaded-model-info.js +44 -0
- package/dist/schemas/get-model-info.d.ts +2 -2
- package/dist/schemas/get-model-info.js +103 -32
- package/dist/schemas/heartbeat.d.ts +0 -1
- package/dist/schemas/index.d.ts +4 -1
- package/dist/schemas/index.js +4 -1
- package/dist/schemas/llamacpp-config.d.ts +14 -4
- package/dist/schemas/llamacpp-config.js +5 -0
- package/dist/schemas/load-model.d.ts +3233 -1260
- package/dist/schemas/load-model.js +23 -16
- package/dist/schemas/model-src-utils.d.ts +7 -6
- package/dist/schemas/model-src-utils.js +27 -1
- package/dist/schemas/model-types.d.ts +4 -4
- package/dist/schemas/ocr.d.ts +1 -1
- package/dist/schemas/plugin.d.ts +27 -3
- package/dist/schemas/plugin.js +27 -2
- package/dist/schemas/profiling.js +11 -3
- package/dist/schemas/provide.d.ts +1 -3
- package/dist/schemas/provide.js +0 -3
- package/dist/schemas/rag.d.ts +4 -4
- package/dist/schemas/registry.d.ts +10 -10
- package/dist/schemas/registry.js +36 -14
- package/dist/schemas/reload-config.d.ts +73 -7
- package/dist/schemas/sdcpp-config.d.ts +16 -8
- package/dist/schemas/sdcpp-config.js +118 -25
- package/dist/schemas/sdk-config.d.ts +116 -90
- package/dist/schemas/sdk-config.js +16 -0
- package/dist/schemas/sdk-errors-client.d.ts +3 -0
- package/dist/schemas/sdk-errors-client.js +16 -1
- package/dist/schemas/sdk-errors-server.d.ts +3 -0
- package/dist/schemas/sdk-errors-server.js +23 -0
- package/dist/schemas/state.d.ts +23 -0
- package/dist/schemas/state.js +14 -0
- package/dist/schemas/stop-provide.d.ts +0 -5
- package/dist/schemas/stop-provide.js +2 -6
- package/dist/schemas/text-to-speech.d.ts +93 -27
- package/dist/schemas/text-to-speech.js +27 -0
- package/dist/schemas/tools.d.ts +16 -0
- package/dist/schemas/tools.js +15 -0
- package/dist/schemas/transcription-config.d.ts +8 -8
- package/dist/schemas/transcription.d.ts +33 -0
- package/dist/schemas/transcription.js +9 -0
- package/dist/schemas/translate.js +59 -19
- package/dist/schemas/translation-config.d.ts +157 -133
- package/dist/schemas/translation-config.js +34 -11
- package/dist/server/bare/delegate-rpc-client.d.ts +1 -1
- package/dist/server/bare/delegate-rpc-client.js +131 -122
- package/dist/server/bare/hyperswarm.d.ts +2 -2
- package/dist/server/bare/hyperswarm.js +12 -7
- package/dist/server/bare/ops/cancel.js +7 -0
- package/dist/server/bare/ops/kv-cache-utils.d.ts +7 -10
- package/dist/server/bare/ops/kv-cache-utils.js +31 -40
- package/dist/server/bare/ops/load-model.js +0 -1
- package/dist/server/bare/ops/transcribe.d.ts +11 -4
- package/dist/server/bare/ops/transcribe.js +25 -4
- package/dist/server/bare/ops/translate.js +42 -4
- package/dist/server/bare/ops/unload-model.js +21 -19
- package/dist/server/bare/plugins/llamacpp-completion/ops/cache-logger.js +1 -2
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +13 -8
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +257 -85
- package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.d.ts +101 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.js +135 -0
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +79 -22
- package/dist/server/bare/plugins/llamacpp-completion/plugin.js +57 -32
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +10 -16
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +69 -44
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +113 -94
- package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +1 -1
- package/dist/server/bare/plugins/onnx-ocr/plugin.js +1 -2
- package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.d.ts +7 -0
- package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.js +116 -0
- package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.d.ts +2 -3
- package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.js +71 -9
- package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +41 -13
- package/dist/server/bare/plugins/onnx-tts/plugin.js +48 -3
- package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +15 -7
- package/dist/server/bare/plugins/parakeet-transcription/plugin.js +5 -6
- package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.js +6 -0
- package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +8 -5
- package/dist/server/bare/plugins/sdcpp-generation/plugin.js +13 -13
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +17 -1
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +40 -17
- package/dist/server/bare/registry/config-registry.js +14 -3
- package/dist/server/bare/registry/model-registry.d.ts +8 -10
- package/dist/server/bare/registry/model-registry.js +17 -12
- package/dist/server/bare/registry/registry-client.js +79 -19
- package/dist/server/bare/runtime-lifecycle.d.ts +2 -1
- package/dist/server/bare/runtime-lifecycle.js +13 -2
- package/dist/server/bare/types/addon-responses.d.ts +8 -3
- package/dist/server/bare/utils/transcribe-metadata.d.ts +21 -0
- package/dist/server/bare/utils/transcribe-metadata.js +28 -0
- package/dist/server/bare/utils/tts-stats.d.ts +22 -0
- package/dist/server/bare/utils/tts-stats.js +10 -0
- package/dist/server/rpc/create-server.d.ts +4 -1
- package/dist/server/rpc/create-server.js +5 -1
- package/dist/server/rpc/delegate-transport.js +36 -29
- package/dist/server/rpc/handle-request.js +28 -3
- package/dist/server/rpc/handler-registry.js +7 -1
- package/dist/server/rpc/handler-utils.d.ts +5 -0
- package/dist/server/rpc/handler-utils.js +22 -0
- package/dist/server/rpc/handlers/cancel-delegated.js +3 -5
- package/dist/server/rpc/handlers/cancelHandler.js +4 -5
- package/dist/server/rpc/handlers/completion-stream-delegated.js +14 -5
- package/dist/server/rpc/handlers/delete-cache.js +8 -3
- package/dist/server/rpc/handlers/download-asset.js +3 -24
- package/dist/server/rpc/handlers/get-loaded-model-info.d.ts +3 -0
- package/dist/server/rpc/handlers/get-loaded-model-info.js +39 -0
- package/dist/server/rpc/handlers/get-model-info.js +93 -84
- package/dist/server/rpc/handlers/heartbeat-delegated.js +2 -2
- package/dist/server/rpc/handlers/index.d.ts +6 -0
- package/dist/server/rpc/handlers/index.js +6 -0
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +35 -9
- package/dist/server/rpc/handlers/load-model/download-manager.js +142 -38
- package/dist/server/rpc/handlers/load-model/download-stats.d.ts +5 -4
- package/dist/server/rpc/handlers/load-model/download-stats.js +49 -8
- package/dist/server/rpc/handlers/load-model/handler.js +31 -50
- package/dist/server/rpc/handlers/load-model/http.d.ts +2 -2
- package/dist/server/rpc/handlers/load-model/http.js +97 -142
- package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +2 -2
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +55 -74
- package/dist/server/rpc/handlers/load-model/index.d.ts +0 -1
- package/dist/server/rpc/handlers/load-model/index.js +0 -1
- package/dist/server/rpc/handlers/load-model/registry-client-options.d.ts +27 -0
- package/dist/server/rpc/handlers/load-model/registry-client-options.js +19 -0
- package/dist/server/rpc/handlers/load-model/registry-companion-set.d.ts +22 -0
- package/dist/server/rpc/handlers/load-model/registry-companion-set.js +208 -0
- package/dist/server/rpc/handlers/load-model/registry-download-utils.d.ts +24 -0
- package/dist/server/rpc/handlers/load-model/registry-download-utils.js +114 -0
- package/dist/server/rpc/handlers/load-model/registry.d.ts +2 -20
- package/dist/server/rpc/handlers/load-model/registry.js +109 -381
- package/dist/server/rpc/handlers/load-model/resolve-session.d.ts +15 -0
- package/dist/server/rpc/handlers/load-model/resolve-session.js +61 -0
- package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -3
- package/dist/server/rpc/handlers/load-model/resolve.js +14 -23
- package/dist/server/rpc/handlers/load-model/types.d.ts +11 -4
- package/dist/server/rpc/handlers/load-model/types.js +28 -1
- package/dist/server/rpc/handlers/load-model-delegated.js +2 -4
- package/dist/server/rpc/handlers/plugin-dispatch.js +9 -5
- package/dist/server/rpc/handlers/plugin-invoke.js +1 -1
- package/dist/server/rpc/handlers/provideHandler/connection.js +13 -2
- package/dist/server/rpc/handlers/provideHandler/handler.js +42 -29
- package/dist/server/rpc/handlers/state.d.ts +3 -0
- package/dist/server/rpc/handlers/state.js +7 -0
- package/dist/server/rpc/handlers/stopProvideHandler.d.ts +2 -2
- package/dist/server/rpc/handlers/stopProvideHandler.js +12 -7
- package/dist/server/rpc/handlers/text-to-speech-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/text-to-speech-stream.js +4 -0
- package/dist/server/rpc/handlers/unload-model-delegated.js +3 -3
- package/dist/server/rpc/profiling/operation-metrics.js +20 -0
- package/dist/server/rpc/rpc-utils.js +1 -1
- package/dist/server/rpc/transport-selector.d.ts +3 -0
- package/dist/server/rpc/transport-selector.js +18 -0
- package/dist/server/utils/cache/auto-history.d.ts +4 -0
- package/dist/server/utils/cache/auto-history.js +22 -0
- package/dist/server/utils/{cache.d.ts → cache/paths.d.ts} +22 -5
- package/dist/server/utils/{cache.js → cache/paths.js} +36 -20
- package/dist/server/utils/cache/types.d.ts +8 -0
- package/dist/server/utils/cache/types.js +1 -0
- package/dist/server/utils/checksum.d.ts +2 -2
- package/dist/server/utils/checksum.js +1 -1
- package/dist/server/utils/clear-storage.d.ts +5 -0
- package/dist/server/utils/clear-storage.js +17 -0
- package/dist/server/utils/completion-normalizer.d.ts +17 -0
- package/dist/server/utils/completion-normalizer.js +301 -0
- package/dist/server/utils/expand-gguf-shards.d.ts +3 -0
- package/dist/server/utils/expand-gguf-shards.js +22 -0
- package/dist/server/utils/formatting.js +1 -1
- package/dist/server/utils/index.d.ts +4 -2
- package/dist/server/utils/index.js +4 -2
- package/dist/server/utils/qvac-paths.d.ts +2 -0
- package/dist/server/utils/qvac-paths.js +5 -0
- package/dist/server/utils/response-format.d.ts +3 -0
- package/dist/server/utils/response-format.js +20 -0
- package/dist/server/utils/tool-integration.d.ts +15 -4
- package/dist/server/utils/tool-integration.js +21 -41
- package/dist/server/utils/tools/dialect.d.ts +8 -0
- package/dist/server/utils/tools/dialect.js +12 -0
- package/dist/server/utils/tools/index.d.ts +3 -0
- package/dist/server/utils/tools/index.js +2 -0
- package/dist/server/utils/tools/parser.d.ts +6 -0
- package/dist/server/utils/tools/parser.js +40 -0
- package/dist/server/utils/tools/parsers/hermes.d.ts +4 -0
- package/dist/server/utils/tools/parsers/hermes.js +100 -0
- package/dist/server/utils/tools/parsers/json.d.ts +6 -0
- package/dist/server/utils/tools/parsers/json.js +115 -0
- package/dist/server/utils/tools/parsers/pythonic.d.ts +4 -0
- package/dist/server/utils/tools/parsers/pythonic.js +267 -0
- package/dist/server/utils/tools/shared.d.ts +18 -0
- package/dist/server/utils/tools/shared.js +54 -0
- package/dist/server/utils/worker-lock.d.ts +3 -0
- package/dist/server/utils/worker-lock.js +67 -0
- package/dist/server/worker-core.d.ts +16 -1
- package/dist/server/worker-core.js +114 -14
- package/dist/utils/aggregate-events.d.ts +16 -0
- package/dist/utils/aggregate-events.js +52 -0
- package/dist/utils/cache-normalize.d.ts +10 -0
- package/dist/utils/cache-normalize.js +23 -0
- package/dist/utils/encoding.d.ts +8 -0
- package/dist/utils/encoding.js +13 -0
- package/dist/utils/errors-client.d.ts +12 -0
- package/dist/utils/errors-client.js +20 -0
- package/dist/utils/errors-server.d.ts +14 -0
- package/dist/utils/errors-server.js +31 -0
- package/dist/utils/load-model-validation.d.ts +7 -0
- package/dist/utils/load-model-validation.js +18 -0
- package/expo/plugins/patches/android-link.mjs +1 -1
- package/expo/plugins/patches/ios-link.mjs +1 -1
- package/package.json +14 -18
- package/dist/examples/translation/translation-opus.d.ts +0 -2
- package/dist/examples/translation/translation-opus.js +0 -33
- package/dist/server/bare/utils/loader-adapter.d.ts +0 -7
- package/dist/server/bare/utils/loader-adapter.js +0 -9
- package/dist/server/utils/model-path.d.ts +0 -5
- package/dist/server/utils/model-path.js +0 -7
- package/dist/server/utils/tool-parser.d.ts +0 -7
- package/dist/server/utils/tool-parser.js +0 -248
|
@@ -9,10 +9,43 @@ import { closeRegistryClient } from "./bare/registry/registry-client.js";
|
|
|
9
9
|
import { clearAllLoggingStreams, startLogBuffering, } from "./bare/registry/logging-stream-registry.js";
|
|
10
10
|
import { clearAllAddonLoggers, getServerLogger, SDK_LOG_ID } from "../logging/index.js";
|
|
11
11
|
import { clearPlugins } from "./plugins/index.js";
|
|
12
|
+
import { acquireWorkerLock, releaseWorkerLock, } from "./utils/worker-lock.js";
|
|
12
13
|
let coreInitialized = false;
|
|
13
14
|
let rpcInitialized = false;
|
|
15
|
+
// Set true when the cleanup body has run at least once. Lets both
|
|
16
|
+
// cleanupForTerminate (pre-terminate path) and shutdownBareDirectWorker
|
|
17
|
+
// (signal/exit path) call runCleanup() without doing duplicate work.
|
|
18
|
+
let cleanupRan = false;
|
|
19
|
+
// Set true when shutdownBareDirectWorker is in flight. Distinct from
|
|
20
|
+
// cleanupRan: cleanupForTerminate must NOT set this, otherwise a later
|
|
21
|
+
// SIGTERM/SIGINT/uncaught-exception would early-return at the guard
|
|
22
|
+
// in shutdownBareDirectWorker and skip releaseWorkerLock + process.exit.
|
|
14
23
|
let isShuttingDown = false;
|
|
15
24
|
const logger = getServerLogger();
|
|
25
|
+
// Defense-in-depth grace period for the SIGKILL safety net armed before
|
|
26
|
+
// process.exit() in shutdownBareDirectWorker. If process.exit cannot
|
|
27
|
+
// terminate the worker within this window — typically because some path
|
|
28
|
+
// holds a non-cancellable native handle (e.g. a libuv worker thread
|
|
29
|
+
// blocked on flock; see QVAC-18197) — we force-kill the OS process to
|
|
30
|
+
// guarantee bounded shutdown time.
|
|
31
|
+
const FORCE_EXIT_GRACE_MS = 3_000;
|
|
32
|
+
function scheduleForceExit() {
|
|
33
|
+
const timer = setTimeout(() => {
|
|
34
|
+
logger.error(`process.exit did not terminate the worker within ${FORCE_EXIT_GRACE_MS}ms — ` +
|
|
35
|
+
`force-killing self (likely blocked native handle)`);
|
|
36
|
+
try {
|
|
37
|
+
process.kill(process.pid, "SIGKILL");
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// best-effort — if SIGKILL itself fails, there's nothing more to do
|
|
41
|
+
}
|
|
42
|
+
}, FORCE_EXIT_GRACE_MS);
|
|
43
|
+
// Don't let the safety-net timer keep the process alive on the happy
|
|
44
|
+
// path. Bare returns an object (not a number) from setTimeout.
|
|
45
|
+
if (timer && typeof timer === "object" && "unref" in timer) {
|
|
46
|
+
timer.unref();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
16
49
|
export function initializeWorkerCore() {
|
|
17
50
|
if (coreInitialized) {
|
|
18
51
|
const validatedEnv = getValidatedEnv();
|
|
@@ -20,6 +53,7 @@ export function initializeWorkerCore() {
|
|
|
20
53
|
}
|
|
21
54
|
startLogBuffering(SDK_LOG_ID);
|
|
22
55
|
const { hasRPCConfig } = initEnv();
|
|
56
|
+
acquireWorkerLock();
|
|
23
57
|
setupShutdownHandlers();
|
|
24
58
|
coreInitialized = true;
|
|
25
59
|
logger.debug("Worker core initialized");
|
|
@@ -37,7 +71,9 @@ export function ensureRPCSetup() {
|
|
|
37
71
|
const ipcSocketPath = validatedEnv.QVAC_IPC_SOCKET_PATH;
|
|
38
72
|
if (ipcSocketPath) {
|
|
39
73
|
logger.info(`Running in desktop mode, connecting to IPC socket: ${ipcSocketPath}`);
|
|
40
|
-
const rpc = createIPCClient(ipcSocketPath
|
|
74
|
+
const rpc = createIPCClient(ipcSocketPath, {
|
|
75
|
+
onDisconnect: () => void shutdownBareDirectWorker("ipc-disconnect"),
|
|
76
|
+
});
|
|
41
77
|
logger.debug("Desktop IPC client created?", !!rpc);
|
|
42
78
|
}
|
|
43
79
|
else {
|
|
@@ -61,31 +97,95 @@ function clearRegistries() {
|
|
|
61
97
|
clearAllAddonLoggers();
|
|
62
98
|
clearPlugins();
|
|
63
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Run the cleanup body shared by terminal and graceful-shutdown paths.
|
|
102
|
+
* Clears plugin registries (which calls each addon's `releaseLogger` →
|
|
103
|
+
* frees env-bound js_ref_t state), unloads all loaded models (which calls
|
|
104
|
+
* each addon's `destroyInstance`), and closes infra (swarm, rag, downloads,
|
|
105
|
+
* registry client). Does NOT touch the worker lock or call `process.exit`.
|
|
106
|
+
*
|
|
107
|
+
* Idempotent: subsequent calls are no-ops via the `cleanupRan` flag. The
|
|
108
|
+
* underlying clearPlugins / unloadAllModels / closers are also idempotent
|
|
109
|
+
* on empty registries, but the flag avoids the redundant log noise and
|
|
110
|
+
* allocator churn.
|
|
111
|
+
*/
|
|
112
|
+
async function runCleanup() {
|
|
113
|
+
if (cleanupRan)
|
|
114
|
+
return;
|
|
115
|
+
cleanupRan = true;
|
|
116
|
+
clearRegistries();
|
|
117
|
+
await Promise.allSettled([
|
|
118
|
+
destroySwarm(),
|
|
119
|
+
closeAllRagInstances(),
|
|
120
|
+
cleanupDownloads(),
|
|
121
|
+
unloadAllModels(),
|
|
122
|
+
closeRegistryClient(),
|
|
123
|
+
]);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Pre-terminate cleanup, callable while the worker is still alive.
|
|
127
|
+
*
|
|
128
|
+
* On platforms where the worker lives in the same OS process as the JS host
|
|
129
|
+
* (i.e. mobile via react-native-bare-kit Worklet), `process.exit()` would
|
|
130
|
+
* kill the entire app. This path runs the same registry/model cleanup as
|
|
131
|
+
* `shutdownBareDirectWorker` but skips the lock release + exit, leaving the
|
|
132
|
+
* caller (typically the SDK client about to call `worklet.terminate()`)
|
|
133
|
+
* responsible for tearing the worker down.
|
|
134
|
+
*
|
|
135
|
+
* Critical for clean termination: addons hold static state with js_ref_t
|
|
136
|
+
* handles into the current V8 isolate; without this cleanup, those refs
|
|
137
|
+
* survive into the next worklet's isolate and crash on first access.
|
|
138
|
+
*/
|
|
139
|
+
export async function cleanupForTerminate() {
|
|
140
|
+
// Intentionally does NOT set isShuttingDown — that flag is reserved for
|
|
141
|
+
// shutdownBareDirectWorker so a later SIGTERM/SIGINT still gets to run
|
|
142
|
+
// the lock release + process.exit path. runCleanup is idempotent on its
|
|
143
|
+
// own, so a follow-up shutdownBareDirectWorker call won't redo the body.
|
|
144
|
+
if (cleanupRan)
|
|
145
|
+
return;
|
|
146
|
+
logger.info("🧹 Pre-terminate cleanup starting...");
|
|
147
|
+
try {
|
|
148
|
+
await runCleanup();
|
|
149
|
+
logger.info("✅ Pre-terminate cleanup completed");
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
logger.error("❌ Error during pre-terminate cleanup:", error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
64
155
|
export async function shutdownBareDirectWorker(reason) {
|
|
65
156
|
if (isShuttingDown)
|
|
66
157
|
return;
|
|
67
158
|
isShuttingDown = true;
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
: "🧹 Bare direct mode RPC closed, cleaning up..."
|
|
71
|
-
|
|
159
|
+
const messages = {
|
|
160
|
+
signal: "🐻 Bare worker shutdown signal received, cleaning up...",
|
|
161
|
+
"rpc-close": "🧹 Bare direct mode RPC closed, cleaning up...",
|
|
162
|
+
"uncaught-exception": "💥 Uncaught exception, cleaning up...",
|
|
163
|
+
"unhandled-rejection": "💥 Unhandled rejection, cleaning up...",
|
|
164
|
+
"ipc-disconnect": "🔌 Parent IPC disconnected, cleaning up...",
|
|
165
|
+
};
|
|
166
|
+
logger.info(messages[reason]);
|
|
72
167
|
try {
|
|
73
|
-
|
|
74
|
-
await
|
|
75
|
-
destroySwarm(),
|
|
76
|
-
closeAllRagInstances(),
|
|
77
|
-
cleanupDownloads(),
|
|
78
|
-
unloadAllModels(),
|
|
79
|
-
closeRegistryClient(),
|
|
80
|
-
]);
|
|
168
|
+
// Idempotent: if cleanupForTerminate already ran, this is a no-op.
|
|
169
|
+
await runCleanup();
|
|
81
170
|
logger.info("✅ Cleanup completed successfully");
|
|
82
171
|
}
|
|
83
172
|
catch (error) {
|
|
84
173
|
logger.error("❌ Error during shutdown cleanup:", error);
|
|
85
174
|
}
|
|
86
|
-
|
|
175
|
+
releaseWorkerLock();
|
|
176
|
+
scheduleForceExit();
|
|
177
|
+
const isGraceful = reason === "signal" || reason === "rpc-close";
|
|
178
|
+
process.exit(isGraceful ? 0 : 1);
|
|
87
179
|
}
|
|
88
180
|
function setupShutdownHandlers() {
|
|
89
181
|
process.once("SIGTERM", () => void shutdownBareDirectWorker("signal"));
|
|
90
182
|
process.once("SIGINT", () => void shutdownBareDirectWorker("signal"));
|
|
183
|
+
process.on("uncaughtException", (err) => {
|
|
184
|
+
logger.error("Uncaught exception in worker:", err);
|
|
185
|
+
void shutdownBareDirectWorker("uncaught-exception");
|
|
186
|
+
});
|
|
187
|
+
process.on("unhandledRejection", (reason) => {
|
|
188
|
+
logger.error("Unhandled rejection in worker:", reason);
|
|
189
|
+
void shutdownBareDirectWorker("unhandled-rejection");
|
|
190
|
+
});
|
|
91
191
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompletionError, CompletionEvent, CompletionFinal, CompletionStats, ToolCall } from "../schemas/index";
|
|
2
|
+
import { type ToolHandlerMap } from "./tool-helpers";
|
|
3
|
+
export type AggregatedEvents = {
|
|
4
|
+
contentText: string;
|
|
5
|
+
thinkingText: string;
|
|
6
|
+
stats: CompletionStats | undefined;
|
|
7
|
+
toolCalls: ToolCall[];
|
|
8
|
+
rawFullText: string | undefined;
|
|
9
|
+
error: CompletionError | undefined;
|
|
10
|
+
};
|
|
11
|
+
export declare function aggregateEvents(events: CompletionEvent[]): AggregatedEvents;
|
|
12
|
+
export declare function buildFinalFromEvents(events: CompletionEvent[], handlers: ToolHandlerMap): {
|
|
13
|
+
final: CompletionFinal;
|
|
14
|
+
error: CompletionError | undefined;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=aggregate-events.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { normalizeAssistantCacheContent } from "./cache-normalize.js";
|
|
2
|
+
import { attachHandlersToToolCalls, } from "./tool-helpers.js";
|
|
3
|
+
export function aggregateEvents(events) {
|
|
4
|
+
let contentText = "";
|
|
5
|
+
let thinkingText = "";
|
|
6
|
+
let stats;
|
|
7
|
+
let rawFullText;
|
|
8
|
+
let error;
|
|
9
|
+
const toolCalls = [];
|
|
10
|
+
for (const event of events) {
|
|
11
|
+
if (event.type === "contentDelta") {
|
|
12
|
+
contentText += event.text;
|
|
13
|
+
}
|
|
14
|
+
else if (event.type === "thinkingDelta") {
|
|
15
|
+
thinkingText += event.text;
|
|
16
|
+
}
|
|
17
|
+
else if (event.type === "completionStats") {
|
|
18
|
+
stats = event.stats;
|
|
19
|
+
}
|
|
20
|
+
else if (event.type === "toolCall") {
|
|
21
|
+
toolCalls.push(event.call);
|
|
22
|
+
}
|
|
23
|
+
else if (event.type === "completionDone") {
|
|
24
|
+
if ("raw" in event && event.raw) {
|
|
25
|
+
rawFullText = event.raw.fullText;
|
|
26
|
+
}
|
|
27
|
+
if (event.stopReason === "error" && "error" in event) {
|
|
28
|
+
error = event.error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { contentText, thinkingText, stats, toolCalls, rawFullText, error };
|
|
33
|
+
}
|
|
34
|
+
export function buildFinalFromEvents(events, handlers) {
|
|
35
|
+
const { contentText, thinkingText, stats, toolCalls, rawFullText, error } = aggregateEvents(events);
|
|
36
|
+
const attachedToolCalls = attachHandlersToToolCalls(toolCalls, handlers);
|
|
37
|
+
const fullText = rawFullText ?? contentText;
|
|
38
|
+
const cacheableAssistantContent = attachedToolCalls.length === 0
|
|
39
|
+
? normalizeAssistantCacheContent(fullText)
|
|
40
|
+
: undefined;
|
|
41
|
+
const final = {
|
|
42
|
+
contentText,
|
|
43
|
+
...(thinkingText && { thinkingText }),
|
|
44
|
+
toolCalls: attachedToolCalls,
|
|
45
|
+
...(stats && { stats }),
|
|
46
|
+
raw: { fullText },
|
|
47
|
+
...(cacheableAssistantContent !== undefined && {
|
|
48
|
+
cacheableAssistantContent,
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
return { final, error };
|
|
52
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonicalize assistant message text for the auto-cache key.
|
|
3
|
+
*
|
|
4
|
+
* The server saves raw stream text (with think tags when `captureThinking` is
|
|
5
|
+
* on), while `final.contentText` only aggregates `contentDelta` events.
|
|
6
|
+
* Stripping think blocks (paired and unclosed-trailing) and trimming lets
|
|
7
|
+
* callers push back either shape and still hit the cache.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeAssistantCacheContent(content: string): string;
|
|
10
|
+
//# sourceMappingURL=cache-normalize.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Shared by the auto-cache writer and reader on the server, and surfaced to
|
|
2
|
+
// clients as `final.cacheableAssistantContent` so the next turn's `history`
|
|
3
|
+
// produces a stable cache key.
|
|
4
|
+
// Case-insensitive in case a model variant emits `<Think>`; the addon uses
|
|
5
|
+
// lowercase today but we don't want a casing change to regress hit-rate.
|
|
6
|
+
const THINK_BLOCK_RE = /<think>[\s\S]*?<\/think>/gi;
|
|
7
|
+
// Trailing unclosed `<think>...` when a stop token interrupts mid-thought.
|
|
8
|
+
// Must run after THINK_BLOCK_RE so only a genuinely unclosed tail matches.
|
|
9
|
+
const UNCLOSED_TRAILING_THINK_RE = /<think>[\s\S]*$/i;
|
|
10
|
+
/**
|
|
11
|
+
* Canonicalize assistant message text for the auto-cache key.
|
|
12
|
+
*
|
|
13
|
+
* The server saves raw stream text (with think tags when `captureThinking` is
|
|
14
|
+
* on), while `final.contentText` only aggregates `contentDelta` events.
|
|
15
|
+
* Stripping think blocks (paired and unclosed-trailing) and trimming lets
|
|
16
|
+
* callers push back either shape and still hit the cache.
|
|
17
|
+
*/
|
|
18
|
+
export function normalizeAssistantCacheContent(content) {
|
|
19
|
+
return content
|
|
20
|
+
.replace(THINK_BLOCK_RE, "")
|
|
21
|
+
.replace(UNCLOSED_TRAILING_THINK_RE, "")
|
|
22
|
+
.trim();
|
|
23
|
+
}
|
package/dist/utils/encoding.d.ts
CHANGED
|
@@ -6,4 +6,12 @@
|
|
|
6
6
|
* provides a cross-platform alternative to Buffer.from(str, "base64").
|
|
7
7
|
*/
|
|
8
8
|
export declare function decodeBase64(base64: string): Uint8Array;
|
|
9
|
+
/**
|
|
10
|
+
* Encodes a Uint8Array to a base64 string.
|
|
11
|
+
*
|
|
12
|
+
* Uses btoa which is available across all runtimes (Node, Bare, React Native).
|
|
13
|
+
* Buffer is not globally available in React Native (Hermes engine), so this
|
|
14
|
+
* provides a cross-platform alternative to Buffer.from(bytes).toString("base64").
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodeBase64(bytes: Uint8Array): string;
|
|
9
17
|
//# sourceMappingURL=encoding.d.ts.map
|
package/dist/utils/encoding.js
CHANGED
|
@@ -12,3 +12,16 @@ export function decodeBase64(base64) {
|
|
|
12
12
|
bytes[i] = binary.charCodeAt(i);
|
|
13
13
|
return bytes;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Encodes a Uint8Array to a base64 string.
|
|
17
|
+
*
|
|
18
|
+
* Uses btoa which is available across all runtimes (Node, Bare, React Native).
|
|
19
|
+
* Buffer is not globally available in React Native (Hermes engine), so this
|
|
20
|
+
* provides a cross-platform alternative to Buffer.from(bytes).toString("base64").
|
|
21
|
+
*/
|
|
22
|
+
export function encodeBase64(bytes) {
|
|
23
|
+
let binary = "";
|
|
24
|
+
for (let i = 0; i < bytes.length; i++)
|
|
25
|
+
binary += String.fromCharCode(bytes[i]);
|
|
26
|
+
return btoa(binary);
|
|
27
|
+
}
|
|
@@ -20,6 +20,12 @@ export declare class InvalidToolSchemaError extends QvacErrorBase {
|
|
|
20
20
|
export declare class OCRFailedError extends QvacErrorBase {
|
|
21
21
|
constructor(details?: string, cause?: unknown);
|
|
22
22
|
}
|
|
23
|
+
export declare class ModelTypeRequiredError extends QvacErrorBase {
|
|
24
|
+
constructor(cause?: unknown);
|
|
25
|
+
}
|
|
26
|
+
export declare class ModelSrcTypeMismatchError extends QvacErrorBase {
|
|
27
|
+
constructor(inferred: string, resolved: string, cause?: unknown);
|
|
28
|
+
}
|
|
23
29
|
export declare class RPCNoHandlerError extends QvacErrorBase {
|
|
24
30
|
constructor(requestType: string, cause?: unknown);
|
|
25
31
|
}
|
|
@@ -32,6 +38,9 @@ export declare class RPCResponseStreamNotCreatedError extends QvacErrorBase {
|
|
|
32
38
|
export declare class RPCConnectionFailedError extends QvacErrorBase {
|
|
33
39
|
constructor(details: string, cause?: unknown);
|
|
34
40
|
}
|
|
41
|
+
export declare class RPCInitTimeoutError extends QvacErrorBase {
|
|
42
|
+
constructor(timeoutMs: number, cause?: unknown);
|
|
43
|
+
}
|
|
35
44
|
export declare class ProviderStartFailedError extends QvacErrorBase {
|
|
36
45
|
constructor(details?: string, cause?: unknown);
|
|
37
46
|
}
|
|
@@ -80,6 +89,9 @@ export declare class EmbedFailedError extends QvacErrorBase {
|
|
|
80
89
|
export declare class TranscriptionFailedError extends QvacErrorBase {
|
|
81
90
|
constructor(details?: string, cause?: unknown);
|
|
82
91
|
}
|
|
92
|
+
export declare class TextToSpeechStreamFailedError extends QvacErrorBase {
|
|
93
|
+
constructor(details?: string, cause?: unknown);
|
|
94
|
+
}
|
|
83
95
|
export declare class TranslationFailedError extends QvacErrorBase {
|
|
84
96
|
constructor(details?: string, cause?: unknown);
|
|
85
97
|
}
|
|
@@ -38,6 +38,16 @@ export class OCRFailedError extends QvacErrorBase {
|
|
|
38
38
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.OCR_FAILED, details ? [details] : undefined, cause));
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
+
export class ModelTypeRequiredError extends QvacErrorBase {
|
|
42
|
+
constructor(cause) {
|
|
43
|
+
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.MODEL_TYPE_REQUIRED, undefined, cause));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class ModelSrcTypeMismatchError extends QvacErrorBase {
|
|
47
|
+
constructor(inferred, resolved, cause) {
|
|
48
|
+
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.MODEL_SRC_TYPE_MISMATCH, [inferred, resolved], cause));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
41
51
|
// ============== RPC Communication Errors ==============
|
|
42
52
|
export class RPCNoHandlerError extends QvacErrorBase {
|
|
43
53
|
constructor(requestType, cause) {
|
|
@@ -59,6 +69,11 @@ export class RPCConnectionFailedError extends QvacErrorBase {
|
|
|
59
69
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.RPC_CONNECTION_FAILED, [details], cause));
|
|
60
70
|
}
|
|
61
71
|
}
|
|
72
|
+
export class RPCInitTimeoutError extends QvacErrorBase {
|
|
73
|
+
constructor(timeoutMs, cause) {
|
|
74
|
+
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.RPC_INIT_TIMEOUT, [timeoutMs], cause));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
62
77
|
// ============== Provider/Delegation Errors ==============
|
|
63
78
|
export class ProviderStartFailedError extends QvacErrorBase {
|
|
64
79
|
constructor(details, cause) {
|
|
@@ -144,6 +159,11 @@ export class TranscriptionFailedError extends QvacErrorBase {
|
|
|
144
159
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TRANSCRIPTION_FAILED, details ? [details] : undefined, cause));
|
|
145
160
|
}
|
|
146
161
|
}
|
|
162
|
+
export class TextToSpeechStreamFailedError extends QvacErrorBase {
|
|
163
|
+
constructor(details, cause) {
|
|
164
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TEXT_TO_SPEECH_STREAM_FAILED, details ? [details] : undefined, cause));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
147
167
|
export class TranslationFailedError extends QvacErrorBase {
|
|
148
168
|
constructor(details, cause) {
|
|
149
169
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TRANSLATION_FAILED, details ? [details] : undefined, cause));
|
|
@@ -68,12 +68,23 @@ export declare class CancelFailedError extends QvacErrorBase {
|
|
|
68
68
|
export declare class TextToSpeechFailedError extends QvacErrorBase {
|
|
69
69
|
constructor(details?: string, cause?: unknown);
|
|
70
70
|
}
|
|
71
|
+
export declare class TextToSpeechStreamFailedError extends QvacErrorBase {
|
|
72
|
+
constructor(details?: string, cause?: unknown);
|
|
73
|
+
}
|
|
71
74
|
export declare class ConfigReloadNotSupportedError extends QvacErrorBase {
|
|
72
75
|
constructor(modelId: string, cause?: unknown);
|
|
73
76
|
}
|
|
74
77
|
export declare class ModelTypeMismatchError extends QvacErrorBase {
|
|
75
78
|
constructor(expectedType: string, providedType: string, cause?: unknown);
|
|
76
79
|
}
|
|
80
|
+
export declare class ModelOperationNotSupportedError extends QvacErrorBase {
|
|
81
|
+
readonly modelId: string;
|
|
82
|
+
readonly modelType: string;
|
|
83
|
+
readonly operation: string;
|
|
84
|
+
readonly supportedOperations: readonly string[];
|
|
85
|
+
readonly suggestedModelTypes: readonly string[];
|
|
86
|
+
constructor(modelId: string, modelType: string, operation: string, supportedOperations: readonly string[], suggestedModelTypes: readonly string[], cause?: unknown);
|
|
87
|
+
}
|
|
77
88
|
export declare class OCRFailedError extends QvacErrorBase {
|
|
78
89
|
constructor(details?: string, cause?: unknown);
|
|
79
90
|
}
|
|
@@ -233,6 +244,9 @@ export declare class LifecycleSuspendFailedError extends QvacErrorBase {
|
|
|
233
244
|
export declare class LifecycleResumeFailedError extends QvacErrorBase {
|
|
234
245
|
constructor(details?: string, cause?: unknown);
|
|
235
246
|
}
|
|
247
|
+
export declare class LifecycleOperationBlockedError extends QvacErrorBase {
|
|
248
|
+
constructor(requestType: string, lifecycleState: string);
|
|
249
|
+
}
|
|
236
250
|
export declare class PathTraversalError extends QvacErrorBase {
|
|
237
251
|
constructor(component: string, basePath: string, cause?: unknown);
|
|
238
252
|
}
|
|
@@ -120,6 +120,11 @@ export class TextToSpeechFailedError extends QvacErrorBase {
|
|
|
120
120
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TEXT_TO_SPEECH_FAILED, details ? [details] : undefined, cause));
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
+
export class TextToSpeechStreamFailedError extends QvacErrorBase {
|
|
124
|
+
constructor(details, cause) {
|
|
125
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TEXT_TO_SPEECH_STREAM_FAILED, details ? [details] : undefined, cause));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
123
128
|
export class ConfigReloadNotSupportedError extends QvacErrorBase {
|
|
124
129
|
constructor(modelId, cause) {
|
|
125
130
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.CONFIG_RELOAD_NOT_SUPPORTED, [modelId], cause));
|
|
@@ -130,6 +135,27 @@ export class ModelTypeMismatchError extends QvacErrorBase {
|
|
|
130
135
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.MODEL_TYPE_MISMATCH, [expectedType, providedType], cause));
|
|
131
136
|
}
|
|
132
137
|
}
|
|
138
|
+
export class ModelOperationNotSupportedError extends QvacErrorBase {
|
|
139
|
+
modelId;
|
|
140
|
+
modelType;
|
|
141
|
+
operation;
|
|
142
|
+
supportedOperations;
|
|
143
|
+
suggestedModelTypes;
|
|
144
|
+
constructor(modelId, modelType, operation, supportedOperations, suggestedModelTypes, cause) {
|
|
145
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.MODEL_OPERATION_NOT_SUPPORTED, [
|
|
146
|
+
modelId,
|
|
147
|
+
modelType,
|
|
148
|
+
operation,
|
|
149
|
+
supportedOperations.join(", "),
|
|
150
|
+
suggestedModelTypes.join(", "),
|
|
151
|
+
], cause));
|
|
152
|
+
this.modelId = modelId;
|
|
153
|
+
this.modelType = modelType;
|
|
154
|
+
this.operation = operation;
|
|
155
|
+
this.supportedOperations = supportedOperations;
|
|
156
|
+
this.suggestedModelTypes = suggestedModelTypes;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
133
159
|
export class OCRFailedError extends QvacErrorBase {
|
|
134
160
|
constructor(details, cause) {
|
|
135
161
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.OCR_FAILED, details ? [details] : undefined, cause));
|
|
@@ -407,6 +433,11 @@ export class LifecycleResumeFailedError extends QvacErrorBase {
|
|
|
407
433
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.LIFECYCLE_RESUME_FAILED, details ? [details] : undefined, cause));
|
|
408
434
|
}
|
|
409
435
|
}
|
|
436
|
+
export class LifecycleOperationBlockedError extends QvacErrorBase {
|
|
437
|
+
constructor(requestType, lifecycleState) {
|
|
438
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.LIFECYCLE_OPERATION_BLOCKED, [requestType, lifecycleState]));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
410
441
|
// ============== Security Errors ==============
|
|
411
442
|
export class PathTraversalError extends QvacErrorBase {
|
|
412
443
|
constructor(component, basePath, cause) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Throws {@link ModelSrcTypeMismatchError} when explicit
|
|
3
|
+
* `modelType` disagrees with the type inferred from `modelSrc`.
|
|
4
|
+
* No-op when nothing can be inferred.
|
|
5
|
+
*/
|
|
6
|
+
export declare function assertModelSrcMatchesModelType(modelSrc: unknown, explicitModelType: string): void;
|
|
7
|
+
//# sourceMappingURL=load-model-validation.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { inferModelTypeFromModelSrc } from "../schemas/model-src-utils.js";
|
|
2
|
+
import { normalizeModelType } from "../schemas/model-types.js";
|
|
3
|
+
import { ModelSrcTypeMismatchError } from "./errors-client.js";
|
|
4
|
+
/**
|
|
5
|
+
* Throws {@link ModelSrcTypeMismatchError} when explicit
|
|
6
|
+
* `modelType` disagrees with the type inferred from `modelSrc`.
|
|
7
|
+
* No-op when nothing can be inferred.
|
|
8
|
+
*/
|
|
9
|
+
export function assertModelSrcMatchesModelType(modelSrc, explicitModelType) {
|
|
10
|
+
const inferred = inferModelTypeFromModelSrc(modelSrc);
|
|
11
|
+
if (!inferred)
|
|
12
|
+
return;
|
|
13
|
+
const normalizedInferred = normalizeModelType(inferred);
|
|
14
|
+
const normalizedExplicit = normalizeModelType(explicitModelType);
|
|
15
|
+
if (normalizedInferred !== normalizedExplicit) {
|
|
16
|
+
throw new ModelSrcTypeMismatchError(normalizedInferred, normalizedExplicit);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -54,7 +54,7 @@ if (fs.existsSync(manifestPath)) {
|
|
|
54
54
|
for await (const resource of link(
|
|
55
55
|
projectRoot,
|
|
56
56
|
{
|
|
57
|
-
|
|
57
|
+
hosts: ["android-arm64", "android-arm", "android-ia32", "android-x64"],
|
|
58
58
|
out: addonsDir,
|
|
59
59
|
},
|
|
60
60
|
pkg,
|
|
@@ -54,7 +54,7 @@ if (fs.existsSync(manifestPath)) {
|
|
|
54
54
|
for await (const resource of link(
|
|
55
55
|
projectRoot,
|
|
56
56
|
{
|
|
57
|
-
|
|
57
|
+
hosts: ["ios-arm64", "ios-arm64-simulator", "ios-x64-simulator"],
|
|
58
58
|
out: addonsDir,
|
|
59
59
|
},
|
|
60
60
|
pkg,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qvac/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -173,20 +173,19 @@
|
|
|
173
173
|
},
|
|
174
174
|
"dependencies": {
|
|
175
175
|
"@qvac/decoder-audio": "^0.3.7",
|
|
176
|
-
"@qvac/diffusion-cpp": "^0.
|
|
177
|
-
"@qvac/
|
|
178
|
-
"@qvac/embed-llamacpp": "^0.13.4",
|
|
176
|
+
"@qvac/diffusion-cpp": "^0.3.0",
|
|
177
|
+
"@qvac/embed-llamacpp": "^0.14.0",
|
|
179
178
|
"@qvac/error": "^0.1.1",
|
|
180
179
|
"@qvac/langdetect-text": "^0.1.2",
|
|
181
|
-
"@qvac/llm-llamacpp": "^0.
|
|
180
|
+
"@qvac/llm-llamacpp": "^0.17.1",
|
|
182
181
|
"@qvac/logging": "^0.1.0",
|
|
183
182
|
"@qvac/ocr-onnx": "^0.4.2",
|
|
184
183
|
"@qvac/rag": "^0.4.4",
|
|
185
|
-
"@qvac/registry-client": "^0.4.
|
|
184
|
+
"@qvac/registry-client": "^0.4.1",
|
|
186
185
|
"@qvac/transcription-parakeet": "^0.3.1",
|
|
187
186
|
"@qvac/transcription-whispercpp": "^0.6.1",
|
|
188
|
-
"@qvac/translation-nmtcpp": "^0.
|
|
189
|
-
"@qvac/tts-onnx": "^0.8.
|
|
187
|
+
"@qvac/translation-nmtcpp": "^2.0.1",
|
|
188
|
+
"@qvac/tts-onnx": "^0.8.4",
|
|
190
189
|
"fast-safe-stringify": "2.1.1",
|
|
191
190
|
"which-runtime": "^1.3.2",
|
|
192
191
|
"zod": "^4.3.0"
|
|
@@ -196,7 +195,7 @@
|
|
|
196
195
|
"@expo/config-plugins": "^54.0.4",
|
|
197
196
|
"@lancedb/lancedb": "^0.21.3",
|
|
198
197
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
199
|
-
"@qvac/cli": "^0.2.
|
|
198
|
+
"@qvac/cli": "^0.2.4",
|
|
200
199
|
"@sqliteai/sqlite-wasm": "3.50.4-sync.0.8.30-vector.0.9.23",
|
|
201
200
|
"@types/node": "^24.2.1",
|
|
202
201
|
"@types/tar-stream": "^3.1.4",
|
|
@@ -216,7 +215,7 @@
|
|
|
216
215
|
"hyperdb": "^4.16.1",
|
|
217
216
|
"pear-pipe": "^1.0.6",
|
|
218
217
|
"prettier": "^3.6.2",
|
|
219
|
-
"react-native-bare-kit": "
|
|
218
|
+
"react-native-bare-kit": "0.12.3",
|
|
220
219
|
"remark-cli": "^12.0.1",
|
|
221
220
|
"remark-code-import": "^1.2.0",
|
|
222
221
|
"remark-frontmatter": "^5.0.0",
|
|
@@ -227,16 +226,16 @@
|
|
|
227
226
|
},
|
|
228
227
|
"peerDependencies": {
|
|
229
228
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
230
|
-
"@qvac/cli": "^0.2.
|
|
229
|
+
"@qvac/cli": "^0.2.4",
|
|
231
230
|
"bare-abort-controller": "^1.0.0",
|
|
232
231
|
"bare-buffer": "^3.4.2",
|
|
233
232
|
"bare-crypto": "^1.13.4",
|
|
234
233
|
"bare-dns": "^2.1.4",
|
|
235
234
|
"bare-fetch": "^2.5.1",
|
|
236
|
-
"bare-fs": "^4.5.
|
|
235
|
+
"bare-fs": "^4.5.1",
|
|
237
236
|
"bare-http1": "^4.1.6",
|
|
238
237
|
"bare-https": "^2.1.3",
|
|
239
|
-
"bare-link": "^2.1
|
|
238
|
+
"bare-link": "^3.2.1",
|
|
240
239
|
"bare-net": "^2.2.0",
|
|
241
240
|
"bare-os": "^3.6.2",
|
|
242
241
|
"bare-path": "^3.0.0",
|
|
@@ -257,7 +256,7 @@
|
|
|
257
256
|
"hyperswarm": "^4.12.1",
|
|
258
257
|
"llm-splitter": "~0.2.0",
|
|
259
258
|
"pear-pipe": "^1.0.6",
|
|
260
|
-
"react-native-bare-kit": "
|
|
259
|
+
"react-native-bare-kit": "0.12.3",
|
|
261
260
|
"tar-stream": "^3.1.8"
|
|
262
261
|
},
|
|
263
262
|
"peerDependenciesMeta": {
|
|
@@ -286,8 +285,5 @@
|
|
|
286
285
|
"optional": true
|
|
287
286
|
}
|
|
288
287
|
},
|
|
289
|
-
"patchedDependencies": {}
|
|
290
|
-
"overrides": {
|
|
291
|
-
"@qvac/dl-hyperdrive": "^0.2.0"
|
|
292
|
-
}
|
|
288
|
+
"patchedDependencies": {}
|
|
293
289
|
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { loadModel, translate, unloadModel, MARIAN_OPUS_EN_IT_Q4_0, } from "@qvac/sdk";
|
|
2
|
-
try {
|
|
3
|
-
const modelId = await loadModel({
|
|
4
|
-
modelSrc: MARIAN_OPUS_EN_IT_Q4_0,
|
|
5
|
-
modelType: "nmt",
|
|
6
|
-
modelConfig: {
|
|
7
|
-
engine: "Opus",
|
|
8
|
-
from: "en",
|
|
9
|
-
to: "it",
|
|
10
|
-
temperature: 0.2,
|
|
11
|
-
norepeatngramsize: 3,
|
|
12
|
-
lengthpenalty: 1.2,
|
|
13
|
-
},
|
|
14
|
-
onProgress: (progress) => {
|
|
15
|
-
console.log(progress);
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
console.log(`✅ Model loaded: ${modelId}`);
|
|
19
|
-
const text = "Hello, how are you today?";
|
|
20
|
-
const result = translate({
|
|
21
|
-
modelId,
|
|
22
|
-
text,
|
|
23
|
-
modelType: "nmt",
|
|
24
|
-
stream: false,
|
|
25
|
-
});
|
|
26
|
-
const translatedText = await result.text;
|
|
27
|
-
console.log(`Translated text EN -> IT: ${text} -> "${translatedText}"`);
|
|
28
|
-
await unloadModel({ modelId });
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
console.error("❌ Error:", error);
|
|
32
|
-
process.exit(1);
|
|
33
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type FilesystemDL from "@qvac/dl-filesystem";
|
|
2
|
-
/**
|
|
3
|
-
* Adapts FilesystemDL to addon Loader interface by adding download stub.
|
|
4
|
-
* download() is never called when using filesystem loader.
|
|
5
|
-
*/
|
|
6
|
-
export declare function asLoader<T>(loader: FilesystemDL): T;
|
|
7
|
-
//# sourceMappingURL=loader-adapter.d.ts.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapts FilesystemDL to addon Loader interface by adding download stub.
|
|
3
|
-
* download() is never called when using filesystem loader.
|
|
4
|
-
*/
|
|
5
|
-
export function asLoader(loader) {
|
|
6
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
7
|
-
loader.download = () => Promise.reject(new Error("download not supported"));
|
|
8
|
-
return loader;
|
|
9
|
-
}
|