@qvac/sdk 0.6.1 → 0.7.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.
Files changed (277) hide show
  1. package/LICENSE +1 -24
  2. package/NOTICE +632 -0
  3. package/README.md +2 -1
  4. package/dist/client/api/embed.js +1 -4
  5. package/dist/client/api/get-model-info.d.ts +10 -3
  6. package/dist/client/api/index.d.ts +2 -0
  7. package/dist/client/api/index.js +2 -0
  8. package/dist/client/api/invoke-plugin.d.ts +14 -0
  9. package/dist/client/api/invoke-plugin.js +38 -0
  10. package/dist/client/api/registry.d.ts +14 -0
  11. package/dist/client/api/registry.js +37 -0
  12. package/dist/client/api/transcribe.js +0 -4
  13. package/dist/client/api/unload-model.js +1 -1
  14. package/dist/client/config-loader/resolve-config.node.d.ts +3 -2
  15. package/dist/client/config-loader/resolve-config.node.js +31 -4
  16. package/dist/client/init-hooks.js +2 -1
  17. package/dist/client/rpc/bare-client.d.ts +2 -0
  18. package/dist/client/rpc/bare-client.js +48 -7
  19. package/dist/client/rpc/expo-device-info.d.ts +6 -0
  20. package/dist/client/rpc/expo-device-info.js +32 -0
  21. package/dist/client/rpc/expo-rpc-client.js +9 -32
  22. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  23. package/dist/client/rpc/node-rpc-client.js +201 -28
  24. package/dist/client/rpc/rpc-client.d.ts +1 -1
  25. package/dist/client/rpc/rpc-client.js +2 -2
  26. package/dist/constants/index.d.ts +1 -0
  27. package/dist/constants/index.js +1 -0
  28. package/dist/constants/registry.d.ts +2 -0
  29. package/dist/constants/registry.js +1 -0
  30. package/dist/examples/cache-management.js +2 -2
  31. package/dist/examples/config/plugins/plugins.config.d.ts +5 -0
  32. package/dist/examples/config/plugins/plugins.config.js +4 -0
  33. package/dist/examples/download-with-blind-relays.js +1 -1
  34. package/dist/examples/llamacpp-multimodal.js +3 -3
  35. package/dist/examples/llamacpp-native-tools.js +2 -2
  36. package/dist/examples/mcp-websearch.js +2 -2
  37. package/dist/examples/multi-model-demo.js +2 -2
  38. package/dist/examples/ocr-fasttext.js +4 -4
  39. package/dist/examples/parallel-download.js +2 -2
  40. package/dist/examples/plugins.d.ts +14 -0
  41. package/dist/examples/plugins.js +129 -0
  42. package/dist/examples/registry-query.d.ts +2 -0
  43. package/dist/examples/registry-query.js +87 -0
  44. package/dist/examples/translation/translation-bergamot-batch.js +2 -2
  45. package/dist/examples/translation/translation-bergamot.js +4 -4
  46. package/dist/examples/translation/translation-opus.js +2 -2
  47. package/dist/examples/translation/translation-stream.js +2 -2
  48. package/dist/examples/tts/chatterbox.d.ts +2 -0
  49. package/dist/examples/tts/chatterbox.js +59 -0
  50. package/dist/examples/tts/supertonic.d.ts +2 -0
  51. package/dist/examples/tts/supertonic.js +51 -0
  52. package/dist/examples/tts/utils.d.ts +17 -0
  53. package/dist/examples/tts/utils.js +93 -0
  54. package/dist/examples/whispercpp-filesystem.js +2 -3
  55. package/dist/examples/whispercpp-microphone-record.js +1 -2
  56. package/dist/examples/whispercpp-prompt.js +2 -3
  57. package/dist/expo/plugins/index.d.ts +3 -0
  58. package/dist/expo/plugins/index.js +3 -0
  59. package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +15 -0
  60. package/dist/expo/plugins/resolve-sdk-package-dir.js +31 -0
  61. package/dist/expo/plugins/withAndroidArchitecture.d.ts +8 -0
  62. package/dist/expo/plugins/withAndroidArchitecture.js +52 -0
  63. package/dist/expo/plugins/withAndroidNdkVersion.d.ts +8 -0
  64. package/dist/expo/plugins/withAndroidNdkVersion.js +31 -0
  65. package/dist/expo/plugins/withDeviceInfo.d.ts +10 -0
  66. package/dist/expo/plugins/withDeviceInfo.js +48 -0
  67. package/dist/expo/plugins/withMobileBundle.d.ts +5 -2
  68. package/dist/expo/plugins/withMobileBundle.js +121 -65
  69. package/dist/expo/plugins/withQvacSDK.d.ts +4 -0
  70. package/dist/expo/plugins/withQvacSDK.js +26 -1
  71. package/dist/index.d.ts +4 -4
  72. package/dist/index.js +5 -5
  73. package/dist/models/{hyperdrive → registry}/index.js +1 -1
  74. package/dist/models/registry/models.d.ts +9056 -0
  75. package/dist/models/registry/models.js +9351 -0
  76. package/dist/models/update-models/codegen.d.ts +3 -0
  77. package/dist/models/update-models/codegen.js +135 -0
  78. package/dist/models/update-models/history.d.ts +13 -0
  79. package/dist/models/update-models/history.js +88 -0
  80. package/dist/models/update-models/index.d.ts +2 -0
  81. package/dist/models/update-models/index.js +124 -0
  82. package/dist/models/update-models/naming.d.ts +4 -0
  83. package/dist/models/update-models/naming.js +314 -0
  84. package/dist/models/update-models/processing.d.ts +8 -0
  85. package/dist/models/update-models/processing.js +67 -0
  86. package/dist/models/update-models/registry.d.ts +4 -0
  87. package/dist/models/update-models/registry.js +67 -0
  88. package/dist/models/update-models/shards.d.ts +4 -0
  89. package/dist/models/update-models/shards.js +57 -0
  90. package/dist/models/update-models/types.d.ts +60 -0
  91. package/dist/models/update-models/types.js +1 -0
  92. package/dist/models/update-models/utils.d.ts +3 -0
  93. package/dist/models/update-models/utils.js +21 -0
  94. package/dist/pear/pre.d.ts +18 -0
  95. package/dist/pear/pre.js +433 -0
  96. package/dist/schemas/common.d.ts +286 -32
  97. package/dist/schemas/common.js +12 -0
  98. package/dist/schemas/download-asset.d.ts +35 -11
  99. package/dist/schemas/download-asset.js +5 -1
  100. package/dist/schemas/engine-addon-map.d.ts +5 -0
  101. package/dist/schemas/engine-addon-map.js +49 -0
  102. package/dist/schemas/get-model-info.d.ts +32 -16
  103. package/dist/schemas/get-model-info.js +17 -8
  104. package/dist/schemas/index.d.ts +4 -1
  105. package/dist/schemas/index.js +4 -4
  106. package/dist/schemas/load-model.d.ts +2224 -900
  107. package/dist/schemas/load-model.js +130 -25
  108. package/dist/schemas/model-src-utils.d.ts +30 -12
  109. package/dist/schemas/model-src-utils.js +5 -2
  110. package/dist/schemas/model-types.d.ts +15 -4
  111. package/dist/schemas/model-types.js +21 -4
  112. package/dist/schemas/path-validation.d.ts +10 -0
  113. package/dist/schemas/path-validation.js +22 -0
  114. package/dist/schemas/plugin.d.ts +180 -0
  115. package/dist/schemas/plugin.js +132 -0
  116. package/dist/schemas/rag.d.ts +2 -2
  117. package/dist/schemas/rag.js +7 -3
  118. package/dist/schemas/registry.d.ts +338 -0
  119. package/dist/schemas/registry.js +91 -0
  120. package/dist/schemas/sdk-errors-client.d.ts +6 -6
  121. package/dist/schemas/sdk-errors-client.js +15 -15
  122. package/dist/schemas/sdk-errors-registry.d.ts +6 -0
  123. package/dist/schemas/sdk-errors-registry.js +8 -0
  124. package/dist/schemas/sdk-errors-server.d.ts +16 -2
  125. package/dist/schemas/sdk-errors-server.js +90 -10
  126. package/dist/schemas/text-to-speech.d.ts +670 -1
  127. package/dist/schemas/text-to-speech.js +51 -2
  128. package/dist/schemas/translate.d.ts +2 -2
  129. package/dist/scripts/run-security-tests-bare.d.ts +2 -0
  130. package/dist/scripts/run-security-tests-bare.js +78 -0
  131. package/dist/scripts/run-security-tests.d.ts +2 -0
  132. package/dist/scripts/run-security-tests.js +22 -0
  133. package/dist/server/bare/delegate-rpc-client.d.ts +6 -0
  134. package/dist/server/bare/delegate-rpc-client.js +136 -56
  135. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.d.ts +1 -1
  136. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.js +3 -3
  137. package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.js +6 -6
  138. package/dist/server/bare/{addons → ops}/load-model.js +32 -42
  139. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.d.ts +1 -1
  140. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.js +5 -4
  141. package/dist/server/bare/plugins/index.d.ts +7 -0
  142. package/dist/server/bare/plugins/index.js +6 -0
  143. package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.js +1 -1
  144. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.d.ts +1 -1
  145. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.js +2 -3
  146. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +115 -0
  147. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +142 -0
  148. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +24 -0
  149. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +73 -0
  150. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +45 -0
  151. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +97 -0
  152. package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.js +2 -1
  153. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +38 -0
  154. package/dist/server/bare/{addons/onnx-ocr/create-model.js → plugins/onnx-ocr/plugin.js} +39 -2
  155. package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.js +23 -1
  156. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +26 -0
  157. package/dist/server/bare/plugins/onnx-tts/plugin.js +162 -0
  158. package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +14 -0
  159. package/dist/server/bare/plugins/onnx-tts/wav-helper.js +107 -0
  160. package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +3 -0
  161. package/dist/server/bare/{addons/whispercpp-transcription/handlers → plugins/whispercpp-transcription/ops}/transcribe-stream.js +1 -2
  162. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +31 -0
  163. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +74 -0
  164. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +1 -1
  165. package/dist/server/bare/rag-hyperdb/handlers/search.js +1 -1
  166. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -1
  167. package/dist/server/bare/registry/config-registry.js +1 -1
  168. package/dist/server/bare/registry/registry-client.d.ts +5 -0
  169. package/dist/server/bare/registry/registry-client.js +37 -0
  170. package/dist/server/env.d.ts +22 -0
  171. package/dist/server/env.js +57 -0
  172. package/dist/server/plugins/index.d.ts +2 -0
  173. package/dist/server/plugins/index.js +1 -0
  174. package/dist/server/plugins/registry.d.ts +9 -0
  175. package/dist/server/plugins/registry.js +75 -0
  176. package/dist/server/rpc/delegate-transport.d.ts +11 -0
  177. package/dist/server/rpc/delegate-transport.js +60 -0
  178. package/dist/server/rpc/handle-request.d.ts +0 -9
  179. package/dist/server/rpc/handle-request.js +13 -321
  180. package/dist/server/rpc/handler-registry.d.ts +3 -0
  181. package/dist/server/rpc/handler-registry.js +84 -0
  182. package/dist/server/rpc/handler-utils.d.ts +22 -0
  183. package/dist/server/rpc/handler-utils.js +87 -0
  184. package/dist/server/rpc/handlers/cancelHandler.js +1 -1
  185. package/dist/server/rpc/handlers/completion-stream-delegated.js +1 -1
  186. package/dist/server/rpc/handlers/completion-stream.js +2 -43
  187. package/dist/server/rpc/handlers/delete-cache.js +1 -1
  188. package/dist/server/rpc/handlers/embed.js +2 -21
  189. package/dist/server/rpc/handlers/get-model-info.js +19 -15
  190. package/dist/server/rpc/handlers/index.d.ts +9 -0
  191. package/dist/server/rpc/handlers/index.js +9 -0
  192. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
  193. package/dist/server/rpc/handlers/load-model/download-manager.js +3 -0
  194. package/dist/server/rpc/handlers/load-model/handler.js +47 -24
  195. package/dist/server/rpc/handlers/load-model/http.js +3 -2
  196. package/dist/server/rpc/handlers/load-model/hyperdrive.js +14 -10
  197. package/dist/server/rpc/handlers/load-model/registry.d.ts +10 -0
  198. package/dist/server/rpc/handlers/load-model/registry.js +571 -0
  199. package/dist/server/rpc/handlers/load-model/resolve.js +18 -5
  200. package/dist/server/rpc/handlers/load-model-delegated.js +4 -2
  201. package/dist/server/rpc/handlers/ocr-stream.js +2 -37
  202. package/dist/server/rpc/handlers/ping.d.ts +3 -0
  203. package/dist/server/rpc/handlers/ping.js +3 -0
  204. package/dist/server/rpc/handlers/plugin-dispatch.d.ts +15 -0
  205. package/dist/server/rpc/handlers/plugin-dispatch.js +54 -0
  206. package/dist/server/rpc/handlers/plugin-invoke.d.ts +4 -0
  207. package/dist/server/rpc/handlers/plugin-invoke.js +87 -0
  208. package/dist/server/rpc/handlers/registry.d.ts +5 -0
  209. package/dist/server/rpc/handlers/registry.js +157 -0
  210. package/dist/server/rpc/handlers/text-to-speech.js +2 -5
  211. package/dist/server/rpc/handlers/transcribe-stream.js +2 -30
  212. package/dist/server/rpc/handlers/translate.js +2 -42
  213. package/dist/server/rpc/handlers/unload-model.js +1 -1
  214. package/dist/server/rpc/index.d.ts +1 -1
  215. package/dist/server/utils/archive.d.ts +1 -0
  216. package/dist/server/utils/archive.js +10 -2
  217. package/dist/server/utils/cache.d.ts +5 -0
  218. package/dist/server/utils/cache.js +26 -2
  219. package/dist/server/utils/gguf-tensor-extractor.js +3 -3
  220. package/dist/server/utils/index.d.ts +1 -1
  221. package/dist/server/utils/index.js +1 -1
  222. package/dist/server/utils/path-security.d.ts +12 -0
  223. package/dist/server/utils/path-security.js +25 -0
  224. package/dist/server/utils/shard-utils.js +3 -3
  225. package/dist/server/worker-core.d.ts +6 -0
  226. package/dist/server/worker-core.js +88 -0
  227. package/dist/server/worker.d.ts +4 -5
  228. package/dist/server/worker.js +18 -116
  229. package/dist/utils/errors-client.d.ts +9 -6
  230. package/dist/utils/errors-client.js +19 -11
  231. package/dist/utils/errors-server.d.ts +44 -5
  232. package/dist/utils/errors-server.js +82 -9
  233. package/dist/utils/path-sanitize.d.ts +17 -0
  234. package/dist/utils/path-sanitize.js +54 -0
  235. package/expo/plugins/patches/android-link.mjs +63 -0
  236. package/expo/plugins/patches/ios-link.mjs +63 -0
  237. package/package.json +72 -10
  238. package/dist/examples/text-to-speech.d.ts +0 -3
  239. package/dist/examples/text-to-speech.js +0 -137
  240. package/dist/models/hyperdrive/models.d.ts +0 -4003
  241. package/dist/models/hyperdrive/models.js +0 -4282
  242. package/dist/server/bare/addons/index.d.ts +0 -4
  243. package/dist/server/bare/addons/index.js +0 -3
  244. package/dist/server/bare/addons/llamacpp-completion/create-model.d.ts +0 -8
  245. package/dist/server/bare/addons/llamacpp-completion/create-model.js +0 -43
  246. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +0 -4
  247. package/dist/server/bare/addons/llamacpp-completion/index.js +0 -3
  248. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +0 -8
  249. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +0 -38
  250. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +0 -3
  251. package/dist/server/bare/addons/llamacpp-embedding/index.js +0 -2
  252. package/dist/server/bare/addons/nmtcpp-translation/create-model.d.ts +0 -8
  253. package/dist/server/bare/addons/nmtcpp-translation/create-model.js +0 -52
  254. package/dist/server/bare/addons/nmtcpp-translation/index.d.ts +0 -3
  255. package/dist/server/bare/addons/nmtcpp-translation/index.js +0 -2
  256. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +0 -10
  257. package/dist/server/bare/addons/onnx-ocr/index.d.ts +0 -3
  258. package/dist/server/bare/addons/onnx-ocr/index.js +0 -2
  259. package/dist/server/bare/addons/onnx-tts/create-model.d.ts +0 -10
  260. package/dist/server/bare/addons/onnx-tts/create-model.js +0 -25
  261. package/dist/server/bare/addons/onnx-tts/index.d.ts +0 -3
  262. package/dist/server/bare/addons/onnx-tts/index.js +0 -2
  263. package/dist/server/bare/addons/whispercpp-transcription/create-model.d.ts +0 -10
  264. package/dist/server/bare/addons/whispercpp-transcription/create-model.js +0 -37
  265. package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.d.ts +0 -3
  266. package/dist/server/bare/addons/whispercpp-transcription/index.d.ts +0 -3
  267. package/dist/server/bare/addons/whispercpp-transcription/index.js +0 -2
  268. /package/dist/models/{hyperdrive → registry}/index.d.ts +0 -0
  269. /package/dist/server/bare/{addons → ops}/cancel.d.ts +0 -0
  270. /package/dist/server/bare/{addons → ops}/cancel.js +0 -0
  271. /package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.d.ts +0 -0
  272. /package/dist/server/bare/{addons → ops}/load-model.d.ts +0 -0
  273. /package/dist/server/bare/{addons → ops}/unload-model.d.ts +0 -0
  274. /package/dist/server/bare/{addons → ops}/unload-model.js +0 -0
  275. /package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.d.ts +0 -0
  276. /package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.d.ts +0 -0
  277. /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(path.join(shardDir, f))
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(path.join(shardDir, tensorsFile))
121
+ .access(validateAndJoinPath(shardDir, tensorsFile))
122
122
  .then(() => true)
123
123
  .catch(() => false);
124
124
  return tensorsExist;
@@ -0,0 +1,6 @@
1
+ export declare function initializeWorkerCore(): {
2
+ hasRPCConfig: boolean;
3
+ };
4
+ export declare function ensureRPCSetup(): void;
5
+ export declare function isCoreInitialized(): boolean;
6
+ //# sourceMappingURL=worker-core.d.ts.map
@@ -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
+ }
@@ -1,6 +1,5 @@
1
- export declare function getEnv(): {
2
- HOME_DIR: string;
3
- QVAC_IPC_SOCKET_PATH?: string | undefined;
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
@@ -1,87 +1,23 @@
1
- import process from "bare-process";
2
- import { isBareKit } from "which-runtime";
3
- import { createBareKitRPCServer, createIPCClient, } from "./rpc/create-server.js";
4
- import { z } from "zod";
5
- import { destroySwarm } from "./bare/hyperswarm.js";
6
- import { closeAllRagInstances } from "./bare/rag-hyperdb/index.js";
7
- import { cleanupDownloads } from "./rpc/handlers/load-model/download-manager.js";
8
- import { unloadAllModels } from "./bare/registry/model-registry.js";
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
- logger.debug("Arguments to worker:", process.argv);
21
- // Initialize addon logger callbacks
22
- llmAddonLogging.setLogger(createAddonLoggerCallback(ADDON_NAMESPACES.LLAMACPP_LLM));
23
- embedAddonLogging.setLogger(createAddonLoggerCallback(ADDON_NAMESPACES.LLAMACPP_EMBED));
24
- ttsAddonLogging.setLogger(createAddonLoggerCallback(ADDON_NAMESPACES.TTS));
25
- whisperAddonLogging.setLogger(createAddonLoggerCallback(ADDON_NAMESPACES.WHISPERCPP));
26
- nmtAddonLogging.setLogger(createAddonLoggerCallback(ADDON_NAMESPACES.NMTCPP));
27
- const defaultHomeDir = process.env["HOME"] || process.env["USERPROFILE"] || "/tmp";
28
- let envConfig = { HOME_DIR: defaultHomeDir };
29
- let hasRPCConfig = false;
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 TTSConfigModelRequiredError extends QvacErrorBase {
32
+ export declare class TtsArtifactsRequiredError extends QvacErrorBase {
36
33
  constructor(cause?: unknown);
37
34
  }
38
- export declare class ESpeakDataPathRequiredError extends QvacErrorBase {
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 TTSConfigModelRequiredError extends QvacErrorBase {
56
+ export class TtsArtifactsRequiredError extends QvacErrorBase {
62
57
  constructor(cause) {
63
- super(createErrorOptions(SDK_SERVER_ERROR_CODES.TTS_CONFIG_MODEL_REQUIRED, undefined, cause));
58
+ super(createErrorOptions(SDK_SERVER_ERROR_CODES.TTS_ARTIFACTS_REQUIRED, undefined, cause));
64
59
  }
65
60
  }
66
- export class ESpeakDataPathRequiredError extends QvacErrorBase {
61
+ export class TtsReferenceAudioRequiredError extends QvacErrorBase {
67
62
  constructor(cause) {
68
- super(createErrorOptions(SDK_SERVER_ERROR_CODES.ESPEAK_DATA_PATH_REQUIRED, undefined, cause));
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
+ }