@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
@@ -33,7 +33,7 @@
33
33
  *
34
34
  * ## Consuming it
35
35
  *
36
- * See `docs/sdk/runtime/checkpoint-store-conformance.md`. In short:
36
+ * In short:
37
37
  *
38
38
  * ```typescript
39
39
  * import { describe, expect, it } from 'your-runner'
@@ -62,7 +62,13 @@ import type { CostInfo } from '../../types/common/index.js'
62
62
  import type { IterationCheckpoint } from '../../types/hitl/index.js'
63
63
  import type { ProjectId, SessionId, TenantId } from '../../types/ids/index.js'
64
64
  import type { CheckpointStore } from '../../types/run/checkpoint-store.js'
65
- import { asCheckpointId, asProjectId, asRunId, asSessionId, asTenantId } from '../../utils/id.js'
65
+ import {
66
+ asProjectId,
67
+ asRunId,
68
+ asSessionId,
69
+ asTenantId,
70
+ generateCheckpointId,
71
+ } from '../../utils/id.js'
66
72
  import { claimRun, listDurableRuns, releaseRun } from './listing.js'
67
73
 
68
74
  /**
@@ -167,13 +173,13 @@ export interface CheckpointStoreConformanceOptions {
167
173
 
168
174
  /** The tenant/project/session every case addresses unless it needs a second. */
169
175
  const BINDING: CheckpointStoreBinding = {
170
- tenantId: asTenantId('tnt_conformance'),
171
- projectId: asProjectId('prj_conformance'),
172
- sessionId: asSessionId('ses_conformance'),
176
+ tenantId: asTenantId('528cd907-2b3e-4524-b67d-bcf63bfd4b60'),
177
+ projectId: asProjectId('e74a687e-883b-43e9-a1e4-0c254b9d9eb1'),
178
+ sessionId: asSessionId('5abc3e06-d1a0-4036-84f4-903b11b1d781'),
173
179
  }
174
180
 
175
181
  /** A tenant no backend under test holds runs for. */
176
- const FOREIGN_TENANT = asTenantId('tnt_conformance_other')
182
+ const FOREIGN_TENANT = asTenantId('4ddf9f0b-a8c3-4f53-853b-1c604fc1ba52')
177
183
 
178
184
  /** Fixed instant, so every expiry in a case is judged against one clock. */
179
185
  const NOW = 5_000_000
@@ -191,12 +197,9 @@ const NO_COST: CostInfo = {
191
197
  unpricedTokens: 0,
192
198
  }
193
199
 
194
- let checkpointSeq = 0
195
-
196
200
  function checkpoint(runId: string): IterationCheckpoint {
197
- checkpointSeq += 1
198
201
  return {
199
- id: asCheckpointId(`cp_conformance_${checkpointSeq}`),
202
+ id: generateCheckpointId(),
200
203
  runId: asRunId(runId),
201
204
  iteration: 1,
202
205
  messages: [],
@@ -213,7 +216,7 @@ function checkpoint(runId: string): IterationCheckpoint {
213
216
  }
214
217
  }
215
218
 
216
- function runScope(binding: CheckpointStoreBinding, runId = 'run_conformance_a') {
219
+ function runScope(binding: CheckpointStoreBinding, runId = '5c84eacc-d287-4155-ac3b-336deb7b2d63') {
217
220
  return { ...binding, runId: asRunId(runId) }
218
221
  }
219
222
 
@@ -427,7 +430,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
427
430
  })
428
431
  await store.writeCheckpoint(
429
432
  runScope(BINDING),
430
- checkpoint('run_conformance_a'),
433
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
431
434
  claim?.fence,
432
435
  )
433
436
  const written = await store.listCheckpoints(runScope(BINDING))
@@ -446,7 +449,10 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
446
449
  // A host that adopts claims on one worker must not break the
447
450
  // workers that have not adopted them yet. Refusing here would
448
451
  // make the capability impossible to roll out incrementally.
449
- await store.writeCheckpoint(runScope(BINDING), checkpoint('run_conformance_a'))
452
+ await store.writeCheckpoint(
453
+ runScope(BINDING),
454
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
455
+ )
450
456
  const written = await store.listCheckpoints(runScope(BINDING))
451
457
  expect(written.length).toBe(1)
452
458
  }),
@@ -476,7 +482,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
476
482
  () =>
477
483
  store.writeCheckpoint(
478
484
  runScope(BINDING),
479
- checkpoint('run_conformance_a'),
485
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
480
486
  first?.fence,
481
487
  ),
482
488
  /no longer holds it/,
@@ -515,7 +521,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
515
521
  () =>
516
522
  store.writeCheckpoint(
517
523
  runScope(BINDING),
518
- checkpoint('run_conformance_a'),
524
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
519
525
  stale?.fence,
520
526
  ),
521
527
  /no longer holds it/,
@@ -543,7 +549,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
543
549
  () =>
544
550
  store.writeCheckpoint(
545
551
  runScope(BINDING),
546
- checkpoint('run_conformance_a'),
552
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
547
553
  claim?.fence,
548
554
  ),
549
555
  /no longer holds it/,
@@ -559,8 +565,8 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
559
565
  'answers nothing for a tenant it does not hold',
560
566
  withStore(async (store) => {
561
567
  await store.writeCheckpoint(
562
- runScope(BINDING, 'run_conformance_a'),
563
- checkpoint('run_conformance_a'),
568
+ runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
569
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
564
570
  )
565
571
 
566
572
  const foreign = await listDurableRuns(store, { tenantId: FOREIGN_TENANT })
@@ -575,13 +581,13 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
575
581
  'answers nothing for a project it does not hold',
576
582
  withStore(async (store) => {
577
583
  await store.writeCheckpoint(
578
- runScope(BINDING, 'run_conformance_a'),
579
- checkpoint('run_conformance_a'),
584
+ runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
585
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
580
586
  )
581
587
 
582
588
  const foreign = await listDurableRuns(store, {
583
589
  tenantId: BINDING.tenantId,
584
- projectId: asProjectId('prj_conformance_other'),
590
+ projectId: asProjectId('f89abf78-869a-40b1-8463-9a3051be514f'),
585
591
  })
586
592
  expect(foreign.entries.map((e) => e.runId)).toEqual([])
587
593
  }),
@@ -610,18 +616,18 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
610
616
  'rebuilds an addressable row for every run it holds',
611
617
  withStore(async (store) => {
612
618
  await store.writeCheckpoint(
613
- runScope(BINDING, 'run_conformance_a'),
614
- checkpoint('run_conformance_a'),
619
+ runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
620
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
615
621
  )
616
622
  await store.writeCheckpoint(
617
- runScope(BINDING, 'run_conformance_b'),
618
- checkpoint('run_conformance_b'),
623
+ runScope(BINDING, '31e7abcd-79c7-4720-ad81-f57f89d1ec63'),
624
+ checkpoint('31e7abcd-79c7-4720-ad81-f57f89d1ec63'),
619
625
  )
620
626
 
621
627
  const page = await listDurableRuns(store, { tenantId: BINDING.tenantId })
622
628
  expect(page.entries.map((e) => e.runId)).toEqual([
623
- 'run_conformance_a',
624
- 'run_conformance_b',
629
+ '31e7abcd-79c7-4720-ad81-f57f89d1ec63',
630
+ '5c84eacc-d287-4155-ac3b-336deb7b2d63',
625
631
  ])
626
632
  // A row that cannot be turned back into a scope is a report,
627
633
  // not a work queue.
@@ -641,24 +647,28 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
641
647
  'keeps one tenant’s runs out of another tenant’s listing',
642
648
  withStore(async (store) => {
643
649
  await store.writeCheckpoint(
644
- runScope(BINDING, 'run_conformance_a'),
645
- checkpoint('run_conformance_a'),
650
+ runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
651
+ checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
646
652
  )
647
653
  await store.writeCheckpoint(
648
654
  {
649
655
  tenantId: FOREIGN_TENANT,
650
656
  projectId: BINDING.projectId,
651
657
  sessionId: BINDING.sessionId,
652
- runId: asRunId('run_conformance_z'),
658
+ runId: asRunId('a8085004-143d-49b4-9beb-8c396f723803'),
653
659
  },
654
- checkpoint('run_conformance_z'),
660
+ checkpoint('a8085004-143d-49b4-9beb-8c396f723803'),
655
661
  )
656
662
 
657
663
  const mine = await listDurableRuns(store, { tenantId: BINDING.tenantId })
658
- expect(mine.entries.map((e) => e.runId)).toEqual(['run_conformance_a'])
664
+ expect(mine.entries.map((e) => e.runId)).toEqual([
665
+ '5c84eacc-d287-4155-ac3b-336deb7b2d63',
666
+ ])
659
667
 
660
668
  const theirs = await listDurableRuns(store, { tenantId: FOREIGN_TENANT })
661
- expect(theirs.entries.map((e) => e.runId)).toEqual(['run_conformance_z'])
669
+ expect(theirs.entries.map((e) => e.runId)).toEqual([
670
+ 'a8085004-143d-49b4-9beb-8c396f723803',
671
+ ])
662
672
  }),
663
673
  )
664
674
  }
@@ -667,15 +677,19 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
667
677
  it(
668
678
  'shows the queue reader which runs nobody holds',
669
679
  withStore(async (store) => {
670
- for (const id of ['run_conformance_a', 'run_conformance_b', 'run_conformance_c'])
680
+ for (const id of [
681
+ '5c84eacc-d287-4155-ac3b-336deb7b2d63',
682
+ '31e7abcd-79c7-4720-ad81-f57f89d1ec63',
683
+ '727c095d-acad-4264-89f6-66cadc0bb644',
684
+ ])
671
685
  await store.writeCheckpoint(runScope(BINDING, id), checkpoint(id))
672
686
 
673
- await claimRun(store, runScope(BINDING, 'run_conformance_a'), {
687
+ await claimRun(store, runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'), {
674
688
  holder: 'w1',
675
689
  ttlMs: 60_000,
676
690
  now: NOW,
677
691
  })
678
- await claimRun(store, runScope(BINDING, 'run_conformance_b'), {
692
+ await claimRun(store, runScope(BINDING, '31e7abcd-79c7-4720-ad81-f57f89d1ec63'), {
679
693
  holder: 'w1',
680
694
  ttlMs: 1_000,
681
695
  now: NOW,
@@ -691,8 +705,8 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
691
705
  // forever — the failure the lease exists to prevent,
692
706
  // reintroduced by the filter that reads it.
693
707
  expect(free.entries.map((e) => e.runId)).toEqual([
694
- 'run_conformance_b',
695
- 'run_conformance_c',
708
+ '31e7abcd-79c7-4720-ad81-f57f89d1ec63',
709
+ '727c095d-acad-4264-89f6-66cadc0bb644',
696
710
  ])
697
711
 
698
712
  const taken = await listDurableRuns(
@@ -700,7 +714,9 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
700
714
  { tenantId: BINDING.tenantId },
701
715
  { claimed: true, now: NOW + 2_000 },
702
716
  )
703
- expect(taken.entries.map((e) => e.runId)).toEqual(['run_conformance_a'])
717
+ expect(taken.entries.map((e) => e.runId)).toEqual([
718
+ '5c84eacc-d287-4155-ac3b-336deb7b2d63',
719
+ ])
704
720
  expect(taken.entries[0]?.claim?.holder).toBe('w1')
705
721
  expect(taken.entries[0]?.claim?.expired).toBe(false)
706
722
  }),
@@ -16,6 +16,7 @@ import type {
16
16
  RunStore,
17
17
  } from '../../types/run/store.js'
18
18
  import { atomicWriteFile } from '../../utils/atomic-write.js'
19
+ import { asCheckpointId, asRunId } from '../../utils/id.js'
19
20
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
20
21
  import { type Logger, resolveLogger } from '../../utils/logger.js'
21
22
  import { defineSchema, migrate, stamp } from '../schema.js'
@@ -29,6 +30,13 @@ import { defineSchema, migrate, stamp } from '../schema.js'
29
30
  * the shape changes.
30
31
  */
31
32
  const SCHEMA = defineSchema({ kind: 'run-store', current: 1, migrations: {} })
33
+ // Older readers must refuse ledger-bound checkpoints instead of dropping their
34
+ // budget authority. Other run-store records retain their existing schema.
35
+ const CHECKPOINT_SCHEMA = defineSchema({
36
+ kind: 'run-checkpoint',
37
+ current: 2,
38
+ migrations: { 1: (record) => record },
39
+ })
32
40
 
33
41
  /**
34
42
  * One finished tool call, recovered from the transcript.
@@ -58,6 +66,8 @@ export class RunDiskStore implements RunStore {
58
66
  }
59
67
 
60
68
  async initRun(runId: string, parentRunId?: string): Promise<string> {
69
+ asRunId(runId)
70
+ if (parentRunId !== undefined) asRunId(parentRunId)
61
71
  if (parentRunId) {
62
72
  this.runDir = join(this.baseDir, parentRunId, 'children', runId)
63
73
  } else {
@@ -195,6 +205,8 @@ export class RunDiskStore implements RunStore {
195
205
  status: run.status,
196
206
  metadata: run.metadata,
197
207
  tokenUsage: run.tokenUsage,
208
+ budget: run.budget,
209
+ budgetBinding: run.budgetBinding,
198
210
  currentIteration: run.currentIteration,
199
211
  startedAt: run.startedAt,
200
212
  endedAt: run.endedAt,
@@ -237,6 +249,7 @@ export class RunDiskStore implements RunStore {
237
249
  }
238
250
 
239
251
  async writeCheckpoint(checkpoint: IterationCheckpoint): Promise<void> {
252
+ asCheckpointId(checkpoint.id)
240
253
  const dir = this.requireInit()
241
254
  const cpDir = join(dir, 'checkpoints')
242
255
  await mkdir(cpDir, { recursive: true })
@@ -247,10 +260,11 @@ export class RunDiskStore implements RunStore {
247
260
  // as if it were the older shape, and the refusal that exists to
248
261
  // prevent exactly that never fires. The stamp is what gives the
249
262
  // migration chain something to hang on.
250
- await atomicWriteJson(join(cpDir, `${checkpoint.id}.json`), stamp(SCHEMA, checkpoint))
263
+ await atomicWriteJson(join(cpDir, `${checkpoint.id}.json`), checkpoint, CHECKPOINT_SCHEMA)
251
264
  }
252
265
 
253
266
  async readCheckpoint(checkpointId: CheckpointId): Promise<IterationCheckpoint | null> {
267
+ asCheckpointId(checkpointId)
254
268
  const dir = this.requireInit()
255
269
  try {
256
270
  const content = await readFile(join(dir, 'checkpoints', `${checkpointId}.json`), 'utf-8')
@@ -266,6 +280,7 @@ export class RunDiskStore implements RunStore {
266
280
  }
267
281
 
268
282
  async deleteCheckpoint(checkpointId: CheckpointId): Promise<void> {
283
+ asCheckpointId(checkpointId)
269
284
  const dir = this.requireInit()
270
285
  try {
271
286
  await unlink(join(dir, 'checkpoints', `${checkpointId}.json`))
@@ -611,8 +626,8 @@ export async function readCheckpointsIn(runDir: string): Promise<IterationCheckp
611
626
  return checkpoints.sort((a, b) => a.createdAt - b.createdAt)
612
627
  }
613
628
 
614
- async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
615
- await atomicWriteFile(filePath, JSON.stringify(stamp(SCHEMA, value), null, 2))
629
+ async function atomicWriteJson(filePath: string, value: unknown, schema = SCHEMA): Promise<void> {
630
+ await atomicWriteFile(filePath, JSON.stringify(stamp(schema, value), null, 2))
616
631
  }
617
632
 
618
633
  /**
@@ -656,7 +671,7 @@ function hasUsableBudgets(record: Partial<IterationCheckpoint>): boolean {
656
671
  }
657
672
 
658
673
  function parseCheckpoint(content: string, file: string): IterationCheckpoint {
659
- const parsed = migrate<unknown>(SCHEMA, JSON.parse(content))
674
+ const parsed = migrate<unknown>(CHECKPOINT_SCHEMA, JSON.parse(content))
660
675
  const record = parsed as Partial<IterationCheckpoint> | null
661
676
 
662
677
  if (
@@ -0,0 +1,247 @@
1
+ import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises'
2
+ import { dirname, join } from 'node:path'
3
+ import {
4
+ TokenBudget,
5
+ type TokenBudgetSnapshot,
6
+ validateTokenBudgetSnapshot,
7
+ } from '../../run/token-budget.js'
8
+ import { DefaultPathBuilder, type PathBuilder } from '../../session/workspace/path-builder.js'
9
+ import type { TokenUsage } from '../../types/common/index.js'
10
+ import type { TokenBudgetScope, TokenBudgetStore } from '../../types/run/token-budget-store.js'
11
+ import { temporaryPathFor } from '../../utils/atomic-write.js'
12
+ import { asProjectId, asRunId, asSessionId, asTenantId } from '../../utils/id.js'
13
+
14
+ interface BudgetRecord {
15
+ readonly version: 1
16
+ readonly scope: TokenBudgetScope
17
+ readonly snapshot: TokenBudgetSnapshot
18
+ }
19
+
20
+ export interface DiskTokenBudgetStoreConfig {
21
+ /** Root session's runs directory, shared by every account in a tree. */
22
+ readonly baseDir: string
23
+ }
24
+
25
+ /**
26
+ * Canonical ledger beside the root run, independent of checkpoint pruning.
27
+ *
28
+ * Writes from this instance are serialized and use private atomic sidecars.
29
+ * New directories are mode 0700 and files are mode 0600. This is a single
30
+ * writer store; atomic replacement does not provide a distributed lease.
31
+ */
32
+ export class DiskTokenBudgetStore implements TokenBudgetStore {
33
+ private readonly writes = new Map<string, Promise<void>>()
34
+
35
+ constructor(private readonly config: DiskTokenBudgetStoreConfig) {}
36
+
37
+ private path(scope: TokenBudgetScope): string {
38
+ validateScope(scope)
39
+ return join(this.config.baseDir, scope.runId, 'token-budget.json')
40
+ }
41
+
42
+ async load(scope: TokenBudgetScope): Promise<TokenBudgetSnapshot | null> {
43
+ const path = this.path(scope)
44
+ await this.writes.get(path)
45
+ return this.read(path, scope)
46
+ }
47
+
48
+ async save(scope: TokenBudgetScope, snapshot: TokenBudgetSnapshot): Promise<void> {
49
+ const path = this.path(scope)
50
+ const checkedScope = validateScope(scope)
51
+ const checkedSnapshot = validateSnapshotScope(snapshot, checkedScope)
52
+ const previous = this.writes.get(path) ?? Promise.resolve()
53
+ const writing = previous
54
+ .catch(() => undefined)
55
+ .then(async () => {
56
+ const existing = await this.read(path, checkedScope)
57
+ if (existing) assertSameRoot(existing, checkedSnapshot)
58
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 })
59
+ const temporary = temporaryPathFor(path)
60
+ const record: BudgetRecord = {
61
+ version: 1,
62
+ scope: checkedScope,
63
+ snapshot: checkedSnapshot,
64
+ }
65
+ try {
66
+ await writeFile(temporary, `${JSON.stringify(record)}\n`, {
67
+ encoding: 'utf8',
68
+ flag: 'wx',
69
+ mode: 0o600,
70
+ })
71
+ await rename(temporary, path)
72
+ } catch (error) {
73
+ await unlink(temporary).catch(() => undefined)
74
+ throw error
75
+ }
76
+ })
77
+ this.writes.set(path, writing)
78
+ try {
79
+ await writing
80
+ } finally {
81
+ if (this.writes.get(path) === writing) this.writes.delete(path)
82
+ }
83
+ }
84
+
85
+ private async read(path: string, scope: TokenBudgetScope): Promise<TokenBudgetSnapshot | null> {
86
+ let text: string
87
+ try {
88
+ text = await readFile(path, 'utf8')
89
+ } catch (error) {
90
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null
91
+ throw error
92
+ }
93
+ const raw: unknown = JSON.parse(text)
94
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
95
+ throw new Error('Invalid token budget record')
96
+ }
97
+ const record = raw as Partial<BudgetRecord>
98
+ if (record.version !== 1) throw new Error('Unsupported token budget record version')
99
+ if (!record.scope) throw new Error('Token budget record is missing its root scope')
100
+ const storedScope = validateScope(record.scope)
101
+ if (!sameScope(scope, storedScope)) throw new Error('Token budget root scope mismatch')
102
+ return validateSnapshotScope(record.snapshot, scope)
103
+ }
104
+ }
105
+
106
+ export interface OpenTokenBudgetOptions {
107
+ readonly store?: TokenBudgetStore
108
+ readonly scope: TokenBudgetScope
109
+ /** Required for a new root. Existing roots can reopen without changing their cap. */
110
+ readonly limit?: number
111
+ readonly pathBuilder?: PathBuilder
112
+ readonly workingDirectory?: string
113
+ readonly accountId?: string
114
+ /** A checkpoint binding must never create a fresh ledger if its record is gone. */
115
+ readonly requireExisting?: boolean
116
+ }
117
+
118
+ /** Open the latest authority; a checkpoint only selects an existing account. */
119
+ export async function openTokenBudget(options: OpenTokenBudgetOptions): Promise<TokenBudget> {
120
+ const scope = validateScope(options.scope)
121
+ const pathBuilder =
122
+ options.pathBuilder ??
123
+ new DefaultPathBuilder(join(options.workingDirectory ?? process.cwd(), '.namzu'))
124
+ const store =
125
+ options.store ??
126
+ new DiskTokenBudgetStore({
127
+ baseDir: join(pathBuilder.sessionDir(scope.projectId, scope.sessionId), 'runs'),
128
+ })
129
+ const persistence = {
130
+ scope,
131
+ save: (snapshot: TokenBudgetSnapshot) => store.save(scope, snapshot),
132
+ }
133
+ const saved = await store.load(scope)
134
+ let budget: TokenBudget
135
+ if (saved === null) {
136
+ if (options.requireExisting || options.accountId !== undefined) {
137
+ throw new Error('The token budget ledger required by this run is missing')
138
+ }
139
+ if (options.limit === undefined)
140
+ throw new Error('A new token budget requires an explicit limit')
141
+ budget = TokenBudget.create(options.limit, scope.runId, persistence)
142
+ } else {
143
+ const snapshot = validateSnapshotScope(saved, scope)
144
+ if (options.limit !== undefined && rootLimit(snapshot) !== options.limit) {
145
+ throw new Error('Token budget root limit mismatch')
146
+ }
147
+ budget = TokenBudget.restore(snapshot, persistence)
148
+ }
149
+ const account = options.accountId === undefined ? budget : budget.account(options.accountId)
150
+ await budget.flush()
151
+ return account
152
+ }
153
+
154
+ function validateScope(scope: TokenBudgetScope): TokenBudgetScope {
155
+ return {
156
+ tenantId: asTenantId(scope.tenantId),
157
+ projectId: asProjectId(scope.projectId),
158
+ sessionId: asSessionId(scope.sessionId),
159
+ runId: asRunId(scope.runId),
160
+ }
161
+ }
162
+
163
+ function sameScope(left: TokenBudgetScope, right: TokenBudgetScope): boolean {
164
+ return (
165
+ left.tenantId === right.tenantId &&
166
+ left.projectId === right.projectId &&
167
+ left.sessionId === right.sessionId &&
168
+ left.runId === right.runId
169
+ )
170
+ }
171
+
172
+ function validateSnapshotScope(snapshot: unknown, scope: TokenBudgetScope): TokenBudgetSnapshot {
173
+ const checked = validateTokenBudgetSnapshot(snapshot)
174
+ if (checked.rootRunId !== scope.runId) throw new Error('Token budget root run mismatch')
175
+ return checked
176
+ }
177
+
178
+ function rootLimit(snapshot: TokenBudgetSnapshot): number {
179
+ const account = snapshot.accounts.find((account) => account.id === snapshot.rootAccountId)
180
+ if (!account) throw new Error('Token budget root account is missing')
181
+ return account.limit
182
+ }
183
+
184
+ function assertSameRoot(before: TokenBudgetSnapshot, after: TokenBudgetSnapshot): void {
185
+ if (before.rootAccountId !== after.rootAccountId) {
186
+ throw new Error('Cannot replace an existing token budget with a different root')
187
+ }
188
+ const reconciled = before.poisoned && !after.poisoned
189
+ if (reconciled && after.requests.length > 0) {
190
+ throw new Error('Cannot reopen a token budget with unresolved requests')
191
+ }
192
+ const accounts = new Map(after.accounts.map((account) => [account.id, account]))
193
+ for (const previous of before.accounts) {
194
+ const current = accounts.get(previous.id)
195
+ if (
196
+ !current ||
197
+ (previous.limit > 0 && (current.limit === 0 || current.limit > previous.limit)) ||
198
+ current.parentId !== previous.parentId ||
199
+ (previous.runId !== undefined && current.runId !== previous.runId) ||
200
+ (previous.settled && !current.settled)
201
+ ) {
202
+ throw new Error('Cannot replace or remove an existing token budget account')
203
+ }
204
+ for (const [runId, spent] of Object.entries(previous.usage)) {
205
+ const recorded = current.usage[runId]
206
+ if (!usageAtLeast(recorded, spent)) {
207
+ throw new Error('Cannot reduce recorded token budget usage')
208
+ }
209
+ }
210
+ }
211
+ const receipts = new Map(after.completedRequests.map((request) => [request.id, request]))
212
+ for (const previous of before.completedRequests) {
213
+ const current = receipts.get(previous.id)
214
+ if (
215
+ !current ||
216
+ current.accountId !== previous.accountId ||
217
+ current.runId !== previous.runId ||
218
+ !usageAtLeast(current.usage, previous.usage)
219
+ ) {
220
+ throw new Error('Cannot remove or replace a token budget completion receipt')
221
+ }
222
+ }
223
+ const active = new Map(after.requests.map((request) => [request.id, request]))
224
+ for (const previous of before.requests) {
225
+ const current = active.get(previous.id) ?? receipts.get(previous.id)
226
+ if (
227
+ !current ||
228
+ current.accountId !== previous.accountId ||
229
+ current.runId !== previous.runId ||
230
+ (reconciled && current.usage === undefined) ||
231
+ !usageAtLeast(current.usage, previous.usage)
232
+ ) {
233
+ throw new Error(
234
+ 'Cannot forget an unresolved token budget request without a completion receipt',
235
+ )
236
+ }
237
+ }
238
+ }
239
+
240
+ function usageAtLeast(current: TokenUsage | undefined, previous: TokenUsage | undefined): boolean {
241
+ if (previous === undefined) return true
242
+ if (current === undefined) return false
243
+ return Object.entries(previous).every(
244
+ ([field, amount]) =>
245
+ typeof amount !== 'number' || (current[field as keyof TokenUsage] ?? 0) >= amount,
246
+ )
247
+ }