@namzu/sdk 34.2.0 → 35.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +102 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +12 -12
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +14 -9
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +12 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +95 -46
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +35 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +152 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  225. package/dist/runtime/query/iteration/index.js +16 -5
  226. package/dist/runtime/query/iteration/index.js.map +1 -1
  227. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  229. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  230. package/dist/runtime/query/iteration/phases/context.d.ts +2 -0
  231. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  232. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  233. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  235. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  236. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  238. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  239. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  240. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  241. package/dist/runtime/query/plugin-hooks.js +20 -1
  242. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  243. package/dist/runtime/query/repeat-call.d.ts +20 -2
  244. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  245. package/dist/runtime/query/repeat-call.js +35 -7
  246. package/dist/runtime/query/repeat-call.js.map +1 -1
  247. package/dist/runtime/query/result.d.ts.map +1 -1
  248. package/dist/runtime/query/result.js +9 -0
  249. package/dist/runtime/query/result.js.map +1 -1
  250. package/dist/runtime/query/review-policy.d.ts +142 -0
  251. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  252. package/dist/runtime/query/review-policy.js +144 -0
  253. package/dist/runtime/query/review-policy.js.map +1 -0
  254. package/dist/runtime/query/run-state.d.ts.map +1 -1
  255. package/dist/runtime/query/run-state.js +4 -0
  256. package/dist/runtime/query/run-state.js.map +1 -1
  257. package/dist/runtime/query/steering.d.ts +4 -0
  258. package/dist/runtime/query/steering.d.ts.map +1 -1
  259. package/dist/runtime/query/steering.js +29 -0
  260. package/dist/runtime/query/steering.js.map +1 -1
  261. package/dist/runtime/query/token-budget.d.ts +7 -0
  262. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  263. package/dist/runtime/query/token-budget.js +101 -0
  264. package/dist/runtime/query/token-budget.js.map +1 -0
  265. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  266. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  267. package/dist/runtime/query/tool-output-budget.js +29 -11
  268. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  269. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  270. package/dist/runtime/query/tool-pause.js +4 -2
  271. package/dist/runtime/query/tool-pause.js.map +1 -1
  272. package/dist/runtime/query/tooling.d.ts +4 -0
  273. package/dist/runtime/query/tooling.d.ts.map +1 -1
  274. package/dist/runtime/query/tooling.js +4 -0
  275. package/dist/runtime/query/tooling.js.map +1 -1
  276. package/dist/sandbox/provider/local.d.ts +3 -1
  277. package/dist/sandbox/provider/local.d.ts.map +1 -1
  278. package/dist/sandbox/provider/local.js +112 -12
  279. package/dist/sandbox/provider/local.js.map +1 -1
  280. package/dist/scheduler/delegating.d.ts +1 -0
  281. package/dist/scheduler/delegating.d.ts.map +1 -1
  282. package/dist/scheduler/delegating.js +29 -12
  283. package/dist/scheduler/delegating.js.map +1 -1
  284. package/dist/scheduler/local.d.ts +1 -0
  285. package/dist/scheduler/local.d.ts.map +1 -1
  286. package/dist/scheduler/local.js +4 -7
  287. package/dist/scheduler/local.js.map +1 -1
  288. package/dist/session/index.d.ts +0 -1
  289. package/dist/session/index.d.ts.map +1 -1
  290. package/dist/session/index.js +0 -1
  291. package/dist/session/index.js.map +1 -1
  292. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  293. package/dist/session/workspace/path-builder.js +5 -4
  294. package/dist/session/workspace/path-builder.js.map +1 -1
  295. package/dist/store/feedback/disk.d.ts.map +1 -1
  296. package/dist/store/feedback/disk.js +4 -6
  297. package/dist/store/feedback/disk.js.map +1 -1
  298. package/dist/store/index.d.ts +2 -0
  299. package/dist/store/index.d.ts.map +1 -1
  300. package/dist/store/index.js +1 -0
  301. package/dist/store/index.js.map +1 -1
  302. package/dist/store/memory/disk.d.ts.map +1 -1
  303. package/dist/store/memory/disk.js +3 -12
  304. package/dist/store/memory/disk.js.map +1 -1
  305. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  306. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  307. package/dist/store/run/checkpoint-disk.js +14 -26
  308. package/dist/store/run/checkpoint-disk.js.map +1 -1
  309. package/dist/store/run/claim-disk.js +1 -1
  310. package/dist/store/run/conformance.d.ts +1 -1
  311. package/dist/store/run/conformance.d.ts.map +1 -1
  312. package/dist/store/run/conformance.js +41 -33
  313. package/dist/store/run/conformance.js.map +1 -1
  314. package/dist/store/run/disk.d.ts.map +1 -1
  315. package/dist/store/run/disk.js +20 -4
  316. package/dist/store/run/disk.js.map +1 -1
  317. package/dist/store/run/token-budget-disk.d.ts +37 -0
  318. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  319. package/dist/store/run/token-budget-disk.js +208 -0
  320. package/dist/store/run/token-budget-disk.js.map +1 -0
  321. package/dist/store/session/disk.d.ts +4 -13
  322. package/dist/store/session/disk.d.ts.map +1 -1
  323. package/dist/store/session/disk.js +34 -31
  324. package/dist/store/session/disk.js.map +1 -1
  325. package/dist/store/session/memory.d.ts +2 -0
  326. package/dist/store/session/memory.d.ts.map +1 -1
  327. package/dist/store/session/memory.js +41 -2
  328. package/dist/store/session/memory.js.map +1 -1
  329. package/dist/store/task/disk.d.ts.map +1 -1
  330. package/dist/store/task/disk.js +7 -8
  331. package/dist/store/task/disk.js.map +1 -1
  332. package/dist/store/topic/memory.d.ts +2 -0
  333. package/dist/store/topic/memory.d.ts.map +1 -1
  334. package/dist/store/topic/memory.js +13 -1
  335. package/dist/store/topic/memory.js.map +1 -1
  336. package/dist/test-support/ids.d.ts +4 -19
  337. package/dist/test-support/ids.d.ts.map +1 -1
  338. package/dist/test-support/ids.js +51 -59
  339. package/dist/test-support/ids.js.map +1 -1
  340. package/dist/tools/advisory/index.d.ts.map +1 -1
  341. package/dist/tools/advisory/index.js +3 -1
  342. package/dist/tools/advisory/index.js.map +1 -1
  343. package/dist/tools/builtins/bash.d.ts +2 -0
  344. package/dist/tools/builtins/bash.d.ts.map +1 -1
  345. package/dist/tools/builtins/bash.js +9 -11
  346. package/dist/tools/builtins/bash.js.map +1 -1
  347. package/dist/tools/builtins/computer-use.d.ts +2 -2
  348. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  349. package/dist/tools/builtins/computer-use.js +4 -2
  350. package/dist/tools/builtins/computer-use.js.map +1 -1
  351. package/dist/tools/builtins/edit.js +2 -2
  352. package/dist/tools/builtins/edit.js.map +1 -1
  353. package/dist/tools/builtins/glob.js +3 -3
  354. package/dist/tools/builtins/glob.js.map +1 -1
  355. package/dist/tools/builtins/grep.js +2 -2
  356. package/dist/tools/builtins/grep.js.map +1 -1
  357. package/dist/tools/builtins/ls.js +2 -2
  358. package/dist/tools/builtins/ls.js.map +1 -1
  359. package/dist/tools/builtins/lsp.js +2 -2
  360. package/dist/tools/builtins/lsp.js.map +1 -1
  361. package/dist/tools/builtins/read-file.js +2 -2
  362. package/dist/tools/builtins/read-file.js.map +1 -1
  363. package/dist/tools/builtins/write-file.js +2 -2
  364. package/dist/tools/builtins/write-file.js.map +1 -1
  365. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  366. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  367. package/dist/tools/coordinator/ask-user-question.js +237 -0
  368. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  369. package/dist/tools/coordinator/index.d.ts +1 -2
  370. package/dist/tools/coordinator/index.d.ts.map +1 -1
  371. package/dist/tools/coordinator/index.js +4 -220
  372. package/dist/tools/coordinator/index.js.map +1 -1
  373. package/dist/tools/memory/read.d.ts.map +1 -1
  374. package/dist/tools/memory/read.js +2 -4
  375. package/dist/tools/memory/read.js.map +1 -1
  376. package/dist/tools/paths.d.ts +13 -0
  377. package/dist/tools/paths.d.ts.map +1 -1
  378. package/dist/tools/paths.js +53 -0
  379. package/dist/tools/paths.js.map +1 -1
  380. package/dist/tools/roster.d.ts +27 -0
  381. package/dist/tools/roster.d.ts.map +1 -0
  382. package/dist/tools/roster.js +42 -0
  383. package/dist/tools/roster.js.map +1 -0
  384. package/dist/types/agent/base.d.ts +5 -0
  385. package/dist/types/agent/base.d.ts.map +1 -1
  386. package/dist/types/agent/pipeline.d.ts +3 -0
  387. package/dist/types/agent/pipeline.d.ts.map +1 -1
  388. package/dist/types/agent/router.d.ts +2 -3
  389. package/dist/types/agent/router.d.ts.map +1 -1
  390. package/dist/types/agent/scheduler.d.ts +3 -0
  391. package/dist/types/agent/scheduler.d.ts.map +1 -1
  392. package/dist/types/agent/task.d.ts +5 -16
  393. package/dist/types/agent/task.d.ts.map +1 -1
  394. package/dist/types/agent/task.js.map +1 -1
  395. package/dist/types/common/index.d.ts.map +1 -1
  396. package/dist/types/common/index.js +3 -0
  397. package/dist/types/common/index.js.map +1 -1
  398. package/dist/types/computer-use/index.d.ts +8 -0
  399. package/dist/types/computer-use/index.d.ts.map +1 -1
  400. package/dist/types/computer-use/index.js.map +1 -1
  401. package/dist/types/hitl/index.d.ts +5 -0
  402. package/dist/types/hitl/index.d.ts.map +1 -1
  403. package/dist/types/hitl/index.js.map +1 -1
  404. package/dist/types/ids/brand.d.ts +5 -47
  405. package/dist/types/ids/brand.d.ts.map +1 -1
  406. package/dist/types/ids/brand.js +2 -39
  407. package/dist/types/ids/brand.js.map +1 -1
  408. package/dist/types/ids/index.d.ts +59 -69
  409. package/dist/types/ids/index.d.ts.map +1 -1
  410. package/dist/types/ids/index.js +12 -10
  411. package/dist/types/ids/index.js.map +1 -1
  412. package/dist/types/permission/index.d.ts +9 -0
  413. package/dist/types/permission/index.d.ts.map +1 -1
  414. package/dist/types/permission/index.js +9 -1
  415. package/dist/types/permission/index.js.map +1 -1
  416. package/dist/types/plugin/index.d.ts +45 -4
  417. package/dist/types/plugin/index.d.ts.map +1 -1
  418. package/dist/types/plugin/index.js +7 -0
  419. package/dist/types/plugin/index.js.map +1 -1
  420. package/dist/types/run/config.d.ts +3 -0
  421. package/dist/types/run/config.d.ts.map +1 -1
  422. package/dist/types/run/emergency.d.ts +5 -0
  423. package/dist/types/run/emergency.d.ts.map +1 -1
  424. package/dist/types/run/emergency.js.map +1 -1
  425. package/dist/types/run/entity.d.ts +6 -2
  426. package/dist/types/run/entity.d.ts.map +1 -1
  427. package/dist/types/run/events.d.ts +35 -0
  428. package/dist/types/run/events.d.ts.map +1 -1
  429. package/dist/types/run/events.js.map +1 -1
  430. package/dist/types/run/index.d.ts +1 -0
  431. package/dist/types/run/index.d.ts.map +1 -1
  432. package/dist/types/run/index.js +1 -0
  433. package/dist/types/run/index.js.map +1 -1
  434. package/dist/types/run/state.d.ts +16 -15
  435. package/dist/types/run/state.d.ts.map +1 -1
  436. package/dist/types/run/state.js +41 -22
  437. package/dist/types/run/state.js.map +1 -1
  438. package/dist/types/run/stop-reason.d.ts +3 -14
  439. package/dist/types/run/stop-reason.d.ts.map +1 -1
  440. package/dist/types/run/token-budget-store.d.ts +29 -0
  441. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  442. package/dist/types/run/token-budget-store.js +25 -0
  443. package/dist/types/run/token-budget-store.js.map +1 -0
  444. package/dist/types/sandbox/index.d.ts +27 -2
  445. package/dist/types/sandbox/index.d.ts.map +1 -1
  446. package/dist/types/sandbox/index.js.map +1 -1
  447. package/dist/types/session/store.d.ts +8 -0
  448. package/dist/types/session/store.d.ts.map +1 -1
  449. package/dist/types/tool/index.d.ts +15 -0
  450. package/dist/types/tool/index.d.ts.map +1 -1
  451. package/dist/types/tool/index.js.map +1 -1
  452. package/dist/utils/frontmatter.d.ts +1 -1
  453. package/dist/utils/frontmatter.js +1 -1
  454. package/dist/utils/id-format.d.ts +3 -0
  455. package/dist/utils/id-format.d.ts.map +1 -0
  456. package/dist/utils/id-format.js +9 -0
  457. package/dist/utils/id-format.js.map +1 -0
  458. package/dist/utils/id.d.ts +65 -32
  459. package/dist/utils/id.d.ts.map +1 -1
  460. package/dist/utils/id.js +168 -148
  461. package/dist/utils/id.js.map +1 -1
  462. package/dist/utils/log/exception.js +1 -1
  463. package/dist/utils/log/exception.js.map +1 -1
  464. package/dist/utils/log/index.d.ts.map +1 -1
  465. package/dist/utils/log/index.js +1 -2
  466. package/dist/utils/log/index.js.map +1 -1
  467. package/dist/utils/log/templates.d.ts.map +1 -1
  468. package/dist/utils/log/templates.js +0 -1
  469. package/dist/utils/log/templates.js.map +1 -1
  470. package/package.json +1 -1
  471. package/src/agents/AGENTS.md +1 -1
  472. package/src/agents/PipelineAgent.ts +129 -109
  473. package/src/agents/ReactiveAgent.ts +2 -0
  474. package/src/agents/RouterAgent.ts +120 -73
  475. package/src/agents/SupervisorAgent.ts +12 -4
  476. package/src/agents/budget.ts +42 -0
  477. package/src/agents/explore.ts +29 -0
  478. package/src/agents/file-definitions.ts +237 -0
  479. package/src/agents/index.ts +15 -0
  480. package/src/bridge/a2a/mapper.ts +6 -0
  481. package/src/bridge/sse/mapper.ts +22 -0
  482. package/src/bus/lock.ts +1 -10
  483. package/src/compaction/consolidation.ts +79 -0
  484. package/src/compaction/factory.ts +3 -0
  485. package/src/compaction/index.ts +34 -4
  486. package/src/compaction/manager.ts +39 -1
  487. package/src/compaction/plan.ts +52 -21
  488. package/src/compaction/salience/bm25.ts +72 -0
  489. package/src/compaction/salience/goal.ts +44 -0
  490. package/src/compaction/salience/index.ts +19 -0
  491. package/src/compaction/salience/minhash.ts +53 -0
  492. package/src/compaction/salience/score.ts +305 -0
  493. package/src/compaction/salience/tokenize.ts +89 -0
  494. package/src/compaction/salience/working-set.ts +187 -0
  495. package/src/compaction/serializer.ts +16 -0
  496. package/src/compaction/token-estimate.ts +57 -0
  497. package/src/compaction/tool-result-editing.ts +28 -26
  498. package/src/compaction/types.ts +24 -1
  499. package/src/compaction/wire.ts +5 -1
  500. package/src/config/runtime.ts +13 -1
  501. package/src/connector/builtins/http.ts +2 -8
  502. package/src/connector/builtins/webhook.ts +2 -2
  503. package/src/connector/mcp/adapter.ts +32 -0
  504. package/src/connector/tools/adapter.ts +2 -2
  505. package/src/connector/tools/definitions.ts +2 -2
  506. package/src/constants/compaction/index.ts +1 -0
  507. package/src/constants/telemetry/index.ts +0 -1
  508. package/src/contracts/api.ts +5 -1
  509. package/src/contracts/schemas.ts +6 -20
  510. package/src/invariants/index.ts +1 -1
  511. package/src/manager/agent/lifecycle.ts +380 -352
  512. package/src/manager/run/persistence.ts +35 -5
  513. package/src/plugin/index.ts +19 -0
  514. package/src/plugin/shell-hook.ts +403 -0
  515. package/src/prompt/coding-agent-doctrine.ts +118 -0
  516. package/src/prompt/index.ts +8 -0
  517. package/src/provider/errors.ts +1 -1
  518. package/src/provider/fallback.ts +4 -1
  519. package/src/provider/retry.ts +4 -1
  520. package/src/provider/token-budget.ts +114 -0
  521. package/src/public-runtime.ts +54 -27
  522. package/src/public-tools.ts +5 -0
  523. package/src/public-types.ts +65 -0
  524. package/src/registry/command/kernel-commands.ts +16 -6
  525. package/src/registry/tool/execute.ts +4 -1
  526. package/src/run/LimitChecker.ts +1 -1
  527. package/src/run/drain.ts +1 -1
  528. package/src/run/reporter.ts +15 -0
  529. package/src/run/token-budget.ts +692 -0
  530. package/src/runtime/jobs/registry.ts +123 -17
  531. package/src/runtime/query/checkpoint.ts +10 -3
  532. package/src/runtime/query/context.ts +3 -57
  533. package/src/runtime/query/executor.ts +128 -58
  534. package/src/runtime/query/guard.ts +8 -0
  535. package/src/runtime/query/index.ts +201 -62
  536. package/src/runtime/query/iteration/index.ts +24 -6
  537. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  538. package/src/runtime/query/iteration/phases/context.ts +2 -0
  539. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  540. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  541. package/src/runtime/query/plugin-hooks.ts +24 -2
  542. package/src/runtime/query/repeat-call.ts +42 -7
  543. package/src/runtime/query/result.ts +9 -0
  544. package/src/runtime/query/review-policy.ts +231 -0
  545. package/src/runtime/query/run-state.ts +4 -0
  546. package/src/runtime/query/steering.ts +32 -0
  547. package/src/runtime/query/token-budget.ts +127 -0
  548. package/src/runtime/query/tool-output-budget.ts +33 -10
  549. package/src/runtime/query/tool-pause.ts +4 -2
  550. package/src/runtime/query/tooling.ts +8 -0
  551. package/src/sandbox/provider/local.ts +123 -13
  552. package/src/scheduler/delegating.ts +35 -13
  553. package/src/scheduler/local.ts +5 -7
  554. package/src/session/index.ts +0 -1
  555. package/src/session/workspace/path-builder.ts +5 -4
  556. package/src/store/feedback/disk.ts +4 -6
  557. package/src/store/index.ts +2 -0
  558. package/src/store/memory/disk.ts +3 -11
  559. package/src/store/run/checkpoint-disk.ts +14 -27
  560. package/src/store/run/claim-disk.ts +1 -1
  561. package/src/store/run/conformance.ts +55 -39
  562. package/src/store/run/disk.ts +19 -4
  563. package/src/store/run/token-budget-disk.ts +247 -0
  564. package/src/store/session/disk.ts +36 -29
  565. package/src/store/session/memory.ts +38 -1
  566. package/src/store/task/disk.ts +7 -8
  567. package/src/store/topic/memory.ts +13 -1
  568. package/src/test-support/ids.ts +62 -59
  569. package/src/tools/advisory/index.ts +3 -1
  570. package/src/tools/builtins/bash.ts +11 -12
  571. package/src/tools/builtins/computer-use.ts +6 -2
  572. package/src/tools/builtins/edit.ts +2 -2
  573. package/src/tools/builtins/glob.ts +3 -3
  574. package/src/tools/builtins/grep.ts +2 -2
  575. package/src/tools/builtins/ls.ts +2 -2
  576. package/src/tools/builtins/lsp.ts +2 -2
  577. package/src/tools/builtins/read-file.ts +2 -2
  578. package/src/tools/builtins/write-file.ts +2 -2
  579. package/src/tools/coordinator/ask-user-question.ts +284 -0
  580. package/src/tools/coordinator/index.ts +5 -248
  581. package/src/tools/memory/read.ts +2 -4
  582. package/src/tools/paths.ts +64 -0
  583. package/src/tools/roster.ts +46 -0
  584. package/src/types/agent/base.ts +6 -0
  585. package/src/types/agent/pipeline.ts +3 -0
  586. package/src/types/agent/router.ts +2 -3
  587. package/src/types/agent/scheduler.ts +4 -0
  588. package/src/types/agent/task.ts +5 -18
  589. package/src/types/common/index.ts +3 -0
  590. package/src/types/computer-use/index.ts +8 -0
  591. package/src/types/hitl/index.ts +5 -0
  592. package/src/types/ids/brand.ts +5 -48
  593. package/src/types/ids/index.ts +66 -75
  594. package/src/types/permission/index.ts +11 -0
  595. package/src/types/plugin/index.ts +49 -1
  596. package/src/types/run/config.ts +3 -0
  597. package/src/types/run/emergency.ts +5 -0
  598. package/src/types/run/entity.ts +6 -2
  599. package/src/types/run/events.ts +37 -0
  600. package/src/types/run/index.ts +1 -0
  601. package/src/types/run/state.ts +58 -30
  602. package/src/types/run/stop-reason.ts +3 -14
  603. package/src/types/run/token-budget-store.ts +54 -0
  604. package/src/types/sandbox/index.ts +32 -0
  605. package/src/types/session/store.ts +8 -0
  606. package/src/types/tool/index.ts +15 -0
  607. package/src/utils/frontmatter.ts +1 -1
  608. package/src/utils/id-format.ts +9 -0
  609. package/src/utils/id.ts +222 -181
  610. package/src/utils/log/exception.ts +1 -1
  611. package/src/utils/log/index.ts +1 -2
  612. package/src/utils/log/templates.ts +0 -1
  613. package/dist/session/migration/errors.d.ts +0 -26
  614. package/dist/session/migration/errors.d.ts.map +0 -1
  615. package/dist/session/migration/errors.js +0 -22
  616. package/dist/session/migration/errors.js.map +0 -1
  617. package/dist/session/migration/filesystem.d.ts +0 -122
  618. package/dist/session/migration/filesystem.d.ts.map +0 -1
  619. package/dist/session/migration/filesystem.js +0 -379
  620. package/dist/session/migration/filesystem.js.map +0 -1
  621. package/dist/session/migration/id-prefix.d.ts +0 -113
  622. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  623. package/dist/session/migration/id-prefix.js +0 -132
  624. package/dist/session/migration/id-prefix.js.map +0 -1
  625. package/dist/session/migration/index.d.ts +0 -12
  626. package/dist/session/migration/index.d.ts.map +0 -1
  627. package/dist/session/migration/index.js +0 -12
  628. package/dist/session/migration/index.js.map +0 -1
  629. package/dist/session/migration/marker.d.ts +0 -57
  630. package/dist/session/migration/marker.d.ts.map +0 -1
  631. package/dist/session/migration/marker.js +0 -123
  632. package/dist/session/migration/marker.js.map +0 -1
  633. package/src/session/migration/errors.ts +0 -23
  634. package/src/session/migration/filesystem.ts +0 -468
  635. package/src/session/migration/id-prefix.ts +0 -166
  636. package/src/session/migration/index.ts +0 -41
  637. package/src/session/migration/marker.ts +0 -142
@@ -25,18 +25,20 @@ 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,
41
43
  } from '../../types/sandbox/index.js'
42
44
  import { subscribeToAbort } from '../../utils/abort.js'
@@ -208,6 +210,8 @@ export interface LimitedSpawnRequest {
208
210
  readonly command: string
209
211
  readonly args: readonly string[]
210
212
  readonly rootDir: string
213
+ /** Bound read-write beside the root; see `SandboxCreateConfig.additionalDirectories`. */
214
+ readonly additionalDirectories?: readonly string[]
211
215
  readonly memoryLimitMb?: number
212
216
  readonly maxProcesses?: number
213
217
  }
@@ -265,7 +269,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
265
269
  case 'linux-bwrap':
266
270
  return {
267
271
  spawnCommand: requiredWrapper(request),
268
- spawnArgs: [...buildBwrapArgs(rootDir), '--', ...inner],
272
+ spawnArgs: [...buildBwrapArgs(rootDir, request.additionalDirectories), '--', ...inner],
269
273
  }
270
274
 
271
275
  case 'linux-namespace':
@@ -277,7 +281,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
277
281
  case 'macos-seatbelt':
278
282
  return {
279
283
  spawnCommand: requiredWrapper(request),
280
- spawnArgs: [...buildSeatbeltArgs(rootDir), '--', ...inner],
284
+ spawnArgs: [...buildSeatbeltArgs(rootDir, request.additionalDirectories), '--', ...inner],
281
285
  }
282
286
 
283
287
  case 'basic': {
@@ -375,7 +379,10 @@ function canonicalizePath(p: string): string {
375
379
  * process table through them — a bound `/proc` would hand back the process
376
380
  * isolation the same flag just removed.
377
381
  */
378
- export function buildBwrapArgs(sandboxRoot: string): string[] {
382
+ export function buildBwrapArgs(
383
+ sandboxRoot: string,
384
+ additionalDirectories: readonly string[] = [],
385
+ ): string[] {
379
386
  const root = canonicalizePath(sandboxRoot)
380
387
 
381
388
  const args = [
@@ -426,9 +433,15 @@ export function buildBwrapArgs(sandboxRoot: string): string[] {
426
433
  '--bind',
427
434
  root,
428
435
  root,
429
- '--chdir',
430
- root,
431
436
  )
437
+ // The host's added directories, read-write at their own paths, so a
438
+ // path the model was given on the host means the same thing inside.
439
+ for (const dir of additionalDirectories) {
440
+ const canonical = canonicalizePath(dir)
441
+ if (canonical === root) continue
442
+ args.push('--bind', canonical, canonical)
443
+ }
444
+ args.push('--chdir', root)
432
445
 
433
446
  return args
434
447
  }
@@ -450,10 +463,21 @@ const BWRAP_SYSTEM_PATHS: readonly string[] = [
450
463
  '/opt',
451
464
  ]
452
465
 
453
- function buildSeatbeltProfile(): string {
466
+ function seatbeltString(value: string): string {
467
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
468
+ }
469
+
470
+ function buildSeatbeltProfile(additionalDirectories: readonly string[] = []): string {
454
471
  return [
455
472
  '(version 1)',
456
473
  '(deny default)',
474
+ // The host's added directories, read-write, by the same contract as
475
+ // the root. Literal paths rather than params: sandbox-exec takes one
476
+ // -D per name and the count here is the operator's.
477
+ ...additionalDirectories.flatMap((dir) => [
478
+ `(allow file-read* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
479
+ `(allow file-write* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
480
+ ]),
457
481
 
458
482
  // --- Process lifecycle ---
459
483
  '(allow process-exec)',
@@ -538,8 +562,15 @@ function buildSeatbeltProfile(): string {
538
562
  * remain path bytes instead of becoming policy syntax. This is the same
539
563
  * parameter boundary used by Codex's seatbelt builder.
540
564
  */
541
- function buildSeatbeltArgs(sandboxRoot: string): string[] {
542
- return ['-p', buildSeatbeltProfile(), `-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`]
565
+ function buildSeatbeltArgs(
566
+ sandboxRoot: string,
567
+ additionalDirectories: readonly string[] = [],
568
+ ): string[] {
569
+ return [
570
+ '-p',
571
+ buildSeatbeltProfile(additionalDirectories),
572
+ `-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`,
573
+ ]
543
574
  }
544
575
 
545
576
  // ---------------------------------------------------------------------------
@@ -595,6 +626,12 @@ class LocalSandbox implements Sandbox {
595
626
  private _status: SandboxStatus
596
627
  private readonly config: SandboxCreateConfig
597
628
  private readonly log: Logger
629
+ /** The host's added directories, canonical; bound beside the root. */
630
+ private readonly additionalDirectories: readonly string[]
631
+ /** Where this sandbox's own file API may reach: the root, then the added directories. */
632
+ private get roots(): readonly string[] {
633
+ return [this.rootDir, ...this.additionalDirectories]
634
+ }
598
635
 
599
636
  get status(): SandboxStatus {
600
637
  return this._status
@@ -613,6 +650,9 @@ class LocalSandbox implements Sandbox {
613
650
  this.rootDir = rootDir
614
651
  this.environment = environment
615
652
  this.config = config
653
+ this.additionalDirectories = (config.additionalDirectories ?? [])
654
+ .map((dir) => canonicalizePath(resolve(dir)))
655
+ .filter((dir) => dir !== rootDir)
616
656
  this._status = 'ready'
617
657
  this.log = log.child({
618
658
  [SCOPE_ATTRIBUTE]: 'sandbox/provider/local',
@@ -640,7 +680,7 @@ class LocalSandbox implements Sandbox {
640
680
  const env = buildSafeEnv(this.config.env, opts?.env)
641
681
  const timeout = opts?.timeout ?? this.config.timeoutMs ?? SANDBOX_DEFAULT_TIMEOUT_MS
642
682
 
643
- const cwd = opts?.cwd ? await resolveWithinReal(this.rootDir, opts.cwd) : this.rootDir
683
+ const cwd = opts?.cwd ? await resolveWithinAnyReal(this.roots, opts.cwd) : this.rootDir
644
684
 
645
685
  const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(
646
686
  command,
@@ -689,7 +729,7 @@ class LocalSandbox implements Sandbox {
689
729
  throw new Error(`Sandbox ${this.id} is destroyed`)
690
730
  }
691
731
 
692
- const resolved = await resolveWithinReal(this.rootDir, path)
732
+ const resolved = await resolveWithinAnyReal(this.roots, path)
693
733
  await mkdir(dirname(resolved), { recursive: true })
694
734
 
695
735
  // Convention 8: Atomic write (write-tmp-rename)
@@ -705,7 +745,7 @@ class LocalSandbox implements Sandbox {
705
745
  throw new Error(`Sandbox ${this.id} is destroyed`)
706
746
  }
707
747
 
708
- const resolved = await resolveWithinReal(this.rootDir, path)
748
+ const resolved = await resolveWithinAnyReal(this.roots, path)
709
749
  return fsReadFile(resolved)
710
750
  }
711
751
 
@@ -714,7 +754,7 @@ class LocalSandbox implements Sandbox {
714
754
  throw new Error(`Sandbox ${this.id} is destroyed`)
715
755
  }
716
756
 
717
- const resolved = await resolveWithinReal(this.rootDir, rootPath)
757
+ const resolved = await resolveWithinAnyReal(this.roots, rootPath)
718
758
  const root = await stat(resolved).catch(() => null)
719
759
  if (!root || !root.isDirectory()) return []
720
760
 
@@ -759,6 +799,67 @@ class LocalSandbox implements Sandbox {
759
799
  // Private helpers
760
800
  // -----------------------------------------------------------------------
761
801
 
802
+ spawnDetached(
803
+ command: string,
804
+ args: readonly string[] = [],
805
+ opts?: SandboxSpawnOptions,
806
+ ): SandboxDetachedProcess {
807
+ if (this._status === 'destroyed') {
808
+ throw new Error(`Sandbox ${this.id} is destroyed`)
809
+ }
810
+ // Lexical containment for the cwd: the caller does not wait, so
811
+ // neither does this. The mounts are the same ones `exec` uses.
812
+ const cwd = opts?.cwd ? resolveWithinAny(this.roots, opts.cwd) : this.rootDir
813
+ const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(command, [
814
+ ...args,
815
+ ])
816
+ const env = buildSafeEnv(this.config.env, opts?.env)
817
+ const child = spawn(spawnCommand, spawnArgs, {
818
+ cwd,
819
+ env,
820
+ stdio:
821
+ bwrapInfoFd === undefined
822
+ ? ['ignore', 'pipe', 'pipe']
823
+ : ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'],
824
+ detached: process.platform !== 'win32',
825
+ })
826
+ let bwrapChildPid: number | undefined
827
+ let requested: NodeJS.Signals | undefined
828
+ // Same dance as `exec`: bwrap's inner reaper is in its own session, so
829
+ // a kill has to reach it by the pid the info fd reports, and a kill
830
+ // asked for before that pid is known is delivered when it arrives.
831
+ const bwrapInfo = bwrapInfoFd === undefined ? undefined : child.stdio[bwrapInfoFd]
832
+ const bwrapBlock = bwrapBlockFd === undefined ? undefined : child.stdio[bwrapBlockFd]
833
+ let bwrapInfoBuffer = ''
834
+ bwrapInfo?.on('data', (chunk: Buffer) => {
835
+ if (bwrapChildPid !== undefined) return
836
+ bwrapInfoBuffer += chunk.toString('utf8')
837
+ const observed = readBwrapChildPid(bwrapInfoBuffer)
838
+ if (observed === undefined) return
839
+ bwrapChildPid = observed
840
+ if (requested !== undefined) {
841
+ killTree(child, 'SIGKILL')
842
+ killBwrapChild(bwrapChildPid, 'SIGKILL')
843
+ } else if (bwrapBlock !== undefined && bwrapBlock !== null && 'end' in bwrapBlock) {
844
+ bwrapBlock.end(Buffer.from([1]))
845
+ }
846
+ })
847
+ this.log.debug('Detached process started', {
848
+ 'namzu.sandbox.command': command,
849
+ 'namzu.sandbox.args': args,
850
+ 'namzu.execution.environment': this.environment,
851
+ })
852
+ return {
853
+ child,
854
+ kill: (signal) => {
855
+ requested = signal
856
+ if (bwrapBlockFd !== undefined && bwrapChildPid === undefined) return
857
+ killTree(child, signal)
858
+ killBwrapChild(bwrapChildPid, signal)
859
+ },
860
+ }
861
+ }
862
+
762
863
  private buildSpawnArgs(
763
864
  command: string,
764
865
  args: string[],
@@ -774,6 +875,9 @@ class LocalSandbox implements Sandbox {
774
875
  command,
775
876
  args,
776
877
  rootDir: this.rootDir,
878
+ ...(this.additionalDirectories.length > 0
879
+ ? { additionalDirectories: this.additionalDirectories }
880
+ : {}),
777
881
  ...(this.config.memoryLimitMb !== undefined
778
882
  ? { memoryLimitMb: this.config.memoryLimitMb }
779
883
  : {}),
@@ -1051,6 +1155,12 @@ export class LocalSandboxProvider implements SandboxProvider {
1051
1155
  )
1052
1156
  }
1053
1157
  removeRootOnDestroy = false
1158
+ for (const dir of config.additionalDirectories ?? []) {
1159
+ const entry = await stat(resolve(dir)).catch(() => null)
1160
+ if (!entry?.isDirectory()) {
1161
+ throw new Error(`Sandbox additional directory is not a directory: ${resolve(dir)}`)
1162
+ }
1163
+ }
1054
1164
  } else {
1055
1165
  // No workspace was named: this allocation owns a fresh temporary root.
1056
1166
  const { mkdtemp } = await import('node:fs/promises')
@@ -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
 
@@ -16,6 +16,7 @@ import type {
16
16
  } from '../../types/run/checkpoint-store.js'
17
17
  import type { RunStoreConfig } from '../../types/run/index.js'
18
18
  import type { ProjectId } from '../../types/session/ids.js'
19
+ import { asRunId, isEntityId } from '../../utils/id.js'
19
20
  import { acquireClaim, currentFence, readClaim, releaseClaim } from './claim-disk.js'
20
21
  import { RunDiskStore, readCheckpointsIn } from './disk.js'
21
22
  import {
@@ -56,14 +57,14 @@ export interface DiskCheckpointStoreAttribution {
56
57
  * participate in directory resolution — `tenantId`/`projectId`/`sessionId`
57
58
  * exist for backends that key by attribution instead of path.
58
59
  *
59
- * One `RunDiskStore` is bound (and its run directory created) per distinct
60
- * `runId`, then cached, so repeated checkpoint operations against the same
61
- * run don't re-run `initRun`.
60
+ * One `RunDiskStore` is bound per resolved run directory, then cached, so
61
+ * repeated checkpoint operations against the same run don't re-run `initRun`.
62
+ * Parent attribution remains part of the address even when a cache is warm.
62
63
  */
63
64
  export class DiskCheckpointStore implements CheckpointStore {
64
65
  private readonly config: RunStoreConfig
65
66
  private readonly attribution?: DiskCheckpointStoreAttribution
66
- private readonly bound = new Map<RunId, Promise<RunDiskStore>>()
67
+ private readonly bound = new Map<string, Promise<RunDiskStore>>()
67
68
 
68
69
  /**
69
70
  * @param config the run-store config; `baseDir` is one session's `runs/`
@@ -79,17 +80,18 @@ export class DiskCheckpointStore implements CheckpointStore {
79
80
  }
80
81
 
81
82
  private bind(scope: CheckpointRunScope): Promise<RunDiskStore> {
82
- const cached = this.bound.get(scope.runId)
83
+ const path = this.runDir(scope)
84
+ const cached = this.bound.get(path)
83
85
  if (cached) return cached
84
86
  const promise = (async () => {
85
87
  const store = new RunDiskStore(this.config)
86
88
  await store.initRun(scope.runId, scope.parentRunId)
87
89
  return store
88
90
  })()
89
- this.bound.set(scope.runId, promise)
91
+ this.bound.set(path, promise)
90
92
  // A failed bind must not poison the cache — the next call retries.
91
93
  promise.catch(() => {
92
- this.bound.delete(scope.runId)
94
+ this.bound.delete(path)
93
95
  })
94
96
  return promise
95
97
  }
@@ -130,6 +132,8 @@ export class DiskCheckpointStore implements CheckpointStore {
130
132
  * the two stay together if the layout ever moves.
131
133
  */
132
134
  private runDir(scope: CheckpointRunScope): string {
135
+ asRunId(scope.runId)
136
+ if (scope.parentRunId !== undefined) asRunId(scope.parentRunId)
133
137
  return scope.parentRunId
134
138
  ? join(this.config.baseDir, scope.parentRunId, 'children', scope.runId)
135
139
  : join(this.config.baseDir, scope.runId)
@@ -247,27 +251,10 @@ export class DiskCheckpointStore implements CheckpointStore {
247
251
  private async readRunDirs(dir: string): Promise<RunId[]> {
248
252
  try {
249
253
  const found = await readdir(dir, { withFileTypes: true })
250
- // Filtered by prefix, not just by "is a directory", so the declared
251
- // `RunId[]` is true of what comes back. An editor's scratch folder or
252
- // a `tmp-` left by a crashed write is not a run, and the assertion
253
- // below is what let it be returned as one.
254
- //
255
- // **Unobservable through `listDurableRuns` today, and kept
256
- // deliberately.** Measured, not assumed: removing this filter, and
257
- // separately weakening it to `startsWith('r')`, leaves every test in
258
- // this package green. `toDurableRunEntry` returns undefined for a
259
- // directory with no checkpoints in it, so a junk name is already
260
- // dropped one layer down — the filter saves the `readdir` and the
261
- // parse, not a wrong answer. It is here because `readRunDirs` is a
262
- // private helper with two callers and a declared element type, and
263
- // the next caller inherits the type rather than the accident that
264
- // currently covers for it.
265
- //
266
- // Filtered rather than refused, whatever the reach: a scan that
267
- // threw on one piece of junk could not list the runs that are fine,
268
- // during exactly the incident this listing exists for.
254
+ // The directory supplies the entity kind. Admit current and legacy
255
+ // run IDs; ignore scratch entries without hiding durable UUID runs.
269
256
  return found
270
- .filter((e) => e.isDirectory() && e.name.startsWith('run_'))
257
+ .filter((e) => e.isDirectory() && isEntityId(e.name, 'run'))
271
258
  .map((e) => e.name as RunId)
272
259
  } catch (err) {
273
260
  if ((err as NodeJS.ErrnoException).code === 'ENOENT') return []
@@ -275,7 +275,7 @@ const NO_LINK = new Set(['EPERM', 'ENOTSUP', 'EOPNOTSUPP', 'ENOSYS', 'EXDEV', 'E
275
275
  *
276
276
  * Some filesystems — a few network and removable volumes — support no hard
277
277
  * link at all. **This refuses rather than falling back**, per
278
- * [refuse-do-not-degrade](../../../../../docs/conventions/refuse-do-not-degrade.md).
278
+ * [refuse-do-not-degrade](../../../../../"refuse do not degrade").
279
279
  * The only available fallback is the `wx` publish this replaced, and that one
280
280
  * carries the defect described in the module header: two workers restore and
281
281
  * run the same run. A claim that silently becomes non-exclusive is worse than