@namzu/sdk 34.2.0 → 36.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 (669) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +150 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +14 -14
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +15 -10
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +13 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +144 -55
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +42 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +153 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts +3 -3
  225. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  226. package/dist/runtime/query/iteration/index.js +47 -11
  227. package/dist/runtime/query/iteration/index.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  230. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  232. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  235. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  236. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  238. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  239. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +10 -5
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +20 -1
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/prompt.d.ts.map +1 -1
  248. package/dist/runtime/query/prompt.js +14 -4
  249. package/dist/runtime/query/prompt.js.map +1 -1
  250. package/dist/runtime/query/repeat-call.d.ts +20 -2
  251. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  252. package/dist/runtime/query/repeat-call.js +35 -7
  253. package/dist/runtime/query/repeat-call.js.map +1 -1
  254. package/dist/runtime/query/result.d.ts.map +1 -1
  255. package/dist/runtime/query/result.js +9 -0
  256. package/dist/runtime/query/result.js.map +1 -1
  257. package/dist/runtime/query/review-policy.d.ts +142 -0
  258. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  259. package/dist/runtime/query/review-policy.js +144 -0
  260. package/dist/runtime/query/review-policy.js.map +1 -0
  261. package/dist/runtime/query/run-state.d.ts.map +1 -1
  262. package/dist/runtime/query/run-state.js +4 -0
  263. package/dist/runtime/query/run-state.js.map +1 -1
  264. package/dist/runtime/query/steering.d.ts +4 -0
  265. package/dist/runtime/query/steering.d.ts.map +1 -1
  266. package/dist/runtime/query/steering.js +29 -0
  267. package/dist/runtime/query/steering.js.map +1 -1
  268. package/dist/runtime/query/token-budget.d.ts +7 -0
  269. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  270. package/dist/runtime/query/token-budget.js +101 -0
  271. package/dist/runtime/query/token-budget.js.map +1 -0
  272. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  273. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  274. package/dist/runtime/query/tool-output-budget.js +29 -11
  275. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  276. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  277. package/dist/runtime/query/tool-pause.js +4 -2
  278. package/dist/runtime/query/tool-pause.js.map +1 -1
  279. package/dist/runtime/query/tooling.d.ts +4 -0
  280. package/dist/runtime/query/tooling.d.ts.map +1 -1
  281. package/dist/runtime/query/tooling.js +4 -0
  282. package/dist/runtime/query/tooling.js.map +1 -1
  283. package/dist/sandbox/file-walk-program.d.ts +3 -0
  284. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  285. package/dist/sandbox/file-walk-program.js +94 -0
  286. package/dist/sandbox/file-walk-program.js.map +1 -0
  287. package/dist/sandbox/file-walk.d.ts +12 -0
  288. package/dist/sandbox/file-walk.d.ts.map +1 -0
  289. package/dist/sandbox/file-walk.js +429 -0
  290. package/dist/sandbox/file-walk.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +2 -0
  292. package/dist/sandbox/index.d.ts.map +1 -1
  293. package/dist/sandbox/index.js +1 -0
  294. package/dist/sandbox/index.js.map +1 -1
  295. package/dist/sandbox/provider/local.d.ts +3 -1
  296. package/dist/sandbox/provider/local.d.ts.map +1 -1
  297. package/dist/sandbox/provider/local.js +121 -12
  298. package/dist/sandbox/provider/local.js.map +1 -1
  299. package/dist/scheduler/completion-inbox.d.ts +3 -2
  300. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  301. package/dist/scheduler/completion-inbox.js +29 -15
  302. package/dist/scheduler/completion-inbox.js.map +1 -1
  303. package/dist/scheduler/delegating.d.ts +1 -0
  304. package/dist/scheduler/delegating.d.ts.map +1 -1
  305. package/dist/scheduler/delegating.js +29 -12
  306. package/dist/scheduler/delegating.js.map +1 -1
  307. package/dist/scheduler/local.d.ts +1 -0
  308. package/dist/scheduler/local.d.ts.map +1 -1
  309. package/dist/scheduler/local.js +4 -7
  310. package/dist/scheduler/local.js.map +1 -1
  311. package/dist/session/index.d.ts +0 -1
  312. package/dist/session/index.d.ts.map +1 -1
  313. package/dist/session/index.js +0 -1
  314. package/dist/session/index.js.map +1 -1
  315. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  316. package/dist/session/workspace/path-builder.js +5 -4
  317. package/dist/session/workspace/path-builder.js.map +1 -1
  318. package/dist/store/feedback/disk.d.ts.map +1 -1
  319. package/dist/store/feedback/disk.js +4 -6
  320. package/dist/store/feedback/disk.js.map +1 -1
  321. package/dist/store/index.d.ts +2 -0
  322. package/dist/store/index.d.ts.map +1 -1
  323. package/dist/store/index.js +1 -0
  324. package/dist/store/index.js.map +1 -1
  325. package/dist/store/memory/disk.d.ts.map +1 -1
  326. package/dist/store/memory/disk.js +3 -12
  327. package/dist/store/memory/disk.js.map +1 -1
  328. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  329. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  330. package/dist/store/run/checkpoint-disk.js +14 -26
  331. package/dist/store/run/checkpoint-disk.js.map +1 -1
  332. package/dist/store/run/claim-disk.js +1 -1
  333. package/dist/store/run/conformance.d.ts +1 -1
  334. package/dist/store/run/conformance.d.ts.map +1 -1
  335. package/dist/store/run/conformance.js +41 -33
  336. package/dist/store/run/conformance.js.map +1 -1
  337. package/dist/store/run/disk.d.ts.map +1 -1
  338. package/dist/store/run/disk.js +20 -4
  339. package/dist/store/run/disk.js.map +1 -1
  340. package/dist/store/run/token-budget-disk.d.ts +37 -0
  341. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  342. package/dist/store/run/token-budget-disk.js +208 -0
  343. package/dist/store/run/token-budget-disk.js.map +1 -0
  344. package/dist/store/session/disk.d.ts +4 -13
  345. package/dist/store/session/disk.d.ts.map +1 -1
  346. package/dist/store/session/disk.js +34 -31
  347. package/dist/store/session/disk.js.map +1 -1
  348. package/dist/store/session/memory.d.ts +2 -0
  349. package/dist/store/session/memory.d.ts.map +1 -1
  350. package/dist/store/session/memory.js +41 -2
  351. package/dist/store/session/memory.js.map +1 -1
  352. package/dist/store/task/disk.d.ts.map +1 -1
  353. package/dist/store/task/disk.js +7 -8
  354. package/dist/store/task/disk.js.map +1 -1
  355. package/dist/store/topic/memory.d.ts +2 -0
  356. package/dist/store/topic/memory.d.ts.map +1 -1
  357. package/dist/store/topic/memory.js +13 -1
  358. package/dist/store/topic/memory.js.map +1 -1
  359. package/dist/test-support/ids.d.ts +4 -19
  360. package/dist/test-support/ids.d.ts.map +1 -1
  361. package/dist/test-support/ids.js +51 -59
  362. package/dist/test-support/ids.js.map +1 -1
  363. package/dist/tools/advisory/index.d.ts.map +1 -1
  364. package/dist/tools/advisory/index.js +3 -1
  365. package/dist/tools/advisory/index.js.map +1 -1
  366. package/dist/tools/builtins/bash.d.ts +2 -0
  367. package/dist/tools/builtins/bash.d.ts.map +1 -1
  368. package/dist/tools/builtins/bash.js +224 -70
  369. package/dist/tools/builtins/bash.js.map +1 -1
  370. package/dist/tools/builtins/computer-use.d.ts +2 -2
  371. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  372. package/dist/tools/builtins/computer-use.js +4 -2
  373. package/dist/tools/builtins/computer-use.js.map +1 -1
  374. package/dist/tools/builtins/edit.js +2 -2
  375. package/dist/tools/builtins/edit.js.map +1 -1
  376. package/dist/tools/builtins/glob.d.ts +2 -1
  377. package/dist/tools/builtins/glob.d.ts.map +1 -1
  378. package/dist/tools/builtins/glob.js +95 -103
  379. package/dist/tools/builtins/glob.js.map +1 -1
  380. package/dist/tools/builtins/grep.d.ts.map +1 -1
  381. package/dist/tools/builtins/grep.js +155 -111
  382. package/dist/tools/builtins/grep.js.map +1 -1
  383. package/dist/tools/builtins/ls.js +4 -4
  384. package/dist/tools/builtins/ls.js.map +1 -1
  385. package/dist/tools/builtins/lsp.js +2 -2
  386. package/dist/tools/builtins/lsp.js.map +1 -1
  387. package/dist/tools/builtins/read-file.js +2 -2
  388. package/dist/tools/builtins/read-file.js.map +1 -1
  389. package/dist/tools/builtins/write-file.js +2 -2
  390. package/dist/tools/builtins/write-file.js.map +1 -1
  391. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  392. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  393. package/dist/tools/coordinator/ask-user-question.js +237 -0
  394. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  395. package/dist/tools/coordinator/index.d.ts +1 -2
  396. package/dist/tools/coordinator/index.d.ts.map +1 -1
  397. package/dist/tools/coordinator/index.js +4 -220
  398. package/dist/tools/coordinator/index.js.map +1 -1
  399. package/dist/tools/memory/read.d.ts.map +1 -1
  400. package/dist/tools/memory/read.js +2 -4
  401. package/dist/tools/memory/read.js.map +1 -1
  402. package/dist/tools/paths.d.ts +13 -0
  403. package/dist/tools/paths.d.ts.map +1 -1
  404. package/dist/tools/paths.js +53 -0
  405. package/dist/tools/paths.js.map +1 -1
  406. package/dist/tools/roster.d.ts +27 -0
  407. package/dist/tools/roster.d.ts.map +1 -0
  408. package/dist/tools/roster.js +42 -0
  409. package/dist/tools/roster.js.map +1 -0
  410. package/dist/types/agent/base.d.ts +5 -0
  411. package/dist/types/agent/base.d.ts.map +1 -1
  412. package/dist/types/agent/pipeline.d.ts +3 -0
  413. package/dist/types/agent/pipeline.d.ts.map +1 -1
  414. package/dist/types/agent/router.d.ts +2 -3
  415. package/dist/types/agent/router.d.ts.map +1 -1
  416. package/dist/types/agent/scheduler.d.ts +3 -0
  417. package/dist/types/agent/scheduler.d.ts.map +1 -1
  418. package/dist/types/agent/task.d.ts +5 -16
  419. package/dist/types/agent/task.d.ts.map +1 -1
  420. package/dist/types/agent/task.js.map +1 -1
  421. package/dist/types/common/index.d.ts.map +1 -1
  422. package/dist/types/common/index.js +3 -0
  423. package/dist/types/common/index.js.map +1 -1
  424. package/dist/types/computer-use/index.d.ts +8 -0
  425. package/dist/types/computer-use/index.d.ts.map +1 -1
  426. package/dist/types/computer-use/index.js.map +1 -1
  427. package/dist/types/hitl/index.d.ts +5 -0
  428. package/dist/types/hitl/index.d.ts.map +1 -1
  429. package/dist/types/hitl/index.js.map +1 -1
  430. package/dist/types/ids/brand.d.ts +5 -47
  431. package/dist/types/ids/brand.d.ts.map +1 -1
  432. package/dist/types/ids/brand.js +2 -39
  433. package/dist/types/ids/brand.js.map +1 -1
  434. package/dist/types/ids/index.d.ts +59 -69
  435. package/dist/types/ids/index.d.ts.map +1 -1
  436. package/dist/types/ids/index.js +12 -10
  437. package/dist/types/ids/index.js.map +1 -1
  438. package/dist/types/permission/index.d.ts +9 -0
  439. package/dist/types/permission/index.d.ts.map +1 -1
  440. package/dist/types/permission/index.js +9 -1
  441. package/dist/types/permission/index.js.map +1 -1
  442. package/dist/types/plugin/index.d.ts +45 -4
  443. package/dist/types/plugin/index.d.ts.map +1 -1
  444. package/dist/types/plugin/index.js +7 -0
  445. package/dist/types/plugin/index.js.map +1 -1
  446. package/dist/types/run/config.d.ts +3 -0
  447. package/dist/types/run/config.d.ts.map +1 -1
  448. package/dist/types/run/emergency.d.ts +5 -0
  449. package/dist/types/run/emergency.d.ts.map +1 -1
  450. package/dist/types/run/emergency.js.map +1 -1
  451. package/dist/types/run/entity.d.ts +6 -2
  452. package/dist/types/run/entity.d.ts.map +1 -1
  453. package/dist/types/run/events.d.ts +35 -0
  454. package/dist/types/run/events.d.ts.map +1 -1
  455. package/dist/types/run/events.js.map +1 -1
  456. package/dist/types/run/index.d.ts +1 -0
  457. package/dist/types/run/index.d.ts.map +1 -1
  458. package/dist/types/run/index.js +1 -0
  459. package/dist/types/run/index.js.map +1 -1
  460. package/dist/types/run/state.d.ts +16 -15
  461. package/dist/types/run/state.d.ts.map +1 -1
  462. package/dist/types/run/state.js +41 -22
  463. package/dist/types/run/state.js.map +1 -1
  464. package/dist/types/run/stop-reason.d.ts +3 -14
  465. package/dist/types/run/stop-reason.d.ts.map +1 -1
  466. package/dist/types/run/token-budget-store.d.ts +29 -0
  467. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  468. package/dist/types/run/token-budget-store.js +25 -0
  469. package/dist/types/run/token-budget-store.js.map +1 -0
  470. package/dist/types/sandbox/index.d.ts +47 -2
  471. package/dist/types/sandbox/index.d.ts.map +1 -1
  472. package/dist/types/sandbox/index.js.map +1 -1
  473. package/dist/types/session/store.d.ts +8 -0
  474. package/dist/types/session/store.d.ts.map +1 -1
  475. package/dist/types/tool/index.d.ts +15 -0
  476. package/dist/types/tool/index.d.ts.map +1 -1
  477. package/dist/types/tool/index.js.map +1 -1
  478. package/dist/utils/frontmatter.d.ts +1 -1
  479. package/dist/utils/frontmatter.js +1 -1
  480. package/dist/utils/id-format.d.ts +3 -0
  481. package/dist/utils/id-format.d.ts.map +1 -0
  482. package/dist/utils/id-format.js +9 -0
  483. package/dist/utils/id-format.js.map +1 -0
  484. package/dist/utils/id.d.ts +65 -32
  485. package/dist/utils/id.d.ts.map +1 -1
  486. package/dist/utils/id.js +168 -148
  487. package/dist/utils/id.js.map +1 -1
  488. package/dist/utils/log/exception.js +1 -1
  489. package/dist/utils/log/exception.js.map +1 -1
  490. package/dist/utils/log/index.d.ts.map +1 -1
  491. package/dist/utils/log/index.js +1 -2
  492. package/dist/utils/log/index.js.map +1 -1
  493. package/dist/utils/log/templates.d.ts.map +1 -1
  494. package/dist/utils/log/templates.js +0 -1
  495. package/dist/utils/log/templates.js.map +1 -1
  496. package/package.json +6 -1
  497. package/src/agents/AGENTS.md +1 -1
  498. package/src/agents/PipelineAgent.ts +129 -109
  499. package/src/agents/ReactiveAgent.ts +2 -0
  500. package/src/agents/RouterAgent.ts +120 -73
  501. package/src/agents/SupervisorAgent.ts +12 -4
  502. package/src/agents/budget.ts +42 -0
  503. package/src/agents/explore.ts +29 -0
  504. package/src/agents/file-definitions.ts +237 -0
  505. package/src/agents/index.ts +15 -0
  506. package/src/bridge/a2a/mapper.ts +6 -0
  507. package/src/bridge/sse/mapper.ts +22 -0
  508. package/src/bus/lock.ts +1 -10
  509. package/src/compaction/consolidation.ts +79 -0
  510. package/src/compaction/factory.ts +3 -0
  511. package/src/compaction/index.ts +34 -4
  512. package/src/compaction/manager.ts +39 -1
  513. package/src/compaction/plan.ts +52 -21
  514. package/src/compaction/salience/bm25.ts +72 -0
  515. package/src/compaction/salience/goal.ts +44 -0
  516. package/src/compaction/salience/index.ts +19 -0
  517. package/src/compaction/salience/minhash.ts +53 -0
  518. package/src/compaction/salience/score.ts +305 -0
  519. package/src/compaction/salience/tokenize.ts +89 -0
  520. package/src/compaction/salience/working-set.ts +187 -0
  521. package/src/compaction/serializer.ts +16 -0
  522. package/src/compaction/token-estimate.ts +57 -0
  523. package/src/compaction/tool-result-editing.ts +28 -26
  524. package/src/compaction/types.ts +24 -1
  525. package/src/compaction/wire.ts +5 -1
  526. package/src/config/runtime.ts +13 -1
  527. package/src/connector/builtins/http.ts +2 -8
  528. package/src/connector/builtins/webhook.ts +2 -2
  529. package/src/connector/mcp/adapter.ts +32 -0
  530. package/src/connector/tools/adapter.ts +2 -2
  531. package/src/connector/tools/definitions.ts +2 -2
  532. package/src/constants/compaction/index.ts +1 -0
  533. package/src/constants/telemetry/index.ts +0 -1
  534. package/src/contracts/api.ts +5 -1
  535. package/src/contracts/schemas.ts +6 -20
  536. package/src/invariants/index.ts +1 -1
  537. package/src/manager/agent/lifecycle.ts +380 -352
  538. package/src/manager/run/persistence.ts +35 -5
  539. package/src/plugin/index.ts +19 -0
  540. package/src/plugin/shell-hook.ts +403 -0
  541. package/src/prompt/coding-agent-doctrine.ts +118 -0
  542. package/src/prompt/index.ts +8 -0
  543. package/src/provider/errors.ts +1 -1
  544. package/src/provider/fallback.ts +4 -1
  545. package/src/provider/retry.ts +4 -1
  546. package/src/provider/token-budget.ts +158 -0
  547. package/src/public-runtime.ts +56 -28
  548. package/src/public-tools.ts +5 -0
  549. package/src/public-types.ts +65 -0
  550. package/src/registry/command/kernel-commands.ts +16 -6
  551. package/src/registry/tool/execute.ts +4 -1
  552. package/src/run/LimitChecker.ts +1 -1
  553. package/src/run/drain.ts +1 -1
  554. package/src/run/reporter.ts +15 -0
  555. package/src/run/token-budget.ts +692 -0
  556. package/src/runtime/jobs/registry.ts +123 -17
  557. package/src/runtime/query/checkpoint.ts +10 -3
  558. package/src/runtime/query/context.ts +3 -57
  559. package/src/runtime/query/executor.ts +181 -71
  560. package/src/runtime/query/guard.ts +8 -0
  561. package/src/runtime/query/index.ts +209 -62
  562. package/src/runtime/query/iteration/index.ts +53 -15
  563. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  564. package/src/runtime/query/iteration/phases/context.ts +4 -0
  565. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  566. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  567. package/src/runtime/query/iteration/stream-turn.ts +9 -5
  568. package/src/runtime/query/plugin-hooks.ts +24 -2
  569. package/src/runtime/query/prompt.ts +21 -4
  570. package/src/runtime/query/repeat-call.ts +42 -7
  571. package/src/runtime/query/result.ts +9 -0
  572. package/src/runtime/query/review-policy.ts +231 -0
  573. package/src/runtime/query/run-state.ts +4 -0
  574. package/src/runtime/query/steering.ts +32 -0
  575. package/src/runtime/query/token-budget.ts +127 -0
  576. package/src/runtime/query/tool-output-budget.ts +33 -10
  577. package/src/runtime/query/tool-pause.ts +4 -2
  578. package/src/runtime/query/tooling.ts +8 -0
  579. package/src/sandbox/file-walk-program.ts +93 -0
  580. package/src/sandbox/file-walk.ts +463 -0
  581. package/src/sandbox/index.ts +2 -0
  582. package/src/sandbox/provider/local.ts +136 -13
  583. package/src/scheduler/completion-inbox.ts +29 -19
  584. package/src/scheduler/delegating.ts +35 -13
  585. package/src/scheduler/local.ts +5 -7
  586. package/src/session/index.ts +0 -1
  587. package/src/session/workspace/path-builder.ts +5 -4
  588. package/src/store/feedback/disk.ts +4 -6
  589. package/src/store/index.ts +2 -0
  590. package/src/store/memory/disk.ts +3 -11
  591. package/src/store/run/checkpoint-disk.ts +14 -27
  592. package/src/store/run/claim-disk.ts +1 -1
  593. package/src/store/run/conformance.ts +55 -39
  594. package/src/store/run/disk.ts +19 -4
  595. package/src/store/run/token-budget-disk.ts +247 -0
  596. package/src/store/session/disk.ts +36 -29
  597. package/src/store/session/memory.ts +38 -1
  598. package/src/store/task/disk.ts +7 -8
  599. package/src/store/topic/memory.ts +13 -1
  600. package/src/test-support/ids.ts +62 -59
  601. package/src/tools/advisory/index.ts +3 -1
  602. package/src/tools/builtins/bash.ts +241 -70
  603. package/src/tools/builtins/computer-use.ts +6 -2
  604. package/src/tools/builtins/edit.ts +2 -2
  605. package/src/tools/builtins/glob.ts +104 -122
  606. package/src/tools/builtins/grep.ts +166 -132
  607. package/src/tools/builtins/ls.ts +4 -4
  608. package/src/tools/builtins/lsp.ts +2 -2
  609. package/src/tools/builtins/read-file.ts +2 -2
  610. package/src/tools/builtins/write-file.ts +2 -2
  611. package/src/tools/coordinator/ask-user-question.ts +284 -0
  612. package/src/tools/coordinator/index.ts +5 -248
  613. package/src/tools/memory/read.ts +2 -4
  614. package/src/tools/paths.ts +64 -0
  615. package/src/tools/roster.ts +46 -0
  616. package/src/types/agent/base.ts +6 -0
  617. package/src/types/agent/pipeline.ts +3 -0
  618. package/src/types/agent/router.ts +2 -3
  619. package/src/types/agent/scheduler.ts +4 -0
  620. package/src/types/agent/task.ts +5 -18
  621. package/src/types/common/index.ts +3 -0
  622. package/src/types/computer-use/index.ts +8 -0
  623. package/src/types/hitl/index.ts +5 -0
  624. package/src/types/ids/brand.ts +5 -48
  625. package/src/types/ids/index.ts +66 -75
  626. package/src/types/permission/index.ts +11 -0
  627. package/src/types/plugin/index.ts +49 -1
  628. package/src/types/run/config.ts +3 -0
  629. package/src/types/run/emergency.ts +5 -0
  630. package/src/types/run/entity.ts +6 -2
  631. package/src/types/run/events.ts +37 -0
  632. package/src/types/run/index.ts +1 -0
  633. package/src/types/run/state.ts +58 -30
  634. package/src/types/run/stop-reason.ts +3 -14
  635. package/src/types/run/token-budget-store.ts +54 -0
  636. package/src/types/sandbox/index.ts +53 -0
  637. package/src/types/session/store.ts +8 -0
  638. package/src/types/tool/index.ts +15 -0
  639. package/src/utils/frontmatter.ts +1 -1
  640. package/src/utils/id-format.ts +9 -0
  641. package/src/utils/id.ts +222 -181
  642. package/src/utils/log/exception.ts +1 -1
  643. package/src/utils/log/index.ts +1 -2
  644. package/src/utils/log/templates.ts +0 -1
  645. package/dist/session/migration/errors.d.ts +0 -26
  646. package/dist/session/migration/errors.d.ts.map +0 -1
  647. package/dist/session/migration/errors.js +0 -22
  648. package/dist/session/migration/errors.js.map +0 -1
  649. package/dist/session/migration/filesystem.d.ts +0 -122
  650. package/dist/session/migration/filesystem.d.ts.map +0 -1
  651. package/dist/session/migration/filesystem.js +0 -379
  652. package/dist/session/migration/filesystem.js.map +0 -1
  653. package/dist/session/migration/id-prefix.d.ts +0 -113
  654. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  655. package/dist/session/migration/id-prefix.js +0 -132
  656. package/dist/session/migration/id-prefix.js.map +0 -1
  657. package/dist/session/migration/index.d.ts +0 -12
  658. package/dist/session/migration/index.d.ts.map +0 -1
  659. package/dist/session/migration/index.js +0 -12
  660. package/dist/session/migration/index.js.map +0 -1
  661. package/dist/session/migration/marker.d.ts +0 -57
  662. package/dist/session/migration/marker.d.ts.map +0 -1
  663. package/dist/session/migration/marker.js +0 -123
  664. package/dist/session/migration/marker.js.map +0 -1
  665. package/src/session/migration/errors.ts +0 -23
  666. package/src/session/migration/filesystem.ts +0 -468
  667. package/src/session/migration/id-prefix.ts +0 -166
  668. package/src/session/migration/index.ts +0 -41
  669. package/src/session/migration/marker.ts +0 -142
@@ -1,3 +1,4 @@
1
+ import { join } from 'node:path'
1
2
  import type { Span } from '@opentelemetry/api'
2
3
  import type { AuthorizationGate } from '../../authorization/gate.js'
3
4
  import { extractFromToolCall, extractFromToolResult } from '../../compaction/extractor.js'
@@ -47,10 +48,11 @@ import { toErrorMessage } from '../../utils/error.js'
47
48
  import { generateToolCallId } from '../../utils/id.js'
48
49
  import type { Logger } from '../../utils/logger.js'
49
50
  import { compressShellOutput } from '../../utils/shell-compress.js'
50
- import { type BackgroundJobRegistry, bindOwner } from '../jobs/registry.js'
51
+ import { type BackgroundJobRegistry, type JobProcess, bindOwner } from '../jobs/registry.js'
51
52
  import type { ToolResultObservation } from './project-instructions.js'
52
53
  import {
53
54
  DEFAULT_MAX_TOOL_OUTPUT_CHARS,
55
+ type ToolOutputBudgetResult,
54
56
  applyToolOutputBudget,
55
57
  describeDroppedContent,
56
58
  measureContentBytes,
@@ -290,6 +292,8 @@ export interface ToolExecutorConfig {
290
292
  tools: ToolRegistryContract
291
293
  runId: RunId
292
294
  workingDirectory: string
295
+ /** See `ToolContext.additionalDirectories`. */
296
+ additionalDirectories?: readonly string[]
293
297
  /**
294
298
  * Read LIVE, not frozen at run start.
295
299
  *
@@ -319,6 +323,13 @@ export interface ToolExecutorConfig {
319
323
  * that fallback is a lie rather than a lesser version.
320
324
  */
321
325
  backgroundJobs?: BackgroundJobRegistry
326
+ /**
327
+ * Which owner the run's jobs are bound to. The run id by default, which
328
+ * scopes them to the run; a host that wants jobs to outlive a turn (a
329
+ * dev server started in one, read in the next) binds them to its
330
+ * session and stops them itself when the session ends.
331
+ */
332
+ backgroundJobOwner?: string
322
333
 
323
334
  /**
324
335
  * Where the `skill` tool reads from.
@@ -1175,6 +1186,9 @@ export class ToolExecutor {
1175
1186
  const context: ToolContext = {
1176
1187
  runId: this.config.runId,
1177
1188
  workingDirectory: this.config.workingDirectory,
1189
+ ...(this.config.additionalDirectories?.length
1190
+ ? { additionalDirectories: this.config.additionalDirectories }
1191
+ : {}),
1178
1192
  abortSignal: this.config.abortSignal,
1179
1193
  env: this.config.env,
1180
1194
  log: (level, message) => this.log[level](message),
@@ -1219,12 +1233,38 @@ export class ToolExecutor {
1219
1233
  // that its foreground work would use. A sandbox-aware persistent
1220
1234
  // process capability needs its own execution seam; until one exists,
1221
1235
  // the safe composition is to withhold this host capability entirely.
1222
- ...(this.config.backgroundJobs && !this.config.sandbox
1236
+ //
1237
+ // That seam now exists: a sandbox that can `spawnDetached` starts
1238
+ // the job inside its boundary, and the registry only keeps it. A
1239
+ // sandbox without it still withholds the capability.
1240
+ ...(this.config.backgroundJobs &&
1241
+ (!this.config.sandbox || this.config.sandbox.spawnDetached !== undefined)
1223
1242
  ? {
1224
- backgroundJobs: bindOwner(this.config.backgroundJobs, this.config.runId, {
1225
- workingDirectory: this.config.workingDirectory,
1226
- env: this.config.env,
1227
- }),
1243
+ backgroundJobs: bindOwner(
1244
+ this.config.backgroundJobs,
1245
+ this.config.backgroundJobOwner ?? this.config.runId,
1246
+ {
1247
+ workingDirectory: this.config.workingDirectory,
1248
+ env: this.config.env,
1249
+ ...(this.config.sandbox?.spawnDetached
1250
+ ? {
1251
+ spawn: (job: {
1252
+ readonly command: string
1253
+ readonly workingDirectory: string
1254
+ readonly env?: Record<string, string>
1255
+ }): JobProcess =>
1256
+ (this.config.sandbox as Sandbox).spawnDetached?.(
1257
+ '/bin/sh',
1258
+ ['-c', job.command],
1259
+ {
1260
+ cwd: job.workingDirectory,
1261
+ ...(job.env ? { env: job.env } : {}),
1262
+ },
1263
+ ) as JobProcess,
1264
+ }
1265
+ : {}),
1266
+ },
1267
+ ),
1228
1268
  }
1229
1269
  : {}),
1230
1270
  ...(this.parentSpan ? { parentSpan: this.parentSpan } : {}),
@@ -1239,6 +1279,9 @@ export class ToolExecutor {
1239
1279
  settleProgress: () => Promise<void>,
1240
1280
  preparedCall?: PreparedDirectCall,
1241
1281
  ): Promise<ToolCallOutcome> {
1282
+ if (this.config.abortSignal.aborted) {
1283
+ return this.recordCancelledBeforeExecution(toolCall.id, toolCall.function.name, {})
1284
+ }
1242
1285
  if (preparedCall?.kind === 'synthetic') {
1243
1286
  return this.recordSyntheticPreparation(preparedCall)
1244
1287
  }
@@ -1336,7 +1379,15 @@ export class ToolExecutor {
1336
1379
 
1337
1380
  input = resolved.input
1338
1381
 
1339
- const preOutcome = await this.runPreToolHook(toolName, input)
1382
+ let preOutcome: PreToolHookOutcome
1383
+ try {
1384
+ preOutcome = await this.runPreToolHook(toolName, input)
1385
+ } catch (error) {
1386
+ if (!this.config.abortSignal.aborted) throw error
1387
+ // A later call's interrupted preparation must not reject the batch
1388
+ // that already holds an earlier call's settled side-effect receipt.
1389
+ return this.recordCancelledBeforeExecution(toolCall.id, toolName, input)
1390
+ }
1340
1391
  if (preOutcome.kind === 'skip' || preOutcome.kind === 'error') {
1341
1392
  return this.recordSyntheticHookOutcome(toolCall.id, toolName, preOutcome.input, preOutcome)
1342
1393
  }
@@ -1443,6 +1494,7 @@ export class ToolExecutor {
1443
1494
  ...this.config.toolRetryBackoff,
1444
1495
  }
1445
1496
  for (let attempt = 1; ; attempt++) {
1497
+ if (this.config.abortSignal.aborted) break
1446
1498
  // A missing file will not appear on the second attempt; burning
1447
1499
  // the budget on it only delays the error the model needs to see.
1448
1500
  const toolWants = !result.success && result.retryable === true
@@ -1510,23 +1562,23 @@ export class ToolExecutor {
1510
1562
  const postOverride = post.override
1511
1563
  let output =
1512
1564
  postOverride?.output ?? (result.success ? this.maybeCompress(toolName, rawOutput) : rawOutput)
1513
- const selectedContent = postOverride?.isError
1565
+ let selectedContent = postOverride?.isError
1514
1566
  ? undefined
1515
1567
  : (postOverride?.content ?? result.content)
1516
- const maxToolOutputChars = this.config.maxToolOutputChars ?? DEFAULT_MAX_TOOL_OUTPUT_CHARS
1517
-
1518
- // If the text preview forces rich content out, say so inside the SAME
1519
- // budget. Appending this after truncation made the diagnostic itself a
1520
- // cap bypass; selecting a post-hook override after truncation was a
1521
- // larger bypass that could replace a bounded result with anything.
1522
- if (
1523
- maxToolOutputChars > 0 &&
1524
- output.length > maxToolOutputChars &&
1525
- selectedContent !== undefined
1526
- ) {
1527
- const dropped = describeDroppedContent(selectedContent)
1528
- if (dropped) output = `${output}\n\n${dropped}`
1568
+ if (postOverride && !postOverride.isError && postOverride.content === undefined) {
1569
+ // A text redaction must reach both text channels. Only the image or
1570
+ // document blocks survive implicitly; explicit replacement content
1571
+ // remains the hook's complete model-visible decision.
1572
+ if (typeof selectedContent === 'string') selectedContent = postOverride.output
1573
+ else if (selectedContent) {
1574
+ selectedContent = [
1575
+ { type: 'text', text: postOverride.output },
1576
+ ...selectedContent.filter((block) => block.type !== 'text'),
1577
+ ]
1578
+ }
1529
1579
  }
1580
+ const maxToolOutputChars = this.config.maxToolOutputChars ?? DEFAULT_MAX_TOOL_OUTPUT_CHARS
1581
+ const sourceOutput = output
1530
1582
 
1531
1583
  // Compression is opportunistic and shell-only; the budget is the
1532
1584
  // hard bound that applies to every final tool result, including a
@@ -1553,6 +1605,10 @@ export class ToolExecutor {
1553
1605
  })
1554
1606
  }
1555
1607
  output = budgeted.output
1608
+ const modelContent =
1609
+ selectedContent === undefined
1610
+ ? undefined
1611
+ : this.budgetContent(selectedContent, toolName, toolCall.id, { sourceOutput, budgeted })
1556
1612
 
1557
1613
  // A failed call, or an override that says the call failed. A `replace`
1558
1614
  // says the opposite, and reading it as a failure is what made redaction
@@ -1562,6 +1618,9 @@ export class ToolExecutor {
1562
1618
 
1563
1619
  if (this.workingStateManager) {
1564
1620
  extractFromToolResult(this.workingStateManager, toolName, output, effectiveIsError)
1621
+ for (const pin of this.config.abortSignal.aborted ? [] : (result.workingState ?? [])) {
1622
+ this.workingStateManager.pin(pin.key, pin.text, toolName)
1623
+ }
1565
1624
  }
1566
1625
 
1567
1626
  if (result.success) {
@@ -1576,7 +1635,7 @@ export class ToolExecutor {
1576
1635
  [NAMZU.RUN_ID]: this.config.runId,
1577
1636
  [GENAI.TOOL_NAME]: toolName,
1578
1637
  'namzu.duration_ms': durationMs,
1579
- 'exception.message': result.error ?? 'unknown',
1638
+ 'exception.message': postOverride ? output : (result.error ?? 'unknown'),
1580
1639
  })
1581
1640
  }
1582
1641
 
@@ -1615,11 +1674,6 @@ export class ToolExecutor {
1615
1674
  result,
1616
1675
  })
1617
1676
 
1618
- const resolveContent = (): { content?: ToolResultContent } => {
1619
- if (budgeted.truncated || selectedContent === undefined) return {}
1620
- return { content: this.budgetContent(selectedContent, toolName) }
1621
- }
1622
-
1623
1677
  return {
1624
1678
  toolCallId: toolCall.id,
1625
1679
  toolName,
@@ -1629,13 +1683,12 @@ export class ToolExecutor {
1629
1683
  //
1630
1684
  // An ERROR override drops it: the payload is no longer the tool's,
1631
1685
  // and shipping an image beside a failure message describes something
1632
- // the model was just told did not happen. A spilled preview drops it
1633
- // for the same reason.
1686
+ // the model was just told did not happen.
1634
1687
  //
1635
1688
  // A REPLACE keeps it, because the common case is redacting text from
1636
1689
  // a result whose image is unaffected — and a hook that needs it gone
1637
1690
  // says so with `content`, which wins over both.
1638
- ...resolveContent(),
1691
+ ...(modelContent !== undefined ? { content: modelContent } : {}),
1639
1692
  }
1640
1693
  }
1641
1694
 
@@ -2108,6 +2161,7 @@ export class ToolExecutor {
2108
2161
  output: `Error: ${result.message}`,
2109
2162
  }
2110
2163
  case 'retry':
2164
+ case 'annotate':
2111
2165
  // There is no result to replace yet. Rejecting loudly beats
2112
2166
  // silently ignoring it: a hook author who returned this here
2113
2167
  // meant to redact something and would otherwise watch the secret
@@ -2327,17 +2381,33 @@ export class ToolExecutor {
2327
2381
  toolResult: ToolResult,
2328
2382
  ): Promise<{ override: PostToolOverride | null; retry: boolean }> {
2329
2383
  if (!this.config.pluginManager) return { override: null, retry: false }
2330
- const results = await this.config.pluginManager.executeHooks(
2331
- 'post_tool_use',
2332
- {
2333
- runId: this.config.runId,
2334
- toolName,
2335
- toolInput: input,
2336
- toolResult,
2337
- signal: this.config.abortSignal,
2338
- },
2339
- this.emitEvent,
2340
- )
2384
+ let results: PluginHookResult[]
2385
+ try {
2386
+ results = await this.config.pluginManager.executeHooks(
2387
+ 'post_tool_use',
2388
+ {
2389
+ runId: this.config.runId,
2390
+ toolName,
2391
+ toolInput: input,
2392
+ toolResult,
2393
+ signal: this.config.abortSignal,
2394
+ },
2395
+ this.emitEvent,
2396
+ )
2397
+ } catch (error) {
2398
+ if (!this.config.abortSignal.aborted) throw error
2399
+ // The tool has already returned. Cancellation of a later redaction
2400
+ // cannot erase that execution or turn it into a safe-to-repeat call.
2401
+ // Withhold both channels until their post-tool policy has completed.
2402
+ const outcome = toolResult.success
2403
+ ? 'reported success before cancellation. The call already executed.'
2404
+ : 'reported failure while cancellation was in progress. Side effects are possible.'
2405
+ const output = `Tool "${toolName}" ${outcome} Output withheld because post-tool review was interrupted. Inspect external state before any retry.`
2406
+ return {
2407
+ override: { output, content: output, isError: !toolResult.success },
2408
+ retry: false,
2409
+ }
2410
+ }
2341
2411
  let override: PostToolOverride | null = null
2342
2412
  let retry = false
2343
2413
  for (const result of results) {
@@ -2368,6 +2438,7 @@ export class ToolExecutor {
2368
2438
  continue
2369
2439
  case 'skip':
2370
2440
  case 'modify':
2441
+ case 'annotate':
2371
2442
  throw new Error(
2372
2443
  `Plugin hook post_tool_use returned unsupported action '${result.action}' for tool ${toolName}`,
2373
2444
  )
@@ -2441,6 +2512,18 @@ export class ToolExecutor {
2441
2512
  return { toolCallId: toolCall.id, toolName, output, isError: true }
2442
2513
  }
2443
2514
 
2515
+ private recordCancelledBeforeExecution(
2516
+ toolCallId: string,
2517
+ toolName: string,
2518
+ input: unknown,
2519
+ ): Promise<ToolCallOutcome> {
2520
+ const reason = abortReasonText(this.config.abortSignal.reason)
2521
+ return this.recordSyntheticHookOutcome(toolCallId, toolName, input, {
2522
+ kind: 'error',
2523
+ output: `Tool "${toolName}" was not started because the run was cancelled${reason ? `: ${reason}` : '.'}`,
2524
+ })
2525
+ }
2526
+
2444
2527
  private async recordSyntheticHookOutcome(
2445
2528
  toolCallId: string,
2446
2529
  toolName: string,
@@ -2493,42 +2576,69 @@ export class ToolExecutor {
2493
2576
  }
2494
2577
 
2495
2578
  /**
2496
- * Bound the rich channel, or leave it alone when no cap is configured.
2497
- *
2498
- * Refused whole rather than trimmed: half a base64 payload is not a
2499
- * smaller image, it is a corrupt one, and a driver handed it would
2500
- * either fail the request or show the model noise. The text half stays
2501
- * untouched, so the result still says what happened — and the
2502
- * replacement names what was withheld and how big it was, which is what
2503
- * lets the agent ask for a smaller region instead of retrying the same
2504
- * call.
2579
+ * The host preview and model text may differ; each gets its own text
2580
+ * budget. Rich bytes are measured separately and withheld whole when
2581
+ * over their cap, with a notice inside the model text's same hard bound.
2505
2582
  */
2506
2583
  private budgetContent(
2507
- content: import('../../types/message/index.js').ToolResultContent,
2584
+ content: ToolResultContent,
2508
2585
  toolName: string,
2509
- ): import('../../types/message/index.js').ToolResultContent {
2586
+ toolUseId: string,
2587
+ host: { sourceOutput: string; budgeted: ToolOutputBudgetResult },
2588
+ ): ToolResultContent {
2510
2589
  const cap = this.config.maxToolContentBytes ?? 0
2511
- if (cap <= 0) return content
2512
-
2513
2590
  const size = measureContentBytes(content)
2514
- if (size <= cap) return content
2515
-
2516
- this.log.warn('Tool result content exceeded the rich-content budget', {
2517
- [NAMZU.RUN_ID]: this.config.runId,
2518
- [GENAI.TOOL_NAME]: toolName,
2519
- 'namzu.runtime.content_bytes': size,
2520
- 'namzu.runtime.cap': cap,
2521
- })
2522
-
2523
- const described = describeDroppedContent(content)
2591
+ const richWithheld = cap > 0 && size > cap
2592
+ const text =
2593
+ typeof content === 'string'
2594
+ ? content
2595
+ : content.flatMap((block) => (block.type === 'text' ? [block.text] : [])).join('\n')
2596
+ const notice = richWithheld
2597
+ ? `[rich content withheld: ${size} base64 chars exceeds this run's ${cap} cap] ${describeDroppedContent(content) ?? ''}`
2598
+ : undefined
2599
+ if (richWithheld) {
2600
+ this.log.warn('Tool result content exceeded the rich-content budget', {
2601
+ [NAMZU.RUN_ID]: this.config.runId,
2602
+ [GENAI.TOOL_NAME]: toolName,
2603
+ 'namzu.runtime.content_bytes': size,
2604
+ 'namzu.runtime.cap': cap,
2605
+ })
2606
+ }
2607
+ const budgeted =
2608
+ text === host.sourceOutput && !notice
2609
+ ? host.budgeted
2610
+ : applyToolOutputBudget({
2611
+ toolName,
2612
+ toolUseId,
2613
+ output: text,
2614
+ maxChars: this.config.maxToolOutputChars ?? DEFAULT_MAX_TOOL_OUTPUT_CHARS,
2615
+ ...(notice ? { notice } : {}),
2616
+ // A tool may return different host and model text. They must
2617
+ // never compete for the same exclusive spill filename.
2618
+ spillDir: this.config.toolOutputDir
2619
+ ? join(this.config.toolOutputDir, 'content')
2620
+ : undefined,
2621
+ onError: (message) =>
2622
+ this.log.warn('Failed to spill oversized model tool content', {
2623
+ [NAMZU.RUN_ID]: this.config.runId,
2624
+ [GENAI.TOOL_NAME]: toolName,
2625
+ 'exception.message': message,
2626
+ }),
2627
+ })
2628
+ if (budgeted.truncated && budgeted !== host.budgeted) {
2629
+ this.log.warn('Model tool text exceeded the model-visible budget', {
2630
+ [NAMZU.RUN_ID]: this.config.runId,
2631
+ [GENAI.TOOL_NAME]: toolName,
2632
+ 'namzu.runtime.original_length': budgeted.originalLength,
2633
+ 'namzu.runtime.spill_path': budgeted.spillPath,
2634
+ })
2635
+ }
2636
+ if (!budgeted.truncated && !richWithheld) return content
2637
+ if (typeof content === 'string') return budgeted.output
2524
2638
  return [
2525
- {
2526
- type: 'text',
2527
- text: `[rich content withheld: ${size} base64 chars exceeds this run's ${cap} cap${
2528
- described ? ` — ${described}` : ''
2529
- }]`,
2530
- },
2531
- ] as import('../../types/message/index.js').ToolResultContent
2639
+ ...(budgeted.output ? [{ type: 'text' as const, text: budgeted.output }] : []),
2640
+ ...(richWithheld ? [] : content.filter((block) => block.type !== 'text')),
2641
+ ]
2532
2642
  }
2533
2643
 
2534
2644
  private maybeCompress(toolName: string, output: string): string {
@@ -110,6 +110,14 @@ export class GuardCoordinator {
110
110
  }
111
111
 
112
112
  const limitResult = checkLimitsDetailed(this.limitConfig, limitState)
113
+ if (!abortSignal.aborted && runMgr.budget && runMgr.budget.remaining <= 0) {
114
+ return {
115
+ shouldStop: true,
116
+ forceFinalize: false,
117
+ stopReason: 'token_budget',
118
+ isCancelled: false,
119
+ }
120
+ }
113
121
 
114
122
  if (limitResult.type === 'hard_stop') {
115
123
  return {