@qvac/sdk 0.1.0-dev.1760648187.328e967

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 (287) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +301 -0
  3. package/dist/client/api/cancel.d.ts +25 -0
  4. package/dist/client/api/cancel.js +37 -0
  5. package/dist/client/api/completion-stream.d.ts +50 -0
  6. package/dist/client/api/completion-stream.js +103 -0
  7. package/dist/client/api/download-asset.d.ts +39 -0
  8. package/dist/client/api/download-asset.js +72 -0
  9. package/dist/client/api/embed.d.ts +11 -0
  10. package/dist/client/api/embed.js +24 -0
  11. package/dist/client/api/index.d.ts +13 -0
  12. package/dist/client/api/index.js +12 -0
  13. package/dist/client/api/load-model.d.ts +98 -0
  14. package/dist/client/api/load-model.js +154 -0
  15. package/dist/client/api/logging-stream.d.ts +21 -0
  16. package/dist/client/api/logging-stream.js +32 -0
  17. package/dist/client/api/ping.d.ts +11 -0
  18. package/dist/client/api/ping.js +18 -0
  19. package/dist/client/api/provide.d.ts +18 -0
  20. package/dist/client/api/provide.js +27 -0
  21. package/dist/client/api/rag.d.ts +42 -0
  22. package/dist/client/api/rag.js +97 -0
  23. package/dist/client/api/transcribe.d.ts +24 -0
  24. package/dist/client/api/transcribe.js +52 -0
  25. package/dist/client/api/translate.d.ts +47 -0
  26. package/dist/client/api/translate.js +114 -0
  27. package/dist/client/api/unload-model.d.ts +11 -0
  28. package/dist/client/api/unload-model.js +26 -0
  29. package/dist/client/index.d.ts +2 -0
  30. package/dist/client/index.js +1 -0
  31. package/dist/client/logging-stream-registry.d.ts +5 -0
  32. package/dist/client/logging-stream-registry.js +60 -0
  33. package/dist/client/rpc/bare-client.d.ts +112 -0
  34. package/dist/client/rpc/bare-client.js +82 -0
  35. package/dist/client/rpc/bare-rpc-client.d.ts +4 -0
  36. package/dist/client/rpc/bare-rpc-client.js +87 -0
  37. package/dist/client/rpc/expo-rpc-client.d.ts +3 -0
  38. package/dist/client/rpc/expo-rpc-client.js +57 -0
  39. package/dist/client/rpc/node-rpc-client.d.ts +9 -0
  40. package/dist/client/rpc/node-rpc-client.js +99 -0
  41. package/dist/client/rpc/rpc-client.d.ts +5 -0
  42. package/dist/client/rpc/rpc-client.js +91 -0
  43. package/dist/client/rpc/rpc-error.d.ts +19 -0
  44. package/dist/client/rpc/rpc-error.js +39 -0
  45. package/dist/constants/audio.d.ts +3 -0
  46. package/dist/constants/audio.js +17 -0
  47. package/dist/constants/index.d.ts +2 -0
  48. package/dist/constants/index.js +1 -0
  49. package/dist/examples/delegated-inference/consumer.d.ts +2 -0
  50. package/dist/examples/delegated-inference/consumer.js +56 -0
  51. package/dist/examples/delegated-inference/provider.d.ts +2 -0
  52. package/dist/examples/delegated-inference/provider.js +57 -0
  53. package/dist/examples/download-with-cancel.d.ts +2 -0
  54. package/dist/examples/download-with-cancel.js +46 -0
  55. package/dist/examples/embed-hyperdrive.d.ts +2 -0
  56. package/dist/examples/embed-hyperdrive.js +19 -0
  57. package/dist/examples/kv-cache-example.d.ts +2 -0
  58. package/dist/examples/kv-cache-example.js +74 -0
  59. package/dist/examples/llamacpp-file-logging.d.ts +2 -0
  60. package/dist/examples/llamacpp-file-logging.js +62 -0
  61. package/dist/examples/llamacpp-filesystem.d.ts +2 -0
  62. package/dist/examples/llamacpp-filesystem.js +40 -0
  63. package/dist/examples/llamacpp-http.d.ts +2 -0
  64. package/dist/examples/llamacpp-http.js +41 -0
  65. package/dist/examples/llamacpp-hyperdrive.d.ts +2 -0
  66. package/dist/examples/llamacpp-hyperdrive.js +39 -0
  67. package/dist/examples/llamacpp-multimodal.d.ts +2 -0
  68. package/dist/examples/llamacpp-multimodal.js +62 -0
  69. package/dist/examples/llamacpp-native-tools.d.ts +2 -0
  70. package/dist/examples/llamacpp-native-tools.js +64 -0
  71. package/dist/examples/llamacpp-tools-routing.d.ts +2 -0
  72. package/dist/examples/llamacpp-tools-routing.js +364 -0
  73. package/dist/examples/llamacpp-tools.d.ts +2 -0
  74. package/dist/examples/llamacpp-tools.js +81 -0
  75. package/dist/examples/multi-model-demo.d.ts +2 -0
  76. package/dist/examples/multi-model-demo.js +75 -0
  77. package/dist/examples/parallel-download.d.ts +2 -0
  78. package/dist/examples/parallel-download.js +21 -0
  79. package/dist/examples/rag/rag-chromadb.d.ts +2 -0
  80. package/dist/examples/rag/rag-chromadb.js +130 -0
  81. package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +2 -0
  82. package/dist/examples/rag/rag-hyperdb-workspaces.js +106 -0
  83. package/dist/examples/rag/rag-hyperdb.d.ts +2 -0
  84. package/dist/examples/rag/rag-hyperdb.js +50 -0
  85. package/dist/examples/rag/rag-lancedb.d.ts +2 -0
  86. package/dist/examples/rag/rag-lancedb.js +95 -0
  87. package/dist/examples/rag/rag-sqlite.d.ts +2 -0
  88. package/dist/examples/rag/rag-sqlite.js +107 -0
  89. package/dist/examples/seed-hyperdrive.d.ts +2 -0
  90. package/dist/examples/seed-hyperdrive.js +21 -0
  91. package/dist/examples/translation/translation-indic.d.ts +2 -0
  92. package/dist/examples/translation/translation-indic.js +30 -0
  93. package/dist/examples/translation/translation-llm-context.d.ts +2 -0
  94. package/dist/examples/translation/translation-llm-context.js +30 -0
  95. package/dist/examples/translation/translation-llm.d.ts +2 -0
  96. package/dist/examples/translation/translation-llm.js +38 -0
  97. package/dist/examples/translation/translation-opus.d.ts +2 -0
  98. package/dist/examples/translation/translation-opus.js +30 -0
  99. package/dist/examples/translation/translation-stream.d.ts +2 -0
  100. package/dist/examples/translation/translation-stream.js +35 -0
  101. package/dist/examples/whispercpp-filesystem.d.ts +2 -0
  102. package/dist/examples/whispercpp-filesystem.js +43 -0
  103. package/dist/examples/whispercpp-microphone-record.d.ts +2 -0
  104. package/dist/examples/whispercpp-microphone-record.js +311 -0
  105. package/dist/expo/plugins/index.d.ts +5 -0
  106. package/dist/expo/plugins/index.js +5 -0
  107. package/dist/expo/plugins/withMobileBundle.d.ts +8 -0
  108. package/dist/expo/plugins/withMobileBundle.js +60 -0
  109. package/dist/expo/plugins/withOpenCL.d.ts +9 -0
  110. package/dist/expo/plugins/withOpenCL.js +118 -0
  111. package/dist/expo/plugins/withQvacSDK.d.ts +9 -0
  112. package/dist/expo/plugins/withQvacSDK.js +13 -0
  113. package/dist/index.d.ts +7 -0
  114. package/dist/index.js +8 -0
  115. package/dist/logging/base-logger.d.ts +7 -0
  116. package/dist/logging/base-logger.js +55 -0
  117. package/dist/logging/index.d.ts +4 -0
  118. package/dist/logging/index.js +2 -0
  119. package/dist/logging/logger.d.ts +5 -0
  120. package/dist/logging/logger.js +28 -0
  121. package/dist/logging/stream-logger.d.ts +3 -0
  122. package/dist/logging/stream-logger.js +9 -0
  123. package/dist/logging/transport.d.ts +3 -0
  124. package/dist/logging/transport.js +15 -0
  125. package/dist/logging/types.d.ts +18 -0
  126. package/dist/logging/types.js +1 -0
  127. package/dist/logging/utils.d.ts +4 -0
  128. package/dist/logging/utils.js +47 -0
  129. package/dist/models/hyperdrive/index.d.ts +2 -0
  130. package/dist/models/hyperdrive/index.js +2 -0
  131. package/dist/models/hyperdrive/models.d.ts +475 -0
  132. package/dist/models/hyperdrive/models.js +534 -0
  133. package/dist/schemas/cancel.d.ts +33 -0
  134. package/dist/schemas/cancel.js +25 -0
  135. package/dist/schemas/common.d.ts +626 -0
  136. package/dist/schemas/common.js +47 -0
  137. package/dist/schemas/completion-stream.d.ts +125 -0
  138. package/dist/schemas/completion-stream.js +53 -0
  139. package/dist/schemas/delegate.d.ts +9 -0
  140. package/dist/schemas/delegate.js +9 -0
  141. package/dist/schemas/download-asset.d.ts +75 -0
  142. package/dist/schemas/download-asset.js +43 -0
  143. package/dist/schemas/embed.d.ts +20 -0
  144. package/dist/schemas/embed.js +14 -0
  145. package/dist/schemas/error.d.ts +13 -0
  146. package/dist/schemas/error.js +35 -0
  147. package/dist/schemas/index.d.ts +19 -0
  148. package/dist/schemas/index.js +19 -0
  149. package/dist/schemas/llamacpp-config.d.ts +30 -0
  150. package/dist/schemas/llamacpp-config.js +39 -0
  151. package/dist/schemas/load-model.d.ts +1259 -0
  152. package/dist/schemas/load-model.js +108 -0
  153. package/dist/schemas/logging-stream.d.ts +27 -0
  154. package/dist/schemas/logging-stream.js +16 -0
  155. package/dist/schemas/ping.d.ts +11 -0
  156. package/dist/schemas/ping.js +8 -0
  157. package/dist/schemas/provide.d.ts +43 -0
  158. package/dist/schemas/provide.js +25 -0
  159. package/dist/schemas/rag.d.ts +159 -0
  160. package/dist/schemas/rag.js +78 -0
  161. package/dist/schemas/transcription.d.ts +24 -0
  162. package/dist/schemas/transcription.js +15 -0
  163. package/dist/schemas/translate.d.ts +82 -0
  164. package/dist/schemas/translate.js +42 -0
  165. package/dist/schemas/translation-config.d.ts +83 -0
  166. package/dist/schemas/translation-config.js +46 -0
  167. package/dist/schemas/unload-model.d.ts +19 -0
  168. package/dist/schemas/unload-model.js +13 -0
  169. package/dist/schemas/whispercpp-config.d.ts +25 -0
  170. package/dist/schemas/whispercpp-config.js +18 -0
  171. package/dist/server/bare/addons/cancel.d.ts +3 -0
  172. package/dist/server/bare/addons/cancel.js +12 -0
  173. package/dist/server/bare/addons/index.d.ts +4 -0
  174. package/dist/server/bare/addons/index.js +3 -0
  175. package/dist/server/bare/addons/llamacpp/create-model.d.ts +5 -0
  176. package/dist/server/bare/addons/llamacpp/create-model.js +57 -0
  177. package/dist/server/bare/addons/llamacpp/handlers/completion-stream.d.ts +3 -0
  178. package/dist/server/bare/addons/llamacpp/handlers/completion-stream.js +65 -0
  179. package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +4 -0
  180. package/dist/server/bare/addons/llamacpp/handlers/embed.js +40 -0
  181. package/dist/server/bare/addons/llamacpp/index.d.ts +4 -0
  182. package/dist/server/bare/addons/llamacpp/index.js +3 -0
  183. package/dist/server/bare/addons/llamacpp/kv-cache-utils.d.ts +19 -0
  184. package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +46 -0
  185. package/dist/server/bare/addons/load-model.d.ts +3 -0
  186. package/dist/server/bare/addons/load-model.js +55 -0
  187. package/dist/server/bare/addons/translation/create-model.d.ts +4 -0
  188. package/dist/server/bare/addons/translation/create-model.js +45 -0
  189. package/dist/server/bare/addons/translation/handlers/translate.d.ts +3 -0
  190. package/dist/server/bare/addons/translation/handlers/translate.js +86 -0
  191. package/dist/server/bare/addons/translation/index.d.ts +3 -0
  192. package/dist/server/bare/addons/translation/index.js +2 -0
  193. package/dist/server/bare/addons/unload-model.d.ts +3 -0
  194. package/dist/server/bare/addons/unload-model.js +20 -0
  195. package/dist/server/bare/addons/whispercpp/create-model.d.ts +6 -0
  196. package/dist/server/bare/addons/whispercpp/create-model.js +55 -0
  197. package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.d.ts +3 -0
  198. package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +42 -0
  199. package/dist/server/bare/addons/whispercpp/index.d.ts +3 -0
  200. package/dist/server/bare/addons/whispercpp/index.js +2 -0
  201. package/dist/server/bare/delegate-rpc-client.d.ts +4 -0
  202. package/dist/server/bare/delegate-rpc-client.js +70 -0
  203. package/dist/server/bare/hyperswarm.d.ts +7 -0
  204. package/dist/server/bare/hyperswarm.js +62 -0
  205. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +3 -0
  206. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +12 -0
  207. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +6 -0
  208. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +16 -0
  209. package/dist/server/bare/rag-hyperdb/handlers/search.d.ts +3 -0
  210. package/dist/server/bare/rag-hyperdb/handlers/search.js +15 -0
  211. package/dist/server/bare/rag-hyperdb/index.d.ts +5 -0
  212. package/dist/server/bare/rag-hyperdb/index.js +4 -0
  213. package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +5 -0
  214. package/dist/server/bare/rag-hyperdb/rag-manager.js +61 -0
  215. package/dist/server/bare/registry/logging-stream-registry.d.ts +12 -0
  216. package/dist/server/bare/registry/logging-stream-registry.js +46 -0
  217. package/dist/server/bare/registry/model-registry.d.ts +64 -0
  218. package/dist/server/bare/registry/model-registry.js +95 -0
  219. package/dist/server/error-handlers.d.ts +4 -0
  220. package/dist/server/error-handlers.js +27 -0
  221. package/dist/server/http-server.d.ts +2 -0
  222. package/dist/server/http-server.js +189 -0
  223. package/dist/server/rpc/create-server.d.ts +4 -0
  224. package/dist/server/rpc/create-server.js +19 -0
  225. package/dist/server/rpc/handle-request.d.ts +12 -0
  226. package/dist/server/rpc/handle-request.js +220 -0
  227. package/dist/server/rpc/handlers/cancelHandler.d.ts +3 -0
  228. package/dist/server/rpc/handlers/cancelHandler.js +27 -0
  229. package/dist/server/rpc/handlers/completion-stream-delegated.d.ts +3 -0
  230. package/dist/server/rpc/handlers/completion-stream-delegated.js +30 -0
  231. package/dist/server/rpc/handlers/completion-stream.d.ts +3 -0
  232. package/dist/server/rpc/handlers/completion-stream.js +52 -0
  233. package/dist/server/rpc/handlers/download-asset.d.ts +3 -0
  234. package/dist/server/rpc/handlers/download-asset.js +21 -0
  235. package/dist/server/rpc/handlers/embed.d.ts +3 -0
  236. package/dist/server/rpc/handlers/embed.js +21 -0
  237. package/dist/server/rpc/handlers/index.d.ts +23 -0
  238. package/dist/server/rpc/handlers/index.js +22 -0
  239. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +31 -0
  240. package/dist/server/rpc/handlers/load-model/download-manager.js +88 -0
  241. package/dist/server/rpc/handlers/load-model/http.d.ts +3 -0
  242. package/dist/server/rpc/handlers/load-model/http.js +337 -0
  243. package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +4 -0
  244. package/dist/server/rpc/handlers/load-model/hyperdrive.js +332 -0
  245. package/dist/server/rpc/handlers/load-model/index.d.ts +4 -0
  246. package/dist/server/rpc/handlers/load-model/index.js +3 -0
  247. package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -0
  248. package/dist/server/rpc/handlers/load-model/resolve.js +121 -0
  249. package/dist/server/rpc/handlers/load-model-delegated.d.ts +3 -0
  250. package/dist/server/rpc/handlers/load-model-delegated.js +93 -0
  251. package/dist/server/rpc/handlers/load-model.d.ts +3 -0
  252. package/dist/server/rpc/handlers/load-model.js +41 -0
  253. package/dist/server/rpc/handlers/logging-stream.d.ts +3 -0
  254. package/dist/server/rpc/handlers/logging-stream.js +37 -0
  255. package/dist/server/rpc/handlers/provideHandler/connection.d.ts +3 -0
  256. package/dist/server/rpc/handlers/provideHandler/connection.js +25 -0
  257. package/dist/server/rpc/handlers/provideHandler/handler.d.ts +3 -0
  258. package/dist/server/rpc/handlers/provideHandler/handler.js +50 -0
  259. package/dist/server/rpc/handlers/provideHandler/proxy.d.ts +3 -0
  260. package/dist/server/rpc/handlers/provideHandler/proxy.js +22 -0
  261. package/dist/server/rpc/handlers/provideHandler.d.ts +2 -0
  262. package/dist/server/rpc/handlers/provideHandler.js +2 -0
  263. package/dist/server/rpc/handlers/rag.d.ts +3 -0
  264. package/dist/server/rpc/handlers/rag.js +67 -0
  265. package/dist/server/rpc/handlers/transcribe-stream.d.ts +3 -0
  266. package/dist/server/rpc/handlers/transcribe-stream.js +26 -0
  267. package/dist/server/rpc/handlers/translate.d.ts +3 -0
  268. package/dist/server/rpc/handlers/translate.js +51 -0
  269. package/dist/server/rpc/handlers/unload-model.d.ts +3 -0
  270. package/dist/server/rpc/handlers/unload-model.js +20 -0
  271. package/dist/server/rpc/index.d.ts +3 -0
  272. package/dist/server/rpc/index.js +2 -0
  273. package/dist/server/utils/audio/decoder.d.ts +4 -0
  274. package/dist/server/utils/audio/decoder.js +41 -0
  275. package/dist/server/utils/cache.d.ts +15 -0
  276. package/dist/server/utils/cache.js +32 -0
  277. package/dist/server/utils/hash.d.ts +5 -0
  278. package/dist/server/utils/hash.js +11 -0
  279. package/dist/server/utils/index.d.ts +5 -0
  280. package/dist/server/utils/index.js +4 -0
  281. package/dist/server/utils/model-path.d.ts +5 -0
  282. package/dist/server/utils/model-path.js +7 -0
  283. package/dist/server/worker.d.ts +6 -0
  284. package/dist/server/worker.js +77 -0
  285. package/dist/utils/withTimeout.d.ts +11 -0
  286. package/dist/utils/withTimeout.js +37 -0
  287. package/package.json +129 -0
@@ -0,0 +1,82 @@
1
+ import { handlers } from "../../server/rpc/handlers/index.js";
2
+ // Get the handler for a request type
3
+ const getHandler = (type) => {
4
+ const handler = handlers[type];
5
+ return typeof handler === "function" ? handler : undefined;
6
+ };
7
+ export async function send(request) {
8
+ if (request.type === "ping") {
9
+ return { type: "pong", number: Math.random() * 100 };
10
+ }
11
+ const handler = getHandler(request.type);
12
+ if (!handler)
13
+ throw new Error(`No handler function for ${request.type}`);
14
+ return (await handler(request));
15
+ }
16
+ export async function* stream(request) {
17
+ const handler = getHandler(request.type);
18
+ if (!handler)
19
+ throw new Error(`No handler function for ${request.type}`);
20
+ // Special handling for loadModel with progress
21
+ if (request.type === "loadModel" &&
22
+ "withProgress" in request &&
23
+ request.withProgress) {
24
+ async function* streamWithProgress() {
25
+ const queue = [];
26
+ let done = false;
27
+ const loadModelHandler = handler;
28
+ loadModelHandler(request, (update) => queue.push(update))
29
+ .then((final) => {
30
+ queue.push(final);
31
+ done = true;
32
+ })
33
+ .catch((error) => {
34
+ done = true;
35
+ throw error;
36
+ });
37
+ while (!done || queue.length > 0) {
38
+ if (queue.length > 0) {
39
+ yield queue.shift();
40
+ }
41
+ else {
42
+ await new Promise((resolve) => setTimeout(resolve, 10));
43
+ }
44
+ }
45
+ }
46
+ yield* streamWithProgress();
47
+ }
48
+ else {
49
+ yield* handler(request);
50
+ }
51
+ }
52
+ const createMockRPCRequest = () => {
53
+ let requestData = null;
54
+ return {
55
+ send(payload) {
56
+ // Parse the JSON payload to get the actual request data
57
+ requestData = JSON.parse(payload);
58
+ },
59
+ async reply() {
60
+ if (!requestData) {
61
+ throw new Error("No request data - call send() first");
62
+ }
63
+ const response = await send(requestData);
64
+ return Buffer.from(JSON.stringify(response));
65
+ },
66
+ async *createResponseStream() {
67
+ if (!requestData) {
68
+ throw new Error("No request data - call send() first");
69
+ }
70
+ for await (const response of stream(requestData)) {
71
+ yield Buffer.from(JSON.stringify(response) + "\n");
72
+ }
73
+ },
74
+ };
75
+ };
76
+ export function getRPC() {
77
+ return {
78
+ request() {
79
+ return createMockRPCRequest();
80
+ },
81
+ };
82
+ }
@@ -0,0 +1,4 @@
1
+ import RPC from "bare-rpc";
2
+ export declare function getRPC(): Promise<RPC>;
3
+ export declare const cleanup: () => void;
4
+ //# sourceMappingURL=bare-rpc-client.d.ts.map
@@ -0,0 +1,87 @@
1
+ import RPC from "bare-rpc";
2
+ import { spawn } from "bare-subprocess";
3
+ import { createServer } from "bare-net";
4
+ import os from "bare-os";
5
+ import path from "bare-path";
6
+ import process from "bare-process";
7
+ let rpcInstance = null;
8
+ let ipcServer = null;
9
+ let childProcess = null;
10
+ const cwd = process.cwd();
11
+ // Resolve worker path relative to this module's location (in the SDK)
12
+ // In Bare, we'll use a simpler path resolution
13
+ let WORKER_PATH;
14
+ if (cwd.includes("/dist/") || cwd.includes("\\dist\\")) {
15
+ // Running from compiled dist/ - worker is in same dist/ folder
16
+ const distRoot = cwd.includes("/dist/")
17
+ ? cwd.split("/dist/")[0] + "/dist"
18
+ : cwd.split("\\dist\\")[0] + "\\dist";
19
+ WORKER_PATH = path.join(distRoot, "server/worker.js");
20
+ }
21
+ else {
22
+ // Running from source - worker is in dist/ folder
23
+ WORKER_PATH = path.resolve(cwd, "dist/server/worker.js");
24
+ }
25
+ const SOCKET_PATH = path.join(os.tmpdir(), `qvac-worker-${process.pid}.sock`);
26
+ export function getRPC() {
27
+ if (rpcInstance) {
28
+ console.log("returning cached bare rpc");
29
+ return Promise.resolve(rpcInstance);
30
+ }
31
+ console.log("initRPC for bare runtime with socket:", SOCKET_PATH);
32
+ // Start IPC server (Unix socket)
33
+ const serverPromise = new Promise((resolve, reject) => {
34
+ const server = createServer((socket) => {
35
+ console.log("Worker connected via IPC socket");
36
+ // Create RPC instance using the socket
37
+ rpcInstance = new RPC(socket, () => {
38
+ // Use this for async callbacks
39
+ });
40
+ resolve(rpcInstance);
41
+ });
42
+ server.on("error", (err) => {
43
+ console.error("Failed to start IPC server:", err);
44
+ reject(err);
45
+ });
46
+ server.listen(SOCKET_PATH, () => {
47
+ console.log(`IPC server listening on ${SOCKET_PATH}`);
48
+ ipcServer = server;
49
+ // Spawn the worker process only after the socket is listening
50
+ console.log("Spawning worker at:", WORKER_PATH);
51
+ childProcess = spawn("bare", [
52
+ WORKER_PATH,
53
+ JSON.stringify({
54
+ QVAC_IPC_SOCKET_PATH: SOCKET_PATH,
55
+ HOME_DIR: os.homedir(),
56
+ }),
57
+ ], {
58
+ stdio: ["inherit", "inherit", "inherit"],
59
+ });
60
+ childProcess.on("exit", (code) => {
61
+ console.log("Worker process exited with code:", code);
62
+ // Clean up
63
+ rpcInstance = null;
64
+ if (ipcServer) {
65
+ ipcServer.close();
66
+ ipcServer = null;
67
+ }
68
+ });
69
+ childProcess.on("error", (err) => {
70
+ console.error("Worker process error:", err);
71
+ });
72
+ });
73
+ });
74
+ return serverPromise;
75
+ }
76
+ // Clean up function
77
+ export const cleanup = () => {
78
+ if (childProcess) {
79
+ childProcess.kill();
80
+ childProcess = null;
81
+ }
82
+ if (ipcServer) {
83
+ ipcServer.close();
84
+ ipcServer = null;
85
+ }
86
+ rpcInstance = null;
87
+ };
@@ -0,0 +1,3 @@
1
+ import RPC from "bare-rpc";
2
+ export declare const getRPC: () => Promise<RPC>;
3
+ //# sourceMappingURL=expo-rpc-client.d.ts.map
@@ -0,0 +1,57 @@
1
+ import RPC from "bare-rpc";
2
+ let rpcInstance = null;
3
+ let rpcPromise = null;
4
+ console.log("EXPO RPC Client bundle");
5
+ export const getRPC = async () => {
6
+ if (rpcInstance) {
7
+ return rpcInstance;
8
+ }
9
+ if (rpcPromise) {
10
+ return rpcPromise;
11
+ }
12
+ rpcPromise = (async () => {
13
+ const { Paths } = await import("expo-file-system");
14
+ const bareKitModule = await import("react-native-bare-kit");
15
+ const worklet = new bareKitModule.Worklet();
16
+ console.log("Starting worklet");
17
+ // Load the mobile bundle - this will be generated by the Expo plugin
18
+ // using the user's installed bare library versions
19
+ let mobileBundle;
20
+ try {
21
+ // We need require here or the contents of the bundle will be interpreted as a module
22
+ mobileBundle =
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ require("@qvac/sdk/worker.mobile.bundle");
25
+ }
26
+ catch (error) {
27
+ const message = "Failed to load mobile worker bundle. Make sure the QVAC Expo plugin is configured. " +
28
+ `Add '@qvac/sdk/expo-plugin' to your app.json plugins array. ` +
29
+ `Error: ${String(error)}`;
30
+ console.error(message);
31
+ throw new Error(message);
32
+ }
33
+ worklet.start("worker.bundle", mobileBundle, [
34
+ // Normalize arg number across platforms
35
+ "react-native-bare-kit",
36
+ "worker.js",
37
+ JSON.stringify({
38
+ HOME_DIR: Paths.document.uri.replace("file://", ""),
39
+ }),
40
+ ]);
41
+ console.log("Worklet started");
42
+ rpcInstance = new RPC(worklet.IPC, () => {
43
+ // Use this for async callbacks
44
+ });
45
+ return rpcInstance;
46
+ })();
47
+ try {
48
+ return await rpcPromise;
49
+ }
50
+ catch (error) {
51
+ console.error(`Failed to initialize RPC: ${String(error)}`);
52
+ throw error;
53
+ }
54
+ finally {
55
+ rpcPromise = null;
56
+ }
57
+ };
@@ -0,0 +1,9 @@
1
+ export declare function getRPC(): {
2
+ request: (command: number) => {
3
+ send: (data: string, encoding: BufferEncoding) => void;
4
+ reply: (encoding: BufferEncoding) => Promise<Buffer>;
5
+ createResponseStream: () => AsyncGenerator<unknown, void, unknown>;
6
+ };
7
+ };
8
+ export declare const cleanup: () => void;
9
+ //# sourceMappingURL=node-rpc-client.d.ts.map
@@ -0,0 +1,99 @@
1
+ import RPC from "bare-rpc";
2
+ import spawn, {} from "bare-runtime/spawn";
3
+ import { createServer } from "node:net";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ let rpcInstance = null;
10
+ let rpcPromise = null;
11
+ let bareWorkerProc = null;
12
+ // Smart path resolution for worker
13
+ let WORKER_PATH;
14
+ if (__dirname.includes("/dist/") || __dirname.includes("\\dist\\")) {
15
+ const distRoot = __dirname.includes("/dist/")
16
+ ? __dirname.split("/dist/")[0] + "/dist"
17
+ : __dirname.split("\\dist\\")[0] + "\\dist";
18
+ WORKER_PATH = path.join(distRoot, "server/worker.js");
19
+ }
20
+ else {
21
+ WORKER_PATH = path.resolve(__dirname, "../../dist/server/worker.js");
22
+ }
23
+ const SOCKET_PATH = process.platform === "win32"
24
+ ? `\\\\.\\pipe\\qvac-worker-${process.pid}`
25
+ : path.join(os.tmpdir(), `qvac-worker-${process.pid}.sock`);
26
+ async function ensureRPC() {
27
+ if (rpcInstance)
28
+ return rpcInstance;
29
+ if (rpcPromise)
30
+ return rpcPromise;
31
+ rpcPromise = new Promise((resolve, reject) => {
32
+ const server = createServer((socket) => {
33
+ rpcInstance = new RPC(socket, () => { });
34
+ resolve(rpcInstance);
35
+ });
36
+ server.on("error", reject);
37
+ server.listen(SOCKET_PATH, () => {
38
+ bareWorkerProc = spawn("bare", {
39
+ args: [
40
+ WORKER_PATH,
41
+ JSON.stringify({
42
+ QVAC_IPC_SOCKET_PATH: SOCKET_PATH,
43
+ HOME_DIR: os.homedir(),
44
+ }),
45
+ ],
46
+ stdio: ["inherit", "inherit", "inherit"],
47
+ });
48
+ });
49
+ });
50
+ return rpcPromise;
51
+ }
52
+ const mockRPC = {
53
+ request: (command) => {
54
+ let sentData = null;
55
+ return {
56
+ send: (data, encoding) => {
57
+ sentData = { data, encoding };
58
+ },
59
+ reply: async (encoding) => {
60
+ if (!sentData) {
61
+ throw new Error("Must call send() before reply()");
62
+ }
63
+ const rpc = await ensureRPC();
64
+ const req = rpc.request(command);
65
+ req.send(sentData.data, sentData.encoding);
66
+ const response = await req.reply(encoding);
67
+ return Buffer.isBuffer(response)
68
+ ? response
69
+ : Buffer.from(typeof response === "string" ? response : "", encoding);
70
+ },
71
+ createResponseStream: async function* () {
72
+ if (!sentData) {
73
+ throw new Error("Must call send() before createResponseStream()");
74
+ }
75
+ const rpc = await ensureRPC();
76
+ const req = rpc.request(command);
77
+ req.send(sentData.data, sentData.encoding);
78
+ const stream = req.createResponseStream({
79
+ encoding: sentData.encoding,
80
+ });
81
+ for await (const chunk of stream) {
82
+ yield chunk;
83
+ }
84
+ },
85
+ };
86
+ },
87
+ };
88
+ export function getRPC() {
89
+ return mockRPC;
90
+ }
91
+ export const cleanup = () => {
92
+ console.log("🧹 Cleaning up RPC client");
93
+ if (bareWorkerProc) {
94
+ console.log("šŸ»šŸ”« Killing bare worker process");
95
+ bareWorkerProc.kill("SIGTERM");
96
+ }
97
+ };
98
+ // Register cleanup handlers for the parent process
99
+ process.once("exit", cleanup);
@@ -0,0 +1,5 @@
1
+ import type RPC from "bare-rpc";
2
+ import { type Request, type Response, type RPCOptions } from "../../schemas/index";
3
+ export declare function send<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): Promise<Response>;
4
+ export declare function stream<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): AsyncGenerator<Response>;
5
+ //# sourceMappingURL=rpc-client.d.ts.map
@@ -0,0 +1,91 @@
1
+ import { requestSchema, responseSchema, } from "../../schemas/index.js";
2
+ import { RPCError } from "./rpc-error.js";
3
+ import { withTimeout, withTimeoutStream } from "../../utils/withTimeout.js";
4
+ let rpcInstance = null;
5
+ function checkAndThrowError(response) {
6
+ if (response.type === "error") {
7
+ throw new RPCError(response);
8
+ }
9
+ }
10
+ async function getRPC() {
11
+ if (rpcInstance)
12
+ return rpcInstance;
13
+ const isRN = typeof navigator !== "undefined" && navigator.product === "ReactNative";
14
+ // Detect Bare runtime - Bare exposes global Bare object
15
+ // TODO we can use something like https://www.npmjs.com/package/which-runtime at some point
16
+ const isBare = typeof globalThis !== "undefined" && "Bare" in globalThis;
17
+ // TODO Lots of type unsafe hacks to make this work cross platform
18
+ if (isRN) {
19
+ console.log("React Native runtime detected");
20
+ // Only import expo client for React Native - Metro won't bundle the Node client
21
+ const expoRPCClientPath = "./expo-rpc-client";
22
+ const mod = (await import(expoRPCClientPath));
23
+ rpcInstance = await (typeof mod === "function" ? mod() : mod.getRPC());
24
+ return rpcInstance;
25
+ }
26
+ else if (isBare) {
27
+ console.log("Bare runtime detected");
28
+ // Use dynamic import for Bare client
29
+ const mod = await import("./bare-client.js");
30
+ rpcInstance = mod.getRPC();
31
+ return rpcInstance;
32
+ }
33
+ else {
34
+ console.log("Node runtime detected");
35
+ // Use dynamic import for Node client to prevent Metro from bundling it
36
+ const mod = await import("./node-rpc-client.js");
37
+ rpcInstance = mod.getRPC();
38
+ return rpcInstance;
39
+ }
40
+ }
41
+ export async function send(request, rpc, options) {
42
+ const parsedRequest = requestSchema.parse(request);
43
+ const rpcInstance = rpc || (await getRPC());
44
+ const req = rpcInstance.request(1);
45
+ // TODO temp for debugging, find a better solution to exclude large payloads
46
+ // Log request type and basic info, avoid logging large payloads
47
+ if (request.type === "transcribeStream") {
48
+ console.log("RPC Client sending:", {
49
+ type: request.type,
50
+ modelId: request.modelId,
51
+ audioChunkSize: request.audioChunk.length,
52
+ });
53
+ }
54
+ else {
55
+ console.log("RPC Client sending:", request);
56
+ }
57
+ const payload = JSON.stringify(parsedRequest);
58
+ req.send(payload, "utf-8");
59
+ const response = await withTimeout(req.reply("utf-8"), options?.timeout);
60
+ const resPayload = responseSchema.parse(JSON.parse(response?.toString() || "{}"));
61
+ console.log("ResPayload", { type: resPayload.type });
62
+ checkAndThrowError(resPayload);
63
+ return resPayload;
64
+ }
65
+ export async function* stream(request, rpc, options = {}) {
66
+ const parsedRequest = requestSchema.parse(request);
67
+ const rpcInstance = rpc || (await getRPC());
68
+ const req = rpcInstance.request(1);
69
+ req.send(JSON.stringify(parsedRequest), "utf-8");
70
+ const responseStream = req.createResponseStream({ encoding: "utf-8" });
71
+ let buffer = "";
72
+ async function* processStream() {
73
+ for await (const chunk of responseStream) {
74
+ yield chunk;
75
+ }
76
+ }
77
+ const streamWithTimeout = withTimeoutStream(processStream(), options?.timeout);
78
+ for await (const chunk of streamWithTimeout) {
79
+ buffer += chunk.toString();
80
+ // Process complete lines (newline-delimited JSON)
81
+ const lines = buffer.split("\n");
82
+ buffer = lines.pop() || ""; // Keep incomplete line in buffer
83
+ for (const line of lines) {
84
+ if (line.trim()) {
85
+ const response = responseSchema.parse(JSON.parse(line));
86
+ checkAndThrowError(response);
87
+ yield response;
88
+ }
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,19 @@
1
+ import type { ErrorResponse } from "../../schemas/index";
2
+ export declare class RPCError extends Error {
3
+ readonly timestamp?: string;
4
+ readonly remoteStack?: string;
5
+ readonly code?: number;
6
+ readonly cause?: unknown;
7
+ readonly isQvacError: boolean;
8
+ constructor(errorResponse: ErrorResponse);
9
+ toJSON(): {
10
+ name: string;
11
+ code: number | undefined;
12
+ message: string;
13
+ stack: string | undefined;
14
+ cause: unknown;
15
+ timestamp: string | undefined;
16
+ isQvacError: boolean;
17
+ };
18
+ }
19
+ //# sourceMappingURL=rpc-error.d.ts.map
@@ -0,0 +1,39 @@
1
+ export class RPCError extends Error {
2
+ timestamp;
3
+ remoteStack;
4
+ code;
5
+ cause;
6
+ isQvacError;
7
+ constructor(errorResponse) {
8
+ super(errorResponse.message);
9
+ // If this was originally a QvacError, preserve its structure
10
+ if (errorResponse.name && errorResponse.code) {
11
+ this.name = errorResponse.name;
12
+ this.code = errorResponse.code;
13
+ this.cause = errorResponse.cause;
14
+ this.isQvacError = true;
15
+ }
16
+ else {
17
+ this.name = "RPCError";
18
+ this.isQvacError = false;
19
+ }
20
+ if (errorResponse.timestamp) {
21
+ this.timestamp = errorResponse.timestamp;
22
+ }
23
+ if (errorResponse.stack) {
24
+ this.remoteStack = errorResponse.stack;
25
+ this.stack = `${this.stack}\n--- Worker Stack ---\n${errorResponse.stack}`;
26
+ }
27
+ }
28
+ toJSON() {
29
+ return {
30
+ name: this.name,
31
+ code: this.code,
32
+ message: this.message,
33
+ stack: this.stack,
34
+ cause: this.cause,
35
+ timestamp: this.timestamp,
36
+ isQvacError: this.isQvacError,
37
+ };
38
+ }
39
+ }
@@ -0,0 +1,3 @@
1
+ export declare const FORMATS_NEEDING_DECODE: readonly [".mp3", ".m4a", ".ogg", ".flac", ".aac", ".wav"];
2
+ export declare const SUPPORTED_AUDIO_FORMATS: readonly [".mp3", ".m4a", ".ogg", ".wav", ".flac", ".aac", ".raw"];
3
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1,17 @@
1
+ export const FORMATS_NEEDING_DECODE = [
2
+ ".mp3",
3
+ ".m4a",
4
+ ".ogg",
5
+ ".flac",
6
+ ".aac",
7
+ ".wav",
8
+ ];
9
+ export const SUPPORTED_AUDIO_FORMATS = [
10
+ ".mp3",
11
+ ".m4a",
12
+ ".ogg",
13
+ ".wav",
14
+ ".flac",
15
+ ".aac",
16
+ ".raw",
17
+ ];
@@ -0,0 +1,2 @@
1
+ export * from "./audio";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from "./audio.js";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=consumer.d.ts.map
@@ -0,0 +1,56 @@
1
+ import { completion, LLAMA_3_2_1B_INST_Q4_0, loadModel } from "@qvac/sdk";
2
+ // Topic hex (required)
3
+ const topicHex = process.argv[2];
4
+ if (!topicHex) {
5
+ console.error("āŒ Topic hex is required. Usage: node consumer.ts <topic-hex> <provider-public-key> [consumer-seed]");
6
+ process.exit(1);
7
+ }
8
+ // Provider public key (required)
9
+ const providerPublicKey = process.argv[3];
10
+ if (!providerPublicKey) {
11
+ console.error("āŒ Provider public key is required. Usage: node consumer.ts <topic-hex> <provider-public-key> [consumer-seed]");
12
+ process.exit(1);
13
+ }
14
+ try {
15
+ // Optional: Consumer seed for deterministic consumer identity (for firewall testing)
16
+ const consumerSeed = process.argv[4];
17
+ process.env["QVAC_HYPERSWARM_SEED"] = consumerSeed;
18
+ console.log(`šŸš€ Testing delegated inference`);
19
+ console.log(`šŸ“” Topic: ${topicHex}`);
20
+ console.log(`šŸ”‘ Provider: ${providerPublicKey}`);
21
+ if (consumerSeed) {
22
+ console.log(`šŸ”‘ Consumer seed: ${consumerSeed.substring(0, 16)}... (deterministic identity)`);
23
+ }
24
+ else {
25
+ console.log(`šŸŽ² No consumer seed provided (random identity)`);
26
+ }
27
+ const modelId = await loadModel({
28
+ modelSrc: LLAMA_3_2_1B_INST_Q4_0,
29
+ modelType: "llm",
30
+ delegate: {
31
+ topic: topicHex,
32
+ providerPublicKey,
33
+ timeout: 5_000, // Optional: 5 second timeout for delegated requests
34
+ fallbackToLocal: true, // Optional: Fall back to local inference if delegation fails
35
+ },
36
+ onProgress: (progress) => {
37
+ console.log(`šŸ“Š Download progress: ${progress.percentage.toFixed(1)}% (${progress.downloaded}/${progress.total} bytes)`);
38
+ },
39
+ });
40
+ console.log(`āœ… Delegated model registered: ${modelId}`);
41
+ const response = completion({
42
+ modelId,
43
+ history: [{ role: "user", content: "Hello!" }],
44
+ stream: true,
45
+ });
46
+ for await (const token of response.tokenStream) {
47
+ console.log(`šŸ“Ø Response: ${token}`);
48
+ }
49
+ console.log("šŸ” Stats:", await response.stats);
50
+ console.log("\nšŸŽÆ Delegation infrastructure working! Server correctly detected and routed the delegated request.");
51
+ process.exit(0);
52
+ }
53
+ catch (error) {
54
+ console.error("āŒ Error:", error);
55
+ process.exit(1);
56
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1,57 @@
1
+ import { startQVACProvider } from "@qvac/sdk";
2
+ // Random topic if not provided
3
+ const topic = process.argv[2] ||
4
+ "66646f696865726f6569686a726530776a66646f696865726f6569686a726530";
5
+ // Optional: Seed for deterministic provider identity (64-character hex string)
6
+ const seed = process.argv[3];
7
+ process.env["QVAC_HYPERSWARM_SEED"] = seed;
8
+ // Optional: Consumer public key for firewall (allow only this consumer)
9
+ const allowedConsumerPublicKey = process.argv[4];
10
+ console.log(`šŸš€ Starting provider service with topic: ${topic}...`);
11
+ try {
12
+ if (allowedConsumerPublicKey) {
13
+ console.log(`šŸ”’ Firewall enabled: only allowing consumer ${allowedConsumerPublicKey}`);
14
+ }
15
+ // Start the provider service with optional firewall and seed
16
+ const response = await startQVACProvider({
17
+ topic,
18
+ firewall: allowedConsumerPublicKey
19
+ ? {
20
+ mode: "allow",
21
+ publicKeys: [allowedConsumerPublicKey],
22
+ }
23
+ : undefined,
24
+ });
25
+ console.log("āœ… Provider service started successfully!");
26
+ console.log("šŸ”— Provider is now available for delegated inference requests");
27
+ console.log("");
28
+ console.log("šŸ“‹ Connection Details:");
29
+ console.log(` šŸ“” Topic (shared): ${topic}`);
30
+ console.log(` šŸ†” Provider Public Key (unique): ${response.publicKey}`);
31
+ console.log("");
32
+ console.log("šŸ’” Consumer command:");
33
+ console.log(` node consumer.ts ${topic} ${response.publicKey}`);
34
+ console.log("");
35
+ console.log("šŸ’” To reproduce this provider identity:");
36
+ console.log(` node provider.ts ${topic} ${seed || "<random-seed>"}`);
37
+ if (!seed) {
38
+ console.log(" (Note: seed was random this time, set one for reproducible identity)");
39
+ }
40
+ console.log("");
41
+ console.log("šŸ”’ For firewall testing:");
42
+ console.log(" 1. Generate a consumer seed (64-char hex)");
43
+ console.log(" 2. Get consumer public key: getConsumerPublicKey(consumerSeed)");
44
+ console.log(" 3. Restart provider with consumer public key as 4th argument");
45
+ console.log(` 4. Run consumer with: node consumer.ts ${topic} ${response.publicKey} <consumer-seed>`);
46
+ // Keep the process running
47
+ console.log("šŸ“” Provider is running... Press Ctrl+C to stop");
48
+ process.on("SIGINT", () => {
49
+ console.log("\nšŸ›‘ Provider service stopped");
50
+ process.exit(0);
51
+ });
52
+ process.stdin.resume();
53
+ }
54
+ catch (error) {
55
+ console.error("āŒ Error:", error);
56
+ process.exit(1);
57
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=download-with-cancel.d.ts.map