@qvac/harness 1.0.0-rc.1 → 1.0.0-rc.3

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 (852) hide show
  1. package/CHANGELOG.md +1168 -1
  2. package/NOTICE.md +16 -0
  3. package/README.md +278 -471
  4. package/bench/README.md +94 -0
  5. package/bench/bfcl/checker.ts +313 -0
  6. package/bench/bfcl/data.ts +93 -0
  7. package/bench/bfcl/observe.ts +93 -0
  8. package/bench/bfcl/run.ts +213 -0
  9. package/bench/bfcl/tools.ts +72 -0
  10. package/bench/bridge/bridge.ts +392 -0
  11. package/bench/bridge/openai.ts +150 -0
  12. package/bench/bridge/python/qvac_bench/__init__.py +3 -0
  13. package/bench/bridge/python/qvac_bench/airline.py +42 -0
  14. package/bench/bridge/python/qvac_bench/approval.py +26 -0
  15. package/bench/bridge/python/qvac_bench/bfcl_multi_turn.py +152 -0
  16. package/bench/bridge/python/qvac_bench/client.py +88 -0
  17. package/bench/bridge/python/qvac_bench/harbor_agent.py +85 -0
  18. package/bench/bridge/python/qvac_bench/session.py +107 -0
  19. package/bench/bridge/python/qvac_bench/speed.py +30 -0
  20. package/bench/bridge/python/qvac_bench/tau2_agent.py +106 -0
  21. package/bench/bridge/python/qvac_bench/tools.py +11 -0
  22. package/bench/bridge/python/run_bfcl_multi_turn.py +95 -0
  23. package/bench/bridge/python/run_tau2.py +150 -0
  24. package/bench/bridge/python/smoke.py +47 -0
  25. package/bench/bridge/python/test_airline.py +28 -0
  26. package/bench/bridge/python/test_approval.py +57 -0
  27. package/bench/bridge/python/test_bfcl_multi_turn.py +185 -0
  28. package/bench/bridge/python/test_harbor_agent.py +107 -0
  29. package/bench/bridge/serve.ts +52 -0
  30. package/bench/bridge/transcript.ts +52 -0
  31. package/bench/bun-tsconfig.json +15 -0
  32. package/bench/cpu-main.mjs +216 -0
  33. package/bench/cpu.ts +457 -0
  34. package/bench/evidence/2026-09-28-review15.md +225 -0
  35. package/bench/evidence/redact-bun1.3.14.json +92 -0
  36. package/bench/evidence/redact-node24.11.json +92 -0
  37. package/bench/graph-metrics.ts +43 -0
  38. package/bench/harness.ts +73 -0
  39. package/bench/issue129-matrix.mjs +722 -0
  40. package/bench/redact-adversarial.ts +256 -0
  41. package/bench/repeat-cpu.mjs +281 -0
  42. package/bench/report.ts +1075 -0
  43. package/bench/skill-eval/harness.ts +30 -0
  44. package/bench/skill-eval/laws.ts +37 -0
  45. package/bench/skill-eval/mermaid/client.ts +132 -0
  46. package/bench/skill-eval/mermaid/validate.mjs +115 -0
  47. package/bench/skill-eval/pack.ts +61 -0
  48. package/bench/skill-eval/packs/diagrams/cases.ts +281 -0
  49. package/bench/skill-eval/packs/diagrams/index.ts +50 -0
  50. package/bench/skill-eval/packs/diagrams/score.ts +74 -0
  51. package/bench/skill-eval/packs/index.ts +5 -0
  52. package/bench/skill-eval/packs/weather/cases.ts +279 -0
  53. package/bench/skill-eval/packs/weather/fixtures/wttr.json +566 -0
  54. package/bench/skill-eval/packs/weather/fixtures.ts +84 -0
  55. package/bench/skill-eval/packs/weather/index.ts +55 -0
  56. package/bench/skill-eval/packs/weather/score.ts +92 -0
  57. package/bench/skill-eval/report.ts +194 -0
  58. package/bench/skill-eval/run.ts +316 -0
  59. package/bench/speed.ts +80 -0
  60. package/dist-lib/index.d.ts +101 -169
  61. package/dist-lib/index.js +423 -1506
  62. package/dist-lib/lib/addon-seal.bare.d.ts +1 -0
  63. package/dist-lib/lib/addon-seal.bare.js +3 -0
  64. package/dist-lib/lib/addon-seal.node.d.ts +1 -0
  65. package/dist-lib/lib/addon-seal.node.js +1 -0
  66. package/dist-lib/lib/agent/delegate.d.ts +83 -0
  67. package/dist-lib/lib/agent/delegate.js +261 -0
  68. package/dist-lib/lib/agent/follow.d.ts +32 -0
  69. package/dist-lib/lib/agent/follow.js +162 -0
  70. package/dist-lib/lib/agent/index.d.ts +37 -0
  71. package/dist-lib/lib/agent/index.js +42 -0
  72. package/dist-lib/lib/agent/plan.d.ts +6 -0
  73. package/dist-lib/lib/agent/plan.js +74 -0
  74. package/dist-lib/lib/agent/resolve.d.ts +3 -0
  75. package/dist-lib/lib/agent/resolve.js +78 -0
  76. package/dist-lib/lib/{capabilities → agent}/tool-names.d.ts +0 -1
  77. package/dist-lib/lib/{capabilities → agent}/tool-names.js +0 -1
  78. package/dist-lib/lib/{capabilities → agent}/tool-selection.d.ts +3 -6
  79. package/dist-lib/lib/{capabilities → agent}/tool-selection.js +9 -1
  80. package/dist-lib/lib/agent/tools.d.ts +14 -0
  81. package/dist-lib/lib/agent/tools.js +16 -0
  82. package/dist-lib/lib/agent/transfer.d.ts +7 -0
  83. package/dist-lib/lib/agent/transfer.js +26 -0
  84. package/dist-lib/lib/capabilities/agent-ports.d.ts +3 -0
  85. package/dist-lib/lib/capabilities/agent-ports.js +9 -0
  86. package/dist-lib/lib/capabilities/completion-engine/actors/answering.d.ts +1 -1
  87. package/dist-lib/lib/capabilities/completion-engine/actors/answering.js +25 -9
  88. package/dist-lib/lib/capabilities/completion-engine/actors/batching.d.ts +3 -0
  89. package/dist-lib/lib/capabilities/completion-engine/actors/batching.js +90 -0
  90. package/dist-lib/lib/capabilities/completion-engine/actors/direct-search.d.ts +2 -1
  91. package/dist-lib/lib/capabilities/completion-engine/actors/direct-search.js +14 -5
  92. package/dist-lib/lib/capabilities/completion-engine/actors/execute.d.ts +5 -3
  93. package/dist-lib/lib/capabilities/completion-engine/actors/execute.js +8 -3
  94. package/dist-lib/lib/capabilities/completion-engine/actors/executing.d.ts +29 -2
  95. package/dist-lib/lib/capabilities/completion-engine/actors/executing.js +100 -40
  96. package/dist-lib/lib/capabilities/completion-engine/actors/execution-plan.d.ts +11 -10
  97. package/dist-lib/lib/capabilities/completion-engine/actors/execution-plan.js +28 -21
  98. package/dist-lib/lib/capabilities/completion-engine/actors/finishing.js +2 -2
  99. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-prepare.d.ts +4 -0
  100. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-prepare.js +67 -0
  101. package/dist-lib/lib/capabilities/completion-engine/actors/inspecting.d.ts +10 -3
  102. package/dist-lib/lib/capabilities/completion-engine/actors/inspecting.js +14 -11
  103. package/dist-lib/lib/capabilities/completion-engine/actors/loading-skill.d.ts +7 -3
  104. package/dist-lib/lib/capabilities/completion-engine/actors/loading-skill.js +30 -31
  105. package/dist-lib/lib/capabilities/completion-engine/actors/preparing.d.ts +3 -2
  106. package/dist-lib/lib/capabilities/completion-engine/actors/preparing.js +86 -102
  107. package/dist-lib/lib/capabilities/completion-engine/actors/rejecting.d.ts +1 -1
  108. package/dist-lib/lib/capabilities/completion-engine/actors/rejecting.js +24 -7
  109. package/dist-lib/lib/capabilities/completion-engine/actors/rejection.d.ts +4 -2
  110. package/dist-lib/lib/capabilities/completion-engine/actors/rejection.js +8 -8
  111. package/dist-lib/lib/capabilities/completion-engine/actors/resolving.d.ts +1 -1
  112. package/dist-lib/lib/capabilities/completion-engine/actors/resolving.js +73 -15
  113. package/dist-lib/lib/capabilities/completion-engine/actors/retrieving.d.ts +10 -0
  114. package/dist-lib/lib/capabilities/completion-engine/actors/retrieving.js +56 -0
  115. package/dist-lib/lib/capabilities/completion-engine/actors/run-prepare.d.ts +4 -0
  116. package/dist-lib/lib/capabilities/completion-engine/actors/run-prepare.js +74 -0
  117. package/dist-lib/lib/capabilities/completion-engine/actors/skill-step.d.ts +2 -0
  118. package/dist-lib/lib/capabilities/completion-engine/actors/skill-step.js +76 -0
  119. package/dist-lib/lib/capabilities/completion-engine/actors/stream.d.ts +2 -2
  120. package/dist-lib/lib/capabilities/completion-engine/actors/stream.js +2 -1
  121. package/dist-lib/lib/capabilities/completion-engine/actors/streaming.d.ts +1 -1
  122. package/dist-lib/lib/capabilities/completion-engine/actors/streaming.js +84 -26
  123. package/dist-lib/lib/capabilities/completion-engine/actors/wrap-up.d.ts +1 -1
  124. package/dist-lib/lib/capabilities/completion-engine/actors/wrap-up.js +16 -6
  125. package/dist-lib/lib/capabilities/completion-engine/actors.d.ts +11 -0
  126. package/dist-lib/lib/capabilities/completion-engine/actors.js +216 -0
  127. package/dist-lib/lib/capabilities/completion-engine/driver.d.ts +12 -5
  128. package/dist-lib/lib/capabilities/completion-engine/driver.js +118 -33
  129. package/dist-lib/lib/capabilities/completion-engine/durable.d.ts +2 -1
  130. package/dist-lib/lib/capabilities/completion-engine/durable.js +6 -4
  131. package/dist-lib/lib/capabilities/completion-engine/engine.d.ts +65 -0
  132. package/dist-lib/lib/{machine → capabilities/completion-engine}/engine.js +67 -130
  133. package/dist-lib/lib/capabilities/completion-engine/index.d.ts +30 -0
  134. package/dist-lib/lib/capabilities/completion-engine/index.js +44 -0
  135. package/dist-lib/lib/capabilities/completion-engine/loop.d.ts +58 -0
  136. package/dist-lib/lib/capabilities/completion-engine/loop.js +62 -0
  137. package/dist-lib/lib/capabilities/completion-engine/metrics.d.ts +4 -0
  138. package/dist-lib/lib/capabilities/completion-engine/metrics.js +46 -0
  139. package/dist-lib/lib/capabilities/completion-engine/operations.d.ts +5 -2
  140. package/dist-lib/lib/capabilities/completion-engine/operations.js +84 -15
  141. package/dist-lib/lib/capabilities/completion-engine/ports.d.ts +25 -2
  142. package/dist-lib/lib/capabilities/completion-engine/ports.js +25 -16
  143. package/dist-lib/lib/capabilities/completion-engine/prepare-step.d.ts +26 -0
  144. package/dist-lib/lib/{machine → capabilities/completion-engine}/replay-output.d.ts +1 -1
  145. package/dist-lib/lib/{machine → capabilities/completion-engine}/replay-output.js +1 -1
  146. package/dist-lib/lib/capabilities/{completion-loop → completion-engine}/round.d.ts +24 -4
  147. package/dist-lib/lib/capabilities/{completion-loop → completion-engine}/round.js +242 -27
  148. package/dist-lib/lib/capabilities/completion-engine/session.d.ts +19 -12
  149. package/dist-lib/lib/capabilities/completion-engine/session.js +12 -6
  150. package/dist-lib/lib/capabilities/completion-engine/splice.d.ts +2 -0
  151. package/dist-lib/lib/capabilities/completion-engine/splice.js +7 -0
  152. package/dist-lib/lib/capabilities/completion-engine/stages.d.ts +23 -0
  153. package/dist-lib/lib/capabilities/completion-engine/tool-caller.d.ts +10 -0
  154. package/dist-lib/lib/capabilities/completion-engine/tool-caller.js +151 -0
  155. package/dist-lib/lib/capabilities/completion-engine/tool-execution.d.ts +77 -0
  156. package/dist-lib/lib/capabilities/{completion-loop → completion-engine}/tool-execution.js +74 -25
  157. package/dist-lib/lib/capabilities/{completion-loop → completion-engine}/turns.d.ts +8 -4
  158. package/dist-lib/lib/capabilities/completion-engine/turns.js +225 -0
  159. package/dist-lib/lib/capabilities/enhance.d.ts +1 -1
  160. package/dist-lib/lib/capabilities/enhance.js +3 -2
  161. package/dist-lib/lib/capabilities/invoke.d.ts +1 -1
  162. package/dist-lib/lib/capabilities/preview-model-source.d.ts +1 -10
  163. package/dist-lib/lib/capabilities/preview-model-source.js +3 -1
  164. package/dist-lib/lib/capabilities/sdk-tool.d.ts +10 -0
  165. package/dist-lib/lib/capabilities/sdk-tool.js +130 -0
  166. package/dist-lib/lib/capabilities/skill-entry.d.ts +8 -0
  167. package/dist-lib/lib/capabilities/skill-entry.js +14 -0
  168. package/dist-lib/lib/capabilities/tool-plan.d.ts +6 -5
  169. package/dist-lib/lib/capabilities/tool-plan.js +16 -10
  170. package/dist-lib/lib/capabilities/tool-turns.d.ts +29 -4
  171. package/dist-lib/lib/capabilities/tool-turns.js +120 -10
  172. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +1 -1
  173. package/dist-lib/lib/capabilities/usage-breakdown.js +4 -1
  174. package/dist-lib/lib/connect.d.ts +6 -0
  175. package/dist-lib/lib/connect.js +153 -65
  176. package/dist-lib/lib/context-window.d.ts +4 -2
  177. package/dist-lib/lib/context-window.js +27 -16
  178. package/dist-lib/lib/contract/agent.d.ts +65 -0
  179. package/dist-lib/lib/{capabilities/types.d.ts → contract/completion.d.ts} +140 -26
  180. package/dist-lib/lib/contract/exec.d.ts +134 -0
  181. package/dist-lib/lib/{hooks/types.d.ts → contract/hooks.d.ts} +62 -10
  182. package/dist-lib/lib/contract/index.d.ts +5 -0
  183. package/dist-lib/lib/contract/knowledge.d.ts +60 -0
  184. package/dist-lib/lib/contract/knowledge.js +1 -0
  185. package/dist-lib/lib/contract/models.d.ts +56 -0
  186. package/dist-lib/lib/contract/models.js +1 -0
  187. package/dist-lib/lib/contract/run.d.ts +142 -0
  188. package/dist-lib/lib/contract/run.js +1 -0
  189. package/dist-lib/lib/contract/sandbox.d.ts +29 -0
  190. package/dist-lib/lib/contract/sandbox.js +1 -0
  191. package/dist-lib/lib/contract/skill-readiness.d.ts +14 -0
  192. package/dist-lib/lib/contract/skill-readiness.js +1 -0
  193. package/dist-lib/lib/{capabilities/voice.d.ts → contract/speech.d.ts} +11 -16
  194. package/dist-lib/lib/contract/speech.js +1 -0
  195. package/dist-lib/lib/contract-types.d.ts +43 -16
  196. package/dist-lib/lib/docx/index.d.ts +0 -1
  197. package/dist-lib/lib/docx/index.js +15 -24
  198. package/dist-lib/lib/embeddings/index.d.ts +63 -0
  199. package/dist-lib/lib/embeddings/index.js +267 -0
  200. package/dist-lib/lib/fold/index.d.ts +50 -0
  201. package/dist-lib/lib/fold/index.js +123 -0
  202. package/dist-lib/lib/{tools/exec/adapters/python/guarded-fetch.d.ts → guarded-fetch.d.ts} +5 -12
  203. package/dist-lib/lib/{tools/exec/adapters/python/guarded-fetch.js → guarded-fetch.js} +12 -34
  204. package/dist-lib/lib/helpers/completion-params.d.ts +3 -0
  205. package/dist-lib/lib/helpers/completion-params.js +12 -0
  206. package/dist-lib/lib/helpers/copy.d.ts +1 -0
  207. package/dist-lib/lib/helpers/copy.js +5 -0
  208. package/dist-lib/lib/helpers/drain.d.ts +5 -0
  209. package/dist-lib/lib/helpers/drain.js +19 -0
  210. package/dist-lib/lib/{machine/errors.d.ts → helpers/engine-error.d.ts} +6 -9
  211. package/dist-lib/lib/{machine/errors.js → helpers/engine-error.js} +9 -25
  212. package/dist-lib/lib/helpers/failure-result.d.ts +21 -0
  213. package/dist-lib/lib/helpers/failure-result.js +39 -0
  214. package/dist-lib/lib/helpers/head-tail.d.ts +7 -0
  215. package/dist-lib/lib/helpers/head-tail.js +19 -0
  216. package/dist-lib/lib/helpers/image-settings.d.ts +2 -0
  217. package/dist-lib/lib/helpers/image-settings.js +19 -0
  218. package/dist-lib/lib/helpers/mcp-methods.d.ts +2 -0
  219. package/dist-lib/lib/helpers/mcp-methods.js +14 -0
  220. package/dist-lib/lib/helpers/race-abort.d.ts +1 -1
  221. package/dist-lib/lib/helpers/race-abort.js +1 -1
  222. package/dist-lib/lib/helpers/repeated-reply.d.ts +2 -0
  223. package/dist-lib/lib/helpers/repeated-reply.js +63 -0
  224. package/dist-lib/lib/helpers/run-outcome.d.ts +5 -4
  225. package/dist-lib/lib/helpers/run-outcome.js +11 -9
  226. package/dist-lib/lib/{machine → helpers}/stable-stringify.js +1 -1
  227. package/dist-lib/lib/helpers/tool-call-markup.d.ts +1 -0
  228. package/dist-lib/lib/helpers/tool-call-markup.js +9 -5
  229. package/dist-lib/lib/helpers/tool-label.d.ts +2 -2
  230. package/dist-lib/lib/helpers/tool-label.js +3 -3
  231. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +1 -1
  232. package/dist-lib/lib/hooks/built-in/arg-repair.js +109 -19
  233. package/dist-lib/lib/hooks/built-in/egress.d.ts +1 -1
  234. package/dist-lib/lib/hooks/built-in/egress.js +13 -21
  235. package/dist-lib/lib/hooks/built-in/sandbox.d.ts +1 -1
  236. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +1 -1
  237. package/dist-lib/lib/hooks/index.d.ts +48 -0
  238. package/dist-lib/lib/hooks/index.js +130 -0
  239. package/dist-lib/lib/hooks/run.d.ts +9 -6
  240. package/dist-lib/lib/hooks/run.js +113 -48
  241. package/dist-lib/lib/{completion-lifecycle.d.ts → lifecycle/completion-run.d.ts} +1 -1
  242. package/dist-lib/lib/{completion-lifecycle.js → lifecycle/completion-run.js} +1 -1
  243. package/dist-lib/lib/lifecycle/index.d.ts +83 -0
  244. package/dist-lib/lib/lifecycle/index.js +335 -0
  245. package/dist-lib/lib/{harness-lifecycle.js → lifecycle/machine.js} +2 -2
  246. package/dist-lib/lib/machine/completion/actions/completion.d.ts +11 -2
  247. package/dist-lib/lib/machine/completion/actions/completion.js +98 -14
  248. package/dist-lib/lib/machine/completion/actions/prepare.d.ts +9 -0
  249. package/dist-lib/lib/machine/completion/actions/prepare.js +30 -0
  250. package/dist-lib/lib/machine/completion/actions/tools.d.ts +10 -1
  251. package/dist-lib/lib/machine/completion/actions/tools.js +79 -7
  252. package/dist-lib/lib/machine/completion/context.d.ts +7 -2
  253. package/dist-lib/lib/machine/completion/context.js +29 -5
  254. package/dist-lib/lib/machine/completion/guards/retry.d.ts +1 -0
  255. package/dist-lib/lib/machine/completion/guards/retry.js +6 -3
  256. package/dist-lib/lib/machine/completion/implementations.d.ts +38 -12
  257. package/dist-lib/lib/machine/completion/implementations.js +81 -31
  258. package/dist-lib/lib/machine/completion/machine.d.ts +140 -63
  259. package/dist-lib/lib/machine/completion/machine.js +194 -58
  260. package/dist-lib/lib/machine/completion/ports.d.ts +7 -55
  261. package/dist-lib/lib/machine/completion/ports.js +1 -224
  262. package/dist-lib/lib/machine/completion/rules.d.ts +20 -19
  263. package/dist-lib/lib/machine/completion/rules.js +73 -52
  264. package/dist-lib/lib/machine/completion/types.d.ts +110 -187
  265. package/dist-lib/lib/machine/completion/version.d.ts +1 -0
  266. package/dist-lib/lib/machine/completion/version.js +1 -0
  267. package/dist-lib/lib/machine/definition.d.ts +23 -0
  268. package/dist-lib/lib/machine/definition.js +76 -0
  269. package/dist-lib/lib/machine/index.d.ts +463 -20
  270. package/dist-lib/lib/machine/index.js +15 -11
  271. package/dist-lib/lib/models/llm-presets.d.ts +1 -0
  272. package/dist-lib/lib/models/model-catalog-constants.d.ts +3 -1
  273. package/dist-lib/lib/models/model-catalog-constants.js +9 -1
  274. package/dist-lib/lib/models/model-catalog.d.ts +31 -4
  275. package/dist-lib/lib/models/model-catalog.js +89 -8
  276. package/dist-lib/lib/models/model-fit.d.ts +55 -0
  277. package/dist-lib/lib/models/model-fit.js +102 -0
  278. package/dist-lib/lib/models/model-handle.d.ts +4 -0
  279. package/dist-lib/lib/models/model-handle.js +8 -1
  280. package/dist-lib/lib/models/model-list.d.ts +4 -0
  281. package/dist-lib/lib/models/model-pool.d.ts +35 -10
  282. package/dist-lib/lib/models/model-pool.js +63 -14
  283. package/dist-lib/lib/models/music-catalog.d.ts +1 -1
  284. package/dist-lib/lib/models/music-catalog.js +8 -1
  285. package/dist-lib/lib/models/sdk-faults.d.ts +2 -0
  286. package/dist-lib/lib/models/sdk-faults.js +18 -0
  287. package/dist-lib/lib/models/tts-model-default.js +3 -3
  288. package/dist-lib/lib/office/engine/codes.d.ts +62 -0
  289. package/dist-lib/lib/office/engine/codes.js +61 -0
  290. package/dist-lib/lib/office/engine/docx/document.d.ts +216 -0
  291. package/dist-lib/lib/office/engine/docx/document.js +1152 -0
  292. package/dist-lib/lib/office/engine/docx/index.d.ts +7 -0
  293. package/dist-lib/lib/office/engine/docx/index.js +8 -0
  294. package/dist-lib/lib/office/engine/docx/styles.d.ts +31 -0
  295. package/dist-lib/lib/office/engine/docx/styles.js +173 -0
  296. package/dist-lib/lib/office/engine/docx/template.d.ts +18 -0
  297. package/dist-lib/lib/office/engine/docx/template.js +133 -0
  298. package/dist-lib/lib/office/engine/docx/text.d.ts +55 -0
  299. package/dist-lib/lib/office/engine/docx/text.js +538 -0
  300. package/dist-lib/lib/office/engine/drawingml/chart.d.ts +63 -0
  301. package/dist-lib/lib/office/engine/drawingml/chart.js +539 -0
  302. package/dist-lib/lib/office/engine/drawingml/text.d.ts +35 -0
  303. package/dist-lib/lib/office/engine/drawingml/text.js +352 -0
  304. package/dist-lib/lib/office/engine/errors.d.ts +6 -0
  305. package/dist-lib/lib/office/engine/errors.js +12 -0
  306. package/dist-lib/lib/office/engine/image.d.ts +8 -0
  307. package/dist-lib/lib/office/engine/image.js +48 -0
  308. package/dist-lib/lib/office/engine/index.d.ts +12 -0
  309. package/dist-lib/lib/office/engine/index.js +7 -0
  310. package/dist-lib/lib/office/engine/opc/content-types.d.ts +17 -0
  311. package/dist-lib/lib/office/engine/opc/content-types.js +74 -0
  312. package/dist-lib/lib/office/engine/opc/media.d.ts +13 -0
  313. package/dist-lib/lib/office/engine/opc/media.js +11 -0
  314. package/dist-lib/lib/office/engine/opc/package.d.ts +51 -0
  315. package/dist-lib/lib/office/engine/opc/package.js +324 -0
  316. package/dist-lib/lib/office/engine/opc/paths.d.ts +7 -0
  317. package/dist-lib/lib/office/engine/opc/paths.js +46 -0
  318. package/dist-lib/lib/office/engine/opc/properties.d.ts +7 -0
  319. package/dist-lib/lib/office/engine/opc/properties.js +75 -0
  320. package/dist-lib/lib/office/engine/opc/relationships.d.ts +23 -0
  321. package/dist-lib/lib/office/engine/opc/relationships.js +65 -0
  322. package/dist-lib/lib/office/engine/opc/zip.d.ts +15 -0
  323. package/dist-lib/lib/office/engine/opc/zip.js +264 -0
  324. package/dist-lib/lib/office/engine/pptx/fit.d.ts +12 -0
  325. package/dist-lib/lib/office/engine/pptx/fit.js +37 -0
  326. package/dist-lib/lib/office/engine/pptx/index.d.ts +8 -0
  327. package/dist-lib/lib/office/engine/pptx/index.js +8 -0
  328. package/dist-lib/lib/office/engine/pptx/inherit.d.ts +29 -0
  329. package/dist-lib/lib/office/engine/pptx/inherit.js +155 -0
  330. package/dist-lib/lib/office/engine/pptx/notes.d.ts +5 -0
  331. package/dist-lib/lib/office/engine/pptx/notes.js +85 -0
  332. package/dist-lib/lib/office/engine/pptx/presentation.d.ts +54 -0
  333. package/dist-lib/lib/office/engine/pptx/presentation.js +749 -0
  334. package/dist-lib/lib/office/engine/pptx/read.d.ts +9 -0
  335. package/dist-lib/lib/office/engine/pptx/read.js +66 -0
  336. package/dist-lib/lib/office/engine/pptx/shapes.d.ts +52 -0
  337. package/dist-lib/lib/office/engine/pptx/shapes.js +276 -0
  338. package/dist-lib/lib/office/engine/pptx/slides.d.ts +27 -0
  339. package/dist-lib/lib/office/engine/pptx/slides.js +123 -0
  340. package/dist-lib/lib/office/engine/pptx/template.d.ts +20 -0
  341. package/dist-lib/lib/office/engine/pptx/template.js +391 -0
  342. package/dist-lib/lib/office/engine/pptx/types.d.ts +120 -0
  343. package/dist-lib/lib/office/engine/pptx/types.js +1 -0
  344. package/dist-lib/lib/office/engine/units.d.ts +3 -0
  345. package/dist-lib/lib/office/engine/units.js +12 -0
  346. package/dist-lib/lib/office/engine/utf8.d.ts +2 -0
  347. package/dist-lib/lib/office/engine/utf8.js +103 -0
  348. package/dist-lib/lib/office/engine/xlsx/formula.d.ts +49 -0
  349. package/dist-lib/lib/office/engine/xlsx/formula.js +381 -0
  350. package/dist-lib/lib/office/engine/xlsx/index.d.ts +8 -0
  351. package/dist-lib/lib/office/engine/xlsx/index.js +8 -0
  352. package/dist-lib/lib/office/engine/xlsx/refs.d.ts +22 -0
  353. package/dist-lib/lib/office/engine/xlsx/refs.js +82 -0
  354. package/dist-lib/lib/office/engine/xlsx/reshape.d.ts +21 -0
  355. package/dist-lib/lib/office/engine/xlsx/reshape.js +424 -0
  356. package/dist-lib/lib/office/engine/xlsx/sheet.d.ts +108 -0
  357. package/dist-lib/lib/office/engine/xlsx/sheet.js +662 -0
  358. package/dist-lib/lib/office/engine/xlsx/strings.d.ts +15 -0
  359. package/dist-lib/lib/office/engine/xlsx/strings.js +93 -0
  360. package/dist-lib/lib/office/engine/xlsx/styles.d.ts +38 -0
  361. package/dist-lib/lib/office/engine/xlsx/styles.js +369 -0
  362. package/dist-lib/lib/office/engine/xlsx/template.d.ts +7 -0
  363. package/dist-lib/lib/office/engine/xlsx/template.js +54 -0
  364. package/dist-lib/lib/office/engine/xlsx/workbook.d.ts +161 -0
  365. package/dist-lib/lib/office/engine/xlsx/workbook.js +850 -0
  366. package/dist-lib/lib/office/engine/xlsx/write.d.ts +2 -0
  367. package/dist-lib/lib/office/engine/xlsx/write.js +42 -0
  368. package/dist-lib/lib/office/engine/xml.d.ts +45 -0
  369. package/dist-lib/lib/office/engine/xml.js +258 -0
  370. package/dist-lib/lib/office/extract.d.ts +9 -0
  371. package/dist-lib/lib/office/extract.js +19 -0
  372. package/dist-lib/lib/office/index.d.ts +1 -1
  373. package/dist-lib/lib/office/index.js +74 -19
  374. package/dist-lib/lib/plugins/addons.d.ts +2 -0
  375. package/dist-lib/lib/plugins/addons.js +12 -0
  376. package/dist-lib/lib/plugins/context.d.ts +16 -0
  377. package/dist-lib/lib/plugins/context.js +48 -0
  378. package/dist-lib/lib/plugins/index.d.ts +3 -0
  379. package/dist-lib/lib/plugins/index.js +1 -0
  380. package/dist-lib/lib/plugins/registry.d.ts +116 -0
  381. package/dist-lib/lib/plugins/registry.js +505 -0
  382. package/dist-lib/lib/plugins/runtime.d.ts +27 -0
  383. package/dist-lib/lib/plugins/runtime.js +143 -0
  384. package/dist-lib/lib/plugins/scope.d.ts +17 -0
  385. package/dist-lib/lib/plugins/scope.js +55 -0
  386. package/dist-lib/lib/prompt.d.ts +2 -5
  387. package/dist-lib/lib/prompt.js +9 -0
  388. package/dist-lib/lib/residency/completion-runtime.d.ts +52 -0
  389. package/dist-lib/lib/{capabilities → residency}/completion-runtime.js +22 -15
  390. package/dist-lib/lib/residency/index.d.ts +148 -0
  391. package/dist-lib/lib/residency/index.js +539 -0
  392. package/dist-lib/lib/run-log/boundary.d.ts +17 -0
  393. package/dist-lib/lib/run-log/boundary.js +58 -0
  394. package/dist-lib/lib/run-log/history-codec.d.ts +7 -6
  395. package/dist-lib/lib/run-log/history-codec.js +175 -46
  396. package/dist-lib/lib/run-log/index.d.ts +46 -0
  397. package/dist-lib/lib/run-log/index.js +40 -0
  398. package/dist-lib/lib/run-log/inspect.d.ts +53 -0
  399. package/dist-lib/lib/{run-log-inspect.js → run-log/inspect.js} +196 -139
  400. package/dist-lib/lib/run-log/live.d.ts +37 -0
  401. package/dist-lib/lib/run-log/live.js +195 -0
  402. package/dist-lib/lib/run-log/persisted-actor.d.ts +1 -6
  403. package/dist-lib/lib/run-log/persisted-actor.js +4 -3
  404. package/dist-lib/lib/run-log/protocol-types.d.ts +37 -14
  405. package/dist-lib/lib/run-log/protocol.d.ts +1 -2
  406. package/dist-lib/lib/run-log/protocol.js +45 -40
  407. package/dist-lib/lib/{run-log-redact.d.ts → run-log/redact.d.ts} +3 -2
  408. package/dist-lib/lib/{run-log-redact.js → run-log/redact.js} +101 -16
  409. package/dist-lib/lib/run-log/replay.d.ts +3 -2
  410. package/dist-lib/lib/run-log/replay.js +7 -6
  411. package/dist-lib/lib/run-log/request-codec.d.ts +17 -0
  412. package/dist-lib/lib/run-log/request-codec.js +87 -0
  413. package/dist-lib/lib/run-log/run-journal.d.ts +14 -8
  414. package/dist-lib/lib/run-log/run-journal.js +100 -75
  415. package/dist-lib/lib/sdk-loader.d.ts +2 -7
  416. package/dist-lib/lib/sdk-loader.js +8 -15
  417. package/dist-lib/lib/sdk-storage.js +3 -1
  418. package/dist-lib/lib/serve.js +139 -38
  419. package/dist-lib/lib/skills-host/index.d.ts +59 -0
  420. package/dist-lib/lib/skills-host/index.js +268 -0
  421. package/dist-lib/lib/spawn.d.ts +37 -3
  422. package/dist-lib/lib/spawn.js +7 -3
  423. package/dist-lib/lib/spill.d.ts +11 -0
  424. package/dist-lib/lib/spill.js +82 -0
  425. package/dist-lib/lib/tools/{exec/adapters/python → attachments}/output-policy.d.ts +2 -3
  426. package/dist-lib/lib/tools/{exec/adapters/python/attachments.d.ts → attachments/staging.d.ts} +2 -2
  427. package/dist-lib/lib/tools/{exec/adapters/python/attachments.js → attachments/staging.js} +3 -3
  428. package/dist-lib/lib/tools/catalog.d.ts +1 -1
  429. package/dist-lib/lib/tools/catalog.js +1 -1
  430. package/dist-lib/lib/tools/create-documents.d.ts +1 -1
  431. package/dist-lib/lib/tools/edit-documents.d.ts +1 -1
  432. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +5 -7
  433. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +3 -2
  434. package/dist-lib/lib/tools/exec/bare-runtime.js +2 -4
  435. package/dist-lib/lib/tools/exec/python-source.d.ts +6 -0
  436. package/dist-lib/lib/tools/exec/python-source.js +243 -0
  437. package/dist-lib/lib/tools/exec/runner.d.ts +24 -45
  438. package/dist-lib/lib/tools/exec/runner.js +68 -34
  439. package/dist-lib/lib/tools/exec/scope.d.ts +2 -0
  440. package/dist-lib/lib/tools/exec/scope.js +33 -2
  441. package/dist-lib/lib/tools/exec/shell-guidance.d.ts +11 -9
  442. package/dist-lib/lib/tools/exec/shell-guidance.js +28 -57
  443. package/dist-lib/lib/tools/exec/video-tools.d.ts +0 -1
  444. package/dist-lib/lib/tools/exec/video-tools.js +0 -5
  445. package/dist-lib/lib/tools/exec.d.ts +7 -14
  446. package/dist-lib/lib/tools/exec.js +181 -457
  447. package/dist-lib/lib/tools/file-glob.d.ts +1 -1
  448. package/dist-lib/lib/tools/file-glob.js +1 -0
  449. package/dist-lib/lib/tools/fs/scope.d.ts +1 -0
  450. package/dist-lib/lib/tools/fs/scope.js +8 -3
  451. package/dist-lib/lib/tools/grep.d.ts +1 -1
  452. package/dist-lib/lib/tools/grep.js +1 -0
  453. package/dist-lib/lib/tools/http-request.d.ts +1 -1
  454. package/dist-lib/lib/tools/http-request.js +1 -0
  455. package/dist-lib/lib/tools/index.d.ts +21 -0
  456. package/dist-lib/lib/tools/index.js +46 -0
  457. package/dist-lib/lib/tools/office/ops.d.ts +13 -0
  458. package/dist-lib/lib/tools/office/ops.js +100 -0
  459. package/dist-lib/lib/tools/office.d.ts +12 -0
  460. package/dist-lib/lib/tools/office.js +486 -0
  461. package/dist-lib/lib/tools/operations/compile.d.ts +3 -3
  462. package/dist-lib/lib/tools/operations/compile.js +2 -1
  463. package/dist-lib/lib/tools/operations/decoders.js +1 -1
  464. package/dist-lib/lib/tools/operations/manifest.d.ts +1 -1
  465. package/dist-lib/lib/tools/outbound-guard.d.ts +3 -1
  466. package/dist-lib/lib/tools/outbound-guard.js +4 -0
  467. package/dist-lib/lib/tools/pdf/build.d.ts +43 -0
  468. package/dist-lib/lib/tools/pdf/build.js +150 -0
  469. package/dist-lib/lib/tools/pdf/images.d.ts +7 -0
  470. package/dist-lib/lib/tools/pdf/images.js +82 -0
  471. package/dist-lib/lib/tools/pdf/request.d.ts +63 -0
  472. package/dist-lib/lib/tools/pdf/request.js +335 -0
  473. package/dist-lib/lib/tools/pdf.d.ts +6 -0
  474. package/dist-lib/lib/tools/pdf.js +303 -0
  475. package/dist-lib/lib/tools/read-files.d.ts +1 -1
  476. package/dist-lib/lib/tools/read-files.js +5 -1
  477. package/dist-lib/lib/tools/skill.d.ts +2 -4
  478. package/dist-lib/lib/tools/skill.js +20 -22
  479. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +1 -1
  480. package/dist-lib/lib/tools/skills/catalog.d.ts +9 -2
  481. package/dist-lib/lib/tools/skills/catalog.js +7 -7
  482. package/dist-lib/lib/tools/skills/cli-schema.js +1 -1
  483. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +1 -0
  484. package/dist-lib/lib/tools/skills/frontmatter-parser.js +1 -0
  485. package/dist-lib/lib/tools/skills/mention.d.ts +1 -2
  486. package/dist-lib/lib/tools/skills/mention.js +0 -3
  487. package/dist-lib/lib/tools/skills/scope-key.d.ts +2 -1
  488. package/dist-lib/lib/tools/skills/scope-key.js +2 -3
  489. package/dist-lib/lib/tools/skills/skill-state.d.ts +2 -2
  490. package/dist-lib/lib/tools/skills/skill-state.js +11 -28
  491. package/dist-lib/lib/tools/toolsets.d.ts +3 -7
  492. package/dist-lib/lib/tools/toolsets.js +5 -9
  493. package/dist-lib/lib/tools/web-fetch.d.ts +1 -1
  494. package/dist-lib/lib/tools/web-fetch.js +42 -6
  495. package/dist-lib/lib/web-fetch/embedded-state.js +1 -1
  496. package/dist-lib/lib/web-fetch/extract.js +1 -1
  497. package/dist-lib/lib/web-fetch/images.js +1 -1
  498. package/dist-lib/lib/web-fetch/video.js +1 -1
  499. package/dist-lib/lib/wire.d.ts +8 -0
  500. package/dist-lib/lib/wire.js +112 -2
  501. package/dist-lib/plugins/code-mode/index.d.ts +16 -0
  502. package/dist-lib/plugins/code-mode/index.js +43 -0
  503. package/dist-lib/plugins/coding/index.d.ts +15 -0
  504. package/dist-lib/plugins/coding/index.js +42 -0
  505. package/dist-lib/plugins/coding/jobs.d.ts +24 -0
  506. package/dist-lib/plugins/coding/jobs.js +144 -0
  507. package/dist-lib/plugins/coding/session.d.ts +51 -0
  508. package/dist-lib/plugins/coding/session.js +263 -0
  509. package/dist-lib/plugins/coding/write-file.d.ts +3 -0
  510. package/dist-lib/plugins/coding/write-file.js +52 -0
  511. package/dist-lib/plugins/command-hooks/index.d.ts +88 -0
  512. package/dist-lib/plugins/command-hooks/index.js +338 -0
  513. package/dist-lib/plugins/external-agents/acp.d.ts +27 -0
  514. package/dist-lib/plugins/external-agents/acp.js +264 -0
  515. package/dist-lib/plugins/external-agents/cli.d.ts +3 -0
  516. package/dist-lib/plugins/external-agents/cli.js +199 -0
  517. package/dist-lib/plugins/external-agents/index.d.ts +25 -0
  518. package/dist-lib/plugins/external-agents/index.js +54 -0
  519. package/dist-lib/plugins/external-agents/process.d.ts +19 -0
  520. package/dist-lib/plugins/external-agents/process.js +92 -0
  521. package/dist-lib/plugins/external-agents/targets.d.ts +32 -0
  522. package/dist-lib/plugins/external-agents/targets.js +66 -0
  523. package/dist-lib/{lib/tools → plugins/image}/edit-image.d.ts +3 -2
  524. package/dist-lib/{lib/tools → plugins/image}/edit-image.js +7 -2
  525. package/dist-lib/{lib/tools → plugins/image}/generate-image.d.ts +6 -12
  526. package/dist-lib/{lib/tools → plugins/image}/generate-image.js +6 -7
  527. package/dist-lib/plugins/image/index.d.ts +25 -0
  528. package/dist-lib/plugins/image/index.js +76 -0
  529. package/dist-lib/plugins/knowledge/index.d.ts +21 -0
  530. package/dist-lib/plugins/knowledge/index.js +47 -0
  531. package/dist-lib/plugins/knowledge/search-tool.d.ts +4 -0
  532. package/dist-lib/plugins/knowledge/search-tool.js +38 -0
  533. package/dist-lib/plugins/knowledge/store.d.ts +42 -0
  534. package/dist-lib/plugins/knowledge/store.js +332 -0
  535. package/dist-lib/plugins/lsp/index.d.ts +32 -0
  536. package/dist-lib/plugins/lsp/index.js +77 -0
  537. package/dist-lib/plugins/lsp/pool.d.ts +24 -0
  538. package/dist-lib/plugins/lsp/pool.js +73 -0
  539. package/dist-lib/plugins/lsp/rpc.d.ts +37 -0
  540. package/dist-lib/plugins/lsp/rpc.js +145 -0
  541. package/dist-lib/plugins/lsp/server.d.ts +55 -0
  542. package/dist-lib/plugins/lsp/server.js +192 -0
  543. package/dist-lib/plugins/lsp/tool.d.ts +12 -0
  544. package/dist-lib/plugins/lsp/tool.js +366 -0
  545. package/dist-lib/plugins/mcp/call.d.ts +17 -0
  546. package/dist-lib/{lib/tools/mcp-call.js → plugins/mcp/call.js} +92 -84
  547. package/dist-lib/plugins/mcp/index.d.ts +21 -0
  548. package/dist-lib/plugins/mcp/index.js +85 -0
  549. package/dist-lib/{lib/tools → plugins}/mcp/protocol.d.ts +9 -16
  550. package/dist-lib/{lib/tools → plugins}/mcp/protocol.js +3 -16
  551. package/dist-lib/plugins/mcp/server.d.ts +23 -0
  552. package/dist-lib/plugins/mcp/server.js +108 -0
  553. package/dist-lib/{lib/tools → plugins/music}/generate-music.d.ts +6 -15
  554. package/dist-lib/{lib/tools → plugins/music}/generate-music.js +7 -8
  555. package/dist-lib/plugins/music/index.d.ts +24 -0
  556. package/dist-lib/plugins/music/index.js +48 -0
  557. package/dist-lib/{lib/tools/exec → plugins}/obsidian/cli-process.d.ts +2 -2
  558. package/dist-lib/{lib/tools/exec → plugins}/obsidian/cli-process.js +2 -2
  559. package/dist-lib/{lib/tools/exec → plugins}/obsidian/cli.d.ts +1 -1
  560. package/dist-lib/{lib/tools/exec → plugins}/obsidian/cli.js +7 -7
  561. package/dist-lib/{lib/tools/exec → plugins}/obsidian/command.js +1 -1
  562. package/dist-lib/{lib/tools/exec → plugins}/obsidian/guidance.d.ts +0 -1
  563. package/dist-lib/{lib/tools/exec → plugins}/obsidian/guidance.js +0 -7
  564. package/dist-lib/plugins/obsidian/index.d.ts +26 -0
  565. package/dist-lib/plugins/obsidian/index.js +138 -0
  566. package/dist-lib/{lib/tools/skills/obsidian-readiness.d.ts → plugins/obsidian/readiness.d.ts} +1 -0
  567. package/dist-lib/{lib/tools/skills/obsidian-readiness.js → plugins/obsidian/readiness.js} +7 -0
  568. package/dist-lib/plugins/python/guarded-fetch.d.ts +13 -0
  569. package/dist-lib/plugins/python/guarded-fetch.js +32 -0
  570. package/dist-lib/plugins/python/index.d.ts +18 -0
  571. package/dist-lib/plugins/python/index.js +19 -0
  572. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/interrupt-timer.js +2 -2
  573. package/dist-lib/plugins/python/language.d.ts +8 -0
  574. package/dist-lib/plugins/python/language.js +377 -0
  575. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/loader.d.ts +1 -0
  576. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/loader.js +8 -1
  577. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/memfs.js +3 -3
  578. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/module-distributions.js +0 -3
  579. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/pyodide.js +4 -4
  580. package/dist-lib/plugins/python/python-adapter.d.ts +41 -0
  581. package/dist-lib/plugins/python/python-adapter.js +515 -0
  582. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/run-session.d.ts +1 -2
  583. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/run-session.js +10 -99
  584. package/dist-lib/plugins/python/shell-redirect.d.ts +8 -0
  585. package/dist-lib/plugins/python/shell-redirect.js +25 -0
  586. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/wheels.js +4 -3
  587. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/active.js +1 -1
  588. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/client.d.ts +1 -0
  589. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/client.js +6 -3
  590. package/dist-lib/plugins/python/worker/entry.d.ts +1 -0
  591. package/dist-lib/plugins/python/worker/entry.js +9 -0
  592. package/dist-lib/plugins/python/worker/interrupt-deadline.d.ts +1 -0
  593. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/interrupt-deadline.js +1 -1
  594. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/serve.js +2 -2
  595. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/spawn.d.ts +1 -0
  596. package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/spawn.js +7 -0
  597. package/dist-lib/plugins/quickjs/index.d.ts +20 -0
  598. package/dist-lib/plugins/quickjs/index.js +25 -0
  599. package/dist-lib/plugins/quickjs/language.d.ts +3 -0
  600. package/dist-lib/plugins/quickjs/language.js +59 -0
  601. package/dist-lib/plugins/quickjs/runtime.d.ts +38 -0
  602. package/dist-lib/plugins/quickjs/runtime.js +421 -0
  603. package/dist-lib/plugins/quickjs/text-decoder.d.ts +1 -0
  604. package/dist-lib/plugins/quickjs/text-decoder.js +15 -0
  605. package/dist-lib/plugins/run-report/brand.d.ts +1 -0
  606. package/dist-lib/plugins/run-report/brand.js +1 -0
  607. package/dist-lib/plugins/run-report/flow-view.d.ts +6 -0
  608. package/dist-lib/plugins/run-report/flow-view.js +53 -0
  609. package/dist-lib/plugins/run-report/flow.d.ts +33 -0
  610. package/dist-lib/plugins/run-report/flow.js +201 -0
  611. package/dist-lib/plugins/run-report/index.d.ts +17 -0
  612. package/dist-lib/plugins/run-report/index.js +27 -0
  613. package/dist-lib/plugins/run-report/layout.d.ts +39 -0
  614. package/dist-lib/plugins/run-report/layout.js +175 -0
  615. package/dist-lib/plugins/run-report/meaning.d.ts +6 -0
  616. package/dist-lib/plugins/run-report/meaning.js +43 -0
  617. package/dist-lib/plugins/run-report/model.d.ts +86 -0
  618. package/dist-lib/plugins/run-report/model.js +387 -0
  619. package/dist-lib/plugins/run-report/page.d.ts +13 -0
  620. package/dist-lib/plugins/run-report/page.js +234 -0
  621. package/dist-lib/plugins/run-report/script.d.ts +1 -0
  622. package/dist-lib/plugins/run-report/script.js +661 -0
  623. package/dist-lib/plugins/run-report/story.d.ts +48 -0
  624. package/dist-lib/plugins/run-report/story.js +188 -0
  625. package/dist-lib/plugins/run-report/style.d.ts +1 -0
  626. package/dist-lib/plugins/run-report/style.js +410 -0
  627. package/dist-lib/plugins/run-report/why.d.ts +28 -0
  628. package/dist-lib/plugins/run-report/why.js +170 -0
  629. package/dist-lib/plugins/sandbox-macos/index.d.ts +48 -0
  630. package/dist-lib/plugins/sandbox-macos/index.js +175 -0
  631. package/dist-lib/plugins/sandbox-vm/index.d.ts +24 -0
  632. package/dist-lib/plugins/sandbox-vm/index.js +27 -0
  633. package/dist-lib/plugins/sandbox-vm/vm-shell.d.ts +46 -0
  634. package/dist-lib/plugins/sandbox-vm/vm-shell.js +106 -0
  635. package/dist-lib/{lib → plugins/speech}/audio-transcode-bare.js +2 -2
  636. package/dist-lib/plugins/speech/index.d.ts +17 -0
  637. package/dist-lib/plugins/speech/index.js +24 -0
  638. package/dist-lib/plugins/speech/speech-engine.d.ts +23 -0
  639. package/dist-lib/plugins/speech/speech-engine.js +55 -0
  640. package/dist-lib/plugins/speech/speech-runtime.d.ts +22 -0
  641. package/dist-lib/plugins/speech/speech-runtime.js +212 -0
  642. package/dist-lib/{lib/capabilities → plugins/speech}/speech-text.d.ts +1 -0
  643. package/dist-lib/{lib/capabilities → plugins/speech}/speech-text.js +10 -3
  644. package/dist-lib/plugins/speech/voice-lane.d.ts +2 -0
  645. package/dist-lib/plugins/speech/voice-lane.js +9 -0
  646. package/dist-lib/plugins/speech/voice.d.ts +17 -0
  647. package/dist-lib/{lib/capabilities → plugins/speech}/voice.js +27 -25
  648. package/dist-lib/plugins/translation/index.d.ts +22 -0
  649. package/dist-lib/plugins/translation/index.js +63 -0
  650. package/dist-lib/{lib/models → plugins/translation}/nmt-catalog.d.ts +0 -1
  651. package/dist-lib/{lib/models → plugins/translation}/nmt-catalog.js +0 -3
  652. package/dist-lib/{lib/tools → plugins/translation}/translate.d.ts +14 -6
  653. package/dist-lib/{lib/tools → plugins/translation}/translate.js +14 -8
  654. package/dist-lib/plugins/walkie-talkie/crew.d.ts +27 -0
  655. package/dist-lib/plugins/walkie-talkie/crew.js +103 -0
  656. package/dist-lib/plugins/walkie-talkie/index.d.ts +127 -0
  657. package/dist-lib/plugins/walkie-talkie/index.js +340 -0
  658. package/dist-lib/plugins/walkie-talkie/wire.d.ts +67 -0
  659. package/dist-lib/plugins/walkie-talkie/wire.js +136 -0
  660. package/dist-lib/plugins/weather/geocode.d.ts +25 -0
  661. package/dist-lib/plugins/weather/geocode.js +101 -0
  662. package/dist-lib/plugins/weather/index.d.ts +15 -0
  663. package/dist-lib/plugins/weather/index.js +17 -0
  664. package/dist-lib/plugins/weather/lookup.d.ts +6 -0
  665. package/dist-lib/plugins/weather/lookup.js +169 -0
  666. package/dist-lib/{lib/tools/weather-lookup → plugins/weather}/place.js +5 -1
  667. package/dist-lib/plugins/web-search/engine-registry.d.ts +44 -0
  668. package/dist-lib/plugins/web-search/engine-registry.js +17 -0
  669. package/dist-lib/{lib → plugins}/web-search/engines/aol.d.ts +1 -0
  670. package/dist-lib/{lib → plugins}/web-search/engines/aol.js +5 -3
  671. package/dist-lib/{lib → plugins}/web-search/engines/bing.d.ts +1 -0
  672. package/dist-lib/{lib → plugins}/web-search/engines/bing.js +9 -4
  673. package/dist-lib/{lib → plugins}/web-search/engines/brave.d.ts +1 -0
  674. package/dist-lib/{lib → plugins}/web-search/engines/brave.js +5 -3
  675. package/dist-lib/{lib → plugins}/web-search/engines/duckduckgo.d.ts +1 -0
  676. package/dist-lib/{lib → plugins}/web-search/engines/duckduckgo.js +5 -2
  677. package/dist-lib/{lib → plugins}/web-search/engines/google.d.ts +1 -0
  678. package/dist-lib/{lib → plugins}/web-search/engines/google.js +6 -4
  679. package/dist-lib/{lib → plugins}/web-search/engines/wikipedia.d.ts +1 -0
  680. package/dist-lib/{lib → plugins}/web-search/engines/wikipedia.js +5 -3
  681. package/dist-lib/{lib → plugins}/web-search/engines/yahoo.d.ts +1 -0
  682. package/dist-lib/{lib → plugins}/web-search/engines/yahoo.js +5 -3
  683. package/dist-lib/{lib → plugins}/web-search/fetch-html.js +1 -1
  684. package/dist-lib/plugins/web-search/index.d.ts +18 -0
  685. package/dist-lib/plugins/web-search/index.js +33 -0
  686. package/dist-lib/{lib → plugins}/web-search/orchestrator.d.ts +3 -1
  687. package/dist-lib/{lib → plugins}/web-search/orchestrator.js +5 -5
  688. package/dist-lib/plugins/web-search/tool.d.ts +3 -0
  689. package/dist-lib/{lib/tools/web-search.js → plugins/web-search/tool.js} +18 -14
  690. package/dist-lib/plugins/web-search/types.js +1 -0
  691. package/dist-lib/schema/generate.js +5 -2
  692. package/dist-lib/schema/harness.js +158 -7
  693. package/dist-lib/spec/bind.js +20 -4
  694. package/dist-lib/spec/calls.js +4 -0
  695. package/dist-lib/spec/hrpc/hrpc.json +52 -0
  696. package/dist-lib/spec/hrpc/index.js +51 -3
  697. package/dist-lib/spec/hrpc/messages.js +595 -17
  698. package/dist-lib/spec/hyperschema/index.js +595 -17
  699. package/dist-lib/spec/hyperschema/schema.json +464 -1
  700. package/dist-lib/spec/hyperschema/types.d.ts +113 -2
  701. package/package.json +255 -487
  702. package/patches/{@qvac%2Finference@0.20.0.patch → @qvac%2Finference@0.21.0.patch} +8 -8
  703. package/scripts/addon-externals.cjs +386 -0
  704. package/scripts/addon-externals.d.ts +30 -0
  705. package/wheels/manifest.json +1 -160
  706. package/worker/harness-sidecar.mjs +80 -59
  707. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-preload.d.ts +0 -3
  708. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-preload.js +0 -75
  709. package/dist-lib/lib/capabilities/completion-engine/actors/preload-failure.d.ts +0 -9
  710. package/dist-lib/lib/capabilities/completion-engine/actors/preload-failure.js +0 -11
  711. package/dist-lib/lib/capabilities/completion-engine/actors/preloading.d.ts +0 -3
  712. package/dist-lib/lib/capabilities/completion-engine/actors/preloading.js +0 -114
  713. package/dist-lib/lib/capabilities/completion-loop/index.d.ts +0 -80
  714. package/dist-lib/lib/capabilities/completion-loop/index.js +0 -158
  715. package/dist-lib/lib/capabilities/completion-loop/metrics.d.ts +0 -5
  716. package/dist-lib/lib/capabilities/completion-loop/metrics.js +0 -29
  717. package/dist-lib/lib/capabilities/completion-loop/tool-execution.d.ts +0 -60
  718. package/dist-lib/lib/capabilities/completion-loop/turns.js +0 -112
  719. package/dist-lib/lib/capabilities/completion-runtime.d.ts +0 -46
  720. package/dist-lib/lib/capabilities/completion.d.ts +0 -18
  721. package/dist-lib/lib/capabilities/completion.js +0 -22
  722. package/dist-lib/lib/helpers/recovery-required.d.ts +0 -1
  723. package/dist-lib/lib/helpers/recovery-required.js +0 -1
  724. package/dist-lib/lib/hooks/built-in/index.d.ts +0 -4
  725. package/dist-lib/lib/hooks/built-in/index.js +0 -4
  726. package/dist-lib/lib/hooks/pipeline.d.ts +0 -24
  727. package/dist-lib/lib/hooks/pipeline.js +0 -74
  728. package/dist-lib/lib/hooks/registry.d.ts +0 -2
  729. package/dist-lib/lib/hooks/registry.js +0 -7
  730. package/dist-lib/lib/machine/completion/actions/skills.d.ts +0 -9
  731. package/dist-lib/lib/machine/completion/actions/skills.js +0 -83
  732. package/dist-lib/lib/machine/engine.d.ts +0 -93
  733. package/dist-lib/lib/machine/guards.d.ts +0 -2
  734. package/dist-lib/lib/machine/guards.js +0 -6
  735. package/dist-lib/lib/office/pptx.d.ts +0 -1
  736. package/dist-lib/lib/office/pptx.js +0 -26
  737. package/dist-lib/lib/office/python.d.ts +0 -8
  738. package/dist-lib/lib/office/python.js +0 -32
  739. package/dist-lib/lib/office/xlsx.d.ts +0 -1
  740. package/dist-lib/lib/office/xlsx.js +0 -26
  741. package/dist-lib/lib/run-log-inspect.d.ts +0 -25
  742. package/dist-lib/lib/run-log-protocol.d.ts +0 -2
  743. package/dist-lib/lib/run-log-protocol.js +0 -1
  744. package/dist-lib/lib/tool-call-display.d.ts +0 -1
  745. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +0 -31
  746. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +0 -7
  747. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +0 -318
  748. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +0 -89
  749. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +0 -1371
  750. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +0 -3
  751. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +0 -17
  752. package/dist-lib/lib/tools/exec/obsidian/route.js +0 -91
  753. package/dist-lib/lib/tools/mcp-call.d.ts +0 -14
  754. package/dist-lib/lib/tools/rag-search.d.ts +0 -2
  755. package/dist-lib/lib/tools/rag-search.js +0 -105
  756. package/dist-lib/lib/tools/weather-lookup.d.ts +0 -8
  757. package/dist-lib/lib/tools/weather-lookup.js +0 -122
  758. package/dist-lib/lib/tools/web-search.d.ts +0 -6
  759. package/dist-lib/lib/web-search/engine-registry.d.ts +0 -7
  760. package/dist-lib/lib/web-search/engine-registry.js +0 -17
  761. package/wheels/cffi-2.0.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  762. package/wheels/cryptography-47.0.0-cp314-abi3-pyemscripten_2026_0_wasm32.whl +0 -0
  763. package/wheels/defusedxml-0.7.1-py2.py3-none-any.whl +0 -0
  764. package/wheels/et_xmlfile-2.0.0-py3-none-any.whl +0 -0
  765. package/wheels/fonttools-4.62.1-py3-none-any.whl +0 -0
  766. package/wheels/fpdf2-2.8.8-py3-none-any.whl +0 -0
  767. package/wheels/lxml-6.0.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  768. package/wheels/openpyxl-3.1.5-py2.py3-none-any.whl +0 -0
  769. package/wheels/pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  770. package/wheels/pycparser-3.0-py3-none-any.whl +0 -0
  771. package/wheels/pypdf-6.15.0-py3-none-any.whl +0 -0
  772. package/wheels/python_docx-1.2.0-py3-none-any.whl +0 -0
  773. package/wheels/python_pptx-1.0.2-py3-none-any.whl +0 -0
  774. package/wheels/six-1.17.0-py2.py3-none-any.whl +0 -0
  775. package/wheels/typing_extensions-4.15.0-py3-none-any.whl +0 -0
  776. package/wheels/xlsxwriter-3.2.9-py3-none-any.whl +0 -0
  777. /package/dist-lib/lib/{tools/skills → agent}/tool-grants.d.ts +0 -0
  778. /package/dist-lib/lib/{tools/skills → agent}/tool-grants.js +0 -0
  779. /package/dist-lib/lib/capabilities/{types.js → completion-engine/prepare-step.js} +0 -0
  780. /package/dist-lib/lib/{hooks/types.js → capabilities/completion-engine/stages.js} +0 -0
  781. /package/dist-lib/lib/{tool-call-display.js → contract/agent.js} +0 -0
  782. /package/dist-lib/lib/{tools/exec/adapters/adapter.js → contract/completion.js} +0 -0
  783. /package/dist-lib/lib/{tools/exec/adapters/python/worker/entry.d.ts → contract/exec.js} +0 -0
  784. /package/dist-lib/lib/{tools/exec/adapters/python/worker/interrupt-deadline.d.ts → contract/hooks.js} +0 -0
  785. /package/dist-lib/lib/{web-search/types.js → contract/index.js} +0 -0
  786. /package/dist-lib/lib/{capabilities/completion-engine → helpers}/abort-polyfill.d.ts +0 -0
  787. /package/dist-lib/lib/{capabilities/completion-engine → helpers}/abort-polyfill.js +0 -0
  788. /package/dist-lib/lib/{web-search → helpers}/html-helpers.d.ts +0 -0
  789. /package/dist-lib/lib/{web-search → helpers}/html-helpers.js +0 -0
  790. /package/dist-lib/lib/{tools → helpers}/model-args.d.ts +0 -0
  791. /package/dist-lib/lib/{tools → helpers}/model-args.js +0 -0
  792. /package/dist-lib/lib/{machine → helpers}/stable-stringify.d.ts +0 -0
  793. /package/dist-lib/lib/{web-search → helpers}/user-agents.d.ts +0 -0
  794. /package/dist-lib/lib/{web-search → helpers}/user-agents.js +0 -0
  795. /package/dist-lib/lib/{harness-lifecycle.d.ts → lifecycle/machine.d.ts} +0 -0
  796. /package/dist-lib/lib/tools/{exec/adapters/python → attachments}/output-policy.js +0 -0
  797. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/command.d.ts +0 -0
  798. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/note-name.d.ts +0 -0
  799. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/note-name.js +0 -0
  800. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/output.d.ts +0 -0
  801. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/output.js +0 -0
  802. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/safe-path.d.ts +0 -0
  803. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/safe-path.js +0 -0
  804. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-create.d.ts +0 -0
  805. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-create.js +0 -0
  806. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-fs.d.ts +0 -0
  807. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-fs.js +0 -0
  808. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-paths.d.ts +0 -0
  809. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-paths.js +0 -0
  810. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-read.d.ts +0 -0
  811. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-read.js +0 -0
  812. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-write.d.ts +0 -0
  813. /package/dist-lib/{lib/tools/exec → plugins}/obsidian/vault-write.js +0 -0
  814. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/deadline-state.d.ts +0 -0
  815. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/deadline-state.js +0 -0
  816. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/distributions.d.ts +0 -0
  817. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/distributions.js +0 -0
  818. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/interrupt-timer.d.ts +0 -0
  819. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/memfs.d.ts +0 -0
  820. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/module-distributions.d.ts +0 -0
  821. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/named-hosts.d.ts +0 -0
  822. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/named-hosts.js +0 -0
  823. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/net-shim.d.ts +0 -0
  824. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/net-shim.js +0 -0
  825. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/pyodide.d.ts +0 -0
  826. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/wheels.d.ts +0 -0
  827. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/active.d.ts +0 -0
  828. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/protocol.d.ts +0 -0
  829. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/protocol.js +0 -0
  830. /package/dist-lib/{lib/tools/exec/adapters → plugins}/python/worker/serve.d.ts +0 -0
  831. /package/dist-lib/{lib/capabilities → plugins/speech}/audio-resample.d.ts +0 -0
  832. /package/dist-lib/{lib/capabilities → plugins/speech}/audio-resample.js +0 -0
  833. /package/dist-lib/{lib → plugins/speech}/audio-transcode-bare.d.ts +0 -0
  834. /package/dist-lib/{lib → plugins/speech}/audio-transcode-node.d.ts +0 -0
  835. /package/dist-lib/{lib → plugins/speech}/audio-transcode-node.js +0 -0
  836. /package/dist-lib/{lib/capabilities → plugins/speech}/speech-lexicon.d.ts +0 -0
  837. /package/dist-lib/{lib/capabilities → plugins/speech}/speech-lexicon.js +0 -0
  838. /package/dist-lib/{lib → plugins/speech}/wav-encode.d.ts +0 -0
  839. /package/dist-lib/{lib → plugins/speech}/wav-encode.js +0 -0
  840. /package/dist-lib/{lib/tools/weather-lookup → plugins/weather}/place.d.ts +0 -0
  841. /package/dist-lib/{lib/tools/weather-lookup → plugins/weather}/report.d.ts +0 -0
  842. /package/dist-lib/{lib/tools/weather-lookup → plugins/weather}/report.js +0 -0
  843. /package/dist-lib/{lib → plugins}/web-search/fetch-html.d.ts +0 -0
  844. /package/dist-lib/{lib → plugins}/web-search/format-results.d.ts +0 -0
  845. /package/dist-lib/{lib → plugins}/web-search/format-results.js +0 -0
  846. /package/dist-lib/{lib → plugins}/web-search/merge-results.d.ts +0 -0
  847. /package/dist-lib/{lib → plugins}/web-search/merge-results.js +0 -0
  848. /package/dist-lib/{lib → plugins}/web-search/types.d.ts +0 -0
  849. /package/dist-lib/{lib → plugins}/web-search/url-helpers.d.ts +0 -0
  850. /package/dist-lib/{lib → plugins}/web-search/url-helpers.js +0 -0
  851. /package/dist-lib/{lib → plugins}/web-search/url-normalize.d.ts +0 -0
  852. /package/dist-lib/{lib → plugins}/web-search/url-normalize.js +0 -0
@@ -1,21 +1,13 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
1
  import { createHash } from 'crypto';
4
- import b4a from 'b4a';
5
2
  import { AbortedError } from '../helpers/race-abort.js';
6
- import { checkPdfBuildSource, checkBareLengthArgs, checkPptxBuildSource, checkPythonSource, checkUnstagedRead, createPythonAdapter, isPythonLanguage, parseInputs, parseOutputs, parsePackages, parseWorkdir, pinned, runsThroughPyodide, sandboxInstallError, unwrapPythonSource } from './exec/adapters/python/python-adapter.js';
7
- import { pythonCreateEffect } from './exec/adapters/python/create-effect.js';
8
- import { namedHosts } from './exec/adapters/python/named-hosts.js';
9
- import { pythonReachesNetwork } from './exec/adapters/python/net-shim.js';
10
3
  import { createShellAdapter } from './exec/adapters/shell/shell-adapter.js';
11
- import { routeObsidianCommand } from './exec/obsidian/route.js';
4
+ import { isPythonLanguage } from './exec/python-source.js';
12
5
  import { MAX_OUTPUT_CHARS_LIMIT } from './exec/runner.js';
13
6
  import { bareBin, firstCommandToken, sanitizeCommand } from './exec/scope.js';
14
- import { FILES_NEED_PYTHON_ERROR, isPythonSourceShaped, PACKAGES_NEED_PYTHON_ERROR, pythonRedirectError, startsLikePython, videoToolError } from './exec/shell-guidance.js';
7
+ import { LANGUAGE_UNAVAILABLE_ERROR, PYTHON_UNAVAILABLE_ERROR, SHELL_DOWNLOAD_NOTE, shellOnlyError, videoToolError } from './exec/shell-guidance.js';
15
8
  import { shellArgv } from './exec/shell-argv.js';
16
9
  import { bareRuntime } from './exec/bare-runtime.js';
17
10
  import { canonicalDenyRoots, defaultRealpath, hostPath, resolveKey } from './fs/scope.js';
18
- import { unquoteArg } from './model-args.js';
19
11
  import { settingsEnv } from './skills/skill-settings.js';
20
12
  import { checkCliOps } from './skills/cli-schema.js';
21
13
  function parsePositiveInt(value, name, max) {
@@ -50,291 +42,67 @@ function shellEffect(command, toolOps) {
50
42
  }
51
43
  return matched.every((op) => op.annotation(argv) === 'read') ? 'read' : 'write';
52
44
  }
53
- function resolveExecution({ adapters, fallback }, args, ctx) {
54
- for (const adapter of adapters) {
55
- const plan = adapter.resolve(args, ctx);
56
- if (plan) {
57
- return plan;
58
- }
59
- }
60
- return fallback.resolve(args, ctx);
61
- }
62
- function isPresent(value) {
63
- return value !== undefined && value !== null;
64
- }
65
- function checkFileArgs(args, python) {
66
- if (!python && (isPresent(args.inputs) || isPresent(args.outputs))) {
67
- return FILES_NEED_PYTHON_ERROR;
68
- }
69
- const inputs = parseInputs(args.inputs);
70
- if (inputs && 'error' in inputs) {
71
- return inputs.error;
72
- }
73
- const outputs = parseOutputs(args.outputs);
74
- if (outputs && 'error' in outputs) {
75
- return outputs.error;
76
- }
77
- if (!python) {
78
- return null;
79
- }
80
- const workdir = parseWorkdir(args.workdir);
81
- return workdir && typeof workdir === 'object' ? workdir.error : null;
82
- }
83
- function truncateLabel(text) {
84
- return text.length > 120 ? `${text.slice(0, 120)}…` : text;
85
- }
86
- const CONNECT_ANSWER_MS = 60_000;
87
- function connectAsker(askUser) {
88
- return async (host) => {
89
- let timer;
90
- const late = new Promise((resolve) => {
91
- timer = setTimeout(() => resolve(null), CONNECT_ANSWER_MS);
92
- });
93
- try {
94
- const answer = await Promise.race([
95
- askUser({
96
- question: `This Python run wants to connect to ${host}, which its approved code does not name. Allow it for this run?`,
97
- options: ['Allow', 'Deny']
98
- }),
99
- late
100
- ]);
101
- return /^allow/i.test((answer ?? '').trim());
102
- }
103
- finally {
104
- clearTimeout(timer);
105
- }
106
- };
107
- }
108
- function networkPrefix(source) {
109
- const hosts = namedHosts(source);
110
- if (hosts.length === 0) {
111
- return ' · network: no host named in the code';
112
- }
113
- return ` · network: ${hosts.join(', ')}`;
114
- }
115
- function packageSuffix(args) {
116
- if (!Array.isArray(args.packages) || args.packages.length === 0)
117
- return '';
118
- const count = args.packages.length;
119
- return ` (+${count} pkg${count === 1 ? '' : 's'}: ${truncateLabel(args.packages.join(', '))})`;
120
- }
121
- function uploadOrdinal(inputs, index) {
122
- return inputs.slice(0, index + 1).filter((i) => i.attachmentId === undefined).length;
123
- }
124
- function fileSuffix(args) {
125
- const inputs = parseInputs(args.inputs);
126
- const outputs = parseOutputs(args.outputs);
127
- const from = Array.isArray(inputs) && inputs.length > 0
128
- ? ` ← ${inputs.length} file${inputs.length === 1 ? '' : 's'} (${truncateLabel(inputs
129
- .map((i, n) => `${i.attachmentId ?? `upload-${uploadOrdinal(inputs, n)}`}→${i.path}`)
130
- .join(', '))})`
131
- : '';
132
- const to = Array.isArray(outputs) && outputs.length > 0 ? ` → ${truncateLabel(outputs.join(', '))}` : '';
133
- return `${from}${to}`;
134
- }
135
45
  function stringList(value) {
136
46
  if (!Array.isArray(value))
137
47
  return undefined;
138
48
  return value.filter((v) => typeof v === 'string');
139
49
  }
140
- function commandRequiredError(args, network) {
141
- const staged = Array.isArray(args.inputs) || Array.isArray(args.outputs);
142
- if (staged) {
143
- return ('command is required: keep these same inputs/outputs and add either command (the bare ' +
144
- 'python source) or script + scriptArgs exactly as the loaded skill reference shows');
145
- }
146
- const packages = stringList(args.packages);
147
- const impossible = videoToolError('', { packages, python: true, network });
148
- if (impossible) {
149
- return impossible;
150
- }
151
- if (packages?.length) {
152
- return `command is required: call exec again with language "python", packages: ${JSON.stringify(packages.map(pinned))} and the Python source that uses them in command. Installing and running are the same one call.`;
153
- }
154
- return 'command is required';
155
- }
156
- function parseScriptArgs(value) {
157
- if (Array.isArray(value)) {
158
- return value.map(String);
159
- }
160
- if (typeof value === 'string' && value.trim().startsWith('[')) {
161
- try {
162
- const parsed = JSON.parse(value);
163
- if (Array.isArray(parsed)) {
164
- return parsed.map(String);
165
- }
166
- }
167
- catch {
50
+ function firstAnswer(languages, answer) {
51
+ for (const language of languages) {
52
+ const found = answer(language);
53
+ if (found) {
54
+ return found;
168
55
  }
169
56
  }
170
- return [];
57
+ return null;
171
58
  }
172
- function normalizeScriptCall(rawArgs) {
173
- let script = typeof rawArgs.script === 'string' ? unquoteArg(rawArgs.script) : '';
174
- let scriptArgs = parseScriptArgs(rawArgs.scriptArgs);
175
- if (!script || script.includes('\n')) {
176
- return { script, scriptArgs };
177
- }
178
- if (script.includes(' ')) {
179
- const tokens = script.split(/\s+/).filter(Boolean);
180
- script = tokens[0] ?? '';
181
- if (!scriptArgs.length) {
182
- scriptArgs = tokens.slice(1);
59
+ function resolveCall(rawArgs, languages) {
60
+ const name = languageName(rawArgs.language);
61
+ const ordered = [...languages].sort((a, b) => Number(b.name === name) - Number(a.name === name));
62
+ for (const language of ordered) {
63
+ const call = language.call(rawArgs);
64
+ if (call) {
65
+ return 'error' in call ? call : { ...call, language };
183
66
  }
184
67
  }
185
- if (!script.startsWith('scripts/') && !script.includes('/')) {
186
- script = `scripts/${script}`;
68
+ if (isPythonLanguage(rawArgs.language)) {
69
+ return { error: PYTHON_UNAVAILABLE_ERROR };
187
70
  }
188
- return { script, scriptArgs };
71
+ return namesShell(rawArgs.language) ? { args: rawArgs } : { error: LANGUAGE_UNAVAILABLE_ERROR };
189
72
  }
190
- export function resolveScriptRun(rawArgs, skillsDir) {
191
- const { script, scriptArgs } = normalizeScriptCall(rawArgs);
192
- if (!script) {
193
- if (scriptArgs.length) {
194
- return {
195
- error: 'scriptArgs need `script`: pass the scripts/*.py path exactly as the skill instructions name it'
196
- };
197
- }
198
- return null;
199
- }
200
- if (script.includes('\n')) {
201
- return {
202
- args: { ...rawArgs, language: 'python', command: script, script: undefined },
203
- trusted: false
204
- };
205
- }
206
- if (!script.startsWith('scripts/') || !script.endsWith('.py')) {
207
- return {
208
- error: 'script takes a scripts/*.py path bundled with a skill, not a command line — ' +
209
- `run a shell command by passing it in \`command\` instead. Got: ${String(rawArgs.script)}`
210
- };
211
- }
212
- const skill = typeof rawArgs.skill === 'string' ? unquoteArg(rawArgs.skill) : '';
213
- if (!skill) {
214
- return { error: 'script runs need the owning skill name in `skill`' };
215
- }
216
- if (!skillsDir) {
217
- return { error: 'script execution is not available on this device' };
218
- }
219
- if (String(rawArgs.command ?? '').trim()) {
220
- return { error: 'pass either command or script, never both' };
221
- }
222
- const segments = [...skill.split('/'), ...script.split('/')];
223
- if (segments.some((segment) => segment === '' || segment === '..' || segment.includes('\\'))) {
224
- return { error: `script not found in skill ${skill}: ${script}` };
225
- }
226
- let source;
227
- try {
228
- const scriptPath = path.join(skillsDir, skill, script);
229
- const regularPath = () => {
230
- let current = skillsDir;
231
- for (const segment of segments) {
232
- current = path.join(current, segment);
233
- if (fs.lstatSync(current).isSymbolicLink()) {
234
- return false;
235
- }
236
- }
237
- return true;
238
- };
239
- if (!regularPath()) {
240
- return { error: `script not found in skill ${skill}: ${script}` };
241
- }
242
- const before = fs.statSync(scriptPath);
243
- if (!before.isFile()) {
244
- return { error: `script not found in skill ${skill}: ${script}` };
245
- }
246
- const fd = fs.openSync(scriptPath, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
247
- try {
248
- const opened = fs.fstatSync(fd);
249
- if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino) {
250
- return { error: `script not found in skill ${skill}: ${script}` };
251
- }
252
- source = readScriptSource(fd);
253
- const current = fs.statSync(scriptPath);
254
- if (!regularPath() || current.dev !== opened.dev || current.ino !== opened.ino) {
255
- return { error: `script not found in skill ${skill}: ${script}` };
256
- }
257
- }
258
- finally {
259
- fs.closeSync(fd);
260
- }
261
- }
262
- catch {
263
- return { error: `script not found in skill ${skill}: ${script}` };
264
- }
265
- const staged = stagingGap(rawArgs, scriptArgs);
266
- if (staged) {
267
- return { error: staged };
268
- }
269
- const argv = JSON.stringify([script.slice('scripts/'.length), ...scriptArgs]);
270
- const command = `import sys\nsys.argv = ${argv}\n${source}`;
271
- return { args: { ...rawArgs, language: 'python', command, scriptArgs }, trusted: true };
73
+ function languageName(language) {
74
+ return typeof language === 'string' ? language.trim().toLowerCase() : '';
272
75
  }
273
- function readScriptSource(fd) {
274
- const chunks = [];
275
- while (true) {
276
- const buffer = b4a.allocUnsafe(8192);
277
- const length = fs.readSync(fd, buffer);
278
- if (length === 0) {
279
- break;
280
- }
281
- chunks.push(buffer.subarray(0, length));
282
- }
283
- return b4a.toString(b4a.concat(chunks), 'utf8');
76
+ const SHELL_NAMES = new Set(['', 'shell', 'bash', 'sh', 'zsh']);
77
+ function namesShell(language) {
78
+ return SHELL_NAMES.has(languageName(language));
284
79
  }
285
- const SCRIPT_FILE_ARG = /^[\w][\w.-]*\.(pdf|txt|md|csv|docx|xlsx|pptx|png|jpe?g)$/i;
286
- function stagingGap(rawArgs, scriptArgs) {
287
- const inputs = parseInputs(rawArgs.inputs);
288
- const outputs = parseOutputs(rawArgs.outputs);
289
- const known = new Set([
290
- ...(Array.isArray(inputs) ? inputs.map((input) => input.path) : []),
291
- ...(Array.isArray(outputs) ? outputs : [])
292
- ]);
293
- const missing = scriptArgs.filter((arg) => SCRIPT_FILE_ARG.test(arg) && !known.has(arg));
294
- if (!missing.length) {
295
- return null;
296
- }
297
- return (`scriptArgs name ${missing.map((name) => `"${name}"`).join(', ')} but the working directory ` +
298
- 'starts empty: stage each existing file in inputs [{ attachmentId, path }] and declare each ' +
299
- 'produced file in outputs');
80
+ const NOT_SHELL = ['packages', 'inputs', 'outputs', 'script'];
81
+ function shellStray(args) {
82
+ const name = NOT_SHELL.find((each) => args[each] !== undefined && args[each] !== null);
83
+ return name
84
+ ? `${name} is not an argument here: a shell call takes only command, workdir, timeoutMs and maxOutputChars`
85
+ : null;
300
86
  }
301
- function scriptLabel(args) {
302
- const { script, scriptArgs } = normalizeScriptCall(args);
303
- const argsSuffix = scriptArgs.length ? ` ${scriptArgs.join(' ')}` : '';
304
- return `python script ${unquoteArg(args.skill ?? '?')}/${script}${argsSuffix}`;
87
+ function loadRun(call, skillsDir) {
88
+ return call.bundled ? call.bundled.load(skillsDir) : { args: call.args, trusted: false };
305
89
  }
306
90
  const WORKDIR_NO_ROOTS_ERROR = 'workdir is not available: no directories are granted to this device, so a working directory ' +
307
91
  'cannot be validated. Omit workdir and use absolute paths in the command.';
308
- function withInferredLanguage(args, disablePyodide) {
309
- if (disablePyodide || isPythonLanguage(args.language))
310
- return args;
311
- const command = String(args.command ?? '').trim();
312
- const declared = (stringList(args.packages) ?? []).length > 0 && startsLikePython(command);
313
- const wrapped = unwrapPythonSource(command) !== null;
314
- return isPythonSourceShaped(command) || declared || wrapped
315
- ? { ...args, language: 'python' }
316
- : args;
317
- }
318
- function checkExecutionScope(args, { toolOps, disablePyodide, sandbox, network }) {
92
+ function checkExecutionScope(args, language, { toolOps, sandbox, languages }) {
93
+ if (language) {
94
+ return language.scope(args, { sandbox });
95
+ }
319
96
  const command = String(args.command ?? '').trim();
320
97
  const video = videoToolError(command, {
321
98
  packages: stringList(args.packages),
322
- python: runsThroughPyodide(args.language, disablePyodide),
323
- network
99
+ python: false,
100
+ network: languages.some((each) => each.online({ sandbox }))
324
101
  });
325
- if (video) {
326
- return video;
327
- }
328
- if (runsThroughPyodide(args.language, disablePyodide)) {
329
- return null;
330
- }
331
- if (!disablePyodide) {
332
- const redirect = pythonRedirectError(command, sandbox);
333
- if (redirect) {
334
- return redirect;
335
- }
336
- }
337
- return checkShellScope(command, toolOps);
102
+ return (video ??
103
+ firstAnswer(languages, (each) => each.redirect(args, { sandbox })) ??
104
+ shellOnlyError(command) ??
105
+ checkShellScope(command, toolOps));
338
106
  }
339
107
  async function skillsEnv(skillSettings, ctx) {
340
108
  const skills = ctx?.skills ?? [];
@@ -347,57 +115,44 @@ async function skillsEnv(skillSettings, ctx) {
347
115
  }
348
116
  return Object.keys(env).length > 0 ? env : undefined;
349
117
  }
350
- export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide, disablePyodide = false, pythonNetwork = !disablePyodide && pythonReachesNetwork(), credentialStore, skillSettings, realpath = defaultRealpath, deniedRoots, skillsDir } = {}) {
351
- const adapters = [createPythonAdapter(disablePyodide, loadPyodide, pythonNetwork)];
352
- const fallback = createShellAdapter({ spawn, killProcess, loadRuntime: bareRuntime });
118
+ function execSchema(languages) {
119
+ const text = languages.map((language) => language.text);
120
+ const runs = (each) => text.map((t) => `, or ${each(t)}`).join('');
121
+ const language = text.length
122
+ ? {
123
+ language: {
124
+ type: 'string',
125
+ description: `Optional runtime. ${text.map((t) => t.language).join(' ')} Default is shell.`
126
+ }
127
+ }
128
+ : {};
129
+ const promptLanguage = text.length
130
+ ? {
131
+ language: {
132
+ type: 'string',
133
+ enum: ['shell', ...languages.map((each) => each.name)],
134
+ description: `${text.map((t) => t.prompt.language).join('; ')}; default shell.`
135
+ }
136
+ }
137
+ : {};
138
+ const workdir = text.length
139
+ ? ` on the shell path${text.map((t) => `, ${t.workdir}`).join('')}`
140
+ : '';
353
141
  return {
354
- name: 'exec',
355
- policyVersion: createHash('sha256')
356
- .update(JSON.stringify({
357
- version: 1,
358
- policyVersion: policyVersion ?? null,
359
- disablePyodide,
360
- deniedRoots: [...(deniedRoots ?? [])].sort(),
361
- skillsDir: skillsDir ?? null
362
- }))
363
- .digest('hex'),
364
- toolset: 'exec',
365
- description: "Execute a shell command on the user's device, or Python via in-process Pyodide. " +
142
+ description: `Execute a shell command on the user's device${runs((t) => t.runs)}. ` +
366
143
  'One program per call: chaining, pipes, redirection and shell expansion are rejected. ' +
367
144
  'Returns stdout, stderr, and exit code. ' +
368
- 'For Python: pass language="python" with the bare Python source in command — the first line of ' +
369
- 'command is the first line of the program, there is no shell or interpreter to invoke, and ' +
370
- 'packages are declared in packages rather than installed. ' +
371
- 'When a loaded skill names a bundled script, run it by passing skill and script (with scriptArgs) ' +
372
- 'instead of command — never retype a script as source. ' +
145
+ text.map((t) => `${t.guide} `).join('') +
373
146
  'Prefer one-shot commands; do not use for long-running daemons.',
374
147
  parameters: {
375
148
  type: 'object',
376
149
  properties: {
377
- command: {
378
- type: 'string',
379
- description: 'Shell command, or — when language is python — the Python source itself, ' +
380
- 'whose first line is the first line of the program (no shell, no interpreter, no quoting)'
381
- },
382
- language: {
383
- type: 'string',
384
- description: 'Optional runtime. "python" runs command as Python via in-process Pyodide. Default is shell.'
385
- },
386
- packages: {
387
- type: 'array',
388
- description: 'Optional array of PyPI package names (strings) to install (via micropip) before the code runs. Only with language "python".'
389
- },
390
- inputs: {
391
- type: 'array',
392
- description: 'Optional chat attachments to place in the working directory before the code runs, as objects {attachmentId, path}. path is a bare file name (no directories). Omit attachmentId to stage the image the user attached to their latest message. Any other uploaded file — PDF, .docx, .xlsx, .pptx — is staged by attachmentId, copied verbatim from the [Attached file "…"] line on the user\'s message; ids also come from earlier tool results. Only with language "python".'
393
- },
394
- outputs: {
395
- type: 'array',
396
- description: 'Optional bare file names (strings) the code writes in the working directory; each is attached to the chat when the run succeeds. Only with language "python".'
397
- },
150
+ command: { type: 'string', description: `Shell command${runs((t) => t.command)}` },
151
+ ...language,
152
+ ...Object.assign({}, ...text.map((t) => t.properties)),
398
153
  workdir: {
399
154
  type: 'string',
400
- description: 'Optional working directory: a host path on the shell path, a bare directory name inside the in-memory Python filesystem with language "python".'
155
+ description: `Optional working directory: a host path${workdir}.`
401
156
  },
402
157
  timeoutMs: {
403
158
  type: 'number',
@@ -405,167 +160,132 @@ export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide,
405
160
  },
406
161
  maxOutputChars: {
407
162
  type: 'number',
408
- description: 'Optional stdout/stderr cap in characters (default 8192, max 65536). Raise when reading long content, e.g. a full note.'
409
- },
410
- script: {
411
- type: 'string',
412
- description: 'Run a python script bundled with a loaded skill instead of passing source: a scripts/*.py path exactly as the skill instructions name it (e.g. "scripts/extract_text.py"). Requires skill; leave command unset; pass arguments in scriptArgs and stage files via inputs/outputs as the instructions show.'
413
- },
414
- skill: {
415
- type: 'string',
416
- description: 'With script: the name of the skill that bundles the script (e.g. "pdf").'
417
- },
418
- scriptArgs: {
419
- type: 'array',
420
- description: 'With script: string arguments handed to the script as its command line, in order.'
163
+ description: 'Optional stdout/stderr cap in characters (default 8192, max 65536); longer output keeps its start and end. Raise when reading long content, e.g. a full note.'
421
164
  }
422
165
  },
423
166
  required: []
424
167
  },
425
168
  prompt: {
426
- description: "Run one program on the user's device: a shell command, or Python source in `command` with " +
427
- 'language="python". Chaining, pipes, redirection and shell expansion are rejected. ' +
428
- 'Returns stdout, stderr, exit code. Run a script ' +
429
- 'bundled with a loaded skill via `skill`+`script`+`scriptArgs`, never as retyped source.',
169
+ description: `Run one program on the user's device: a shell command${runs((t) => t.prompt.runs)}. ` +
170
+ 'Chaining, pipes, redirection and shell expansion are rejected. ' +
171
+ `Returns stdout, stderr, exit code.${text.map((t) => ` ${t.prompt.guide}`).join('')}`,
430
172
  parameters: {
431
173
  type: 'object',
432
174
  properties: {
433
175
  command: {
434
176
  type: 'string',
435
- description: 'Shell command, or bare Python source when language="python".'
436
- },
437
- language: {
438
- type: 'string',
439
- enum: ['shell', 'python'],
440
- description: '"python" runs `command` as Python; default shell.'
441
- },
442
- packages: { type: 'array', description: 'python only: PyPI packages to install.' },
443
- inputs: {
444
- type: 'array',
445
- description: 'python only: attachments to stage as {attachmentId, path}, path a bare file name; ' +
446
- 'omit attachmentId for the latest attached image.'
447
- },
448
- outputs: {
449
- type: 'array',
450
- description: 'Only with language "python": bare file names the code writes; attached on success.'
177
+ description: `Shell command${runs((t) => t.prompt.command)}.`
451
178
  },
179
+ ...promptLanguage,
180
+ ...Object.assign({}, ...text.map((t) => t.prompt.properties)),
452
181
  workdir: { type: 'string' },
453
182
  timeoutMs: { type: 'number', description: 'default 120000, max 600000.' },
454
183
  maxOutputChars: {
455
184
  type: 'number',
456
- description: 'stdout/stderr cap (default 8192, max 65536); raise for long content.'
457
- },
458
- script: {
459
- type: 'string',
460
- description: 'Run a python script bundled with a loaded skill instead of passing source: a scripts/*.py ' +
461
- 'path exactly as the skill instructions name it (e.g. "scripts/extract_text.py"). Requires ' +
462
- '`skill`; leave `command` unset. Never a command line — shell commands go in `command`.'
463
- },
464
- skill: {
465
- type: 'string',
466
- description: 'With script: the name of the skill that bundles it (e.g. "pdf").'
467
- },
468
- scriptArgs: { type: 'array', description: 'With script: string arguments in order.' }
185
+ description: 'stdout/stderr cap (default 8192, max 65536), keeping start and end; raise for long content.'
186
+ }
469
187
  },
470
188
  required: []
471
189
  }
472
- },
190
+ }
191
+ };
192
+ }
193
+ export function createExecTool({ policyVersion, spawn, killProcess, shell: composedShell, languages = [], routes = [], skillSettings, realpath = defaultRealpath, deniedRoots, skillsDir } = {}) {
194
+ const shell = composedShell ??
195
+ createShellAdapter({
196
+ spawn,
197
+ killProcess,
198
+ loadRuntime: bareRuntime,
199
+ downloadNote: [SHELL_DOWNLOAD_NOTE, ...languages.map((each) => each.text.download)]
200
+ .filter(Boolean)
201
+ .join(' ')
202
+ });
203
+ const commandRequired = (args, scope, language) => firstAnswer(languages, (each) => each.redirect(args, scope)) ??
204
+ (language ? null : shellStray(args)) ??
205
+ 'command is required';
206
+ return {
207
+ name: 'exec',
208
+ policyVersion: createHash('sha256')
209
+ .update(JSON.stringify({
210
+ version: 2,
211
+ policyVersion: policyVersion ?? null,
212
+ shell: shell.name,
213
+ languages: languages.map((each) => each.name),
214
+ routes: routes.map((each) => each.name),
215
+ deniedRoots: [...(deniedRoots ?? [])].sort(),
216
+ skillsDir: skillsDir ?? null
217
+ }))
218
+ .digest('hex'),
219
+ toolset: 'exec',
220
+ addons: { 'bare-subprocess': bareRuntime },
221
+ ...execSchema(languages),
473
222
  autoApprove: false,
474
223
  effect(rawArgs, ctx) {
475
- const args = withInferredLanguage(rawArgs, disablePyodide);
476
- if (typeof args.script === 'string' && args.script.trim() && !args.script.includes('\n')) {
224
+ const call = resolveCall(rawArgs, languages);
225
+ if ('error' in call) {
226
+ return 'write';
227
+ }
228
+ if (call.bundled) {
477
229
  return 'read';
478
230
  }
479
- if (runsThroughPyodide(args.language, disablePyodide)) {
480
- return pythonCreateEffect(args);
231
+ if (call.language) {
232
+ return call.language.effect(call.args);
481
233
  }
482
- return shellEffect(String(args.command ?? '').trim(), ctx?.toolOps);
234
+ return shellEffect(String(call.args.command ?? '').trim(), ctx?.toolOps);
483
235
  },
484
236
  validate(args, ctx) {
485
- const scriptRun = resolveScriptRun(args, skillsDir);
486
- if (scriptRun && 'error' in scriptRun) {
487
- return scriptRun.error;
237
+ const call = resolveCall(args, languages);
238
+ if ('error' in call) {
239
+ return call.error;
488
240
  }
489
- const rawArgs = withInferredLanguage(scriptRun ? scriptRun.args : args, disablePyodide);
241
+ const run = loadRun(call, skillsDir);
242
+ if ('error' in run) {
243
+ return run.error;
244
+ }
245
+ const { language } = call;
246
+ const rawArgs = run.args;
247
+ const sandbox = ctx?.sandboxMode === true;
490
248
  const command = String(rawArgs.command ?? '').trim();
491
249
  if (!command) {
492
- return commandRequiredError(rawArgs, pythonNetwork && ctx?.sandboxMode !== true);
250
+ return commandRequired(rawArgs, { sandbox }, language);
493
251
  }
494
- const scopeError = checkExecutionScope(rawArgs, {
252
+ const scopeError = checkExecutionScope(rawArgs, language, {
495
253
  toolOps: ctx?.toolOps,
496
- disablePyodide,
497
- sandbox: ctx?.sandboxMode === true,
498
- network: pythonNetwork && ctx?.sandboxMode !== true
254
+ sandbox,
255
+ languages
499
256
  });
500
257
  if (scopeError) {
501
258
  return scopeError;
502
259
  }
503
- const python = runsThroughPyodide(rawArgs.language, disablePyodide);
504
260
  const workdirGiven = rawArgs.workdir !== undefined && rawArgs.workdir !== null;
505
- if (workdirGiven && !python && (ctx?.fsRoots ?? []).length === 0) {
261
+ if (workdirGiven && !language && (ctx?.fsRoots ?? []).length === 0) {
506
262
  return WORKDIR_NO_ROOTS_ERROR;
507
263
  }
508
- if (python) {
509
- const outputs = parseOutputs(rawArgs.outputs);
510
- if (outputs && 'error' in outputs) {
511
- return outputs.error;
512
- }
513
- const packages = parsePackages(rawArgs.packages);
514
- if (packages && 'error' in packages) {
515
- return packages.error;
516
- }
517
- const refusal = ctx?.sandboxMode === true ? sandboxInstallError(command, packages) : null;
518
- if (refusal) {
519
- return refusal;
520
- }
521
- if (!scriptRun || !scriptRun.trusted) {
522
- const sourceError = checkPythonSource(command);
523
- if (sourceError) {
524
- return sourceError;
525
- }
526
- const pptxError = checkPptxBuildSource(unwrapPythonSource(command) ?? command, outputs, packages);
527
- if (pptxError) {
528
- return pptxError;
529
- }
530
- const pdfError = checkPdfBuildSource(unwrapPythonSource(command) ?? command, outputs, packages);
531
- if (pdfError) {
532
- return pdfError;
533
- }
534
- const bareLength = checkBareLengthArgs(unwrapPythonSource(command) ?? command, packages);
535
- if (bareLength) {
536
- return bareLength;
537
- }
538
- const inputs = parseInputs(rawArgs.inputs);
539
- const unstagedRead = checkUnstagedRead(unwrapPythonSource(command) ?? command, Array.isArray(inputs) ? inputs : undefined);
540
- if (unstagedRead) {
541
- return unstagedRead;
542
- }
543
- }
544
- }
545
- const parsed = parsePackages(rawArgs.packages);
546
- if (parsed && 'error' in parsed) {
547
- return parsed.error;
548
- }
549
- if (parsed && !python) {
550
- return PACKAGES_NEED_PYTHON_ERROR;
264
+ if (language) {
265
+ return language.validate(rawArgs, {
266
+ sandbox,
267
+ trusted: run.trusted,
268
+ toolNames: ctx?.toolNames
269
+ });
551
270
  }
552
- return checkFileArgs(rawArgs, python);
271
+ return firstAnswer(languages, (each) => each.strays(rawArgs)) ?? shellStray(rawArgs);
553
272
  },
554
273
  resource(rawArgs, ctx) {
555
- const args = withInferredLanguage(rawArgs, disablePyodide);
556
- const script = typeof args.script === 'string' ? args.script : '';
557
- if (script.trim() && !script.includes('\n')) {
558
- return { kind: 'command', label: scriptLabel(args) };
274
+ const call = resolveCall(rawArgs, languages);
275
+ if ('error' in call) {
276
+ return null;
277
+ }
278
+ if (call.bundled) {
279
+ return { kind: 'command', label: call.bundled.label };
559
280
  }
560
- const command = String(args.command ?? '').trim() || script.trim();
281
+ const { args } = call;
282
+ const command = String(args.command ?? '').trim();
561
283
  if (!command) {
562
284
  return null;
563
285
  }
564
286
  const workdir = typeof args.workdir === 'string' && args.workdir.trim() ? args.workdir.trim() : null;
565
- const source = unwrapPythonSource(command) ?? command;
566
- const online = pythonNetwork && ctx?.sandboxMode !== true;
567
- const body = runsThroughPyodide(args.language, disablePyodide)
568
- ? `python${online ? networkPrefix(source) : ''}${packageSuffix(args)}${fileSuffix(args)}: ${source.slice(0, 120)}`
287
+ const body = call.language
288
+ ? call.language.label(args, { sandbox: ctx?.sandboxMode === true })
569
289
  : command;
570
290
  return {
571
291
  kind: 'command',
@@ -573,20 +293,25 @@ export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide,
573
293
  };
574
294
  },
575
295
  async execute(args, ctx) {
576
- const scriptRun = resolveScriptRun(args, skillsDir);
577
- if (scriptRun && 'error' in scriptRun) {
578
- return { error: scriptRun.error };
296
+ const call = resolveCall(args, languages);
297
+ if ('error' in call) {
298
+ return { error: call.error };
579
299
  }
580
- const rawArgs = withInferredLanguage(scriptRun ? scriptRun.args : args, disablePyodide);
300
+ const run = loadRun(call, skillsDir);
301
+ if ('error' in run) {
302
+ return { error: run.error };
303
+ }
304
+ const { language } = call;
305
+ const rawArgs = run.args;
306
+ const sandbox = ctx?.sandboxMode === true;
581
307
  const command = String(rawArgs.command ?? '').trim();
582
308
  if (!command) {
583
- return { error: commandRequiredError(rawArgs, pythonNetwork && ctx?.sandboxMode !== true) };
309
+ return { error: commandRequired(rawArgs, { sandbox }, language) };
584
310
  }
585
- const scopeError = checkExecutionScope(rawArgs, {
311
+ const scopeError = checkExecutionScope(rawArgs, language, {
586
312
  toolOps: ctx?.toolOps,
587
- disablePyodide,
588
- sandbox: ctx?.sandboxMode === true,
589
- network: pythonNetwork && ctx?.sandboxMode !== true
313
+ sandbox,
314
+ languages
590
315
  });
591
316
  if (scopeError) {
592
317
  return { error: scopeError };
@@ -594,14 +319,13 @@ export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide,
594
319
  const workdir = rawArgs.workdir === undefined || rawArgs.workdir === null
595
320
  ? undefined
596
321
  : String(rawArgs.workdir);
597
- const onShellPath = !runsThroughPyodide(rawArgs.language, disablePyodide);
322
+ const deny = await canonicalDenyRoots(deniedRoots, realpath);
598
323
  let cwd = workdir;
599
- if (workdir !== undefined && onShellPath) {
324
+ if (workdir !== undefined && !language) {
600
325
  const roots = ctx?.fsRoots ?? [];
601
326
  if (roots.length === 0) {
602
327
  return { error: WORKDIR_NO_ROOTS_ERROR };
603
328
  }
604
- const deny = await canonicalDenyRoots(deniedRoots, realpath);
605
329
  const resolved = await resolveKey(workdir, roots, { realpath, deny });
606
330
  if ('error' in resolved) {
607
331
  return { error: resolved.error };
@@ -634,22 +358,18 @@ export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide,
634
358
  if (maxOutputChars && typeof maxOutputChars === 'object') {
635
359
  return maxOutputChars;
636
360
  }
637
- if (!isPythonLanguage(rawArgs.language)) {
638
- const obsidian = await routeObsidianCommand(command, ctx, {
639
- credentialStore,
640
- spawn,
641
- killProcess,
642
- loadRuntime: spawn ? undefined : bareRuntime,
361
+ const route = language ? undefined : routes.find((each) => each.claims(command));
362
+ if (route) {
363
+ return route.run(command, ctx, {
643
364
  timeoutMs: timeout,
644
- maxOutputChars
365
+ maxOutputChars,
366
+ signal: ctx?.signal,
367
+ runtime: spawn ? async () => ({ spawn, killProcess }) : bareRuntime
645
368
  });
646
- if (obsidian) {
647
- return obsidian;
648
- }
649
369
  }
650
370
  const skillEnv = skillSettings ? await skillsEnv(skillSettings, ctx) : undefined;
651
371
  try {
652
- const execution = resolveExecution({ adapters, fallback }, rawArgs, {
372
+ const context = {
653
373
  attach: ctx?.attach,
654
374
  fetchAttachment: ctx?.fetchAttachment,
655
375
  turnImages: ctx?.turnImages,
@@ -657,14 +377,18 @@ export function createExecTool({ policyVersion, spawn, killProcess, loadPyodide,
657
377
  sandboxMode: ctx?.sandboxMode,
658
378
  toolNames: ctx?.toolNames,
659
379
  approval: ctx?.approval,
660
- confirmConnect: ctx?.askUser ? connectAsker(ctx.askUser) : undefined
661
- });
380
+ askUser: ctx?.askUser,
381
+ writeRoots: (ctx?.fsWriteRoots ?? []).flatMap((each) => each.kind === 'local' ? [each.root] : []),
382
+ deniedRoots: deny
383
+ };
384
+ const execution = language?.resolve(rawArgs, context) ?? shell.resolve(rawArgs, context);
662
385
  return await execution.run({
663
386
  cwd,
664
387
  timeoutMs: timeout,
665
388
  maxOutputChars,
666
389
  signal: ctx?.signal,
667
- env: skillEnv
390
+ env: skillEnv,
391
+ spill: ctx?.spill
668
392
  });
669
393
  }
670
394
  catch (err) {