@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
@@ -25,19 +25,22 @@ import {
25
25
  // registry needs the same one, and a near-copy would reproduce in the copy
26
26
  // every bug the original's comment was written to record.
27
27
  import { killTree } from '../../process/kill-tree.js'
28
- import { resolveWithinReal } from '../../tools/paths.js'
28
+ import { resolveWithinAny, resolveWithinAnyReal } from '../../tools/paths.js'
29
29
  import type { SandboxId } from '../../types/ids/index.js'
30
30
  import type {
31
31
  Sandbox,
32
32
  SandboxCreateConfig,
33
33
  SandboxDestroyOptions,
34
+ SandboxDetachedProcess,
34
35
  SandboxEnvironment,
35
36
  SandboxExecOptions,
36
37
  SandboxExecResult,
37
38
  SandboxFileEntry,
38
39
  SandboxIsolationControl,
39
40
  SandboxProvider,
41
+ SandboxSpawnOptions,
40
42
  SandboxStatus,
43
+ SandboxWalkFilesOptions,
41
44
  } from '../../types/sandbox/index.js'
42
45
  import { subscribeToAbort } from '../../utils/abort.js'
43
46
  import { generateSandboxId } from '../../utils/id.js'
@@ -47,6 +50,7 @@ import {
47
50
  applyEnvironmentOverrides,
48
51
  pickEnvironmentEntries,
49
52
  } from '../../utils/process-environment.js'
53
+ import { walkFilesLocally } from '../file-walk.js'
50
54
  import { assertIsolation, describeIsolation } from '../isolation.js'
51
55
  import type { PtyLoader } from '../terminal.js'
52
56
 
@@ -208,6 +212,8 @@ export interface LimitedSpawnRequest {
208
212
  readonly command: string
209
213
  readonly args: readonly string[]
210
214
  readonly rootDir: string
215
+ /** Bound read-write beside the root; see `SandboxCreateConfig.additionalDirectories`. */
216
+ readonly additionalDirectories?: readonly string[]
211
217
  readonly memoryLimitMb?: number
212
218
  readonly maxProcesses?: number
213
219
  }
@@ -265,7 +271,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
265
271
  case 'linux-bwrap':
266
272
  return {
267
273
  spawnCommand: requiredWrapper(request),
268
- spawnArgs: [...buildBwrapArgs(rootDir), '--', ...inner],
274
+ spawnArgs: [...buildBwrapArgs(rootDir, request.additionalDirectories), '--', ...inner],
269
275
  }
270
276
 
271
277
  case 'linux-namespace':
@@ -277,7 +283,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
277
283
  case 'macos-seatbelt':
278
284
  return {
279
285
  spawnCommand: requiredWrapper(request),
280
- spawnArgs: [...buildSeatbeltArgs(rootDir), '--', ...inner],
286
+ spawnArgs: [...buildSeatbeltArgs(rootDir, request.additionalDirectories), '--', ...inner],
281
287
  }
282
288
 
283
289
  case 'basic': {
@@ -375,7 +381,10 @@ function canonicalizePath(p: string): string {
375
381
  * process table through them — a bound `/proc` would hand back the process
376
382
  * isolation the same flag just removed.
377
383
  */
378
- export function buildBwrapArgs(sandboxRoot: string): string[] {
384
+ export function buildBwrapArgs(
385
+ sandboxRoot: string,
386
+ additionalDirectories: readonly string[] = [],
387
+ ): string[] {
379
388
  const root = canonicalizePath(sandboxRoot)
380
389
 
381
390
  const args = [
@@ -426,9 +435,15 @@ export function buildBwrapArgs(sandboxRoot: string): string[] {
426
435
  '--bind',
427
436
  root,
428
437
  root,
429
- '--chdir',
430
- root,
431
438
  )
439
+ // The host's added directories, read-write at their own paths, so a
440
+ // path the model was given on the host means the same thing inside.
441
+ for (const dir of additionalDirectories) {
442
+ const canonical = canonicalizePath(dir)
443
+ if (canonical === root) continue
444
+ args.push('--bind', canonical, canonical)
445
+ }
446
+ args.push('--chdir', root)
432
447
 
433
448
  return args
434
449
  }
@@ -450,10 +465,21 @@ const BWRAP_SYSTEM_PATHS: readonly string[] = [
450
465
  '/opt',
451
466
  ]
452
467
 
453
- function buildSeatbeltProfile(): string {
468
+ function seatbeltString(value: string): string {
469
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
470
+ }
471
+
472
+ function buildSeatbeltProfile(additionalDirectories: readonly string[] = []): string {
454
473
  return [
455
474
  '(version 1)',
456
475
  '(deny default)',
476
+ // The host's added directories, read-write, by the same contract as
477
+ // the root. Literal paths rather than params: sandbox-exec takes one
478
+ // -D per name and the count here is the operator's.
479
+ ...additionalDirectories.flatMap((dir) => [
480
+ `(allow file-read* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
481
+ `(allow file-write* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
482
+ ]),
457
483
 
458
484
  // --- Process lifecycle ---
459
485
  '(allow process-exec)',
@@ -538,8 +564,15 @@ function buildSeatbeltProfile(): string {
538
564
  * remain path bytes instead of becoming policy syntax. This is the same
539
565
  * parameter boundary used by Codex's seatbelt builder.
540
566
  */
541
- function buildSeatbeltArgs(sandboxRoot: string): string[] {
542
- return ['-p', buildSeatbeltProfile(), `-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`]
567
+ function buildSeatbeltArgs(
568
+ sandboxRoot: string,
569
+ additionalDirectories: readonly string[] = [],
570
+ ): string[] {
571
+ return [
572
+ '-p',
573
+ buildSeatbeltProfile(additionalDirectories),
574
+ `-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`,
575
+ ]
543
576
  }
544
577
 
545
578
  // ---------------------------------------------------------------------------
@@ -595,6 +628,12 @@ class LocalSandbox implements Sandbox {
595
628
  private _status: SandboxStatus
596
629
  private readonly config: SandboxCreateConfig
597
630
  private readonly log: Logger
631
+ /** The host's added directories, canonical; bound beside the root. */
632
+ private readonly additionalDirectories: readonly string[]
633
+ /** Where this sandbox's own file API may reach: the root, then the added directories. */
634
+ private get roots(): readonly string[] {
635
+ return [this.rootDir, ...this.additionalDirectories]
636
+ }
598
637
 
599
638
  get status(): SandboxStatus {
600
639
  return this._status
@@ -613,6 +652,9 @@ class LocalSandbox implements Sandbox {
613
652
  this.rootDir = rootDir
614
653
  this.environment = environment
615
654
  this.config = config
655
+ this.additionalDirectories = (config.additionalDirectories ?? [])
656
+ .map((dir) => canonicalizePath(resolve(dir)))
657
+ .filter((dir) => dir !== rootDir)
616
658
  this._status = 'ready'
617
659
  this.log = log.child({
618
660
  [SCOPE_ATTRIBUTE]: 'sandbox/provider/local',
@@ -640,7 +682,7 @@ class LocalSandbox implements Sandbox {
640
682
  const env = buildSafeEnv(this.config.env, opts?.env)
641
683
  const timeout = opts?.timeout ?? this.config.timeoutMs ?? SANDBOX_DEFAULT_TIMEOUT_MS
642
684
 
643
- const cwd = opts?.cwd ? await resolveWithinReal(this.rootDir, opts.cwd) : this.rootDir
685
+ const cwd = opts?.cwd ? await resolveWithinAnyReal(this.roots, opts.cwd) : this.rootDir
644
686
 
645
687
  const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(
646
688
  command,
@@ -689,7 +731,7 @@ class LocalSandbox implements Sandbox {
689
731
  throw new Error(`Sandbox ${this.id} is destroyed`)
690
732
  }
691
733
 
692
- const resolved = await resolveWithinReal(this.rootDir, path)
734
+ const resolved = await resolveWithinAnyReal(this.roots, path)
693
735
  await mkdir(dirname(resolved), { recursive: true })
694
736
 
695
737
  // Convention 8: Atomic write (write-tmp-rename)
@@ -705,7 +747,7 @@ class LocalSandbox implements Sandbox {
705
747
  throw new Error(`Sandbox ${this.id} is destroyed`)
706
748
  }
707
749
 
708
- const resolved = await resolveWithinReal(this.rootDir, path)
750
+ const resolved = await resolveWithinAnyReal(this.roots, path)
709
751
  return fsReadFile(resolved)
710
752
  }
711
753
 
@@ -714,7 +756,7 @@ class LocalSandbox implements Sandbox {
714
756
  throw new Error(`Sandbox ${this.id} is destroyed`)
715
757
  }
716
758
 
717
- const resolved = await resolveWithinReal(this.rootDir, rootPath)
759
+ const resolved = await resolveWithinAnyReal(this.roots, rootPath)
718
760
  const root = await stat(resolved).catch(() => null)
719
761
  if (!root || !root.isDirectory()) return []
720
762
 
@@ -739,6 +781,17 @@ class LocalSandbox implements Sandbox {
739
781
  return entries
740
782
  }
741
783
 
784
+ async *walkFiles(
785
+ rootPath: string,
786
+ options: SandboxWalkFilesOptions,
787
+ ): AsyncGenerator<SandboxFileEntry> {
788
+ if (this._status === 'destroyed') throw new Error(`Sandbox ${this.id} is destroyed`)
789
+ options.signal?.throwIfAborted()
790
+ const resolved = await resolveWithinAnyReal(this.roots, rootPath)
791
+ options.signal?.throwIfAborted()
792
+ yield* walkFilesLocally(resolved, options)
793
+ }
794
+
742
795
  async destroy(_options?: SandboxDestroyOptions): Promise<void> {
743
796
  if (this._status === 'destroyed') {
744
797
  return
@@ -759,6 +812,67 @@ class LocalSandbox implements Sandbox {
759
812
  // Private helpers
760
813
  // -----------------------------------------------------------------------
761
814
 
815
+ spawnDetached(
816
+ command: string,
817
+ args: readonly string[] = [],
818
+ opts?: SandboxSpawnOptions,
819
+ ): SandboxDetachedProcess {
820
+ if (this._status === 'destroyed') {
821
+ throw new Error(`Sandbox ${this.id} is destroyed`)
822
+ }
823
+ // Lexical containment for the cwd: the caller does not wait, so
824
+ // neither does this. The mounts are the same ones `exec` uses.
825
+ const cwd = opts?.cwd ? resolveWithinAny(this.roots, opts.cwd) : this.rootDir
826
+ const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(command, [
827
+ ...args,
828
+ ])
829
+ const env = buildSafeEnv(this.config.env, opts?.env)
830
+ const child = spawn(spawnCommand, spawnArgs, {
831
+ cwd,
832
+ env,
833
+ stdio:
834
+ bwrapInfoFd === undefined
835
+ ? ['ignore', 'pipe', 'pipe']
836
+ : ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'],
837
+ detached: process.platform !== 'win32',
838
+ })
839
+ let bwrapChildPid: number | undefined
840
+ let requested: NodeJS.Signals | undefined
841
+ // Same dance as `exec`: bwrap's inner reaper is in its own session, so
842
+ // a kill has to reach it by the pid the info fd reports, and a kill
843
+ // asked for before that pid is known is delivered when it arrives.
844
+ const bwrapInfo = bwrapInfoFd === undefined ? undefined : child.stdio[bwrapInfoFd]
845
+ const bwrapBlock = bwrapBlockFd === undefined ? undefined : child.stdio[bwrapBlockFd]
846
+ let bwrapInfoBuffer = ''
847
+ bwrapInfo?.on('data', (chunk: Buffer) => {
848
+ if (bwrapChildPid !== undefined) return
849
+ bwrapInfoBuffer += chunk.toString('utf8')
850
+ const observed = readBwrapChildPid(bwrapInfoBuffer)
851
+ if (observed === undefined) return
852
+ bwrapChildPid = observed
853
+ if (requested !== undefined) {
854
+ killTree(child, 'SIGKILL')
855
+ killBwrapChild(bwrapChildPid, 'SIGKILL')
856
+ } else if (bwrapBlock !== undefined && bwrapBlock !== null && 'end' in bwrapBlock) {
857
+ bwrapBlock.end(Buffer.from([1]))
858
+ }
859
+ })
860
+ this.log.debug('Detached process started', {
861
+ 'namzu.sandbox.command': command,
862
+ 'namzu.sandbox.args': args,
863
+ 'namzu.execution.environment': this.environment,
864
+ })
865
+ return {
866
+ child,
867
+ kill: (signal) => {
868
+ requested = signal
869
+ if (bwrapBlockFd !== undefined && bwrapChildPid === undefined) return
870
+ killTree(child, signal)
871
+ killBwrapChild(bwrapChildPid, signal)
872
+ },
873
+ }
874
+ }
875
+
762
876
  private buildSpawnArgs(
763
877
  command: string,
764
878
  args: string[],
@@ -774,6 +888,9 @@ class LocalSandbox implements Sandbox {
774
888
  command,
775
889
  args,
776
890
  rootDir: this.rootDir,
891
+ ...(this.additionalDirectories.length > 0
892
+ ? { additionalDirectories: this.additionalDirectories }
893
+ : {}),
777
894
  ...(this.config.memoryLimitMb !== undefined
778
895
  ? { memoryLimitMb: this.config.memoryLimitMb }
779
896
  : {}),
@@ -1051,6 +1168,12 @@ export class LocalSandboxProvider implements SandboxProvider {
1051
1168
  )
1052
1169
  }
1053
1170
  removeRootOnDestroy = false
1171
+ for (const dir of config.additionalDirectories ?? []) {
1172
+ const entry = await stat(resolve(dir)).catch(() => null)
1173
+ if (!entry?.isDirectory()) {
1174
+ throw new Error(`Sandbox additional directory is not a directory: ${resolve(dir)}`)
1175
+ }
1176
+ }
1054
1177
  } else {
1055
1178
  // No workspace was named: this allocation owns a fresh temporary root.
1056
1179
  const { mkdtemp } = await import('node:fs/promises')
@@ -231,38 +231,33 @@ export class CompletionInbox {
231
231
  }
232
232
 
233
233
  /**
234
- * Wait for the next completion, or for the deadline, whichever comes first.
234
+ * Wait for the next completion, deadline or abort, whichever comes first.
235
+ * Aborting releases only this waiter; work and undelivered results remain owned.
235
236
  *
236
237
  * Bounded on purpose. A worker that never finishes must not hold a run
237
238
  * open forever, and the caller decides how long "long enough" is — the
238
239
  * run's own budget is the only thing that knows.
239
240
  */
240
- waitForArrival(timeoutMs: number): Promise<void> {
241
+ waitForArrival(timeoutMs: number, signal?: AbortSignal): Promise<void> {
242
+ if (signal?.aborted) return Promise.resolve()
241
243
  if (this.unheard.size > 0) return Promise.resolve()
242
244
  if (this.outstanding.size === 0) return Promise.resolve()
243
245
 
244
246
  return new Promise((resolve) => {
247
+ const finish = (): void => {
248
+ clearTimeout(timer)
249
+ this.arrivals.delete(finish)
250
+ signal?.removeEventListener('abort', finish)
251
+ resolve()
252
+ }
245
253
  const timer = setTimeout(finish, timeoutMs)
246
254
  // `unref` where the runtime has it, so a pending wait never keeps
247
255
  // a process alive past the work it was waiting for.
248
256
  ;(timer as { unref?: () => void }).unref?.()
249
257
 
250
- function finish(): void {
251
- clearTimeout(timer)
252
- wake.done = true
253
- resolve()
254
- }
255
-
256
- const wake = Object.assign(
257
- () => {
258
- if (!wake.done) {
259
- this.arrivals.delete(wake)
260
- finish()
261
- }
262
- },
263
- { done: false },
264
- )
265
- this.arrivals.add(wake)
258
+ this.arrivals.add(finish)
259
+ signal?.addEventListener('abort', finish, { once: true })
260
+ if (signal?.aborted) finish()
266
261
  })
267
262
  }
268
263
 
@@ -423,7 +418,21 @@ function neutralizeNotificationDelimiter(content: string): string {
423
418
  export function formatCompletionNotification(handles: readonly TaskHandle[]): string {
424
419
  const blocks = handles.map((handle) => {
425
420
  const durationMs = handle.completedAt ? handle.completedAt - handle.createdAt : undefined
426
- const output = handle.result?.result ?? handle.result?.lastError ?? ''
421
+ const run = handle.result
422
+ let output = run?.result || run?.lastError || ''
423
+ // A hard guard can stop immediately after a tool round, before the result
424
+ // assembler has a final answer. Preserve visible partial prose, never reasoning.
425
+ if (!output && run?.stopReason && run.stopReason !== 'end_turn') {
426
+ const partial = [...(run.messages ?? [])]
427
+ .reverse()
428
+ .find(
429
+ (message) =>
430
+ message.role === 'assistant' &&
431
+ typeof message.content === 'string' &&
432
+ message.content.length > 0,
433
+ )
434
+ if (partial) output = `Partial output before ${run.stopReason}:\n${partial.content}`
435
+ }
427
436
  const overLimit = output.length > NOTIFICATION_OUTPUT_LIMIT
428
437
  const shown = overLimit ? output.slice(0, NOTIFICATION_OUTPUT_LIMIT) : output
429
438
 
@@ -455,6 +464,7 @@ export function formatCompletionNotification(handles: readonly TaskHandle[]): st
455
464
  `task_id: ${handle.taskId}`,
456
465
  `agent: ${handle.agentId}`,
457
466
  `state: ${handle.state}`,
467
+ ...(handle.result?.stopReason ? [`stop_reason: ${handle.result.stopReason}`] : []),
458
468
  ...(durationMs !== undefined ? [`duration_ms: ${durationMs}`] : []),
459
469
  '',
460
470
  body,
@@ -3,9 +3,9 @@ import type { Delegate, DelegateRequest, DelegateResult } from '../types/agent/d
3
3
  import type { CreateTaskOptions, TaskHandle, TaskScheduler } from '../types/agent/scheduler.js'
4
4
  import type { AgentTaskState } from '../types/agent/task.js'
5
5
  import type { RunExecutionStatus } from '../types/common/index.js'
6
- import type { TaskId } from '../types/ids/index.js'
6
+ import type { RunId, TaskId } from '../types/ids/index.js'
7
7
  import { type CancelCause, RunCancelled } from '../types/run/cancel-cause.js'
8
- import { asRunId, generateTaskId } from '../utils/id.js'
8
+ import { generateRunId, generateTaskId } from '../utils/id.js'
9
9
 
10
10
  /**
11
11
  * Presents a set of foreign delegates as a `TaskScheduler`.
@@ -113,6 +113,7 @@ const OUTCOME: Record<
113
113
 
114
114
  interface Entry {
115
115
  handle: TaskHandle
116
+ runId: RunId
116
117
  delegate: Delegate
117
118
  controller: AbortController
118
119
  settled: Promise<void>
@@ -135,7 +136,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
135
136
  // Checked at registration, not at the call. A capability that
136
137
  // claims a method the object does not have is a lie the caller
137
138
  // would otherwise find mid-delegation, with a worker running.
138
- throw new DelegateCapabilityMismatchError({ id: delegate.id, capability: 'continue' })
139
+ throw new DelegateCapabilityMismatchError({
140
+ id: delegate.id,
141
+ capability: 'continue',
142
+ })
139
143
  }
140
144
  this.byId.set(delegate.id, delegate)
141
145
  }
@@ -146,6 +150,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
146
150
  return this.byId.get(agentId)
147
151
  }
148
152
 
153
+ get budget() {
154
+ return this.config.local?.budget
155
+ }
156
+
149
157
  async createTask(options: CreateTaskOptions): Promise<TaskHandle> {
150
158
  const delegate = this.byId.get(options.agentId)
151
159
  if (!delegate) {
@@ -153,6 +161,12 @@ export class DelegatingTaskScheduler implements TaskScheduler {
153
161
  return await this.config.local.createTask(options)
154
162
  }
155
163
 
164
+ if (this.budget) {
165
+ throw new Error(
166
+ 'Foreign delegates cannot run under a shared token budget without a metering contract',
167
+ )
168
+ }
169
+
156
170
  const taskId = generateTaskId()
157
171
  const controller = new AbortController()
158
172
  const request: DelegateRequest = {
@@ -163,6 +177,7 @@ export class DelegatingTaskScheduler implements TaskScheduler {
163
177
  }
164
178
 
165
179
  const entry: Entry = {
180
+ runId: generateRunId(),
166
181
  handle: {
167
182
  taskId,
168
183
  agentId: options.agentId,
@@ -178,7 +193,9 @@ export class DelegatingTaskScheduler implements TaskScheduler {
178
193
  entry.settled = (async () => {
179
194
  let result: DelegateResult
180
195
  try {
181
- result = await delegate.dispatch(request, { signal: controller.signal })
196
+ result = await delegate.dispatch(request, {
197
+ signal: controller.signal,
198
+ })
182
199
  } catch (err) {
183
200
  // A delegate that threw failed; it did not vanish. Leaving the
184
201
  // handle `running` would have `waitForTask` hang forever on a
@@ -188,25 +205,24 @@ export class DelegatingTaskScheduler implements TaskScheduler {
188
205
  error: err instanceof Error ? err.message : String(err),
189
206
  }
190
207
  }
191
- entry.handle = this.settle(entry.handle, result)
208
+ entry.handle = this.settle(entry.handle, entry.runId, result)
192
209
  for (const listener of this.listeners) listener(entry.handle)
193
210
  })()
194
211
 
195
212
  return entry.handle
196
213
  }
197
214
 
198
- private settle(handle: TaskHandle, result: DelegateResult): TaskHandle {
215
+ private settle(handle: TaskHandle, runId: RunId, result: DelegateResult): TaskHandle {
199
216
  const outcome = OUTCOME[result.status]
200
217
  return {
201
218
  ...handle,
202
219
  state: outcome.state,
203
220
  completedAt: Date.now(),
204
221
  result: {
205
- // A synthetic run record. The id names the task rather than
206
- // borrowing a run id that does not exist: a foreign delegate has
207
- // no run in this kernel, and minting a plausible-looking `run_`
208
- // would put an id in the transcript that nothing can resolve.
209
- runId: asRunId(`run_delegate_${handle.taskId}`),
222
+ // Identity of this dispatch, allocated once with its task. The
223
+ // scheduler owns the correlation; the ID's spelling carries none.
224
+ // A foreign dispatch does not imply a local resumable checkpoint.
225
+ runId,
210
226
  status: outcome.status,
211
227
  // Zero, and honestly so: this kernel did not spend these tokens
212
228
  // and has no way to learn what the delegate spent. `ZERO_COST`
@@ -244,7 +260,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
244
260
  // Refused, not silently dropped. A no-op here has the parent
245
261
  // believe it steered a worker that never heard it — and it would
246
262
  // go on believing that until the answer came back unchanged.
247
- throw new DelegateCapabilityError({ id: entry.delegate.id, capability: 'continue' })
263
+ throw new DelegateCapabilityError({
264
+ id: entry.delegate.id,
265
+ capability: 'continue',
266
+ })
248
267
  }
249
268
  await entry.delegate.continue(message)
250
269
  }
@@ -256,7 +275,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
256
275
  return
257
276
  }
258
277
  if (!entry.delegate.capabilities.cancel) {
259
- throw new DelegateCapabilityError({ id: entry.delegate.id, capability: 'cancel' })
278
+ throw new DelegateCapabilityError({
279
+ id: entry.delegate.id,
280
+ capability: 'cancel',
281
+ })
260
282
  }
261
283
  controllerAbort(entry, cause)
262
284
  }
@@ -97,6 +97,10 @@ export class LocalTaskScheduler implements TaskScheduler {
97
97
  }
98
98
  }
99
99
 
100
+ get budget() {
101
+ return this.taskContext.budget
102
+ }
103
+
100
104
  async createTask(options: CreateTaskOptions): Promise<TaskHandle> {
101
105
  // Filled once the spawn resolves. A box rather than a bare binding
102
106
  // because the assignment happens AFTER the `await` that the reader is
@@ -140,13 +144,7 @@ export class LocalTaskScheduler implements TaskScheduler {
140
144
  }
141
145
  : {}),
142
146
  },
143
- // The budget tracker is SHARED on purpose and must not be cloned.
144
- // `AgentManager.spawn` debits it (`remaining -= allocatedTokens`)
145
- // so siblings divide one pool; handing each spawn a fresh copy
146
- // made the debit land on a throwaway object, so every child saw
147
- // the parent's untouched `remaining` and N children were each
148
- // allocated `maxBudgetFraction` of the SAME number — N x 50% of a
149
- // budget that only had 100% in it.
147
+ // Every sibling reserves from this same authority before provisioning.
150
148
  this.taskContext,
151
149
  // The host's listener still sees everything it always did; this
152
150
  // only tees off the fact that SOMETHING happened, which is what an
@@ -11,6 +11,5 @@ export * from './workspace/index.js'
11
11
  export * from './handoff/index.js'
12
12
  export * from './summary/index.js'
13
13
  export * from './intervention/index.js'
14
- export * from './migration/index.js'
15
14
  export * from './retention/index.js'
16
15
  export { TenantIsolationError, WorkspaceBackendError, AncestryCycleError } from './errors.js'
@@ -24,6 +24,7 @@
24
24
  import { join } from 'node:path'
25
25
  import type { ProjectId, RunId, SessionId } from '../../types/ids/index.js'
26
26
  import type { SubSessionId } from '../../types/session/ids.js'
27
+ import { asProjectId, asRunId, asSessionId, asSubSessionId } from '../../utils/id.js'
27
28
 
28
29
  /**
29
30
  * Canonical filesystem layout contract. All paths returned are absolute
@@ -54,18 +55,18 @@ export class DefaultPathBuilder implements PathBuilder {
54
55
  }
55
56
 
56
57
  projectDir(projectId: ProjectId): string {
57
- return join(this.root, 'projects', projectId)
58
+ return join(this.root, 'projects', asProjectId(projectId))
58
59
  }
59
60
 
60
61
  sessionDir(projectId: ProjectId, sessionId: SessionId): string {
61
- return join(this.projectDir(projectId), 'sessions', sessionId)
62
+ return join(this.projectDir(projectId), 'sessions', asSessionId(sessionId))
62
63
  }
63
64
 
64
65
  subSessionDir(projectId: ProjectId, sessionId: SessionId, subSessionId: SubSessionId): string {
65
- return join(this.sessionDir(projectId, sessionId), 'subsessions', subSessionId)
66
+ return join(this.sessionDir(projectId, sessionId), 'subsessions', asSubSessionId(subSessionId))
66
67
  }
67
68
 
68
69
  runDir(projectId: ProjectId, sessionId: SessionId, runId: RunId): string {
69
- return join(this.sessionDir(projectId, sessionId), 'runs', runId)
70
+ return join(this.sessionDir(projectId, sessionId), 'runs', asRunId(runId))
70
71
  }
71
72
  }
@@ -58,9 +58,8 @@ export interface DiskMessageFeedbackStoreConfig {
58
58
 
59
59
  /** Filesystem-safe file name for one rated message. */
60
60
  function fileName(messageId: MessageId): string {
61
- // Message ids are `msg_` + an alphabet with no separators, so this is a
62
- // pass-through today. Written as a function anyway: the day an id gains
63
- // a `/` is the day this silently starts writing outside its directory.
61
+ // Retain the historical projection spelling. Callers validate the id
62
+ // first, so suffixes this replacement once flattened are now rejected.
64
63
  return `${messageId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`
65
64
  }
66
65
 
@@ -119,9 +118,8 @@ export class DiskMessageFeedbackStore implements MessageFeedbackStore {
119
118
  return {
120
119
  legacyPath: join(this.runDir(runId), legacyName),
121
120
  revisionsDir: join(this.revisionsDir(runId), revisionFileSegment(checkedMessageId)),
122
- // The previous filename replacement is lossy for punctuation and
123
- // separators. Read such a legacy path forward if it exists, but never
124
- // publish a new projection that could overwrite another message's file.
121
+ // Preserve the projection guard from the previous layout. Checked ids
122
+ // now retain their spelling; unsafe custom suffixes are rejected above.
125
123
  publishLegacyProjection: legacyName === `${checkedMessageId}.json`,
126
124
  }
127
125
  }
@@ -6,6 +6,8 @@ export { InMemoryRunStore } from './run/memory.js'
6
6
  export { DiskCheckpointStore } from './run/checkpoint-disk.js'
7
7
  export type { DiskCheckpointStoreAttribution } from './run/checkpoint-disk.js'
8
8
  export { InMemoryCheckpointStore } from './run/checkpoint-memory.js'
9
+ export { DiskTokenBudgetStore, openTokenBudget } from './run/token-budget-disk.js'
10
+ export type { DiskTokenBudgetStoreConfig, OpenTokenBudgetOptions } from './run/token-budget-disk.js'
9
11
  // The refusing entry point to the optional listing capability, plus the two
10
12
  // projections a host implementing its own backend actually calls: one turns
11
13
  // a run's checkpoints into a row, the other applies the contract's filter,
@@ -10,7 +10,7 @@ import type {
10
10
  MemorySearchResult,
11
11
  MemoryStore,
12
12
  } from '../../types/memory/index.js'
13
- import { asMemoryId, generateMemoryId } from '../../utils/id.js'
13
+ import { generateMemoryId, isEntityId } from '../../utils/id.js'
14
14
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
15
15
  import { type Logger, resolveLogger } from '../../utils/logger.js'
16
16
  import { DiskRecordStore } from '../kv/record-store.js'
@@ -27,8 +27,6 @@ import { InMemoryMemoryIndex } from './index.js'
27
27
  */
28
28
  const SCHEMA = defineSchema({ kind: 'memory-store', current: 1, migrations: {} })
29
29
 
30
- const SAFE_STORAGE_ID = /^mem_[A-Za-z0-9_-]+$/
31
-
32
30
  interface StorageLocation {
33
31
  readonly indexPath: string
34
32
  readonly contentDir: string
@@ -83,14 +81,8 @@ function assertStorageMemoryId(
83
81
  value: unknown,
84
82
  refuse: (reason: string) => never,
85
83
  ): asserts value is MemoryId {
86
- if (typeof value !== 'string') refuse('id must be a memory ID string')
87
- try {
88
- asMemoryId(value)
89
- } catch {
90
- refuse('id must use the recognized mem_ prefix')
91
- }
92
- if (!SAFE_STORAGE_ID.test(value)) {
93
- refuse('id must be one cross-platform safe filename segment')
84
+ if (!isEntityId(value, 'memory')) {
85
+ refuse('id must be a UUID; prefixed memory IDs are not supported')
94
86
  }
95
87
  }
96
88