@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,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 {};