@namzu/sdk 34.2.0 → 35.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 (637) hide show
  1. package/CHANGELOG.md +133 -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 +102 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +12 -12
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +14 -9
  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 +12 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +95 -46
  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 +35 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +152 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  225. package/dist/runtime/query/iteration/index.js +16 -5
  226. package/dist/runtime/query/iteration/index.js.map +1 -1
  227. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  229. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  230. package/dist/runtime/query/iteration/phases/context.d.ts +2 -0
  231. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  232. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  233. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  235. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  236. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  238. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  239. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  240. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  241. package/dist/runtime/query/plugin-hooks.js +20 -1
  242. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  243. package/dist/runtime/query/repeat-call.d.ts +20 -2
  244. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  245. package/dist/runtime/query/repeat-call.js +35 -7
  246. package/dist/runtime/query/repeat-call.js.map +1 -1
  247. package/dist/runtime/query/result.d.ts.map +1 -1
  248. package/dist/runtime/query/result.js +9 -0
  249. package/dist/runtime/query/result.js.map +1 -1
  250. package/dist/runtime/query/review-policy.d.ts +142 -0
  251. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  252. package/dist/runtime/query/review-policy.js +144 -0
  253. package/dist/runtime/query/review-policy.js.map +1 -0
  254. package/dist/runtime/query/run-state.d.ts.map +1 -1
  255. package/dist/runtime/query/run-state.js +4 -0
  256. package/dist/runtime/query/run-state.js.map +1 -1
  257. package/dist/runtime/query/steering.d.ts +4 -0
  258. package/dist/runtime/query/steering.d.ts.map +1 -1
  259. package/dist/runtime/query/steering.js +29 -0
  260. package/dist/runtime/query/steering.js.map +1 -1
  261. package/dist/runtime/query/token-budget.d.ts +7 -0
  262. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  263. package/dist/runtime/query/token-budget.js +101 -0
  264. package/dist/runtime/query/token-budget.js.map +1 -0
  265. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  266. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  267. package/dist/runtime/query/tool-output-budget.js +29 -11
  268. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  269. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  270. package/dist/runtime/query/tool-pause.js +4 -2
  271. package/dist/runtime/query/tool-pause.js.map +1 -1
  272. package/dist/runtime/query/tooling.d.ts +4 -0
  273. package/dist/runtime/query/tooling.d.ts.map +1 -1
  274. package/dist/runtime/query/tooling.js +4 -0
  275. package/dist/runtime/query/tooling.js.map +1 -1
  276. package/dist/sandbox/provider/local.d.ts +3 -1
  277. package/dist/sandbox/provider/local.d.ts.map +1 -1
  278. package/dist/sandbox/provider/local.js +112 -12
  279. package/dist/sandbox/provider/local.js.map +1 -1
  280. package/dist/scheduler/delegating.d.ts +1 -0
  281. package/dist/scheduler/delegating.d.ts.map +1 -1
  282. package/dist/scheduler/delegating.js +29 -12
  283. package/dist/scheduler/delegating.js.map +1 -1
  284. package/dist/scheduler/local.d.ts +1 -0
  285. package/dist/scheduler/local.d.ts.map +1 -1
  286. package/dist/scheduler/local.js +4 -7
  287. package/dist/scheduler/local.js.map +1 -1
  288. package/dist/session/index.d.ts +0 -1
  289. package/dist/session/index.d.ts.map +1 -1
  290. package/dist/session/index.js +0 -1
  291. package/dist/session/index.js.map +1 -1
  292. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  293. package/dist/session/workspace/path-builder.js +5 -4
  294. package/dist/session/workspace/path-builder.js.map +1 -1
  295. package/dist/store/feedback/disk.d.ts.map +1 -1
  296. package/dist/store/feedback/disk.js +4 -6
  297. package/dist/store/feedback/disk.js.map +1 -1
  298. package/dist/store/index.d.ts +2 -0
  299. package/dist/store/index.d.ts.map +1 -1
  300. package/dist/store/index.js +1 -0
  301. package/dist/store/index.js.map +1 -1
  302. package/dist/store/memory/disk.d.ts.map +1 -1
  303. package/dist/store/memory/disk.js +3 -12
  304. package/dist/store/memory/disk.js.map +1 -1
  305. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  306. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  307. package/dist/store/run/checkpoint-disk.js +14 -26
  308. package/dist/store/run/checkpoint-disk.js.map +1 -1
  309. package/dist/store/run/claim-disk.js +1 -1
  310. package/dist/store/run/conformance.d.ts +1 -1
  311. package/dist/store/run/conformance.d.ts.map +1 -1
  312. package/dist/store/run/conformance.js +41 -33
  313. package/dist/store/run/conformance.js.map +1 -1
  314. package/dist/store/run/disk.d.ts.map +1 -1
  315. package/dist/store/run/disk.js +20 -4
  316. package/dist/store/run/disk.js.map +1 -1
  317. package/dist/store/run/token-budget-disk.d.ts +37 -0
  318. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  319. package/dist/store/run/token-budget-disk.js +208 -0
  320. package/dist/store/run/token-budget-disk.js.map +1 -0
  321. package/dist/store/session/disk.d.ts +4 -13
  322. package/dist/store/session/disk.d.ts.map +1 -1
  323. package/dist/store/session/disk.js +34 -31
  324. package/dist/store/session/disk.js.map +1 -1
  325. package/dist/store/session/memory.d.ts +2 -0
  326. package/dist/store/session/memory.d.ts.map +1 -1
  327. package/dist/store/session/memory.js +41 -2
  328. package/dist/store/session/memory.js.map +1 -1
  329. package/dist/store/task/disk.d.ts.map +1 -1
  330. package/dist/store/task/disk.js +7 -8
  331. package/dist/store/task/disk.js.map +1 -1
  332. package/dist/store/topic/memory.d.ts +2 -0
  333. package/dist/store/topic/memory.d.ts.map +1 -1
  334. package/dist/store/topic/memory.js +13 -1
  335. package/dist/store/topic/memory.js.map +1 -1
  336. package/dist/test-support/ids.d.ts +4 -19
  337. package/dist/test-support/ids.d.ts.map +1 -1
  338. package/dist/test-support/ids.js +51 -59
  339. package/dist/test-support/ids.js.map +1 -1
  340. package/dist/tools/advisory/index.d.ts.map +1 -1
  341. package/dist/tools/advisory/index.js +3 -1
  342. package/dist/tools/advisory/index.js.map +1 -1
  343. package/dist/tools/builtins/bash.d.ts +2 -0
  344. package/dist/tools/builtins/bash.d.ts.map +1 -1
  345. package/dist/tools/builtins/bash.js +9 -11
  346. package/dist/tools/builtins/bash.js.map +1 -1
  347. package/dist/tools/builtins/computer-use.d.ts +2 -2
  348. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  349. package/dist/tools/builtins/computer-use.js +4 -2
  350. package/dist/tools/builtins/computer-use.js.map +1 -1
  351. package/dist/tools/builtins/edit.js +2 -2
  352. package/dist/tools/builtins/edit.js.map +1 -1
  353. package/dist/tools/builtins/glob.js +3 -3
  354. package/dist/tools/builtins/glob.js.map +1 -1
  355. package/dist/tools/builtins/grep.js +2 -2
  356. package/dist/tools/builtins/grep.js.map +1 -1
  357. package/dist/tools/builtins/ls.js +2 -2
  358. package/dist/tools/builtins/ls.js.map +1 -1
  359. package/dist/tools/builtins/lsp.js +2 -2
  360. package/dist/tools/builtins/lsp.js.map +1 -1
  361. package/dist/tools/builtins/read-file.js +2 -2
  362. package/dist/tools/builtins/read-file.js.map +1 -1
  363. package/dist/tools/builtins/write-file.js +2 -2
  364. package/dist/tools/builtins/write-file.js.map +1 -1
  365. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  366. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  367. package/dist/tools/coordinator/ask-user-question.js +237 -0
  368. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  369. package/dist/tools/coordinator/index.d.ts +1 -2
  370. package/dist/tools/coordinator/index.d.ts.map +1 -1
  371. package/dist/tools/coordinator/index.js +4 -220
  372. package/dist/tools/coordinator/index.js.map +1 -1
  373. package/dist/tools/memory/read.d.ts.map +1 -1
  374. package/dist/tools/memory/read.js +2 -4
  375. package/dist/tools/memory/read.js.map +1 -1
  376. package/dist/tools/paths.d.ts +13 -0
  377. package/dist/tools/paths.d.ts.map +1 -1
  378. package/dist/tools/paths.js +53 -0
  379. package/dist/tools/paths.js.map +1 -1
  380. package/dist/tools/roster.d.ts +27 -0
  381. package/dist/tools/roster.d.ts.map +1 -0
  382. package/dist/tools/roster.js +42 -0
  383. package/dist/tools/roster.js.map +1 -0
  384. package/dist/types/agent/base.d.ts +5 -0
  385. package/dist/types/agent/base.d.ts.map +1 -1
  386. package/dist/types/agent/pipeline.d.ts +3 -0
  387. package/dist/types/agent/pipeline.d.ts.map +1 -1
  388. package/dist/types/agent/router.d.ts +2 -3
  389. package/dist/types/agent/router.d.ts.map +1 -1
  390. package/dist/types/agent/scheduler.d.ts +3 -0
  391. package/dist/types/agent/scheduler.d.ts.map +1 -1
  392. package/dist/types/agent/task.d.ts +5 -16
  393. package/dist/types/agent/task.d.ts.map +1 -1
  394. package/dist/types/agent/task.js.map +1 -1
  395. package/dist/types/common/index.d.ts.map +1 -1
  396. package/dist/types/common/index.js +3 -0
  397. package/dist/types/common/index.js.map +1 -1
  398. package/dist/types/computer-use/index.d.ts +8 -0
  399. package/dist/types/computer-use/index.d.ts.map +1 -1
  400. package/dist/types/computer-use/index.js.map +1 -1
  401. package/dist/types/hitl/index.d.ts +5 -0
  402. package/dist/types/hitl/index.d.ts.map +1 -1
  403. package/dist/types/hitl/index.js.map +1 -1
  404. package/dist/types/ids/brand.d.ts +5 -47
  405. package/dist/types/ids/brand.d.ts.map +1 -1
  406. package/dist/types/ids/brand.js +2 -39
  407. package/dist/types/ids/brand.js.map +1 -1
  408. package/dist/types/ids/index.d.ts +59 -69
  409. package/dist/types/ids/index.d.ts.map +1 -1
  410. package/dist/types/ids/index.js +12 -10
  411. package/dist/types/ids/index.js.map +1 -1
  412. package/dist/types/permission/index.d.ts +9 -0
  413. package/dist/types/permission/index.d.ts.map +1 -1
  414. package/dist/types/permission/index.js +9 -1
  415. package/dist/types/permission/index.js.map +1 -1
  416. package/dist/types/plugin/index.d.ts +45 -4
  417. package/dist/types/plugin/index.d.ts.map +1 -1
  418. package/dist/types/plugin/index.js +7 -0
  419. package/dist/types/plugin/index.js.map +1 -1
  420. package/dist/types/run/config.d.ts +3 -0
  421. package/dist/types/run/config.d.ts.map +1 -1
  422. package/dist/types/run/emergency.d.ts +5 -0
  423. package/dist/types/run/emergency.d.ts.map +1 -1
  424. package/dist/types/run/emergency.js.map +1 -1
  425. package/dist/types/run/entity.d.ts +6 -2
  426. package/dist/types/run/entity.d.ts.map +1 -1
  427. package/dist/types/run/events.d.ts +35 -0
  428. package/dist/types/run/events.d.ts.map +1 -1
  429. package/dist/types/run/events.js.map +1 -1
  430. package/dist/types/run/index.d.ts +1 -0
  431. package/dist/types/run/index.d.ts.map +1 -1
  432. package/dist/types/run/index.js +1 -0
  433. package/dist/types/run/index.js.map +1 -1
  434. package/dist/types/run/state.d.ts +16 -15
  435. package/dist/types/run/state.d.ts.map +1 -1
  436. package/dist/types/run/state.js +41 -22
  437. package/dist/types/run/state.js.map +1 -1
  438. package/dist/types/run/stop-reason.d.ts +3 -14
  439. package/dist/types/run/stop-reason.d.ts.map +1 -1
  440. package/dist/types/run/token-budget-store.d.ts +29 -0
  441. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  442. package/dist/types/run/token-budget-store.js +25 -0
  443. package/dist/types/run/token-budget-store.js.map +1 -0
  444. package/dist/types/sandbox/index.d.ts +27 -2
  445. package/dist/types/sandbox/index.d.ts.map +1 -1
  446. package/dist/types/sandbox/index.js.map +1 -1
  447. package/dist/types/session/store.d.ts +8 -0
  448. package/dist/types/session/store.d.ts.map +1 -1
  449. package/dist/types/tool/index.d.ts +15 -0
  450. package/dist/types/tool/index.d.ts.map +1 -1
  451. package/dist/types/tool/index.js.map +1 -1
  452. package/dist/utils/frontmatter.d.ts +1 -1
  453. package/dist/utils/frontmatter.js +1 -1
  454. package/dist/utils/id-format.d.ts +3 -0
  455. package/dist/utils/id-format.d.ts.map +1 -0
  456. package/dist/utils/id-format.js +9 -0
  457. package/dist/utils/id-format.js.map +1 -0
  458. package/dist/utils/id.d.ts +65 -32
  459. package/dist/utils/id.d.ts.map +1 -1
  460. package/dist/utils/id.js +168 -148
  461. package/dist/utils/id.js.map +1 -1
  462. package/dist/utils/log/exception.js +1 -1
  463. package/dist/utils/log/exception.js.map +1 -1
  464. package/dist/utils/log/index.d.ts.map +1 -1
  465. package/dist/utils/log/index.js +1 -2
  466. package/dist/utils/log/index.js.map +1 -1
  467. package/dist/utils/log/templates.d.ts.map +1 -1
  468. package/dist/utils/log/templates.js +0 -1
  469. package/dist/utils/log/templates.js.map +1 -1
  470. package/package.json +1 -1
  471. package/src/agents/AGENTS.md +1 -1
  472. package/src/agents/PipelineAgent.ts +129 -109
  473. package/src/agents/ReactiveAgent.ts +2 -0
  474. package/src/agents/RouterAgent.ts +120 -73
  475. package/src/agents/SupervisorAgent.ts +12 -4
  476. package/src/agents/budget.ts +42 -0
  477. package/src/agents/explore.ts +29 -0
  478. package/src/agents/file-definitions.ts +237 -0
  479. package/src/agents/index.ts +15 -0
  480. package/src/bridge/a2a/mapper.ts +6 -0
  481. package/src/bridge/sse/mapper.ts +22 -0
  482. package/src/bus/lock.ts +1 -10
  483. package/src/compaction/consolidation.ts +79 -0
  484. package/src/compaction/factory.ts +3 -0
  485. package/src/compaction/index.ts +34 -4
  486. package/src/compaction/manager.ts +39 -1
  487. package/src/compaction/plan.ts +52 -21
  488. package/src/compaction/salience/bm25.ts +72 -0
  489. package/src/compaction/salience/goal.ts +44 -0
  490. package/src/compaction/salience/index.ts +19 -0
  491. package/src/compaction/salience/minhash.ts +53 -0
  492. package/src/compaction/salience/score.ts +305 -0
  493. package/src/compaction/salience/tokenize.ts +89 -0
  494. package/src/compaction/salience/working-set.ts +187 -0
  495. package/src/compaction/serializer.ts +16 -0
  496. package/src/compaction/token-estimate.ts +57 -0
  497. package/src/compaction/tool-result-editing.ts +28 -26
  498. package/src/compaction/types.ts +24 -1
  499. package/src/compaction/wire.ts +5 -1
  500. package/src/config/runtime.ts +13 -1
  501. package/src/connector/builtins/http.ts +2 -8
  502. package/src/connector/builtins/webhook.ts +2 -2
  503. package/src/connector/mcp/adapter.ts +32 -0
  504. package/src/connector/tools/adapter.ts +2 -2
  505. package/src/connector/tools/definitions.ts +2 -2
  506. package/src/constants/compaction/index.ts +1 -0
  507. package/src/constants/telemetry/index.ts +0 -1
  508. package/src/contracts/api.ts +5 -1
  509. package/src/contracts/schemas.ts +6 -20
  510. package/src/invariants/index.ts +1 -1
  511. package/src/manager/agent/lifecycle.ts +380 -352
  512. package/src/manager/run/persistence.ts +35 -5
  513. package/src/plugin/index.ts +19 -0
  514. package/src/plugin/shell-hook.ts +403 -0
  515. package/src/prompt/coding-agent-doctrine.ts +118 -0
  516. package/src/prompt/index.ts +8 -0
  517. package/src/provider/errors.ts +1 -1
  518. package/src/provider/fallback.ts +4 -1
  519. package/src/provider/retry.ts +4 -1
  520. package/src/provider/token-budget.ts +114 -0
  521. package/src/public-runtime.ts +54 -27
  522. package/src/public-tools.ts +5 -0
  523. package/src/public-types.ts +65 -0
  524. package/src/registry/command/kernel-commands.ts +16 -6
  525. package/src/registry/tool/execute.ts +4 -1
  526. package/src/run/LimitChecker.ts +1 -1
  527. package/src/run/drain.ts +1 -1
  528. package/src/run/reporter.ts +15 -0
  529. package/src/run/token-budget.ts +692 -0
  530. package/src/runtime/jobs/registry.ts +123 -17
  531. package/src/runtime/query/checkpoint.ts +10 -3
  532. package/src/runtime/query/context.ts +3 -57
  533. package/src/runtime/query/executor.ts +128 -58
  534. package/src/runtime/query/guard.ts +8 -0
  535. package/src/runtime/query/index.ts +201 -62
  536. package/src/runtime/query/iteration/index.ts +24 -6
  537. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  538. package/src/runtime/query/iteration/phases/context.ts +2 -0
  539. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  540. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  541. package/src/runtime/query/plugin-hooks.ts +24 -2
  542. package/src/runtime/query/repeat-call.ts +42 -7
  543. package/src/runtime/query/result.ts +9 -0
  544. package/src/runtime/query/review-policy.ts +231 -0
  545. package/src/runtime/query/run-state.ts +4 -0
  546. package/src/runtime/query/steering.ts +32 -0
  547. package/src/runtime/query/token-budget.ts +127 -0
  548. package/src/runtime/query/tool-output-budget.ts +33 -10
  549. package/src/runtime/query/tool-pause.ts +4 -2
  550. package/src/runtime/query/tooling.ts +8 -0
  551. package/src/sandbox/provider/local.ts +123 -13
  552. package/src/scheduler/delegating.ts +35 -13
  553. package/src/scheduler/local.ts +5 -7
  554. package/src/session/index.ts +0 -1
  555. package/src/session/workspace/path-builder.ts +5 -4
  556. package/src/store/feedback/disk.ts +4 -6
  557. package/src/store/index.ts +2 -0
  558. package/src/store/memory/disk.ts +3 -11
  559. package/src/store/run/checkpoint-disk.ts +14 -27
  560. package/src/store/run/claim-disk.ts +1 -1
  561. package/src/store/run/conformance.ts +55 -39
  562. package/src/store/run/disk.ts +19 -4
  563. package/src/store/run/token-budget-disk.ts +247 -0
  564. package/src/store/session/disk.ts +36 -29
  565. package/src/store/session/memory.ts +38 -1
  566. package/src/store/task/disk.ts +7 -8
  567. package/src/store/topic/memory.ts +13 -1
  568. package/src/test-support/ids.ts +62 -59
  569. package/src/tools/advisory/index.ts +3 -1
  570. package/src/tools/builtins/bash.ts +11 -12
  571. package/src/tools/builtins/computer-use.ts +6 -2
  572. package/src/tools/builtins/edit.ts +2 -2
  573. package/src/tools/builtins/glob.ts +3 -3
  574. package/src/tools/builtins/grep.ts +2 -2
  575. package/src/tools/builtins/ls.ts +2 -2
  576. package/src/tools/builtins/lsp.ts +2 -2
  577. package/src/tools/builtins/read-file.ts +2 -2
  578. package/src/tools/builtins/write-file.ts +2 -2
  579. package/src/tools/coordinator/ask-user-question.ts +284 -0
  580. package/src/tools/coordinator/index.ts +5 -248
  581. package/src/tools/memory/read.ts +2 -4
  582. package/src/tools/paths.ts +64 -0
  583. package/src/tools/roster.ts +46 -0
  584. package/src/types/agent/base.ts +6 -0
  585. package/src/types/agent/pipeline.ts +3 -0
  586. package/src/types/agent/router.ts +2 -3
  587. package/src/types/agent/scheduler.ts +4 -0
  588. package/src/types/agent/task.ts +5 -18
  589. package/src/types/common/index.ts +3 -0
  590. package/src/types/computer-use/index.ts +8 -0
  591. package/src/types/hitl/index.ts +5 -0
  592. package/src/types/ids/brand.ts +5 -48
  593. package/src/types/ids/index.ts +66 -75
  594. package/src/types/permission/index.ts +11 -0
  595. package/src/types/plugin/index.ts +49 -1
  596. package/src/types/run/config.ts +3 -0
  597. package/src/types/run/emergency.ts +5 -0
  598. package/src/types/run/entity.ts +6 -2
  599. package/src/types/run/events.ts +37 -0
  600. package/src/types/run/index.ts +1 -0
  601. package/src/types/run/state.ts +58 -30
  602. package/src/types/run/stop-reason.ts +3 -14
  603. package/src/types/run/token-budget-store.ts +54 -0
  604. package/src/types/sandbox/index.ts +32 -0
  605. package/src/types/session/store.ts +8 -0
  606. package/src/types/tool/index.ts +15 -0
  607. package/src/utils/frontmatter.ts +1 -1
  608. package/src/utils/id-format.ts +9 -0
  609. package/src/utils/id.ts +222 -181
  610. package/src/utils/log/exception.ts +1 -1
  611. package/src/utils/log/index.ts +1 -2
  612. package/src/utils/log/templates.ts +0 -1
  613. package/dist/session/migration/errors.d.ts +0 -26
  614. package/dist/session/migration/errors.d.ts.map +0 -1
  615. package/dist/session/migration/errors.js +0 -22
  616. package/dist/session/migration/errors.js.map +0 -1
  617. package/dist/session/migration/filesystem.d.ts +0 -122
  618. package/dist/session/migration/filesystem.d.ts.map +0 -1
  619. package/dist/session/migration/filesystem.js +0 -379
  620. package/dist/session/migration/filesystem.js.map +0 -1
  621. package/dist/session/migration/id-prefix.d.ts +0 -113
  622. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  623. package/dist/session/migration/id-prefix.js +0 -132
  624. package/dist/session/migration/id-prefix.js.map +0 -1
  625. package/dist/session/migration/index.d.ts +0 -12
  626. package/dist/session/migration/index.d.ts.map +0 -1
  627. package/dist/session/migration/index.js +0 -12
  628. package/dist/session/migration/index.js.map +0 -1
  629. package/dist/session/migration/marker.d.ts +0 -57
  630. package/dist/session/migration/marker.d.ts.map +0 -1
  631. package/dist/session/migration/marker.js +0 -123
  632. package/dist/session/migration/marker.js.map +0 -1
  633. package/src/session/migration/errors.ts +0 -23
  634. package/src/session/migration/filesystem.ts +0 -468
  635. package/src/session/migration/id-prefix.ts +0 -166
  636. package/src/session/migration/index.ts +0 -41
  637. package/src/session/migration/marker.ts +0 -142
@@ -0,0 +1,231 @@
1
+ /**
2
+ * How a run resolves the calls no rule decided.
3
+ *
4
+ * An authorization rule says what a tool may do. A review policy says what
5
+ * happens to everything the rules did not cover: the batch the gate routed
6
+ * to REVIEW. The two axes are separate on purpose — a rule is a durable
7
+ * statement an operator reviewed, and a mode is a property of ONE run, the
8
+ * difference between "we never force-push" and "this run is unattended".
9
+ *
10
+ * Only calls the gate routed to review arrive here. A rule that denied one
11
+ * already stopped it, and a rule that allowed one never asked. So a mode
12
+ * decides the undecided and can never reopen what a rule closed; a host's
13
+ * `--permission-mode` flag cannot widen a `deny`. That is the whole
14
+ * precedence story between a flag and a config file, in one sentence.
15
+ *
16
+ * This lived in the operator application as one closure. It moved here
17
+ * because none of it is about a terminal: the modes name kernel tools, the
18
+ * exemptions reason about kernel tools' blast radius, and a second host
19
+ * would otherwise write the same five branches and drift on the sixth.
20
+ * What a host supplies is the one thing the kernel cannot: how to ask a
21
+ * person (`prompt`).
22
+ */
23
+
24
+ import type { ToolRegistry } from '../../registry/tool/execute.js'
25
+ import { isTrustedReadOnly } from '../../tools/trusted-read-only.js'
26
+ import type { HITLResumeDecision, ResumeHandler, ToolCallSummary } from '../../types/hitl/index.js'
27
+ import type { ApprovalPolicy } from '../../types/hitl/policy.js'
28
+ import { PLAN_MODE_REFUSAL } from '../../types/permission/index.js'
29
+
30
+ export type ReviewMode =
31
+ /** Ask a person. The default when a `prompt` is supplied. */
32
+ | 'prompt'
33
+ /** Approve it. The default without a `prompt`, and what every headless run has always done. */
34
+ | 'auto'
35
+ /**
36
+ * Approve a file edit, ask about everything else.
37
+ *
38
+ * The mode an operator watching the agent write code actually wants: an
39
+ * `edit` or `write` inside the working directory is what they asked for
40
+ * and is undoable with `git`, so a prompt on each one is a prompt they
41
+ * answer `y` to forty times an hour — and a prompt that is always
42
+ * answered the same way trains the hand to answer the next one, which is
43
+ * the shell prompt, the same way. Shell commands, delegation and anything
44
+ * a tool declares destructive still ask.
45
+ */
46
+ | 'accept-edits'
47
+ /**
48
+ * Read and think, do not act. A call that only reads is approved; a call
49
+ * that would change anything is refused with feedback telling the model
50
+ * to present its plan instead. The operator reads the plan and switches
51
+ * mode to have it carried out — the switch IS the approval. The kernel's
52
+ * `permissionMode: 'plan'` is the floor under this: it blocks a mutating
53
+ * call at execution with no feedback, where this refuses it at review
54
+ * with the words that make the model plan.
55
+ */
56
+ | 'plan'
57
+ /**
58
+ * Refuse it. Nothing runs unless a rule allowed it by name or pattern —
59
+ * the allowlist is the whole permission surface, which is the only form
60
+ * an unattended run can actually be reasoned about.
61
+ */
62
+ | 'strict'
63
+
64
+ export const REVIEW_MODES: readonly ReviewMode[] = [
65
+ 'prompt',
66
+ 'accept-edits',
67
+ 'auto',
68
+ 'strict',
69
+ 'plan',
70
+ ]
71
+
72
+ export function isReviewMode(value: unknown): value is ReviewMode {
73
+ return typeof value === 'string' && (REVIEW_MODES as readonly string[]).includes(value)
74
+ }
75
+
76
+ export { PLAN_MODE_REFUSAL }
77
+
78
+ /** What the model is told when a call is refused under `strict`. */
79
+ export const STRICT_MODE_REFUSAL =
80
+ 'Refused: this run only permits tools an explicit rule allows, and no rule covers this call. Asking again will not change it — either the operator adds a rule, or this has to be done another way.'
81
+
82
+ /** The tools `accept-edits` approves without asking. Everything else prompts. */
83
+ export const ACCEPT_EDITS_TOOLS: ReadonlySet<string> = new Set(['edit', 'write'])
84
+
85
+ /**
86
+ * Writes that skip review anyway, in spite of declaring `readOnly: false`.
87
+ *
88
+ * This is an OVERRIDE of the tool's own declaration, and it is named as one.
89
+ * The bar for an entry is that prompting would be unusable AND a bad write
90
+ * cannot reach beyond the agent's own bookkeeping:
91
+ *
92
+ * - `task_create` / `task_update` / `update_goal` — the model's own plan for
93
+ * the current request, written several times per planning turn; asking
94
+ * each time would put a consent dialog between the agent and its todo
95
+ * list. What a bad write costs is a polluted task list, visible in the
96
+ * transcript, and it grants nothing.
97
+ *
98
+ * `save_memory` is deliberately NOT here. Content saved now is retrievable
99
+ * by `search_memory` in a later session, so a tool result that talks the
100
+ * model into saving something reaches a future run's reasoning. A write
101
+ * that survives the process is not read-only under any reading.
102
+ */
103
+ export const REVIEW_EXEMPT_WRITES: ReadonlySet<string> = new Set([
104
+ 'task_create',
105
+ 'task_update',
106
+ 'update_goal',
107
+ ])
108
+
109
+ /**
110
+ * Whether a call runs without review: it declares itself read-only and is
111
+ * trusted to say so, or it is a named exemption above.
112
+ *
113
+ * The read-only half comes from the tool's own declaration through
114
+ * `isTrustedReadOnly`, the predicate the authorization gate uses, never from
115
+ * a list of names kept here: a renamed tool would otherwise change posture
116
+ * with nothing to notice. A fetch declares itself read-only and is still a
117
+ * request leaving the machine to an address the model chose, so `network`
118
+ * tools are reviewed like a shell command. A tool the registry does not
119
+ * know, or one that declares nothing, is reviewed.
120
+ */
121
+ export function isReviewExempt(
122
+ registry: Pick<ToolRegistry, 'get'>,
123
+ name: string,
124
+ input: unknown,
125
+ ): boolean {
126
+ if (REVIEW_EXEMPT_WRITES.has(name.toLowerCase())) return true
127
+ const tool = registry.get(name) ?? registry.get(name.toLowerCase())
128
+ if (tool?.category === 'network') return false
129
+ return isTrustedReadOnly(tool, input)
130
+ }
131
+
132
+ export type ReviewExemption = (name: string, input: unknown) => boolean
133
+
134
+ /** A batch needs review when any call mutates state: flagged destructive, or not exempt. */
135
+ export function batchNeedsReview(
136
+ toolCalls: readonly ToolCallSummary[],
137
+ exempt: ReviewExemption,
138
+ ): boolean {
139
+ return toolCalls.some((tc) => tc.isDestructive || !exempt(tc.name, tc.input))
140
+ }
141
+
142
+ /** The batch a person is asked about. */
143
+ export interface ToolReviewRequest {
144
+ readonly toolCalls: readonly ToolCallSummary[]
145
+ }
146
+
147
+ export type ToolReviewAnswer =
148
+ | { readonly kind: 'approve' }
149
+ /** Approve, and stop asking for the rest of the run. */
150
+ | { readonly kind: 'approve-all' }
151
+ | { readonly kind: 'reject'; readonly feedback?: string }
152
+
153
+ /** How a host asks a person. The one thing the kernel cannot supply. */
154
+ export type ToolReviewPrompt = (request: ToolReviewRequest) => Promise<ToolReviewAnswer>
155
+
156
+ export interface ReviewPolicyOptions {
157
+ /** Default `prompt` when a `prompt` is supplied, `auto` otherwise. */
158
+ readonly mode?: ReviewMode
159
+ readonly prompt?: ToolReviewPrompt
160
+ /** Which calls skip review; default `isReviewExempt` over `registry`, or nothing without one. */
161
+ readonly exempt?: ReviewExemption
162
+ readonly registry?: Pick<ToolRegistry, 'get'>
163
+ /**
164
+ * Where "approve all" is remembered. A host that shows the state (a
165
+ * badge saying the session is unattended) passes its own box so both
166
+ * read the same fact; omitted, the policy keeps one privately.
167
+ */
168
+ readonly remembered?: { all: boolean }
169
+ }
170
+
171
+ /** The handler behind `createReviewPolicy`, for a host that wants only the function. */
172
+ export function createReviewHandler(options: ReviewPolicyOptions = {}): ResumeHandler {
173
+ const { prompt, registry } = options
174
+ const mode: ReviewMode = options.mode ?? (prompt ? 'prompt' : 'auto')
175
+ const exempt: ReviewExemption =
176
+ options.exempt ??
177
+ (registry ? (name, input) => isReviewExempt(registry, name, input) : () => false)
178
+ const remembered = options.remembered ?? { all: false }
179
+ return async (request): Promise<HITLResumeDecision> => {
180
+ if (request.type !== 'tool_review') {
181
+ return request.type === 'plan_approval' ? { action: 'approve_plan' } : { action: 'continue' }
182
+ }
183
+ if (!batchNeedsReview(request.toolCalls, exempt)) {
184
+ return { action: 'approve_tools' }
185
+ }
186
+ // A batch of nothing but non-destructive file edits is the case
187
+ // `accept-edits` exists for. One shell call in the same batch and the
188
+ // whole batch asks — the operator reviews the batch as a unit, and a
189
+ // prompt that showed only the shell command while the edits went
190
+ // through beside it would be approving something it did not show.
191
+ if (
192
+ mode === 'accept-edits' &&
193
+ request.toolCalls.every(
194
+ (tc) => !tc.isDestructive && (ACCEPT_EDITS_TOOLS.has(tc.name) || exempt(tc.name, tc.input)),
195
+ )
196
+ ) {
197
+ return { action: 'approve_tools' }
198
+ }
199
+ // Reads were approved above. Anything that reached here would change
200
+ // something, and plan mode's answer is the same every time: not now,
201
+ // tell the user what you would do.
202
+ if (mode === 'plan') return { action: 'reject_tools', feedback: PLAN_MODE_REFUSAL }
203
+ if (mode === 'strict') return { action: 'reject_tools', feedback: STRICT_MODE_REFUSAL }
204
+ if (mode === 'auto' || !prompt || remembered.all) {
205
+ return { action: 'approve_tools' }
206
+ }
207
+ const answer = await prompt({ toolCalls: request.toolCalls })
208
+ switch (answer.kind) {
209
+ case 'approve':
210
+ return { action: 'approve_tools' }
211
+ case 'approve-all':
212
+ remembered.all = true
213
+ return { action: 'approve_tools' }
214
+ case 'reject':
215
+ return {
216
+ action: 'reject_tools',
217
+ feedback: answer.feedback ?? 'User declined to run the proposed tool(s).',
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ /**
224
+ * The mode as an `ApprovalPolicy`, named after itself so a durable log can
225
+ * say which one approved a call. Swap it on a run's `RunApprovalPolicy`
226
+ * to change mode without ending the run.
227
+ */
228
+ export function createReviewPolicy(options: ReviewPolicyOptions = {}): ApprovalPolicy {
229
+ const mode: ReviewMode = options.mode ?? (options.prompt ? 'prompt' : 'auto')
230
+ return { name: mode, handler: createReviewHandler({ ...options, mode }) }
231
+ }
@@ -53,6 +53,8 @@ export function captureRunState(
53
53
  ...(session.lastError ? { lastError: session.lastError } : {}),
54
54
  messages: structuredClone(runMgr.messages),
55
55
  tokenUsage: { ...runMgr.tokenUsage },
56
+ budgetBinding: runMgr.budget?.binding,
57
+ budgetAccountId: runMgr.budget?.accountId,
56
58
  costInfo: { ...runMgr.costInfo },
57
59
  currentIteration: runMgr.currentIteration,
58
60
  startedAt,
@@ -114,6 +116,8 @@ export async function loadSelectedRunState(
114
116
  status: 'running',
115
117
  messages: checkpoint.messages,
116
118
  tokenUsage: checkpoint.tokenUsage,
119
+ budgetBinding: checkpoint.budgetBinding,
120
+ budgetAccountId: checkpoint.budgetAccountId,
117
121
  costInfo: checkpoint.costInfo,
118
122
  currentIteration: checkpoint.guardState.iterationCount,
119
123
  startedAt: checkpoint.createdAt - checkpoint.guardState.elapsedMs,
@@ -84,6 +84,38 @@ export class SteeringBinding implements SteeringChannel {
84
84
  * to be worked with rather than followed would inverting the very thing the
85
85
  * host is trying to do. Different party, different frame, on purpose.
86
86
  */
87
+ /** The same slot as steering, for notices the kernel itself has to deliver. */
88
+ export function attachNotice(
89
+ messages: readonly Message[],
90
+ channel: SteeringChannel | undefined,
91
+ format: (text: string) => string,
92
+ ): readonly Message[] {
93
+ if (!channel?.pending) return messages
94
+ let lastToolIndex = -1
95
+ for (let index = messages.length - 1; index >= 0; index--) {
96
+ if (messages[index]?.role === 'tool') {
97
+ lastToolIndex = index
98
+ break
99
+ }
100
+ }
101
+ if (lastToolIndex === -1) return messages
102
+ const text = channel.drain()
103
+ if (text === undefined) return messages
104
+ const target = messages[lastToolIndex] as Message
105
+ if (typeof target.content !== 'string') {
106
+ channel.steer(text)
107
+ return messages
108
+ }
109
+ const next = [...messages]
110
+ next[lastToolIndex] = { ...target, content: target.content + format(text) }
111
+ return next
112
+ }
113
+
114
+ /** What the model reads when a background job it started has ended. */
115
+ export function formatJobNote(text: string): string {
116
+ return `\n\n[Background job update]\n${text}`
117
+ }
118
+
87
119
  export function formatSteeringNote(text: string): string {
88
120
  return `\n\n[Message from the operator, received while this tool was running]\n${text}`
89
121
  }
@@ -0,0 +1,127 @@
1
+ import { join } from 'node:path'
2
+ import type { TokenBudget } from '../../run/token-budget.js'
3
+ import { DefaultPathBuilder } from '../../session/workspace/path-builder.js'
4
+ import { DiskCheckpointStore } from '../../store/run/checkpoint-disk.js'
5
+ import { openTokenBudget } from '../../store/run/token-budget-disk.js'
6
+ import type { IterationCheckpoint } from '../../types/hitl/index.js'
7
+ import type { RunId } from '../../types/ids/index.js'
8
+ import type { RunState } from '../../types/run/state.js'
9
+ import { validateTokenBudgetBinding } from '../../types/run/token-budget-store.js'
10
+ import type { QueryParams } from './index.js'
11
+
12
+ /** Resolve one authority before any model request or recovered tool dispatch. */
13
+ export async function resolveQueryBudget(
14
+ params: QueryParams,
15
+ runId: RunId,
16
+ selected?: RunState,
17
+ ): Promise<TokenBudget> {
18
+ let saved: Pick<IterationCheckpoint, 'budgetBinding' | 'budgetAccountId'> | undefined = selected
19
+ if (params.resumeFromCheckpoint && !saved) {
20
+ const paths =
21
+ params.pathBuilder ??
22
+ new DefaultPathBuilder(join(params.workingDirectory ?? process.cwd(), '.namzu'))
23
+ const scope = {
24
+ tenantId: params.tenantId,
25
+ projectId: params.projectId,
26
+ sessionId: params.sessionId,
27
+ runId,
28
+ parentRunId: params.parentRunId,
29
+ }
30
+ const store =
31
+ params.checkpointStore ??
32
+ new DiskCheckpointStore(
33
+ {
34
+ baseDir: join(paths.sessionDir(params.projectId, params.sessionId), 'runs'),
35
+ },
36
+ scope,
37
+ )
38
+ saved = (await store.readCheckpoint(scope, params.resumeFromCheckpoint)) ?? undefined
39
+ if (!saved) throw new Error('Cannot restore a token budget from a missing checkpoint.')
40
+ }
41
+ const schedulerBudget = params.taskScheduler?.budget
42
+ if (params.taskScheduler && !schedulerBudget) {
43
+ throw new Error('A task scheduler must expose its shared token budget account.')
44
+ }
45
+ if (params.budget && schedulerBudget && params.budget !== schedulerBudget) {
46
+ throw new Error('Query and task scheduler must share the same token budget account.')
47
+ }
48
+ const provided = params.budget ?? schedulerBudget
49
+ const binding =
50
+ saved?.budgetBinding === undefined ? undefined : validateTokenBudgetBinding(saved.budgetBinding)
51
+ if (
52
+ binding &&
53
+ saved?.budgetAccountId !== undefined &&
54
+ saved.budgetAccountId !== binding.accountId
55
+ ) {
56
+ throw new Error('Checkpoint token budget account references disagree.')
57
+ }
58
+ if (
59
+ binding &&
60
+ (binding.scope.tenantId !== params.tenantId || binding.scope.projectId !== params.projectId)
61
+ ) {
62
+ throw new Error('Checkpoint token budget belongs to a different tenant or project.')
63
+ }
64
+ if (binding && binding.scope.runId === runId && binding.scope.sessionId !== params.sessionId) {
65
+ throw new Error('Checkpoint token budget belongs to a different root session.')
66
+ }
67
+ if (provided) {
68
+ const providedBinding = provided.binding
69
+ if (
70
+ providedBinding &&
71
+ (providedBinding.scope.tenantId !== params.tenantId ||
72
+ providedBinding.scope.projectId !== params.projectId ||
73
+ (providedBinding.scope.runId === runId &&
74
+ providedBinding.scope.sessionId !== params.sessionId))
75
+ ) {
76
+ throw new Error('Supplied token budget belongs to a different root scope.')
77
+ }
78
+ if (saved?.budgetAccountId && saved.budgetAccountId !== provided.accountId) {
79
+ throw new Error('Resume requires the original token budget account.')
80
+ }
81
+ if (
82
+ binding &&
83
+ (binding.accountId !== provided.accountId || binding.scope.runId !== provided.rootRunId)
84
+ ) {
85
+ throw new Error('Checkpoint and supplied token budget authority disagree.')
86
+ }
87
+ if (
88
+ binding &&
89
+ (!providedBinding ||
90
+ binding.scope.tenantId !== providedBinding.scope.tenantId ||
91
+ binding.scope.projectId !== providedBinding.scope.projectId ||
92
+ binding.scope.sessionId !== providedBinding.scope.sessionId ||
93
+ binding.scope.runId !== providedBinding.scope.runId)
94
+ ) {
95
+ throw new Error('Checkpoint and supplied token budget root scopes disagree.')
96
+ }
97
+ provided.bindRun(runId)
98
+ narrowToRunLimit(provided, params.runConfig.tokenBudget)
99
+ return provided
100
+ }
101
+ if (saved?.budgetAccountId && !binding) {
102
+ throw new Error(
103
+ 'This checkpoint used an in-memory token budget. Supply its current authoritative budget to resume.',
104
+ )
105
+ }
106
+ const budget = await openTokenBudget({
107
+ store: params.tokenBudgetStore,
108
+ pathBuilder: params.pathBuilder,
109
+ workingDirectory: params.workingDirectory,
110
+ scope: binding?.scope ?? {
111
+ tenantId: params.tenantId,
112
+ projectId: params.projectId,
113
+ sessionId: params.sessionId,
114
+ runId,
115
+ },
116
+ limit: binding && binding.scope.runId !== runId ? undefined : params.runConfig.tokenBudget,
117
+ accountId: binding?.accountId,
118
+ requireExisting: binding !== undefined,
119
+ })
120
+ budget.bindRun(runId)
121
+ narrowToRunLimit(budget, params.runConfig.tokenBudget)
122
+ return budget
123
+ }
124
+
125
+ function narrowToRunLimit(budget: TokenBudget, limit: number): void {
126
+ if (limit > 0 && (budget.limit === 0 || limit < budget.limit)) budget.narrow(limit)
127
+ }
@@ -1,3 +1,4 @@
1
+ import { createHash } from 'node:crypto'
1
2
  import { mkdirSync, writeFileSync } from 'node:fs'
2
3
  import { join } from 'node:path'
3
4
 
@@ -76,7 +77,14 @@ function boundedPreview(
76
77
  '',
77
78
  ].join('\n')
78
79
  const compactMiddle = '\n[... omitted ...]\n'
79
- const middle = detailedMiddle.length < maxChars ? detailedMiddle : compactMiddle
80
+ const spillLine = recovery.split('\n').find((line) => line.startsWith(SPILL_MARKER))
81
+ const compactRecovery = spillLine ? `${compactMiddle}${spillLine}\n` : compactMiddle
82
+ const middle =
83
+ detailedMiddle.length < maxChars
84
+ ? detailedMiddle
85
+ : compactRecovery.length < maxChars
86
+ ? compactRecovery
87
+ : compactMiddle
80
88
 
81
89
  // A host may deliberately set a tiny positive cap. At that point no
82
90
  // truthful recovery sentence fits; the hard bound still wins.
@@ -123,7 +131,7 @@ export function describeDroppedContent(
123
131
  if (counts.size === 0) return undefined
124
132
 
125
133
  const parts = [...counts].map(([kind, n]) => (n === 1 ? `1 ${kind}` : `${n} ${kind} blocks`))
126
- return `[${parts.join(', ')} omitted: this result was truncated, and the preview above no longer describes them.]`
134
+ return `[${parts.join(', ')} omitted from this model request.]`
127
135
  }
128
136
 
129
137
  /**
@@ -137,8 +145,7 @@ export function measureContentBytes(content: readonly unknown[] | unknown): numb
137
145
  if (!Array.isArray(content)) return 0
138
146
  let total = 0
139
147
  for (const block of content as readonly Record<string, unknown>[]) {
140
- if (typeof block?.data === 'string') total += block.data.length
141
- else if (typeof block?.text === 'string') total += block.text.length
148
+ if (block?.type !== 'text' && typeof block?.data === 'string') total += block.data.length
142
149
  }
143
150
  return total
144
151
  }
@@ -148,6 +155,8 @@ export interface ApplyToolOutputBudgetOptions {
148
155
  readonly toolUseId: string
149
156
  readonly output: string
150
157
  readonly maxChars: number
158
+ /** An omission notice that shares the text budget, never extends it. */
159
+ readonly notice?: string
151
160
  /**
152
161
  * Directory to spill overflow into. When absent the output is
153
162
  * middle-elided instead — degraded, but never unbounded.
@@ -173,9 +182,20 @@ export interface ApplyToolOutputBudgetOptions {
173
182
  export function applyToolOutputBudget(opts: ApplyToolOutputBudgetOptions): ToolOutputBudgetResult {
174
183
  const { output, maxChars } = opts
175
184
  const originalLength = output.length
185
+ const limit = Number.isFinite(maxChars) && maxChars > 0 ? Math.floor(maxChars) : undefined
186
+ const notice = opts.notice
187
+ ? limit === undefined
188
+ ? opts.notice
189
+ : safeHead(opts.notice, limit)
190
+ : ''
191
+ const textBudget =
192
+ limit === undefined
193
+ ? undefined
194
+ : Math.max(0, limit - notice.length - (notice && output ? 2 : 0))
195
+ const withNotice = (text: string) => [text, notice].filter(Boolean).join('\n\n')
176
196
 
177
- if (!Number.isFinite(maxChars) || maxChars <= 0 || originalLength <= maxChars) {
178
- return { output, originalLength, truncated: false }
197
+ if (textBudget === undefined || originalLength <= textBudget) {
198
+ return { output: withNotice(output), originalLength, truncated: false }
179
199
  }
180
200
 
181
201
  const spillPath = opts.spillDir
@@ -187,10 +207,10 @@ export function applyToolOutputBudget(opts: ApplyToolOutputBudgetOptions): ToolO
187
207
  `${SPILL_MARKER} ${spillPath}`,
188
208
  'Read a specific window with `read` (offset/limit) or search it with `grep`. Do NOT read it whole — that is what exceeded the budget.',
189
209
  ].join('\n')
190
- : 'The full output was not retained. Re-run with a narrower query, a line range, or a filter.'
210
+ : 'The full output was not retained. Use a saved artifact or a read-only observation; do not repeat a state-changing action to recover its output.'
191
211
 
192
212
  return {
193
- output: boundedPreview(output, maxChars, opts.toolName, recovery),
213
+ output: withNotice(boundedPreview(output, textBudget, opts.toolName, recovery)),
194
214
  originalLength,
195
215
  truncated: true,
196
216
  ...(spillPath ? { spillPath } : {}),
@@ -214,8 +234,11 @@ function spill(
214
234
  // which is the host's decision to make and not this function's to
215
235
  // override.
216
236
  mkdirSync(dir, { recursive: true, mode: 0o700 })
217
- // The tool_use id is already unique per call and safe as a filename.
218
- const path = join(dir, `${toolUseId}.txt`)
237
+ // Provider correlation IDs are opaque strings, not filesystem names.
238
+ // A digest preserves deterministic lookup without interpreting slashes,
239
+ // traversal segments or platform-specific path syntax from the provider.
240
+ const name = createHash('sha256').update(toolUseId).digest('hex')
241
+ const path = join(dir, `${name}.txt`)
219
242
  // `wx`, not the default `w`. `w` creates-or-truncates and FOLLOWS a
220
243
  // symlink, at a path anything that can write to this directory could
221
244
  // predict and pre-plant — so the kernel would overwrite the symlink's
@@ -1,7 +1,7 @@
1
1
  import type { HITLResumeDecision, ResumeHandler, UserQuestionData } from '../../types/hitl/index.js'
2
2
  import type { RunId } from '../../types/ids/index.js'
3
3
  import type { RequestToolPause, ToolPauseRequest } from '../../types/tool/index.js'
4
- import { asCheckpointId } from '../../utils/id.js'
4
+ import { generateCheckpointId } from '../../utils/id.js'
5
5
  import type { PendingAnswers, QuestionParkRecorder } from './question-park.js'
6
6
 
7
7
  /**
@@ -121,7 +121,9 @@ export function createToolPause(deps: ToolPauseDeps): RequestToolPause {
121
121
  (await deps.parkHandler({
122
122
  type: 'user_question',
123
123
  runId: deps.runId,
124
- checkpointId: parkedAt ?? asCheckpointId(`cp_pause_${id}`),
124
+ // The question retains its correlation id; provider ids and pause
125
+ // names need not be safe components of a checkpoint storage key.
126
+ checkpointId: parkedAt ?? generateCheckpointId(),
125
127
  question,
126
128
  }))
127
129
 
@@ -23,6 +23,8 @@ export interface ToolingBootstrapConfig {
23
23
  tools: ToolRegistryContract
24
24
  runId: RunId
25
25
  workingDirectory: string
26
+ /** See `QueryParams.additionalDirectories`. */
27
+ additionalDirectories?: readonly string[]
26
28
  /** A resolver, so an approval inside a run can change it. See the executor. */
27
29
  permissionMode: PermissionMode | (() => PermissionMode)
28
30
  env: Record<string, string>
@@ -33,6 +35,8 @@ export interface ToolingBootstrapConfig {
33
35
  toolTimeoutMs?: number
34
36
  /** Host-owned and shared; the executor binds it to this run. */
35
37
  backgroundJobs?: BackgroundJobRegistry
38
+ /** See `QueryParams.backgroundJobOwner`. */
39
+ backgroundJobOwner?: string
36
40
  /** Where the `skill` tool reads from. */
37
41
  skills?: SkillRegistryRef
38
42
  /** How this run reaches the web. */
@@ -63,6 +67,9 @@ export class ToolingBootstrap {
63
67
  tools: config.tools,
64
68
  runId: config.runId,
65
69
  workingDirectory: config.workingDirectory,
70
+ ...(config.additionalDirectories?.length
71
+ ? { additionalDirectories: config.additionalDirectories }
72
+ : {}),
66
73
  permissionMode: config.permissionMode,
67
74
  env: config.env,
68
75
  abortSignal: config.abortSignal,
@@ -70,6 +77,7 @@ export class ToolingBootstrap {
70
77
  invocationState: config.invocationState,
71
78
  pluginManager: config.pluginManager,
72
79
  ...(config.backgroundJobs ? { backgroundJobs: config.backgroundJobs } : {}),
80
+ ...(config.backgroundJobOwner ? { backgroundJobOwner: config.backgroundJobOwner } : {}),
73
81
  ...(config.skills ? { skills: config.skills } : {}),
74
82
  ...(config.web ? { web: config.web } : {}),
75
83
  ...(config.toolTimeoutMs !== undefined ? { toolTimeoutMs: config.toolTimeoutMs } : {}),