@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.
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
@@ -0,0 +1,75 @@
1
+ import { pluginDefinitionRuntimeSchema, } from "../../schemas/plugin.js";
2
+ import { PluginAlreadyRegisteredError, PluginDefinitionInvalidError, PluginLoggingInvalidError, } from "../../utils/errors-server.js";
3
+ import { createAddonLoggerCallback } from "../../logging/addon.js";
4
+ const plugins = new Map();
5
+ function getModelTypeForError(plugin) {
6
+ if (!plugin || typeof plugin !== "object")
7
+ return "(unknown)";
8
+ if (!("modelType" in plugin))
9
+ return "(unknown)";
10
+ const modelType = plugin.modelType;
11
+ return typeof modelType === "string" && modelType.length > 0
12
+ ? modelType
13
+ : "(unknown)";
14
+ }
15
+ function validatePluginDefinition(plugin) {
16
+ const result = pluginDefinitionRuntimeSchema.safeParse(plugin);
17
+ if (result.success)
18
+ return;
19
+ const details = result.error.issues
20
+ .map((i) => `${String(i.path.join("."))}: ${i.message}`)
21
+ .join(", ");
22
+ throw new PluginDefinitionInvalidError(getModelTypeForError(plugin), details);
23
+ }
24
+ export function registerPlugin(plugin) {
25
+ validatePluginDefinition(plugin);
26
+ if (plugins.has(plugin.modelType)) {
27
+ throw new PluginAlreadyRegisteredError(plugin.modelType);
28
+ }
29
+ // Validate logging module shape if provided
30
+ if (plugin.logging?.module) {
31
+ const loggingModule = plugin.logging.module;
32
+ if (typeof loggingModule["setLogger"] !== "function") {
33
+ throw new PluginLoggingInvalidError(plugin.modelType, "logging.module must have a setLogger(callback) function");
34
+ }
35
+ }
36
+ plugins.set(plugin.modelType, plugin);
37
+ if (plugin.logging?.module && plugin.logging?.namespace) {
38
+ const loggingModule = plugin.logging.module;
39
+ loggingModule.setLogger(createAddonLoggerCallback(plugin.logging.namespace));
40
+ }
41
+ }
42
+ export function getPlugin(modelType) {
43
+ return plugins.get(modelType);
44
+ }
45
+ export function getPluginHandler(modelType, handlerName) {
46
+ const plugin = plugins.get(modelType);
47
+ if (!plugin)
48
+ return undefined;
49
+ return plugin.handlers[handlerName];
50
+ }
51
+ export function hasPlugin(modelType) {
52
+ return plugins.has(modelType);
53
+ }
54
+ export function unregisterPlugin(modelType) {
55
+ const plugin = plugins.get(modelType);
56
+ if (!plugin)
57
+ return false;
58
+ if (plugin.logging?.module) {
59
+ const loggingModule = plugin.logging.module;
60
+ loggingModule.releaseLogger?.();
61
+ }
62
+ return plugins.delete(modelType);
63
+ }
64
+ export function getAllPlugins() {
65
+ return Array.from(plugins.values());
66
+ }
67
+ export function clearPlugins() {
68
+ for (const plugin of plugins.values()) {
69
+ if (plugin.logging?.module) {
70
+ const loggingModule = plugin.logging.module;
71
+ loggingModule.releaseLogger?.();
72
+ }
73
+ }
74
+ plugins.clear();
75
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Server-side RPC transport for delegated requests.
3
+ *
4
+ * This module provides `send` and `stream` functions for server-side
5
+ * delegation to remote peers (via HyperSwarm RPC).
6
+ */
7
+ import type RPC from "bare-rpc";
8
+ import { type Request, type Response, type RPCOptions } from "../../schemas/index";
9
+ export declare function send<T extends Request>(request: T, rpc: RPC, options?: RPCOptions): Promise<Response>;
10
+ export declare function stream<T extends Request>(request: T, rpc: RPC, options?: RPCOptions): AsyncGenerator<Response>;
11
+ //# sourceMappingURL=delegate-transport.d.ts.map
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Server-side RPC transport for delegated requests.
3
+ *
4
+ * This module provides `send` and `stream` functions for server-side
5
+ * delegation to remote peers (via HyperSwarm RPC).
6
+ */
7
+ import { requestSchema, responseSchema, } from "../../schemas/index.js";
8
+ import { withTimeout, withTimeoutStream } from "../../utils/withTimeout.js";
9
+ import { getServerLogger } from "../../logging/index.js";
10
+ import { DelegateProviderError } from "../../utils/errors-server.js";
11
+ const logger = getServerLogger();
12
+ let commandCounter = 0;
13
+ function getNextCommandId() {
14
+ commandCounter = (commandCounter + 1) % Number.MAX_SAFE_INTEGER;
15
+ return commandCounter;
16
+ }
17
+ function checkAndThrowError(response) {
18
+ if (response.type === "error") {
19
+ throw new DelegateProviderError(response.message || "Unknown provider error", response.code);
20
+ }
21
+ }
22
+ export async function send(request, rpc, options) {
23
+ const parsedRequest = requestSchema.parse(request);
24
+ const req = rpc.request(getNextCommandId());
25
+ logger.debug("[delegate-transport] Sending:", { type: request.type });
26
+ const payload = JSON.stringify(parsedRequest);
27
+ req.send(payload, "utf-8");
28
+ const response = await withTimeout(req.reply("utf-8"), options?.timeout);
29
+ const resPayload = responseSchema.parse(JSON.parse(response?.toString() || "{}"));
30
+ logger.debug("[delegate-transport] Response:", { type: resPayload.type });
31
+ checkAndThrowError(resPayload);
32
+ return resPayload;
33
+ }
34
+ export async function* stream(request, rpc, options = {}) {
35
+ const parsedRequest = requestSchema.parse(request);
36
+ const req = rpc.request(getNextCommandId());
37
+ logger.debug("[delegate-transport] Streaming:", { type: request.type });
38
+ req.send(JSON.stringify(parsedRequest), "utf-8");
39
+ const responseStream = req.createResponseStream({ encoding: "utf-8" });
40
+ let buffer = "";
41
+ async function* processStream() {
42
+ for await (const chunk of responseStream) {
43
+ yield chunk;
44
+ }
45
+ }
46
+ const streamWithTimeout = withTimeoutStream(processStream(), options?.timeout);
47
+ for await (const chunk of streamWithTimeout) {
48
+ buffer += chunk.toString();
49
+ // Process complete lines (newline-delimited JSON)
50
+ const lines = buffer.split("\n");
51
+ buffer = lines.pop() || ""; // Keep incomplete line in buffer
52
+ for (const line of lines) {
53
+ if (line.trim()) {
54
+ const response = responseSchema.parse(JSON.parse(line));
55
+ checkAndThrowError(response);
56
+ yield response;
57
+ }
58
+ }
59
+ }
60
+ }
@@ -1,12 +1,3 @@
1
1
  import type RPC from "bare-rpc";
2
- export type BareRPCRequest = {
3
- data: Buffer;
4
- reply: (data: string, encoding: BufferEncoding) => void;
5
- createResponseStream: () => {
6
- write: (data: string, encoding: BufferEncoding) => void;
7
- end: () => void;
8
- [Symbol.asyncIterator]?: () => AsyncIterator<Buffer>;
9
- };
10
- };
11
2
  export declare function handleRequest(req: RPC.IncomingRequest): Promise<void>;
12
3
  //# sourceMappingURL=handle-request.d.ts.map
@@ -1,336 +1,28 @@
1
- import { requestSchema, responseSchema, } from "../../schemas/index.js";
2
- import { handleCompletionStream } from "./handlers/completion-stream.js";
3
- import { handleDownloadAsset } from "./handlers/download-asset.js";
4
- import { handleLoadModel } from "./handlers/load-model/index.js";
5
- import { handleLoadModelDelegated } from "./handlers/load-model-delegated.js";
6
- import { handleCompletionStreamDelegated } from "./handlers/completion-stream-delegated.js";
7
- import { getModelEntry } from "../bare/registry/model-registry.js";
8
- import { setSDKConfig } from "../bare/registry/config-registry.js";
9
- import { setRuntimeContext } from "../bare/registry/runtime-context-registry.js";
10
- import { handleUnloadModel } from "./handlers/unload-model.js";
11
- import { handleTranscribeStream } from "./handlers/transcribe-stream.js";
12
- import { handleEmbed } from "./handlers/embed.js";
13
- import { handleTranslate } from "./handlers/translate.js";
14
- import { handleLoggingStream } from "./handlers/logging-stream.js";
15
- import { cancelHandler } from "./handlers/cancelHandler.js";
16
- import { provideHandler } from "./handlers/provideHandler.js";
17
- import { stopProvideHandler } from "./handlers/stopProvideHandler.js";
18
- import { handleRag } from "./handlers/rag.js";
19
- import { handleDeleteCache } from "./handlers/delete-cache.js";
20
- import { handleTextToSpeech } from "./handlers/text-to-speech.js";
21
- import { handleGetModelInfo } from "./handlers/get-model-info.js";
22
- import { handleOCRStream } from "./handlers/ocr-stream.js";
23
- import { sendErrorResponse, sendStreamErrorResponse, } from "../error-handlers.js";
24
- import { NoDataReceivedError, UnknownRequestTypeError, } from "../../utils/errors-client.js";
25
- import { normalizeModelType } from "../../schemas/index.js";
1
+ import { requestSchema, normalizeModelType, } from "../../schemas/index.js";
26
2
  import { resolveModelConfig } from "../bare/registry/model-config-registry.js";
3
+ import { sendErrorResponse } from "../error-handlers.js";
4
+ import { RPCNoDataReceivedError, RPCUnknownRequestTypeError, } from "../../utils/errors-server.js";
5
+ import { registry } from "./handler-registry.js";
6
+ import { executeHandler, handleInitConfig, isInitConfigMessage, } from "./handler-utils.js";
27
7
  export async function handleRequest(req) {
28
8
  try {
29
9
  const rawData = req.data?.toString();
30
10
  if (!rawData) {
31
- throw new NoDataReceivedError();
11
+ throw new RPCNoDataReceivedError();
32
12
  }
33
13
  const jsonData = JSON.parse(rawData);
34
- // Handle special internal config initialization message
35
- if (jsonData &&
36
- typeof jsonData === "object" &&
37
- "type" in jsonData &&
38
- jsonData.type === "__init_config") {
39
- try {
40
- const initData = jsonData;
41
- if (initData.config) {
42
- setSDKConfig(initData.config);
43
- }
44
- if (initData.runtimeContext) {
45
- setRuntimeContext(initData.runtimeContext);
46
- }
47
- req.reply(JSON.stringify({ success: true }), "utf-8");
48
- }
49
- catch (error) {
50
- req.reply(JSON.stringify({
51
- success: false,
52
- error: error instanceof Error ? error.message : String(error),
53
- }), "utf-8");
54
- }
14
+ // Handle internal config initialization (bypasses schema)
15
+ if (isInitConfigMessage(jsonData)) {
16
+ handleInitConfig(req, jsonData);
55
17
  return;
56
18
  }
57
19
  const processedData = applyDeviceDefaultsToRequest(jsonData);
58
20
  const request = requestSchema.parse(processedData);
59
- switch (request.type) {
60
- case "downloadAsset": {
61
- if (request.withProgress) {
62
- const stream = req.createResponseStream();
63
- try {
64
- const response = await handleDownloadAsset(request, (update) => {
65
- const data = JSON.stringify(responseSchema.parse(update));
66
- stream.write(data + "\n", "utf-8");
67
- });
68
- // Send final response
69
- const data = JSON.stringify(responseSchema.parse(response));
70
- stream.write(data + "\n", "utf-8");
71
- stream.end();
72
- }
73
- catch (error) {
74
- sendStreamErrorResponse(stream, error);
75
- }
76
- }
77
- else {
78
- try {
79
- const response = await handleDownloadAsset(request);
80
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
81
- }
82
- catch (error) {
83
- sendErrorResponse(req, error);
84
- }
85
- }
86
- break;
87
- }
88
- case "loadModel": {
89
- if (request.withProgress) {
90
- const stream = req.createResponseStream();
91
- try {
92
- // Route to appropriate handler based on delegation
93
- let response;
94
- if (request.delegate) {
95
- response = await handleLoadModelDelegated(request, (update) => {
96
- const data = JSON.stringify(responseSchema.parse(update));
97
- stream.write(data + "\n", "utf-8");
98
- });
99
- }
100
- else {
101
- response = await handleLoadModel(request, (update) => {
102
- const data = JSON.stringify(responseSchema.parse(update));
103
- stream.write(data + "\n", "utf-8");
104
- });
105
- }
106
- // Send final response
107
- const data = JSON.stringify(responseSchema.parse(response));
108
- stream.write(data + "\n", "utf-8");
109
- stream.end();
110
- }
111
- catch (error) {
112
- sendStreamErrorResponse(stream, error);
113
- }
114
- }
115
- else if (request.delegate) {
116
- try {
117
- const response = await handleLoadModelDelegated(request);
118
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
119
- }
120
- catch (error) {
121
- sendErrorResponse(req, error);
122
- }
123
- }
124
- else {
125
- // Load without progress/delegate, or reload config
126
- try {
127
- const response = await handleLoadModel(request);
128
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
129
- }
130
- catch (error) {
131
- sendErrorResponse(req, error);
132
- }
133
- }
134
- break;
135
- }
136
- case "completionStream": {
137
- const stream = req.createResponseStream();
138
- try {
139
- // Check if the model is delegated and route accordingly
140
- const entry = getModelEntry(request.modelId);
141
- const handler = entry?.isDelegated
142
- ? handleCompletionStreamDelegated
143
- : handleCompletionStream;
144
- for await (const response of handler(request)) {
145
- const validatedResponse = responseSchema.parse(response);
146
- const data = JSON.stringify(validatedResponse);
147
- stream.write(data + "\n", "utf-8");
148
- }
149
- stream.end();
150
- break;
151
- }
152
- catch (error) {
153
- sendStreamErrorResponse(stream, error);
154
- }
155
- break;
156
- }
157
- case "unloadModel": {
158
- const response = await handleUnloadModel(request);
159
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
160
- break;
161
- }
162
- case "transcribeStream": {
163
- const stream = req.createResponseStream();
164
- try {
165
- for await (const response of handleTranscribeStream(request)) {
166
- const validatedResponse = responseSchema.parse(response);
167
- const data = JSON.stringify(validatedResponse);
168
- stream.write(data + "\n", "utf-8");
169
- }
170
- stream.end();
171
- }
172
- catch (error) {
173
- sendStreamErrorResponse(stream, error);
174
- return;
175
- }
176
- break;
177
- }
178
- case "loggingStream": {
179
- const stream = req.createResponseStream();
180
- try {
181
- for await (const response of handleLoggingStream(request)) {
182
- const validatedResponse = responseSchema.parse(response);
183
- const data = JSON.stringify(validatedResponse);
184
- stream.write(data + "\n", "utf-8");
185
- }
186
- stream.end();
187
- }
188
- catch (error) {
189
- sendStreamErrorResponse(stream, error);
190
- return;
191
- }
192
- break;
193
- }
194
- case "ping": {
195
- const res = {
196
- type: "pong",
197
- number: Math.random() * 100,
198
- };
199
- req.reply(JSON.stringify(res), "utf-8");
200
- break;
201
- }
202
- case "embed": {
203
- try {
204
- const response = await handleEmbed(request);
205
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
206
- }
207
- catch (error) {
208
- sendErrorResponse(req, error);
209
- }
210
- break;
211
- }
212
- case "translate": {
213
- const stream = req.createResponseStream();
214
- try {
215
- for await (const response of handleTranslate(request)) {
216
- const validatedResponse = responseSchema.parse(response);
217
- const data = JSON.stringify(validatedResponse);
218
- stream.write(data + "\n", "utf-8");
219
- }
220
- stream.end();
221
- }
222
- catch (error) {
223
- sendStreamErrorResponse(stream, error);
224
- }
225
- break;
226
- }
227
- case "cancel": {
228
- try {
229
- const response = await cancelHandler(request);
230
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
231
- }
232
- catch (error) {
233
- sendErrorResponse(req, error);
234
- }
235
- break;
236
- }
237
- case "provide": {
238
- const response = await provideHandler(request);
239
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
240
- break;
241
- }
242
- case "stopProvide": {
243
- const response = stopProvideHandler(request);
244
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
245
- break;
246
- }
247
- case "rag": {
248
- // Only ingest, saveEmbeddings, and reindex support progress
249
- const supportsProgress = request.operation === "ingest" ||
250
- request.operation === "saveEmbeddings" ||
251
- request.operation === "reindex";
252
- const withProgress = supportsProgress && request.withProgress;
253
- if (withProgress) {
254
- const stream = req.createResponseStream();
255
- try {
256
- const response = await handleRag(request, (update) => {
257
- const data = JSON.stringify(responseSchema.parse(update));
258
- stream.write(data + "\n", "utf-8");
259
- });
260
- // Send final response
261
- const data = JSON.stringify(responseSchema.parse(response));
262
- stream.write(data + "\n", "utf-8");
263
- stream.end();
264
- }
265
- catch (error) {
266
- sendStreamErrorResponse(stream, error);
267
- }
268
- }
269
- else {
270
- try {
271
- const response = await handleRag(request);
272
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
273
- }
274
- catch (error) {
275
- sendErrorResponse(req, error);
276
- }
277
- }
278
- break;
279
- }
280
- case "deleteCache": {
281
- try {
282
- const response = await handleDeleteCache(request);
283
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
284
- }
285
- catch (error) {
286
- sendErrorResponse(req, error);
287
- }
288
- break;
289
- }
290
- case "textToSpeech": {
291
- const stream = req.createResponseStream();
292
- try {
293
- for await (const response of handleTextToSpeech(request)) {
294
- const validatedResponse = responseSchema.parse(response);
295
- const data = JSON.stringify(validatedResponse);
296
- stream.write(data + "\n", "utf-8");
297
- }
298
- stream.end();
299
- }
300
- catch (error) {
301
- sendStreamErrorResponse(stream, error);
302
- }
303
- break;
304
- }
305
- case "getModelInfo": {
306
- try {
307
- const response = await handleGetModelInfo(request);
308
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
309
- }
310
- catch (error) {
311
- sendErrorResponse(req, error);
312
- }
313
- break;
314
- }
315
- case "ocrStream": {
316
- const stream = req.createResponseStream();
317
- try {
318
- for await (const response of handleOCRStream(request)) {
319
- const validatedResponse = responseSchema.parse(response);
320
- const data = JSON.stringify(validatedResponse);
321
- stream.write(data + "\n", "utf-8");
322
- }
323
- stream.end();
324
- }
325
- catch (error) {
326
- sendStreamErrorResponse(stream, error);
327
- }
328
- break;
329
- }
330
- default: {
331
- throw new UnknownRequestTypeError();
332
- }
21
+ const entry = registry[request.type];
22
+ if (!entry) {
23
+ throw new RPCUnknownRequestTypeError(request.type);
333
24
  }
25
+ await executeHandler(req, request, entry);
334
26
  }
335
27
  catch (error) {
336
28
  sendErrorResponse(req, error);
@@ -0,0 +1,3 @@
1
+ import type { HandlerEntry } from "./handler-utils";
2
+ export declare const registry: Record<string, HandlerEntry>;
3
+ //# sourceMappingURL=handler-registry.d.ts.map
@@ -0,0 +1,84 @@
1
+ import {} from "../../schemas/index.js";
2
+ import { handleCompletionStream } from "./handlers/completion-stream.js";
3
+ import { handleDownloadAsset } from "./handlers/download-asset.js";
4
+ import { handleLoadModel } from "./handlers/load-model/index.js";
5
+ import { handleLoadModelDelegated } from "./handlers/load-model-delegated.js";
6
+ import { handleCompletionStreamDelegated } from "./handlers/completion-stream-delegated.js";
7
+ import { getModelEntry } from "../bare/registry/model-registry.js";
8
+ import { handleUnloadModel } from "./handlers/unload-model.js";
9
+ import { handleTranscribeStream } from "./handlers/transcribe-stream.js";
10
+ import { handleEmbed } from "./handlers/embed.js";
11
+ import { handleTranslate } from "./handlers/translate.js";
12
+ import { handleLoggingStream } from "./handlers/logging-stream.js";
13
+ import { cancelHandler } from "./handlers/cancelHandler.js";
14
+ import { provideHandler } from "./handlers/provideHandler.js";
15
+ import { stopProvideHandler } from "./handlers/stopProvideHandler.js";
16
+ import { handleRag } from "./handlers/rag.js";
17
+ import { handleDeleteCache } from "./handlers/delete-cache.js";
18
+ import { handleTextToSpeech } from "./handlers/text-to-speech.js";
19
+ import { handleGetModelInfo } from "./handlers/get-model-info.js";
20
+ import { handleOCRStream } from "./handlers/ocr-stream.js";
21
+ import { handlePing } from "./handlers/ping.js";
22
+ import { handlePluginInvoke, handlePluginInvokeStream, } from "./handlers/plugin-invoke.js";
23
+ import { handleModelRegistryList, handleModelRegistrySearch, handleModelRegistryGetModel, } from "./handlers/registry.js";
24
+ function ragSupportsProgress(request) {
25
+ if (request.type !== "rag")
26
+ return false;
27
+ return ["ingest", "saveEmbeddings", "reindex"].includes(request.operation);
28
+ }
29
+ function isModelDelegated(request) {
30
+ if (!("modelId" in request))
31
+ return false;
32
+ const entry = getModelEntry(request.modelId);
33
+ return entry?.isDelegated ?? false;
34
+ }
35
+ export const registry = {
36
+ // Simple Reply handlers
37
+ ping: { type: "reply", handler: handlePing },
38
+ unloadModel: { type: "reply", handler: handleUnloadModel },
39
+ embed: { type: "reply", handler: handleEmbed },
40
+ cancel: { type: "reply", handler: cancelHandler },
41
+ provide: { type: "reply", handler: provideHandler },
42
+ stopProvide: { type: "reply", handler: stopProvideHandler },
43
+ deleteCache: { type: "reply", handler: handleDeleteCache },
44
+ getModelInfo: { type: "reply", handler: handleGetModelInfo },
45
+ pluginInvoke: { type: "reply", handler: handlePluginInvoke },
46
+ modelRegistryList: { type: "reply", handler: handleModelRegistryList },
47
+ modelRegistrySearch: { type: "reply", handler: handleModelRegistrySearch },
48
+ modelRegistryGetModel: {
49
+ type: "reply",
50
+ handler: handleModelRegistryGetModel,
51
+ },
52
+ // Simple Stream handlers
53
+ transcribeStream: { type: "stream", handler: handleTranscribeStream },
54
+ loggingStream: { type: "stream", handler: handleLoggingStream },
55
+ translate: { type: "stream", handler: handleTranslate },
56
+ textToSpeech: { type: "stream", handler: handleTextToSpeech },
57
+ ocrStream: { type: "stream", handler: handleOCRStream },
58
+ pluginInvokeStream: { type: "stream", handler: handlePluginInvokeStream },
59
+ // Handlers with delegation support
60
+ loadModel: {
61
+ type: "reply",
62
+ handler: handleLoadModel,
63
+ delegatedHandler: handleLoadModelDelegated,
64
+ isDelegated: (r) => r.type === "loadModel" && !!r.delegate,
65
+ supportsProgress: true,
66
+ },
67
+ completionStream: {
68
+ type: "stream",
69
+ handler: handleCompletionStream,
70
+ delegatedHandler: handleCompletionStreamDelegated,
71
+ isDelegated: isModelDelegated,
72
+ },
73
+ // Handlers with progress support
74
+ downloadAsset: {
75
+ type: "reply",
76
+ handler: handleDownloadAsset,
77
+ supportsProgress: true,
78
+ },
79
+ rag: {
80
+ type: "reply",
81
+ handler: handleRag,
82
+ supportsProgress: ragSupportsProgress,
83
+ },
84
+ };
@@ -0,0 +1,22 @@
1
+ import { type QvacConfig, type Request, type Response, type RuntimeContext } from "../../schemas/index";
2
+ import type RPC from "bare-rpc";
3
+ type ReplyHandler = (request: any) => Promise<Response> | Response;
4
+ type StreamHandler = (request: any) => AsyncGenerator<Response>;
5
+ type ProgressHandler = (request: any, onProgress?: (update: Response) => void) => Promise<Response>;
6
+ export type HandlerEntry = {
7
+ type: "reply" | "stream";
8
+ handler: ReplyHandler | StreamHandler | ProgressHandler;
9
+ delegatedHandler?: ReplyHandler | StreamHandler | ProgressHandler;
10
+ isDelegated?: (request: Request) => boolean;
11
+ supportsProgress?: boolean | ((request: Request) => boolean);
12
+ };
13
+ export declare function executeHandler(req: RPC.IncomingRequest, request: Request, entry: HandlerEntry): Promise<void>;
14
+ type InitConfigMessage = {
15
+ type: "__init_config";
16
+ config: QvacConfig;
17
+ runtimeContext?: RuntimeContext;
18
+ };
19
+ export declare function isInitConfigMessage(data: unknown): data is InitConfigMessage;
20
+ export declare function handleInitConfig(req: RPC.IncomingRequest, data: InitConfigMessage): void;
21
+ export {};
22
+ //# sourceMappingURL=handler-utils.d.ts.map