@qvac/harness 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/dist/harness.bundle +8 -59
  2. package/dist/prebuilds-manifest.json +0 -8
  3. package/dist-lib/index.d.ts +240 -0
  4. package/dist-lib/index.js +1063 -0
  5. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
  6. package/dist-lib/lib/audio-transcode-bare.js +145 -0
  7. package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
  8. package/dist-lib/lib/audio-transcode-node.js +6 -0
  9. package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
  10. package/dist-lib/lib/capabilities/audio-resample.js +72 -0
  11. package/dist-lib/lib/capabilities/completion.d.ts +288 -0
  12. package/dist-lib/lib/capabilities/completion.js +1077 -0
  13. package/dist-lib/lib/capabilities/download.d.ts +46 -0
  14. package/dist-lib/lib/capabilities/download.js +124 -0
  15. package/dist-lib/lib/capabilities/embed.d.ts +20 -0
  16. package/dist-lib/lib/capabilities/embed.js +13 -0
  17. package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
  18. package/dist-lib/lib/capabilities/kv-cache.js +21 -0
  19. package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
  20. package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
  21. package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
  22. package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
  23. package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
  24. package/dist-lib/lib/capabilities/speech-text.js +79 -0
  25. package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
  26. package/dist-lib/lib/capabilities/tool-names.js +3 -0
  27. package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
  28. package/dist-lib/lib/capabilities/tool-selection.js +60 -0
  29. package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
  30. package/dist-lib/lib/capabilities/tool-turns.js +101 -0
  31. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
  32. package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
  33. package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
  34. package/dist-lib/lib/capabilities/vision-history.js +21 -0
  35. package/dist-lib/lib/capabilities/voice.d.ts +78 -0
  36. package/dist-lib/lib/capabilities/voice.js +189 -0
  37. package/dist-lib/lib/connect.d.ts +76 -0
  38. package/dist-lib/lib/connect.js +789 -0
  39. package/dist-lib/lib/context-window.d.ts +7 -0
  40. package/dist-lib/lib/context-window.js +90 -0
  41. package/dist-lib/lib/contract-types.d.ts +210 -0
  42. package/dist-lib/lib/contract-types.js +1 -0
  43. package/dist-lib/lib/diagram-repair.d.ts +21 -0
  44. package/dist-lib/lib/diagram-repair.js +58 -0
  45. package/dist-lib/lib/dns-lookup.d.ts +1 -0
  46. package/dist-lib/lib/dns-lookup.js +13 -0
  47. package/dist-lib/lib/error-fields.d.ts +2 -0
  48. package/dist-lib/lib/error-fields.js +8 -0
  49. package/dist-lib/lib/fetch-node.d.ts +1 -0
  50. package/dist-lib/lib/fetch-node.js +1 -0
  51. package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
  52. package/dist-lib/lib/hardware/capability-probe.js +99 -0
  53. package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
  54. package/dist-lib/lib/hardware/gpu-classify.js +32 -0
  55. package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
  56. package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
  57. package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
  58. package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
  59. package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
  60. package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
  61. package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
  62. package/dist-lib/lib/hardware/memory-budget.js +1 -0
  63. package/dist-lib/lib/hardware/parsers.d.ts +7 -0
  64. package/dist-lib/lib/hardware/parsers.js +41 -0
  65. package/dist-lib/lib/headers-bare.d.ts +1 -0
  66. package/dist-lib/lib/headers-bare.js +1 -0
  67. package/dist-lib/lib/headers-node.d.ts +4 -0
  68. package/dist-lib/lib/headers-node.js +1 -0
  69. package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
  70. package/dist-lib/lib/helpers/buffer-burst.js +20 -0
  71. package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
  72. package/dist-lib/lib/helpers/control-tokens.js +32 -0
  73. package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
  74. package/dist-lib/lib/helpers/join-guard.js +46 -0
  75. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
  76. package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
  77. package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
  78. package/dist-lib/lib/helpers/race-abort.js +18 -0
  79. package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
  80. package/dist-lib/lib/helpers/retry-memo.js +12 -0
  81. package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
  82. package/dist-lib/lib/helpers/run-outcome.js +204 -0
  83. package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
  84. package/dist-lib/lib/helpers/spawn-path.js +57 -0
  85. package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
  86. package/dist-lib/lib/helpers/text-coalescer.js +34 -0
  87. package/dist-lib/lib/helpers/thinking.d.ts +8 -0
  88. package/dist-lib/lib/helpers/thinking.js +95 -0
  89. package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
  90. package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
  91. package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
  92. package/dist-lib/lib/helpers/tool-intent.js +21 -0
  93. package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
  94. package/dist-lib/lib/helpers/tool-label.js +131 -0
  95. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
  96. package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
  97. package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
  98. package/dist-lib/lib/hooks/built-in/egress.js +29 -0
  99. package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
  100. package/dist-lib/lib/hooks/built-in/index.js +3 -0
  101. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
  102. package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
  103. package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
  104. package/dist-lib/lib/hooks/pipeline.js +49 -0
  105. package/dist-lib/lib/hooks/registry.d.ts +2 -0
  106. package/dist-lib/lib/hooks/registry.js +6 -0
  107. package/dist-lib/lib/hooks/run.d.ts +5 -0
  108. package/dist-lib/lib/hooks/run.js +83 -0
  109. package/dist-lib/lib/hooks/types.d.ts +57 -0
  110. package/dist-lib/lib/hooks/types.js +1 -0
  111. package/dist-lib/lib/log.d.ts +5 -0
  112. package/dist-lib/lib/log.js +37 -0
  113. package/dist-lib/lib/model-download-progress.d.ts +22 -0
  114. package/dist-lib/lib/model-download-progress.js +95 -0
  115. package/dist-lib/lib/models/context.d.ts +5 -0
  116. package/dist-lib/lib/models/context.js +12 -0
  117. package/dist-lib/lib/models/embed-config.d.ts +14 -0
  118. package/dist-lib/lib/models/embed-config.js +31 -0
  119. package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
  120. package/dist-lib/lib/models/gpu-selection.js +26 -0
  121. package/dist-lib/lib/models/kv-cache.d.ts +4 -0
  122. package/dist-lib/lib/models/kv-cache.js +6 -0
  123. package/dist-lib/lib/models/llm-presets.d.ts +10 -0
  124. package/dist-lib/lib/models/llm-presets.js +58 -0
  125. package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
  126. package/dist-lib/lib/models/model-catalog-constants.js +103 -0
  127. package/dist-lib/lib/models/model-catalog.d.ts +125 -0
  128. package/dist-lib/lib/models/model-catalog.js +371 -0
  129. package/dist-lib/lib/models/model-delete.d.ts +18 -0
  130. package/dist-lib/lib/models/model-delete.js +47 -0
  131. package/dist-lib/lib/models/model-handle.d.ts +18 -0
  132. package/dist-lib/lib/models/model-handle.js +33 -0
  133. package/dist-lib/lib/models/model-list.d.ts +42 -0
  134. package/dist-lib/lib/models/model-list.js +123 -0
  135. package/dist-lib/lib/models/model-pool.d.ts +116 -0
  136. package/dist-lib/lib/models/model-pool.js +356 -0
  137. package/dist-lib/lib/models/model-source.d.ts +6 -0
  138. package/dist-lib/lib/models/model-source.js +21 -0
  139. package/dist-lib/lib/models/music-catalog.d.ts +12 -0
  140. package/dist-lib/lib/models/music-catalog.js +26 -0
  141. package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
  142. package/dist-lib/lib/models/opencl-cache.js +50 -0
  143. package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
  144. package/dist-lib/lib/models/sdk-faults.js +66 -0
  145. package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
  146. package/dist-lib/lib/models/tool-dialect.js +19 -0
  147. package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
  148. package/dist-lib/lib/models/tts-model-default.js +13 -0
  149. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
  150. package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
  151. package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
  152. package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
  153. package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
  154. package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
  155. package/dist-lib/lib/prompt.d.ts +22 -0
  156. package/dist-lib/lib/prompt.js +77 -0
  157. package/dist-lib/lib/queue.d.ts +9 -0
  158. package/dist-lib/lib/queue.js +48 -0
  159. package/dist-lib/lib/resolution-detector.d.ts +5 -0
  160. package/dist-lib/lib/resolution-detector.js +100 -0
  161. package/dist-lib/lib/rpc-session.d.ts +8 -0
  162. package/dist-lib/lib/rpc-session.js +20 -0
  163. package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
  164. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  165. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  166. package/dist-lib/lib/sdk-loader.js +53 -0
  167. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  168. package/dist-lib/lib/sdk-storage.js +24 -0
  169. package/dist-lib/lib/serve.d.ts +3 -0
  170. package/dist-lib/lib/serve.js +612 -0
  171. package/dist-lib/lib/spawn.d.ts +62 -0
  172. package/dist-lib/lib/spawn.js +71 -0
  173. package/dist-lib/lib/staging.d.ts +4 -0
  174. package/dist-lib/lib/staging.js +28 -0
  175. package/dist-lib/lib/storage.d.ts +18 -0
  176. package/dist-lib/lib/storage.js +26 -0
  177. package/dist-lib/lib/tmp-path.d.ts +7 -0
  178. package/dist-lib/lib/tmp-path.js +17 -0
  179. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  180. package/dist-lib/lib/tool-call-display.js +1 -0
  181. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  182. package/dist-lib/lib/tools/catalog.js +13 -0
  183. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  184. package/dist-lib/lib/tools/create-documents.js +87 -0
  185. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  186. package/dist-lib/lib/tools/edit-documents.js +122 -0
  187. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  188. package/dist-lib/lib/tools/edit-image.js +271 -0
  189. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  190. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  191. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  192. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  193. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  194. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  195. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  196. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  219. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  220. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  221. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  222. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  223. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  224. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  225. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  226. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  227. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  228. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  229. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  230. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  231. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  232. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  233. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  234. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  235. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  236. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  237. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  238. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  239. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  240. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  241. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  242. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  247. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  248. package/dist-lib/lib/tools/exec/runner.js +87 -0
  249. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  250. package/dist-lib/lib/tools/exec/scope.js +97 -0
  251. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  252. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  253. package/dist-lib/lib/tools/exec.d.ts +29 -0
  254. package/dist-lib/lib/tools/exec.js +459 -0
  255. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  256. package/dist-lib/lib/tools/file-glob.js +112 -0
  257. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  258. package/dist-lib/lib/tools/fs/drive.js +1 -0
  259. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  260. package/dist-lib/lib/tools/fs/glob.js +34 -0
  261. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  262. package/dist-lib/lib/tools/fs/local.js +29 -0
  263. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  264. package/dist-lib/lib/tools/fs/read.js +17 -0
  265. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  266. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  267. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  268. package/dist-lib/lib/tools/fs/remote.js +131 -0
  269. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  270. package/dist-lib/lib/tools/fs/scope.js +130 -0
  271. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  272. package/dist-lib/lib/tools/fs/walk.js +38 -0
  273. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  274. package/dist-lib/lib/tools/fs/write.js +5 -0
  275. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  276. package/dist-lib/lib/tools/generate-image.js +369 -0
  277. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  278. package/dist-lib/lib/tools/generate-music.js +522 -0
  279. package/dist-lib/lib/tools/grep.d.ts +5 -0
  280. package/dist-lib/lib/tools/grep.js +158 -0
  281. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  282. package/dist-lib/lib/tools/http-methods.js +1 -0
  283. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  284. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  285. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  286. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  287. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  288. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  289. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  290. package/dist-lib/lib/tools/http-request.js +177 -0
  291. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  292. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  293. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  294. package/dist-lib/lib/tools/mcp-call.js +155 -0
  295. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  296. package/dist-lib/lib/tools/model-args.js +4 -0
  297. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  298. package/dist-lib/lib/tools/operations/builders.js +179 -0
  299. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  300. package/dist-lib/lib/tools/operations/compile.js +92 -0
  301. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  302. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  303. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  304. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  305. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  306. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  307. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  308. package/dist-lib/lib/tools/private-ip.js +126 -0
  309. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  310. package/dist-lib/lib/tools/rag-search.js +98 -0
  311. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  312. package/dist-lib/lib/tools/read-files.js +153 -0
  313. package/dist-lib/lib/tools/skill.d.ts +10 -0
  314. package/dist-lib/lib/tools/skill.js +123 -0
  315. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  316. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  317. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  318. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  319. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  320. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  321. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  322. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  323. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  324. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  325. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  326. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  327. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  328. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  329. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  330. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  331. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  332. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  333. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  334. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  335. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  336. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  337. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  338. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  339. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  340. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  341. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  342. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  343. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  344. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  345. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  346. package/dist-lib/lib/tools/skills/index.js +5 -0
  347. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  348. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  349. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  350. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  351. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  352. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  353. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  354. package/dist-lib/lib/tools/skills/mention.js +42 -0
  355. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  356. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  357. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  358. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  359. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  360. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  361. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  362. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  363. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  364. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  365. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  366. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  367. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  368. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  369. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  370. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  371. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  372. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  373. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  374. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  375. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  376. package/dist-lib/lib/tools/toolsets.js +20 -0
  377. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  378. package/dist-lib/lib/tools/url-guard.js +40 -0
  379. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  380. package/dist-lib/lib/tools/web-fetch.js +302 -0
  381. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  382. package/dist-lib/lib/tools/web-search.js +55 -0
  383. package/dist-lib/lib/transport.d.ts +12 -0
  384. package/dist-lib/lib/transport.js +59 -0
  385. package/dist-lib/lib/user-agent.d.ts +1 -0
  386. package/dist-lib/lib/user-agent.js +1 -0
  387. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  388. package/dist-lib/lib/validating-lookup.js +25 -0
  389. package/dist-lib/lib/wav-encode.d.ts +5 -0
  390. package/dist-lib/lib/wav-encode.js +24 -0
  391. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  392. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  393. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  394. package/dist-lib/lib/web-fetch/extract.js +65 -0
  395. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  396. package/dist-lib/lib/web-fetch/images.js +43 -0
  397. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  398. package/dist-lib/lib/web-fetch/video.js +42 -0
  399. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  400. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  401. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  402. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  403. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  404. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  405. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  406. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  407. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  409. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/google.js +92 -0
  411. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  413. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  415. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  416. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  417. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  418. package/dist-lib/lib/web-search/format-results.js +14 -0
  419. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  420. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  421. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  422. package/dist-lib/lib/web-search/merge-results.js +53 -0
  423. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  424. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  425. package/dist-lib/lib/web-search/types.d.ts +34 -0
  426. package/dist-lib/lib/web-search/types.js +1 -0
  427. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  428. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  429. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  430. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  431. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  432. package/dist-lib/lib/web-search/user-agents.js +3 -0
  433. package/dist-lib/lib/wire.d.ts +50 -0
  434. package/dist-lib/lib/wire.js +145 -0
  435. package/dist-lib/schema/baseline.d.ts +8 -0
  436. package/dist-lib/schema/baseline.js +35 -0
  437. package/dist-lib/schema/build.d.ts +1 -0
  438. package/dist-lib/schema/build.js +39 -0
  439. package/dist-lib/schema/generate.d.ts +20 -0
  440. package/dist-lib/schema/generate.js +149 -0
  441. package/dist-lib/schema/harness.d.ts +2 -0
  442. package/dist-lib/schema/harness.js +745 -0
  443. package/dist-lib/schema/release-tags.d.ts +5 -0
  444. package/dist-lib/schema/release-tags.js +58 -0
  445. package/dist-lib/spec/bind.d.ts +2 -0
  446. package/dist-lib/spec/bind.js +124 -0
  447. package/dist-lib/spec/calls.d.ts +3 -0
  448. package/dist-lib/spec/calls.js +41 -0
  449. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  450. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  451. package/dist-lib/spec/hrpc/index.js +463 -0
  452. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  453. package/dist-lib/spec/hrpc/messages.js +3102 -0
  454. package/dist-lib/spec/hyperschema/index.js +3102 -0
  455. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  456. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  457. package/dist-lib/spec/index.d.ts +8 -0
  458. package/dist-lib/spec/index.js +1 -0
  459. package/package.json +239 -64
  460. package/.gitattributes +0 -1
@@ -0,0 +1,33 @@
1
+ import { retryMemo } from "../helpers/retry-memo.js";
2
+ export class ModelHandle {
3
+ _load;
4
+ _peek;
5
+ _tracked = null;
6
+ _loading = false;
7
+ constructor({ load }) {
8
+ const memo = retryMemo(load);
9
+ this._load = memo;
10
+ this._peek = memo.peek;
11
+ this.load().catch(noop);
12
+ }
13
+ load() {
14
+ const attempt = this._load();
15
+ if (attempt !== this._tracked) {
16
+ this._tracked = attempt;
17
+ this._loading = true;
18
+ const settled = () => {
19
+ if (this._tracked === attempt)
20
+ this._loading = false;
21
+ };
22
+ attempt.then(settled, settled);
23
+ }
24
+ return attempt;
25
+ }
26
+ get loading() {
27
+ return this._loading;
28
+ }
29
+ peek() {
30
+ return this._peek();
31
+ }
32
+ }
33
+ function noop() { }
@@ -0,0 +1,42 @@
1
+ import type * as QvacSdk from '@qvac/sdk';
2
+ import type { ModelAddon, ModelRegistrySdk } from './model-source.ts';
3
+ export type ModelType = ModelAddon;
4
+ export interface StaticCatalogEntry {
5
+ readonly name: string;
6
+ readonly registryPath: string;
7
+ }
8
+ export type ModelListSdk = ModelRegistrySdk & Pick<typeof QvacSdk, 'getModelInfo'> & {
9
+ readonly models: ReadonlyArray<StaticCatalogEntry>;
10
+ };
11
+ export interface ModelInfo {
12
+ name: string;
13
+ type: ModelType;
14
+ registryPath: string;
15
+ registrySource: string;
16
+ isCached: boolean;
17
+ isLoaded: boolean;
18
+ supportsImages: boolean;
19
+ expectedSize: number;
20
+ actualSize?: number;
21
+ }
22
+ export interface ListModelsOptions {
23
+ type?: ModelType;
24
+ cachedOnly?: boolean;
25
+ fullRegistry?: boolean;
26
+ }
27
+ interface ModelStatus {
28
+ at: number;
29
+ isCached: boolean;
30
+ isLoaded: boolean;
31
+ expectedSize?: number;
32
+ actualSize?: number;
33
+ }
34
+ export type ModelStatusCache = {
35
+ readonly entries: Map<string, ModelStatus>;
36
+ epoch: number;
37
+ };
38
+ export declare const MODEL_STATUS_TTL_MS = 30000;
39
+ export declare function createModelStatusCache(): ModelStatusCache;
40
+ export declare function invalidateModelStatusCache(cache: ModelStatusCache): void;
41
+ export declare function listModels(sdk: ModelListSdk, { type, cachedOnly, fullRegistry }?: ListModelsOptions, cache?: ModelStatusCache, projectionFor?: (name: string) => string | undefined): Promise<ModelInfo[]>;
42
+ export {};
@@ -0,0 +1,123 @@
1
+ import { companionRegistryPaths, curatedListables, musicListables } from "./model-catalog.js";
2
+ export const MODEL_STATUS_TTL_MS = 30_000;
3
+ export function createModelStatusCache() {
4
+ return { entries: new Map(), epoch: 0 };
5
+ }
6
+ export function invalidateModelStatusCache(cache) {
7
+ cache.entries.clear();
8
+ cache.epoch += 1;
9
+ }
10
+ const STATUS_CONCURRENCY = 8;
11
+ async function mapPool(items, limit, fn) {
12
+ const results = new Array(items.length);
13
+ let cursor = 0;
14
+ const worker = async () => {
15
+ while (true) {
16
+ const i = cursor++;
17
+ if (i >= items.length)
18
+ return;
19
+ results[i] = await fn(items[i]);
20
+ }
21
+ };
22
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
23
+ return results;
24
+ }
25
+ const COMPANIONS_BY_WEIGHT = companionRegistryPaths();
26
+ async function musicRows(hydrate) {
27
+ const rows = [];
28
+ for (const listable of musicListables()) {
29
+ const status = await hydrate(listable.asset.registryPath, listable.asset.name);
30
+ let companionsCached = true;
31
+ for (const companion of listable.companions) {
32
+ companionsCached =
33
+ (await hydrate(companion.registryPath, companion.name)).isCached && companionsCached;
34
+ }
35
+ rows.push({
36
+ name: listable.name,
37
+ type: 'audiogen',
38
+ registryPath: listable.asset.registryPath,
39
+ registrySource: listable.asset.registrySource,
40
+ isCached: status.isCached && companionsCached,
41
+ isLoaded: status.isLoaded,
42
+ supportsImages: false,
43
+ expectedSize: listable.expectedSize
44
+ });
45
+ }
46
+ return rows;
47
+ }
48
+ export async function listModels(sdk, { type, cachedOnly, fullRegistry } = {}, cache, projectionFor) {
49
+ const now = Date.now();
50
+ const seesImages = (name, addon) => addon === 'llm' && Boolean(projectionFor?.(name));
51
+ const hydrate = async (registryPath, catalogName) => {
52
+ const hit = cache?.entries.get(registryPath);
53
+ if (hit && now - hit.at < MODEL_STATUS_TTL_MS)
54
+ return hit;
55
+ const epoch = cache?.epoch;
56
+ const info = catalogName
57
+ ? await sdk.getModelInfo({ name: catalogName }).catch(() => null)
58
+ : null;
59
+ const status = {
60
+ at: now,
61
+ isCached: info?.isCached ?? false,
62
+ isLoaded: info?.isLoaded ?? false,
63
+ expectedSize: info?.expectedSize,
64
+ actualSize: info?.actualSize
65
+ };
66
+ if (cache && cache.epoch === epoch)
67
+ cache.entries.set(registryPath, status);
68
+ return status;
69
+ };
70
+ if (!fullRegistry) {
71
+ const listables = curatedListables().filter((listable) => !type || listable.asset.addon === type);
72
+ const rows = await mapPool(listables, STATUS_CONCURRENCY, async (listable) => {
73
+ const status = await hydrate(listable.asset.registryPath, listable.asset.name);
74
+ let companionsCached = true;
75
+ for (const companion of listable.companions) {
76
+ companionsCached =
77
+ (await hydrate(companion.registryPath, companion.name)).isCached && companionsCached;
78
+ }
79
+ if (listable.projection && projectionFor?.(listable.name) === listable.projection.src) {
80
+ const projection = await hydrate(listable.projection.registryPath, listable.projection.name);
81
+ companionsCached = projection.isCached && companionsCached;
82
+ }
83
+ return {
84
+ name: listable.name,
85
+ type: listable.asset.addon,
86
+ registryPath: listable.asset.registryPath,
87
+ registrySource: listable.asset.registrySource,
88
+ isCached: status.isCached && companionsCached,
89
+ isLoaded: status.isLoaded,
90
+ supportsImages: seesImages(listable.name, listable.asset.addon),
91
+ expectedSize: status.expectedSize ?? listable.asset.expectedSize,
92
+ actualSize: status.actualSize
93
+ };
94
+ });
95
+ const music = !type || type === 'audiogen' ? await musicRows(hydrate) : [];
96
+ const all = [...rows, ...music];
97
+ return cachedOnly ? all.filter((row) => row.isCached) : all;
98
+ }
99
+ const entries = await sdk.modelRegistrySearch(type ? { addon: type } : {});
100
+ const catalog = new Map();
101
+ for (const c of sdk.models)
102
+ catalog.set(c.registryPath, c.name);
103
+ const rows = await mapPool(entries, STATUS_CONCURRENCY, async (entry) => {
104
+ const status = await hydrate(entry.registryPath, catalog.get(entry.registryPath));
105
+ const companions = COMPANIONS_BY_WEIGHT.get(entry.registryPath) ?? [];
106
+ let companionsCached = true;
107
+ for (const path of companions) {
108
+ companionsCached = (await hydrate(path, catalog.get(path))).isCached && companionsCached;
109
+ }
110
+ return {
111
+ name: entry.name,
112
+ type: entry.addon,
113
+ registryPath: entry.registryPath,
114
+ registrySource: entry.registrySource,
115
+ isCached: status.isCached && companionsCached,
116
+ isLoaded: status.isLoaded,
117
+ supportsImages: seesImages(entry.name, entry.addon),
118
+ expectedSize: status.expectedSize ?? entry.expectedSize,
119
+ actualSize: status.actualSize
120
+ };
121
+ });
122
+ return cachedOnly ? rows.filter((row) => row.isCached) : rows;
123
+ }
@@ -0,0 +1,116 @@
1
+ import ResourcePuddle from 'resource-puddle';
2
+ import { ModelHandle } from './model-handle.ts';
3
+ import { type ModelSrc } from './context.ts';
4
+ import { type ModelAddon } from './model-source.ts';
5
+ import type { GpuFaultState } from './sdk-faults.ts';
6
+ type SdkModule = typeof import('@qvac/sdk');
7
+ export interface ModelState {
8
+ status: 'loading' | 'downloading' | 'ready' | 'unloading' | 'unloaded';
9
+ model: string;
10
+ [key: string]: unknown;
11
+ }
12
+ export type NotifyFn = (state: ModelState) => void;
13
+ export interface LlmDeviceConfig {
14
+ device?: 'cpu' | 'gpu';
15
+ gpuLayers?: number;
16
+ contextSize?: number;
17
+ kvCacheK?: string;
18
+ kvCacheV?: string;
19
+ mainGpu?: () => Promise<string | undefined>;
20
+ openclCacheDir?: () => string | undefined;
21
+ }
22
+ export type TrackedLoad = Promise<string> & {
23
+ requestId?: string;
24
+ };
25
+ export interface CancelSdk {
26
+ cancel(params: {
27
+ requestId: string;
28
+ }): Promise<unknown>;
29
+ }
30
+ export interface LoadTracker {
31
+ readonly draining: boolean;
32
+ track(pending: TrackedLoad): TrackedLoad;
33
+ drain(sdk: CancelSdk): void;
34
+ undrain(): void;
35
+ }
36
+ export declare function createLoadTracker(): LoadTracker;
37
+ export type ModelLifecycleSdk = Pick<SdkModule, 'unloadModel' | 'modelRegistrySearch'> & Partial<CancelSdk> & {
38
+ loadModel(params: {
39
+ modelSrc: ModelSrc;
40
+ modelType: 'llamacpp-completion';
41
+ modelConfig?: {
42
+ verbosity?: 0 | 1 | 2 | 3;
43
+ tools?: boolean;
44
+ stop_sequences?: readonly string[];
45
+ ctx_size?: number;
46
+ 'cache-type-k'?: string;
47
+ 'cache-type-v'?: string;
48
+ projectionModelSrc?: ModelSrc;
49
+ device?: 'cpu' | 'gpu';
50
+ gpu_layers?: number;
51
+ 'main-gpu'?: string;
52
+ openclCacheDir?: string;
53
+ };
54
+ onProgress?: (progress: Record<string, unknown>) => void;
55
+ }): TrackedLoad;
56
+ };
57
+ export interface ModelLoadOptions {
58
+ ctxSize?: number;
59
+ kvCacheK?: string;
60
+ kvCacheV?: string;
61
+ projectionModel?: string;
62
+ }
63
+ export declare function resolveLoadOptions(opts?: ModelLoadOptions, deviceConfig?: LlmDeviceConfig): ModelLoadOptions;
64
+ export declare function modelKey(model: string, opts?: ModelLoadOptions): string;
65
+ export interface LoadedModel {
66
+ model: string;
67
+ refs: number;
68
+ }
69
+ type PoolLike = ReturnType<typeof createModelPool>;
70
+ export declare function releaseModel(pool: PoolLike, key: string): void;
71
+ export declare function loadedModels(pool: PoolLike): LoadedModel[];
72
+ export declare function isResident(pool: PoolLike, key: string): boolean;
73
+ export declare function leaseCount(pool: PoolLike, key: string): number;
74
+ export declare function evictIdle(pool: PoolLike): Promise<void>;
75
+ export declare function evictAllWithin(pool: PoolLike, deadlineMs: number, tickMs?: number, signal?: {
76
+ aborted?: boolean;
77
+ }): Promise<boolean>;
78
+ export declare function evictModelWithin(pool: PoolLike, key: string, deadlineMs: number, tickMs?: number): Promise<boolean>;
79
+ export type LoadSdk = () => Promise<ModelLifecycleSdk>;
80
+ export type EmbedLifecycleSdk = Pick<SdkModule, 'unloadModel' | 'modelRegistrySearch'> & Partial<CancelSdk> & {
81
+ loadModel(params: {
82
+ modelSrc: ModelSrc;
83
+ modelType: 'llamacpp-embedding';
84
+ modelConfig?: {
85
+ batchSize?: number;
86
+ gpuLayers?: number;
87
+ device?: string;
88
+ openclCacheDir?: string;
89
+ };
90
+ onProgress?: (progress: Record<string, unknown>) => void;
91
+ }): TrackedLoad;
92
+ };
93
+ export type LoadEmbedSdk = () => Promise<EmbedLifecycleSdk>;
94
+ export declare function progressState(model: string, progress: Record<string, unknown>): ModelState;
95
+ interface LoadClockGuardOptions {
96
+ now?: () => number;
97
+ monoMs?: () => number;
98
+ sampleMs?: number;
99
+ jumpMs?: number;
100
+ }
101
+ export declare function loadClockGuard(model: string, sdk: Partial<CancelSdk>, { now, monoMs, sampleMs, jumpMs }?: LoadClockGuardOptions): {
102
+ race: (pending: TrackedLoad) => Promise<string>;
103
+ };
104
+ export declare function createModelPool(loadSdk: LoadSdk, notify: NotifyFn, deviceConfig?: LlmDeviceConfig, loads?: LoadTracker): ResourcePuddle<string, ModelHandle>;
105
+ export declare function createEmbedPool(loadSdk: LoadEmbedSdk, notify: NotifyFn, faults: GpuFaultState, batchSize?: number, openclCacheDir?: () => string | undefined, loads?: LoadTracker): ResourcePuddle<string, ModelHandle>;
106
+ export type VoiceLifecycleSdk = Pick<SdkModule, 'unloadModel' | 'modelRegistrySearch'> & Partial<CancelSdk> & {
107
+ loadModel(params: {
108
+ modelSrc: ModelSrc;
109
+ modelType: string;
110
+ modelConfig?: Record<string, unknown>;
111
+ onProgress?: (progress: Record<string, unknown>) => void;
112
+ }): TrackedLoad;
113
+ };
114
+ export type LoadVoiceSdk = () => Promise<VoiceLifecycleSdk>;
115
+ export declare function createVoicePool(loadSdk: LoadVoiceSdk, notify: NotifyFn, modelType: string, addon: ModelAddon, modelConfig?: Record<string, unknown>, openclCacheDir?: () => string | undefined, loads?: LoadTracker): ResourcePuddle<string, ModelHandle>;
116
+ export {};
@@ -0,0 +1,356 @@
1
+ import process from 'process';
2
+ import { transferProgress } from "../model-download-progress.js";
3
+ import ResourcePuddle from 'resource-puddle';
4
+ import { ModelHandle } from "./model-handle.js";
5
+ import { defaultContextSize } from "./context.js";
6
+ import { adrenoSafeKvCache } from "./kv-cache.js";
7
+ import { DEFAULT_EMBED_BATCH_SIZE } from "./embed-config.js";
8
+ import { hlog } from "../log.js";
9
+ import { RUNAWAY_STOP_SEQUENCES } from "../helpers/control-tokens.js";
10
+ import { resolveModelSrc } from "./model-source.js";
11
+ export function createLoadTracker() {
12
+ const inflight = new Set();
13
+ let draining = null;
14
+ const cancel = (sdk, requestId) => {
15
+ void sdk.cancel({ requestId }).catch(() => { });
16
+ };
17
+ return {
18
+ get draining() {
19
+ return draining !== null;
20
+ },
21
+ track(pending) {
22
+ const { requestId } = pending;
23
+ if (!requestId)
24
+ return pending;
25
+ if (draining) {
26
+ cancel(draining, requestId);
27
+ return pending;
28
+ }
29
+ inflight.add(requestId);
30
+ const untrack = () => inflight.delete(requestId);
31
+ pending.then(untrack, untrack);
32
+ return pending;
33
+ },
34
+ drain(sdk) {
35
+ draining = sdk;
36
+ for (const requestId of inflight)
37
+ cancel(sdk, requestId);
38
+ inflight.clear();
39
+ },
40
+ undrain() {
41
+ draining = null;
42
+ }
43
+ };
44
+ }
45
+ const NO_IDLE_GC = { gcInterval: 0, gcIdleTicks: 1 };
46
+ export function resolveLoadOptions(opts = {}, deviceConfig = {}) {
47
+ return {
48
+ ctxSize: opts.ctxSize || deviceConfig.contextSize,
49
+ kvCacheK: opts.kvCacheK ?? deviceConfig.kvCacheK,
50
+ kvCacheV: opts.kvCacheV ?? deviceConfig.kvCacheV,
51
+ projectionModel: opts.projectionModel
52
+ };
53
+ }
54
+ export function modelKey(model, opts = {}) {
55
+ return [
56
+ model,
57
+ opts.ctxSize ?? '',
58
+ opts.kvCacheK ?? '',
59
+ opts.kvCacheV ?? '',
60
+ opts.projectionModel ?? ''
61
+ ].join('\0');
62
+ }
63
+ function entryOf(pool, key) {
64
+ return pool.resources.get(key);
65
+ }
66
+ export function releaseModel(pool, key) {
67
+ if (pool.destroyed)
68
+ return;
69
+ const handle = entryOf(pool, key)?.value;
70
+ if (handle === undefined || !handle.loading) {
71
+ pool.release(key);
72
+ return;
73
+ }
74
+ const pending = handle.peek();
75
+ if (pending === null) {
76
+ pool.release(key);
77
+ return;
78
+ }
79
+ void pending.then(() => releaseSettled(pool, key), () => releaseSettled(pool, key));
80
+ }
81
+ function releaseSettled(pool, key) {
82
+ if (!pool.destroyed)
83
+ pool.release(key);
84
+ }
85
+ export function loadedModels(pool) {
86
+ const out = [];
87
+ for (const entry of pool.resources.values()) {
88
+ if (entry.value.peek() === null)
89
+ continue;
90
+ out.push({ model: entry.id.split('\0')[0], refs: entry.refs });
91
+ }
92
+ return out;
93
+ }
94
+ export function isResident(pool, key) {
95
+ const handle = entryOf(pool, key)?.value;
96
+ return handle !== undefined && handle.peek() !== null;
97
+ }
98
+ export function leaseCount(pool, key) {
99
+ return entryOf(pool, key)?.refs ?? 0;
100
+ }
101
+ export async function evictIdle(pool) {
102
+ for (let tick = 0; pool.idle > 0 && tick <= pool.gcIdleTicks; tick++) {
103
+ await pool.gc();
104
+ }
105
+ }
106
+ export async function evictAllWithin(pool, deadlineMs, tickMs = 250, signal) {
107
+ let done = false;
108
+ let timer = null;
109
+ const expired = new Promise((resolve) => {
110
+ timer = setTimeout(() => {
111
+ done = true;
112
+ resolve(false);
113
+ }, deadlineMs);
114
+ });
115
+ const evicting = (async () => {
116
+ await evictIdle(pool);
117
+ while (loadedModels(pool).length > 0) {
118
+ if (done || signal?.aborted)
119
+ return false;
120
+ await new Promise((resolve) => setTimeout(resolve, tickMs));
121
+ if (done || signal?.aborted)
122
+ return false;
123
+ await evictIdle(pool);
124
+ }
125
+ return true;
126
+ })();
127
+ try {
128
+ return await Promise.race([evicting, expired]);
129
+ }
130
+ finally {
131
+ done = true;
132
+ if (timer !== null)
133
+ clearTimeout(timer);
134
+ }
135
+ }
136
+ export async function evictModelWithin(pool, key, deadlineMs, tickMs = 250) {
137
+ let timer = null;
138
+ const expired = new Promise((resolve) => {
139
+ timer = setTimeout(() => resolve(false), deadlineMs);
140
+ });
141
+ const evicting = (async () => {
142
+ while (isResident(pool, key)) {
143
+ await evictIdle(pool);
144
+ if (!isResident(pool, key))
145
+ break;
146
+ await new Promise((resolve) => setTimeout(resolve, tickMs));
147
+ }
148
+ return true;
149
+ })();
150
+ try {
151
+ return await Promise.race([evicting, expired]);
152
+ }
153
+ finally {
154
+ if (timer !== null)
155
+ clearTimeout(timer);
156
+ }
157
+ }
158
+ function llmVerbosity() {
159
+ const raw = Number(process.env.QVAC_LLM_VERBOSITY ?? 0);
160
+ return raw === 1 || raw === 2 || raw === 3 ? raw : 0;
161
+ }
162
+ export function progressState(model, progress) {
163
+ const transfer = transferProgress(progress);
164
+ if (!transfer)
165
+ return { status: 'loading', model };
166
+ const { percentage, downloaded, total } = transfer;
167
+ return percentage < 100
168
+ ? { ...progress, status: 'downloading', model, percentage, downloaded, total }
169
+ : { status: 'loading', model, percentage, downloaded, total };
170
+ }
171
+ const CLOCK_JUMP_MS = 250;
172
+ const CLOCK_SAMPLE_MS = 2_000;
173
+ function monotonicMs() {
174
+ return Number(process.hrtime.bigint() / 1000000n);
175
+ }
176
+ export function loadClockGuard(model, sdk, { now = () => Date.now(), monoMs = monotonicMs, sampleMs = CLOCK_SAMPLE_MS, jumpMs = CLOCK_JUMP_MS } = {}) {
177
+ let timer = null;
178
+ let fail;
179
+ let done = false;
180
+ let abandoned = false;
181
+ let lastWall = now();
182
+ let lastMono = monoMs();
183
+ const jumped = new Promise((_resolve, reject) => {
184
+ fail = reject;
185
+ });
186
+ const arm = () => {
187
+ timer = setTimeout(sample, sampleMs);
188
+ timer.unref?.();
189
+ };
190
+ const sample = () => {
191
+ if (done)
192
+ return;
193
+ const wall = now();
194
+ const mono = monoMs();
195
+ if (wall - lastWall < mono - lastMono - jumpMs) {
196
+ abandoned = true;
197
+ fail(new Error(`model load abandoned: system clock moved backward mid-load: ${model}`));
198
+ return;
199
+ }
200
+ lastWall = wall;
201
+ lastMono = mono;
202
+ arm();
203
+ };
204
+ arm();
205
+ const race = async (pending) => {
206
+ try {
207
+ return await Promise.race([pending, jumped]);
208
+ }
209
+ catch (err) {
210
+ if (abandoned && pending.requestId) {
211
+ void sdk.cancel?.({ requestId: pending.requestId }).catch(() => { });
212
+ }
213
+ throw err;
214
+ }
215
+ finally {
216
+ done = true;
217
+ if (timer !== null)
218
+ clearTimeout(timer);
219
+ }
220
+ };
221
+ return { race };
222
+ }
223
+ export function createModelPool(loadSdk, notify, deviceConfig = {}, loads = createLoadTracker()) {
224
+ const load = async (model, opts) => {
225
+ const sdk = await loadSdk();
226
+ notify({ status: 'loading', model });
227
+ const modelSrc = await resolveModelSrc(sdk, model);
228
+ const resolved = resolveLoadOptions(opts, deviceConfig);
229
+ const ctxSize = resolved.ctxSize || defaultContextSize(modelSrc);
230
+ const projectionModelSrc = resolved.projectionModel
231
+ ? await resolveModelSrc(sdk, resolved.projectionModel)
232
+ : undefined;
233
+ const mainGpu = deviceConfig.device !== 'cpu' && deviceConfig.mainGpu
234
+ ? await deviceConfig.mainGpu()
235
+ : undefined;
236
+ const kvCache = adrenoSafeKvCache(deviceConfig.device, resolved.kvCacheK, resolved.kvCacheV);
237
+ const openclCache = deviceConfig.device !== 'cpu' && deviceConfig.openclCacheDir
238
+ ? deviceConfig.openclCacheDir()
239
+ : undefined;
240
+ const modelConfig = {
241
+ verbosity: llmVerbosity(),
242
+ tools: true,
243
+ stop_sequences: RUNAWAY_STOP_SEQUENCES,
244
+ ctx_size: ctxSize,
245
+ 'cache-type-k': kvCache.k,
246
+ 'cache-type-v': kvCache.v,
247
+ projectionModelSrc,
248
+ ...(deviceConfig.device ? { device: deviceConfig.device } : {}),
249
+ ...(deviceConfig.gpuLayers === undefined ? {} : { gpu_layers: deviceConfig.gpuLayers }),
250
+ ...(mainGpu === undefined ? {} : { 'main-gpu': mainGpu }),
251
+ ...(openclCache ? { openclCacheDir: openclCache } : {})
252
+ };
253
+ const { projectionModelSrc: projection, ...loggedConfig } = modelConfig;
254
+ hlog('llm load config', { model, projection: Boolean(projection), ...loggedConfig });
255
+ const loadStarted = Date.now();
256
+ const modelId = await loadClockGuard(model, sdk).race(loads.track(sdk.loadModel({
257
+ modelSrc,
258
+ modelType: 'llamacpp-completion',
259
+ modelConfig,
260
+ onProgress: (progress) => notify(progressState(model, progress))
261
+ })));
262
+ hlog('llm loaded', { model, loadMs: Date.now() - loadStarted });
263
+ notify({ status: 'ready', model });
264
+ return { model, modelId, ctxSize };
265
+ };
266
+ return new ResourcePuddle({
267
+ open: (key, model = key, opts = {}) => new ModelHandle({ load: () => load(model, opts) }),
268
+ gc: unloadOnGc(loadSdk, notify),
269
+ ...NO_IDLE_GC
270
+ });
271
+ }
272
+ export function createEmbedPool(loadSdk, notify, faults, batchSize = DEFAULT_EMBED_BATCH_SIZE, openclCacheDir, loads = createLoadTracker()) {
273
+ const load = async (model) => {
274
+ const sdk = await loadSdk();
275
+ notify({ status: 'loading', model });
276
+ const modelSrc = await resolveModelSrc(sdk, model, 'embeddings');
277
+ const openclCache = faults.device !== 'cpu' && openclCacheDir ? openclCacheDir() : undefined;
278
+ const modelId = await loadClockGuard(model, sdk).race(loads.track(sdk.loadModel({
279
+ modelSrc,
280
+ modelType: 'llamacpp-embedding',
281
+ modelConfig: {
282
+ batchSize,
283
+ gpuLayers: faults.gpuLayers(),
284
+ device: faults.device,
285
+ ...(openclCache ? { openclCacheDir: openclCache } : {})
286
+ },
287
+ onProgress: (progress) => notify(progressState(model, progress))
288
+ })));
289
+ notify({ status: 'ready', model });
290
+ return { model, modelId };
291
+ };
292
+ return new ResourcePuddle({
293
+ open: (key, model = key) => new ModelHandle({ load: () => load(model) }),
294
+ gc: unloadOnGc(loadSdk, notify),
295
+ ...NO_IDLE_GC
296
+ });
297
+ }
298
+ export function createVoicePool(loadSdk, notify, modelType, addon, modelConfig, openclCacheDir, loads = createLoadTracker()) {
299
+ const wantsGpu = modelConfig?.['useGPU'] === true;
300
+ let gpuRefused = false;
301
+ const load = async (model) => {
302
+ const sdk = await loadSdk();
303
+ notify({ status: 'loading', model });
304
+ const modelSrc = await resolveModelSrc(sdk, model, addon);
305
+ const attempt = () => {
306
+ const config = gpuRefused ? { ...modelConfig, useGPU: false } : modelConfig;
307
+ const openclCache = gpuRefused ? undefined : openclCacheDir?.();
308
+ return loads.track(sdk.loadModel({
309
+ modelSrc,
310
+ modelType,
311
+ modelConfig: openclCache ? { openclCacheDir: openclCache, ...config } : config,
312
+ onProgress: (progress) => notify(progressState(model, progress))
313
+ }));
314
+ };
315
+ const modelId = await loadClockGuard(model, sdk).race(attempt().catch((err) => {
316
+ if (!wantsGpu || gpuRefused || loads.draining)
317
+ throw err;
318
+ hlog('voice gpu load refused, retrying on cpu', { model, modelType, error: String(err) });
319
+ gpuRefused = true;
320
+ return attempt();
321
+ }));
322
+ notify({ status: 'ready', model });
323
+ return { model, modelId };
324
+ };
325
+ return new ResourcePuddle({
326
+ open: (key, model = key) => new ModelHandle({ load: () => load(model) }),
327
+ gc: unloadOnGc(loadSdk, notify),
328
+ ...NO_IDLE_GC
329
+ });
330
+ }
331
+ function unloadOnGc(loadSdk, notify) {
332
+ return async (handles) => {
333
+ const sdk = await loadSdk();
334
+ for (const handle of handles) {
335
+ const pending = handle.peek();
336
+ if (pending === null)
337
+ continue;
338
+ let loaded;
339
+ try {
340
+ loaded = await pending;
341
+ }
342
+ catch {
343
+ continue;
344
+ }
345
+ const { model, modelId } = loaded;
346
+ notify({ status: 'unloading', model });
347
+ try {
348
+ await sdk.unloadModel({ modelId });
349
+ }
350
+ catch {
351
+ continue;
352
+ }
353
+ notify({ status: 'unloaded', model });
354
+ }
355
+ };
356
+ }
@@ -0,0 +1,6 @@
1
+ import type * as QvacSdk from '@qvac/sdk';
2
+ import type { ModelRegistryEntryAddon } from '@qvac/sdk';
3
+ import type { ModelSrc } from './context.ts';
4
+ export type ModelRegistrySdk = Pick<typeof QvacSdk, 'modelRegistrySearch'>;
5
+ export type ModelAddon = ModelRegistryEntryAddon;
6
+ export declare function resolveModelSrc(sdk: ModelRegistrySdk, model: string, addon?: ModelAddon): Promise<ModelSrc>;