@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,3 @@
1
+ import type { CompletionStreamRequest, CompletionStreamResponse } from "../../../schemas/index";
2
+ export declare function handleCompletionStreamDelegated(request: CompletionStreamRequest): AsyncGenerator<CompletionStreamResponse>;
3
+ //# sourceMappingURL=completion-stream-delegated.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { getModelEntry } from "../../bare/registry/model-registry.js";
2
+ import { getRPC } from "../../bare/delegate-rpc-client.js";
3
+ import { stream } from "../../../client/rpc/rpc-client.js";
4
+ export async function* handleCompletionStreamDelegated(request) {
5
+ // Get delegation info from model registry
6
+ const entry = getModelEntry(request.modelId);
7
+ if (!entry?.isDelegated || !entry.delegated) {
8
+ throw new Error(`Model ${request.modelId} is not a delegated model`);
9
+ }
10
+ const { topic, providerPublicKey, timeout } = entry.delegated;
11
+ try {
12
+ console.log(`📤 Sending delegated completionStream request to provider: ${providerPublicKey}${timeout ? `, timeout: ${timeout}ms` : ""}`);
13
+ // Create RPC instance for this HyperSwarm peer
14
+ const rpc = await getRPC(topic, providerPublicKey, { timeout });
15
+ // Use the regular stream function with the HyperSwarm RPC instance
16
+ const responseStream = stream(request, rpc, { timeout });
17
+ // Yield each response from the stream
18
+ for await (const response of responseStream) {
19
+ yield response;
20
+ }
21
+ }
22
+ catch (error) {
23
+ console.error("Error in delegated completion stream:", error);
24
+ yield {
25
+ type: "completionStream",
26
+ token: `Error communicating with provider: ${error instanceof Error ? error.message : String(error)}`,
27
+ done: true,
28
+ };
29
+ }
30
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompletionStreamRequest, CompletionStreamResponse } from "../../../schemas/index";
2
+ export declare function handleCompletionStream(request: CompletionStreamRequest): AsyncGenerator<CompletionStreamResponse>;
3
+ //# sourceMappingURL=completion-stream.d.ts.map
@@ -0,0 +1,52 @@
1
+ import { completion } from "../../bare/addons/llamacpp/index.js";
2
+ export async function* handleCompletionStream(request) {
3
+ try {
4
+ // Log tools if provided
5
+ if (request.tools) {
6
+ console.log("Tools passed to completionStream:", request.tools);
7
+ }
8
+ const filteredHistory = request.history.map(({ role, content, attachments }) => ({
9
+ role,
10
+ content,
11
+ attachments: attachments ?? [],
12
+ }));
13
+ const stream = completion({
14
+ history: filteredHistory,
15
+ modelId: request.modelId,
16
+ kvCache: request.kvCache,
17
+ });
18
+ let stats;
19
+ let done = false;
20
+ let buffer = "";
21
+ while (!done) {
22
+ const result = await stream.next();
23
+ if (result.done) {
24
+ stats = result.value;
25
+ done = true;
26
+ }
27
+ else {
28
+ buffer += result.value;
29
+ if (request.stream) {
30
+ yield {
31
+ type: "completionStream",
32
+ token: result.value,
33
+ };
34
+ }
35
+ }
36
+ }
37
+ yield {
38
+ type: "completionStream",
39
+ token: buffer,
40
+ done: true,
41
+ stats,
42
+ };
43
+ }
44
+ catch (error) {
45
+ console.error("Error during completion stream:", error);
46
+ yield {
47
+ type: "completionStream",
48
+ token: "",
49
+ error: error instanceof Error ? error.message : "Unknown error",
50
+ };
51
+ }
52
+ }
@@ -0,0 +1,3 @@
1
+ import type { DownloadAssetRequest, DownloadAssetResponse, ModelProgressUpdate } from "../../../schemas/index";
2
+ export declare function handleDownloadAsset(request: DownloadAssetRequest, progressCallback?: (update: ModelProgressUpdate) => void): Promise<DownloadAssetResponse>;
3
+ //# sourceMappingURL=download-asset.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { resolveModelPath } from "./load-model/resolve.js";
2
+ import path from "bare-path";
3
+ export async function handleDownloadAsset(request, progressCallback) {
4
+ const { assetSrc, seed } = request;
5
+ try {
6
+ const assetPath = await resolveModelPath(assetSrc, progressCallback, seed);
7
+ return {
8
+ type: "downloadAsset",
9
+ success: true,
10
+ assetId: path.basename(assetPath),
11
+ };
12
+ }
13
+ catch (error) {
14
+ console.error("Error downloading asset:", error);
15
+ return {
16
+ type: "downloadAsset",
17
+ success: false,
18
+ error: error instanceof Error ? error.message : "Unknown error",
19
+ };
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ import type { EmbedRequest, EmbedResponse } from "../../../schemas/index";
2
+ export declare function handleEmbed(request: EmbedRequest): Promise<EmbedResponse>;
3
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { embed } from "../../bare/addons/llamacpp/index.js";
2
+ export async function handleEmbed(request) {
3
+ const { modelId, text } = request;
4
+ try {
5
+ const embedding = await embed({ modelId, text });
6
+ return {
7
+ type: "embed",
8
+ success: true,
9
+ embedding,
10
+ };
11
+ }
12
+ catch (error) {
13
+ console.error("Error during embedding:", error);
14
+ return {
15
+ type: "embed",
16
+ success: false,
17
+ embedding: [],
18
+ error: error instanceof Error ? error.message : "Unknown error",
19
+ };
20
+ }
21
+ }
@@ -0,0 +1,23 @@
1
+ import { handleCompletionStream } from "./completion-stream";
2
+ import { handleDownloadAsset } from "./download-asset";
3
+ import { handleLoadModel } from "./load-model/index";
4
+ import { handleUnloadModel } from "./unload-model";
5
+ import { handleEmbed } from "./embed";
6
+ import { handleTranscribeStream } from "./transcribe-stream";
7
+ import { provideHandler } from "./provideHandler";
8
+ import { handleTranslate } from "./translate";
9
+ import { handleLoggingStream } from "./logging-stream";
10
+ import { handleRag } from "./rag";
11
+ export declare const handlers: {
12
+ completionStream: typeof handleCompletionStream;
13
+ downloadAsset: typeof handleDownloadAsset;
14
+ loadModel: typeof handleLoadModel;
15
+ unloadModel: typeof handleUnloadModel;
16
+ embed: typeof handleEmbed;
17
+ transcribeStream: typeof handleTranscribeStream;
18
+ provide: typeof provideHandler;
19
+ translate: typeof handleTranslate;
20
+ loggingStream: typeof handleLoggingStream;
21
+ rag: typeof handleRag;
22
+ };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,22 @@
1
+ import { handleCompletionStream } from "./completion-stream.js";
2
+ import { handleDownloadAsset } from "./download-asset.js";
3
+ import { handleLoadModel } from "./load-model/index.js";
4
+ import { handleUnloadModel } from "./unload-model.js";
5
+ import { handleEmbed } from "./embed.js";
6
+ import { handleTranscribeStream } from "./transcribe-stream.js";
7
+ import { provideHandler } from "./provideHandler.js";
8
+ import { handleTranslate } from "./translate.js";
9
+ import { handleLoggingStream } from "./logging-stream.js";
10
+ import { handleRag } from "./rag.js";
11
+ export const handlers = {
12
+ completionStream: handleCompletionStream,
13
+ downloadAsset: handleDownloadAsset,
14
+ loadModel: handleLoadModel,
15
+ unloadModel: handleUnloadModel,
16
+ embed: handleEmbed,
17
+ transcribeStream: handleTranscribeStream,
18
+ provide: provideHandler,
19
+ translate: handleTranslate,
20
+ loggingStream: handleLoggingStream,
21
+ rag: handleRag,
22
+ };
@@ -0,0 +1,31 @@
1
+ import { type DownloadEntry } from "../../../../schemas/index";
2
+ export declare const getActiveDownload: (key: string) => DownloadEntry | undefined;
3
+ export declare const registerDownload: (key: string, entry: DownloadEntry) => void;
4
+ export declare const unregisterDownload: (key: string) => void;
5
+ export declare const createHyperdriveDownloadKey: (hyperdriveKey: string, modelFileName: string) => string;
6
+ export declare const createHttpDownloadKey: (url: string) => string;
7
+ export declare const getAllActiveDownloads: () => Map<string, DownloadEntry>;
8
+ export declare const setClearCacheFlag: (downloadKey: string, clearCache: boolean) => void;
9
+ export declare const shouldClearCache: (downloadKey: string) => boolean;
10
+ export declare const clearClearCacheFlag: (downloadKey: string) => void;
11
+ export declare const createCancelFunction: (downloadKey: string, clearCache?: boolean) => () => void;
12
+ export declare const cancelAllDownloads: () => void;
13
+ export declare const getDownloadStats: () => {
14
+ activeCount: number;
15
+ downloads: ({
16
+ hyperdriveKey: string;
17
+ modelFileName: string;
18
+ key: string;
19
+ startTime: number;
20
+ duration: number;
21
+ type: "hyperdrive" | "http";
22
+ } | {
23
+ url: string;
24
+ modelPath: string;
25
+ key: string;
26
+ startTime: number;
27
+ duration: number;
28
+ type: "hyperdrive" | "http";
29
+ })[];
30
+ };
31
+ //# sourceMappingURL=download-manager.d.ts.map
@@ -0,0 +1,88 @@
1
+ import {} from "../../../../schemas/index.js";
2
+ import process from "bare-process";
3
+ const activeDownloads = new Map();
4
+ const clearCacheFlags = new Map();
5
+ export const getActiveDownload = (key) => activeDownloads.get(key);
6
+ export const registerDownload = (key, entry) => {
7
+ activeDownloads.set(key, entry);
8
+ registerCleanupHandlers();
9
+ };
10
+ export const unregisterDownload = (key) => {
11
+ activeDownloads.delete(key);
12
+ };
13
+ export const createHyperdriveDownloadKey = (hyperdriveKey, modelFileName) => `${hyperdriveKey}:${modelFileName}`;
14
+ export const createHttpDownloadKey = (url) => `http:${url}`;
15
+ export const getAllActiveDownloads = () => new Map(activeDownloads);
16
+ export const setClearCacheFlag = (downloadKey, clearCache) => {
17
+ if (clearCache) {
18
+ clearCacheFlags.set(downloadKey, true);
19
+ }
20
+ else {
21
+ clearCacheFlags.delete(downloadKey);
22
+ }
23
+ };
24
+ export const shouldClearCache = (downloadKey) => clearCacheFlags.get(downloadKey) ?? false;
25
+ export const clearClearCacheFlag = (downloadKey) => {
26
+ clearCacheFlags.delete(downloadKey);
27
+ };
28
+ export const createCancelFunction = (downloadKey, clearCache = false) => () => {
29
+ const entry = getActiveDownload(downloadKey);
30
+ if (!entry) {
31
+ return;
32
+ }
33
+ // Set flag for the download handlers to check
34
+ setClearCacheFlag(downloadKey, clearCache);
35
+ entry.abortController.abort();
36
+ unregisterDownload(downloadKey);
37
+ };
38
+ export const cancelAllDownloads = () => {
39
+ console.log(`🧹 Cancelling ${activeDownloads.size} active downloads`);
40
+ Array.from(activeDownloads.keys()).forEach((key) => createCancelFunction(key)());
41
+ };
42
+ export const getDownloadStats = () => ({
43
+ activeCount: activeDownloads.size,
44
+ downloads: Array.from(activeDownloads.entries()).map(([key, entry]) => ({
45
+ key,
46
+ startTime: entry.startTime,
47
+ duration: Date.now() - entry.startTime,
48
+ type: entry.type,
49
+ ...(entry.type === "hyperdrive"
50
+ ? {
51
+ hyperdriveKey: entry.hyperdriveKey,
52
+ modelFileName: entry.modelFileName,
53
+ }
54
+ : {
55
+ url: entry.url,
56
+ modelPath: entry.modelPath,
57
+ }),
58
+ })),
59
+ });
60
+ // Register cleanup handlers for graceful shutdown
61
+ let cleanupRegistered = false;
62
+ let isCleaningUp = false;
63
+ const registerCleanupHandlers = () => {
64
+ if (cleanupRegistered)
65
+ return;
66
+ cleanupRegistered = true;
67
+ const cleanup = async () => {
68
+ if (isCleaningUp)
69
+ return;
70
+ isCleaningUp = true;
71
+ try {
72
+ const downloadPromises = Array.from(activeDownloads.values()).map((entry) => entry.promise.catch(() => { }));
73
+ cancelAllDownloads();
74
+ if (downloadPromises.length > 0) {
75
+ await Promise.allSettled(downloadPromises);
76
+ }
77
+ }
78
+ catch (error) {
79
+ console.error("❌ Error during download cleanup:", error);
80
+ }
81
+ };
82
+ process.on("SIGTERM", () => {
83
+ void cleanup();
84
+ });
85
+ process.on("SIGINT", () => {
86
+ void cleanup();
87
+ });
88
+ };
@@ -0,0 +1,3 @@
1
+ import type { ModelProgressUpdate } from "../../../../schemas/index";
2
+ export declare function downloadModelFromHttp(url: string, progressCallback?: (progress: ModelProgressUpdate) => void): Promise<string>;
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1,337 @@
1
+ import fs, { promises as fsPromises } from "bare-fs";
2
+ import { Readable } from "bare-stream";
3
+ import fetch from "bare-fetch";
4
+ import { AbortController } from "bare-abort-controller";
5
+ import { getModelsCacheDir, generateShortHash } from "../../../utils/index.js";
6
+ import { getActiveDownload, registerDownload, unregisterDownload, createHttpDownloadKey, shouldClearCache, clearClearCacheFlag, } from "./download-manager.js";
7
+ function extractFilenameFromUrl(url) {
8
+ // Parse URL to get the filename from the path
9
+ const urlParts = url.split("/");
10
+ const filename = urlParts[urlParts.length - 1] || "model.gguf";
11
+ // Remove query parameters if present
12
+ const cleanFilename = filename.split("?")[0] || "model.gguf";
13
+ return cleanFilename;
14
+ }
15
+ async function validateCachedFile(modelPath, url, signal) {
16
+ try {
17
+ await fsPromises.access(modelPath);
18
+ const localStats = await fsPromises.stat(modelPath);
19
+ const localSize = localStats.size;
20
+ // Get expected size from HEAD request
21
+ let expectedSize = 0;
22
+ try {
23
+ const response = await fetch(url, {
24
+ method: "HEAD",
25
+ ...(signal && { signal }),
26
+ });
27
+ expectedSize = parseInt(response.headers.get("content-length") || "0");
28
+ }
29
+ catch (error) {
30
+ console.log(`⚠️ Could not get expected file size from HEAD request: ${String(error)}`);
31
+ console.log(`✅ Using cached HTTP model: ${modelPath}`);
32
+ return modelPath;
33
+ }
34
+ if (expectedSize > 0 && localSize !== expectedSize) {
35
+ console.log(`📥 Cached file size mismatch. Expected: ${expectedSize}, Found: ${localSize}. Re-downloading...`);
36
+ return null;
37
+ }
38
+ console.log(`✅ Using cached HTTP model: ${modelPath}`);
39
+ return modelPath;
40
+ }
41
+ catch {
42
+ // File doesn't exist
43
+ return null;
44
+ }
45
+ }
46
+ async function performHttpDownload(url, modelPath, downloadKey, progressCallback, signal) {
47
+ if (signal?.aborted) {
48
+ throw new Error("Download cancelled");
49
+ }
50
+ console.log(`📥 Downloading model from HTTP: ${url}`);
51
+ // Check if file exists for resuming
52
+ let startOffset = 0;
53
+ let downloadedBytes = 0;
54
+ try {
55
+ const existingStats = await fsPromises.stat(modelPath);
56
+ startOffset = existingStats.size;
57
+ downloadedBytes = startOffset;
58
+ console.log(`📥 Resuming download from byte ${startOffset}`);
59
+ }
60
+ catch {
61
+ console.log(`📥 Starting fresh download`);
62
+ }
63
+ // Prepare headers for resume if needed
64
+ const headers = {
65
+ "User-Agent": "qvac-sdk",
66
+ };
67
+ if (startOffset > 0) {
68
+ headers["Range"] = `bytes=${startOffset}-`;
69
+ }
70
+ // Make the fetch request
71
+ const response = await fetch(url, {
72
+ method: "GET",
73
+ headers,
74
+ ...(signal && { signal }),
75
+ // bare-fetch automatically follows redirects
76
+ });
77
+ if (!response.ok) {
78
+ // Check if it's a 416 (Range Not Satisfiable) - file already complete
79
+ if (response.status === 416 && startOffset > 0) {
80
+ console.log(`✅ File already completely downloaded`);
81
+ return;
82
+ }
83
+ // Check if server doesn't support range requests
84
+ if (response.status === 200 && startOffset > 0) {
85
+ console.log(`⚠️ Server doesn't support resume, starting fresh download`);
86
+ startOffset = 0;
87
+ downloadedBytes = 0;
88
+ // Retry without Range header
89
+ const freshResponse = await fetch(url, {
90
+ method: "GET",
91
+ headers: {
92
+ "User-Agent": "qvac-sdk/1.0",
93
+ },
94
+ ...(signal && { signal }),
95
+ });
96
+ if (!freshResponse.ok) {
97
+ throw new Error(`HTTP error: ${freshResponse.status} ${freshResponse.statusText}`);
98
+ }
99
+ // Use the fresh response
100
+ Object.assign(response, freshResponse);
101
+ }
102
+ else if (response.status !== 206) {
103
+ // 206 is Partial Content (successful resume)
104
+ throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
105
+ }
106
+ }
107
+ // Get total size from headers
108
+ let totalBytes = 0;
109
+ const contentLength = response.headers.get("content-length");
110
+ if (response.status === 206) {
111
+ // For resumed downloads, parse Content-Range header
112
+ const contentRange = response.headers.get("content-range");
113
+ if (contentRange) {
114
+ const match = contentRange.match(/bytes \d+-\d+\/(\d+)/);
115
+ if (match && match[1]) {
116
+ totalBytes = parseInt(match[1]);
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ // For fresh downloads
122
+ totalBytes = contentLength ? parseInt(contentLength) : 0;
123
+ }
124
+ console.log(`📏 Total size: ${totalBytes} bytes (${(totalBytes / 1024 / 1024).toFixed(2)} MB)`);
125
+ // Create write stream (append if resuming)
126
+ const writeStreamOptions = startOffset > 0 && response.status === 206 ? { flags: "a" } : {};
127
+ const writeStream = fs.createWriteStream(modelPath, writeStreamOptions);
128
+ // Get the response body
129
+ const body = response.body;
130
+ if (!body) {
131
+ throw new Error("No response body received");
132
+ }
133
+ try {
134
+ // Check if body has pipe method (it's a Node/Bare stream)
135
+ const isReadable = body instanceof Readable ||
136
+ (typeof body.pipe === "function" &&
137
+ typeof body.on === "function");
138
+ if (isReadable) {
139
+ // Track progress by intercepting data events if possible
140
+ body.on("data", (chunk) => {
141
+ downloadedBytes += chunk.length;
142
+ if (progressCallback) {
143
+ progressCallback({
144
+ type: "modelProgress",
145
+ downloaded: downloadedBytes,
146
+ total: totalBytes,
147
+ percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
148
+ downloadKey,
149
+ });
150
+ }
151
+ });
152
+ // Pipe directly to file
153
+ body.pipe(writeStream);
154
+ // Wait for download to complete
155
+ await new Promise((resolve, reject) => {
156
+ // Handle abort signal
157
+ const abortHandler = () => {
158
+ const error = new Error("Download cancelled");
159
+ body.destroy();
160
+ writeStream.destroy();
161
+ reject(error);
162
+ };
163
+ if (signal) {
164
+ signal.addEventListener("abort", abortHandler);
165
+ }
166
+ writeStream.on("finish", () => {
167
+ console.log(`✅ Model downloaded successfully to ${modelPath}`);
168
+ if (signal) {
169
+ signal.removeEventListener("abort", abortHandler);
170
+ }
171
+ resolve(undefined);
172
+ });
173
+ writeStream.on("error", reject);
174
+ body.on("error", reject);
175
+ });
176
+ }
177
+ else if (body[Symbol.asyncIterator]) {
178
+ // Body is an async iterable (for await...of)
179
+ for await (const chunk of body) {
180
+ // Check if abort signal is triggered
181
+ if (signal && signal.aborted) {
182
+ writeStream.destroy();
183
+ throw new Error("Download cancelled");
184
+ }
185
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
186
+ downloadedBytes += buffer.length;
187
+ if (progressCallback) {
188
+ progressCallback({
189
+ type: "modelProgress",
190
+ downloaded: downloadedBytes,
191
+ total: totalBytes,
192
+ percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
193
+ downloadKey,
194
+ });
195
+ }
196
+ // Write chunk to file
197
+ await new Promise((resolve, reject) => {
198
+ writeStream.write(buffer, (err) => {
199
+ if (err)
200
+ reject(new Error(err instanceof Error ? err.message : String(err)));
201
+ else
202
+ resolve();
203
+ });
204
+ });
205
+ }
206
+ // Close the write stream
207
+ await new Promise((resolve, reject) => {
208
+ writeStream.end(() => {
209
+ console.log(`✅ Model downloaded successfully to ${modelPath}`);
210
+ resolve();
211
+ });
212
+ writeStream.on("error", reject);
213
+ });
214
+ }
215
+ else {
216
+ // Fallback: try to use getReader() if it's a ReadableStream
217
+ const readableStreamBody = body;
218
+ const reader = readableStreamBody.getReader
219
+ ? readableStreamBody.getReader()
220
+ : null;
221
+ if (reader) {
222
+ try {
223
+ while (true) {
224
+ const { done, value } = await reader.read();
225
+ if (done)
226
+ break;
227
+ const buffer = Buffer.from(value);
228
+ downloadedBytes += buffer.length;
229
+ if (progressCallback) {
230
+ progressCallback({
231
+ type: "modelProgress",
232
+ downloaded: downloadedBytes,
233
+ total: totalBytes,
234
+ percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
235
+ downloadKey,
236
+ });
237
+ }
238
+ // Write chunk to file
239
+ await new Promise((resolve, reject) => {
240
+ writeStream.write(buffer, (err) => {
241
+ if (err)
242
+ reject(new Error(err instanceof Error ? err.message : String(err)));
243
+ else
244
+ resolve();
245
+ });
246
+ });
247
+ }
248
+ }
249
+ finally {
250
+ reader.releaseLock();
251
+ }
252
+ // Close the write stream
253
+ await new Promise((resolve, reject) => {
254
+ writeStream.end(() => {
255
+ console.log(`✅ Model downloaded successfully to ${modelPath}`);
256
+ resolve();
257
+ });
258
+ writeStream.on("error", reject);
259
+ });
260
+ }
261
+ else {
262
+ throw new Error("Response body is not readable");
263
+ }
264
+ }
265
+ }
266
+ catch (error) {
267
+ writeStream.destroy();
268
+ console.error("Error during download:", error instanceof Error ? error.message : String(error));
269
+ throw error instanceof Error ? error : new Error(String(error));
270
+ }
271
+ }
272
+ export async function downloadModelFromHttp(url, progressCallback) {
273
+ const downloadKey = createHttpDownloadKey(url);
274
+ // Check if already downloading
275
+ const existing = getActiveDownload(downloadKey);
276
+ if (existing) {
277
+ console.log(`📥 Reusing existing download for: ${downloadKey}`);
278
+ return existing.promise;
279
+ }
280
+ const cacheDir = getModelsCacheDir();
281
+ const sourceHash = generateShortHash(url);
282
+ const filename = extractFilenameFromUrl(url);
283
+ const modelPath = `${cacheDir}/${sourceHash}_${filename}`;
284
+ // Create managed download with AbortController
285
+ const abortController = new AbortController();
286
+ const downloadPromise = (async () => {
287
+ try {
288
+ // Check if already cached
289
+ const cachedPath = await validateCachedFile(modelPath, url, abortController.signal);
290
+ if (cachedPath) {
291
+ return cachedPath;
292
+ }
293
+ // Download the file
294
+ await performHttpDownload(url, modelPath, downloadKey, progressCallback, abortController.signal);
295
+ return modelPath;
296
+ }
297
+ catch (error) {
298
+ console.error("❌ Error downloading model:", error instanceof Error ? error.message : String(error));
299
+ // Check if we should delete the partial file (clearCache was requested)
300
+ if (error instanceof Error && error.message === "Download cancelled") {
301
+ if (shouldClearCache(downloadKey)) {
302
+ console.log("🗑️ Clearing cache - deleting partial file");
303
+ try {
304
+ await fsPromises.unlink(modelPath);
305
+ console.log(`✅ Deleted partial file: ${modelPath}`);
306
+ }
307
+ catch {
308
+ // Ignore cleanup errors
309
+ }
310
+ }
311
+ else {
312
+ console.log("📥 Download paused - partial file preserved for resume");
313
+ }
314
+ clearClearCacheFlag(downloadKey);
315
+ }
316
+ const errorToThrow = error instanceof Error ? error : new Error(String(error));
317
+ throw errorToThrow;
318
+ }
319
+ finally {
320
+ // Cleanup from download manager
321
+ unregisterDownload(downloadKey);
322
+ }
323
+ })();
324
+ // Register download
325
+ const downloadEntry = {
326
+ key: downloadKey,
327
+ promise: downloadPromise,
328
+ abortController,
329
+ startTime: Date.now(),
330
+ type: "http",
331
+ url,
332
+ modelPath,
333
+ ...(progressCallback && { onProgress: progressCallback }),
334
+ };
335
+ registerDownload(downloadKey, downloadEntry);
336
+ return downloadPromise;
337
+ }
@@ -0,0 +1,4 @@
1
+ import type { ModelProgressUpdate } from "../../../../schemas/index";
2
+ export declare function deleteCorestoreDirectory(corestoreDir: string): Promise<void>;
3
+ export declare function downloadModelFromHyperdrive(hyperdriveKey: string, modelFileName: string, seed?: boolean, progressCallback?: (progress: ModelProgressUpdate) => void, expectedChecksum?: string): Promise<string>;
4
+ //# sourceMappingURL=hyperdrive.d.ts.map