@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,10 +1,15 @@
1
- import { spawn } from 'node:child_process'
1
+ import type { spawn } from 'node:child_process'
2
2
 
3
3
  import { SANDBOX_KILL_GRACE_MS } from '../../constants/sandbox/index.js'
4
4
  import { killTree } from '../../process/kill-tree.js'
5
- import { hostShellSpawn } from '../../tools/command-shell.js'
5
+ import { describeSpawnFailure, spawnHostShell } from '../../tools/command-shell.js'
6
6
  import { scrubInheritedEnv } from '../../tools/env-scrub.js'
7
- import { awaitWithAbort } from '../../utils/await-with-abort.js'
7
+ import { createHostOutputDecoder } from '../../tools/host-output.js'
8
+ import type {
9
+ BackgroundJobOutputWaitOptions,
10
+ BackgroundJobOutputWaitResult,
11
+ } from '../../types/job/index.js'
12
+ import { subscribeToAbort } from '../../utils/abort.js'
8
13
 
9
14
  /**
10
15
  * Work that outlives a tool call, owned by whoever started it.
@@ -40,6 +45,17 @@ export interface BackgroundJob {
40
45
  readonly exitedAt?: number
41
46
  readonly exitCode?: number
42
47
  readonly signal?: string
48
+ /**
49
+ * Why the command never started, in words for the model: set when the
50
+ * process could not be spawned at all (missing shell, bad working
51
+ * directory). Such a job has no `exitCode`; it is not a command that
52
+ * ran and returned a status.
53
+ */
54
+ readonly error?: string
55
+ /** Stopping the owned tree failed; the job remains owned and counted as live. */
56
+ readonly recoveryRequired?: boolean
57
+ /** Safe registry diagnostic for an unconfirmed stop; excludes transport secrets. */
58
+ readonly stopError?: string
43
59
  }
44
60
 
45
61
  export interface BackgroundJobOutput {
@@ -57,6 +73,8 @@ export interface BackgroundJobOutput {
57
73
  readonly droppedBytes: number
58
74
  readonly status: BackgroundJobStatus
59
75
  readonly exitCode?: number
76
+ /** Set when the command could not be started; see {@link BackgroundJob.error}. */
77
+ readonly error?: string
60
78
  }
61
79
 
62
80
  /** A job's process, when something other than the registry starts it. */
@@ -64,6 +82,8 @@ export interface JobProcess {
64
82
  readonly child: ReturnType<typeof spawn>
65
83
  /** How to stop it, when the registry's process-group kill would not reach everything. */
66
84
  kill?(signal: NodeJS.Signals): void
85
+ /** Confirm the owned tree stopped; reject instead of claiming an unconfirmed exit. */
86
+ terminate?(signal?: NodeJS.Signals): Promise<void>
67
87
  }
68
88
 
69
89
  export interface StartJobParams {
@@ -90,10 +110,47 @@ export interface BackgroundJobRegistryConfig {
90
110
  readonly maxJobsPerOwner?: number
91
111
  /** Retained output per job. Oldest bytes go first, and are counted. */
92
112
  readonly maxOutputBytesPerJob?: number
113
+ /** Concurrent output observers per owner; default 32. Refused rather than queued. */
114
+ readonly maxOutputWaitersPerOwner?: number
115
+ /** Concurrent output observers across the registry; default 256. */
116
+ readonly maxOutputWaiters?: number
93
117
  }
94
118
 
95
119
  const DEFAULT_MAX_JOBS_PER_OWNER = 8
96
120
  const DEFAULT_MAX_OUTPUT_BYTES = 1024 * 1024
121
+ const MAX_CHANNEL_CHUNKS = 4096
122
+ const MAX_WAIT_RESULT_BYTES = 32 * 1024
123
+ const MAX_OUTPUT_WAIT_MS = 60 * 60 * 1000
124
+
125
+ /** Starting another observer would exceed its owner's or registry's bound. */
126
+ export class BackgroundJobOutputWaitLimitError extends Error {
127
+ constructor(readonly details: { owner: string; limit: number; scope: 'owner' | 'registry' }) {
128
+ super(
129
+ `Background output wait limit ${details.limit} reached for ${details.scope}; finish or cancel an existing wait first.`,
130
+ )
131
+ this.name = 'BackgroundJobOutputWaitLimitError'
132
+ }
133
+ }
134
+
135
+ interface OutputChunk {
136
+ readonly stream: 'stdout' | 'stderr'
137
+ readonly offset: number
138
+ readonly bytes: Buffer
139
+ }
140
+
141
+ /** Start at a complete UTF-8 code point when a byte cap or cursor bisects one. */
142
+ function utf8Start(bytes: Buffer, start: number): number {
143
+ let at = start
144
+ while (at < bytes.length && ((bytes[at] ?? 0) & 0xc0) === 0x80) at++
145
+ return at
146
+ }
147
+
148
+ function outputTail(text: string, maxBytes: number): { text: string; omitted: number } {
149
+ const bytes = Buffer.from(text)
150
+ if (bytes.length <= maxBytes) return { text, omitted: 0 }
151
+ const start = utf8Start(bytes, bytes.length - maxBytes)
152
+ return { text: bytes.subarray(start).toString('utf8'), omitted: start }
153
+ }
97
154
 
98
155
  /** A start that would exceed a declared bound. */
99
156
  export class BackgroundJobLimitError extends Error {
@@ -124,11 +181,21 @@ interface JobEntry {
124
181
  child: ReturnType<typeof spawn>
125
182
  /** The spawner's own kill, when it gave one. */
126
183
  killProcess?: (signal: NodeJS.Signals) => void
184
+ terminateProcess?: (signal?: NodeJS.Signals) => Promise<void>
185
+ terminationAttempt?: Promise<void>
186
+ killRequested?: boolean
187
+ closedResult?: { code: number | null; signal: NodeJS.Signals | null }
188
+ finalize?: (code: number | null, signal: NodeJS.Signals | null) => void
127
189
  /** Retained tail. */
128
190
  buffer: string
129
191
  /** Bytes produced in total, including the ones the cap dropped. */
130
192
  produced: number
193
+ /** Channel identity is retained separately, under the same byte cap and a chunk cap. */
194
+ outputChunks: OutputChunk[]
195
+ outputObservers: Set<(chunk?: OutputChunk) => void>
131
196
  exit: Promise<void>
197
+ /** Settles once the process exists or failed to; `error` says which. */
198
+ started: Promise<{ readonly error?: string }>
132
199
  }
133
200
 
134
201
  /** Whether any process of the group led by `pid` is still alive. */
@@ -148,6 +215,8 @@ export class BackgroundJobRegistry {
148
215
  private readonly jobs = new Map<string, JobEntry>()
149
216
  private counter = 0
150
217
  private readonly exitListeners = new Set<(job: BackgroundJob) => void>()
218
+ private outputWaiters = 0
219
+ private readonly outputWaitersByOwner = new Map<string, number>()
151
220
 
152
221
  /**
153
222
  * Be told when a job ends, whoever owns it. A job outlives the call that
@@ -172,7 +241,43 @@ export class BackgroundJobRegistry {
172
241
  }
173
242
  }
174
243
 
175
- constructor(private readonly config: BackgroundJobRegistryConfig = {}) {}
244
+ /** A failed remote stop never releases ownership or announces a terminal job. */
245
+ private confirmTermination(entry: JobEntry): Promise<void> {
246
+ if (entry.terminationAttempt) return entry.terminationAttempt
247
+ const terminate = entry.terminateProcess
248
+ if (!terminate) return Promise.reject(new Error('The process has no confirmed termination API'))
249
+ const attempt = Promise.resolve()
250
+ .then(() => terminate('SIGTERM'))
251
+ .then(() => {
252
+ const { recoveryRequired: _recovery, stopError: _error, ...record } = entry.record
253
+ entry.record = record
254
+ if (entry.closedResult) entry.finalize?.(entry.closedResult.code, entry.closedResult.signal)
255
+ })
256
+ .catch((error: unknown) => {
257
+ entry.record = {
258
+ ...entry.record,
259
+ recoveryRequired: true,
260
+ stopError:
261
+ 'The process provider could not confirm the owned job stopped; retry termination or recover its environment.',
262
+ }
263
+ for (const observer of entry.outputObservers) observer()
264
+ throw error
265
+ })
266
+ .finally(() => {
267
+ entry.terminationAttempt = undefined
268
+ })
269
+ entry.terminationAttempt = attempt
270
+ return attempt
271
+ }
272
+
273
+ constructor(private readonly config: BackgroundJobRegistryConfig = {}) {
274
+ for (const key of ['maxOutputWaiters', 'maxOutputWaitersPerOwner'] as const) {
275
+ const value = config[key]
276
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {
277
+ throw new RangeError(`${key} must be a positive safe integer.`)
278
+ }
279
+ }
280
+ }
176
281
 
177
282
  private get maxJobs(): number {
178
283
  return this.config.maxJobsPerOwner ?? DEFAULT_MAX_JOBS_PER_OWNER
@@ -206,33 +311,42 @@ export class BackgroundJobRegistry {
206
311
  // started it, which makes the leak longer-lived, not smaller.
207
312
  const inherited = scrubInheritedEnv()
208
313
 
209
- // The same shell as a foreground `bash` call, so the permission
210
- // rules' reading of the line holds for the job too.
211
- const shell = hostShellSpawn(params.command, { ...inherited.env, ...params.env })
314
+ // The same spawn as a foreground `bash` call, so the permission
315
+ // rules' reading of the line holds for the job too, and so the two
316
+ // cannot disagree about how a shell is started on a given platform.
212
317
  const started = params.spawn
213
318
  ? params.spawn()
214
319
  : {
215
- child: spawn(
216
- shell.file ?? '/bin/sh',
217
- shell.file === undefined ? ['-c', params.command] : [...shell.args],
218
- {
219
- cwd: params.workingDirectory,
220
- env: shell.env,
221
- // Leader of its own process group, which is what `killTree` needs
222
- // to reach the command and everything it forks rather than only the
223
- // wrapping shell. See `process/kill-tree.ts`.
224
- detached: process.platform !== 'win32',
225
- stdio: ['ignore', 'pipe', 'pipe'],
226
- },
227
- ),
320
+ child: spawnHostShell(params.command, {
321
+ cwd: params.workingDirectory,
322
+ env: { ...inherited.env, ...params.env },
323
+ // `detached` makes the child the leader of its own process group
324
+ // off Windows, which is what `killTree` needs to reach the command
325
+ // and everything it forks rather than only the wrapping shell. See
326
+ // `process/kill-tree.ts`.
327
+ stdio: ['ignore', 'pipe', 'pipe'],
328
+ }),
228
329
  }
229
330
  const child = started.child
230
331
  // Started, not adopted: this process stays the parent for the job's
231
332
  // whole life. `unref` would let Node exit with the job still running,
232
333
  // which is the orphan this registry exists to prevent.
233
- child.stdout?.setEncoding('utf8')
234
- child.stderr?.setEncoding('utf8')
235
-
334
+ // Raw bytes, decoded here: a Windows console writes its OEM code page.
335
+ // A process a sandbox started runs a Linux guest, so it is UTF-8.
336
+ const decoders = {
337
+ stdout: createHostOutputDecoder(params.spawn ? { platform: 'linux' } : {}),
338
+ stderr: createHostOutputDecoder(params.spawn ? { platform: 'linux' } : {}),
339
+ }
340
+ let startError: string | undefined
341
+ let settleStarted!: () => void
342
+ const startedPromise = new Promise<{ readonly error?: string }>((resolve) => {
343
+ settleStarted = () => resolve(startError === undefined ? {} : { error: startError })
344
+ })
345
+ // A process the host's own spawner started is the host's to vouch for:
346
+ // it may be remote, and need not emit `spawn` at all.
347
+ if (params.spawn || child.pid !== undefined) settleStarted()
348
+
349
+ let finalizeEntry!: (code: number | null, signal: NodeJS.Signals | null) => void
236
350
  const entry: JobEntry = {
237
351
  record: {
238
352
  id,
@@ -243,35 +357,58 @@ export class BackgroundJobRegistry {
243
357
  },
244
358
  child,
245
359
  ...(started.kill ? { killProcess: started.kill.bind(started) } : {}),
360
+ ...(started.terminate ? { terminateProcess: started.terminate.bind(started) } : {}),
246
361
  buffer: '',
247
362
  produced: 0,
363
+ outputChunks: [],
364
+ outputObservers: new Set(),
365
+ started: startedPromise,
248
366
  exit: new Promise<void>((resolve) => {
249
367
  let spawned = child.pid !== undefined
250
368
  let failedToSpawn = false
369
+ let finalized = false
251
370
  const finalize = (code: number | null, signal: NodeJS.Signals | null): void => {
371
+ if (finalized) return
372
+ finalized = true
252
373
  entry.record = {
253
374
  ...entry.record,
254
375
  // A job killed by this registry says `killed`, not
255
376
  // `exited` with a signal a reader has to interpret. The
256
377
  // two are different answers to "why did my job stop".
257
- status: entry.record.status === 'killed' ? 'killed' : 'exited',
378
+ status: entry.killRequested || entry.record.status === 'killed' ? 'killed' : 'exited',
258
379
  exitedAt: Date.now(),
259
380
  ...(code === null ? {} : { exitCode: code }),
260
381
  ...(signal ? { signal } : {}),
261
382
  }
262
383
  resolve()
384
+ for (const observer of entry.outputObservers) observer()
263
385
  this.announceExit(entry.record)
264
386
  }
387
+ finalizeEntry = finalize
265
388
  child.once('spawn', () => {
266
389
  spawned = true
390
+ settleStarted()
267
391
  })
268
- child.on('error', () => {
392
+ child.on('error', (error) => {
269
393
  // A failed spawn emits both `error` and `close`. Waiting for
270
394
  // `close` also covers errors on an already-running process
271
395
  // (such as a failed kill) without announcing a false exit.
272
- if (!spawned) failedToSpawn = true
396
+ if (spawned) return
397
+ failedToSpawn = true
398
+ startError ??= describeSpawnFailure(error, params.workingDirectory)
399
+ settleStarted()
273
400
  })
274
401
  child.once('close', (code, signal) => {
402
+ for (const stream of ['stdout', 'stderr'] as const) {
403
+ const rest = decoders[stream].end()
404
+ if (rest) append(rest, stream)
405
+ }
406
+ if (failedToSpawn && startError !== undefined) {
407
+ // In the output too, so a caller that only reads output (or
408
+ // redirects it, as a model does) still learns why it is empty.
409
+ append(`${startError}\n`, 'stderr')
410
+ entry.record = { ...entry.record, error: startError }
411
+ }
275
412
  // The job is the process GROUP, not the shell. A command that
276
413
  // backgrounds its real work (`server &`) exits the shell at
277
414
  // once and leaves the server as the group's survivor; calling
@@ -282,6 +419,14 @@ export class BackgroundJobRegistry {
282
419
  // alive, and ends — with the shell's exit code — when the
283
420
  // group is empty.
284
421
  const exitCode = failedToSpawn ? null : code
422
+ if (entry.terminateProcess) {
423
+ entry.closedResult = { code: exitCode, signal }
424
+ void this.confirmTermination(entry).catch(() => {
425
+ // The retained running record exposes recoveryRequired. A
426
+ // later kill retries instead of forgetting the guest tree.
427
+ })
428
+ return
429
+ }
285
430
  if (entry.record.status !== 'killed' && groupAlive(child.pid)) {
286
431
  const poll = setInterval(() => {
287
432
  if (groupAlive(child.pid)) return
@@ -295,30 +440,58 @@ export class BackgroundJobRegistry {
295
440
  })
296
441
  }),
297
442
  }
443
+ entry.finalize = finalizeEntry
298
444
 
299
- const append = (text: string): void => {
300
- entry.produced += Buffer.byteLength(text)
445
+ const append = (text: string, stream: 'stdout' | 'stderr'): void => {
446
+ const chunk: OutputChunk = { stream, offset: entry.produced, bytes: Buffer.from(text) }
447
+ if (chunk.bytes.length === 0) return
448
+ entry.produced += chunk.bytes.length
301
449
  entry.buffer += text
302
- const over = Buffer.byteLength(entry.buffer) - this.maxBytes
303
- if (over > 0) {
304
- // Oldest first. A cap that dropped the NEWEST bytes would hide
305
- // exactly the part a poller is waiting for.
306
- //
307
- // Nothing accumulates a drop counter here, deliberately. What a
308
- // reader needs is how much IT missed, which depends on where its
309
- // own offset was — a running total of everything ever dropped
310
- // answers a different question, and `read` derives the right one
311
- // from `produced` and the retained length.
312
- entry.buffer = Buffer.from(entry.buffer).subarray(over).toString('utf8')
450
+ entry.buffer = outputTail(entry.buffer, this.maxBytes).text
451
+ entry.outputChunks.push(chunk)
452
+ const retainedStart = entry.produced - Buffer.byteLength(entry.buffer)
453
+ while (
454
+ entry.outputChunks.length > MAX_CHANNEL_CHUNKS ||
455
+ (entry.outputChunks[0] &&
456
+ entry.outputChunks[0].offset + entry.outputChunks[0].bytes.length <= retainedStart)
457
+ ) {
458
+ entry.outputChunks.shift()
459
+ }
460
+ const first = entry.outputChunks[0]
461
+ if (first && first.offset < retainedStart) {
462
+ const skip = utf8Start(first.bytes, retainedStart - first.offset)
463
+ entry.outputChunks[0] = {
464
+ ...first,
465
+ offset: first.offset + skip,
466
+ bytes: Buffer.from(first.bytes.subarray(skip)),
467
+ }
313
468
  }
469
+ // Deliver the actual chunk even when its beginning has already fallen
470
+ // outside retention: an active observer must not miss a fast producer.
471
+ for (const observer of entry.outputObservers) observer(chunk)
472
+ }
473
+ const onData = (stream: 'stdout' | 'stderr') => (data: Buffer | string) => {
474
+ const text = typeof data === 'string' ? data : decoders[stream].write(data)
475
+ if (text) append(text, stream)
314
476
  }
315
- child.stdout?.on('data', (text: string) => append(text))
316
- child.stderr?.on('data', (text: string) => append(text))
477
+ child.stdout?.on('data', onData('stdout'))
478
+ child.stderr?.on('data', onData('stderr'))
317
479
 
318
480
  this.jobs.set(id, entry)
319
481
  return entry.record
320
482
  }
321
483
 
484
+ /**
485
+ * Resolves once the job's process exists, or once it could not be
486
+ * created (`error` then says why). Lets a caller report a start that
487
+ * failed in the same reply that would otherwise say "started".
488
+ */
489
+ awaitStarted(id: string): Promise<{ readonly error?: string }> {
490
+ const entry = this.jobs.get(id)
491
+ if (!entry) throw new UnknownBackgroundJobError({ id })
492
+ return entry.started
493
+ }
494
+
322
495
  /** The record, or throw for an id this registry does not know. */
323
496
  get(id: string): BackgroundJob {
324
497
  const entry = this.jobs.get(id)
@@ -343,13 +516,195 @@ export class BackgroundJobRegistry {
343
516
  const entry = this.jobs.get(id)
344
517
  if (!entry) throw new UnknownBackgroundJobError({ id })
345
518
  if (entry.record.status !== 'running') return Promise.resolve(entry.record)
346
- // `entry` is the same object the `finalize` closure in `start()`
347
- // mutates in place, so reading `entry.record` after `exit` settles
348
- // sees the final status — the same trick `kill()` already relies on.
349
- return awaitWithAbort(
350
- entry.exit.then(() => entry.record),
351
- opts.signal,
352
- )
519
+ if (!opts.signal) {
520
+ // Keep the original promise path for callers without cancellation.
521
+ return entry.exit.then(() => entry.record)
522
+ }
523
+ const signal = opts.signal
524
+ if (signal.aborted) return Promise.reject(signal.reason)
525
+
526
+ // A Promise.race against entry.exit leaves a continuation on that
527
+ // never-ending promise after cancellation. An exit listener can instead
528
+ // be removed as soon as this particular wait is abandoned.
529
+ return new Promise<BackgroundJob>((resolve, reject) => {
530
+ let disposeAbort = () => {}
531
+ const unsubscribe = this.onExit((job) => {
532
+ if (job.id !== id) return
533
+ unsubscribe()
534
+ disposeAbort()
535
+ resolve(job)
536
+ })
537
+ disposeAbort = subscribeToAbort(signal, () => {
538
+ unsubscribe()
539
+ disposeAbort()
540
+ reject(signal.reason)
541
+ })
542
+ })
543
+ }
544
+
545
+ /**
546
+ * Observe a literal in one pipe, including retained output after the cursor.
547
+ * A marker is evidence of output, not exit intent or service health. Every
548
+ * observer is independent and bounded; cancellation never stops the job.
549
+ */
550
+ waitForOutput(
551
+ id: string,
552
+ opts: BackgroundJobOutputWaitOptions,
553
+ ): Promise<BackgroundJobOutputWaitResult> {
554
+ const entry = this.jobs.get(id)
555
+ if (!entry) throw new UnknownBackgroundJobError({ id })
556
+ // Capture the admitted condition and clocks once; a caller retaining its
557
+ // mutable options object cannot alter a bound after validation.
558
+ const {
559
+ literal: literalText,
560
+ stream: requestedStream,
561
+ fromOffset,
562
+ timeoutMs,
563
+ idleTimeoutMs,
564
+ signal,
565
+ } = opts
566
+ if (
567
+ typeof literalText !== 'string' ||
568
+ literalText.length === 0 ||
569
+ Buffer.byteLength(literalText) > 4096 ||
570
+ Buffer.from(literalText).toString('utf8') !== literalText
571
+ ) {
572
+ throw new RangeError('Output literal must be non-empty valid UTF-8, at most 4096 bytes.')
573
+ }
574
+ const stream = requestedStream ?? 'either'
575
+ if (!['stdout', 'stderr', 'either'].includes(stream))
576
+ throw new RangeError('Unknown output stream.')
577
+ for (const [name, value] of [
578
+ ['timeoutMs', timeoutMs],
579
+ ['idleTimeoutMs', idleTimeoutMs],
580
+ ] as const) {
581
+ if (
582
+ (name === 'timeoutMs' || value !== undefined) &&
583
+ (value === undefined ||
584
+ !Number.isSafeInteger(value) ||
585
+ value < 1 ||
586
+ value > MAX_OUTPUT_WAIT_MS)
587
+ ) {
588
+ throw new RangeError(`${name} must be an integer from 1 through ${MAX_OUTPUT_WAIT_MS}.`)
589
+ }
590
+ }
591
+ const from = fromOffset ?? 0
592
+ if (!Number.isSafeInteger(from) || from < 0 || from > entry.produced) {
593
+ throw new RangeError('fromOffset must be an observed, nonnegative output byte cursor.')
594
+ }
595
+ const literal = Buffer.from(literalText)
596
+ const suffix = { stdout: Buffer.alloc(0), stderr: Buffer.alloc(0) }
597
+ const match = (chunk: OutputChunk): 'stdout' | 'stderr' | undefined => {
598
+ if (
599
+ (stream !== 'either' && stream !== chunk.stream) ||
600
+ chunk.offset + chunk.bytes.length <= from
601
+ )
602
+ return
603
+ const skip = utf8Start(chunk.bytes, Math.max(0, from - chunk.offset))
604
+ const bytes = Buffer.concat([suffix[chunk.stream], chunk.bytes.subarray(skip)])
605
+ const found = bytes.indexOf(literal) !== -1
606
+ // Only the bytes that can prefix a future match survive each chunk.
607
+ // Copy so a tiny suffix never retains a large producer buffer.
608
+ suffix[chunk.stream] = Buffer.from(
609
+ bytes.subarray(Math.max(0, bytes.length - literal.length + 1)),
610
+ )
611
+ return found ? chunk.stream : undefined
612
+ }
613
+ let output = ''
614
+ let cursor = from
615
+ let droppedBytes = 0
616
+ let omittedOutputBytes = 0
617
+ const read = (): void => {
618
+ const observed = this.read(id, { fromOffset: cursor })
619
+ cursor = observed.nextOffset
620
+ droppedBytes += observed.droppedBytes
621
+ const tail = outputTail(output + observed.chunk, MAX_WAIT_RESULT_BYTES)
622
+ output = tail.text
623
+ omittedOutputBytes += tail.omitted
624
+ }
625
+ read()
626
+ const retainedStart = entry.produced - Buffer.byteLength(entry.buffer)
627
+ const searchableStart = entry.outputChunks[0]?.offset ?? entry.produced
628
+ const unsearchedBytes = Math.max(0, searchableStart - Math.max(from, retainedStart))
629
+ const progress = () => ({
630
+ status: entry.record.status,
631
+ ...(entry.record.exitCode === undefined ? {} : { exitCode: entry.record.exitCode }),
632
+ ...(entry.record.error === undefined ? {} : { error: entry.record.error }),
633
+ output,
634
+ nextOffset: cursor,
635
+ droppedBytes,
636
+ unsearchedBytes,
637
+ omittedOutputBytes,
638
+ })
639
+ if (signal?.aborted) return Promise.resolve({ ...progress(), kind: 'aborted' })
640
+ // Check synchronously before subscribing. No process event can intervene
641
+ // in this call stack, so even a marker printed before activation is seen.
642
+ for (const chunk of entry.outputChunks) {
643
+ const matchedStream = match(chunk)
644
+ if (matchedStream) return Promise.resolve({ ...progress(), kind: 'matched', matchedStream })
645
+ }
646
+ if (entry.record.status !== 'running') {
647
+ return Promise.resolve({
648
+ ...progress(),
649
+ kind: entry.record.status === 'killed' ? 'stopped' : 'exited',
650
+ })
651
+ }
652
+ const owner = entry.record.owner
653
+ const ownerCount = this.outputWaitersByOwner.get(owner) ?? 0
654
+ const ownerLimit = this.config.maxOutputWaitersPerOwner ?? 32
655
+ const globalLimit = this.config.maxOutputWaiters ?? 256
656
+ if (ownerCount >= ownerLimit)
657
+ throw new BackgroundJobOutputWaitLimitError({ owner, limit: ownerLimit, scope: 'owner' })
658
+ if (this.outputWaiters >= globalLimit)
659
+ throw new BackgroundJobOutputWaitLimitError({ owner, limit: globalLimit, scope: 'registry' })
660
+ this.outputWaiters++
661
+ this.outputWaitersByOwner.set(owner, ownerCount + 1)
662
+ return new Promise((resolve) => {
663
+ const startedAt = Date.now()
664
+ let settled = false
665
+ let disposeAbort = () => {}
666
+ let idleTimer: ReturnType<typeof setTimeout> | undefined
667
+ const finish = (result: BackgroundJobOutputWaitResult): void => {
668
+ if (settled) return
669
+ settled = true
670
+ entry.outputObservers.delete(observe)
671
+ clearTimeout(wallTimer)
672
+ clearTimeout(idleTimer)
673
+ disposeAbort()
674
+ this.outputWaiters--
675
+ const remaining = (this.outputWaitersByOwner.get(owner) ?? 1) - 1
676
+ if (remaining === 0) this.outputWaitersByOwner.delete(owner)
677
+ else this.outputWaitersByOwner.set(owner, remaining)
678
+ resolve(result)
679
+ }
680
+ const timeout = (cause: 'wall' | 'idle'): void => {
681
+ read()
682
+ finish({ ...progress(), kind: 'timeout', cause, elapsedMs: Date.now() - startedAt })
683
+ }
684
+ const resetIdle = (): void => {
685
+ if (idleTimeoutMs === undefined) return
686
+ clearTimeout(idleTimer)
687
+ idleTimer = setTimeout(() => timeout('idle'), idleTimeoutMs)
688
+ idleTimer.unref?.()
689
+ }
690
+ const observe = (chunk?: OutputChunk): void => {
691
+ read()
692
+ const matchedStream = chunk ? match(chunk) : undefined
693
+ if (matchedStream) finish({ ...progress(), kind: 'matched', matchedStream })
694
+ else if (entry.record.status !== 'running') {
695
+ finish({ ...progress(), kind: entry.record.status === 'killed' ? 'stopped' : 'exited' })
696
+ } else if (chunk) resetIdle()
697
+ }
698
+ entry.outputObservers.add(observe)
699
+ const wallTimer = setTimeout(() => timeout('wall'), timeoutMs)
700
+ wallTimer.unref?.()
701
+ resetIdle()
702
+ if (signal)
703
+ disposeAbort = subscribeToAbort(signal, () => {
704
+ read()
705
+ finish({ ...progress(), kind: 'aborted' })
706
+ })
707
+ })
353
708
  }
354
709
 
355
710
  /**
@@ -369,14 +724,17 @@ export class BackgroundJobRegistry {
369
724
  // the gap is reported rather than closed over.
370
725
  const effective = Math.max(from, bufferStart)
371
726
  const skip = Math.max(0, effective - bufferStart)
372
- const chunk = Buffer.from(entry.buffer).subarray(skip).toString('utf8')
727
+ const bytes = Buffer.from(entry.buffer)
728
+ const aligned = utf8Start(bytes, skip)
729
+ const chunk = bytes.subarray(aligned).toString('utf8')
373
730
 
374
731
  return {
375
732
  chunk,
376
733
  nextOffset: entry.produced,
377
- droppedBytes: Math.max(0, effective - from),
734
+ droppedBytes: Math.max(0, effective - from) + Math.max(0, aligned - skip),
378
735
  status: entry.record.status,
379
736
  ...(entry.record.exitCode === undefined ? {} : { exitCode: entry.record.exitCode }),
737
+ ...(entry.record.error === undefined ? {} : { error: entry.record.error }),
380
738
  }
381
739
  }
382
740
 
@@ -385,11 +743,18 @@ export class BackgroundJobRegistry {
385
743
  const entry = this.jobs.get(id)
386
744
  if (!entry) throw new UnknownBackgroundJobError({ id })
387
745
  if (entry.record.status !== 'running') return entry.record
746
+ if (entry.terminateProcess) {
747
+ entry.killRequested = true
748
+ await this.confirmTermination(entry)
749
+ await entry.exit
750
+ return entry.record
751
+ }
388
752
 
389
753
  // Marked before the signal, so the `close` handler that follows can
390
754
  // tell a kill from an ordinary exit. Set it after and the race decides
391
755
  // which of two different answers a reader gets.
392
756
  entry.record = { ...entry.record, status: 'killed' }
757
+ for (const observer of entry.outputObservers) observer()
393
758
  const signal = (sig: NodeJS.Signals) =>
394
759
  entry.killProcess ? entry.killProcess(sig) : killTree(entry.child, sig)
395
760
  signal('SIGTERM')
@@ -492,6 +857,10 @@ export function bindOwner(
492
857
  })
493
858
  },
494
859
  get: (id: string) => mine(id),
860
+ awaitStarted: (id: string) => {
861
+ mine(id)
862
+ return registry.awaitStarted(id)
863
+ },
495
864
  read: (id: string, opts?: { fromOffset?: number }) => {
496
865
  mine(id)
497
866
  return registry.read(id, opts ?? {})
@@ -500,6 +869,10 @@ export function bindOwner(
500
869
  mine(id)
501
870
  return registry.waitForExit(id, opts ?? {})
502
871
  },
872
+ waitForOutput: (id: string, opts: BackgroundJobOutputWaitOptions) => {
873
+ mine(id)
874
+ return registry.waitForOutput(id, opts)
875
+ },
503
876
  ...(defaults.onAwaited
504
877
  ? {
505
878
  markAwaited: (id: string) => {
@@ -20,6 +20,18 @@ export interface SessionLocatorOptions {
20
20
  readonly lease?: SessionLease
21
21
  }
22
22
 
23
+ /** Options for {@link abandonTurn}. */
24
+ export interface AbandonTurnOptions extends SessionLocatorOptions {
25
+ /**
26
+ * The caller gives the turn's messages back to the person, for instance by
27
+ * putting the prompt back in a message box to send again. The abandoned
28
+ * turn then contributes no message to the next turn's context, so the
29
+ * provider does not see that prompt twice. The records stay in the log.
30
+ * Absent (the default): the turn's messages stay in the context.
31
+ */
32
+ readonly withdrawMessages?: boolean
33
+ }
34
+
23
35
  /** Lease time-to-live for a lease a session-level operation claims for one append. */
24
36
  const OPERATION_LEASE_TTL_MS = 30_000
25
37
 
@@ -103,8 +115,12 @@ export async function abandonTurn(
103
115
  sessionId: SessionId,
104
116
  turnId: TurnId,
105
117
  reason: string,
106
- options: SessionLocatorOptions = {},
118
+ options: AbandonTurnOptions = {},
107
119
  ): Promise<void> {
108
120
  const log = await locateSessionLog(sessionId, options)
109
- await withSessionLease(log, options.lease, (lease) => log.abandonTurn(lease, turnId, reason))
121
+ await withSessionLease(log, options.lease, (lease) =>
122
+ log.abandonTurn(lease, turnId, reason, {
123
+ ...(options.withdrawMessages ? { withdrawMessages: true } : {}),
124
+ }),
125
+ )
110
126
  }