@qvac/harness 0.0.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 (483) hide show
  1. package/LICENSE.md +198 -0
  2. package/NOTICE.md +13 -0
  3. package/README.md +68 -0
  4. package/SECURITY.md +6 -0
  5. package/dist/harness.bundle +48339 -0
  6. package/dist/harness.cjs +18 -0
  7. package/dist/harness.d.ts +8 -0
  8. package/dist/prebuilds-manifest.json +379 -0
  9. package/dist-lib/index.d.ts +240 -0
  10. package/dist-lib/index.js +1063 -0
  11. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
  12. package/dist-lib/lib/audio-transcode-bare.js +145 -0
  13. package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
  14. package/dist-lib/lib/audio-transcode-node.js +6 -0
  15. package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
  16. package/dist-lib/lib/capabilities/audio-resample.js +72 -0
  17. package/dist-lib/lib/capabilities/completion.d.ts +288 -0
  18. package/dist-lib/lib/capabilities/completion.js +1077 -0
  19. package/dist-lib/lib/capabilities/download.d.ts +46 -0
  20. package/dist-lib/lib/capabilities/download.js +124 -0
  21. package/dist-lib/lib/capabilities/embed.d.ts +20 -0
  22. package/dist-lib/lib/capabilities/embed.js +13 -0
  23. package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
  24. package/dist-lib/lib/capabilities/kv-cache.js +21 -0
  25. package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
  26. package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
  27. package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
  28. package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
  29. package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
  30. package/dist-lib/lib/capabilities/speech-text.js +79 -0
  31. package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
  32. package/dist-lib/lib/capabilities/tool-names.js +3 -0
  33. package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
  34. package/dist-lib/lib/capabilities/tool-selection.js +60 -0
  35. package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
  36. package/dist-lib/lib/capabilities/tool-turns.js +101 -0
  37. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
  38. package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
  39. package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
  40. package/dist-lib/lib/capabilities/vision-history.js +21 -0
  41. package/dist-lib/lib/capabilities/voice.d.ts +78 -0
  42. package/dist-lib/lib/capabilities/voice.js +189 -0
  43. package/dist-lib/lib/connect.d.ts +76 -0
  44. package/dist-lib/lib/connect.js +789 -0
  45. package/dist-lib/lib/context-window.d.ts +7 -0
  46. package/dist-lib/lib/context-window.js +90 -0
  47. package/dist-lib/lib/contract-types.d.ts +210 -0
  48. package/dist-lib/lib/contract-types.js +1 -0
  49. package/dist-lib/lib/diagram-repair.d.ts +21 -0
  50. package/dist-lib/lib/diagram-repair.js +58 -0
  51. package/dist-lib/lib/dns-lookup.d.ts +1 -0
  52. package/dist-lib/lib/dns-lookup.js +13 -0
  53. package/dist-lib/lib/error-fields.d.ts +2 -0
  54. package/dist-lib/lib/error-fields.js +8 -0
  55. package/dist-lib/lib/fetch-node.d.ts +1 -0
  56. package/dist-lib/lib/fetch-node.js +1 -0
  57. package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
  58. package/dist-lib/lib/hardware/capability-probe.js +99 -0
  59. package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
  60. package/dist-lib/lib/hardware/gpu-classify.js +32 -0
  61. package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
  62. package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
  63. package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
  64. package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
  65. package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
  66. package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
  67. package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
  68. package/dist-lib/lib/hardware/memory-budget.js +1 -0
  69. package/dist-lib/lib/hardware/parsers.d.ts +7 -0
  70. package/dist-lib/lib/hardware/parsers.js +41 -0
  71. package/dist-lib/lib/headers-bare.d.ts +1 -0
  72. package/dist-lib/lib/headers-bare.js +1 -0
  73. package/dist-lib/lib/headers-node.d.ts +4 -0
  74. package/dist-lib/lib/headers-node.js +1 -0
  75. package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
  76. package/dist-lib/lib/helpers/buffer-burst.js +20 -0
  77. package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
  78. package/dist-lib/lib/helpers/control-tokens.js +32 -0
  79. package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
  80. package/dist-lib/lib/helpers/join-guard.js +46 -0
  81. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
  82. package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
  83. package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
  84. package/dist-lib/lib/helpers/race-abort.js +18 -0
  85. package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
  86. package/dist-lib/lib/helpers/retry-memo.js +12 -0
  87. package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
  88. package/dist-lib/lib/helpers/run-outcome.js +204 -0
  89. package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
  90. package/dist-lib/lib/helpers/spawn-path.js +57 -0
  91. package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
  92. package/dist-lib/lib/helpers/text-coalescer.js +34 -0
  93. package/dist-lib/lib/helpers/thinking.d.ts +8 -0
  94. package/dist-lib/lib/helpers/thinking.js +95 -0
  95. package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
  96. package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
  97. package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
  98. package/dist-lib/lib/helpers/tool-intent.js +21 -0
  99. package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
  100. package/dist-lib/lib/helpers/tool-label.js +131 -0
  101. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
  102. package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
  103. package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
  104. package/dist-lib/lib/hooks/built-in/egress.js +29 -0
  105. package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
  106. package/dist-lib/lib/hooks/built-in/index.js +3 -0
  107. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
  108. package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
  109. package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
  110. package/dist-lib/lib/hooks/pipeline.js +49 -0
  111. package/dist-lib/lib/hooks/registry.d.ts +2 -0
  112. package/dist-lib/lib/hooks/registry.js +6 -0
  113. package/dist-lib/lib/hooks/run.d.ts +5 -0
  114. package/dist-lib/lib/hooks/run.js +83 -0
  115. package/dist-lib/lib/hooks/types.d.ts +57 -0
  116. package/dist-lib/lib/hooks/types.js +1 -0
  117. package/dist-lib/lib/log.d.ts +5 -0
  118. package/dist-lib/lib/log.js +37 -0
  119. package/dist-lib/lib/model-download-progress.d.ts +22 -0
  120. package/dist-lib/lib/model-download-progress.js +95 -0
  121. package/dist-lib/lib/models/context.d.ts +5 -0
  122. package/dist-lib/lib/models/context.js +12 -0
  123. package/dist-lib/lib/models/embed-config.d.ts +14 -0
  124. package/dist-lib/lib/models/embed-config.js +31 -0
  125. package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
  126. package/dist-lib/lib/models/gpu-selection.js +26 -0
  127. package/dist-lib/lib/models/kv-cache.d.ts +4 -0
  128. package/dist-lib/lib/models/kv-cache.js +6 -0
  129. package/dist-lib/lib/models/llm-presets.d.ts +10 -0
  130. package/dist-lib/lib/models/llm-presets.js +58 -0
  131. package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
  132. package/dist-lib/lib/models/model-catalog-constants.js +103 -0
  133. package/dist-lib/lib/models/model-catalog.d.ts +125 -0
  134. package/dist-lib/lib/models/model-catalog.js +371 -0
  135. package/dist-lib/lib/models/model-delete.d.ts +18 -0
  136. package/dist-lib/lib/models/model-delete.js +47 -0
  137. package/dist-lib/lib/models/model-handle.d.ts +18 -0
  138. package/dist-lib/lib/models/model-handle.js +33 -0
  139. package/dist-lib/lib/models/model-list.d.ts +42 -0
  140. package/dist-lib/lib/models/model-list.js +123 -0
  141. package/dist-lib/lib/models/model-pool.d.ts +116 -0
  142. package/dist-lib/lib/models/model-pool.js +356 -0
  143. package/dist-lib/lib/models/model-source.d.ts +6 -0
  144. package/dist-lib/lib/models/model-source.js +21 -0
  145. package/dist-lib/lib/models/music-catalog.d.ts +12 -0
  146. package/dist-lib/lib/models/music-catalog.js +26 -0
  147. package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
  148. package/dist-lib/lib/models/opencl-cache.js +50 -0
  149. package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
  150. package/dist-lib/lib/models/sdk-faults.js +66 -0
  151. package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
  152. package/dist-lib/lib/models/tool-dialect.js +19 -0
  153. package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
  154. package/dist-lib/lib/models/tts-model-default.js +13 -0
  155. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
  156. package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
  157. package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
  158. package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
  159. package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
  160. package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
  161. package/dist-lib/lib/prompt.d.ts +22 -0
  162. package/dist-lib/lib/prompt.js +77 -0
  163. package/dist-lib/lib/queue.d.ts +9 -0
  164. package/dist-lib/lib/queue.js +48 -0
  165. package/dist-lib/lib/resolution-detector.d.ts +5 -0
  166. package/dist-lib/lib/resolution-detector.js +100 -0
  167. package/dist-lib/lib/rpc-session.d.ts +8 -0
  168. package/dist-lib/lib/rpc-session.js +20 -0
  169. package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
  170. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  171. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  172. package/dist-lib/lib/sdk-loader.js +53 -0
  173. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  174. package/dist-lib/lib/sdk-storage.js +24 -0
  175. package/dist-lib/lib/serve.d.ts +3 -0
  176. package/dist-lib/lib/serve.js +612 -0
  177. package/dist-lib/lib/spawn.d.ts +62 -0
  178. package/dist-lib/lib/spawn.js +71 -0
  179. package/dist-lib/lib/staging.d.ts +4 -0
  180. package/dist-lib/lib/staging.js +28 -0
  181. package/dist-lib/lib/storage.d.ts +18 -0
  182. package/dist-lib/lib/storage.js +26 -0
  183. package/dist-lib/lib/tmp-path.d.ts +7 -0
  184. package/dist-lib/lib/tmp-path.js +17 -0
  185. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  186. package/dist-lib/lib/tool-call-display.js +1 -0
  187. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  188. package/dist-lib/lib/tools/catalog.js +13 -0
  189. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  190. package/dist-lib/lib/tools/create-documents.js +87 -0
  191. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  192. package/dist-lib/lib/tools/edit-documents.js +122 -0
  193. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  194. package/dist-lib/lib/tools/edit-image.js +271 -0
  195. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  196. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  219. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  220. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  221. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  222. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  223. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  224. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  225. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  226. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  227. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  228. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  229. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  230. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  231. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  232. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  233. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  234. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  235. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  236. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  237. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  238. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  239. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  240. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  241. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  242. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  247. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  248. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  249. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  250. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  251. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  252. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  253. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  254. package/dist-lib/lib/tools/exec/runner.js +87 -0
  255. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  256. package/dist-lib/lib/tools/exec/scope.js +97 -0
  257. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  258. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  259. package/dist-lib/lib/tools/exec.d.ts +29 -0
  260. package/dist-lib/lib/tools/exec.js +459 -0
  261. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  262. package/dist-lib/lib/tools/file-glob.js +112 -0
  263. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  264. package/dist-lib/lib/tools/fs/drive.js +1 -0
  265. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  266. package/dist-lib/lib/tools/fs/glob.js +34 -0
  267. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  268. package/dist-lib/lib/tools/fs/local.js +29 -0
  269. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  270. package/dist-lib/lib/tools/fs/read.js +17 -0
  271. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  272. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  273. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  274. package/dist-lib/lib/tools/fs/remote.js +131 -0
  275. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  276. package/dist-lib/lib/tools/fs/scope.js +130 -0
  277. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  278. package/dist-lib/lib/tools/fs/walk.js +38 -0
  279. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  280. package/dist-lib/lib/tools/fs/write.js +5 -0
  281. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  282. package/dist-lib/lib/tools/generate-image.js +369 -0
  283. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  284. package/dist-lib/lib/tools/generate-music.js +522 -0
  285. package/dist-lib/lib/tools/grep.d.ts +5 -0
  286. package/dist-lib/lib/tools/grep.js +158 -0
  287. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  288. package/dist-lib/lib/tools/http-methods.js +1 -0
  289. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  290. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  291. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  292. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  293. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  294. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  295. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  296. package/dist-lib/lib/tools/http-request.js +177 -0
  297. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  298. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  299. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  300. package/dist-lib/lib/tools/mcp-call.js +155 -0
  301. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  302. package/dist-lib/lib/tools/model-args.js +4 -0
  303. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  304. package/dist-lib/lib/tools/operations/builders.js +179 -0
  305. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  306. package/dist-lib/lib/tools/operations/compile.js +92 -0
  307. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  308. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  309. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  310. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  311. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  312. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  313. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  314. package/dist-lib/lib/tools/private-ip.js +126 -0
  315. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  316. package/dist-lib/lib/tools/rag-search.js +98 -0
  317. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  318. package/dist-lib/lib/tools/read-files.js +153 -0
  319. package/dist-lib/lib/tools/skill.d.ts +10 -0
  320. package/dist-lib/lib/tools/skill.js +123 -0
  321. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  322. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  323. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  324. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  325. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  326. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  327. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  328. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  329. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  330. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  331. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  332. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  333. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  334. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  335. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  336. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  337. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  338. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  339. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  340. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  341. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  342. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  343. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  344. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  345. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  346. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  347. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  348. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  349. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  350. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  351. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  352. package/dist-lib/lib/tools/skills/index.js +5 -0
  353. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  354. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  355. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  356. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  357. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  358. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  359. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  360. package/dist-lib/lib/tools/skills/mention.js +42 -0
  361. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  362. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  363. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  364. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  365. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  366. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  367. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  368. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  369. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  370. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  371. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  372. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  373. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  374. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  375. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  376. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  377. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  378. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  379. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  380. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  381. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  382. package/dist-lib/lib/tools/toolsets.js +20 -0
  383. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  384. package/dist-lib/lib/tools/url-guard.js +40 -0
  385. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  386. package/dist-lib/lib/tools/web-fetch.js +302 -0
  387. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  388. package/dist-lib/lib/tools/web-search.js +55 -0
  389. package/dist-lib/lib/transport.d.ts +12 -0
  390. package/dist-lib/lib/transport.js +59 -0
  391. package/dist-lib/lib/user-agent.d.ts +1 -0
  392. package/dist-lib/lib/user-agent.js +1 -0
  393. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  394. package/dist-lib/lib/validating-lookup.js +25 -0
  395. package/dist-lib/lib/wav-encode.d.ts +5 -0
  396. package/dist-lib/lib/wav-encode.js +24 -0
  397. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  398. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  399. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  400. package/dist-lib/lib/web-fetch/extract.js +65 -0
  401. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  402. package/dist-lib/lib/web-fetch/images.js +43 -0
  403. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  404. package/dist-lib/lib/web-fetch/video.js +42 -0
  405. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  406. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  407. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  409. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  411. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  413. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  415. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  416. package/dist-lib/lib/web-search/engines/google.js +92 -0
  417. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  418. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  419. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  420. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  421. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  422. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  423. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  424. package/dist-lib/lib/web-search/format-results.js +14 -0
  425. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  426. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  427. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  428. package/dist-lib/lib/web-search/merge-results.js +53 -0
  429. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  430. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  431. package/dist-lib/lib/web-search/types.d.ts +34 -0
  432. package/dist-lib/lib/web-search/types.js +1 -0
  433. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  434. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  435. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  436. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  437. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  438. package/dist-lib/lib/web-search/user-agents.js +3 -0
  439. package/dist-lib/lib/wire.d.ts +50 -0
  440. package/dist-lib/lib/wire.js +145 -0
  441. package/dist-lib/schema/baseline.d.ts +8 -0
  442. package/dist-lib/schema/baseline.js +35 -0
  443. package/dist-lib/schema/build.d.ts +1 -0
  444. package/dist-lib/schema/build.js +39 -0
  445. package/dist-lib/schema/generate.d.ts +20 -0
  446. package/dist-lib/schema/generate.js +149 -0
  447. package/dist-lib/schema/harness.d.ts +2 -0
  448. package/dist-lib/schema/harness.js +745 -0
  449. package/dist-lib/schema/release-tags.d.ts +5 -0
  450. package/dist-lib/schema/release-tags.js +58 -0
  451. package/dist-lib/spec/bind.d.ts +2 -0
  452. package/dist-lib/spec/bind.js +124 -0
  453. package/dist-lib/spec/calls.d.ts +3 -0
  454. package/dist-lib/spec/calls.js +41 -0
  455. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  456. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  457. package/dist-lib/spec/hrpc/index.js +463 -0
  458. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  459. package/dist-lib/spec/hrpc/messages.js +3102 -0
  460. package/dist-lib/spec/hyperschema/index.js +3102 -0
  461. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  462. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  463. package/dist-lib/spec/index.d.ts +8 -0
  464. package/dist-lib/spec/index.js +1 -0
  465. package/package.json +418 -1
  466. package/wheels/cffi-2.0.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  467. package/wheels/cryptography-47.0.0-cp314-abi3-pyemscripten_2026_0_wasm32.whl +0 -0
  468. package/wheels/defusedxml-0.7.1-py2.py3-none-any.whl +0 -0
  469. package/wheels/et_xmlfile-2.0.0-py3-none-any.whl +0 -0
  470. package/wheels/fonttools-4.62.1-py3-none-any.whl +0 -0
  471. package/wheels/fpdf2-2.8.8-py3-none-any.whl +0 -0
  472. package/wheels/lxml-6.0.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  473. package/wheels/manifest.json +155 -0
  474. package/wheels/micropip-0.11.1-py3-none-any.whl +0 -0
  475. package/wheels/openpyxl-3.1.5-py2.py3-none-any.whl +0 -0
  476. package/wheels/pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  477. package/wheels/pycparser-3.0-py3-none-any.whl +0 -0
  478. package/wheels/pypdf-6.15.0-py3-none-any.whl +0 -0
  479. package/wheels/python_docx-1.2.0-py3-none-any.whl +0 -0
  480. package/wheels/python_pptx-1.0.2-py3-none-any.whl +0 -0
  481. package/wheels/six-1.17.0-py2.py3-none-any.whl +0 -0
  482. package/wheels/typing_extensions-4.15.0-py3-none-any.whl +0 -0
  483. package/wheels/xlsxwriter-3.2.9-py3-none-any.whl +0 -0
@@ -0,0 +1,71 @@
1
+ import stowChild, {} from 'bare-supervisor/stow';
2
+ import { connectHarness } from "./connect.js";
3
+ import { setHarnessLog } from "./log.js";
4
+ import { createEmbedConfig } from "./models/embed-config.js";
5
+ export function harnessChild(entry, opts) {
6
+ if (opts.logger)
7
+ setHarnessLog(true);
8
+ const { runner, skillsDir, wheelsDir, sdkStorage, embedDevice, embedGpuLayers, embedBatchSize, imageModel, imageClamps, musicModel, musicClamps, llm, onIpc, logger = null, ...spec } = opts;
9
+ const embedConfig = createEmbedConfig({
10
+ device: embedDevice,
11
+ gpuLayers: embedGpuLayers,
12
+ batchSize: embedBatchSize
13
+ });
14
+ return stowChild(entry, {
15
+ ...spec,
16
+ runner,
17
+ args: [
18
+ skillsDir ?? '',
19
+ sdkStorage ? JSON.stringify(sdkStorage) : '',
20
+ JSON.stringify(embedConfig),
21
+ imageModel ? JSON.stringify(imageModel) : '',
22
+ imageClamps ? JSON.stringify(imageClamps) : '',
23
+ logger ? '1' : '',
24
+ llm ? JSON.stringify(llm) : '',
25
+ musicModel ? JSON.stringify(musicModel) : '',
26
+ musicClamps ? JSON.stringify(musicClamps) : '',
27
+ wheelsDir ?? ''
28
+ ],
29
+ logger,
30
+ create: (ipc) => {
31
+ onIpc?.(ipc);
32
+ return connectHarness(() => ipc);
33
+ }
34
+ });
35
+ }
36
+ export function spawnHarness(opts) {
37
+ const logger = opts.logger ?? null;
38
+ if (logger)
39
+ setHarnessLog(true);
40
+ const embedConfig = createEmbedConfig({
41
+ device: opts.embedDevice,
42
+ gpuLayers: opts.embedGpuLayers,
43
+ batchSize: opts.embedBatchSize
44
+ });
45
+ return connectHarness(async () => {
46
+ const { default: Sidecar } = await import('bare-sidecar');
47
+ const { wrap } = (await import('bare-stow/host'));
48
+ const sidecar = new Sidecar(opts.entry, [
49
+ opts.skillsDir ?? '',
50
+ JSON.stringify(opts.sdkStorage),
51
+ JSON.stringify(embedConfig),
52
+ opts.imageModel ? JSON.stringify(opts.imageModel) : '',
53
+ opts.imageClamps ? JSON.stringify(opts.imageClamps) : '',
54
+ logger ? '1' : '',
55
+ opts.llm ? JSON.stringify(opts.llm) : '',
56
+ opts.musicModel ? JSON.stringify(opts.musicModel) : '',
57
+ opts.musicClamps ? JSON.stringify(opts.musicClamps) : '',
58
+ opts.wheelsDir ?? ''
59
+ ]);
60
+ sidecar.stdout.on('data', (data) => logger?.info('harness', data.toString().trimEnd()));
61
+ sidecar.stderr.on('data', (data) => logger?.warn('harness', data.toString().trimEnd()));
62
+ const ipc = wrap(sidecar);
63
+ const died = new Promise((resolve) => {
64
+ sidecar.once('exit', (code) => resolve(`harness exited (${code}) before ready`));
65
+ });
66
+ const failure = await Promise.race([ipc.ready.then(() => null), died]);
67
+ if (failure)
68
+ throw new Error(failure);
69
+ return ipc;
70
+ });
71
+ }
@@ -0,0 +1,4 @@
1
+ export declare const STAGING_DIR: string;
2
+ export declare const STAGING_MAX_AGE_MS: number;
3
+ export declare function stageFile(prefix: string, bytes: Uint8Array): Promise<string>;
4
+ export declare function sweepStaging(now?: number): void;
@@ -0,0 +1,28 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { userTmpPath } from "./tmp-path.js";
4
+ export const STAGING_DIR = userTmpPath('qvac-harness-staging');
5
+ export const STAGING_MAX_AGE_MS = 60 * 60 * 1000;
6
+ const noop = () => { };
7
+ export async function stageFile(prefix, bytes) {
8
+ await fs.promises.mkdir(STAGING_DIR, { recursive: true, mode: 0o700 });
9
+ const unique = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
10
+ const file = path.join(STAGING_DIR, `${prefix}-${unique}`);
11
+ await fs.promises.writeFile(file, bytes, { mode: 0o600 });
12
+ return file;
13
+ }
14
+ export function sweepStaging(now = Date.now()) {
15
+ fs.promises.readdir(STAGING_DIR).then((names) => {
16
+ for (const name of names) {
17
+ const file = path.join(STAGING_DIR, name);
18
+ fs.promises
19
+ .stat(file)
20
+ .then((stat) => {
21
+ if (now - stat.mtimeMs > STAGING_MAX_AGE_MS) {
22
+ return fs.promises.unlink(file).catch(noop);
23
+ }
24
+ })
25
+ .catch(noop);
26
+ }
27
+ }, noop);
28
+ }
@@ -0,0 +1,18 @@
1
+ export declare const MODEL_CACHE_PATH_ENV = "QVAC_MODEL_CACHE_PATH";
2
+ export declare const SDK_HOME_ENV = "SNAP_USER_COMMON";
3
+ export type ReleaseChannel = 'prod' | 'staging' | 'dev';
4
+ export interface StorageOverrides {
5
+ readonly root?: string | null;
6
+ readonly models?: string | null;
7
+ }
8
+ export interface SdkStorage {
9
+ readonly home: string;
10
+ readonly models: string;
11
+ }
12
+ export interface AssistantStorage {
13
+ readonly root: string;
14
+ readonly assistant: string;
15
+ readonly sdk: SdkStorage;
16
+ }
17
+ export declare function releaseChannel(environment: string): ReleaseChannel;
18
+ export declare function resolveStorage(channel: ReleaseChannel, overrides?: StorageOverrides, env?: Readonly<Record<string, string | undefined>>): AssistantStorage;
@@ -0,0 +1,26 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ import process from 'process';
4
+ import { persistent } from 'bare-storage';
5
+ export const MODEL_CACHE_PATH_ENV = 'QVAC_MODEL_CACHE_PATH';
6
+ export const SDK_HOME_ENV = 'SNAP_USER_COMMON';
7
+ export function releaseChannel(environment) {
8
+ if (environment === 'production' || environment === 'prod')
9
+ return 'prod';
10
+ if (environment === 'staging')
11
+ return 'staging';
12
+ return 'dev';
13
+ }
14
+ export function resolveStorage(channel, overrides = {}, env = process.env) {
15
+ const snapCommon = env[SDK_HOME_ENV];
16
+ const root = overrides.root ?? join(snapCommon ?? persistent(), 'qvac', channel);
17
+ const canonicalSdkHome = snapCommon ?? env['HOME'] ?? env['USERPROFILE'] ?? homedir();
18
+ return {
19
+ root,
20
+ assistant: join(root, 'assistant'),
21
+ sdk: {
22
+ home: join(root, 'sdk-home'),
23
+ models: overrides.models ?? join(canonicalSdkHome, '.qvac', 'models')
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,7 @@
1
+ export type UserTmpOptions = {
2
+ readonly readOwner?: () => {
3
+ uid: number;
4
+ username: string;
5
+ };
6
+ };
7
+ export declare function userTmpPath(name: string, opts?: UserTmpOptions): string;
@@ -0,0 +1,17 @@
1
+ import os from 'os';
2
+ import path from 'path';
3
+ export function userTmpPath(name, opts = {}) {
4
+ const readOwner = opts.readOwner ?? (() => os.userInfo());
5
+ return path.join(os.tmpdir(), taggedName(name, readOwner));
6
+ }
7
+ function taggedName(name, readOwner) {
8
+ let owner;
9
+ try {
10
+ const { uid, username } = readOwner();
11
+ owner = uid >= 0 ? `u${uid}` : username.replace(/[^A-Za-z0-9_-]/g, '');
12
+ }
13
+ catch {
14
+ return name;
15
+ }
16
+ return owner ? `${name}-${owner}` : name;
17
+ }
@@ -0,0 +1,21 @@
1
+ export type ToolCallDisplay = {
2
+ readonly label: string;
3
+ readonly description?: string;
4
+ readonly iconEmoji?: string;
5
+ };
6
+ export type ToolExecutionOutcome = {
7
+ readonly kind: 'success';
8
+ } | {
9
+ readonly kind: 'error';
10
+ readonly message?: string;
11
+ readonly error?: unknown;
12
+ } | {
13
+ readonly kind: 'denied';
14
+ readonly reason?: string;
15
+ } | {
16
+ readonly kind: 'blocked';
17
+ readonly reason?: string;
18
+ } | {
19
+ readonly kind: 'guidance';
20
+ readonly message: string;
21
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { type ToolDefinition } from '../capabilities/completion.ts';
2
+ import type { Toolset } from './toolsets.ts';
3
+ export interface ToolCatalogEntry {
4
+ name: string;
5
+ description: string;
6
+ skillGated: boolean;
7
+ scopeRequired: boolean;
8
+ rootsRequired: boolean;
9
+ writeRootsRequired: boolean;
10
+ toolset: Toolset | null;
11
+ promptChars: number;
12
+ }
13
+ export declare function toolCatalog(tools: ReadonlyArray<ToolDefinition>): ToolCatalogEntry[];
@@ -0,0 +1,13 @@
1
+ import { toSdkTool } from "../capabilities/completion.js";
2
+ export function toolCatalog(tools) {
3
+ return tools.map((tool) => ({
4
+ name: tool.name,
5
+ description: tool.description,
6
+ skillGated: tool.skillGated === true,
7
+ scopeRequired: false,
8
+ rootsRequired: tool.rootsRequired === true,
9
+ writeRootsRequired: tool.writeRootsRequired === true,
10
+ toolset: tool.toolset,
11
+ promptChars: JSON.stringify(toSdkTool(tool)).length
12
+ }));
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import { type FsToolOptions } from './fs/scope.ts';
3
+ export declare function createCreateDocumentsTool({ realpath, deniedRoots }?: FsToolOptions): ToolDefinition;
@@ -0,0 +1,87 @@
1
+ import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
2
+ import { writeText } from "./fs/write.js";
3
+ function documentRequests(raw) {
4
+ if (!Array.isArray(raw) || raw.length === 0)
5
+ return null;
6
+ const documents = [];
7
+ for (const entry of raw) {
8
+ const record = entry;
9
+ if (typeof record?.path !== 'string' || !record.path.trim())
10
+ return null;
11
+ if (typeof record.content !== 'string')
12
+ return null;
13
+ documents.push({ path: record.path, content: record.content });
14
+ }
15
+ return documents;
16
+ }
17
+ export function createCreateDocumentsTool({ realpath = defaultRealpath, deniedRoots } = {}) {
18
+ return {
19
+ name: 'create_documents',
20
+ toolset: 'files',
21
+ description: 'Create new files inside the granted directories. Parent directories are ' +
22
+ 'created as needed. Fails per file if the file already exists — use ' +
23
+ 'edit_documents to change existing files.',
24
+ parameters: {
25
+ type: 'object',
26
+ properties: {
27
+ documents: {
28
+ type: 'array',
29
+ description: 'Files to create',
30
+ items: {
31
+ type: 'object',
32
+ properties: {
33
+ path: { type: 'string', description: 'File path' },
34
+ content: { type: 'string', description: 'Full file content' }
35
+ },
36
+ required: ['path', 'content']
37
+ }
38
+ }
39
+ },
40
+ required: ['documents']
41
+ },
42
+ effect: () => 'read',
43
+ writeRootsRequired: true,
44
+ validate(rawArgs) {
45
+ return documentRequests(rawArgs.documents)
46
+ ? null
47
+ : 'documents must be a non-empty array of { path, content }';
48
+ },
49
+ resource(args) {
50
+ const documents = documentRequests(args.documents);
51
+ if (!documents)
52
+ return null;
53
+ const bytes = documents.reduce((sum, doc) => sum + doc.content.length, 0);
54
+ const first = documents[0];
55
+ const suffix = documents.length > 1 ? ` (+${documents.length - 1} more)` : '';
56
+ return { kind: 'file', label: `create ${first.path}${suffix}, ${bytes} chars` };
57
+ },
58
+ async execute(rawArgs, ctx) {
59
+ const roots = ctx?.fsWriteRoots ?? [];
60
+ const documents = documentRequests(rawArgs.documents);
61
+ if (!documents)
62
+ return { error: 'documents must be a non-empty array of { path, content }' };
63
+ const created = [];
64
+ const failed = [];
65
+ const deny = await canonicalDenyRoots(deniedRoots, realpath);
66
+ for (const doc of documents) {
67
+ const resolved = await resolveKey(doc.path, roots, realpath, deny);
68
+ if ('error' in resolved) {
69
+ failed.push({ path: doc.path, error: resolved.error });
70
+ continue;
71
+ }
72
+ try {
73
+ if ((await resolved.root.drive.entry(resolved.key)) !== null) {
74
+ failed.push({ path: doc.path, error: 'file already exists' });
75
+ continue;
76
+ }
77
+ await writeText(resolved.root.drive, resolved.key, doc.content);
78
+ created.push(doc.path);
79
+ }
80
+ catch (err) {
81
+ failed.push({ path: doc.path, error: err.message });
82
+ }
83
+ }
84
+ return { created, ...(failed.length ? { failed } : {}) };
85
+ }
86
+ };
87
+ }
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import { type FsToolOptions } from './fs/scope.ts';
3
+ export declare function createEditDocumentsTool({ realpath, deniedRoots }?: FsToolOptions): ToolDefinition;
@@ -0,0 +1,122 @@
1
+ import b4a from 'b4a';
2
+ import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
3
+ import { writeText } from "./fs/write.js";
4
+ function editRequests(raw) {
5
+ if (!Array.isArray(raw) || raw.length === 0)
6
+ return null;
7
+ const edits = [];
8
+ for (const entry of raw) {
9
+ const record = entry;
10
+ if (typeof record?.path !== 'string' || !record.path.trim())
11
+ return null;
12
+ if (typeof record.search !== 'string' || record.search.length === 0)
13
+ return null;
14
+ if (typeof record.replace !== 'string')
15
+ return null;
16
+ edits.push({ path: record.path, search: record.search, replace: record.replace });
17
+ }
18
+ return edits;
19
+ }
20
+ function applyEdits(content, edits) {
21
+ let next = content;
22
+ for (const edit of edits) {
23
+ const first = next.indexOf(edit.search);
24
+ if (first === -1)
25
+ return { error: 'search text not found' };
26
+ if (next.indexOf(edit.search, first + edit.search.length) !== -1) {
27
+ return { error: 'search text is ambiguous (matches more than once)' };
28
+ }
29
+ next = next.slice(0, first) + edit.replace + next.slice(first + edit.search.length);
30
+ }
31
+ return next;
32
+ }
33
+ export function createEditDocumentsTool({ realpath = defaultRealpath, deniedRoots } = {}) {
34
+ return {
35
+ name: 'edit_documents',
36
+ toolset: 'files',
37
+ description: 'Edit existing files inside the granted directories via search/replace. ' +
38
+ 'Each search string must match exactly once in its file; include enough ' +
39
+ 'surrounding context to make it unique. Edits to one file apply together.',
40
+ parameters: {
41
+ type: 'object',
42
+ properties: {
43
+ edits: {
44
+ type: 'array',
45
+ description: 'Search/replace edits',
46
+ items: {
47
+ type: 'object',
48
+ properties: {
49
+ path: { type: 'string', description: 'File path' },
50
+ search: { type: 'string', description: 'Exact text to find (must match once)' },
51
+ replace: { type: 'string', description: 'Replacement text' }
52
+ },
53
+ required: ['path', 'search', 'replace']
54
+ }
55
+ }
56
+ },
57
+ required: ['edits']
58
+ },
59
+ effect: () => 'write',
60
+ autoApprove: false,
61
+ writeRootsRequired: true,
62
+ validate(rawArgs) {
63
+ return editRequests(rawArgs.edits)
64
+ ? null
65
+ : 'edits must be a non-empty array of { path, search, replace }';
66
+ },
67
+ resource(args) {
68
+ const edits = editRequests(args.edits);
69
+ if (!edits)
70
+ return null;
71
+ const paths = [...new Set(edits.map((edit) => edit.path))];
72
+ const label = paths.slice(0, 3).join(', ');
73
+ return {
74
+ kind: 'file',
75
+ label: `edit ${paths.length > 3 ? `${label} (+${paths.length - 3} more)` : label} (${edits.length} edit${edits.length > 1 ? 's' : ''})`
76
+ };
77
+ },
78
+ async execute(rawArgs, ctx) {
79
+ const roots = ctx?.fsWriteRoots ?? [];
80
+ const edits = editRequests(rawArgs.edits);
81
+ if (!edits)
82
+ return { error: 'edits must be a non-empty array of { path, search, replace }' };
83
+ const byPath = new Map();
84
+ for (const edit of edits) {
85
+ const list = byPath.get(edit.path) ?? [];
86
+ list.push(edit);
87
+ byPath.set(edit.path, list);
88
+ }
89
+ const edited = [];
90
+ const failed = [];
91
+ const deny = await canonicalDenyRoots(deniedRoots, realpath);
92
+ for (const [file, fileEdits] of byPath) {
93
+ const resolved = await resolveKey(file, roots, realpath, deny);
94
+ if ('error' in resolved) {
95
+ failed.push({ path: file, error: resolved.error });
96
+ continue;
97
+ }
98
+ try {
99
+ const entry = await resolved.root.drive.entry(resolved.key);
100
+ const blob = entry === null ? null : await resolved.root.drive.get(resolved.key);
101
+ if (entry === null || blob === null) {
102
+ failed.push({ path: file, error: `no such file: ${file}` });
103
+ continue;
104
+ }
105
+ const next = applyEdits(b4a.toString(blob, 'utf8'), fileEdits);
106
+ if (typeof next === 'object') {
107
+ failed.push({ path: file, error: next.error });
108
+ continue;
109
+ }
110
+ await writeText(resolved.root.drive, resolved.key, next, {
111
+ executable: entry.value.executable
112
+ });
113
+ edited.push(file);
114
+ }
115
+ catch (err) {
116
+ failed.push({ path: file, error: err.message });
117
+ }
118
+ }
119
+ return { edited, ...(failed.length ? { failed } : {}) };
120
+ }
121
+ };
122
+ }
@@ -0,0 +1,25 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import type { ImageClamps } from '../models/model-catalog.ts';
3
+ import { type DiffusionRuntime } from './generate-image.ts';
4
+ interface Rgba {
5
+ width: number;
6
+ height: number;
7
+ data: Buffer;
8
+ frames?: Rgba[];
9
+ }
10
+ interface Media {
11
+ image: {
12
+ decode(input: Buffer, opts?: {
13
+ maxFrames?: number;
14
+ }): Promise<Rgba>;
15
+ encode(rgba: Rgba, opts: {
16
+ mimetype: string;
17
+ }): Promise<Uint8Array>;
18
+ };
19
+ }
20
+ export interface EditImageDeps {
21
+ loadMedia?: () => Promise<Media | null>;
22
+ resample?: (rgba: Rgba, width: number, height: number) => Rgba | Promise<Rgba>;
23
+ }
24
+ export declare function createEditImageTool(runtime: DiffusionRuntime, { loadMedia, resample }?: EditImageDeps, clamps?: ImageClamps): ToolDefinition;
25
+ export {};