@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
@@ -26,7 +26,7 @@
26
26
  * That is the bar a reopen has to clear.
27
27
  */
28
28
 
29
- import { EMPTY_TOKEN_USAGE } from '../constants/limits.js'
29
+ import { withTokenBudget } from '../provider/token-budget.js'
30
30
  import type {
31
31
  AgentInput,
32
32
  AgentMetadata,
@@ -40,6 +40,7 @@ import { ZERO_COST } from '../utils/cost.js'
40
40
  import { toErrorMessage } from '../utils/error.js'
41
41
  import type { Logger } from '../utils/logger.js'
42
42
  import { AbstractAgent } from './AbstractAgent.js'
43
+ import { resolveAgentBudget } from './budget.js'
43
44
 
44
45
  export class PipelineAgent extends AbstractAgent<PipelineAgentConfig, PipelineAgentResult> {
45
46
  readonly type = 'pipeline' as const
@@ -92,127 +93,146 @@ export class PipelineAgent extends AbstractAgent<PipelineAgentConfig, PipelineAg
92
93
  const startTime = Date.now()
93
94
  const runId = this.createRunId()
94
95
  this.bindRun(runId, config.logger)
95
- const stepResults: PipelineStepResult[] = []
96
- const previousResults = new Map<string, unknown>()
97
- let completedSteps = 0
98
-
99
- await this.emitEvent({ type: 'run_started', runId }, listener)
100
-
101
- let currentInput: unknown = input.messages
102
- .filter((m) => m.role === 'user')
103
- .map((m) => m.content)
104
- .filter((c): c is string => c !== null)
105
- .join('\n')
106
-
107
- for (let i = 0; i < config.steps.length; i++) {
108
- const step = config.steps[i]
109
- if (!step) throw new Error(`Pipeline step at index ${i} is undefined`)
110
- const stepStart = Date.now()
111
-
112
- if (this.abortController.signal.aborted) {
113
- stepResults.push({
114
- stepName: step.name,
115
- status: 'skipped',
116
- durationMs: 0,
117
- })
118
- continue
119
- }
120
-
121
- await this.emitEvent({ type: 'iteration_started', runId, iteration: i + 1 }, listener)
122
-
123
- const context: StepContext = {
124
- runId,
125
- stepIndex: i,
126
- totalSteps: config.steps.length,
127
- previousResults,
128
- provider: config.provider,
129
- signal: this.abortController.signal,
130
- env: config.env ?? {},
131
- }
132
-
133
- try {
134
- if (step.validate && !step.validate(currentInput)) {
135
- throw new Error(`Validation failed for step "${step.name}"`)
96
+ const budget = await resolveAgentBudget(input, config, runId)
97
+ const provider = config.provider ? withTokenBudget(config.provider, budget) : undefined
98
+ try {
99
+ const stepResults: PipelineStepResult[] = []
100
+ const previousResults = new Map<string, unknown>()
101
+ let completedSteps = 0
102
+
103
+ await this.emitEvent({ type: 'run_started', runId }, listener)
104
+
105
+ let currentInput: unknown = input.messages
106
+ .filter((m) => m.role === 'user')
107
+ .map((m) => m.content)
108
+ .filter((c): c is string => c !== null)
109
+ .join('\n')
110
+
111
+ for (let i = 0; i < config.steps.length; i++) {
112
+ const step = config.steps[i]
113
+ if (!step) throw new Error(`Pipeline step at index ${i} is undefined`)
114
+ const stepStart = Date.now()
115
+
116
+ if (this.abortController.signal.aborted) {
117
+ stepResults.push({
118
+ stepName: step.name,
119
+ status: 'skipped',
120
+ durationMs: 0,
121
+ })
122
+ continue
136
123
  }
137
124
 
138
- const output = await step.execute(currentInput, context)
139
- previousResults.set(step.name, output)
140
- currentInput = output
141
- completedSteps++
142
-
143
- stepResults.push({
144
- stepName: step.name,
145
- status: 'completed',
146
- output,
147
- durationMs: Date.now() - stepStart,
148
- })
149
- } catch (err) {
150
- const errorMsg = toErrorMessage(err)
151
-
152
- stepResults.push({
153
- stepName: step.name,
154
- status: 'failed',
155
- error: errorMsg,
156
- durationMs: Date.now() - stepStart,
157
- })
158
-
159
- if (step.rollback) {
160
- try {
161
- await step.rollback(currentInput, context)
162
- } catch (rollbackErr) {
163
- this.log.error('Rollback failed for a step', {
164
- 'namzu.pipeline.step_name': step.name,
165
- 'exception.message': toErrorMessage(rollbackErr),
166
- })
167
- }
125
+ await this.emitEvent({ type: 'iteration_started', runId, iteration: i + 1 }, listener)
126
+
127
+ const context: StepContext = {
128
+ runId,
129
+ stepIndex: i,
130
+ totalSteps: config.steps.length,
131
+ previousResults,
132
+ provider,
133
+ budget,
134
+ signal: this.abortController.signal,
135
+ env: config.env ?? {},
168
136
  }
169
137
 
170
- if (!config.continueOnError) {
171
- await this.emitEvent({ type: 'run_failed', runId, error: errorMsg }, listener)
138
+ try {
139
+ if (step.validate && !step.validate(currentInput)) {
140
+ throw new Error(`Validation failed for step "${step.name}"`)
141
+ }
172
142
 
173
- return {
174
- runId,
143
+ const output = await step.execute(currentInput, context)
144
+ previousResults.set(step.name, output)
145
+ currentInput = output
146
+ completedSteps++
147
+
148
+ stepResults.push({
149
+ stepName: step.name,
150
+ status: 'completed',
151
+ output,
152
+ durationMs: Date.now() - stepStart,
153
+ })
154
+ } catch (err) {
155
+ const errorMsg = toErrorMessage(err)
156
+
157
+ stepResults.push({
158
+ stepName: step.name,
175
159
  status: 'failed',
176
- stopReason: 'error',
177
- usage: { ...EMPTY_TOKEN_USAGE },
178
- cost: { ...ZERO_COST },
179
- iterations: i + 1,
180
- durationMs: Date.now() - startTime,
181
- messages: input.messages,
182
- lastError: errorMsg,
183
- stepResults,
184
- completedSteps,
185
- totalSteps: config.steps.length,
160
+ error: errorMsg,
161
+ durationMs: Date.now() - stepStart,
162
+ })
163
+
164
+ if (step.rollback) {
165
+ try {
166
+ await step.rollback(currentInput, context)
167
+ } catch (rollbackErr) {
168
+ this.log.error('Rollback failed for a step', {
169
+ 'namzu.pipeline.step_name': step.name,
170
+ 'exception.message': toErrorMessage(rollbackErr),
171
+ })
172
+ }
173
+ }
174
+
175
+ if (!config.continueOnError) {
176
+ await this.emitEvent(
177
+ {
178
+ type: 'run_failed',
179
+ runId,
180
+ error: errorMsg,
181
+ budget: budget.summary(),
182
+ },
183
+ listener,
184
+ )
185
+
186
+ return {
187
+ runId,
188
+ status: 'failed',
189
+ stopReason: 'error',
190
+ usage: budget.ownUsage,
191
+ budget: budget.summary(),
192
+ cost: { ...ZERO_COST, unpricedTokens: budget.ownTokens },
193
+ iterations: i + 1,
194
+ durationMs: Date.now() - startTime,
195
+ messages: input.messages,
196
+ lastError: errorMsg,
197
+ stepResults,
198
+ completedSteps,
199
+ totalSteps: config.steps.length,
200
+ }
186
201
  }
187
202
  }
188
203
  }
189
- }
190
204
 
191
- const finalStatus = completedSteps === config.steps.length ? 'completed' : 'failed'
192
- const lastOutput = stepResults[stepResults.length - 1]?.output
205
+ const finalStatus = completedSteps === config.steps.length ? 'completed' : 'failed'
206
+ const lastOutput = stepResults[stepResults.length - 1]?.output
193
207
 
194
- await this.emitEvent(
195
- {
196
- type: 'run_completed',
208
+ await this.emitEvent(
209
+ {
210
+ type: 'run_completed',
211
+ budget: budget.summary(),
212
+ runId,
213
+ result: typeof lastOutput === 'string' ? lastOutput : JSON.stringify(lastOutput),
214
+ },
215
+ listener,
216
+ )
217
+
218
+ return {
197
219
  runId,
220
+ status: finalStatus,
221
+ stopReason: 'end_turn',
222
+ usage: budget.ownUsage,
223
+ budget: budget.summary(),
224
+ cost: { ...ZERO_COST, unpricedTokens: budget.ownTokens },
225
+ iterations: config.steps.length,
226
+ durationMs: Date.now() - startTime,
227
+ messages: input.messages,
198
228
  result: typeof lastOutput === 'string' ? lastOutput : JSON.stringify(lastOutput),
199
- },
200
- listener,
201
- )
202
-
203
- return {
204
- runId,
205
- status: finalStatus,
206
- stopReason: 'end_turn',
207
- usage: { ...EMPTY_TOKEN_USAGE },
208
- cost: { ...ZERO_COST },
209
- iterations: config.steps.length,
210
- durationMs: Date.now() - startTime,
211
- messages: input.messages,
212
- result: typeof lastOutput === 'string' ? lastOutput : JSON.stringify(lastOutput),
213
- stepResults,
214
- completedSteps,
215
- totalSteps: config.steps.length,
229
+ stepResults,
230
+ completedSteps,
231
+ totalSteps: config.steps.length,
232
+ }
233
+ } finally {
234
+ budget.settle()
235
+ await budget.flush()
216
236
  }
217
237
  }
218
238
  }
@@ -70,6 +70,7 @@ export class ReactiveAgent extends AbstractAgent<ReactiveAgentConfig, ReactiveAg
70
70
  skills: config.skills,
71
71
  basePrompt: config.basePrompt,
72
72
  provider: config.provider,
73
+ ...(config.budget ? { budget: config.budget } : {}),
73
74
  tools: config.tools,
74
75
  ...(input.attachmentStore ? { attachmentStore: input.attachmentStore } : {}),
75
76
  ...(config.attachmentResolveTimeoutMs !== undefined
@@ -186,6 +187,7 @@ export class ReactiveAgent extends AbstractAgent<ReactiveAgentConfig, ReactiveAg
186
187
  status: run.status,
187
188
  stopReason: run.stopReason,
188
189
  usage: run.tokenUsage,
190
+ ...(run.budget ? { budget: run.budget } : {}),
189
191
  cost: run.costInfo,
190
192
  iterations: run.currentIteration,
191
193
  durationMs: Date.now() - startTime,
@@ -1,6 +1,7 @@
1
1
  import { EMPTY_TOKEN_USAGE } from '../constants/limits.js'
2
2
  import { collectChatCompletion } from '../provider/collect-chat-completion.js'
3
3
  import { resolveStreamIdleTimeoutMs, withStreamIdleTimeout } from '../provider/idle-timeout.js'
4
+ import { withTokenBudget } from '../provider/token-budget.js'
4
5
  import { FallbackResolver } from '../runtime/decision/fallback.js'
5
6
  import { DecisionParser } from '../runtime/decision/parser.js'
6
7
  import type {
@@ -18,6 +19,7 @@ import type { RunEventListener } from '../types/run/index.js'
18
19
  import { ZERO_COST } from '../utils/cost.js'
19
20
  import type { Logger } from '../utils/logger.js'
20
21
  import { AbstractAgent } from './AbstractAgent.js'
22
+ import { resolveAgentBudget } from './budget.js'
21
23
 
22
24
  export class RouterAgent extends AbstractAgent<RouterAgentConfig, RouterAgentResult> {
23
25
  readonly type = 'router' as const
@@ -71,88 +73,124 @@ export class RouterAgent extends AbstractAgent<RouterAgentConfig, RouterAgentRes
71
73
  const startTime = Date.now()
72
74
  const runId = this.createRunId()
73
75
  this.bindRun(runId, config.logger)
76
+ const budget = await resolveAgentBudget(input, config, runId)
77
+ const budgetConfig = { ...config, budget }
78
+ try {
79
+ await this.emitEvent({ type: 'run_started', runId }, listener)
74
80
 
75
- await this.emitEvent({ type: 'run_started', runId }, listener)
81
+ const decision = await this.route(input, budgetConfig, streamIdleTimeoutMs, signal)
76
82
 
77
- const decision = await this.route(input, config, streamIdleTimeoutMs, signal)
83
+ let targetRoute = config.routes.find((r) => r.agentId === decision.agentId)
78
84
 
79
- let targetRoute = config.routes.find((r) => r.agentId === decision.agentId)
85
+ if (!targetRoute) {
86
+ const fallback = config.fallbackAgentId
87
+ ? config.routes.find((r) => r.agentId === config.fallbackAgentId)
88
+ : undefined
80
89
 
81
- if (!targetRoute) {
82
- const fallback = config.fallbackAgentId
83
- ? config.routes.find((r) => r.agentId === config.fallbackAgentId)
84
- : undefined
90
+ if (!fallback) {
91
+ const errorMsg = `No route found for "${decision.agentId}"`
85
92
 
86
- if (!fallback) {
87
- const errorMsg = `No route found for "${decision.agentId}"`
93
+ await this.emitEvent(
94
+ {
95
+ type: 'run_failed',
96
+ runId,
97
+ error: errorMsg,
98
+ budget: budget.summary(),
99
+ },
100
+ listener,
101
+ )
88
102
 
89
- await this.emitEvent({ type: 'run_failed', runId, error: errorMsg }, listener)
90
-
91
- return {
92
- runId,
93
- status: 'failed',
94
- stopReason: 'error',
95
- usage: { ...EMPTY_TOKEN_USAGE },
96
- cost: { ...ZERO_COST },
97
- iterations: 1,
98
- durationMs: Date.now() - startTime,
99
- messages: input.messages,
100
- lastError: errorMsg,
101
- selectedRoute: decision.agentId,
102
- routingDecision: decision,
103
- delegateResult: {
103
+ return {
104
104
  runId,
105
105
  status: 'failed',
106
- usage: { ...EMPTY_TOKEN_USAGE },
107
- cost: { ...ZERO_COST },
108
- iterations: 0,
109
- durationMs: 0,
110
- messages: [],
111
- },
106
+ stopReason: 'error',
107
+ usage: budget.ownUsage,
108
+ budget: budget.summary(),
109
+ cost: { ...ZERO_COST, unpricedTokens: budget.ownTokens },
110
+ iterations: 1,
111
+ durationMs: Date.now() - startTime,
112
+ messages: input.messages,
113
+ lastError: errorMsg,
114
+ selectedRoute: decision.agentId,
115
+ routingDecision: decision,
116
+ delegateResult: {
117
+ runId,
118
+ status: 'failed',
119
+ usage: { ...EMPTY_TOKEN_USAGE },
120
+ cost: { ...ZERO_COST },
121
+ iterations: 0,
122
+ durationMs: 0,
123
+ messages: [],
124
+ },
125
+ }
112
126
  }
127
+
128
+ decision.agentId = fallback.agentId
129
+ targetRoute = fallback
113
130
  }
114
131
 
115
- decision.agentId = fallback.agentId
116
- targetRoute = fallback
117
- }
132
+ if (!config.invocationState) {
133
+ throw new Error(
134
+ 'RouterAgent requires invocationState with tenantId in config (session-hierarchy.md §12.1).',
135
+ )
136
+ }
137
+ const childInvocationState = deriveChildState(config.invocationState, this.metadata.id)
138
+ const allocation = Number.isFinite(budget.remaining)
139
+ ? Math.floor(budget.remaining)
140
+ : config.tokenBudget || 200_000
141
+ const childBudget = budget.reserve(allocation)
142
+ await childBudget.flush()
143
+ let delegateResult: RouterAgentResult['delegateResult']
144
+ try {
145
+ delegateResult = await targetRoute.agent.run(
146
+ input,
147
+ {
148
+ ...config,
149
+ budget: childBudget,
150
+ tokenBudget: allocation,
151
+ parentRunId: runId,
152
+ depth: (config.depth ?? 0) + 1,
153
+ invocationState: childInvocationState,
154
+ },
155
+ listener,
156
+ )
157
+ childBudget.bindRun(delegateResult.runId)
158
+ childBudget.settle(delegateResult.usage.totalTokens)
159
+ } finally {
160
+ // A thrown custom delegate supplies no final usage receipt.
161
+ // Its reservation stays held until an authoritative settlement.
162
+ await childBudget.flush()
163
+ }
118
164
 
119
- if (!config.invocationState) {
120
- throw new Error(
121
- 'RouterAgent requires invocationState with tenantId in config (session-hierarchy.md §12.1).',
165
+ await this.emitEvent(
166
+ {
167
+ type: 'run_completed',
168
+ budget: budget.summary(),
169
+ runId,
170
+ result: delegateResult.result ?? '',
171
+ },
172
+ listener,
122
173
  )
123
- }
124
- const childInvocationState = deriveChildState(config.invocationState, this.metadata.id)
125
- const delegateResult = await targetRoute.agent.run(
126
- input,
127
- { ...config, invocationState: childInvocationState },
128
- listener,
129
- )
130
174
 
131
- await this.emitEvent(
132
- {
133
- type: 'run_completed',
175
+ return {
134
176
  runId,
135
- result: delegateResult.result ?? '',
136
- },
137
- listener,
138
- )
139
-
140
- return {
141
- runId,
142
- status: delegateResult.status,
143
- stopReason: delegateResult.stopReason,
144
- // Routing is a model call the run paid for; reporting only the
145
- // delegate's usage silently under-reports every routed run.
146
- usage: accumulateTokenUsage(delegateResult.usage, decision.usage ?? EMPTY_TOKEN_USAGE),
147
- cost: delegateResult.cost,
148
- iterations: delegateResult.iterations + 1,
149
- durationMs: Date.now() - startTime,
150
- messages: delegateResult.messages,
151
- result: delegateResult.result,
152
- lastError: delegateResult.lastError,
153
- selectedRoute: decision.agentId,
154
- routingDecision: decision,
155
- delegateResult,
177
+ status: delegateResult.status,
178
+ stopReason: delegateResult.stopReason,
179
+ usage: budget.ownUsage,
180
+ budget: budget.summary(),
181
+ cost: { ...ZERO_COST, unpricedTokens: budget.ownTokens },
182
+ iterations: delegateResult.iterations + 1,
183
+ durationMs: Date.now() - startTime,
184
+ messages: delegateResult.messages,
185
+ result: delegateResult.result,
186
+ lastError: delegateResult.lastError,
187
+ selectedRoute: decision.agentId,
188
+ routingDecision: decision,
189
+ delegateResult,
190
+ }
191
+ } finally {
192
+ budget.settle()
193
+ await budget.flush()
156
194
  }
157
195
  }
158
196
 
@@ -197,7 +235,10 @@ export class RouterAgent extends AbstractAgent<RouterAgentConfig, RouterAgentRes
197
235
  }
198
236
 
199
237
  if (config.fallbackAgentId) {
200
- fallbackStrategies.push({ type: 'fixed', agentId: config.fallbackAgentId })
238
+ fallbackStrategies.push({
239
+ type: 'fixed',
240
+ agentId: config.fallbackAgentId,
241
+ })
201
242
  }
202
243
 
203
244
  fallbackStrategies.push({ type: 'first_route' })
@@ -221,10 +262,13 @@ export class RouterAgent extends AbstractAgent<RouterAgentConfig, RouterAgentRes
221
262
  // Every routing attempt is a billed model call; a fallback after
222
263
  // three failed parses still cost three calls.
223
264
  let routingUsage: TokenUsage = { ...EMPTY_TOKEN_USAGE }
224
- const routingProvider = withStreamIdleTimeout(config.provider, {
225
- idleTimeoutMs: streamIdleTimeoutMs,
226
- log,
227
- })
265
+ const routingProvider = withStreamIdleTimeout(
266
+ config.budget ? withTokenBudget(config.provider, config.budget) : config.provider,
267
+ {
268
+ idleTimeoutMs: streamIdleTimeoutMs,
269
+ log,
270
+ },
271
+ )
228
272
 
229
273
  for (let attempt = 0; attempt < maxRetries; attempt++) {
230
274
  try {
@@ -297,6 +341,9 @@ export class RouterAgent extends AbstractAgent<RouterAgentConfig, RouterAgentRes
297
341
  }
298
342
  }
299
343
 
300
- return { ...fallbackResolver.resolve(userContent, validAgentIds), usage: routingUsage }
344
+ return {
345
+ ...fallbackResolver.resolve(userContent, validAgentIds),
346
+ usage: routingUsage,
347
+ }
301
348
  }
302
349
  }
@@ -21,6 +21,7 @@ import type { ActorRef } from '../types/session/actor.js'
21
21
  import { ZERO_COST } from '../utils/cost.js'
22
22
  import type { Logger } from '../utils/logger.js'
23
23
  import { AbstractAgent } from './AbstractAgent.js'
24
+ import { resolveAgentBudget } from './budget.js'
24
25
 
25
26
  /**
26
27
  * Build the authoritative per-task ledger from the gateway's task handles.
@@ -131,6 +132,14 @@ export class SupervisorAgent extends AbstractAgent<SupervisorAgentConfig, Superv
131
132
  // on one path and `undefined` on another — a half-migration that
132
133
  // fails silently, which is worse than not renaming the field.
133
134
  const configuredScheduler = config.scheduler
135
+ const budget = await resolveAgentBudget(
136
+ input,
137
+ { ...config, budget: config.budget ?? configuredScheduler?.budget },
138
+ runId,
139
+ )
140
+ if (configuredScheduler && configuredScheduler.budget !== budget) {
141
+ throw new Error('Injected task scheduler must share the supervisor token budget authority')
142
+ }
134
143
 
135
144
  let gateway: TaskScheduler
136
145
  if (configuredScheduler) {
@@ -155,10 +164,7 @@ export class SupervisorAgent extends AbstractAgent<SupervisorAgentConfig, Superv
155
164
  // the increment when it constructs the child. Resetting a delegated
156
165
  // supervisor to zero here made every grandchild depth one again.
157
166
  depth: config.depth ?? 0,
158
- budgetTracker: {
159
- total: config.tokenBudget,
160
- remaining: config.tokenBudget,
161
- },
167
+ budget,
162
168
  factoryOptions: mergedFactoryOptions,
163
169
  // The supervisor already hands this to its OWN run. Handing it to
164
170
  // the spawn context makes a worker's REVIEW-tier calls reach the
@@ -365,6 +371,7 @@ export class SupervisorAgent extends AbstractAgent<SupervisorAgentConfig, Superv
365
371
  runtimeToolOverrides: input.runtimeToolOverrides,
366
372
  runtimeContext: input.runtimeContext,
367
373
  taskScheduler: gateway,
374
+ budget,
368
375
  completionInbox,
369
376
  advisory: config.advisory,
370
377
  invocationState: childInvocationState,
@@ -414,6 +421,7 @@ export class SupervisorAgent extends AbstractAgent<SupervisorAgentConfig, Superv
414
421
  status: run.status === 'completed' ? 'completed' : 'failed',
415
422
  stopReason: run.stopReason,
416
423
  usage: run.tokenUsage,
424
+ budget: budget.summary(),
417
425
  cost: run.costInfo,
418
426
  iterations: run.currentIteration,
419
427
  durationMs: Date.now() - startTime,
@@ -0,0 +1,42 @@
1
+ import { TokenBudget } from '../run/token-budget.js'
2
+ import { openTokenBudget } from '../store/run/token-budget-disk.js'
3
+ import type { AgentInput, BaseAgentConfig } from '../types/agent/base.js'
4
+ import type { RunId } from '../types/ids/index.js'
5
+
6
+ /** Resolve one authority before a composite agent constructs its scheduler. */
7
+ export async function resolveAgentBudget(
8
+ input: AgentInput,
9
+ config: BaseAgentConfig,
10
+ runId: RunId,
11
+ ): Promise<TokenBudget> {
12
+ if (!Number.isSafeInteger(config.tokenBudget) || config.tokenBudget < 0) {
13
+ throw new Error('Agent token budget must be a nonnegative safe integer')
14
+ }
15
+ if (config.budget) {
16
+ config.budget.bindRun(runId)
17
+ if (
18
+ config.tokenBudget > 0 &&
19
+ (config.budget.limit === 0 || config.tokenBudget < config.budget.limit)
20
+ ) {
21
+ config.budget.narrow(config.tokenBudget)
22
+ }
23
+ await config.budget.flush()
24
+ return config.budget
25
+ }
26
+ if (config.parentRunId) {
27
+ throw new Error('A delegated agent requires its inherited token budget authority')
28
+ }
29
+ const { tenantId, projectId, sessionId } = config
30
+ const budget =
31
+ tenantId && projectId && sessionId
32
+ ? await openTokenBudget({
33
+ scope: { tenantId, projectId, sessionId, runId },
34
+ limit: config.tokenBudget,
35
+ pathBuilder: config.pathBuilder,
36
+ workingDirectory: input.workingDirectory,
37
+ })
38
+ : TokenBudget.create(config.tokenBudget, runId)
39
+ budget.bindRun(runId)
40
+ await budget.flush()
41
+ return budget
42
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The delegate that can only look.
3
+ *
4
+ * "Find where X is defined", "which files reference Y", "how does Z work" are
5
+ * the delegations a parent makes most, and a child built from the parent's
6
+ * whole working set answers them holding `write` and `bash` — so a lookup
7
+ * needs the same approvals as a change. A host that offers this delegate
8
+ * builds its roster with `filterReadOnlyTools` and its prompt from the text
9
+ * here; the two are exported separately because a host adds its own
10
+ * doctrine and environment around the prompt.
11
+ */
12
+
13
+ export const EXPLORE_AGENT_ID = 'explore'
14
+
15
+ export const EXPLORE_AGENT_DESCRIPTION =
16
+ 'A read-only sub-agent for finding files, symbols and answers.'
17
+
18
+ /**
19
+ * What an explore delegate is told. Names its limits in the first person so
20
+ * a model does not describe a change as made, and asks for file:line
21
+ * references because that is what the parent acts on.
22
+ */
23
+ export const EXPLORE_AGENT_PROMPT = [
24
+ 'You are a read-only sub-agent dispatched to find things out: where something is defined, which files reference it, how a piece of code works, what a directory contains.',
25
+ 'You cannot see the parent conversation — work only from the prompt you were given.',
26
+ 'You have reading and searching tools only. You cannot edit, write or run commands, and you must not describe a change as made.',
27
+ 'Search broadly first, then read what matters. Report file paths with line numbers, quote the relevant lines, and say plainly what you did not find.',
28
+ 'End with a concise answer the parent can act on; do not ask the parent questions.',
29
+ ].join('\n')