@qvac/sdk 0.6.1 → 0.7.1
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 +1 -24
- package/NOTICE +632 -0
- package/README.md +2 -1
- package/dist/client/api/embed.js +1 -4
- package/dist/client/api/get-model-info.d.ts +10 -3
- package/dist/client/api/index.d.ts +2 -0
- package/dist/client/api/index.js +2 -0
- package/dist/client/api/invoke-plugin.d.ts +14 -0
- package/dist/client/api/invoke-plugin.js +38 -0
- package/dist/client/api/registry.d.ts +14 -0
- package/dist/client/api/registry.js +37 -0
- package/dist/client/api/transcribe.js +0 -4
- package/dist/client/api/unload-model.js +1 -1
- package/dist/client/config-loader/resolve-config.node.d.ts +3 -2
- package/dist/client/config-loader/resolve-config.node.js +31 -4
- package/dist/client/init-hooks.js +2 -1
- package/dist/client/rpc/bare-client.d.ts +2 -0
- package/dist/client/rpc/bare-client.js +48 -7
- package/dist/client/rpc/expo-device-info.d.ts +6 -0
- package/dist/client/rpc/expo-device-info.js +32 -0
- package/dist/client/rpc/expo-rpc-client.js +9 -32
- package/dist/client/rpc/node-rpc-client.d.ts +1 -1
- package/dist/client/rpc/node-rpc-client.js +201 -28
- package/dist/client/rpc/rpc-client.d.ts +1 -1
- package/dist/client/rpc/rpc-client.js +2 -2
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/constants/registry.d.ts +2 -0
- package/dist/constants/registry.js +1 -0
- package/dist/examples/cache-management.js +2 -2
- package/dist/examples/config/plugins/plugins.config.d.ts +5 -0
- package/dist/examples/config/plugins/plugins.config.js +4 -0
- package/dist/examples/download-with-blind-relays.js +1 -1
- package/dist/examples/llamacpp-multimodal.js +3 -3
- package/dist/examples/llamacpp-native-tools.js +2 -2
- package/dist/examples/mcp-websearch.js +2 -2
- package/dist/examples/multi-model-demo.js +2 -2
- package/dist/examples/ocr-fasttext.js +4 -4
- package/dist/examples/parallel-download.js +2 -2
- package/dist/examples/plugins.d.ts +14 -0
- package/dist/examples/plugins.js +129 -0
- package/dist/examples/registry-query.d.ts +2 -0
- package/dist/examples/registry-query.js +87 -0
- package/dist/examples/translation/translation-bergamot-batch.js +2 -2
- package/dist/examples/translation/translation-bergamot.js +4 -4
- package/dist/examples/translation/translation-opus.js +2 -2
- package/dist/examples/translation/translation-stream.js +2 -2
- package/dist/examples/tts/chatterbox.d.ts +2 -0
- package/dist/examples/tts/chatterbox.js +59 -0
- package/dist/examples/tts/supertonic.d.ts +2 -0
- package/dist/examples/tts/supertonic.js +51 -0
- package/dist/examples/tts/utils.d.ts +17 -0
- package/dist/examples/tts/utils.js +93 -0
- package/dist/examples/whispercpp-filesystem.js +2 -3
- package/dist/examples/whispercpp-microphone-record.js +1 -2
- package/dist/examples/whispercpp-prompt.js +2 -3
- package/dist/expo/plugins/index.d.ts +3 -0
- package/dist/expo/plugins/index.js +3 -0
- package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +15 -0
- package/dist/expo/plugins/resolve-sdk-package-dir.js +31 -0
- package/dist/expo/plugins/withAndroidArchitecture.d.ts +8 -0
- package/dist/expo/plugins/withAndroidArchitecture.js +52 -0
- package/dist/expo/plugins/withAndroidNdkVersion.d.ts +8 -0
- package/dist/expo/plugins/withAndroidNdkVersion.js +31 -0
- package/dist/expo/plugins/withDeviceInfo.d.ts +10 -0
- package/dist/expo/plugins/withDeviceInfo.js +48 -0
- package/dist/expo/plugins/withMobileBundle.d.ts +5 -2
- package/dist/expo/plugins/withMobileBundle.js +121 -65
- package/dist/expo/plugins/withQvacSDK.d.ts +4 -0
- package/dist/expo/plugins/withQvacSDK.js +26 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/models/{hyperdrive → registry}/index.js +1 -1
- package/dist/models/registry/models.d.ts +9056 -0
- package/dist/models/registry/models.js +9351 -0
- package/dist/models/update-models/codegen.d.ts +3 -0
- package/dist/models/update-models/codegen.js +135 -0
- package/dist/models/update-models/history.d.ts +13 -0
- package/dist/models/update-models/history.js +88 -0
- package/dist/models/update-models/index.d.ts +2 -0
- package/dist/models/update-models/index.js +124 -0
- package/dist/models/update-models/naming.d.ts +4 -0
- package/dist/models/update-models/naming.js +314 -0
- package/dist/models/update-models/processing.d.ts +8 -0
- package/dist/models/update-models/processing.js +67 -0
- package/dist/models/update-models/registry.d.ts +4 -0
- package/dist/models/update-models/registry.js +67 -0
- package/dist/models/update-models/shards.d.ts +4 -0
- package/dist/models/update-models/shards.js +57 -0
- package/dist/models/update-models/types.d.ts +60 -0
- package/dist/models/update-models/types.js +1 -0
- package/dist/models/update-models/utils.d.ts +3 -0
- package/dist/models/update-models/utils.js +21 -0
- package/dist/pear/pre.d.ts +18 -0
- package/dist/pear/pre.js +433 -0
- package/dist/schemas/common.d.ts +286 -32
- package/dist/schemas/common.js +12 -0
- package/dist/schemas/download-asset.d.ts +35 -11
- package/dist/schemas/download-asset.js +5 -1
- package/dist/schemas/engine-addon-map.d.ts +5 -0
- package/dist/schemas/engine-addon-map.js +49 -0
- package/dist/schemas/get-model-info.d.ts +32 -16
- package/dist/schemas/get-model-info.js +17 -8
- package/dist/schemas/index.d.ts +4 -1
- package/dist/schemas/index.js +4 -4
- package/dist/schemas/load-model.d.ts +2224 -900
- package/dist/schemas/load-model.js +130 -25
- package/dist/schemas/model-src-utils.d.ts +30 -12
- package/dist/schemas/model-src-utils.js +5 -2
- package/dist/schemas/model-types.d.ts +15 -4
- package/dist/schemas/model-types.js +21 -4
- package/dist/schemas/path-validation.d.ts +10 -0
- package/dist/schemas/path-validation.js +22 -0
- package/dist/schemas/plugin.d.ts +180 -0
- package/dist/schemas/plugin.js +132 -0
- package/dist/schemas/rag.d.ts +2 -2
- package/dist/schemas/rag.js +7 -3
- package/dist/schemas/registry.d.ts +338 -0
- package/dist/schemas/registry.js +91 -0
- package/dist/schemas/sdk-errors-client.d.ts +6 -6
- package/dist/schemas/sdk-errors-client.js +15 -15
- package/dist/schemas/sdk-errors-registry.d.ts +6 -0
- package/dist/schemas/sdk-errors-registry.js +8 -0
- package/dist/schemas/sdk-errors-server.d.ts +16 -2
- package/dist/schemas/sdk-errors-server.js +90 -10
- package/dist/schemas/text-to-speech.d.ts +670 -1
- package/dist/schemas/text-to-speech.js +51 -2
- package/dist/schemas/translate.d.ts +2 -2
- package/dist/scripts/run-security-tests-bare.d.ts +2 -0
- package/dist/scripts/run-security-tests-bare.js +78 -0
- package/dist/scripts/run-security-tests.d.ts +2 -0
- package/dist/scripts/run-security-tests.js +22 -0
- package/dist/server/bare/delegate-rpc-client.d.ts +6 -0
- package/dist/server/bare/delegate-rpc-client.js +136 -56
- package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.d.ts +1 -1
- package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.js +3 -3
- package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.js +6 -6
- package/dist/server/bare/{addons → ops}/load-model.js +32 -42
- package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.d.ts +1 -1
- package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.js +5 -4
- package/dist/server/bare/plugins/index.d.ts +7 -0
- package/dist/server/bare/plugins/index.js +6 -0
- package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.js +1 -1
- package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.d.ts +1 -1
- package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.js +2 -3
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +115 -0
- package/dist/server/bare/plugins/llamacpp-completion/plugin.js +142 -0
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +24 -0
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +73 -0
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +45 -0
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +97 -0
- package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.js +2 -1
- package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +38 -0
- package/dist/server/bare/{addons/onnx-ocr/create-model.js → plugins/onnx-ocr/plugin.js} +39 -2
- package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.js +23 -1
- package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +26 -0
- package/dist/server/bare/plugins/onnx-tts/plugin.js +162 -0
- package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +14 -0
- package/dist/server/bare/plugins/onnx-tts/wav-helper.js +107 -0
- package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +3 -0
- package/dist/server/bare/{addons/whispercpp-transcription/handlers → plugins/whispercpp-transcription/ops}/transcribe-stream.js +1 -2
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +31 -0
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +74 -0
- package/dist/server/bare/rag-hyperdb/handlers/ingest.js +1 -1
- package/dist/server/bare/rag-hyperdb/handlers/search.js +1 -1
- package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -1
- package/dist/server/bare/registry/config-registry.js +1 -1
- package/dist/server/bare/registry/registry-client.d.ts +5 -0
- package/dist/server/bare/registry/registry-client.js +37 -0
- package/dist/server/env.d.ts +22 -0
- package/dist/server/env.js +57 -0
- package/dist/server/plugins/index.d.ts +2 -0
- package/dist/server/plugins/index.js +1 -0
- package/dist/server/plugins/registry.d.ts +9 -0
- package/dist/server/plugins/registry.js +75 -0
- package/dist/server/rpc/delegate-transport.d.ts +11 -0
- package/dist/server/rpc/delegate-transport.js +60 -0
- package/dist/server/rpc/handle-request.d.ts +0 -9
- package/dist/server/rpc/handle-request.js +13 -321
- package/dist/server/rpc/handler-registry.d.ts +3 -0
- package/dist/server/rpc/handler-registry.js +84 -0
- package/dist/server/rpc/handler-utils.d.ts +22 -0
- package/dist/server/rpc/handler-utils.js +87 -0
- package/dist/server/rpc/handlers/cancelHandler.js +1 -1
- package/dist/server/rpc/handlers/completion-stream-delegated.js +1 -1
- package/dist/server/rpc/handlers/completion-stream.js +2 -43
- package/dist/server/rpc/handlers/delete-cache.js +1 -1
- package/dist/server/rpc/handlers/embed.js +2 -21
- package/dist/server/rpc/handlers/get-model-info.js +19 -15
- package/dist/server/rpc/handlers/index.d.ts +9 -0
- package/dist/server/rpc/handlers/index.js +9 -0
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
- package/dist/server/rpc/handlers/load-model/download-manager.js +3 -0
- package/dist/server/rpc/handlers/load-model/handler.js +47 -24
- package/dist/server/rpc/handlers/load-model/http.js +3 -2
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +14 -10
- package/dist/server/rpc/handlers/load-model/registry.d.ts +10 -0
- package/dist/server/rpc/handlers/load-model/registry.js +571 -0
- package/dist/server/rpc/handlers/load-model/resolve.js +18 -5
- package/dist/server/rpc/handlers/load-model-delegated.js +4 -2
- package/dist/server/rpc/handlers/ocr-stream.js +2 -37
- package/dist/server/rpc/handlers/ping.d.ts +3 -0
- package/dist/server/rpc/handlers/ping.js +3 -0
- package/dist/server/rpc/handlers/plugin-dispatch.d.ts +15 -0
- package/dist/server/rpc/handlers/plugin-dispatch.js +54 -0
- package/dist/server/rpc/handlers/plugin-invoke.d.ts +4 -0
- package/dist/server/rpc/handlers/plugin-invoke.js +87 -0
- package/dist/server/rpc/handlers/registry.d.ts +5 -0
- package/dist/server/rpc/handlers/registry.js +157 -0
- package/dist/server/rpc/handlers/text-to-speech.js +2 -5
- package/dist/server/rpc/handlers/transcribe-stream.js +2 -30
- package/dist/server/rpc/handlers/translate.js +2 -42
- package/dist/server/rpc/handlers/unload-model.js +1 -1
- package/dist/server/rpc/index.d.ts +1 -1
- package/dist/server/utils/archive.d.ts +1 -0
- package/dist/server/utils/archive.js +10 -2
- package/dist/server/utils/cache.d.ts +5 -0
- package/dist/server/utils/cache.js +26 -2
- package/dist/server/utils/gguf-tensor-extractor.js +3 -3
- package/dist/server/utils/index.d.ts +1 -1
- package/dist/server/utils/index.js +1 -1
- package/dist/server/utils/path-security.d.ts +12 -0
- package/dist/server/utils/path-security.js +25 -0
- package/dist/server/utils/shard-utils.js +3 -3
- package/dist/server/worker-core.d.ts +6 -0
- package/dist/server/worker-core.js +88 -0
- package/dist/server/worker.d.ts +4 -5
- package/dist/server/worker.js +18 -116
- package/dist/utils/errors-client.d.ts +9 -6
- package/dist/utils/errors-client.js +19 -11
- package/dist/utils/errors-server.d.ts +44 -5
- package/dist/utils/errors-server.js +82 -9
- package/dist/utils/path-sanitize.d.ts +17 -0
- package/dist/utils/path-sanitize.js +54 -0
- package/expo/plugins/patches/android-link.mjs +63 -0
- package/expo/plugins/patches/ios-link.mjs +63 -0
- package/package.json +72 -10
- package/dist/examples/text-to-speech.d.ts +0 -3
- package/dist/examples/text-to-speech.js +0 -137
- package/dist/models/hyperdrive/models.d.ts +0 -4003
- package/dist/models/hyperdrive/models.js +0 -4282
- package/dist/server/bare/addons/index.d.ts +0 -4
- package/dist/server/bare/addons/index.js +0 -3
- package/dist/server/bare/addons/llamacpp-completion/create-model.d.ts +0 -8
- package/dist/server/bare/addons/llamacpp-completion/create-model.js +0 -43
- package/dist/server/bare/addons/llamacpp-completion/index.d.ts +0 -4
- package/dist/server/bare/addons/llamacpp-completion/index.js +0 -3
- package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +0 -8
- package/dist/server/bare/addons/llamacpp-embedding/create-model.js +0 -38
- package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +0 -3
- package/dist/server/bare/addons/llamacpp-embedding/index.js +0 -2
- package/dist/server/bare/addons/nmtcpp-translation/create-model.d.ts +0 -8
- package/dist/server/bare/addons/nmtcpp-translation/create-model.js +0 -52
- package/dist/server/bare/addons/nmtcpp-translation/index.d.ts +0 -3
- package/dist/server/bare/addons/nmtcpp-translation/index.js +0 -2
- package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +0 -10
- package/dist/server/bare/addons/onnx-ocr/index.d.ts +0 -3
- package/dist/server/bare/addons/onnx-ocr/index.js +0 -2
- package/dist/server/bare/addons/onnx-tts/create-model.d.ts +0 -10
- package/dist/server/bare/addons/onnx-tts/create-model.js +0 -25
- package/dist/server/bare/addons/onnx-tts/index.d.ts +0 -3
- package/dist/server/bare/addons/onnx-tts/index.js +0 -2
- package/dist/server/bare/addons/whispercpp-transcription/create-model.d.ts +0 -10
- package/dist/server/bare/addons/whispercpp-transcription/create-model.js +0 -37
- package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.d.ts +0 -3
- package/dist/server/bare/addons/whispercpp-transcription/index.d.ts +0 -3
- package/dist/server/bare/addons/whispercpp-transcription/index.js +0 -2
- /package/dist/models/{hyperdrive → registry}/index.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/cancel.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/cancel.js +0 -0
- /package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/load-model.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/unload-model.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/unload-model.js +0 -0
- /package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.d.ts +0 -0
- /package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.d.ts +0 -0
- /package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.d.ts +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ModelLoadFailedError, InvalidShardUrlPatternError, } from "../../utils/errors-server.js";
|
|
2
2
|
import { generateShortHash } from "./formatting.js";
|
|
3
|
+
import { validateAndJoinPath } from "./path-security.js";
|
|
3
4
|
import { extractAndWriteTensorsFile } from "./gguf-tensor-extractor.js";
|
|
4
5
|
import { promises as fsPromises } from "bare-fs";
|
|
5
|
-
import path from "bare-path";
|
|
6
6
|
/**
|
|
7
7
|
* Detect if model filename follows shard pattern (00001-of-0000x)
|
|
8
8
|
*/
|
|
@@ -96,7 +96,7 @@ export async function checkAllShardsExist(shardDir, shardFilename) {
|
|
|
96
96
|
}
|
|
97
97
|
const shardFilenames = generateShardFilenames(shardFilename);
|
|
98
98
|
const allShardsExist = await Promise.all(shardFilenames.map((f) => fsPromises
|
|
99
|
-
.access(
|
|
99
|
+
.access(validateAndJoinPath(shardDir, f))
|
|
100
100
|
.then(() => true)
|
|
101
101
|
.catch(() => false))).then((results) => results.every((exists) => exists));
|
|
102
102
|
return allShardsExist;
|
|
@@ -118,7 +118,7 @@ export async function validateShardedModelCache(shardDir, shardFilename) {
|
|
|
118
118
|
}
|
|
119
119
|
const tensorsFile = `${shardInfo.baseFilename}.tensors.txt`;
|
|
120
120
|
const tensorsExist = await fsPromises
|
|
121
|
-
.access(
|
|
121
|
+
.access(validateAndJoinPath(shardDir, tensorsFile))
|
|
122
122
|
.then(() => true)
|
|
123
123
|
.catch(() => false);
|
|
124
124
|
return tensorsExist;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import process from "bare-process";
|
|
2
|
+
import { createBareKitRPCServer, createIPCClient, } from "./rpc/create-server.js";
|
|
3
|
+
import { destroySwarm } from "./bare/hyperswarm.js";
|
|
4
|
+
import { initEnv, getValidatedEnv } from "./env.js";
|
|
5
|
+
import { closeAllRagInstances } from "./bare/rag-hyperdb/index.js";
|
|
6
|
+
import { cleanupDownloads } from "./rpc/handlers/load-model/download-manager.js";
|
|
7
|
+
import { unloadAllModels } from "./bare/registry/model-registry.js";
|
|
8
|
+
import { closeRegistryClient } from "./bare/registry/registry-client.js";
|
|
9
|
+
import { clearAllLoggingStreams, startLogBuffering, } from "./bare/registry/logging-stream-registry.js";
|
|
10
|
+
import { clearAllAddonLoggers, getServerLogger, SDK_LOG_ID } from "../logging/index.js";
|
|
11
|
+
import { clearPlugins } from "./plugins/index.js";
|
|
12
|
+
let coreInitialized = false;
|
|
13
|
+
let rpcInitialized = false;
|
|
14
|
+
let isShuttingDown = false;
|
|
15
|
+
const logger = getServerLogger();
|
|
16
|
+
export function initializeWorkerCore() {
|
|
17
|
+
if (coreInitialized) {
|
|
18
|
+
const validatedEnv = getValidatedEnv();
|
|
19
|
+
return { hasRPCConfig: !!validatedEnv.QVAC_IPC_SOCKET_PATH };
|
|
20
|
+
}
|
|
21
|
+
startLogBuffering(SDK_LOG_ID);
|
|
22
|
+
const { hasRPCConfig } = initEnv();
|
|
23
|
+
setupShutdownHandlers();
|
|
24
|
+
coreInitialized = true;
|
|
25
|
+
logger.debug("Worker core initialized");
|
|
26
|
+
logger.debug("Arguments to worker:", process.argv);
|
|
27
|
+
return { hasRPCConfig };
|
|
28
|
+
}
|
|
29
|
+
export function ensureRPCSetup() {
|
|
30
|
+
if (rpcInitialized)
|
|
31
|
+
return;
|
|
32
|
+
if (!coreInitialized) {
|
|
33
|
+
initializeWorkerCore();
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const validatedEnv = getValidatedEnv();
|
|
37
|
+
const ipcSocketPath = validatedEnv.QVAC_IPC_SOCKET_PATH;
|
|
38
|
+
if (ipcSocketPath) {
|
|
39
|
+
logger.info(`Running in desktop mode, connecting to IPC socket: ${ipcSocketPath}`);
|
|
40
|
+
const rpc = createIPCClient(ipcSocketPath);
|
|
41
|
+
logger.debug("Desktop IPC client created?", !!rpc);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
logger.info("Running in BareKit IPC mode");
|
|
45
|
+
createBareKitRPCServer();
|
|
46
|
+
}
|
|
47
|
+
logger.info("Bare worker started and listening for RPC requests");
|
|
48
|
+
logger.debug("Working directory:", process.cwd());
|
|
49
|
+
rpcInitialized = true;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error("Worker error:", error);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function isCoreInitialized() {
|
|
57
|
+
return coreInitialized;
|
|
58
|
+
}
|
|
59
|
+
function clearRegistries() {
|
|
60
|
+
clearAllLoggingStreams();
|
|
61
|
+
clearAllAddonLoggers();
|
|
62
|
+
clearPlugins();
|
|
63
|
+
}
|
|
64
|
+
function setupShutdownHandlers() {
|
|
65
|
+
const shutdownHandler = async () => {
|
|
66
|
+
if (isShuttingDown)
|
|
67
|
+
return;
|
|
68
|
+
isShuttingDown = true;
|
|
69
|
+
logger.info("🐻 Bare worker shutdown signal received, cleaning up...");
|
|
70
|
+
try {
|
|
71
|
+
clearRegistries();
|
|
72
|
+
await Promise.allSettled([
|
|
73
|
+
destroySwarm(),
|
|
74
|
+
closeAllRagInstances(),
|
|
75
|
+
cleanupDownloads(),
|
|
76
|
+
unloadAllModels(),
|
|
77
|
+
closeRegistryClient(),
|
|
78
|
+
]);
|
|
79
|
+
logger.info("✅ Cleanup completed successfully");
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.error("❌ Error during shutdown cleanup:", error);
|
|
83
|
+
}
|
|
84
|
+
process.exit(0);
|
|
85
|
+
};
|
|
86
|
+
process.once("SIGTERM", () => void shutdownHandler());
|
|
87
|
+
process.once("SIGINT", () => void shutdownHandler());
|
|
88
|
+
}
|
package/dist/server/worker.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
export declare function ensureRPCSetup(): void;
|
|
1
|
+
/**
|
|
2
|
+
* Default worker entry point that registers ALL built-in plugins.
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
6
5
|
//# sourceMappingURL=worker.d.ts.map
|
package/dist/server/worker.js
CHANGED
|
@@ -1,87 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import { clearAllLoggingStreams, startLogBuffering, } from "./bare/registry/logging-stream-registry.js";
|
|
10
|
-
import { ADDON_NAMESPACES, createAddonLoggerCallback, clearAllAddonLoggers, getServerLogger, SDK_LOG_ID, } from "../logging/index.js";
|
|
11
|
-
import llmAddonLogging from "@qvac/llm-llamacpp/addonLogging.js";
|
|
12
|
-
import embedAddonLogging from "@qvac/embed-llamacpp/addonLogging.js";
|
|
13
|
-
import ttsAddonLogging from "@qvac/tts-onnx/addonLogging.js";
|
|
14
|
-
import whisperAddonLogging from "@qvac/transcription-whispercpp/addonLogging.js";
|
|
15
|
-
import nmtAddonLogging from "@qvac/translation-nmtcpp/addonLogging.js";
|
|
16
|
-
// Buffer SDK logs from startup so clients can receive them when they subscribe
|
|
17
|
-
startLogBuffering(SDK_LOG_ID);
|
|
1
|
+
/**
|
|
2
|
+
* Default worker entry point that registers ALL built-in plugins.
|
|
3
|
+
*/
|
|
4
|
+
import { initializeWorkerCore, ensureRPCSetup } from "./worker-core.js";
|
|
5
|
+
import { registerPlugin } from "./plugins/index.js";
|
|
6
|
+
import { getServerLogger } from "../logging/index.js";
|
|
7
|
+
import { llmPlugin, embeddingsPlugin, whisperPlugin, nmtPlugin, ttsPlugin, ocrPlugin, } from "./bare/plugins/index.js";
|
|
8
|
+
const { hasRPCConfig } = initializeWorkerCore();
|
|
18
9
|
const logger = getServerLogger();
|
|
19
10
|
logger.info("🐻 Hello from Bare");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (isBareKit && process.argv[0]) {
|
|
31
|
-
logger.info("Running in BareKit mode");
|
|
32
|
-
envConfig["HOME_DIR"] = process.argv[0];
|
|
33
|
-
}
|
|
34
|
-
// Try to parse any argument as JSON config (fail gracefully)
|
|
35
|
-
if (process.argv[2]) {
|
|
36
|
-
try {
|
|
37
|
-
const rpcArgs = JSON.parse(process.argv[2]);
|
|
38
|
-
envConfig = { ...envConfig, ...rpcArgs };
|
|
39
|
-
hasRPCConfig = true;
|
|
40
|
-
logger.info("Parsed RPC configuration from arguments");
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// Not JSON or invalid - use defaults (direct mode)
|
|
44
|
-
logger.info("Using default configuration (direct mode)");
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
const validatedEnv = z
|
|
48
|
-
.object({
|
|
49
|
-
QVAC_IPC_SOCKET_PATH: z.string().optional(),
|
|
50
|
-
HOME_DIR: z.string(),
|
|
51
|
-
})
|
|
52
|
-
.parse(envConfig);
|
|
53
|
-
export function getEnv() {
|
|
54
|
-
return {
|
|
55
|
-
...process.env,
|
|
56
|
-
...validatedEnv,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
let rpcInitialized = false;
|
|
60
|
-
export function ensureRPCSetup() {
|
|
61
|
-
if (rpcInitialized)
|
|
62
|
-
return;
|
|
63
|
-
try {
|
|
64
|
-
const ipcSocketPath = validatedEnv.QVAC_IPC_SOCKET_PATH;
|
|
65
|
-
if (ipcSocketPath) {
|
|
66
|
-
logger.info(`Running in desktop mode, connecting to IPC socket: ${ipcSocketPath}`);
|
|
67
|
-
// Connect to the IPC server (Named Pipe or Unix Socket)
|
|
68
|
-
const rpc = createIPCClient(ipcSocketPath);
|
|
69
|
-
logger.debug("Desktop IPC client created?", !!rpc);
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
logger.info("Running in BareKit IPC mode");
|
|
73
|
-
// Start the standard RPC server with BareKit IPC for mobile
|
|
74
|
-
createBareKitRPCServer();
|
|
75
|
-
}
|
|
76
|
-
logger.info("Bare worker started and listening for RPC requests");
|
|
77
|
-
logger.debug("Working directory:", process.cwd());
|
|
78
|
-
rpcInitialized = true;
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
logger.error("Worker error:", error);
|
|
82
|
-
process.exit(1);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
11
|
+
// Register all built-in plugins
|
|
12
|
+
registerPlugin(llmPlugin);
|
|
13
|
+
registerPlugin(embeddingsPlugin);
|
|
14
|
+
registerPlugin(whisperPlugin);
|
|
15
|
+
registerPlugin(nmtPlugin);
|
|
16
|
+
registerPlugin(ttsPlugin);
|
|
17
|
+
registerPlugin(ocrPlugin);
|
|
18
|
+
logger.info(hasRPCConfig
|
|
19
|
+
? "Parsed RPC configuration from arguments"
|
|
20
|
+
: "Using default configuration (direct mode)");
|
|
85
21
|
// Auto-setup RPC only if we successfully parsed RPC configuration
|
|
86
22
|
if (hasRPCConfig) {
|
|
87
23
|
ensureRPCSetup();
|
|
@@ -89,37 +25,3 @@ if (hasRPCConfig) {
|
|
|
89
25
|
else {
|
|
90
26
|
logger.info("Running in direct mode - RPC setup will be lazy");
|
|
91
27
|
}
|
|
92
|
-
// Centralized logger cleanup
|
|
93
|
-
function clearLoggers() {
|
|
94
|
-
clearAllLoggingStreams();
|
|
95
|
-
clearAllAddonLoggers();
|
|
96
|
-
llmAddonLogging.releaseLogger();
|
|
97
|
-
embedAddonLogging.releaseLogger();
|
|
98
|
-
ttsAddonLogging.releaseLogger();
|
|
99
|
-
whisperAddonLogging.releaseLogger();
|
|
100
|
-
nmtAddonLogging.releaseLogger();
|
|
101
|
-
}
|
|
102
|
-
// Centralized cleanup for graceful shutdown
|
|
103
|
-
let isShuttingDown = false;
|
|
104
|
-
async function shutdownHandler() {
|
|
105
|
-
if (isShuttingDown)
|
|
106
|
-
return;
|
|
107
|
-
isShuttingDown = true;
|
|
108
|
-
logger.info("🐻 Bare worker shutdown signal received, cleaning up...");
|
|
109
|
-
try {
|
|
110
|
-
clearLoggers();
|
|
111
|
-
await Promise.allSettled([
|
|
112
|
-
destroySwarm(),
|
|
113
|
-
closeAllRagInstances(),
|
|
114
|
-
cleanupDownloads(),
|
|
115
|
-
unloadAllModels(),
|
|
116
|
-
]);
|
|
117
|
-
logger.info("✅ Cleanup completed successfully");
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
logger.error("❌ Error during shutdown cleanup:", error);
|
|
121
|
-
}
|
|
122
|
-
process.exit(0);
|
|
123
|
-
}
|
|
124
|
-
process.once("SIGTERM", () => void shutdownHandler());
|
|
125
|
-
process.once("SIGINT", () => void shutdownHandler());
|
|
@@ -8,9 +8,6 @@ export declare class InvalidOperationError extends QvacErrorBase {
|
|
|
8
8
|
export declare class StreamEndedError extends QvacErrorBase {
|
|
9
9
|
constructor(cause?: unknown);
|
|
10
10
|
}
|
|
11
|
-
export declare class NoDataReceivedError extends QvacErrorBase {
|
|
12
|
-
constructor(cause?: unknown);
|
|
13
|
-
}
|
|
14
11
|
export declare class InvalidAudioChunkError extends QvacErrorBase {
|
|
15
12
|
constructor(cause?: unknown);
|
|
16
13
|
}
|
|
@@ -35,9 +32,6 @@ export declare class RPCResponseStreamNotCreatedError extends QvacErrorBase {
|
|
|
35
32
|
export declare class RPCConnectionFailedError extends QvacErrorBase {
|
|
36
33
|
constructor(details: string, cause?: unknown);
|
|
37
34
|
}
|
|
38
|
-
export declare class UnknownRequestTypeError extends QvacErrorBase {
|
|
39
|
-
constructor(cause?: unknown);
|
|
40
|
-
}
|
|
41
35
|
export declare class ProviderStartFailedError extends QvacErrorBase {
|
|
42
36
|
constructor(details?: string, cause?: unknown);
|
|
43
37
|
}
|
|
@@ -56,9 +50,15 @@ export declare class DelegateConnectionFailedError extends QvacErrorBase {
|
|
|
56
50
|
export declare class SDKNotFoundInNodeModulesError extends QvacErrorBase {
|
|
57
51
|
constructor(cause?: unknown);
|
|
58
52
|
}
|
|
53
|
+
export declare class MultipleSDKInstallationsError extends QvacErrorBase {
|
|
54
|
+
constructor(packages: string, cause?: unknown);
|
|
55
|
+
}
|
|
59
56
|
export declare class WorkerFileNotFoundError extends QvacErrorBase {
|
|
60
57
|
constructor(workerPath: string, cause?: unknown);
|
|
61
58
|
}
|
|
59
|
+
export declare class PearWorkerEntryRequiredError extends QvacErrorBase {
|
|
60
|
+
constructor(workerEntry: string, cause?: unknown);
|
|
61
|
+
}
|
|
62
62
|
export declare class ConfigFileNotFoundError extends QvacErrorBase {
|
|
63
63
|
constructor(searchPaths: string, cause?: unknown);
|
|
64
64
|
}
|
|
@@ -128,4 +128,7 @@ export declare class InvalidDeleteCacheParamsError extends QvacErrorBase {
|
|
|
128
128
|
export declare class SetConfigFailedError extends QvacErrorBase {
|
|
129
129
|
constructor(details?: string, cause?: unknown);
|
|
130
130
|
}
|
|
131
|
+
export declare class ModelRegistryQueryFailedError extends QvacErrorBase {
|
|
132
|
+
constructor(details?: string, cause?: unknown);
|
|
133
|
+
}
|
|
131
134
|
//# sourceMappingURL=errors-client.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { QvacErrorBase } from "@qvac/error";
|
|
2
2
|
import { SDK_CLIENT_ERROR_CODES } from "../schemas/sdk-errors-client.js";
|
|
3
|
+
import { SDK_SERVER_ERROR_CODES } from "../schemas/sdk-errors-server.js";
|
|
3
4
|
import { createErrorOptions } from "./errors-base.js";
|
|
4
5
|
// ============== Response Validation Errors ==============
|
|
5
6
|
export class InvalidResponseError extends QvacErrorBase {
|
|
@@ -17,11 +18,6 @@ export class StreamEndedError extends QvacErrorBase {
|
|
|
17
18
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.STREAM_ENDED_WITHOUT_RESPONSE, undefined, cause));
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
export class NoDataReceivedError extends QvacErrorBase {
|
|
21
|
-
constructor(cause) {
|
|
22
|
-
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.NO_DATA_RECEIVED, undefined, cause));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
21
|
export class InvalidAudioChunkError extends QvacErrorBase {
|
|
26
22
|
constructor(cause) {
|
|
27
23
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.INVALID_AUDIO_CHUNK_TYPE, undefined, cause));
|
|
@@ -63,11 +59,6 @@ export class RPCConnectionFailedError extends QvacErrorBase {
|
|
|
63
59
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.RPC_CONNECTION_FAILED, [details], cause));
|
|
64
60
|
}
|
|
65
61
|
}
|
|
66
|
-
export class UnknownRequestTypeError extends QvacErrorBase {
|
|
67
|
-
constructor(cause) {
|
|
68
|
-
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.UNKNOWN_REQUEST_TYPE, undefined, cause));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
62
|
// ============== Provider/Delegation Errors ==============
|
|
72
63
|
export class ProviderStartFailedError extends QvacErrorBase {
|
|
73
64
|
constructor(details, cause) {
|
|
@@ -100,11 +91,21 @@ export class SDKNotFoundInNodeModulesError extends QvacErrorBase {
|
|
|
100
91
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.SDK_NOT_FOUND_IN_NODE_MODULES, undefined, cause));
|
|
101
92
|
}
|
|
102
93
|
}
|
|
94
|
+
export class MultipleSDKInstallationsError extends QvacErrorBase {
|
|
95
|
+
constructor(packages, cause) {
|
|
96
|
+
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.MULTIPLE_SDK_INSTALLATIONS, [packages], cause));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
103
99
|
export class WorkerFileNotFoundError extends QvacErrorBase {
|
|
104
100
|
constructor(workerPath, cause) {
|
|
105
101
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.WORKER_FILE_NOT_FOUND, [workerPath], cause));
|
|
106
102
|
}
|
|
107
103
|
}
|
|
104
|
+
export class PearWorkerEntryRequiredError extends QvacErrorBase {
|
|
105
|
+
constructor(workerEntry, cause) {
|
|
106
|
+
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.PEAR_WORKER_ENTRY_REQUIRED, [workerEntry], cause));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
108
109
|
export class ConfigFileNotFoundError extends QvacErrorBase {
|
|
109
110
|
constructor(searchPaths, cause) {
|
|
110
111
|
super(createErrorOptions(SDK_CLIENT_ERROR_CODES.CONFIG_FILE_NOT_FOUND, [searchPaths], cause));
|
|
@@ -128,7 +129,6 @@ export class ConfigValidationFailedError extends QvacErrorBase {
|
|
|
128
129
|
// ============== Operation Errors (Client-side wrappers for server operations) ==============
|
|
129
130
|
// These are used by client API to throw errors based on server responses
|
|
130
131
|
// They reference server error codes but are thrown on client side
|
|
131
|
-
import { SDK_SERVER_ERROR_CODES } from "../schemas/sdk-errors-server.js";
|
|
132
132
|
export class ModelUnloadFailedError extends QvacErrorBase {
|
|
133
133
|
constructor(modelId, cause) {
|
|
134
134
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.MODEL_UNLOAD_FAILED, modelId ? [modelId] : undefined, cause));
|
|
@@ -224,3 +224,11 @@ export class SetConfigFailedError extends QvacErrorBase {
|
|
|
224
224
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.SET_CONFIG_FAILED, details ? [details] : undefined, cause));
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
|
+
// ============== QVAC Model Registry Operation Errors ==============
|
|
228
|
+
// Registry client errors (19,001-20,000) are re-thrown directly from @qvac/registry-client
|
|
229
|
+
// Only SDK-specific errors are defined here
|
|
230
|
+
export class ModelRegistryQueryFailedError extends QvacErrorBase {
|
|
231
|
+
constructor(details, cause) {
|
|
232
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.QVAC_MODEL_REGISTRY_QUERY_FAILED, details ? [details] : undefined, cause));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
@@ -11,9 +11,6 @@ export declare class ModelNotLoadedError extends QvacErrorBase {
|
|
|
11
11
|
export declare class ModelIsDelegatedError extends QvacErrorBase {
|
|
12
12
|
constructor(modelId: string, cause?: unknown);
|
|
13
13
|
}
|
|
14
|
-
export declare class UnknownModelTypeError extends QvacErrorBase {
|
|
15
|
-
constructor(modelType: string, cause?: unknown);
|
|
16
|
-
}
|
|
17
14
|
export declare class ModelLoadFailedError extends QvacErrorBase {
|
|
18
15
|
constructor(details?: string, cause?: unknown);
|
|
19
16
|
}
|
|
@@ -32,10 +29,10 @@ export declare class ProjectionModelRequiredError extends QvacErrorBase {
|
|
|
32
29
|
export declare class VADModelRequiredError extends QvacErrorBase {
|
|
33
30
|
constructor(cause?: unknown);
|
|
34
31
|
}
|
|
35
|
-
export declare class
|
|
32
|
+
export declare class TtsArtifactsRequiredError extends QvacErrorBase {
|
|
36
33
|
constructor(cause?: unknown);
|
|
37
34
|
}
|
|
38
|
-
export declare class
|
|
35
|
+
export declare class TtsReferenceAudioRequiredError extends QvacErrorBase {
|
|
39
36
|
constructor(cause?: unknown);
|
|
40
37
|
}
|
|
41
38
|
export declare class ModelUnloadFailedError extends QvacErrorBase {
|
|
@@ -128,6 +125,9 @@ export declare class SeedingNotSupportedError extends QvacErrorBase {
|
|
|
128
125
|
export declare class HyperdriveDownloadFailedError extends QvacErrorBase {
|
|
129
126
|
constructor(details: string, cause?: unknown);
|
|
130
127
|
}
|
|
128
|
+
export declare class RegistryDownloadFailedError extends QvacErrorBase {
|
|
129
|
+
constructor(details: string, cause?: unknown);
|
|
130
|
+
}
|
|
131
131
|
export declare class InvalidShardUrlPatternError extends QvacErrorBase {
|
|
132
132
|
constructor(url: string, cause?: unknown);
|
|
133
133
|
}
|
|
@@ -185,4 +185,43 @@ export declare class DelegateNoFinalResponseError extends QvacErrorBase {
|
|
|
185
185
|
export declare class DelegateConnectionFailedError extends QvacErrorBase {
|
|
186
186
|
constructor(details: string, cause?: unknown);
|
|
187
187
|
}
|
|
188
|
+
export declare class DelegateProviderError extends QvacErrorBase {
|
|
189
|
+
constructor(details: string, providerCode?: number, cause?: unknown);
|
|
190
|
+
}
|
|
191
|
+
export declare class RPCNoDataReceivedError extends QvacErrorBase {
|
|
192
|
+
constructor(cause?: unknown);
|
|
193
|
+
}
|
|
194
|
+
export declare class RPCUnknownRequestTypeError extends QvacErrorBase {
|
|
195
|
+
constructor(requestType: string, cause?: unknown);
|
|
196
|
+
}
|
|
197
|
+
export declare class PluginNotFoundError extends QvacErrorBase {
|
|
198
|
+
constructor(modelType: string, cause?: unknown);
|
|
199
|
+
}
|
|
200
|
+
export declare class PluginHandlerNotFoundError extends QvacErrorBase {
|
|
201
|
+
constructor(modelType: string, handler: string, availableHandlers?: string[], cause?: unknown);
|
|
202
|
+
}
|
|
203
|
+
export declare class PluginRequestValidationFailedError extends QvacErrorBase {
|
|
204
|
+
constructor(handler: string, details?: string, cause?: unknown);
|
|
205
|
+
}
|
|
206
|
+
export declare class PluginResponseValidationFailedError extends QvacErrorBase {
|
|
207
|
+
constructor(handler: string, details?: string, cause?: unknown);
|
|
208
|
+
}
|
|
209
|
+
export declare class PluginAlreadyRegisteredError extends QvacErrorBase {
|
|
210
|
+
constructor(modelType: string, cause?: unknown);
|
|
211
|
+
}
|
|
212
|
+
export declare class PluginHandlerTypeMismatchError extends QvacErrorBase {
|
|
213
|
+
constructor(handlerName: string, expected: string, actual: string, cause?: unknown);
|
|
214
|
+
}
|
|
215
|
+
export declare class PluginLoggingInvalidError extends QvacErrorBase {
|
|
216
|
+
constructor(modelType: string, reason: string, cause?: unknown);
|
|
217
|
+
}
|
|
218
|
+
export declare class PluginDefinitionInvalidError extends QvacErrorBase {
|
|
219
|
+
constructor(modelType: string, details: string, cause?: unknown);
|
|
220
|
+
}
|
|
221
|
+
export declare class PathTraversalError extends QvacErrorBase {
|
|
222
|
+
constructor(component: string, basePath: string, cause?: unknown);
|
|
223
|
+
}
|
|
224
|
+
export declare class ModelRegistryQueryFailedError extends QvacErrorBase {
|
|
225
|
+
constructor(details?: string, cause?: unknown);
|
|
226
|
+
}
|
|
188
227
|
//# sourceMappingURL=errors-server.d.ts.map
|
|
@@ -22,11 +22,6 @@ export class ModelIsDelegatedError extends QvacErrorBase {
|
|
|
22
22
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.MODEL_IS_DELEGATED, [modelId], cause));
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
export class UnknownModelTypeError extends QvacErrorBase {
|
|
26
|
-
constructor(modelType, cause) {
|
|
27
|
-
super(createErrorOptions(SDK_SERVER_ERROR_CODES.UNKNOWN_MODEL_TYPE, [modelType], cause));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
25
|
// ============== Model Loading Errors ==============
|
|
31
26
|
export class ModelLoadFailedError extends QvacErrorBase {
|
|
32
27
|
constructor(details, cause) {
|
|
@@ -58,14 +53,14 @@ export class VADModelRequiredError extends QvacErrorBase {
|
|
|
58
53
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.VAD_MODEL_REQUIRED, undefined, cause));
|
|
59
54
|
}
|
|
60
55
|
}
|
|
61
|
-
export class
|
|
56
|
+
export class TtsArtifactsRequiredError extends QvacErrorBase {
|
|
62
57
|
constructor(cause) {
|
|
63
|
-
super(createErrorOptions(SDK_SERVER_ERROR_CODES.
|
|
58
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TTS_ARTIFACTS_REQUIRED, undefined, cause));
|
|
64
59
|
}
|
|
65
60
|
}
|
|
66
|
-
export class
|
|
61
|
+
export class TtsReferenceAudioRequiredError extends QvacErrorBase {
|
|
67
62
|
constructor(cause) {
|
|
68
|
-
super(createErrorOptions(SDK_SERVER_ERROR_CODES.
|
|
63
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.TTS_REFERENCE_AUDIO_REQUIRED, undefined, cause));
|
|
69
64
|
}
|
|
70
65
|
}
|
|
71
66
|
// ============== Model Unloading Errors ==============
|
|
@@ -222,6 +217,11 @@ export class HyperdriveDownloadFailedError extends QvacErrorBase {
|
|
|
222
217
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.HYPERDRIVE_DOWNLOAD_FAILED, [details], cause));
|
|
223
218
|
}
|
|
224
219
|
}
|
|
220
|
+
export class RegistryDownloadFailedError extends QvacErrorBase {
|
|
221
|
+
constructor(details, cause) {
|
|
222
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.REGISTRY_DOWNLOAD_FAILED, [details], cause));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
225
|
export class InvalidShardUrlPatternError extends QvacErrorBase {
|
|
226
226
|
constructor(url, cause) {
|
|
227
227
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.INVALID_SHARD_URL_PATTERN, [url], cause));
|
|
@@ -322,3 +322,76 @@ export class DelegateConnectionFailedError extends QvacErrorBase {
|
|
|
322
322
|
super(createErrorOptions(SDK_SERVER_ERROR_CODES.DELEGATE_CONNECTION_FAILED, [details], cause));
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
|
+
export class DelegateProviderError extends QvacErrorBase {
|
|
326
|
+
constructor(details, providerCode, cause) {
|
|
327
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.DELEGATE_PROVIDER_ERROR, providerCode !== undefined
|
|
328
|
+
? [details, String(providerCode)]
|
|
329
|
+
: [details], cause));
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
export class RPCNoDataReceivedError extends QvacErrorBase {
|
|
333
|
+
constructor(cause) {
|
|
334
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.RPC_NO_DATA_RECEIVED, undefined, cause));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
export class RPCUnknownRequestTypeError extends QvacErrorBase {
|
|
338
|
+
constructor(requestType, cause) {
|
|
339
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.RPC_UNKNOWN_REQUEST_TYPE, [requestType], cause));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// ============== Plugin Errors ==============
|
|
343
|
+
export class PluginNotFoundError extends QvacErrorBase {
|
|
344
|
+
constructor(modelType, cause) {
|
|
345
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_NOT_FOUND, [modelType], cause));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
export class PluginHandlerNotFoundError extends QvacErrorBase {
|
|
349
|
+
constructor(modelType, handler, availableHandlers, cause) {
|
|
350
|
+
const serializedHandlers = availableHandlers?.join(", ") ?? "";
|
|
351
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_HANDLER_NOT_FOUND, [modelType, handler, serializedHandlers], cause));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
export class PluginRequestValidationFailedError extends QvacErrorBase {
|
|
355
|
+
constructor(handler, details, cause) {
|
|
356
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_REQUEST_VALIDATION_FAILED, details ? [handler, details] : [handler], cause));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
export class PluginResponseValidationFailedError extends QvacErrorBase {
|
|
360
|
+
constructor(handler, details, cause) {
|
|
361
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_RESPONSE_VALIDATION_FAILED, details ? [handler, details] : [handler], cause));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
export class PluginAlreadyRegisteredError extends QvacErrorBase {
|
|
365
|
+
constructor(modelType, cause) {
|
|
366
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_ALREADY_REGISTERED, [modelType], cause));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
export class PluginHandlerTypeMismatchError extends QvacErrorBase {
|
|
370
|
+
constructor(handlerName, expected, actual, cause) {
|
|
371
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_HANDLER_TYPE_MISMATCH, [handlerName, expected, actual], cause));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
export class PluginLoggingInvalidError extends QvacErrorBase {
|
|
375
|
+
constructor(modelType, reason, cause) {
|
|
376
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_LOGGING_INVALID, [modelType, reason], cause));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
export class PluginDefinitionInvalidError extends QvacErrorBase {
|
|
380
|
+
constructor(modelType, details, cause) {
|
|
381
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PLUGIN_DEFINITION_INVALID, [modelType, details], cause));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// ============== Security Errors ==============
|
|
385
|
+
export class PathTraversalError extends QvacErrorBase {
|
|
386
|
+
constructor(component, basePath, cause) {
|
|
387
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.PATH_TRAVERSAL, [component, basePath], cause));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// ============== QVAC Model Registry Operation Errors ==============
|
|
391
|
+
// Registry client errors (19,001-20,000) are re-thrown directly from @qvac/registry-client
|
|
392
|
+
// Only SDK-specific errors are defined here
|
|
393
|
+
export class ModelRegistryQueryFailedError extends QvacErrorBase {
|
|
394
|
+
constructor(details, cause) {
|
|
395
|
+
super(createErrorOptions(SDK_SERVER_ERROR_CODES.QVAC_MODEL_REGISTRY_QUERY_FAILED, details ? [details] : undefined, cause));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure string sanitization for path components. No runtime-specific dependencies.
|
|
3
|
+
* Safe to import from both Bare (server) and Bun/Node (tests, client).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize a path component that will be joined to a base directory.
|
|
7
|
+
* Strips traversal sequences, absolute prefixes, and normalizes separators.
|
|
8
|
+
*
|
|
9
|
+
* Throws on null bytes (literal or URL-encoded).
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizePathComponent(component: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Check whether a resolved target path is contained within a base directory.
|
|
14
|
+
* Portable — caller provides the resolve function and separator for their runtime.
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkPathWithinBase(basePath: string, targetPath: string, resolveFn: (...args: string[]) => string, sep: string): boolean;
|
|
17
|
+
//# sourceMappingURL=path-sanitize.d.ts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure string sanitization for path components. No runtime-specific dependencies.
|
|
3
|
+
* Safe to import from both Bare (server) and Bun/Node (tests, client).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Sanitize a path component that will be joined to a base directory.
|
|
7
|
+
* Strips traversal sequences, absolute prefixes, and normalizes separators.
|
|
8
|
+
*
|
|
9
|
+
* Throws on null bytes (literal or URL-encoded).
|
|
10
|
+
*/
|
|
11
|
+
export function sanitizePathComponent(component) {
|
|
12
|
+
if (component === "")
|
|
13
|
+
return "";
|
|
14
|
+
// Reject null bytes (literal and URL-encoded)
|
|
15
|
+
if (component.includes("\0") || component.includes("%00")) {
|
|
16
|
+
throw new Error(`Path component contains null byte: ${component}`);
|
|
17
|
+
}
|
|
18
|
+
let sanitized = component;
|
|
19
|
+
// Decode common URL-encoded traversal sequences
|
|
20
|
+
sanitized = sanitized
|
|
21
|
+
.replace(/%2e/gi, ".")
|
|
22
|
+
.replace(/%2f/gi, "/")
|
|
23
|
+
.replace(/%5c/gi, "\\");
|
|
24
|
+
// Normalize backslashes to forward slashes
|
|
25
|
+
sanitized = sanitized.replace(/\\/g, "/");
|
|
26
|
+
// Strip Windows drive letter prefixes (C:/, D:/, etc.)
|
|
27
|
+
sanitized = sanitized.replace(/^[A-Za-z]:\//, "");
|
|
28
|
+
// Strip leading slashes (absolute path prefixes)
|
|
29
|
+
sanitized = sanitized.replace(/^\/+/, "");
|
|
30
|
+
// Remove all ".." segments (start, middle, end) iteratively until stable
|
|
31
|
+
let prev = "";
|
|
32
|
+
while (prev !== sanitized) {
|
|
33
|
+
prev = sanitized;
|
|
34
|
+
sanitized = sanitized.replace(/^\.\.\//g, "");
|
|
35
|
+
sanitized = sanitized.replace(/\/\.\.$/g, "");
|
|
36
|
+
sanitized = sanitized.replace(/\/\.\.\//g, "/");
|
|
37
|
+
if (sanitized === "..")
|
|
38
|
+
sanitized = "";
|
|
39
|
+
}
|
|
40
|
+
// Strip any remaining leading slashes produced by stripping
|
|
41
|
+
sanitized = sanitized.replace(/^\/+/, "");
|
|
42
|
+
return sanitized;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check whether a resolved target path is contained within a base directory.
|
|
46
|
+
* Portable — caller provides the resolve function and separator for their runtime.
|
|
47
|
+
*/
|
|
48
|
+
export function checkPathWithinBase(basePath, targetPath, resolveFn, sep) {
|
|
49
|
+
const resolvedBase = resolveFn(basePath);
|
|
50
|
+
const resolvedTarget = resolveFn(targetPath);
|
|
51
|
+
if (resolvedTarget === resolvedBase)
|
|
52
|
+
return true;
|
|
53
|
+
return resolvedTarget.startsWith(resolvedBase + sep);
|
|
54
|
+
}
|