@namzu/sdk 48.3.1 → 50.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/CHANGELOG.md +542 -0
  2. package/README.md +137 -125
  3. package/dist/agents/QueryAgent.d.ts.map +1 -1
  4. package/dist/agents/QueryAgent.js +1 -0
  5. package/dist/agents/QueryAgent.js.map +1 -1
  6. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -1
  7. package/dist/agents/examples/SupervisorAgent.js +1 -0
  8. package/dist/agents/examples/SupervisorAgent.js.map +1 -1
  9. package/dist/agents/runAgent.d.ts +2 -0
  10. package/dist/agents/runAgent.d.ts.map +1 -1
  11. package/dist/agents/runAgent.js +1 -0
  12. package/dist/agents/runAgent.js.map +1 -1
  13. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  14. package/dist/authorization/shell-lexer.js +16 -1
  15. package/dist/authorization/shell-lexer.js.map +1 -1
  16. package/dist/bridge/acp/permission.d.ts +8 -2
  17. package/dist/bridge/acp/permission.d.ts.map +1 -1
  18. package/dist/bridge/acp/permission.js +1 -0
  19. package/dist/bridge/acp/permission.js.map +1 -1
  20. package/dist/bridge/acp/server.d.ts +25 -1
  21. package/dist/bridge/acp/server.d.ts.map +1 -1
  22. package/dist/bridge/acp/server.js +205 -21
  23. package/dist/bridge/acp/server.js.map +1 -1
  24. package/dist/bridge/acp/tasks.d.ts +5 -0
  25. package/dist/bridge/acp/tasks.d.ts.map +1 -0
  26. package/dist/bridge/acp/tasks.js +19 -0
  27. package/dist/bridge/acp/tasks.js.map +1 -0
  28. package/dist/bridge/acp/update.d.ts.map +1 -1
  29. package/dist/bridge/acp/update.js +148 -13
  30. package/dist/bridge/acp/update.js.map +1 -1
  31. package/dist/config/registry.d.ts +2 -0
  32. package/dist/config/registry.d.ts.map +1 -1
  33. package/dist/config/registry.js +23 -3
  34. package/dist/config/registry.js.map +1 -1
  35. package/dist/config/runtime.d.ts +31 -31
  36. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  37. package/dist/connector/mcp/adapter.js +11 -4
  38. package/dist/connector/mcp/adapter.js.map +1 -1
  39. package/dist/connector/mcp/client.d.ts.map +1 -1
  40. package/dist/connector/mcp/client.js +6 -3
  41. package/dist/connector/mcp/client.js.map +1 -1
  42. package/dist/connector/mcp/discovery.d.ts +9 -5
  43. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  44. package/dist/connector/mcp/discovery.js +16 -8
  45. package/dist/connector/mcp/discovery.js.map +1 -1
  46. package/dist/connector/mcp/mcp-toolset.d.ts +3 -0
  47. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -1
  48. package/dist/connector/mcp/mcp-toolset.js +20 -2
  49. package/dist/connector/mcp/mcp-toolset.js.map +1 -1
  50. package/dist/connector/mcp/reconnect.d.ts +2 -0
  51. package/dist/connector/mcp/reconnect.d.ts.map +1 -1
  52. package/dist/connector/mcp/reconnect.js +36 -5
  53. package/dist/connector/mcp/reconnect.js.map +1 -1
  54. package/dist/constants/acp/index.d.ts +3 -0
  55. package/dist/constants/acp/index.d.ts.map +1 -1
  56. package/dist/constants/acp/index.js +3 -0
  57. package/dist/constants/acp/index.js.map +1 -1
  58. package/dist/contracts/a2a.d.ts +80 -80
  59. package/dist/contracts/schemas.d.ts +2 -2
  60. package/dist/contracts/session/schemas.d.ts +10 -10
  61. package/dist/manager/agent/lifecycle.d.ts +11 -0
  62. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  63. package/dist/manager/agent/lifecycle.js +178 -3
  64. package/dist/manager/agent/lifecycle.js.map +1 -1
  65. package/dist/manager/plan/lifecycle.d.ts +7 -8
  66. package/dist/manager/plan/lifecycle.d.ts.map +1 -1
  67. package/dist/manager/plan/lifecycle.js +7 -8
  68. package/dist/manager/plan/lifecycle.js.map +1 -1
  69. package/dist/manager/resident/consumption.d.ts +8 -8
  70. package/dist/manager/resident/learning-cycle.d.ts +2 -2
  71. package/dist/manager/resident/learning-observation.d.ts +12 -12
  72. package/dist/manager/resident/learning.d.ts +82 -82
  73. package/dist/manager/resident/outbox.d.ts +8 -8
  74. package/dist/manager/resident/proposal.d.ts +2 -2
  75. package/dist/manager/resident/store.d.ts +10 -10
  76. package/dist/manager/session/attribution.d.ts +1 -0
  77. package/dist/manager/session/attribution.d.ts.map +1 -1
  78. package/dist/manager/session/attribution.js +9 -1
  79. package/dist/manager/session/attribution.js.map +1 -1
  80. package/dist/manager/session/streamed-message-identity.d.ts +6 -0
  81. package/dist/manager/session/streamed-message-identity.d.ts.map +1 -0
  82. package/dist/manager/session/streamed-message-identity.js +14 -0
  83. package/dist/manager/session/streamed-message-identity.js.map +1 -0
  84. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  85. package/dist/manager/session/turn-recorder.js +4 -3
  86. package/dist/manager/session/turn-recorder.js.map +1 -1
  87. package/dist/pals/activity/causality.d.ts +23 -0
  88. package/dist/pals/activity/causality.d.ts.map +1 -0
  89. package/dist/pals/activity/causality.js +205 -0
  90. package/dist/pals/activity/causality.js.map +1 -0
  91. package/dist/pals/activity/projection.d.ts +5 -0
  92. package/dist/pals/activity/projection.d.ts.map +1 -0
  93. package/dist/pals/activity/projection.js +79 -0
  94. package/dist/pals/activity/projection.js.map +1 -0
  95. package/dist/pals/activity/source.d.ts +16 -0
  96. package/dist/pals/activity/source.d.ts.map +1 -0
  97. package/dist/pals/activity/source.js +235 -0
  98. package/dist/pals/activity/source.js.map +1 -0
  99. package/dist/pals/activity/subscription-policy.d.ts +38 -0
  100. package/dist/pals/activity/subscription-policy.d.ts.map +1 -0
  101. package/dist/pals/activity/subscription-policy.js +183 -0
  102. package/dist/pals/activity/subscription-policy.js.map +1 -0
  103. package/dist/pals/activity/subscription-schema.d.ts +353 -0
  104. package/dist/pals/activity/subscription-schema.d.ts.map +1 -0
  105. package/dist/pals/activity/subscription-schema.js +24 -0
  106. package/dist/pals/activity/subscription-schema.js.map +1 -0
  107. package/dist/pals/activity/subscription-store.d.ts +25 -0
  108. package/dist/pals/activity/subscription-store.d.ts.map +1 -0
  109. package/dist/pals/activity/subscription-store.js +152 -0
  110. package/dist/pals/activity/subscription-store.js.map +1 -0
  111. package/dist/pals/activity/subscription-types.d.ts +42 -0
  112. package/dist/pals/activity/subscription-types.d.ts.map +1 -0
  113. package/dist/pals/activity/subscription-types.js +2 -0
  114. package/dist/pals/activity/subscription-types.js.map +1 -0
  115. package/dist/pals/activity/subscriptions.d.ts +32 -0
  116. package/dist/pals/activity/subscriptions.d.ts.map +1 -0
  117. package/dist/pals/activity/subscriptions.js +151 -0
  118. package/dist/pals/activity/subscriptions.js.map +1 -0
  119. package/dist/pals/activity/types.d.ts +77 -0
  120. package/dist/pals/activity/types.d.ts.map +1 -0
  121. package/dist/pals/activity/types.js +2 -0
  122. package/dist/pals/activity/types.js.map +1 -0
  123. package/dist/pals/channels/ingress.d.ts +9 -0
  124. package/dist/pals/channels/ingress.d.ts.map +1 -0
  125. package/dist/pals/channels/ingress.js +131 -0
  126. package/dist/pals/channels/ingress.js.map +1 -0
  127. package/dist/pals/channels/routes.d.ts +20 -0
  128. package/dist/pals/channels/routes.d.ts.map +1 -0
  129. package/dist/pals/channels/routes.js +111 -0
  130. package/dist/pals/channels/routes.js.map +1 -0
  131. package/dist/pals/channels/routing.d.ts +37 -0
  132. package/dist/pals/channels/routing.d.ts.map +1 -0
  133. package/dist/pals/channels/routing.js +150 -0
  134. package/dist/pals/channels/routing.js.map +1 -0
  135. package/dist/pals/channels/schema.d.ts +234 -0
  136. package/dist/pals/channels/schema.d.ts.map +1 -0
  137. package/dist/pals/channels/schema.js +94 -0
  138. package/dist/pals/channels/schema.js.map +1 -0
  139. package/dist/pals/channels/types.d.ts +115 -0
  140. package/dist/pals/channels/types.d.ts.map +1 -0
  141. package/dist/pals/channels/types.js +2 -0
  142. package/dist/pals/channels/types.js.map +1 -0
  143. package/dist/pals/communication/broker.d.ts +8 -0
  144. package/dist/pals/communication/broker.d.ts.map +1 -0
  145. package/dist/pals/communication/broker.js +121 -0
  146. package/dist/pals/communication/broker.js.map +1 -0
  147. package/dist/pals/communication/dispatch.d.ts +4 -0
  148. package/dist/pals/communication/dispatch.d.ts.map +1 -0
  149. package/dist/pals/communication/dispatch.js +57 -0
  150. package/dist/pals/communication/dispatch.js.map +1 -0
  151. package/dist/pals/communication/inbound.d.ts +9 -0
  152. package/dist/pals/communication/inbound.d.ts.map +1 -0
  153. package/dist/pals/communication/inbound.js +155 -0
  154. package/dist/pals/communication/inbound.js.map +1 -0
  155. package/dist/pals/communication/ingress-dispatch.d.ts +5 -0
  156. package/dist/pals/communication/ingress-dispatch.d.ts.map +1 -0
  157. package/dist/pals/communication/ingress-dispatch.js +51 -0
  158. package/dist/pals/communication/ingress-dispatch.js.map +1 -0
  159. package/dist/pals/communication/ingress-inbound.d.ts +9 -0
  160. package/dist/pals/communication/ingress-inbound.d.ts.map +1 -0
  161. package/dist/pals/communication/ingress-inbound.js +222 -0
  162. package/dist/pals/communication/ingress-inbound.js.map +1 -0
  163. package/dist/pals/communication/ingress-schema.d.ts +7829 -0
  164. package/dist/pals/communication/ingress-schema.d.ts.map +1 -0
  165. package/dist/pals/communication/ingress-schema.js +479 -0
  166. package/dist/pals/communication/ingress-schema.js.map +1 -0
  167. package/dist/pals/communication/ingress-types.d.ts +187 -0
  168. package/dist/pals/communication/ingress-types.d.ts.map +1 -0
  169. package/dist/pals/communication/ingress-types.js +73 -0
  170. package/dist/pals/communication/ingress-types.js.map +1 -0
  171. package/dist/pals/communication/operator.d.ts +75 -0
  172. package/dist/pals/communication/operator.d.ts.map +1 -0
  173. package/dist/pals/communication/operator.js +217 -0
  174. package/dist/pals/communication/operator.js.map +1 -0
  175. package/dist/pals/communication/policy.d.ts +41 -0
  176. package/dist/pals/communication/policy.d.ts.map +1 -0
  177. package/dist/pals/communication/policy.js +138 -0
  178. package/dist/pals/communication/policy.js.map +1 -0
  179. package/dist/pals/communication/schema.d.ts +2000 -0
  180. package/dist/pals/communication/schema.d.ts.map +1 -0
  181. package/dist/pals/communication/schema.js +170 -0
  182. package/dist/pals/communication/schema.js.map +1 -0
  183. package/dist/pals/communication/store.d.ts +61 -0
  184. package/dist/pals/communication/store.d.ts.map +1 -0
  185. package/dist/pals/communication/store.js +450 -0
  186. package/dist/pals/communication/store.js.map +1 -0
  187. package/dist/pals/communication/tools.d.ts +23 -0
  188. package/dist/pals/communication/tools.d.ts.map +1 -0
  189. package/dist/pals/communication/tools.js +107 -0
  190. package/dist/pals/communication/tools.js.map +1 -0
  191. package/dist/pals/communication/types.d.ts +168 -0
  192. package/dist/pals/communication/types.d.ts.map +1 -0
  193. package/dist/pals/communication/types.js +24 -0
  194. package/dist/pals/communication/types.js.map +1 -0
  195. package/dist/pals/communication/verify.d.ts +22 -0
  196. package/dist/pals/communication/verify.d.ts.map +1 -0
  197. package/dist/pals/communication/verify.js +142 -0
  198. package/dist/pals/communication/verify.js.map +1 -0
  199. package/dist/pals/lifecycle.d.ts +37 -0
  200. package/dist/pals/lifecycle.d.ts.map +1 -0
  201. package/dist/pals/lifecycle.js +22 -0
  202. package/dist/pals/lifecycle.js.map +1 -0
  203. package/dist/pals/prompt.d.ts +30 -0
  204. package/dist/pals/prompt.d.ts.map +1 -0
  205. package/dist/pals/prompt.js +65 -0
  206. package/dist/pals/prompt.js.map +1 -0
  207. package/dist/pals/reference-images.d.ts +44 -0
  208. package/dist/pals/reference-images.d.ts.map +1 -0
  209. package/dist/pals/reference-images.js +248 -0
  210. package/dist/pals/reference-images.js.map +1 -0
  211. package/dist/pals/runtime.d.ts +46 -0
  212. package/dist/pals/runtime.d.ts.map +1 -0
  213. package/dist/pals/runtime.js +624 -0
  214. package/dist/pals/runtime.js.map +1 -0
  215. package/dist/pals/store.d.ts +26 -0
  216. package/dist/pals/store.d.ts.map +1 -0
  217. package/dist/pals/store.js +334 -0
  218. package/dist/pals/store.js.map +1 -0
  219. package/dist/pals/types.d.ts +145 -0
  220. package/dist/pals/types.d.ts.map +1 -0
  221. package/dist/pals/types.js +2 -0
  222. package/dist/pals/types.js.map +1 -0
  223. package/dist/peers/envelope.js +1 -1
  224. package/dist/peers/envelope.js.map +1 -1
  225. package/dist/peers/protocol.d.ts +83 -83
  226. package/dist/peers/record.d.ts +10 -10
  227. package/dist/plugin/lifecycle.d.ts +14 -10
  228. package/dist/plugin/lifecycle.d.ts.map +1 -1
  229. package/dist/plugin/lifecycle.js +178 -41
  230. package/dist/plugin/lifecycle.js.map +1 -1
  231. package/dist/plugin/shell-hook.d.ts.map +1 -1
  232. package/dist/plugin/shell-hook.js +7 -2
  233. package/dist/plugin/shell-hook.js.map +1 -1
  234. package/dist/process/kill-tree.d.ts.map +1 -1
  235. package/dist/process/kill-tree.js +9 -1
  236. package/dist/process/kill-tree.js.map +1 -1
  237. package/dist/prompt/resident-learning.js +2 -2
  238. package/dist/prompt/resident-learning.js.map +1 -1
  239. package/dist/prompt/resident-step.d.ts +2 -2
  240. package/dist/prompt/resident-step.js +4 -4
  241. package/dist/prompt/resident-step.js.map +1 -1
  242. package/dist/provider/errors.d.ts +19 -0
  243. package/dist/provider/errors.d.ts.map +1 -1
  244. package/dist/provider/errors.js +123 -2
  245. package/dist/provider/errors.js.map +1 -1
  246. package/dist/public-runtime.d.ts +43 -15
  247. package/dist/public-runtime.d.ts.map +1 -1
  248. package/dist/public-runtime.js +37 -9
  249. package/dist/public-runtime.js.map +1 -1
  250. package/dist/public-tools.d.ts +8 -3
  251. package/dist/public-tools.d.ts.map +1 -1
  252. package/dist/public-tools.js +8 -3
  253. package/dist/public-tools.js.map +1 -1
  254. package/dist/public-types.d.ts +27 -7
  255. package/dist/public-types.d.ts.map +1 -1
  256. package/dist/registry/tool/presentation.d.ts +1 -0
  257. package/dist/registry/tool/presentation.d.ts.map +1 -1
  258. package/dist/registry/tool/presentation.js +9 -7
  259. package/dist/registry/tool/presentation.js.map +1 -1
  260. package/dist/registry/tool/screen.d.ts.map +1 -1
  261. package/dist/registry/tool/screen.js +33 -2
  262. package/dist/registry/tool/screen.js.map +1 -1
  263. package/dist/runtime/harness-session/index.d.ts +5 -0
  264. package/dist/runtime/harness-session/index.d.ts.map +1 -0
  265. package/dist/runtime/harness-session/index.js +928 -0
  266. package/dist/runtime/harness-session/index.js.map +1 -0
  267. package/dist/runtime/harness-session/journal.d.ts +37 -0
  268. package/dist/runtime/harness-session/journal.d.ts.map +1 -0
  269. package/dist/runtime/harness-session/journal.js +177 -0
  270. package/dist/runtime/harness-session/journal.js.map +1 -0
  271. package/dist/runtime/harness-session/saved-view.d.ts +8 -0
  272. package/dist/runtime/harness-session/saved-view.d.ts.map +1 -0
  273. package/dist/runtime/harness-session/saved-view.js +112 -0
  274. package/dist/runtime/harness-session/saved-view.js.map +1 -0
  275. package/dist/runtime/jobs/awaited-jobs.d.ts +2 -1
  276. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -1
  277. package/dist/runtime/jobs/awaited-jobs.js +2 -1
  278. package/dist/runtime/jobs/awaited-jobs.js.map +1 -1
  279. package/dist/runtime/jobs/registry.d.ts +56 -1
  280. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  281. package/dist/runtime/jobs/registry.js +377 -39
  282. package/dist/runtime/jobs/registry.js.map +1 -1
  283. package/dist/runtime/query/abandon-turn.d.ts +12 -1
  284. package/dist/runtime/query/abandon-turn.d.ts.map +1 -1
  285. package/dist/runtime/query/abandon-turn.js +3 -1
  286. package/dist/runtime/query/abandon-turn.js.map +1 -1
  287. package/dist/runtime/query/checkpoint.d.ts +4 -0
  288. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  289. package/dist/runtime/query/checkpoint.js +10 -0
  290. package/dist/runtime/query/checkpoint.js.map +1 -1
  291. package/dist/runtime/query/durable-inbound.d.ts +5 -0
  292. package/dist/runtime/query/durable-inbound.d.ts.map +1 -0
  293. package/dist/runtime/query/durable-inbound.js +89 -0
  294. package/dist/runtime/query/durable-inbound.js.map +1 -0
  295. package/dist/runtime/query/events.d.ts +4 -0
  296. package/dist/runtime/query/events.d.ts.map +1 -1
  297. package/dist/runtime/query/events.js +22 -5
  298. package/dist/runtime/query/events.js.map +1 -1
  299. package/dist/runtime/query/executor/tool-call-admission.d.ts +5 -1
  300. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  301. package/dist/runtime/query/executor/tool-call-admission.js +85 -13
  302. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  303. package/dist/runtime/query/executor.d.ts +41 -18
  304. package/dist/runtime/query/executor.d.ts.map +1 -1
  305. package/dist/runtime/query/executor.js +227 -114
  306. package/dist/runtime/query/executor.js.map +1 -1
  307. package/dist/runtime/query/index.d.ts +9 -0
  308. package/dist/runtime/query/index.d.ts.map +1 -1
  309. package/dist/runtime/query/index.js +41 -5
  310. package/dist/runtime/query/index.js.map +1 -1
  311. package/dist/runtime/query/iteration/index.d.ts +18 -6
  312. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  313. package/dist/runtime/query/iteration/index.js +176 -75
  314. package/dist/runtime/query/iteration/index.js.map +1 -1
  315. package/dist/runtime/query/iteration/outstanding-work.d.ts +9 -5
  316. package/dist/runtime/query/iteration/outstanding-work.d.ts.map +1 -1
  317. package/dist/runtime/query/iteration/outstanding-work.js +63 -6
  318. package/dist/runtime/query/iteration/outstanding-work.js.map +1 -1
  319. package/dist/runtime/query/iteration/phases/context.d.ts +8 -0
  320. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  321. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  322. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  323. package/dist/runtime/query/iteration/phases/tool-review.js +106 -17
  324. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  325. package/dist/runtime/query/iteration/step-shaping.d.ts +2 -0
  326. package/dist/runtime/query/iteration/step-shaping.d.ts.map +1 -1
  327. package/dist/runtime/query/iteration/step-shaping.js +5 -1
  328. package/dist/runtime/query/iteration/step-shaping.js.map +1 -1
  329. package/dist/runtime/query/observation-context.d.ts +2 -2
  330. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  331. package/dist/runtime/query/observation-context.js +20 -13
  332. package/dist/runtime/query/observation-context.js.map +1 -1
  333. package/dist/runtime/query/prepare-turn.js +2 -2
  334. package/dist/runtime/query/prepare-turn.js.map +1 -1
  335. package/dist/runtime/query/prompt-cache.d.ts +1 -0
  336. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  337. package/dist/runtime/query/prompt-cache.js +2 -0
  338. package/dist/runtime/query/prompt-cache.js.map +1 -1
  339. package/dist/runtime/query/prompt.d.ts +2 -0
  340. package/dist/runtime/query/prompt.d.ts.map +1 -1
  341. package/dist/runtime/query/prompt.js +23 -1
  342. package/dist/runtime/query/prompt.js.map +1 -1
  343. package/dist/runtime/query/repeat-call.d.ts +12 -3
  344. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  345. package/dist/runtime/query/repeat-call.js +33 -10
  346. package/dist/runtime/query/repeat-call.js.map +1 -1
  347. package/dist/runtime/query/resume-pending.d.ts +5 -6
  348. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  349. package/dist/runtime/query/resume-pending.js +30 -3
  350. package/dist/runtime/query/resume-pending.js.map +1 -1
  351. package/dist/runtime/query/resume-session.js +1 -1
  352. package/dist/runtime/query/resume-session.js.map +1 -1
  353. package/dist/runtime/query/review-policy.d.ts +8 -1
  354. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  355. package/dist/runtime/query/review-policy.js +6 -0
  356. package/dist/runtime/query/review-policy.js.map +1 -1
  357. package/dist/runtime/query/saved-presentation.d.ts +13 -0
  358. package/dist/runtime/query/saved-presentation.d.ts.map +1 -0
  359. package/dist/runtime/query/saved-presentation.js +63 -0
  360. package/dist/runtime/query/saved-presentation.js.map +1 -0
  361. package/dist/runtime/query/steering.d.ts +6 -9
  362. package/dist/runtime/query/steering.d.ts.map +1 -1
  363. package/dist/runtime/query/steering.js.map +1 -1
  364. package/dist/runtime/query/tool-executions.d.ts +7 -3
  365. package/dist/runtime/query/tool-executions.d.ts.map +1 -1
  366. package/dist/runtime/query/tool-executions.js +89 -9
  367. package/dist/runtime/query/tool-executions.js.map +1 -1
  368. package/dist/runtime/query/tooling.d.ts +3 -1
  369. package/dist/runtime/query/tooling.d.ts.map +1 -1
  370. package/dist/runtime/query/tooling.js +3 -0
  371. package/dist/runtime/query/tooling.js.map +1 -1
  372. package/dist/scheduler/completion-inbox.d.ts +25 -1
  373. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  374. package/dist/scheduler/completion-inbox.js +102 -8
  375. package/dist/scheduler/completion-inbox.js.map +1 -1
  376. package/dist/scheduler/delegating.d.ts.map +1 -1
  377. package/dist/scheduler/delegating.js +5 -0
  378. package/dist/scheduler/delegating.js.map +1 -1
  379. package/dist/scheduler/local.d.ts.map +1 -1
  380. package/dist/scheduler/local.js +2 -0
  381. package/dist/scheduler/local.js.map +1 -1
  382. package/dist/session/summary/materialize.d.ts +10 -6
  383. package/dist/session/summary/materialize.d.ts.map +1 -1
  384. package/dist/session/summary/materialize.js +41 -8
  385. package/dist/session/summary/materialize.js.map +1 -1
  386. package/dist/store/budget/ledger.d.ts +9 -0
  387. package/dist/store/budget/ledger.d.ts.map +1 -1
  388. package/dist/store/budget/ledger.js +58 -6
  389. package/dist/store/budget/ledger.js.map +1 -1
  390. package/dist/store/evidence/index-page.d.ts +12 -12
  391. package/dist/store/evidence/source-text.d.ts +4 -4
  392. package/dist/store/index.d.ts +1 -0
  393. package/dist/store/index.d.ts.map +1 -1
  394. package/dist/store/index.js +1 -0
  395. package/dist/store/index.js.map +1 -1
  396. package/dist/store/memory/disk.d.ts +7 -2
  397. package/dist/store/memory/disk.d.ts.map +1 -1
  398. package/dist/store/memory/disk.js +58 -5
  399. package/dist/store/memory/disk.js.map +1 -1
  400. package/dist/store/memory/index.d.ts +9 -0
  401. package/dist/store/memory/index.d.ts.map +1 -1
  402. package/dist/store/memory/index.js +43 -5
  403. package/dist/store/memory/index.js.map +1 -1
  404. package/dist/store/memory/markdown.d.ts +7 -2
  405. package/dist/store/memory/markdown.d.ts.map +1 -1
  406. package/dist/store/memory/markdown.js +33 -0
  407. package/dist/store/memory/markdown.js.map +1 -1
  408. package/dist/store/memory/memory.d.ts +7 -2
  409. package/dist/store/memory/memory.d.ts.map +1 -1
  410. package/dist/store/memory/memory.js +34 -0
  411. package/dist/store/memory/memory.js.map +1 -1
  412. package/dist/store/memory/revision.d.ts +16 -0
  413. package/dist/store/memory/revision.d.ts.map +1 -0
  414. package/dist/store/memory/revision.js +144 -0
  415. package/dist/store/memory/revision.js.map +1 -0
  416. package/dist/store/session/disk.d.ts +9 -4
  417. package/dist/store/session/disk.d.ts.map +1 -1
  418. package/dist/store/session/disk.js +57 -11
  419. package/dist/store/session/disk.js.map +1 -1
  420. package/dist/store/session/memory.d.ts +5 -3
  421. package/dist/store/session/memory.d.ts.map +1 -1
  422. package/dist/store/session/memory.js +24 -7
  423. package/dist/store/session/memory.js.map +1 -1
  424. package/dist/store/session-log/core.d.ts +26 -6
  425. package/dist/store/session-log/core.d.ts.map +1 -1
  426. package/dist/store/session-log/core.js +61 -8
  427. package/dist/store/session-log/core.js.map +1 -1
  428. package/dist/store/session-log/disk.d.ts +2 -2
  429. package/dist/store/session-log/disk.d.ts.map +1 -1
  430. package/dist/store/session-log/disk.js +1 -0
  431. package/dist/store/session-log/disk.js.map +1 -1
  432. package/dist/store/session-log/fold.d.ts +7 -0
  433. package/dist/store/session-log/fold.d.ts.map +1 -1
  434. package/dist/store/session-log/fold.js +21 -0
  435. package/dist/store/session-log/fold.js.map +1 -1
  436. package/dist/store/session-log/index.d.ts +5 -3
  437. package/dist/store/session-log/index.d.ts.map +1 -1
  438. package/dist/store/session-log/index.js +3 -1
  439. package/dist/store/session-log/index.js.map +1 -1
  440. package/dist/store/session-log/memory.d.ts +1 -1
  441. package/dist/store/session-log/memory.d.ts.map +1 -1
  442. package/dist/store/session-log/memory.js +1 -0
  443. package/dist/store/session-log/memory.js.map +1 -1
  444. package/dist/store/session-log/spill.d.ts +10 -3
  445. package/dist/store/session-log/spill.d.ts.map +1 -1
  446. package/dist/store/session-log/spill.js +70 -5
  447. package/dist/store/session-log/spill.js.map +1 -1
  448. package/dist/store/session-log/structured-result.d.ts +21 -0
  449. package/dist/store/session-log/structured-result.d.ts.map +1 -0
  450. package/dist/store/session-log/structured-result.js +67 -0
  451. package/dist/store/session-log/structured-result.js.map +1 -0
  452. package/dist/store/task/disk.d.ts +11 -0
  453. package/dist/store/task/disk.d.ts.map +1 -1
  454. package/dist/store/task/disk.js +41 -2
  455. package/dist/store/task/disk.js.map +1 -1
  456. package/dist/store/task/memory.d.ts.map +1 -1
  457. package/dist/store/task/memory.js +15 -3
  458. package/dist/store/task/memory.js.map +1 -1
  459. package/dist/tools/admit-facts.d.ts +13 -0
  460. package/dist/tools/admit-facts.d.ts.map +1 -0
  461. package/dist/tools/admit-facts.js +142 -0
  462. package/dist/tools/admit-facts.js.map +1 -0
  463. package/dist/tools/builtins/bash.d.ts +4 -1
  464. package/dist/tools/builtins/bash.d.ts.map +1 -1
  465. package/dist/tools/builtins/bash.js +108 -22
  466. package/dist/tools/builtins/bash.js.map +1 -1
  467. package/dist/tools/builtins/browser.d.ts +10 -10
  468. package/dist/tools/builtins/computer-use.d.ts +90 -90
  469. package/dist/tools/builtins/edit.d.ts +17 -0
  470. package/dist/tools/builtins/edit.d.ts.map +1 -1
  471. package/dist/tools/builtins/edit.js +34 -0
  472. package/dist/tools/builtins/edit.js.map +1 -1
  473. package/dist/tools/builtins/file-write-result.d.ts.map +1 -1
  474. package/dist/tools/builtins/file-write-result.js +13 -0
  475. package/dist/tools/builtins/file-write-result.js.map +1 -1
  476. package/dist/tools/builtins/glob.d.ts.map +1 -1
  477. package/dist/tools/builtins/glob.js +12 -0
  478. package/dist/tools/builtins/glob.js.map +1 -1
  479. package/dist/tools/builtins/grep.d.ts.map +1 -1
  480. package/dist/tools/builtins/grep.js +14 -0
  481. package/dist/tools/builtins/grep.js.map +1 -1
  482. package/dist/tools/builtins/index.d.ts +2 -0
  483. package/dist/tools/builtins/index.d.ts.map +1 -1
  484. package/dist/tools/builtins/index.js +1 -0
  485. package/dist/tools/builtins/index.js.map +1 -1
  486. package/dist/tools/builtins/job.d.ts.map +1 -1
  487. package/dist/tools/builtins/job.js +4 -1
  488. package/dist/tools/builtins/job.js.map +1 -1
  489. package/dist/tools/builtins/lsp.d.ts +2 -2
  490. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  491. package/dist/tools/builtins/read-file.js +49 -0
  492. package/dist/tools/builtins/read-file.js.map +1 -1
  493. package/dist/tools/builtins/view-image.d.ts +24 -0
  494. package/dist/tools/builtins/view-image.d.ts.map +1 -0
  495. package/dist/tools/builtins/view-image.js +385 -0
  496. package/dist/tools/builtins/view-image.js.map +1 -0
  497. package/dist/tools/builtins/wait-for-job-bounds.d.ts +8 -4
  498. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -1
  499. package/dist/tools/builtins/wait-for-job-bounds.js +43 -8
  500. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -1
  501. package/dist/tools/builtins/wait-for-job.d.ts +3 -0
  502. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -1
  503. package/dist/tools/builtins/wait-for-job.js +127 -15
  504. package/dist/tools/builtins/wait-for-job.js.map +1 -1
  505. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  506. package/dist/tools/builtins/write-file.js +1 -0
  507. package/dist/tools/builtins/write-file.js.map +1 -1
  508. package/dist/tools/command-shell.d.ts +37 -2
  509. package/dist/tools/command-shell.d.ts.map +1 -1
  510. package/dist/tools/command-shell.js +100 -3
  511. package/dist/tools/command-shell.js.map +1 -1
  512. package/dist/tools/coordinator/agent.d.ts +9 -19
  513. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  514. package/dist/tools/coordinator/agent.js.map +1 -1
  515. package/dist/tools/coordinator/index.d.ts.map +1 -1
  516. package/dist/tools/coordinator/index.js +127 -67
  517. package/dist/tools/coordinator/index.js.map +1 -1
  518. package/dist/tools/coordinator/wait-with-idle-bound.d.ts +2 -0
  519. package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -1
  520. package/dist/tools/coordinator/wait-with-idle-bound.js +1 -1
  521. package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -1
  522. package/dist/tools/defineTool.d.ts.map +1 -1
  523. package/dist/tools/defineTool.js +4 -0
  524. package/dist/tools/defineTool.js.map +1 -1
  525. package/dist/tools/failure-facts.d.ts +8 -0
  526. package/dist/tools/failure-facts.d.ts.map +1 -0
  527. package/dist/tools/failure-facts.js +24 -0
  528. package/dist/tools/failure-facts.js.map +1 -0
  529. package/dist/tools/host-output.d.ts +24 -0
  530. package/dist/tools/host-output.d.ts.map +1 -0
  531. package/dist/tools/host-output.js +117 -0
  532. package/dist/tools/host-output.js.map +1 -0
  533. package/dist/tools/memory/delete.d.ts.map +1 -1
  534. package/dist/tools/memory/delete.js +38 -3
  535. package/dist/tools/memory/delete.js.map +1 -1
  536. package/dist/tools/memory/read.d.ts.map +1 -1
  537. package/dist/tools/memory/read.js +38 -2
  538. package/dist/tools/memory/read.js.map +1 -1
  539. package/dist/tools/memory/search.d.ts.map +1 -1
  540. package/dist/tools/memory/search.js +38 -7
  541. package/dist/tools/memory/search.js.map +1 -1
  542. package/dist/tools/memory/update.d.ts.map +1 -1
  543. package/dist/tools/memory/update.js +30 -3
  544. package/dist/tools/memory/update.js.map +1 -1
  545. package/dist/tools/oem-code-pages.d.ts +8 -0
  546. package/dist/tools/oem-code-pages.d.ts.map +1 -0
  547. package/dist/tools/oem-code-pages.js +23 -0
  548. package/dist/tools/oem-code-pages.js.map +1 -0
  549. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  550. package/dist/tools/schedules/schedule-tool.js +35 -6
  551. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  552. package/dist/tools/schedules/types.d.ts +23 -3
  553. package/dist/tools/schedules/types.d.ts.map +1 -1
  554. package/dist/tools/task/list.d.ts.map +1 -1
  555. package/dist/tools/task/list.js +14 -6
  556. package/dist/tools/task/list.js.map +1 -1
  557. package/dist/tools/task/present.d.ts.map +1 -1
  558. package/dist/tools/task/present.js +26 -6
  559. package/dist/tools/task/present.js.map +1 -1
  560. package/dist/tools/task/update.d.ts.map +1 -1
  561. package/dist/tools/task/update.js +12 -5
  562. package/dist/tools/task/update.js.map +1 -1
  563. package/dist/tools/text-window.d.ts +19 -0
  564. package/dist/tools/text-window.d.ts.map +1 -0
  565. package/dist/tools/text-window.js +83 -0
  566. package/dist/tools/text-window.js.map +1 -0
  567. package/dist/toolsets/manager.d.ts +24 -0
  568. package/dist/toolsets/manager.d.ts.map +1 -1
  569. package/dist/toolsets/manager.js +105 -2
  570. package/dist/toolsets/manager.js.map +1 -1
  571. package/dist/turn/memory-recall.d.ts +2 -0
  572. package/dist/turn/memory-recall.d.ts.map +1 -1
  573. package/dist/turn/memory-recall.js +3 -1
  574. package/dist/turn/memory-recall.js.map +1 -1
  575. package/dist/types/acp/index.d.ts +137 -1
  576. package/dist/types/acp/index.d.ts.map +1 -1
  577. package/dist/types/agent/base.d.ts +3 -0
  578. package/dist/types/agent/base.d.ts.map +1 -1
  579. package/dist/types/agent/manager.d.ts +8 -23
  580. package/dist/types/agent/manager.d.ts.map +1 -1
  581. package/dist/types/agent/scheduler.d.ts +10 -1
  582. package/dist/types/agent/scheduler.d.ts.map +1 -1
  583. package/dist/types/agent/task.d.ts +4 -0
  584. package/dist/types/agent/task.d.ts.map +1 -1
  585. package/dist/types/authorization/index.d.ts +30 -30
  586. package/dist/types/connector/mcp.d.ts +7 -0
  587. package/dist/types/connector/mcp.d.ts.map +1 -1
  588. package/dist/types/errors/catalog.d.ts.map +1 -1
  589. package/dist/types/errors/catalog.js +4 -2
  590. package/dist/types/errors/catalog.js.map +1 -1
  591. package/dist/types/harness/schema.d.ts +354 -0
  592. package/dist/types/harness/schema.d.ts.map +1 -0
  593. package/dist/types/harness/schema.js +203 -0
  594. package/dist/types/harness/schema.js.map +1 -0
  595. package/dist/types/harness/session.d.ts +278 -0
  596. package/dist/types/harness/session.d.ts.map +1 -0
  597. package/dist/types/harness/session.js +2 -0
  598. package/dist/types/harness/session.js.map +1 -0
  599. package/dist/types/hitl/index.d.ts +12 -0
  600. package/dist/types/hitl/index.d.ts.map +1 -1
  601. package/dist/types/hitl/index.js.map +1 -1
  602. package/dist/types/job/index.d.ts +47 -0
  603. package/dist/types/job/index.d.ts.map +1 -0
  604. package/dist/types/job/index.js +2 -0
  605. package/dist/types/job/index.js.map +1 -0
  606. package/dist/types/memory/index.d.ts +29 -0
  607. package/dist/types/memory/index.d.ts.map +1 -1
  608. package/dist/types/memory/index.js +6 -0
  609. package/dist/types/memory/index.js.map +1 -1
  610. package/dist/types/message/inbound-delivery.d.ts +44 -0
  611. package/dist/types/message/inbound-delivery.d.ts.map +1 -0
  612. package/dist/types/message/inbound-delivery.js +14 -0
  613. package/dist/types/message/inbound-delivery.js.map +1 -0
  614. package/dist/types/message/index.d.ts +4 -1
  615. package/dist/types/message/index.d.ts.map +1 -1
  616. package/dist/types/message/index.js +5 -1
  617. package/dist/types/message/index.js.map +1 -1
  618. package/dist/types/plugin/index.d.ts +18 -8
  619. package/dist/types/plugin/index.d.ts.map +1 -1
  620. package/dist/types/plugin/index.js +5 -2
  621. package/dist/types/plugin/index.js.map +1 -1
  622. package/dist/types/sandbox/index.d.ts +39 -2
  623. package/dist/types/sandbox/index.d.ts.map +1 -1
  624. package/dist/types/sandbox/index.js.map +1 -1
  625. package/dist/types/session/checkpoint.d.ts +24 -17
  626. package/dist/types/session/checkpoint.d.ts.map +1 -1
  627. package/dist/types/session/checkpoint.js +1 -0
  628. package/dist/types/session/checkpoint.js.map +1 -1
  629. package/dist/types/session/events.d.ts +23 -1
  630. package/dist/types/session/events.d.ts.map +1 -1
  631. package/dist/types/session/events.js.map +1 -1
  632. package/dist/types/session/records.d.ts +1514 -565
  633. package/dist/types/session/records.d.ts.map +1 -1
  634. package/dist/types/session/records.js +89 -1
  635. package/dist/types/session/records.js.map +1 -1
  636. package/dist/types/session/step.d.ts +2 -0
  637. package/dist/types/session/step.d.ts.map +1 -1
  638. package/dist/types/session/step.js.map +1 -1
  639. package/dist/types/session/store.d.ts +19 -10
  640. package/dist/types/session/store.d.ts.map +1 -1
  641. package/dist/types/session/tool-execution.d.ts +6 -0
  642. package/dist/types/session/tool-execution.d.ts.map +1 -1
  643. package/dist/types/structured-output/index.d.ts +12 -2
  644. package/dist/types/structured-output/index.d.ts.map +1 -1
  645. package/dist/types/summary/ref.d.ts +3 -1
  646. package/dist/types/summary/ref.d.ts.map +1 -1
  647. package/dist/types/tool/index.d.ts +32 -4
  648. package/dist/types/tool/index.d.ts.map +1 -1
  649. package/dist/types/tool/index.js.map +1 -1
  650. package/dist/types/tool/presentation.d.ts +106 -0
  651. package/dist/types/tool/presentation.d.ts.map +1 -1
  652. package/dist/utils/json-snapshot.d.ts +6 -2
  653. package/dist/utils/json-snapshot.d.ts.map +1 -1
  654. package/dist/utils/json-snapshot.js +19 -9
  655. package/dist/utils/json-snapshot.js.map +1 -1
  656. package/dist/utils/structured-result-json.d.ts +5 -0
  657. package/dist/utils/structured-result-json.d.ts.map +1 -0
  658. package/dist/utils/structured-result-json.js +10 -0
  659. package/dist/utils/structured-result-json.js.map +1 -0
  660. package/package.json +1 -1
  661. package/src/agents/QueryAgent.ts +1 -0
  662. package/src/agents/examples/SupervisorAgent.ts +1 -0
  663. package/src/agents/runAgent.ts +3 -0
  664. package/src/authorization/shell-lexer.ts +16 -1
  665. package/src/bridge/acp/permission.ts +17 -3
  666. package/src/bridge/acp/server.ts +271 -25
  667. package/src/bridge/acp/tasks.ts +23 -0
  668. package/src/bridge/acp/update.ts +167 -13
  669. package/src/config/registry.ts +24 -3
  670. package/src/connector/mcp/adapter.ts +16 -4
  671. package/src/connector/mcp/client.ts +6 -2
  672. package/src/connector/mcp/discovery.ts +29 -8
  673. package/src/connector/mcp/mcp-toolset.ts +25 -4
  674. package/src/connector/mcp/reconnect.ts +34 -4
  675. package/src/constants/acp/index.ts +4 -0
  676. package/src/manager/agent/lifecycle.ts +230 -3
  677. package/src/manager/plan/lifecycle.ts +11 -9
  678. package/src/manager/session/attribution.ts +12 -2
  679. package/src/manager/session/streamed-message-identity.ts +21 -0
  680. package/src/manager/session/turn-recorder.ts +4 -3
  681. package/src/pals/activity/causality.ts +261 -0
  682. package/src/pals/activity/projection.ts +89 -0
  683. package/src/pals/activity/source.ts +240 -0
  684. package/src/pals/activity/subscription-policy.ts +230 -0
  685. package/src/pals/activity/subscription-schema.ts +27 -0
  686. package/src/pals/activity/subscription-store.ts +172 -0
  687. package/src/pals/activity/subscription-types.ts +48 -0
  688. package/src/pals/activity/subscriptions.ts +209 -0
  689. package/src/pals/activity/types.ts +108 -0
  690. package/src/pals/channels/ingress.ts +153 -0
  691. package/src/pals/channels/routes.ts +118 -0
  692. package/src/pals/channels/routing.ts +197 -0
  693. package/src/pals/channels/schema.ts +108 -0
  694. package/src/pals/channels/types.ts +156 -0
  695. package/src/pals/communication/broker.ts +131 -0
  696. package/src/pals/communication/dispatch.ts +66 -0
  697. package/src/pals/communication/inbound.ts +193 -0
  698. package/src/pals/communication/ingress-dispatch.ts +63 -0
  699. package/src/pals/communication/ingress-inbound.ts +269 -0
  700. package/src/pals/communication/ingress-schema.ts +526 -0
  701. package/src/pals/communication/ingress-types.ts +336 -0
  702. package/src/pals/communication/operator.ts +315 -0
  703. package/src/pals/communication/policy.ts +174 -0
  704. package/src/pals/communication/schema.ts +173 -0
  705. package/src/pals/communication/store.ts +577 -0
  706. package/src/pals/communication/tools.ts +139 -0
  707. package/src/pals/communication/types.ts +227 -0
  708. package/src/pals/communication/verify.ts +220 -0
  709. package/src/pals/lifecycle.ts +54 -0
  710. package/src/pals/prompt.ts +101 -0
  711. package/src/pals/reference-images.ts +322 -0
  712. package/src/pals/runtime.ts +670 -0
  713. package/src/pals/store.ts +369 -0
  714. package/src/pals/types.ts +157 -0
  715. package/src/peers/envelope.ts +1 -1
  716. package/src/plugin/lifecycle.ts +217 -46
  717. package/src/plugin/shell-hook.ts +8 -2
  718. package/src/process/kill-tree.ts +10 -1
  719. package/src/prompt/resident-learning.ts +2 -2
  720. package/src/prompt/resident-step.ts +4 -4
  721. package/src/provider/errors.ts +135 -2
  722. package/src/public-runtime.ts +119 -12
  723. package/src/public-tools.ts +13 -1
  724. package/src/public-types.ts +69 -7
  725. package/src/registry/tool/presentation.ts +9 -4
  726. package/src/registry/tool/screen.ts +34 -2
  727. package/src/runtime/harness-session/index.ts +1125 -0
  728. package/src/runtime/harness-session/journal.ts +209 -0
  729. package/src/runtime/harness-session/saved-view.ts +122 -0
  730. package/src/runtime/jobs/awaited-jobs.ts +2 -1
  731. package/src/runtime/jobs/registry.ts +423 -50
  732. package/src/runtime/query/abandon-turn.ts +18 -2
  733. package/src/runtime/query/checkpoint.ts +11 -0
  734. package/src/runtime/query/durable-inbound.ts +101 -0
  735. package/src/runtime/query/events.ts +22 -5
  736. package/src/runtime/query/executor/tool-call-admission.ts +125 -32
  737. package/src/runtime/query/executor.ts +316 -130
  738. package/src/runtime/query/index.ts +48 -5
  739. package/src/runtime/query/iteration/index.ts +253 -114
  740. package/src/runtime/query/iteration/outstanding-work.ts +57 -7
  741. package/src/runtime/query/iteration/phases/context.ts +8 -0
  742. package/src/runtime/query/iteration/phases/tool-review.ts +124 -22
  743. package/src/runtime/query/iteration/step-shaping.ts +9 -1
  744. package/src/runtime/query/observation-context.ts +22 -16
  745. package/src/runtime/query/prepare-turn.ts +2 -2
  746. package/src/runtime/query/prompt-cache.ts +3 -0
  747. package/src/runtime/query/prompt.ts +32 -1
  748. package/src/runtime/query/repeat-call.ts +40 -10
  749. package/src/runtime/query/resume-pending.ts +60 -7
  750. package/src/runtime/query/resume-session.ts +1 -1
  751. package/src/runtime/query/review-policy.ts +23 -2
  752. package/src/runtime/query/saved-presentation.ts +70 -0
  753. package/src/runtime/query/steering.ts +6 -9
  754. package/src/runtime/query/tool-executions.ts +108 -9
  755. package/src/runtime/query/tooling.ts +6 -1
  756. package/src/scheduler/completion-inbox.ts +108 -7
  757. package/src/scheduler/delegating.ts +5 -0
  758. package/src/scheduler/local.ts +2 -0
  759. package/src/session/summary/materialize.ts +51 -9
  760. package/src/store/budget/ledger.ts +60 -5
  761. package/src/store/index.ts +1 -0
  762. package/src/store/memory/disk.ts +82 -7
  763. package/src/store/memory/index.ts +66 -7
  764. package/src/store/memory/markdown.ts +54 -2
  765. package/src/store/memory/memory.ts +52 -2
  766. package/src/store/memory/revision.ts +158 -0
  767. package/src/store/session/disk.ts +77 -10
  768. package/src/store/session/memory.ts +32 -7
  769. package/src/store/session-log/core.ts +118 -11
  770. package/src/store/session-log/disk.ts +9 -2
  771. package/src/store/session-log/fold.ts +22 -0
  772. package/src/store/session-log/index.ts +5 -0
  773. package/src/store/session-log/memory.ts +2 -1
  774. package/src/store/session-log/spill.ts +89 -6
  775. package/src/store/session-log/structured-result.ts +96 -0
  776. package/src/store/task/disk.ts +46 -2
  777. package/src/store/task/memory.ts +13 -3
  778. package/src/tools/admit-facts.ts +145 -0
  779. package/src/tools/builtins/bash.ts +132 -24
  780. package/src/tools/builtins/edit.ts +42 -0
  781. package/src/tools/builtins/file-write-result.ts +14 -0
  782. package/src/tools/builtins/glob.ts +12 -0
  783. package/src/tools/builtins/grep.ts +14 -0
  784. package/src/tools/builtins/index.ts +2 -0
  785. package/src/tools/builtins/job.ts +4 -1
  786. package/src/tools/builtins/read-file.ts +57 -0
  787. package/src/tools/builtins/view-image.ts +409 -0
  788. package/src/tools/builtins/wait-for-job-bounds.ts +45 -7
  789. package/src/tools/builtins/wait-for-job.ts +159 -36
  790. package/src/tools/builtins/write-file.ts +4 -2
  791. package/src/tools/command-shell.ts +132 -5
  792. package/src/tools/coordinator/agent.ts +9 -19
  793. package/src/tools/coordinator/index.ts +150 -75
  794. package/src/tools/coordinator/wait-with-idle-bound.ts +3 -1
  795. package/src/tools/defineTool.ts +4 -0
  796. package/src/tools/failure-facts.ts +24 -0
  797. package/src/tools/host-output.ts +136 -0
  798. package/src/tools/memory/delete.ts +33 -3
  799. package/src/tools/memory/read.ts +35 -2
  800. package/src/tools/memory/search.ts +38 -7
  801. package/src/tools/memory/update.ts +28 -3
  802. package/src/tools/oem-code-pages.ts +22 -0
  803. package/src/tools/schedules/schedule-tool.ts +38 -5
  804. package/src/tools/schedules/types.ts +23 -3
  805. package/src/tools/task/list.ts +15 -7
  806. package/src/tools/task/present.ts +37 -7
  807. package/src/tools/task/update.ts +12 -5
  808. package/src/tools/text-window.ts +87 -0
  809. package/src/toolsets/manager.ts +132 -2
  810. package/src/turn/memory-recall.ts +5 -1
  811. package/src/types/acp/index.ts +150 -4
  812. package/src/types/agent/base.ts +3 -0
  813. package/src/types/agent/manager.ts +8 -23
  814. package/src/types/agent/scheduler.ts +10 -1
  815. package/src/types/agent/task.ts +4 -0
  816. package/src/types/connector/mcp.ts +7 -0
  817. package/src/types/errors/catalog.ts +4 -2
  818. package/src/types/harness/schema.ts +203 -0
  819. package/src/types/harness/session.ts +306 -0
  820. package/src/types/hitl/index.ts +17 -1
  821. package/src/types/job/index.ts +42 -0
  822. package/src/types/memory/index.ts +43 -0
  823. package/src/types/message/inbound-delivery.ts +63 -0
  824. package/src/types/message/index.ts +8 -1
  825. package/src/types/plugin/index.ts +11 -6
  826. package/src/types/sandbox/index.ts +46 -0
  827. package/src/types/session/checkpoint.ts +4 -1
  828. package/src/types/session/events.ts +23 -1
  829. package/src/types/session/records.ts +114 -2
  830. package/src/types/session/step.ts +2 -0
  831. package/src/types/session/store.ts +23 -9
  832. package/src/types/session/tool-execution.ts +6 -0
  833. package/src/types/structured-output/index.ts +13 -2
  834. package/src/types/summary/ref.ts +3 -1
  835. package/src/types/tool/index.ts +39 -5
  836. package/src/types/tool/presentation.ts +121 -0
  837. package/src/utils/json-snapshot.ts +26 -9
  838. package/src/utils/structured-result-json.ts +10 -0
@@ -1,4 +1,5 @@
1
1
  import type { BackgroundJobRegistryRef } from '../../types/tool/index.js'
2
+ import { subscribeToAbort } from '../../utils/abort.js'
2
3
 
3
4
  /**
4
5
  * Waiting on a background job, bounded by two different questions — the
@@ -42,6 +43,8 @@ interface JobWaitProgress {
42
43
  readonly output: string
43
44
  readonly nextOffset: number
44
45
  readonly droppedBytes: number
46
+ /** Earlier bytes omitted from this wait's own bounded output, separately from registry loss. */
47
+ readonly omittedOutputBytes: number
45
48
  }
46
49
 
47
50
  export type JobWaitOutcome =
@@ -49,6 +52,8 @@ export type JobWaitOutcome =
49
52
  readonly kind: 'exited'
50
53
  readonly status: string
51
54
  readonly exitCode?: number
55
+ /** Why the command never started, when it could not. */
56
+ readonly error?: string
52
57
  } & JobWaitProgress)
53
58
  | ({
54
59
  readonly kind: 'timeout'
@@ -67,12 +72,27 @@ export type JobWaitOutcome =
67
72
  */
68
73
  const POLL_INTERVAL_MS = 1_000
69
74
 
75
+ /** Leave room for the status and recovery instructions inside the tool-result budget. */
76
+ const MAX_WAIT_OUTPUT_BYTES = 32 * 1024
77
+
78
+ function boundedTail(value: string): { output: string; omittedBytes: number } {
79
+ const bytes = Buffer.from(value, 'utf8')
80
+ if (bytes.length <= MAX_WAIT_OUTPUT_BYTES) return { output: value, omittedBytes: 0 }
81
+ let start = bytes.length - MAX_WAIT_OUTPUT_BYTES
82
+ // The cap is in bytes, but the displayed tail must begin at a UTF-8 character.
83
+ while (start < bytes.length && ((bytes[start] ?? 0) & 0xc0) === 0x80) start++
84
+ return {
85
+ output: bytes.subarray(start).toString('utf8'),
86
+ omittedBytes: start,
87
+ }
88
+ }
89
+
70
90
  /**
71
- * Await a job under both bounds, accumulating its output as it goes.
91
+ * Await a job under both bounds, retaining a bounded tail as it goes.
72
92
  *
73
- * Returns the output gathered so far either way: a completed wait has all
74
- * of it, and a timed-out one has everything read up to the moment it gave
75
- * up, so the caller never has to throw away a partial answer.
93
+ * A completed or timed-out wait returns the bytes it observed up to its
94
+ * absolute cursor. If the displayed tail could not hold all of them, its
95
+ * omitted-byte count keeps that gap visible to the caller.
76
96
  */
77
97
  export async function waitForJobWithBounds(
78
98
  jobs: Pick<BackgroundJobRegistryRef, 'read' | 'waitForExit'>,
@@ -90,8 +110,16 @@ export async function waitForJobWithBounds(
90
110
  let cursor = options.fromOffset ?? 0
91
111
  let output = ''
92
112
  let droppedBytes = 0
113
+ let omittedOutputBytes = 0
93
114
  let settled = false
94
115
  let poll: ReturnType<typeof setInterval> | undefined
116
+ // Each bounded wait owns its exit subscription. A timeout must release that
117
+ // subscription even when the job itself runs forever.
118
+ const waitAbort = new AbortController()
119
+ const forwardAbort = (): void => waitAbort.abort(options.signal?.reason)
120
+ let disposeCallerAbort = () => {}
121
+ if (options.signal?.aborted) forwardAbort()
122
+ else if (options.signal) disposeCallerAbort = subscribeToAbort(options.signal, forwardAbort)
95
123
 
96
124
  /** Read whatever is new since `cursor`, and count it as progress if it is. */
97
125
  const drain = (): void => {
@@ -99,11 +127,15 @@ export async function waitForJobWithBounds(
99
127
  if (chunk.droppedBytes > 0) droppedBytes += chunk.droppedBytes
100
128
  if (chunk.nextOffset > cursor) lastProgressAt = now()
101
129
  cursor = chunk.nextOffset
102
- if (chunk.chunk) output += chunk.chunk
130
+ if (chunk.chunk) {
131
+ const bounded = boundedTail(output + chunk.chunk)
132
+ output = bounded.output
133
+ omittedOutputBytes += bounded.omittedBytes
134
+ }
103
135
  }
104
136
 
105
137
  try {
106
- const exited = waitForExit(id, { signal: options.signal }).then((job): JobWaitOutcome => {
138
+ const exited = waitForExit(id, { signal: waitAbort.signal }).then((job): JobWaitOutcome => {
107
139
  // One last read: the job can exit between ticks, and the bytes
108
140
  // it wrote in its final moment are exactly the ones a caller
109
141
  // most wants — the error, the summary line, the exit trace.
@@ -112,9 +144,11 @@ export async function waitForJobWithBounds(
112
144
  kind: 'exited',
113
145
  status: job.status,
114
146
  ...(job.exitCode === undefined ? {} : { exitCode: job.exitCode }),
147
+ ...(job.error === undefined ? {} : { error: job.error }),
115
148
  output,
116
149
  nextOffset: cursor,
117
150
  droppedBytes,
151
+ omittedOutputBytes,
118
152
  }
119
153
  })
120
154
 
@@ -136,6 +170,7 @@ export async function waitForJobWithBounds(
136
170
  output,
137
171
  nextOffset: cursor,
138
172
  droppedBytes,
173
+ omittedOutputBytes,
139
174
  })
140
175
  return
141
176
  }
@@ -150,6 +185,7 @@ export async function waitForJobWithBounds(
150
185
  output,
151
186
  nextOffset: cursor,
152
187
  droppedBytes,
188
+ omittedOutputBytes,
153
189
  })
154
190
  }
155
191
  }
@@ -165,6 +201,8 @@ export async function waitForJobWithBounds(
165
201
  } finally {
166
202
  settled = true
167
203
  if (poll !== undefined) clearInterval(poll)
204
+ disposeCallerAbort()
205
+ waitAbort.abort(new Error('Job wait finished'))
168
206
  }
169
207
  }
170
208
 
@@ -174,7 +212,7 @@ export function describeJobWaitTimeout(
174
212
  outcome: Extract<JobWaitOutcome, { kind: 'timeout' }>,
175
213
  ): string {
176
214
  const seconds = Math.round(outcome.elapsedMs / 1000)
177
- const resume = `call wait_for_job again, or job read with from_offset ${outcome.nextOffset}, to see what it does next`
215
+ const resume = `call wait_for_job or job read with from_offset ${outcome.nextOffset} to see only what comes next`
178
216
  if (outcome.cause === 'idle') {
179
217
  return `Job ${id} went quiet: no new output for a while, after ${seconds}s. It has not been stopped and may still be working — ${resume}.`
180
218
  }
@@ -33,34 +33,69 @@ const DEFAULT_IDLE_TIMEOUT_MS = readPositiveIntEnv('NAMZU_JOB_WAIT_IDLE_MS', 2 *
33
33
  */
34
34
  const MAX_WAIT_MS = readPositiveIntEnv('NAMZU_JOB_WAIT_MAX_MS', 60 * 60 * 1000)
35
35
 
36
- const inputSchema = z.object({
37
- id: z.string().describe('The job id, as returned by bash with run_in_background.'),
38
- timeout_ms: z
39
- .number()
40
- .int()
41
- .positive()
42
- .max(MAX_WAIT_MS)
43
- .optional()
44
- .describe(
45
- `Give up after this long even if the job keeps producing output, in milliseconds. Default: ${DEFAULT_TIMEOUT_MS}, maximum: ${MAX_WAIT_MS}. The job is never stopped by this running out.`,
46
- ),
47
- idle_timeout_ms: z
48
- .number()
49
- .int()
50
- .positive()
51
- .max(MAX_WAIT_MS)
52
- .optional()
53
- .describe(
54
- `Give up if the job produces no new output for this long, in milliseconds. Default: ${DEFAULT_IDLE_TIMEOUT_MS}. Resets on every new byte of output, so a job that is still working is not cut off; only real silence ends the wait early.`,
55
- ),
56
- })
36
+ const inputSchema = z
37
+ .object({
38
+ id: z.string().describe('The job id, as returned by bash with run_in_background.'),
39
+ output_contains: z
40
+ .string()
41
+ .min(1)
42
+ .max(4096)
43
+ .refine(
44
+ (value) =>
45
+ Buffer.byteLength(value) <= 4096 && Buffer.from(value).toString('utf8') === value,
46
+ 'Use a non-empty UTF-8 literal of at most 4096 bytes.',
47
+ )
48
+ .optional()
49
+ .describe(
50
+ 'Wait for this exact literal in output rather than for exit. This observes a marker; it does not prove service health or keep the turn open until the job exits.',
51
+ ),
52
+ output_stream: z
53
+ .enum(['stdout', 'stderr', 'either'])
54
+ .optional()
55
+ .describe(
56
+ 'Pipe to inspect with output_contains. Default either; stdout and stderr are never joined for a match.',
57
+ ),
58
+ from_offset: z
59
+ .number()
60
+ .int()
61
+ .nonnegative()
62
+ .optional()
63
+ .describe('Resume after a previous wait: pass its next_offset to receive only new output.'),
64
+ timeout_ms: z
65
+ .number()
66
+ .int()
67
+ .positive()
68
+ .max(MAX_WAIT_MS)
69
+ .optional()
70
+ .describe(
71
+ `Give up after this long even if the job keeps producing output, in milliseconds. Default: ${DEFAULT_TIMEOUT_MS}, maximum: ${MAX_WAIT_MS}. The job is never stopped by this running out.`,
72
+ ),
73
+ idle_timeout_ms: z
74
+ .number()
75
+ .int()
76
+ .positive()
77
+ .max(MAX_WAIT_MS)
78
+ .optional()
79
+ .describe(
80
+ `Give up if the job produces no new output for this long, in milliseconds. Default: ${DEFAULT_IDLE_TIMEOUT_MS}. Resets on every new byte of output, so a job that is still working is not cut off; only real silence ends the wait early.`,
81
+ ),
82
+ })
83
+ .superRefine((input, ctx) => {
84
+ if (input.output_stream !== undefined && input.output_contains === undefined) {
85
+ ctx.addIssue({
86
+ code: 'custom',
87
+ path: ['output_stream'],
88
+ message: 'output_stream requires output_contains.',
89
+ })
90
+ }
91
+ })
57
92
 
58
93
  type WaitForJobInput = z.infer<typeof inputSchema>
59
94
 
60
95
  export const WaitForJobTool = defineTool({
61
96
  name: 'wait_for_job',
62
97
  description:
63
- 'Block until a background job started by bash with run_in_background ends, and return its accumulated output in one call. Use this instead of calling job with action "read" in a loop: it costs one call and no waiting turns. Gives up — WITHOUT stopping the job — if it runs too long or goes quiet for too long; either outcome says so, and the job keeps running either way.',
98
+ 'Wait for an owned background job to exit, or set output_contains to observe an exact output marker while it stays running. Use one wait instead of polling job read. Output markers do not prove service health or completion and never express intent to wait until exit. A bounded wait returns output and next_offset without stopping the job; pass that cursor as from_offset to exclude earlier output.',
64
99
  inputSchema,
65
100
  category: 'shell',
66
101
  permissions: ['shell_execute'],
@@ -82,7 +117,7 @@ export const WaitForJobTool = defineTool({
82
117
  return {
83
118
  kind: 'generic',
84
119
  presentation: 'activity',
85
- label: `Wait for background job · ${input.id ?? '(missing id)'}`,
120
+ label: `${input.output_contains === undefined ? 'Wait for background job' : 'Wait for job output'} · ${input.id ?? '(missing id)'}`,
86
121
  }
87
122
  },
88
123
 
@@ -106,6 +141,83 @@ export const WaitForJobTool = defineTool({
106
141
  }
107
142
  }
108
143
 
144
+ if (input.output_stream !== undefined && input.output_contains === undefined) {
145
+ return { success: false, output: '', error: 'output_stream requires output_contains.' }
146
+ }
147
+ if (input.output_contains !== undefined) {
148
+ if (!jobs.waitForOutput) {
149
+ return {
150
+ success: false,
151
+ output: '',
152
+ error:
153
+ 'This host cannot observe output readiness. It must implement backgroundJobs.waitForOutput; no exit wait was started.',
154
+ }
155
+ }
156
+ try {
157
+ const outcome = await jobs.waitForOutput(input.id, {
158
+ literal: input.output_contains,
159
+ stream: input.output_stream ?? 'either',
160
+ timeoutMs: input.timeout_ms ?? DEFAULT_TIMEOUT_MS,
161
+ idleTimeoutMs: input.idle_timeout_ms ?? DEFAULT_IDLE_TIMEOUT_MS,
162
+ ...(input.from_offset === undefined ? {} : { fromOffset: input.from_offset }),
163
+ signal: context.abortSignal,
164
+ })
165
+ const notices = [
166
+ ...(outcome.droppedBytes > 0
167
+ ? [`[${outcome.droppedBytes} bytes unavailable before the retained output]`]
168
+ : []),
169
+ ...(outcome.unsearchedBytes > 0
170
+ ? [
171
+ `[${outcome.unsearchedBytes} retained bytes could not be searched because the channel history cap discarded them]`,
172
+ ]
173
+ : []),
174
+ ...(outcome.omittedOutputBytes > 0
175
+ ? [`[${outcome.omittedOutputBytes} earlier bytes omitted from this bounded result]`]
176
+ : []),
177
+ ]
178
+ const status =
179
+ outcome.error !== undefined
180
+ ? `failed to start: ${outcome.error}`
181
+ : outcome.exitCode === undefined
182
+ ? outcome.status
183
+ : `${outcome.status} with code ${outcome.exitCode}`
184
+ const reason =
185
+ outcome.kind === 'matched'
186
+ ? `Output marker observed on ${outcome.matchedStream}. This is output evidence, not a health check or completion claim.`
187
+ : outcome.kind === 'exited'
188
+ ? 'Job exited before the marker was observed.'
189
+ : outcome.kind === 'stopped'
190
+ ? 'Job stop was requested before the marker was observed; shutdown may still be completing.'
191
+ : outcome.kind === 'aborted'
192
+ ? 'Output observation was cancelled; this wait did not stop the job.'
193
+ : `Output marker was not observed before the ${outcome.cause} timeout (${outcome.elapsedMs} ms); this wait did not stop the job.`
194
+ return {
195
+ success: outcome.kind !== 'aborted',
196
+ output: `${reason}\n\n${notices.length > 0 ? `${notices.join('\n')}\n` : ''}${outcome.output || '(no new output)'}\n\n[job ${input.id} is ${status}; next_offset ${outcome.nextOffset}]`,
197
+ data: {
198
+ jobId: input.id,
199
+ outcome: outcome.kind,
200
+ status: outcome.status,
201
+ nextOffset: outcome.nextOffset,
202
+ droppedBytes: outcome.droppedBytes,
203
+ unsearchedBytes: outcome.unsearchedBytes,
204
+ omittedOutputBytes: outcome.omittedOutputBytes,
205
+ ...(outcome.kind === 'matched' ? { matchedStream: outcome.matchedStream } : {}),
206
+ ...(outcome.kind === 'timeout' ? { timedOut: outcome.cause } : {}),
207
+ ...(outcome.kind === 'aborted' ? { abandoned: true } : {}),
208
+ ...(outcome.exitCode === undefined ? {} : { exitCode: outcome.exitCode }),
209
+ ...(outcome.error === undefined ? {} : { error: outcome.error }),
210
+ },
211
+ }
212
+ } catch (err) {
213
+ return {
214
+ success: false,
215
+ output: '',
216
+ error: err instanceof Error ? err.message : String(err),
217
+ }
218
+ }
219
+ }
220
+
109
221
  if (!jobs.waitForExit) {
110
222
  return {
111
223
  success: false,
@@ -128,6 +240,7 @@ export const WaitForJobTool = defineTool({
128
240
  outcome = await waitForJobWithBounds(jobs, input.id, {
129
241
  wallMs: input.timeout_ms ?? DEFAULT_TIMEOUT_MS,
130
242
  idleMs: input.idle_timeout_ms ?? DEFAULT_IDLE_TIMEOUT_MS,
243
+ ...(input.from_offset === undefined ? {} : { fromOffset: input.from_offset }),
131
244
  signal: context.abortSignal,
132
245
  })
133
246
  } catch {
@@ -144,40 +257,50 @@ export const WaitForJobTool = defineTool({
144
257
  }
145
258
  }
146
259
 
260
+ const notices = [
261
+ ...(outcome.droppedBytes > 0
262
+ ? [`[${outcome.droppedBytes} bytes were dropped by the job's output retention cap]`]
263
+ : []),
264
+ ...(outcome.omittedOutputBytes > 0
265
+ ? [`[${outcome.omittedOutputBytes} earlier bytes omitted from this bounded wait result]`]
266
+ : []),
267
+ ]
268
+ const observed = `${notices.length > 0 ? `${notices.join('\n')}\n` : ''}${outcome.output || '(no new output)'}`
269
+
147
270
  if (outcome.kind === 'timeout') {
148
271
  return {
149
- success: false,
150
- output: describeJobWaitTimeout(input.id, outcome),
272
+ // The wait observed a bound, not a failed command. A tool error
273
+ // would also be promoted as a durable failure by the turn's memory.
274
+ success: true,
275
+ output: `${describeJobWaitTimeout(input.id, outcome)}\n\n${observed}\n\n[next_offset ${outcome.nextOffset}]`,
151
276
  data: {
152
277
  jobId: input.id,
153
278
  timedOut: outcome.cause,
154
279
  nextOffset: outcome.nextOffset,
155
280
  droppedBytes: outcome.droppedBytes,
281
+ omittedOutputBytes: outcome.omittedOutputBytes,
156
282
  },
157
283
  }
158
284
  }
159
285
 
160
- // The dropped count is stated, never absorbed — same rule `job read`
161
- // follows, for the same reason: a job whose middle vanished quietly
162
- // reads as a complete result that happens to be short.
163
- const notice =
164
- outcome.droppedBytes > 0
165
- ? `[${outcome.droppedBytes} bytes were dropped before this point — the job produced output faster than the retention cap holds]\n`
166
- : ''
167
286
  const status =
168
- outcome.exitCode === undefined
169
- ? outcome.status
170
- : `${outcome.status} with code ${outcome.exitCode}`
287
+ outcome.error !== undefined
288
+ ? `failed to start: ${outcome.error}`
289
+ : outcome.exitCode === undefined
290
+ ? outcome.status
291
+ : `${outcome.status} with code ${outcome.exitCode}`
171
292
 
172
293
  return {
173
294
  success: true,
174
- output: `${notice}${outcome.output || '(no output)'}\n\n[job ${input.id} is ${status}; next_offset ${outcome.nextOffset}]`,
295
+ output: `${observed}\n\n[job ${input.id} is ${status}; next_offset ${outcome.nextOffset}]`,
175
296
  data: {
176
297
  jobId: input.id,
177
298
  status: outcome.status,
178
299
  nextOffset: outcome.nextOffset,
179
300
  droppedBytes: outcome.droppedBytes,
301
+ omittedOutputBytes: outcome.omittedOutputBytes,
180
302
  ...(outcome.exitCode === undefined ? {} : { exitCode: outcome.exitCode }),
303
+ ...(outcome.error === undefined ? {} : { error: outcome.error }),
181
304
  },
182
305
  }
183
306
  },
@@ -2,6 +2,7 @@ import { mkdir, readFile } from 'node:fs/promises'
2
2
  import { dirname } from 'node:path'
3
3
  import { z } from 'zod'
4
4
  import type { ToolContext, ToolResult } from '../../types/tool/index.js'
5
+ import type { ToolFacts } from '../../types/tool/presentation.js'
5
6
  import { defineTool } from '../defineTool.js'
6
7
  import { resolveWithinAnyReal, toolRoots } from '../paths.js'
7
8
  import { atomicWriteFile } from './atomic-write-file.js'
@@ -196,13 +197,14 @@ export const WriteFileTool = defineTool({
196
197
  function enforceReadBeforeOverwrite(
197
198
  context: ToolContext,
198
199
  key: string,
199
- ): { success: false; output: ''; error: string } | null {
200
+ ): { success: false; output: ''; error: string; facts?: ToolFacts } | null {
200
201
  if (!context.fileReadTracker) return null
201
202
  if (context.fileReadTracker.hasRead(key)) return null
202
203
  return {
203
204
  success: false,
204
205
  output: '',
205
206
  error: `${key} already exists. Use the \`read\` tool on it first in this conversation, then call \`write\` again — or prefer \`edit\` for a targeted change.`,
207
+ facts: { kind: 'failure', reason: 'already_exists', subject: key },
206
208
  }
207
209
  }
208
210
 
@@ -210,7 +212,7 @@ function enforceFreshOverwrite(
210
212
  context: ToolContext,
211
213
  key: string,
212
214
  currentContent: string,
213
- ): { success: false; output: ''; error: string } | null {
215
+ ): { success: false; output: ''; error: string; facts?: ToolFacts } | null {
214
216
  const unread = enforceReadBeforeOverwrite(context, key)
215
217
  if (unread) return unread
216
218
 
@@ -34,7 +34,8 @@
34
34
  * `NAMZU_BASH_SHELL=/bin/sh` restores the old shell exactly.
35
35
  */
36
36
 
37
- import { constants, accessSync } from 'node:fs'
37
+ import { type ChildProcess, type SpawnOptions, spawn as nodeSpawn } from 'node:child_process'
38
+ import { constants, accessSync, existsSync } from 'node:fs'
38
39
  import { delimiter, isAbsolute, join } from 'node:path'
39
40
 
40
41
  import type { ShellDialect } from '../types/tool/index.js'
@@ -67,12 +68,19 @@ export function findCommandShell(probe: CommandShellProbe): CommandShell {
67
68
  if (override !== undefined && override !== '') {
68
69
  // Read as bash only when it is bash; anything else gets the reading
69
70
  // that holds for every POSIX shell.
70
- const name = override.slice(override.lastIndexOf('/') + 1)
71
+ const name =
72
+ probe.platform === 'win32'
73
+ ? override
74
+ .split(/[\\/]/)
75
+ .at(-1)
76
+ ?.toLowerCase()
77
+ .replace(/\.exe$/, '')
78
+ : override.slice(override.lastIndexOf('/') + 1)
71
79
  return { path: override, dialect: name === 'bash' ? 'bash' : 'sh', source: 'override' }
72
80
  }
73
81
  // Windows keeps Node's platform shell. Looking `bash` up on its PATH can
74
82
  // find WSL's launcher, which runs the command in another system.
75
- if (probe.platform === 'win32') return { path: undefined, dialect: 'sh', source: 'platform' }
83
+ if (probe.platform === 'win32') return { path: undefined, dialect: 'cmd', source: 'platform' }
76
84
  for (const directory of (probe.env.PATH ?? '').split(delimiter)) {
77
85
  if (directory === '' || !directory.startsWith('/')) continue
78
86
  const candidate = join(directory, 'bash')
@@ -94,7 +102,7 @@ export function findCommandShell(probe: CommandShellProbe): CommandShell {
94
102
  export function findCommandShellForDialect(
95
103
  dialect: 'bash' | 'sh',
96
104
  probe: CommandShellProbe,
97
- ): CommandShell | undefined {
105
+ ): (CommandShell & { readonly dialect: 'bash' | 'sh' }) | undefined {
98
106
  if (probe.platform === 'win32') return undefined
99
107
  const override = probe.env.NAMZU_BASH_SHELL
100
108
  if (override) {
@@ -142,7 +150,9 @@ export function hostCommandShell(): CommandShell {
142
150
  }
143
151
 
144
152
  /** Re-check the requested executable each time a job is confirmed or fired. */
145
- export function installedCommandShellForDialect(dialect: 'bash' | 'sh'): CommandShell | undefined {
153
+ export function installedCommandShellForDialect(
154
+ dialect: 'bash' | 'sh',
155
+ ): (CommandShell & { readonly dialect: 'bash' | 'sh' }) | undefined {
146
156
  return findCommandShellForDialect(dialect, {
147
157
  env: process.env,
148
158
  platform: process.platform,
@@ -173,6 +183,123 @@ export function hostShellSpawn(
173
183
  return { file: shell.path, args: ['-c', command], env: withoutBashStartup(env) }
174
184
  }
175
185
 
186
+ /** Why a command could not be started, in the words a model or operator reads. */
187
+ export function describeSpawnFailure(error: unknown, cwd?: string): string {
188
+ // Node reports a missing working directory as ENOENT on the shell's own
189
+ // path ("spawn C:\Windows\system32\cmd.exe ENOENT"), which sends the reader
190
+ // looking for a missing shell. Say what is actually missing.
191
+ if (
192
+ cwd !== undefined &&
193
+ (error as NodeJS.ErrnoException | undefined)?.code === 'ENOENT' &&
194
+ !existsSync(cwd)
195
+ ) {
196
+ return `Could not start the command: the working directory does not exist: ${cwd}`
197
+ }
198
+ const detail = error instanceof Error ? error.message : String(error)
199
+ return `Could not start the command: ${detail}`
200
+ }
201
+
202
+ /** Environment variable that carries the command line into the inner cmd. */
203
+ const WINDOWS_COMMAND_VARIABLE = 'NAMZU_HOST_COMMAND'
204
+ const WINDOWS_SHELL_VARIABLE = 'NAMZU_HOST_COMSPEC'
205
+
206
+ /**
207
+ * The spawn for one command line under cmd on Windows: the outer cmd's file,
208
+ * its arguments and the environment that carries the command.
209
+ *
210
+ * A bare `cmd /d /s /c <command>` converts the command line to the console's
211
+ * OEM code page before it runs anything, so letters that page lacks arrive
212
+ * as their nearest ASCII look-alike (g-breve as `g`, s-cedilla as `s` on
213
+ * CP850) and are gone before the command writes a byte. `chcp` inside the
214
+ * same line is too late: the line is already converted. So the outer cmd
215
+ * only switches the console to UTF-8 and starts a second cmd, and the
216
+ * command travels in the environment, which is Unicode and never converted.
217
+ * The outer cmd reads it with delayed expansion (`!NAME!`), which happens
218
+ * after its line is parsed, so quotes, `&`, `|` and `>` in the command are
219
+ * inert there and reach the second cmd as the line it was given: quoting,
220
+ * `%` and redirection mean what they meant before, and its exit code is the
221
+ * command's. Neither cmd is looked up on PATH, so a `cmd.exe` in the
222
+ * working directory is never picked up.
223
+ */
224
+ function windowsCmdSpawn(
225
+ command: string,
226
+ env: NodeJS.ProcessEnv,
227
+ ): {
228
+ readonly file: string
229
+ readonly args: readonly string[]
230
+ readonly env: NodeJS.ProcessEnv
231
+ } {
232
+ const lookup = (name: string): string | undefined => {
233
+ const key = Object.keys(env).find((k) => k.toLowerCase() === name.toLowerCase())
234
+ return key === undefined ? undefined : env[key]
235
+ }
236
+ const comspec =
237
+ lookup('ComSpec') ??
238
+ `${lookup('SystemRoot') ?? process.env.SystemRoot ?? 'C:\\Windows'}\\System32\\cmd.exe`
239
+ return {
240
+ file: comspec,
241
+ // Passed verbatim: Node must not re-quote the line, whose outer quotes
242
+ // `/s` strips.
243
+ args: [
244
+ '/d',
245
+ '/v:on',
246
+ '/s',
247
+ '/c',
248
+ `"chcp 65001>nul & "!${WINDOWS_SHELL_VARIABLE}!" /d /s /c "!${WINDOWS_COMMAND_VARIABLE}!""`,
249
+ ],
250
+ env: { ...env, [WINDOWS_SHELL_VARIABLE]: comspec, [WINDOWS_COMMAND_VARIABLE]: command },
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Start one command on the host, in the shell {@link hostCommandShell} chose.
256
+ *
257
+ * The ONE place that knows what Windows needs: with no shell path (cmd), Node
258
+ * itself must run the line (`cmd.exe /d /s /c`, see `windowsCmdSpawn`);
259
+ * everywhere else it is `<shell> -c <command>`. The foreground `bash` tool,
260
+ * the background job registry and plugin hooks all spawn through here, so
261
+ * they cannot diverge: the registry once spawned `/bin/sh` on Windows while
262
+ * the foreground tool did not, and every background job died at once with no
263
+ * message.
264
+ *
265
+ * - On Windows the line runs under UTF-8 (see `windowsCmdSpawn`).
266
+ * - `detached` (own process group, for `killTree`) is POSIX only; on Windows
267
+ * it opens a new console window instead.
268
+ * - `windowsHide` keeps a GUI host from flashing a console per command.
269
+ */
270
+ export function spawnHostShell(
271
+ command: string,
272
+ options: {
273
+ readonly cwd: string
274
+ readonly env: NodeJS.ProcessEnv
275
+ readonly stdio?: SpawnOptions['stdio']
276
+ /** Default: true off Windows. */
277
+ readonly detached?: boolean
278
+ readonly shell?: CommandShell
279
+ /** For tests: the platform the options are shaped for. */
280
+ readonly platform?: NodeJS.Platform
281
+ /** For tests: the spawn that runs it. */
282
+ readonly spawnImpl?: typeof nodeSpawn
283
+ },
284
+ ): ChildProcess {
285
+ const spawnFn = options.spawnImpl ?? nodeSpawn
286
+ const resolved = hostShellSpawn(command, options.env, options.shell)
287
+ const common: SpawnOptions = {
288
+ cwd: options.cwd,
289
+ env: resolved.env,
290
+ detached: options.detached ?? (options.platform ?? process.platform) !== 'win32',
291
+ windowsHide: true,
292
+ ...(options.stdio === undefined ? {} : { stdio: options.stdio }),
293
+ }
294
+ if (resolved.file !== undefined) return spawnFn(resolved.file, [...resolved.args], common)
295
+ const windows = windowsCmdSpawn(command, resolved.env)
296
+ return spawnFn(windows.file, [...windows.args], {
297
+ ...common,
298
+ env: windows.env,
299
+ windowsVerbatimArguments: true,
300
+ })
301
+ }
302
+
176
303
  export function withoutBashStartup<T extends Readonly<Record<string, string | undefined>>>(
177
304
  env: T,
178
305
  ): T {
@@ -21,26 +21,16 @@ import type { TaskLaunchedCallback } from './index.js'
21
21
  * subagent tool calls are isolated — only the summary surfaces to
22
22
  * the parent.
23
23
  *
24
- * **How this relates to `create_task`.** This paragraph used to say the two
25
- * were different shapes — that `create_task` / `continue_task` /
26
- * `cancel_task` were a non-blocking trio driven by a `<task-notification>`
27
- * callback, and that the blocking `Agent` tool should be preferred. None of
28
- * that is true any more. `create_task` blocks and returns the worker's output
29
- * as its own `tool_result`, exactly like this tool; `continue_task` and
30
- * `cancel_task` are still defined in `./index.ts` but are deliberately not
31
- * registered, because a blocking launch leaves every worker terminal by the
32
- * time a later turn learns its id. So a reader following the old advice was
33
- * choosing between two tools on a distinction that no longer existed.
24
+ * `create_task` also returns the worker result inline by default. When a
25
+ * CompletionInbox is supplied it can instead launch in the background;
26
+ * `wait_for_task`, `continue_task` and `cancel_task` let the supervisor join,
27
+ * steer or stop its own launched work. Linked planning tasks and approved
28
+ * plan steps settle from the worker's actual outcome on either launch path.
34
29
  *
35
- * What actually separates them is the surface, not the timing:
36
- *
37
- * - `create_task` arrives with the rest of the coordinator surface —
38
- * `agent_task_list`, and `approve_plan` / `ask_user_question` when their
39
- * dependencies are wired. That is the supervisor's toolkit.
40
- * - This builds one tool and nothing else, for an agent whose only delegation
41
- * need is "hand this to a specialist". `terminal: true` additionally lets a
42
- * pure router settle on the specialist's answer instead of spending a turn
43
- * at full parent context to paraphrase it.
30
+ * `create_task` arrives with the coordinator toolkit, including task listing
31
+ * and optional plan approval/question tools. This builds one delegation tool.
32
+ * `terminal: true` additionally lets a pure router settle on the specialist's
33
+ * answer instead of spending a turn restating it.
44
34
  *
45
35
  * Neither is legacy. Pick by how much of the coordinator surface you want.
46
36
  */