@qvac/sdk 0.10.2 → 0.12.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 (326) hide show
  1. package/NOTICE +1455 -29
  2. package/README.md +2 -0
  3. package/dist/client/api/cancel.d.ts +24 -32
  4. package/dist/client/api/cancel.js +58 -31
  5. package/dist/client/api/classify.d.ts +23 -0
  6. package/dist/client/api/classify.js +43 -0
  7. package/dist/client/api/client-request-id.d.ts +17 -0
  8. package/dist/client/api/client-request-id.js +27 -0
  9. package/dist/client/api/completion-stream.d.ts +1 -1
  10. package/dist/client/api/completion-stream.js +34 -3
  11. package/dist/client/api/diffusion.d.ts +46 -0
  12. package/dist/client/api/diffusion.js +50 -1
  13. package/dist/client/api/download-asset.d.ts +12 -2
  14. package/dist/client/api/download-asset.js +21 -3
  15. package/dist/client/api/embed.d.ts +8 -4
  16. package/dist/client/api/embed.js +14 -1
  17. package/dist/client/api/get-model-info.d.ts +1 -1
  18. package/dist/client/api/index.d.ts +5 -0
  19. package/dist/client/api/index.js +5 -0
  20. package/dist/client/api/load-model.d.ts +12 -4
  21. package/dist/client/api/load-model.js +49 -2
  22. package/dist/client/api/rag.d.ts +9 -3
  23. package/dist/client/api/rag.js +23 -3
  24. package/dist/client/api/transcribe.d.ts +23 -8
  25. package/dist/client/api/transcribe.js +69 -4
  26. package/dist/client/api/unload-model.d.ts +5 -2
  27. package/dist/client/api/unload-model.js +9 -4
  28. package/dist/client/api/upscale.d.ts +45 -0
  29. package/dist/client/api/upscale.js +99 -0
  30. package/dist/client/api/video.d.ts +64 -0
  31. package/dist/client/api/video.js +147 -0
  32. package/dist/client/api/vla-helpers.d.ts +45 -0
  33. package/dist/client/api/vla-helpers.js +130 -0
  34. package/dist/client/api/vla.d.ts +65 -0
  35. package/dist/client/api/vla.js +109 -0
  36. package/dist/client/config-loader/resolve-config.node.d.ts +16 -0
  37. package/dist/client/config-loader/resolve-config.node.js +77 -23
  38. package/dist/client/plugins-factory.d.ts +8 -0
  39. package/dist/client/plugins-factory.js +10 -0
  40. package/dist/client/rpc/bare-client.js +62 -66
  41. package/dist/client/rpc/ensure-worker-ready.d.ts +9 -0
  42. package/dist/client/rpc/ensure-worker-ready.js +17 -0
  43. package/dist/client/rpc/expo-rpc-client.js +2 -1
  44. package/dist/client/rpc/node-rpc-client.js +22 -8
  45. package/dist/client/rpc/rpc-client.d.ts +2 -2
  46. package/dist/client/rpc/rpc-client.js +10 -4
  47. package/dist/client/rpc/rpc-error.d.ts +9 -0
  48. package/dist/client/rpc/rpc-error.js +105 -0
  49. package/dist/commands/bundle/bare-pack.d.ts +13 -0
  50. package/dist/commands/bundle/bare-pack.js +54 -0
  51. package/dist/commands/bundle/constants.d.ts +7 -0
  52. package/dist/commands/bundle/constants.js +23 -0
  53. package/dist/commands/bundle/entry-gen.d.ts +2 -0
  54. package/dist/commands/bundle/entry-gen.js +48 -0
  55. package/dist/commands/bundle/index.d.ts +20 -0
  56. package/dist/commands/bundle/index.js +141 -0
  57. package/dist/commands/bundle/manifest.d.ts +21 -0
  58. package/dist/commands/bundle/manifest.js +193 -0
  59. package/dist/commands/bundle/plugins.d.ts +9 -0
  60. package/dist/commands/bundle/plugins.js +51 -0
  61. package/dist/commands/index.d.ts +5 -0
  62. package/dist/commands/index.js +2 -0
  63. package/dist/commands/verify/abi.d.ts +52 -0
  64. package/dist/commands/verify/abi.js +125 -0
  65. package/dist/commands/verify/addon-source.d.ts +43 -0
  66. package/dist/commands/verify/addon-source.js +75 -0
  67. package/dist/commands/verify/bundle-source.d.ts +12 -0
  68. package/dist/commands/verify/bundle-source.js +53 -0
  69. package/dist/commands/verify/index.d.ts +59 -0
  70. package/dist/commands/verify/index.js +371 -0
  71. package/dist/commands/verify/node-modules-source.d.ts +11 -0
  72. package/dist/commands/verify/node-modules-source.js +76 -0
  73. package/dist/commands/verify/prebuilds.d.ts +15 -0
  74. package/dist/commands/verify/prebuilds.js +39 -0
  75. package/dist/examples/cancel-by-request-id.d.ts +38 -0
  76. package/dist/examples/cancel-by-request-id.js +103 -0
  77. package/dist/examples/classification/classify-image.d.ts +2 -0
  78. package/dist/examples/classification/classify-image.js +23 -0
  79. package/dist/examples/diffusion-esrgan-upscale.d.ts +2 -0
  80. package/dist/examples/diffusion-esrgan-upscale.js +78 -0
  81. package/dist/examples/diffusion-txt2vid.d.ts +2 -0
  82. package/dist/examples/diffusion-txt2vid.js +81 -0
  83. package/dist/examples/download-with-cancel.js +10 -10
  84. package/dist/examples/embed-multi-gpu.d.ts +2 -0
  85. package/dist/examples/embed-multi-gpu.js +46 -0
  86. package/dist/examples/llamacpp-multi-gpu.d.ts +2 -0
  87. package/dist/examples/llamacpp-multi-gpu.js +57 -0
  88. package/dist/examples/plugins.js +3 -7
  89. package/dist/examples/rag/rag-hyperdb/cancellation.js +20 -17
  90. package/dist/examples/tools/llamacpp-tools-gemma4.d.ts +2 -0
  91. package/dist/examples/tools/llamacpp-tools-gemma4.js +73 -0
  92. package/dist/examples/tools/llamacpp-tools-qwen35.d.ts +2 -0
  93. package/dist/examples/tools/llamacpp-tools-qwen35.js +69 -0
  94. package/dist/examples/transcription/parakeet-ctc-filesystem.js +18 -12
  95. package/dist/examples/transcription/parakeet-microphone-record.js +7 -12
  96. package/dist/examples/transcription/parakeet-microphone-stream.d.ts +2 -0
  97. package/dist/examples/transcription/parakeet-microphone-stream.js +79 -0
  98. package/dist/examples/transcription/parakeet-sortformer-streaming.d.ts +2 -0
  99. package/dist/examples/transcription/parakeet-sortformer-streaming.js +121 -0
  100. package/dist/examples/transcription/parakeet-sortformer.js +58 -55
  101. package/dist/examples/transcription/parakeet-tdt-filesystem.js +18 -15
  102. package/dist/examples/transcription/whispercpp-microphone-conversation.d.ts +2 -0
  103. package/dist/examples/transcription/whispercpp-microphone-conversation.js +107 -0
  104. package/dist/examples/tts/chatterbox.js +7 -16
  105. package/dist/examples/tts/llm-to-tts-streaming.js +3 -10
  106. package/dist/examples/tts/supertonic-multilingual.js +4 -12
  107. package/dist/examples/tts/supertonic.js +5 -12
  108. package/dist/examples/vla-smolvla.d.ts +2 -0
  109. package/dist/examples/vla-smolvla.js +75 -0
  110. package/dist/examples/voice-assistant/voice-assistant.js +3 -10
  111. package/dist/expo/plugins/find-in-ancestor-node-modules.d.ts +14 -0
  112. package/dist/expo/plugins/find-in-ancestor-node-modules.js +24 -0
  113. package/dist/expo/plugins/get-project-root.d.ts +22 -0
  114. package/dist/expo/plugins/get-project-root.js +23 -0
  115. package/dist/expo/plugins/index.d.ts +4 -0
  116. package/dist/expo/plugins/index.js +4 -0
  117. package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +9 -2
  118. package/dist/expo/plugins/resolve-sdk-package-dir.js +38 -11
  119. package/dist/expo/plugins/withDeviceInfo.js +2 -1
  120. package/dist/expo/plugins/withMobileBundle.d.ts +5 -4
  121. package/dist/expo/plugins/withMobileBundle.js +42 -58
  122. package/dist/index.d.ts +6 -2
  123. package/dist/index.js +23 -2
  124. package/dist/models/registry/models.d.ts +3725 -514
  125. package/dist/models/registry/models.js +7269 -3910
  126. package/dist/models/update-models/naming.js +22 -8
  127. package/dist/pear/pre.d.ts +3 -0
  128. package/dist/pear/pre.js +9 -2
  129. package/dist/schemas/cancel.d.ts +172 -28
  130. package/dist/schemas/cancel.js +120 -19
  131. package/dist/schemas/classification.d.ts +53 -0
  132. package/dist/schemas/classification.js +33 -0
  133. package/dist/schemas/common.d.ts +860 -1379
  134. package/dist/schemas/common.js +8 -1
  135. package/dist/schemas/completion-event.d.ts +17 -0
  136. package/dist/schemas/completion-event.js +12 -1
  137. package/dist/schemas/completion-stream.d.ts +16 -1
  138. package/dist/schemas/completion-stream.js +25 -7
  139. package/dist/schemas/download-asset.d.ts +25 -9
  140. package/dist/schemas/download-asset.js +17 -6
  141. package/dist/schemas/embed.d.ts +1 -0
  142. package/dist/schemas/embed.js +5 -0
  143. package/dist/schemas/engine-addon-map.d.ts +3 -0
  144. package/dist/schemas/engine-addon-map.js +18 -5
  145. package/dist/schemas/error.d.ts +31 -0
  146. package/dist/schemas/error.js +29 -1
  147. package/dist/schemas/finetune.d.ts +2 -0
  148. package/dist/schemas/finetune.js +5 -0
  149. package/dist/schemas/get-model-info.d.ts +10 -6
  150. package/dist/schemas/get-model-info.js +2 -0
  151. package/dist/schemas/index.d.ts +3 -0
  152. package/dist/schemas/index.js +3 -0
  153. package/dist/schemas/llamacpp-config.d.ts +64 -8
  154. package/dist/schemas/llamacpp-config.js +12 -0
  155. package/dist/schemas/load-model.d.ts +4644 -8605
  156. package/dist/schemas/load-model.js +90 -7
  157. package/dist/schemas/model-src-utils.d.ts +34 -14
  158. package/dist/schemas/model-types.d.ts +54 -14
  159. package/dist/schemas/model-types.js +28 -5
  160. package/dist/schemas/ocr.d.ts +8 -3
  161. package/dist/schemas/plugin.d.ts +60 -6
  162. package/dist/schemas/plugin.js +31 -5
  163. package/dist/schemas/rag.d.ts +9 -0
  164. package/dist/schemas/rag.js +17 -9
  165. package/dist/schemas/registry.d.ts +74 -30
  166. package/dist/schemas/registry.js +5 -0
  167. package/dist/schemas/reload-config.d.ts +34 -14
  168. package/dist/schemas/sdcpp-config.d.ts +445 -16
  169. package/dist/schemas/sdcpp-config.js +387 -26
  170. package/dist/schemas/sdk-config.d.ts +2431 -2723
  171. package/dist/schemas/sdk-config.js +16 -1
  172. package/dist/schemas/sdk-errors-client.d.ts +6 -0
  173. package/dist/schemas/sdk-errors-client.js +31 -1
  174. package/dist/schemas/sdk-errors-server.d.ts +8 -1
  175. package/dist/schemas/sdk-errors-server.js +45 -5
  176. package/dist/schemas/text-to-speech.d.ts +81 -698
  177. package/dist/schemas/text-to-speech.js +46 -19
  178. package/dist/schemas/transcription-config.d.ts +40 -229
  179. package/dist/schemas/transcription-config.js +76 -15
  180. package/dist/schemas/transcription.d.ts +108 -2
  181. package/dist/schemas/transcription.js +81 -0
  182. package/dist/schemas/translate.d.ts +2 -0
  183. package/dist/schemas/translate.js +13 -2
  184. package/dist/schemas/translation-config.d.ts +90 -40
  185. package/dist/schemas/unload-model.d.ts +2 -1
  186. package/dist/schemas/unload-model.js +4 -1
  187. package/dist/schemas/vla.d.ts +87 -0
  188. package/dist/schemas/vla.js +108 -0
  189. package/dist/scripts/run-unit-tests.js +22 -3
  190. package/dist/server/bare/ops/cancel.d.ts +27 -1
  191. package/dist/server/bare/ops/cancel.js +36 -10
  192. package/dist/server/bare/ops/embed.d.ts +3 -3
  193. package/dist/server/bare/ops/embed.js +144 -28
  194. package/dist/server/bare/ops/kv-cache-utils.d.ts +0 -7
  195. package/dist/server/bare/ops/kv-cache-utils.js +8 -47
  196. package/dist/server/bare/ops/transcribe.d.ts +11 -5
  197. package/dist/server/bare/ops/transcribe.js +230 -50
  198. package/dist/server/bare/ops/translate.d.ts +1 -1
  199. package/dist/server/bare/ops/translate.js +197 -88
  200. package/dist/server/bare/plugins/ggml-classification/ops/classify.d.ts +6 -0
  201. package/dist/server/bare/plugins/ggml-classification/ops/classify.js +30 -0
  202. package/dist/server/bare/plugins/ggml-classification/plugin.d.ts +32 -0
  203. package/dist/server/bare/plugins/ggml-classification/plugin.js +55 -0
  204. package/dist/server/bare/plugins/ggml-vla/ops/vla-hparams.d.ts +3 -0
  205. package/dist/server/bare/plugins/ggml-vla/ops/vla-hparams.js +12 -0
  206. package/dist/server/bare/plugins/ggml-vla/ops/vla-run.d.ts +3 -0
  207. package/dist/server/bare/plugins/ggml-vla/ops/vla-run.js +75 -0
  208. package/dist/server/bare/plugins/ggml-vla/plugin.d.ts +54 -0
  209. package/dist/server/bare/plugins/ggml-vla/plugin.js +57 -0
  210. package/dist/server/bare/plugins/index.d.ts +3 -1
  211. package/dist/server/bare/plugins/index.js +3 -1
  212. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +12 -3
  213. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +173 -172
  214. package/dist/server/bare/plugins/llamacpp-completion/ops/context-overflow.d.ts +29 -0
  215. package/dist/server/bare/plugins/llamacpp-completion/ops/context-overflow.js +65 -0
  216. package/dist/server/bare/plugins/llamacpp-completion/ops/finetune.js +125 -21
  217. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-session.d.ts +154 -0
  218. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-session.js +448 -0
  219. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.d.ts +21 -73
  220. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.js +18 -101
  221. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +36 -3
  222. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +183 -85
  223. package/dist/server/bare/plugins/llamacpp-completion/transform.d.ts +10 -0
  224. package/dist/server/bare/plugins/llamacpp-completion/transform.js +34 -0
  225. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +7 -0
  226. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +10 -1
  227. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +42 -15
  228. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +5 -1
  229. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +8 -3
  230. package/dist/server/bare/plugins/onnx-ocr/plugin.js +3 -0
  231. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +73 -244
  232. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +68 -96
  233. package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.js +8 -0
  234. package/dist/server/bare/plugins/sdcpp-generation/ops/upscale.d.ts +3 -0
  235. package/dist/server/bare/plugins/sdcpp-generation/ops/upscale.js +40 -0
  236. package/dist/server/bare/plugins/sdcpp-generation/ops/video.d.ts +3 -0
  237. package/dist/server/bare/plugins/sdcpp-generation/ops/video.js +199 -0
  238. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +288 -15
  239. package/dist/server/bare/plugins/sdcpp-generation/plugin.js +150 -7
  240. package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech-stream.js +2 -15
  241. package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech.js +2 -1
  242. package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +75 -0
  243. package/dist/server/bare/plugins/tts-ggml/plugin.js +189 -0
  244. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +47 -3
  245. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +61 -14
  246. package/dist/server/bare/rag-hyperdb/index.d.ts +1 -1
  247. package/dist/server/bare/rag-hyperdb/index.js +1 -1
  248. package/dist/server/bare/rag-hyperdb/rag-operation-manager.d.ts +26 -4
  249. package/dist/server/bare/rag-hyperdb/rag-operation-manager.js +65 -28
  250. package/dist/server/bare/registry/model-config-utils.js +7 -0
  251. package/dist/server/bare/runtime/disposable-scope.d.ts +36 -0
  252. package/dist/server/bare/runtime/disposable-scope.js +69 -0
  253. package/dist/server/bare/runtime/index.d.ts +8 -0
  254. package/dist/server/bare/runtime/index.js +3 -0
  255. package/dist/server/bare/runtime/request-context.d.ts +49 -0
  256. package/dist/server/bare/runtime/request-context.js +1 -0
  257. package/dist/server/bare/runtime/request-id.d.ts +12 -0
  258. package/dist/server/bare/runtime/request-id.js +14 -0
  259. package/dist/server/bare/runtime/request-registry-singleton.d.ts +4 -0
  260. package/dist/server/bare/runtime/request-registry-singleton.js +27 -0
  261. package/dist/server/bare/runtime/request-registry.d.ts +136 -0
  262. package/dist/server/bare/runtime/request-registry.js +297 -0
  263. package/dist/server/bare/runtime/with-request-context.d.ts +22 -0
  264. package/dist/server/bare/runtime/with-request-context.js +53 -0
  265. package/dist/server/bare/runtime-lifecycle.js +9 -9
  266. package/dist/server/bare/types/addon-responses.d.ts +12 -1
  267. package/dist/server/env.js +4 -1
  268. package/dist/server/plugins/index.d.ts +1 -1
  269. package/dist/server/plugins/index.js +1 -1
  270. package/dist/server/plugins/registry.d.ts +1 -0
  271. package/dist/server/plugins/registry.js +5 -0
  272. package/dist/server/rpc/handler-registry.js +30 -7
  273. package/dist/server/rpc/handler-selection.d.ts +9 -0
  274. package/dist/server/rpc/handler-selection.js +14 -0
  275. package/dist/server/rpc/handler-utils.js +5 -13
  276. package/dist/server/rpc/handlers/cancel-delegated.js +28 -31
  277. package/dist/server/rpc/handlers/cancelHandler.d.ts +30 -1
  278. package/dist/server/rpc/handlers/cancelHandler.js +54 -22
  279. package/dist/server/rpc/handlers/classify.d.ts +3 -0
  280. package/dist/server/rpc/handlers/classify.js +4 -0
  281. package/dist/server/rpc/handlers/delete-cache.d.ts +9 -0
  282. package/dist/server/rpc/handlers/delete-cache.js +13 -15
  283. package/dist/server/rpc/handlers/download-asset.js +133 -40
  284. package/dist/server/rpc/handlers/index.d.ts +4 -0
  285. package/dist/server/rpc/handlers/index.js +4 -0
  286. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +60 -2
  287. package/dist/server/rpc/handlers/load-model/download-manager.js +141 -8
  288. package/dist/server/rpc/handlers/load-model/handler.js +216 -98
  289. package/dist/server/rpc/handlers/load-model/http.js +3 -3
  290. package/dist/server/rpc/handlers/load-model/hyperdrive.js +1 -1
  291. package/dist/server/rpc/handlers/load-model/registry.js +1 -1
  292. package/dist/server/rpc/handlers/load-model/resolve-session.d.ts +20 -1
  293. package/dist/server/rpc/handlers/load-model/resolve-session.js +6 -5
  294. package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -2
  295. package/dist/server/rpc/handlers/load-model/resolve.js +18 -6
  296. package/dist/server/rpc/handlers/load-model/types.d.ts +24 -0
  297. package/dist/server/rpc/handlers/rag.js +133 -15
  298. package/dist/server/rpc/handlers/upscale-stream.d.ts +3 -0
  299. package/dist/server/rpc/handlers/upscale-stream.js +4 -0
  300. package/dist/server/rpc/handlers/video-stream.d.ts +3 -0
  301. package/dist/server/rpc/handlers/video-stream.js +4 -0
  302. package/dist/server/rpc/profiling/operation-metrics.js +23 -0
  303. package/dist/server/utils/completion-normalizer.js +8 -0
  304. package/dist/server/utils/config-transform.js +1 -1
  305. package/dist/server/utils/tools/dialect.js +4 -0
  306. package/dist/server/utils/tools/parser.js +16 -1
  307. package/dist/server/utils/tools/parsers/gemma4native.d.ts +4 -0
  308. package/dist/server/utils/tools/parsers/gemma4native.js +60 -0
  309. package/dist/server/utils/tools/parsers/qwen35.d.ts +4 -0
  310. package/dist/server/utils/tools/parsers/qwen35.js +120 -0
  311. package/dist/server/worker.js +14 -11
  312. package/dist/utils/aggregate-events.d.ts +9 -0
  313. package/dist/utils/aggregate-events.js +18 -3
  314. package/dist/utils/decorate-promise.d.ts +34 -0
  315. package/dist/utils/decorate-promise.js +35 -0
  316. package/dist/utils/errors-client.d.ts +18 -0
  317. package/dist/utils/errors-client.js +31 -0
  318. package/dist/utils/errors-server.d.ts +115 -2
  319. package/dist/utils/errors-server.js +148 -3
  320. package/package.json +68 -77
  321. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +0 -490
  322. package/dist/server/bare/plugins/onnx-tts/plugin.js +0 -266
  323. package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +0 -14
  324. package/dist/server/bare/plugins/onnx-tts/wav-helper.js +0 -107
  325. /package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech-stream.d.ts +0 -0
  326. /package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech.d.ts +0 -0
@@ -0,0 +1,125 @@
1
+ import { promises as fsp } from "node:fs";
2
+ import path from "node:path";
3
+ import semver from "semver";
4
+ import { formatAddonId } from "./addon-source.js";
5
+ const RUNTIME_PACKAGES = [
6
+ { source: "bare-runtime", packageName: "bare-runtime" },
7
+ { source: "bare", packageName: "bare" },
8
+ ];
9
+ export async function resolveBareRuntime(options) {
10
+ if (options.explicitVersion) {
11
+ // Caller (verifyBundle) pre-validates explicitVersion via normalizeVersion.
12
+ return {
13
+ resolved: true,
14
+ runtime: {
15
+ version: normalizeVersion(options.explicitVersion),
16
+ source: options.explicitSource ?? "flag",
17
+ },
18
+ };
19
+ }
20
+ const tried = [];
21
+ for (const candidate of RUNTIME_PACKAGES) {
22
+ const pkgJsonPath = path.join(options.projectRoot, "node_modules", candidate.packageName, "package.json");
23
+ tried.push(pkgJsonPath);
24
+ const version = await tryReadRuntimeVersion(pkgJsonPath);
25
+ if (version) {
26
+ return {
27
+ resolved: true,
28
+ runtime: { version, source: candidate.source },
29
+ };
30
+ }
31
+ }
32
+ return {
33
+ resolved: false,
34
+ error: {
35
+ reason: "Unable to detect installed Bare runtime version",
36
+ triedPaths: tried,
37
+ },
38
+ };
39
+ }
40
+ async function tryReadRuntimeVersion(pkgJsonPath) {
41
+ let raw;
42
+ try {
43
+ raw = await fsp.readFile(pkgJsonPath, "utf8");
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ let parsed;
49
+ try {
50
+ parsed = JSON.parse(raw);
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
56
+ return null;
57
+ }
58
+ const version = parsed["version"];
59
+ return typeof version === "string" ? normalizeVersion(version) : null;
60
+ }
61
+ export function normalizeVersion(value) {
62
+ const coerced = semver.coerce(value, { includePrerelease: true });
63
+ return coerced ? coerced.version : null;
64
+ }
65
+ export function formatConfigLabel(projectRoot, configPath) {
66
+ if (!configPath)
67
+ return "qvac.config";
68
+ const rel = path.relative(projectRoot, configPath);
69
+ if (!rel || rel.startsWith("..") || path.isAbsolute(rel))
70
+ return configPath;
71
+ return rel;
72
+ }
73
+ export function checkAbi(options) {
74
+ const { addons, runtime } = options;
75
+ const addonsWithEngines = addons.filter((addon) => addon.enginesBare !== undefined);
76
+ if (addonsWithEngines.length === 0)
77
+ return [];
78
+ const issues = [];
79
+ const checkable = [];
80
+ for (const addon of addonsWithEngines) {
81
+ const range = addon.enginesBare;
82
+ if (!range)
83
+ continue;
84
+ if (!semver.validRange(range)) {
85
+ issues.push({
86
+ code: "malformed-engines-bare",
87
+ level: "warning",
88
+ addon: formatAddonId(addon),
89
+ enginesBare: range,
90
+ message: `${formatAddonId(addon)} declares engines.bare "${range}", which is ` +
91
+ "not a valid semver range. ABI check skipped for this addon. " +
92
+ "Report this to the addon maintainer.",
93
+ });
94
+ continue;
95
+ }
96
+ checkable.push({ addon, range });
97
+ }
98
+ if (checkable.length === 0)
99
+ return issues;
100
+ if (!runtime.resolved) {
101
+ issues.push({
102
+ code: "unknown-runtime-version",
103
+ level: "warning",
104
+ message: `${runtime.error.reason}. ABI checks skipped for ${checkable.length} ` +
105
+ `addon${checkable.length === 1 ? "" : "s"}. ` +
106
+ "Pass bareRuntimeVersion to enable strict ABI verification.",
107
+ triedPaths: runtime.error.triedPaths,
108
+ });
109
+ return issues;
110
+ }
111
+ for (const { addon, range } of checkable) {
112
+ if (semver.satisfies(runtime.runtime.version, range))
113
+ continue;
114
+ issues.push({
115
+ code: "abi-mismatch",
116
+ level: "error",
117
+ addon: formatAddonId(addon),
118
+ enginesBare: range,
119
+ runtimeVersion: runtime.runtime.version,
120
+ message: `${formatAddonId(addon)} requires bare ${range}, ` +
121
+ `runtime is ${runtime.runtime.version} (from ${runtime.runtime.source}).`,
122
+ });
123
+ }
124
+ return issues;
125
+ }
@@ -0,0 +1,43 @@
1
+ export type AddonSourceKind = "bare-pack-bundle" | "node-modules";
2
+ export interface NativeAddon {
3
+ name: string;
4
+ version?: string;
5
+ packageJsonPath: string;
6
+ packageRoot: string;
7
+ enginesBare?: string;
8
+ }
9
+ export interface AddonPackageJson {
10
+ name?: string;
11
+ version?: string;
12
+ addon?: boolean;
13
+ engines?: {
14
+ bare?: string;
15
+ };
16
+ }
17
+ export interface ReadAddonPackageJsonOptions {
18
+ packageJsonPath: string;
19
+ expectedName?: string;
20
+ }
21
+ export interface InvalidPackageJsonRecord {
22
+ packageJsonPath: string;
23
+ expectedName?: string;
24
+ reason: string;
25
+ }
26
+ export interface ReadAddonPackageJsonResult {
27
+ found: boolean;
28
+ isAddon: boolean;
29
+ invalid?: InvalidPackageJsonRecord;
30
+ addon?: NativeAddon;
31
+ }
32
+ export declare function readAddonPackageJson(options: ReadAddonPackageJsonOptions): Promise<ReadAddonPackageJsonResult>;
33
+ export interface CollectDiagnostics {
34
+ invalidPackageJsons: InvalidPackageJsonRecord[];
35
+ emptyResolutions: boolean;
36
+ }
37
+ export declare function createCollectDiagnostics(): CollectDiagnostics;
38
+ export declare function formatAddonId(addon: {
39
+ name: string;
40
+ version?: string;
41
+ }): string;
42
+ export declare function deduplicateAddons(addons: NativeAddon[]): NativeAddon[];
43
+ //# sourceMappingURL=addon-source.d.ts.map
@@ -0,0 +1,75 @@
1
+ import { promises as fsp } from "node:fs";
2
+ import path from "node:path";
3
+ export async function readAddonPackageJson(options) {
4
+ const { packageJsonPath, expectedName } = options;
5
+ let raw;
6
+ try {
7
+ raw = await fsp.readFile(packageJsonPath, "utf8");
8
+ }
9
+ catch {
10
+ return { found: false, isAddon: false };
11
+ }
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(raw);
15
+ }
16
+ catch (error) {
17
+ const reason = error instanceof Error ? error.message : String(error);
18
+ return {
19
+ found: true,
20
+ isAddon: false,
21
+ invalid: buildInvalid(packageJsonPath, expectedName, `malformed JSON: ${reason}`),
22
+ };
23
+ }
24
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
25
+ return {
26
+ found: true,
27
+ isAddon: false,
28
+ invalid: buildInvalid(packageJsonPath, expectedName, "package.json is not a JSON object"),
29
+ };
30
+ }
31
+ const pkg = parsed;
32
+ if (pkg.addon !== true) {
33
+ return { found: true, isAddon: false };
34
+ }
35
+ const name = pkg.name ?? expectedName;
36
+ if (!name) {
37
+ return {
38
+ found: true,
39
+ isAddon: false,
40
+ invalid: buildInvalid(packageJsonPath, expectedName, "addon package.json is missing a `name` field"),
41
+ };
42
+ }
43
+ const addon = {
44
+ name,
45
+ packageJsonPath,
46
+ packageRoot: path.dirname(packageJsonPath),
47
+ };
48
+ if (typeof pkg.version === "string")
49
+ addon.version = pkg.version;
50
+ if (typeof pkg.engines?.bare === "string")
51
+ addon.enginesBare = pkg.engines.bare;
52
+ return { found: true, isAddon: true, addon };
53
+ }
54
+ function buildInvalid(packageJsonPath, expectedName, reason) {
55
+ const record = { packageJsonPath, reason };
56
+ if (expectedName !== undefined)
57
+ record.expectedName = expectedName;
58
+ return record;
59
+ }
60
+ export function createCollectDiagnostics() {
61
+ return { invalidPackageJsons: [], emptyResolutions: false };
62
+ }
63
+ export function formatAddonId(addon) {
64
+ return `${addon.name}@${addon.version ?? "unknown"}`;
65
+ }
66
+ export function deduplicateAddons(addons) {
67
+ const byKey = new Map();
68
+ for (const addon of addons) {
69
+ const key = `${addon.name}@${addon.version ?? "unknown"}::${addon.packageRoot}`;
70
+ if (!byKey.has(key))
71
+ byKey.set(key, addon);
72
+ }
73
+ return [...byKey.values()].sort((a, b) => formatAddonId(a).localeCompare(formatAddonId(b)) ||
74
+ a.packageRoot.localeCompare(b.packageRoot));
75
+ }
@@ -0,0 +1,12 @@
1
+ import { type CollectDiagnostics, type NativeAddon } from "./addon-source";
2
+ export declare class InvalidBundleSourceError extends Error {
3
+ bundlePath: string;
4
+ constructor(bundlePath: string, cause: unknown);
5
+ }
6
+ export interface CollectAddonsFromBundleOptions {
7
+ bundlePath: string;
8
+ projectRoot: string;
9
+ diagnostics?: CollectDiagnostics;
10
+ }
11
+ export declare function collectAddonsFromBundle(options: CollectAddonsFromBundleOptions): Promise<NativeAddon[]>;
12
+ //# sourceMappingURL=bundle-source.d.ts.map
@@ -0,0 +1,53 @@
1
+ import { promises as fsp } from "node:fs";
2
+ import { buildNestedPathIndex, extractBarePackHeader, extractPackedString, } from "../bundle/manifest.js";
3
+ import { deduplicateAddons, readAddonPackageJson, } from "./addon-source.js";
4
+ export class InvalidBundleSourceError extends Error {
5
+ bundlePath;
6
+ constructor(bundlePath, cause) {
7
+ const reason = cause instanceof Error ? cause.message : String(cause);
8
+ super(`Bundle at ${bundlePath} could not be parsed as a bare-pack bundle.\n\n` +
9
+ ` Reason: ${reason}\n\n` +
10
+ " Make sure the path points to a worker.bundle.js generated by bundleSdk.");
11
+ this.name = "InvalidBundleSourceError";
12
+ this.bundlePath = bundlePath;
13
+ }
14
+ }
15
+ export async function collectAddonsFromBundle(options) {
16
+ const { bundlePath, projectRoot, diagnostics } = options;
17
+ let bundleText;
18
+ try {
19
+ bundleText = await fsp.readFile(bundlePath, "utf8");
20
+ }
21
+ catch (error) {
22
+ throw new InvalidBundleSourceError(bundlePath, error);
23
+ }
24
+ let resolutions;
25
+ try {
26
+ const packed = extractPackedString(bundleText);
27
+ const header = extractBarePackHeader(packed);
28
+ resolutions = header.resolutions ?? {};
29
+ }
30
+ catch (error) {
31
+ throw new InvalidBundleSourceError(bundlePath, error);
32
+ }
33
+ if (diagnostics !== undefined && Object.keys(resolutions).length === 0) {
34
+ diagnostics.emptyResolutions = true;
35
+ }
36
+ const pathsByPackage = buildNestedPathIndex(resolutions, projectRoot);
37
+ const addons = [];
38
+ for (const [pkgName, candidates] of pathsByPackage) {
39
+ for (const candidate of candidates) {
40
+ const result = await readAddonPackageJson({
41
+ packageJsonPath: candidate,
42
+ expectedName: pkgName,
43
+ });
44
+ if (result.isAddon && result.addon) {
45
+ addons.push(result.addon);
46
+ }
47
+ else if (result.invalid !== undefined && diagnostics !== undefined) {
48
+ diagnostics.invalidPackageJsons.push(result.invalid);
49
+ }
50
+ }
51
+ }
52
+ return deduplicateAddons(addons);
53
+ }
@@ -0,0 +1,59 @@
1
+ import { type AddonSourceKind, type NativeAddon } from "./addon-source";
2
+ import { type MissingPrebuildIssue } from "./prebuilds";
3
+ import { type AbiIssue, type BareRuntimeResolution } from "./abi";
4
+ export interface VerifyBundleOptions {
5
+ projectRoot: string;
6
+ addonsSource: string;
7
+ hosts: string[];
8
+ bareRuntimeVersion?: string;
9
+ configPath?: string;
10
+ }
11
+ export interface InvalidSourceIssue {
12
+ code: 'invalid-source';
13
+ level: 'error';
14
+ message: string;
15
+ addonsSource: string;
16
+ }
17
+ export interface InvalidRuntimeVersionIssue {
18
+ code: 'invalid-runtime-version';
19
+ level: 'error';
20
+ message: string;
21
+ providedValue: string;
22
+ source: 'flag' | 'config';
23
+ }
24
+ export interface ConfigLoadFailedIssue {
25
+ code: 'config-load-failed';
26
+ level: 'warning';
27
+ message: string;
28
+ configPath: string;
29
+ reason: string;
30
+ }
31
+ export interface InvalidPackageJsonIssue {
32
+ code: 'invalid-package-json';
33
+ level: 'warning';
34
+ message: string;
35
+ packageJsonPath: string;
36
+ expectedName?: string;
37
+ reason: string;
38
+ }
39
+ export interface EmptyBundleResolutionsIssue {
40
+ code: 'empty-bundle-resolutions';
41
+ level: 'warning';
42
+ message: string;
43
+ bundlePath: string;
44
+ }
45
+ export type VerifyBundleIssue = MissingPrebuildIssue | AbiIssue | InvalidSourceIssue | InvalidRuntimeVersionIssue | ConfigLoadFailedIssue | InvalidPackageJsonIssue | EmptyBundleResolutionsIssue;
46
+ export interface VerifyBundleResult {
47
+ addonsSource: string;
48
+ resolvedAddonsSource: string;
49
+ sourceKind: AddonSourceKind | null;
50
+ hosts: string[];
51
+ runtime: BareRuntimeResolution | null;
52
+ addons: NativeAddon[];
53
+ issues: VerifyBundleIssue[];
54
+ }
55
+ export declare function verifyBundle(options: VerifyBundleOptions): Promise<VerifyBundleResult>;
56
+ export declare function hasErrors(result: VerifyBundleResult): boolean;
57
+ export declare function hasWarnings(result: VerifyBundleResult): boolean;
58
+ export declare function formatVerifyBundleResult(result: VerifyBundleResult): string;
59
+ //# sourceMappingURL=index.d.ts.map