@qvac/sdk 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/LICENSE +1 -24
  2. package/NOTICE +632 -0
  3. package/README.md +2 -1
  4. package/dist/client/api/embed.js +1 -4
  5. package/dist/client/api/get-model-info.d.ts +10 -3
  6. package/dist/client/api/index.d.ts +2 -0
  7. package/dist/client/api/index.js +2 -0
  8. package/dist/client/api/invoke-plugin.d.ts +14 -0
  9. package/dist/client/api/invoke-plugin.js +38 -0
  10. package/dist/client/api/registry.d.ts +14 -0
  11. package/dist/client/api/registry.js +37 -0
  12. package/dist/client/api/transcribe.js +0 -4
  13. package/dist/client/api/unload-model.js +1 -1
  14. package/dist/client/config-loader/resolve-config.node.d.ts +3 -2
  15. package/dist/client/config-loader/resolve-config.node.js +31 -4
  16. package/dist/client/init-hooks.js +2 -1
  17. package/dist/client/rpc/bare-client.d.ts +2 -0
  18. package/dist/client/rpc/bare-client.js +48 -7
  19. package/dist/client/rpc/expo-device-info.d.ts +6 -0
  20. package/dist/client/rpc/expo-device-info.js +32 -0
  21. package/dist/client/rpc/expo-rpc-client.js +9 -32
  22. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  23. package/dist/client/rpc/node-rpc-client.js +201 -28
  24. package/dist/client/rpc/rpc-client.d.ts +1 -1
  25. package/dist/client/rpc/rpc-client.js +2 -2
  26. package/dist/constants/index.d.ts +1 -0
  27. package/dist/constants/index.js +1 -0
  28. package/dist/constants/registry.d.ts +2 -0
  29. package/dist/constants/registry.js +1 -0
  30. package/dist/examples/cache-management.js +2 -2
  31. package/dist/examples/config/plugins/plugins.config.d.ts +5 -0
  32. package/dist/examples/config/plugins/plugins.config.js +4 -0
  33. package/dist/examples/download-with-blind-relays.js +1 -1
  34. package/dist/examples/llamacpp-multimodal.js +3 -3
  35. package/dist/examples/llamacpp-native-tools.js +2 -2
  36. package/dist/examples/mcp-websearch.js +2 -2
  37. package/dist/examples/multi-model-demo.js +2 -2
  38. package/dist/examples/ocr-fasttext.js +4 -4
  39. package/dist/examples/parallel-download.js +2 -2
  40. package/dist/examples/plugins.d.ts +14 -0
  41. package/dist/examples/plugins.js +129 -0
  42. package/dist/examples/registry-query.d.ts +2 -0
  43. package/dist/examples/registry-query.js +87 -0
  44. package/dist/examples/translation/translation-bergamot-batch.js +2 -2
  45. package/dist/examples/translation/translation-bergamot.js +4 -4
  46. package/dist/examples/translation/translation-opus.js +2 -2
  47. package/dist/examples/translation/translation-stream.js +2 -2
  48. package/dist/examples/tts/chatterbox.d.ts +2 -0
  49. package/dist/examples/tts/chatterbox.js +59 -0
  50. package/dist/examples/tts/supertonic.d.ts +2 -0
  51. package/dist/examples/tts/supertonic.js +51 -0
  52. package/dist/examples/tts/utils.d.ts +17 -0
  53. package/dist/examples/tts/utils.js +93 -0
  54. package/dist/examples/whispercpp-filesystem.js +2 -3
  55. package/dist/examples/whispercpp-microphone-record.js +1 -2
  56. package/dist/examples/whispercpp-prompt.js +2 -3
  57. package/dist/expo/plugins/index.d.ts +3 -0
  58. package/dist/expo/plugins/index.js +3 -0
  59. package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +15 -0
  60. package/dist/expo/plugins/resolve-sdk-package-dir.js +31 -0
  61. package/dist/expo/plugins/withAndroidArchitecture.d.ts +8 -0
  62. package/dist/expo/plugins/withAndroidArchitecture.js +52 -0
  63. package/dist/expo/plugins/withAndroidNdkVersion.d.ts +8 -0
  64. package/dist/expo/plugins/withAndroidNdkVersion.js +31 -0
  65. package/dist/expo/plugins/withDeviceInfo.d.ts +10 -0
  66. package/dist/expo/plugins/withDeviceInfo.js +48 -0
  67. package/dist/expo/plugins/withMobileBundle.d.ts +5 -2
  68. package/dist/expo/plugins/withMobileBundle.js +121 -65
  69. package/dist/expo/plugins/withQvacSDK.d.ts +4 -0
  70. package/dist/expo/plugins/withQvacSDK.js +26 -1
  71. package/dist/index.d.ts +4 -4
  72. package/dist/index.js +5 -5
  73. package/dist/models/{hyperdrive → registry}/index.js +1 -1
  74. package/dist/models/registry/models.d.ts +9056 -0
  75. package/dist/models/registry/models.js +9351 -0
  76. package/dist/models/update-models/codegen.d.ts +3 -0
  77. package/dist/models/update-models/codegen.js +135 -0
  78. package/dist/models/update-models/history.d.ts +13 -0
  79. package/dist/models/update-models/history.js +88 -0
  80. package/dist/models/update-models/index.d.ts +2 -0
  81. package/dist/models/update-models/index.js +124 -0
  82. package/dist/models/update-models/naming.d.ts +4 -0
  83. package/dist/models/update-models/naming.js +314 -0
  84. package/dist/models/update-models/processing.d.ts +8 -0
  85. package/dist/models/update-models/processing.js +67 -0
  86. package/dist/models/update-models/registry.d.ts +4 -0
  87. package/dist/models/update-models/registry.js +67 -0
  88. package/dist/models/update-models/shards.d.ts +4 -0
  89. package/dist/models/update-models/shards.js +57 -0
  90. package/dist/models/update-models/types.d.ts +60 -0
  91. package/dist/models/update-models/types.js +1 -0
  92. package/dist/models/update-models/utils.d.ts +3 -0
  93. package/dist/models/update-models/utils.js +21 -0
  94. package/dist/pear/pre.d.ts +18 -0
  95. package/dist/pear/pre.js +433 -0
  96. package/dist/schemas/common.d.ts +286 -32
  97. package/dist/schemas/common.js +12 -0
  98. package/dist/schemas/download-asset.d.ts +35 -11
  99. package/dist/schemas/download-asset.js +5 -1
  100. package/dist/schemas/engine-addon-map.d.ts +5 -0
  101. package/dist/schemas/engine-addon-map.js +49 -0
  102. package/dist/schemas/get-model-info.d.ts +32 -16
  103. package/dist/schemas/get-model-info.js +17 -8
  104. package/dist/schemas/index.d.ts +4 -1
  105. package/dist/schemas/index.js +4 -4
  106. package/dist/schemas/load-model.d.ts +2224 -900
  107. package/dist/schemas/load-model.js +130 -25
  108. package/dist/schemas/model-src-utils.d.ts +30 -12
  109. package/dist/schemas/model-src-utils.js +5 -2
  110. package/dist/schemas/model-types.d.ts +15 -4
  111. package/dist/schemas/model-types.js +21 -4
  112. package/dist/schemas/path-validation.d.ts +10 -0
  113. package/dist/schemas/path-validation.js +22 -0
  114. package/dist/schemas/plugin.d.ts +180 -0
  115. package/dist/schemas/plugin.js +132 -0
  116. package/dist/schemas/rag.d.ts +2 -2
  117. package/dist/schemas/rag.js +7 -3
  118. package/dist/schemas/registry.d.ts +338 -0
  119. package/dist/schemas/registry.js +91 -0
  120. package/dist/schemas/sdk-errors-client.d.ts +6 -6
  121. package/dist/schemas/sdk-errors-client.js +15 -15
  122. package/dist/schemas/sdk-errors-registry.d.ts +6 -0
  123. package/dist/schemas/sdk-errors-registry.js +8 -0
  124. package/dist/schemas/sdk-errors-server.d.ts +16 -2
  125. package/dist/schemas/sdk-errors-server.js +90 -10
  126. package/dist/schemas/text-to-speech.d.ts +670 -1
  127. package/dist/schemas/text-to-speech.js +51 -2
  128. package/dist/schemas/translate.d.ts +2 -2
  129. package/dist/scripts/run-security-tests-bare.d.ts +2 -0
  130. package/dist/scripts/run-security-tests-bare.js +78 -0
  131. package/dist/scripts/run-security-tests.d.ts +2 -0
  132. package/dist/scripts/run-security-tests.js +22 -0
  133. package/dist/server/bare/delegate-rpc-client.d.ts +6 -0
  134. package/dist/server/bare/delegate-rpc-client.js +136 -56
  135. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.d.ts +1 -1
  136. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.js +3 -3
  137. package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.js +6 -6
  138. package/dist/server/bare/{addons → ops}/load-model.js +32 -42
  139. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.d.ts +1 -1
  140. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.js +5 -4
  141. package/dist/server/bare/plugins/index.d.ts +7 -0
  142. package/dist/server/bare/plugins/index.js +6 -0
  143. package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.js +1 -1
  144. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.d.ts +1 -1
  145. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.js +2 -3
  146. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +115 -0
  147. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +142 -0
  148. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +24 -0
  149. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +73 -0
  150. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +45 -0
  151. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +97 -0
  152. package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.js +2 -1
  153. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +38 -0
  154. package/dist/server/bare/{addons/onnx-ocr/create-model.js → plugins/onnx-ocr/plugin.js} +39 -2
  155. package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.js +23 -1
  156. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +26 -0
  157. package/dist/server/bare/plugins/onnx-tts/plugin.js +162 -0
  158. package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +14 -0
  159. package/dist/server/bare/plugins/onnx-tts/wav-helper.js +107 -0
  160. package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +3 -0
  161. package/dist/server/bare/{addons/whispercpp-transcription/handlers → plugins/whispercpp-transcription/ops}/transcribe-stream.js +1 -2
  162. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +31 -0
  163. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +74 -0
  164. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +1 -1
  165. package/dist/server/bare/rag-hyperdb/handlers/search.js +1 -1
  166. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -1
  167. package/dist/server/bare/registry/config-registry.js +1 -1
  168. package/dist/server/bare/registry/registry-client.d.ts +5 -0
  169. package/dist/server/bare/registry/registry-client.js +37 -0
  170. package/dist/server/env.d.ts +22 -0
  171. package/dist/server/env.js +57 -0
  172. package/dist/server/plugins/index.d.ts +2 -0
  173. package/dist/server/plugins/index.js +1 -0
  174. package/dist/server/plugins/registry.d.ts +9 -0
  175. package/dist/server/plugins/registry.js +75 -0
  176. package/dist/server/rpc/delegate-transport.d.ts +11 -0
  177. package/dist/server/rpc/delegate-transport.js +60 -0
  178. package/dist/server/rpc/handle-request.d.ts +0 -9
  179. package/dist/server/rpc/handle-request.js +13 -321
  180. package/dist/server/rpc/handler-registry.d.ts +3 -0
  181. package/dist/server/rpc/handler-registry.js +84 -0
  182. package/dist/server/rpc/handler-utils.d.ts +22 -0
  183. package/dist/server/rpc/handler-utils.js +87 -0
  184. package/dist/server/rpc/handlers/cancelHandler.js +1 -1
  185. package/dist/server/rpc/handlers/completion-stream-delegated.js +1 -1
  186. package/dist/server/rpc/handlers/completion-stream.js +2 -43
  187. package/dist/server/rpc/handlers/delete-cache.js +1 -1
  188. package/dist/server/rpc/handlers/embed.js +2 -21
  189. package/dist/server/rpc/handlers/get-model-info.js +19 -15
  190. package/dist/server/rpc/handlers/index.d.ts +9 -0
  191. package/dist/server/rpc/handlers/index.js +9 -0
  192. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
  193. package/dist/server/rpc/handlers/load-model/download-manager.js +3 -0
  194. package/dist/server/rpc/handlers/load-model/handler.js +47 -24
  195. package/dist/server/rpc/handlers/load-model/http.js +3 -2
  196. package/dist/server/rpc/handlers/load-model/hyperdrive.js +14 -10
  197. package/dist/server/rpc/handlers/load-model/registry.d.ts +10 -0
  198. package/dist/server/rpc/handlers/load-model/registry.js +571 -0
  199. package/dist/server/rpc/handlers/load-model/resolve.js +18 -5
  200. package/dist/server/rpc/handlers/load-model-delegated.js +4 -2
  201. package/dist/server/rpc/handlers/ocr-stream.js +2 -37
  202. package/dist/server/rpc/handlers/ping.d.ts +3 -0
  203. package/dist/server/rpc/handlers/ping.js +3 -0
  204. package/dist/server/rpc/handlers/plugin-dispatch.d.ts +15 -0
  205. package/dist/server/rpc/handlers/plugin-dispatch.js +54 -0
  206. package/dist/server/rpc/handlers/plugin-invoke.d.ts +4 -0
  207. package/dist/server/rpc/handlers/plugin-invoke.js +87 -0
  208. package/dist/server/rpc/handlers/registry.d.ts +5 -0
  209. package/dist/server/rpc/handlers/registry.js +157 -0
  210. package/dist/server/rpc/handlers/text-to-speech.js +2 -5
  211. package/dist/server/rpc/handlers/transcribe-stream.js +2 -30
  212. package/dist/server/rpc/handlers/translate.js +2 -42
  213. package/dist/server/rpc/handlers/unload-model.js +1 -1
  214. package/dist/server/rpc/index.d.ts +1 -1
  215. package/dist/server/utils/archive.d.ts +1 -0
  216. package/dist/server/utils/archive.js +10 -2
  217. package/dist/server/utils/cache.d.ts +5 -0
  218. package/dist/server/utils/cache.js +26 -2
  219. package/dist/server/utils/gguf-tensor-extractor.js +3 -3
  220. package/dist/server/utils/index.d.ts +1 -1
  221. package/dist/server/utils/index.js +1 -1
  222. package/dist/server/utils/path-security.d.ts +12 -0
  223. package/dist/server/utils/path-security.js +25 -0
  224. package/dist/server/utils/shard-utils.js +3 -3
  225. package/dist/server/worker-core.d.ts +6 -0
  226. package/dist/server/worker-core.js +88 -0
  227. package/dist/server/worker.d.ts +4 -5
  228. package/dist/server/worker.js +18 -116
  229. package/dist/utils/errors-client.d.ts +9 -6
  230. package/dist/utils/errors-client.js +19 -11
  231. package/dist/utils/errors-server.d.ts +44 -5
  232. package/dist/utils/errors-server.js +82 -9
  233. package/dist/utils/path-sanitize.d.ts +17 -0
  234. package/dist/utils/path-sanitize.js +54 -0
  235. package/expo/plugins/patches/android-link.mjs +63 -0
  236. package/expo/plugins/patches/ios-link.mjs +63 -0
  237. package/package.json +72 -10
  238. package/dist/examples/text-to-speech.d.ts +0 -3
  239. package/dist/examples/text-to-speech.js +0 -137
  240. package/dist/models/hyperdrive/models.d.ts +0 -4003
  241. package/dist/models/hyperdrive/models.js +0 -4282
  242. package/dist/server/bare/addons/index.d.ts +0 -4
  243. package/dist/server/bare/addons/index.js +0 -3
  244. package/dist/server/bare/addons/llamacpp-completion/create-model.d.ts +0 -8
  245. package/dist/server/bare/addons/llamacpp-completion/create-model.js +0 -43
  246. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +0 -4
  247. package/dist/server/bare/addons/llamacpp-completion/index.js +0 -3
  248. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +0 -8
  249. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +0 -38
  250. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +0 -3
  251. package/dist/server/bare/addons/llamacpp-embedding/index.js +0 -2
  252. package/dist/server/bare/addons/nmtcpp-translation/create-model.d.ts +0 -8
  253. package/dist/server/bare/addons/nmtcpp-translation/create-model.js +0 -52
  254. package/dist/server/bare/addons/nmtcpp-translation/index.d.ts +0 -3
  255. package/dist/server/bare/addons/nmtcpp-translation/index.js +0 -2
  256. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +0 -10
  257. package/dist/server/bare/addons/onnx-ocr/index.d.ts +0 -3
  258. package/dist/server/bare/addons/onnx-ocr/index.js +0 -2
  259. package/dist/server/bare/addons/onnx-tts/create-model.d.ts +0 -10
  260. package/dist/server/bare/addons/onnx-tts/create-model.js +0 -25
  261. package/dist/server/bare/addons/onnx-tts/index.d.ts +0 -3
  262. package/dist/server/bare/addons/onnx-tts/index.js +0 -2
  263. package/dist/server/bare/addons/whispercpp-transcription/create-model.d.ts +0 -10
  264. package/dist/server/bare/addons/whispercpp-transcription/create-model.js +0 -37
  265. package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.d.ts +0 -3
  266. package/dist/server/bare/addons/whispercpp-transcription/index.d.ts +0 -3
  267. package/dist/server/bare/addons/whispercpp-transcription/index.js +0 -2
  268. /package/dist/models/{hyperdrive → registry}/index.d.ts +0 -0
  269. /package/dist/server/bare/{addons → ops}/cancel.d.ts +0 -0
  270. /package/dist/server/bare/{addons → ops}/cancel.js +0 -0
  271. /package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.d.ts +0 -0
  272. /package/dist/server/bare/{addons → ops}/load-model.d.ts +0 -0
  273. /package/dist/server/bare/{addons → ops}/unload-model.d.ts +0 -0
  274. /package/dist/server/bare/{addons → ops}/unload-model.js +0 -0
  275. /package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.d.ts +0 -0
  276. /package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.d.ts +0 -0
  277. /package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.d.ts +0 -0
@@ -0,0 +1,8 @@
1
+ import type { QVACModelEntry } from "@qvac/registry-client";
2
+ import type { ProcessedModel } from "./types";
3
+ export declare function toHexString(value: Buffer | string | {
4
+ data: number[];
5
+ } | undefined): string;
6
+ export declare function extractModelName(registryPath: string): string;
7
+ export declare function processRegistryModel(model: QVACModelEntry): ProcessedModel | null;
8
+ //# sourceMappingURL=processing.d.ts.map
@@ -0,0 +1,67 @@
1
+ import { getAddonFromEngine, resolveCanonicalEngine, } from "../../schemas/engine-addon-map";
2
+ import { detectShardedModel } from "./shards.js";
3
+ export function toHexString(value) {
4
+ if (!value)
5
+ return "";
6
+ if (Buffer.isBuffer(value))
7
+ return value.toString("hex");
8
+ if (typeof value === "string")
9
+ return value;
10
+ if (typeof value === "object" && "data" in value) {
11
+ return Buffer.from(value.data).toString("hex");
12
+ }
13
+ return "";
14
+ }
15
+ export function extractModelName(registryPath) {
16
+ const parts = registryPath.split("/");
17
+ if (parts.length >= 2) {
18
+ return parts[1] || parts[0] || "";
19
+ }
20
+ return (registryPath
21
+ .split("/")
22
+ .pop()
23
+ ?.replace(/\.\w+$/, "") || "");
24
+ }
25
+ export function processRegistryModel(model) {
26
+ const engine = resolveCanonicalEngine(model.engine);
27
+ if (!engine) {
28
+ console.warn(`⚠️ Skipping model with unknown engine "${model.engine}": ${model.path}`);
29
+ return null;
30
+ }
31
+ const filename = model.path.split("/").pop() || model.path;
32
+ const blobBinding = model.blobBinding;
33
+ const blobCoreKey = toHexString(blobBinding?.coreKey);
34
+ const blobBlockOffset = blobBinding?.blockOffset ?? 0;
35
+ const blobBlockLength = blobBinding?.blockLength ?? 0;
36
+ const blobByteOffset = blobBinding?.byteOffset ?? 0;
37
+ const expectedSize = blobBinding?.byteLength ?? 0;
38
+ // The sha256 lives on blobBinding at runtime (per the hyperschema),
39
+ // even though the TS types define it on QVACModelEntry. Try blobBinding first.
40
+ const sha256Checksum = blobBinding?.["sha256"] ||
41
+ model.sha256 ||
42
+ "";
43
+ const addon = getAddonFromEngine(engine);
44
+ const result = {
45
+ registryPath: model.path,
46
+ registrySource: model.source,
47
+ blobCoreKey,
48
+ blobBlockOffset,
49
+ blobBlockLength,
50
+ blobByteOffset,
51
+ modelId: filename,
52
+ addon,
53
+ expectedSize,
54
+ sha256Checksum,
55
+ engine,
56
+ modelName: extractModelName(model.path),
57
+ quantization: model.quantization || "",
58
+ params: model.params || "",
59
+ tags: model.tags || [],
60
+ };
61
+ const shardDetection = detectShardedModel(filename);
62
+ if (shardDetection.isSharded) {
63
+ result.isShardPart = true;
64
+ result.shardInfo = shardDetection;
65
+ }
66
+ return result;
67
+ }
@@ -0,0 +1,4 @@
1
+ import type { CollectOptions, ProcessedModel } from "./types";
2
+ export { processRegistryModel, extractModelName, toHexString, } from "./processing";
3
+ export declare function collectModels(options?: CollectOptions): Promise<ProcessedModel[]>;
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1,67 @@
1
+ import { QVACRegistryClient } from "@qvac/registry-client";
2
+ import { groupShardedModels } from "./shards.js";
3
+ import { processRegistryModel } from "./processing.js";
4
+ import { DEFAULT_REGISTRY_CORE_KEY } from "../../constants/index.js";
5
+ // Re-export for backward compat
6
+ export { processRegistryModel, extractModelName, toHexString, } from "./processing.js";
7
+ export async function collectModels(options = {}) {
8
+ const { showDuplicates = false, noDedup = false } = options;
9
+ const models = [];
10
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
11
+ const registryCoreKey = process.env["QVAC_REGISTRY_CORE_KEY"] ?? DEFAULT_REGISTRY_CORE_KEY;
12
+ const client = new QVACRegistryClient({ registryCoreKey });
13
+ try {
14
+ await client.ready();
15
+ const registryModels = await client.findModels({});
16
+ console.log(`📦 Found ${registryModels.length} entries in registry`);
17
+ for (const registryModel of registryModels) {
18
+ const processed = processRegistryModel(registryModel);
19
+ if (processed)
20
+ models.push(processed);
21
+ }
22
+ }
23
+ finally {
24
+ await client.close();
25
+ }
26
+ const groupedModels = groupShardedModels(models);
27
+ if (noDedup) {
28
+ console.log(`\n⏭️ Skipping deduplication (--no-dedup flag set)`);
29
+ return groupedModels;
30
+ }
31
+ return deduplicateModels(groupedModels, showDuplicates);
32
+ }
33
+ function deduplicateModels(models, showDuplicates) {
34
+ const seenChecksums = new Map();
35
+ const dedupedModels = [];
36
+ const skipped = [];
37
+ for (const model of models) {
38
+ if (!model.sha256Checksum || model.sha256Checksum === "") {
39
+ dedupedModels.push(model);
40
+ continue;
41
+ }
42
+ if (seenChecksums.has(model.sha256Checksum)) {
43
+ skipped.push({
44
+ name: model.registryPath,
45
+ checksum: model.sha256Checksum,
46
+ reason: `Duplicate of ${seenChecksums.get(model.sha256Checksum)}`,
47
+ });
48
+ continue;
49
+ }
50
+ seenChecksums.set(model.sha256Checksum, model.registryPath);
51
+ dedupedModels.push(model);
52
+ }
53
+ if (skipped.length > 0) {
54
+ console.log(`\n🧹 Removed ${skipped.length} duplicate model(s)`);
55
+ if (showDuplicates) {
56
+ skipped.forEach(({ name, checksum, reason }) => {
57
+ console.log(` - ${name}`);
58
+ console.log(` Checksum: ${checksum}`);
59
+ console.log(` ${reason}`);
60
+ });
61
+ }
62
+ else {
63
+ console.log(` Use --show-duplicates to see details`);
64
+ }
65
+ }
66
+ return dedupedModels;
67
+ }
@@ -0,0 +1,4 @@
1
+ import type { ProcessedModel, ShardDetection } from "./types";
2
+ export declare function detectShardedModel(filename: string): ShardDetection;
3
+ export declare function groupShardedModels(models: ProcessedModel[]): ProcessedModel[];
4
+ //# sourceMappingURL=shards.d.ts.map
@@ -0,0 +1,57 @@
1
+ export function detectShardedModel(filename) {
2
+ const shardPattern = /^(.+)-(\d{5})-of-(\d{5})(\.\w+)$/;
3
+ const match = filename.match(shardPattern);
4
+ if (match) {
5
+ return {
6
+ isSharded: true,
7
+ baseFilename: match[1],
8
+ currentShard: parseInt(match[2], 10),
9
+ totalShards: parseInt(match[3], 10),
10
+ extension: match[4],
11
+ };
12
+ }
13
+ return { isSharded: false };
14
+ }
15
+ export function groupShardedModels(models) {
16
+ const shardGroups = new Map();
17
+ const nonShardedModels = [];
18
+ for (const model of models) {
19
+ if (model.isShardPart && model.shardInfo) {
20
+ const baseKey = `${model.registrySource}:${model.shardInfo.baseFilename}`;
21
+ if (!shardGroups.has(baseKey)) {
22
+ shardGroups.set(baseKey, []);
23
+ }
24
+ shardGroups.get(baseKey).push(model);
25
+ }
26
+ else {
27
+ nonShardedModels.push(model);
28
+ }
29
+ }
30
+ const processedShards = [];
31
+ for (const [baseKey, shards] of shardGroups) {
32
+ shards.sort((a, b) => (a.shardInfo?.currentShard ?? 0) - (b.shardInfo?.currentShard ?? 0));
33
+ const firstShard = shards[0];
34
+ const totalExpectedShards = firstShard.shardInfo?.totalShards ?? 0;
35
+ if (shards.length !== totalExpectedShards) {
36
+ console.warn(`⚠️ Expected ${totalExpectedShards} shards but found ${shards.length} for ${baseKey}`);
37
+ }
38
+ const totalSize = shards.reduce((sum, s) => sum + s.expectedSize, 0);
39
+ const shardMetadata = shards.map((s) => ({
40
+ filename: s.modelId,
41
+ expectedSize: s.expectedSize,
42
+ sha256Checksum: s.sha256Checksum,
43
+ blobCoreKey: s.blobCoreKey,
44
+ blobBlockOffset: s.blobBlockOffset,
45
+ blobBlockLength: s.blobBlockLength,
46
+ blobByteOffset: s.blobByteOffset,
47
+ }));
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
+ const { isShardPart: _shard, shardInfo: _info, ...rest } = firstShard;
50
+ processedShards.push({
51
+ ...rest,
52
+ expectedSize: totalSize,
53
+ shardMetadata,
54
+ });
55
+ }
56
+ return [...nonShardedModels, ...processedShards];
57
+ }
@@ -0,0 +1,60 @@
1
+ import type { ModelRegistryEntryAddon, ModelRegistryEngine } from "../../schemas/registry";
2
+ export interface ShardInfo {
3
+ isSharded: true;
4
+ baseFilename: string;
5
+ currentShard: number;
6
+ totalShards: number;
7
+ extension: string;
8
+ }
9
+ export interface NotSharded {
10
+ isSharded: false;
11
+ }
12
+ export type ShardDetection = ShardInfo | NotSharded;
13
+ export interface ShardMetadataEntry {
14
+ filename: string;
15
+ expectedSize: number;
16
+ sha256Checksum: string;
17
+ blobCoreKey: string;
18
+ blobBlockOffset: number;
19
+ blobBlockLength: number;
20
+ blobByteOffset: number;
21
+ }
22
+ export interface ProcessedModel {
23
+ registryPath: string;
24
+ registrySource: string;
25
+ blobCoreKey: string;
26
+ blobBlockOffset: number;
27
+ blobBlockLength: number;
28
+ blobByteOffset: number;
29
+ modelId: string;
30
+ addon: ModelRegistryEntryAddon;
31
+ expectedSize: number;
32
+ sha256Checksum: string;
33
+ engine: ModelRegistryEngine;
34
+ modelName: string;
35
+ quantization: string;
36
+ params: string;
37
+ tags: string[];
38
+ isShardPart?: boolean;
39
+ shardInfo?: ShardInfo;
40
+ shardMetadata?: ShardMetadataEntry[];
41
+ name?: string;
42
+ }
43
+ export interface CurrentModel {
44
+ name: string;
45
+ registryPath: string;
46
+ }
47
+ export interface CollectOptions {
48
+ showDuplicates?: boolean;
49
+ noDedup?: boolean;
50
+ }
51
+ export interface ExportNameInput {
52
+ path: string;
53
+ engine: ModelRegistryEngine;
54
+ name: string;
55
+ quantization: string;
56
+ params: string;
57
+ tags: string[];
58
+ usedNames: Set<string>;
59
+ }
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function formatSize(bytes: number): string;
2
+ export declare function getCommitHash(short?: boolean): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { execSync } from "child_process";
2
+ export function formatSize(bytes) {
3
+ if (bytes < 1024)
4
+ return `${bytes}B`;
5
+ if (bytes < 1024 * 1024)
6
+ return `${(bytes / 1024).toFixed(1)}KB`;
7
+ if (bytes < 1024 * 1024 * 1024)
8
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
9
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
10
+ }
11
+ export function getCommitHash(short = false) {
12
+ try {
13
+ const cmd = short ? "git rev-parse --short HEAD" : "git rev-parse HEAD";
14
+ return execSync(cmd, { encoding: "utf-8" }).trim();
15
+ }
16
+ catch (error) {
17
+ throw new Error("Git is required to generate history file", {
18
+ cause: error,
19
+ });
20
+ }
21
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * QVAC Pear Pre-Hook
3
+ *
4
+ * Invoked by Pear before `pear run` or `pear stage` to:
5
+ * 1. Generate `qvac/worker.pear.entry.mjs` with selected plugins
6
+ * 2. Persist `pear.stage.entrypoints` to package.json for routing
7
+ *
8
+ * @example package.json configuration
9
+ * ```json
10
+ * {
11
+ * "pear": {
12
+ * "pre": ["@qvac/sdk/pear-pre"]
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=pre.d.ts.map