@namzu/sdk 34.2.0 → 36.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +150 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +14 -14
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +15 -10
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +13 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +144 -55
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +42 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +153 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts +3 -3
  225. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  226. package/dist/runtime/query/iteration/index.js +47 -11
  227. package/dist/runtime/query/iteration/index.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  230. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  232. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  235. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  236. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  238. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  239. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +10 -5
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +20 -1
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/prompt.d.ts.map +1 -1
  248. package/dist/runtime/query/prompt.js +14 -4
  249. package/dist/runtime/query/prompt.js.map +1 -1
  250. package/dist/runtime/query/repeat-call.d.ts +20 -2
  251. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  252. package/dist/runtime/query/repeat-call.js +35 -7
  253. package/dist/runtime/query/repeat-call.js.map +1 -1
  254. package/dist/runtime/query/result.d.ts.map +1 -1
  255. package/dist/runtime/query/result.js +9 -0
  256. package/dist/runtime/query/result.js.map +1 -1
  257. package/dist/runtime/query/review-policy.d.ts +142 -0
  258. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  259. package/dist/runtime/query/review-policy.js +144 -0
  260. package/dist/runtime/query/review-policy.js.map +1 -0
  261. package/dist/runtime/query/run-state.d.ts.map +1 -1
  262. package/dist/runtime/query/run-state.js +4 -0
  263. package/dist/runtime/query/run-state.js.map +1 -1
  264. package/dist/runtime/query/steering.d.ts +4 -0
  265. package/dist/runtime/query/steering.d.ts.map +1 -1
  266. package/dist/runtime/query/steering.js +29 -0
  267. package/dist/runtime/query/steering.js.map +1 -1
  268. package/dist/runtime/query/token-budget.d.ts +7 -0
  269. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  270. package/dist/runtime/query/token-budget.js +101 -0
  271. package/dist/runtime/query/token-budget.js.map +1 -0
  272. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  273. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  274. package/dist/runtime/query/tool-output-budget.js +29 -11
  275. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  276. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  277. package/dist/runtime/query/tool-pause.js +4 -2
  278. package/dist/runtime/query/tool-pause.js.map +1 -1
  279. package/dist/runtime/query/tooling.d.ts +4 -0
  280. package/dist/runtime/query/tooling.d.ts.map +1 -1
  281. package/dist/runtime/query/tooling.js +4 -0
  282. package/dist/runtime/query/tooling.js.map +1 -1
  283. package/dist/sandbox/file-walk-program.d.ts +3 -0
  284. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  285. package/dist/sandbox/file-walk-program.js +94 -0
  286. package/dist/sandbox/file-walk-program.js.map +1 -0
  287. package/dist/sandbox/file-walk.d.ts +12 -0
  288. package/dist/sandbox/file-walk.d.ts.map +1 -0
  289. package/dist/sandbox/file-walk.js +429 -0
  290. package/dist/sandbox/file-walk.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +2 -0
  292. package/dist/sandbox/index.d.ts.map +1 -1
  293. package/dist/sandbox/index.js +1 -0
  294. package/dist/sandbox/index.js.map +1 -1
  295. package/dist/sandbox/provider/local.d.ts +3 -1
  296. package/dist/sandbox/provider/local.d.ts.map +1 -1
  297. package/dist/sandbox/provider/local.js +121 -12
  298. package/dist/sandbox/provider/local.js.map +1 -1
  299. package/dist/scheduler/completion-inbox.d.ts +3 -2
  300. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  301. package/dist/scheduler/completion-inbox.js +29 -15
  302. package/dist/scheduler/completion-inbox.js.map +1 -1
  303. package/dist/scheduler/delegating.d.ts +1 -0
  304. package/dist/scheduler/delegating.d.ts.map +1 -1
  305. package/dist/scheduler/delegating.js +29 -12
  306. package/dist/scheduler/delegating.js.map +1 -1
  307. package/dist/scheduler/local.d.ts +1 -0
  308. package/dist/scheduler/local.d.ts.map +1 -1
  309. package/dist/scheduler/local.js +4 -7
  310. package/dist/scheduler/local.js.map +1 -1
  311. package/dist/session/index.d.ts +0 -1
  312. package/dist/session/index.d.ts.map +1 -1
  313. package/dist/session/index.js +0 -1
  314. package/dist/session/index.js.map +1 -1
  315. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  316. package/dist/session/workspace/path-builder.js +5 -4
  317. package/dist/session/workspace/path-builder.js.map +1 -1
  318. package/dist/store/feedback/disk.d.ts.map +1 -1
  319. package/dist/store/feedback/disk.js +4 -6
  320. package/dist/store/feedback/disk.js.map +1 -1
  321. package/dist/store/index.d.ts +2 -0
  322. package/dist/store/index.d.ts.map +1 -1
  323. package/dist/store/index.js +1 -0
  324. package/dist/store/index.js.map +1 -1
  325. package/dist/store/memory/disk.d.ts.map +1 -1
  326. package/dist/store/memory/disk.js +3 -12
  327. package/dist/store/memory/disk.js.map +1 -1
  328. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  329. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  330. package/dist/store/run/checkpoint-disk.js +14 -26
  331. package/dist/store/run/checkpoint-disk.js.map +1 -1
  332. package/dist/store/run/claim-disk.js +1 -1
  333. package/dist/store/run/conformance.d.ts +1 -1
  334. package/dist/store/run/conformance.d.ts.map +1 -1
  335. package/dist/store/run/conformance.js +41 -33
  336. package/dist/store/run/conformance.js.map +1 -1
  337. package/dist/store/run/disk.d.ts.map +1 -1
  338. package/dist/store/run/disk.js +20 -4
  339. package/dist/store/run/disk.js.map +1 -1
  340. package/dist/store/run/token-budget-disk.d.ts +37 -0
  341. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  342. package/dist/store/run/token-budget-disk.js +208 -0
  343. package/dist/store/run/token-budget-disk.js.map +1 -0
  344. package/dist/store/session/disk.d.ts +4 -13
  345. package/dist/store/session/disk.d.ts.map +1 -1
  346. package/dist/store/session/disk.js +34 -31
  347. package/dist/store/session/disk.js.map +1 -1
  348. package/dist/store/session/memory.d.ts +2 -0
  349. package/dist/store/session/memory.d.ts.map +1 -1
  350. package/dist/store/session/memory.js +41 -2
  351. package/dist/store/session/memory.js.map +1 -1
  352. package/dist/store/task/disk.d.ts.map +1 -1
  353. package/dist/store/task/disk.js +7 -8
  354. package/dist/store/task/disk.js.map +1 -1
  355. package/dist/store/topic/memory.d.ts +2 -0
  356. package/dist/store/topic/memory.d.ts.map +1 -1
  357. package/dist/store/topic/memory.js +13 -1
  358. package/dist/store/topic/memory.js.map +1 -1
  359. package/dist/test-support/ids.d.ts +4 -19
  360. package/dist/test-support/ids.d.ts.map +1 -1
  361. package/dist/test-support/ids.js +51 -59
  362. package/dist/test-support/ids.js.map +1 -1
  363. package/dist/tools/advisory/index.d.ts.map +1 -1
  364. package/dist/tools/advisory/index.js +3 -1
  365. package/dist/tools/advisory/index.js.map +1 -1
  366. package/dist/tools/builtins/bash.d.ts +2 -0
  367. package/dist/tools/builtins/bash.d.ts.map +1 -1
  368. package/dist/tools/builtins/bash.js +224 -70
  369. package/dist/tools/builtins/bash.js.map +1 -1
  370. package/dist/tools/builtins/computer-use.d.ts +2 -2
  371. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  372. package/dist/tools/builtins/computer-use.js +4 -2
  373. package/dist/tools/builtins/computer-use.js.map +1 -1
  374. package/dist/tools/builtins/edit.js +2 -2
  375. package/dist/tools/builtins/edit.js.map +1 -1
  376. package/dist/tools/builtins/glob.d.ts +2 -1
  377. package/dist/tools/builtins/glob.d.ts.map +1 -1
  378. package/dist/tools/builtins/glob.js +95 -103
  379. package/dist/tools/builtins/glob.js.map +1 -1
  380. package/dist/tools/builtins/grep.d.ts.map +1 -1
  381. package/dist/tools/builtins/grep.js +155 -111
  382. package/dist/tools/builtins/grep.js.map +1 -1
  383. package/dist/tools/builtins/ls.js +4 -4
  384. package/dist/tools/builtins/ls.js.map +1 -1
  385. package/dist/tools/builtins/lsp.js +2 -2
  386. package/dist/tools/builtins/lsp.js.map +1 -1
  387. package/dist/tools/builtins/read-file.js +2 -2
  388. package/dist/tools/builtins/read-file.js.map +1 -1
  389. package/dist/tools/builtins/write-file.js +2 -2
  390. package/dist/tools/builtins/write-file.js.map +1 -1
  391. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  392. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  393. package/dist/tools/coordinator/ask-user-question.js +237 -0
  394. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  395. package/dist/tools/coordinator/index.d.ts +1 -2
  396. package/dist/tools/coordinator/index.d.ts.map +1 -1
  397. package/dist/tools/coordinator/index.js +4 -220
  398. package/dist/tools/coordinator/index.js.map +1 -1
  399. package/dist/tools/memory/read.d.ts.map +1 -1
  400. package/dist/tools/memory/read.js +2 -4
  401. package/dist/tools/memory/read.js.map +1 -1
  402. package/dist/tools/paths.d.ts +13 -0
  403. package/dist/tools/paths.d.ts.map +1 -1
  404. package/dist/tools/paths.js +53 -0
  405. package/dist/tools/paths.js.map +1 -1
  406. package/dist/tools/roster.d.ts +27 -0
  407. package/dist/tools/roster.d.ts.map +1 -0
  408. package/dist/tools/roster.js +42 -0
  409. package/dist/tools/roster.js.map +1 -0
  410. package/dist/types/agent/base.d.ts +5 -0
  411. package/dist/types/agent/base.d.ts.map +1 -1
  412. package/dist/types/agent/pipeline.d.ts +3 -0
  413. package/dist/types/agent/pipeline.d.ts.map +1 -1
  414. package/dist/types/agent/router.d.ts +2 -3
  415. package/dist/types/agent/router.d.ts.map +1 -1
  416. package/dist/types/agent/scheduler.d.ts +3 -0
  417. package/dist/types/agent/scheduler.d.ts.map +1 -1
  418. package/dist/types/agent/task.d.ts +5 -16
  419. package/dist/types/agent/task.d.ts.map +1 -1
  420. package/dist/types/agent/task.js.map +1 -1
  421. package/dist/types/common/index.d.ts.map +1 -1
  422. package/dist/types/common/index.js +3 -0
  423. package/dist/types/common/index.js.map +1 -1
  424. package/dist/types/computer-use/index.d.ts +8 -0
  425. package/dist/types/computer-use/index.d.ts.map +1 -1
  426. package/dist/types/computer-use/index.js.map +1 -1
  427. package/dist/types/hitl/index.d.ts +5 -0
  428. package/dist/types/hitl/index.d.ts.map +1 -1
  429. package/dist/types/hitl/index.js.map +1 -1
  430. package/dist/types/ids/brand.d.ts +5 -47
  431. package/dist/types/ids/brand.d.ts.map +1 -1
  432. package/dist/types/ids/brand.js +2 -39
  433. package/dist/types/ids/brand.js.map +1 -1
  434. package/dist/types/ids/index.d.ts +59 -69
  435. package/dist/types/ids/index.d.ts.map +1 -1
  436. package/dist/types/ids/index.js +12 -10
  437. package/dist/types/ids/index.js.map +1 -1
  438. package/dist/types/permission/index.d.ts +9 -0
  439. package/dist/types/permission/index.d.ts.map +1 -1
  440. package/dist/types/permission/index.js +9 -1
  441. package/dist/types/permission/index.js.map +1 -1
  442. package/dist/types/plugin/index.d.ts +45 -4
  443. package/dist/types/plugin/index.d.ts.map +1 -1
  444. package/dist/types/plugin/index.js +7 -0
  445. package/dist/types/plugin/index.js.map +1 -1
  446. package/dist/types/run/config.d.ts +3 -0
  447. package/dist/types/run/config.d.ts.map +1 -1
  448. package/dist/types/run/emergency.d.ts +5 -0
  449. package/dist/types/run/emergency.d.ts.map +1 -1
  450. package/dist/types/run/emergency.js.map +1 -1
  451. package/dist/types/run/entity.d.ts +6 -2
  452. package/dist/types/run/entity.d.ts.map +1 -1
  453. package/dist/types/run/events.d.ts +35 -0
  454. package/dist/types/run/events.d.ts.map +1 -1
  455. package/dist/types/run/events.js.map +1 -1
  456. package/dist/types/run/index.d.ts +1 -0
  457. package/dist/types/run/index.d.ts.map +1 -1
  458. package/dist/types/run/index.js +1 -0
  459. package/dist/types/run/index.js.map +1 -1
  460. package/dist/types/run/state.d.ts +16 -15
  461. package/dist/types/run/state.d.ts.map +1 -1
  462. package/dist/types/run/state.js +41 -22
  463. package/dist/types/run/state.js.map +1 -1
  464. package/dist/types/run/stop-reason.d.ts +3 -14
  465. package/dist/types/run/stop-reason.d.ts.map +1 -1
  466. package/dist/types/run/token-budget-store.d.ts +29 -0
  467. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  468. package/dist/types/run/token-budget-store.js +25 -0
  469. package/dist/types/run/token-budget-store.js.map +1 -0
  470. package/dist/types/sandbox/index.d.ts +47 -2
  471. package/dist/types/sandbox/index.d.ts.map +1 -1
  472. package/dist/types/sandbox/index.js.map +1 -1
  473. package/dist/types/session/store.d.ts +8 -0
  474. package/dist/types/session/store.d.ts.map +1 -1
  475. package/dist/types/tool/index.d.ts +15 -0
  476. package/dist/types/tool/index.d.ts.map +1 -1
  477. package/dist/types/tool/index.js.map +1 -1
  478. package/dist/utils/frontmatter.d.ts +1 -1
  479. package/dist/utils/frontmatter.js +1 -1
  480. package/dist/utils/id-format.d.ts +3 -0
  481. package/dist/utils/id-format.d.ts.map +1 -0
  482. package/dist/utils/id-format.js +9 -0
  483. package/dist/utils/id-format.js.map +1 -0
  484. package/dist/utils/id.d.ts +65 -32
  485. package/dist/utils/id.d.ts.map +1 -1
  486. package/dist/utils/id.js +168 -148
  487. package/dist/utils/id.js.map +1 -1
  488. package/dist/utils/log/exception.js +1 -1
  489. package/dist/utils/log/exception.js.map +1 -1
  490. package/dist/utils/log/index.d.ts.map +1 -1
  491. package/dist/utils/log/index.js +1 -2
  492. package/dist/utils/log/index.js.map +1 -1
  493. package/dist/utils/log/templates.d.ts.map +1 -1
  494. package/dist/utils/log/templates.js +0 -1
  495. package/dist/utils/log/templates.js.map +1 -1
  496. package/package.json +6 -1
  497. package/src/agents/AGENTS.md +1 -1
  498. package/src/agents/PipelineAgent.ts +129 -109
  499. package/src/agents/ReactiveAgent.ts +2 -0
  500. package/src/agents/RouterAgent.ts +120 -73
  501. package/src/agents/SupervisorAgent.ts +12 -4
  502. package/src/agents/budget.ts +42 -0
  503. package/src/agents/explore.ts +29 -0
  504. package/src/agents/file-definitions.ts +237 -0
  505. package/src/agents/index.ts +15 -0
  506. package/src/bridge/a2a/mapper.ts +6 -0
  507. package/src/bridge/sse/mapper.ts +22 -0
  508. package/src/bus/lock.ts +1 -10
  509. package/src/compaction/consolidation.ts +79 -0
  510. package/src/compaction/factory.ts +3 -0
  511. package/src/compaction/index.ts +34 -4
  512. package/src/compaction/manager.ts +39 -1
  513. package/src/compaction/plan.ts +52 -21
  514. package/src/compaction/salience/bm25.ts +72 -0
  515. package/src/compaction/salience/goal.ts +44 -0
  516. package/src/compaction/salience/index.ts +19 -0
  517. package/src/compaction/salience/minhash.ts +53 -0
  518. package/src/compaction/salience/score.ts +305 -0
  519. package/src/compaction/salience/tokenize.ts +89 -0
  520. package/src/compaction/salience/working-set.ts +187 -0
  521. package/src/compaction/serializer.ts +16 -0
  522. package/src/compaction/token-estimate.ts +57 -0
  523. package/src/compaction/tool-result-editing.ts +28 -26
  524. package/src/compaction/types.ts +24 -1
  525. package/src/compaction/wire.ts +5 -1
  526. package/src/config/runtime.ts +13 -1
  527. package/src/connector/builtins/http.ts +2 -8
  528. package/src/connector/builtins/webhook.ts +2 -2
  529. package/src/connector/mcp/adapter.ts +32 -0
  530. package/src/connector/tools/adapter.ts +2 -2
  531. package/src/connector/tools/definitions.ts +2 -2
  532. package/src/constants/compaction/index.ts +1 -0
  533. package/src/constants/telemetry/index.ts +0 -1
  534. package/src/contracts/api.ts +5 -1
  535. package/src/contracts/schemas.ts +6 -20
  536. package/src/invariants/index.ts +1 -1
  537. package/src/manager/agent/lifecycle.ts +380 -352
  538. package/src/manager/run/persistence.ts +35 -5
  539. package/src/plugin/index.ts +19 -0
  540. package/src/plugin/shell-hook.ts +403 -0
  541. package/src/prompt/coding-agent-doctrine.ts +118 -0
  542. package/src/prompt/index.ts +8 -0
  543. package/src/provider/errors.ts +1 -1
  544. package/src/provider/fallback.ts +4 -1
  545. package/src/provider/retry.ts +4 -1
  546. package/src/provider/token-budget.ts +158 -0
  547. package/src/public-runtime.ts +56 -28
  548. package/src/public-tools.ts +5 -0
  549. package/src/public-types.ts +65 -0
  550. package/src/registry/command/kernel-commands.ts +16 -6
  551. package/src/registry/tool/execute.ts +4 -1
  552. package/src/run/LimitChecker.ts +1 -1
  553. package/src/run/drain.ts +1 -1
  554. package/src/run/reporter.ts +15 -0
  555. package/src/run/token-budget.ts +692 -0
  556. package/src/runtime/jobs/registry.ts +123 -17
  557. package/src/runtime/query/checkpoint.ts +10 -3
  558. package/src/runtime/query/context.ts +3 -57
  559. package/src/runtime/query/executor.ts +181 -71
  560. package/src/runtime/query/guard.ts +8 -0
  561. package/src/runtime/query/index.ts +209 -62
  562. package/src/runtime/query/iteration/index.ts +53 -15
  563. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  564. package/src/runtime/query/iteration/phases/context.ts +4 -0
  565. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  566. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  567. package/src/runtime/query/iteration/stream-turn.ts +9 -5
  568. package/src/runtime/query/plugin-hooks.ts +24 -2
  569. package/src/runtime/query/prompt.ts +21 -4
  570. package/src/runtime/query/repeat-call.ts +42 -7
  571. package/src/runtime/query/result.ts +9 -0
  572. package/src/runtime/query/review-policy.ts +231 -0
  573. package/src/runtime/query/run-state.ts +4 -0
  574. package/src/runtime/query/steering.ts +32 -0
  575. package/src/runtime/query/token-budget.ts +127 -0
  576. package/src/runtime/query/tool-output-budget.ts +33 -10
  577. package/src/runtime/query/tool-pause.ts +4 -2
  578. package/src/runtime/query/tooling.ts +8 -0
  579. package/src/sandbox/file-walk-program.ts +93 -0
  580. package/src/sandbox/file-walk.ts +463 -0
  581. package/src/sandbox/index.ts +2 -0
  582. package/src/sandbox/provider/local.ts +136 -13
  583. package/src/scheduler/completion-inbox.ts +29 -19
  584. package/src/scheduler/delegating.ts +35 -13
  585. package/src/scheduler/local.ts +5 -7
  586. package/src/session/index.ts +0 -1
  587. package/src/session/workspace/path-builder.ts +5 -4
  588. package/src/store/feedback/disk.ts +4 -6
  589. package/src/store/index.ts +2 -0
  590. package/src/store/memory/disk.ts +3 -11
  591. package/src/store/run/checkpoint-disk.ts +14 -27
  592. package/src/store/run/claim-disk.ts +1 -1
  593. package/src/store/run/conformance.ts +55 -39
  594. package/src/store/run/disk.ts +19 -4
  595. package/src/store/run/token-budget-disk.ts +247 -0
  596. package/src/store/session/disk.ts +36 -29
  597. package/src/store/session/memory.ts +38 -1
  598. package/src/store/task/disk.ts +7 -8
  599. package/src/store/topic/memory.ts +13 -1
  600. package/src/test-support/ids.ts +62 -59
  601. package/src/tools/advisory/index.ts +3 -1
  602. package/src/tools/builtins/bash.ts +241 -70
  603. package/src/tools/builtins/computer-use.ts +6 -2
  604. package/src/tools/builtins/edit.ts +2 -2
  605. package/src/tools/builtins/glob.ts +104 -122
  606. package/src/tools/builtins/grep.ts +166 -132
  607. package/src/tools/builtins/ls.ts +4 -4
  608. package/src/tools/builtins/lsp.ts +2 -2
  609. package/src/tools/builtins/read-file.ts +2 -2
  610. package/src/tools/builtins/write-file.ts +2 -2
  611. package/src/tools/coordinator/ask-user-question.ts +284 -0
  612. package/src/tools/coordinator/index.ts +5 -248
  613. package/src/tools/memory/read.ts +2 -4
  614. package/src/tools/paths.ts +64 -0
  615. package/src/tools/roster.ts +46 -0
  616. package/src/types/agent/base.ts +6 -0
  617. package/src/types/agent/pipeline.ts +3 -0
  618. package/src/types/agent/router.ts +2 -3
  619. package/src/types/agent/scheduler.ts +4 -0
  620. package/src/types/agent/task.ts +5 -18
  621. package/src/types/common/index.ts +3 -0
  622. package/src/types/computer-use/index.ts +8 -0
  623. package/src/types/hitl/index.ts +5 -0
  624. package/src/types/ids/brand.ts +5 -48
  625. package/src/types/ids/index.ts +66 -75
  626. package/src/types/permission/index.ts +11 -0
  627. package/src/types/plugin/index.ts +49 -1
  628. package/src/types/run/config.ts +3 -0
  629. package/src/types/run/emergency.ts +5 -0
  630. package/src/types/run/entity.ts +6 -2
  631. package/src/types/run/events.ts +37 -0
  632. package/src/types/run/index.ts +1 -0
  633. package/src/types/run/state.ts +58 -30
  634. package/src/types/run/stop-reason.ts +3 -14
  635. package/src/types/run/token-budget-store.ts +54 -0
  636. package/src/types/sandbox/index.ts +53 -0
  637. package/src/types/session/store.ts +8 -0
  638. package/src/types/tool/index.ts +15 -0
  639. package/src/utils/frontmatter.ts +1 -1
  640. package/src/utils/id-format.ts +9 -0
  641. package/src/utils/id.ts +222 -181
  642. package/src/utils/log/exception.ts +1 -1
  643. package/src/utils/log/index.ts +1 -2
  644. package/src/utils/log/templates.ts +0 -1
  645. package/dist/session/migration/errors.d.ts +0 -26
  646. package/dist/session/migration/errors.d.ts.map +0 -1
  647. package/dist/session/migration/errors.js +0 -22
  648. package/dist/session/migration/errors.js.map +0 -1
  649. package/dist/session/migration/filesystem.d.ts +0 -122
  650. package/dist/session/migration/filesystem.d.ts.map +0 -1
  651. package/dist/session/migration/filesystem.js +0 -379
  652. package/dist/session/migration/filesystem.js.map +0 -1
  653. package/dist/session/migration/id-prefix.d.ts +0 -113
  654. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  655. package/dist/session/migration/id-prefix.js +0 -132
  656. package/dist/session/migration/id-prefix.js.map +0 -1
  657. package/dist/session/migration/index.d.ts +0 -12
  658. package/dist/session/migration/index.d.ts.map +0 -1
  659. package/dist/session/migration/index.js +0 -12
  660. package/dist/session/migration/index.js.map +0 -1
  661. package/dist/session/migration/marker.d.ts +0 -57
  662. package/dist/session/migration/marker.d.ts.map +0 -1
  663. package/dist/session/migration/marker.js +0 -123
  664. package/dist/session/migration/marker.js.map +0 -1
  665. package/src/session/migration/errors.ts +0 -23
  666. package/src/session/migration/filesystem.ts +0 -468
  667. package/src/session/migration/id-prefix.ts +0 -166
  668. package/src/session/migration/index.ts +0 -41
  669. package/src/session/migration/marker.ts +0 -142
@@ -1,468 +0,0 @@
1
- /**
2
- * Boot-time filesystem re-layout — `.namzu/threads/{thd_X}/` →
3
- * `.namzu/projects/{prj_legacy_<X>}/sessions/ses_legacy_default/runs/...`.
4
- *
5
- * The `thd_X` this module reads off the filesystem is D2 meaning (a), the
6
- * pre-0.2.0 top-level container — unrelated to and untouched by
7
- * NZ-TOPIC-04's narrowing of the live Topic layer's id to `top_*`. As of
8
- * that task `thd_*` means only what this module has always used it to
9
- * mean; see `session/migration/id-prefix.ts` for the disambiguation.
10
- *
11
- * Trigger: first {@link RunContextFactory.build} call per process. The
12
- * factory invokes {@link DefaultFilesystemMigrator.migrate} before resolving
13
- * any path so legacy runs are never orphaned by the new layout.
14
- *
15
- * See session-hierarchy.md §13.4.1 for the detection / trigger / atomicity
16
- * contract. Concurrency model:
17
- *
18
- * 1. Main marker present → short-circuit `already_migrated`. Idempotent.
19
- * 2. Legacy `.namzu/threads/` absent → write the main marker and return
20
- * `noop_no_legacy`. This plants the marker on fresh installs so the
21
- * `threads/` detection branch is only ever entered once.
22
- * 3. Legacy layout detected → acquire the `.tmp` lock via `wx`; on
23
- * EEXIST another boot is mid-migration. The loser waits 100ms and
24
- * re-checks the main marker — cooperating, not competing. Roadmap
25
- * Risk #4 mitigation.
26
- * 4. Per-legacy-thread: rename the whole `runs/` subtree in a single
27
- * `fs.rename` call (cross-OS atomic on the same filesystem; different
28
- * filesystems fall back to copy-then-unlink via Node's default — a
29
- * known limitation documented below).
30
- * 5. Synthesize `project.json` + `session.json` via write-tmp-rename
31
- * (Convention #8) so partial crashes leave no half-serialised state.
32
- * 6. Write main marker last — presence of the marker is the canonical
33
- * "migration done" signal.
34
- *
35
- * Known limitations:
36
- * - Cross-filesystem moves: Node's `fs.rename` rejects with `EXDEV` when
37
- * source and target live on different filesystems. This migrator does
38
- * NOT fall back to copy-then-unlink; the error surfaces as
39
- * {@link FilesystemMigrationError} with op `'rename_runs'`. Consumers
40
- * running `.namzu/threads` and `.namzu/projects` on different mounts
41
- * must migrate manually (documented INTERP flag).
42
- * - `UNKNOWN_TENANT_ID`: legacy threads have no tenant denormalisation on
43
- * disk. The synthesised project.json carries the sentinel so consumers
44
- * know these are legacy-rehomed and can either tag-then-retain or
45
- * reject until a real tenant is assigned (policy is consumer-owned).
46
- */
47
-
48
- import { mkdir, readdir, rename, stat } from 'node:fs/promises'
49
- import { join } from 'node:path'
50
- import { BOOT_EVENT_NAMES } from '../../constants/telemetry/index.js'
51
- import type { TenantId } from '../../types/ids/index.js'
52
- import { UNKNOWN_TENANT_ID } from '../../types/ids/index.js'
53
- import type { ProjectId, SessionId } from '../../types/session/ids.js'
54
- import { atomicWriteFile } from '../../utils/atomic-write.js'
55
- import { asProjectId, asSessionId } from '../../utils/id.js'
56
- import { EVENT_NAME_ATTRIBUTE } from '../../utils/log/types.js'
57
- import type { Logger } from '../../utils/logger.js'
58
- import { FilesystemMigrationError } from './errors.js'
59
- import { acquireMigrationLock, readMarker, releaseMigrationLock, writeMarker } from './marker.js'
60
-
61
- /**
62
- * Sentinel SessionId used for legacy pre-0.2.0 runs that pre-date the
63
- * Session entity. Every migrated thread collapses into this single session
64
- * so consumers can still address the runs through the new layout.
65
- */
66
- export const LEGACY_DEFAULT_SESSION_ID = asSessionId('ses_legacy_default')
67
-
68
- /** Prefix for projects synthesised from legacy `thd_*` folders. */
69
- export const LEGACY_DEFAULT_PROJECT_PREFIX = 'prj_legacy_'
70
-
71
- /** Marker version string persisted at `.migration/v0.2.0`. */
72
- export const MIGRATION_VERSION = '0.2.0'
73
-
74
- /** Marker file path relative to rootDir. */
75
- export const MARKER_REL_PATH = join('.migration', 'v0.2.0')
76
-
77
- /** In-flight lock file path relative to rootDir. */
78
- export const LOCK_REL_PATH = join('.migration', 'v0.2.0.tmp')
79
-
80
- /** Delay before the loser re-checks the main marker on lock contention. */
81
- const LOCK_WAIT_MS = 100
82
-
83
- /**
84
- * Result of a migration attempt. `kind` discriminates the three outcomes;
85
- * `migratedThreads` is only non-empty for `kind: 'migrated'`. Sinks and
86
- * callers can switch on `kind` without string parsing.
87
- */
88
- export interface FilesystemMigrationResult {
89
- kind: 'migrated' | 'already_migrated' | 'noop_no_legacy'
90
- migratedThreads: readonly { legacyThreadId: string; newProjectId: ProjectId }[]
91
- markerPath: string
92
- at: Date
93
- }
94
-
95
- /** Event emitted on successful migration (`kind === 'migrated'` only). */
96
- export interface FilesystemMigrationEvent {
97
- type: 'filesystem.migrated'
98
- result: FilesystemMigrationResult
99
- }
100
-
101
- /** Sink contract — one `emit` method. */
102
- export interface FilesystemMigrationSink {
103
- emit(event: FilesystemMigrationEvent): void
104
- }
105
-
106
- export const NOOP_FILESYSTEM_MIGRATION_SINK: FilesystemMigrationSink = {
107
- emit() {},
108
- }
109
-
110
- /**
111
- * Wires the migration facts `DefaultFilesystemMigrator` already computes —
112
- * `kind`, `migratedThreads`, `markerPath`, `at` — to a `Logger`, instead of
113
- * the sink they are thrown at on every real boot today
114
- * (`NOOP_FILESYSTEM_MIGRATION_SINK`, still `ensureMigrated`'s default — see
115
- * `runtime/query/context.ts`). A caller opts into this by constructing its
116
- * own `DefaultFilesystemMigrator(loggingMigrationSink(log))` and passing it
117
- * to `ensureMigrated`, the way `runtime/query/index.ts` does; nothing here
118
- * changes what the default migrator does.
119
- *
120
- * `FilesystemMigrationSink.emit` is only ever called with
121
- * `type: 'filesystem.migrated'` (Step 6 in the module doc above) —
122
- * `already_migrated` and `noop_no_legacy` never reach a sink at all, by the
123
- * shape of `FilesystemMigrationEvent`. A caller that wants those two logged
124
- * as well reads them straight off `ensureMigrated`'s resolved
125
- * `FilesystemMigrationResult`, the way `runtime/query/index.ts` does,
126
- * rather than this function growing a case the type it wraps cannot
127
- * produce — widening `FilesystemMigrationEvent` to carry them would be a
128
- * breaking change to every exhaustive switch already written over it.
129
- */
130
- export function loggingMigrationSink(log: Logger): FilesystemMigrationSink {
131
- return {
132
- emit(event) {
133
- const { result } = event
134
- log.info('filesystem migration completed', {
135
- [EVENT_NAME_ATTRIBUTE]: BOOT_EVENT_NAMES.MIGRATION_COMPLETED,
136
- 'namzu.migration.kind': result.kind,
137
- 'namzu.migration.marker_path': result.markerPath,
138
- 'namzu.migration.migrated_thread_count': result.migratedThreads.length,
139
- })
140
- },
141
- }
142
- }
143
-
144
- /** Interface so consumers can inject a stub migrator in tests. */
145
- export interface FilesystemMigrator {
146
- migrate(rootDir: string): Promise<FilesystemMigrationResult>
147
- }
148
-
149
- /**
150
- * Persisted synthetic `project.json` shape. Matches
151
- * `store/session/disk.ts:PersistedProject` plus a `_legacy: true` flag so
152
- * readers can distinguish auto-synthesised records from real ones.
153
- */
154
- interface SyntheticProject {
155
- id: ProjectId
156
- tenantId: TenantId
157
- name: string
158
- config: {
159
- maxDelegationDepth: number
160
- maxDelegationWidth: number
161
- maxInterventionDepth: number
162
- }
163
- createdAt: string
164
- updatedAt: string
165
- _legacy: true
166
- }
167
-
168
- /**
169
- * Persisted synthetic `session.json` shape. Matches
170
- * `store/session/disk.ts:PersistedSession` minimally. Status is `idle` so
171
- * any read path that drills into these sessions does not mistake them for
172
- * active work. `_legacy: true` flags them as auto-synthesised.
173
- */
174
- interface SyntheticSession {
175
- id: SessionId
176
- projectId: ProjectId
177
- tenantId: TenantId
178
- status: 'idle'
179
- currentActor: null
180
- previousActors: readonly []
181
- workspaceId: null
182
- ownerVersion: 0
183
- createdAt: string
184
- updatedAt: string
185
- _legacy: true
186
- }
187
-
188
- /**
189
- * Default implementation. Migration is driven by the contract documented in
190
- * the module header — readers should trace concerns to this comment rather
191
- * than re-deriving from code.
192
- */
193
- export class DefaultFilesystemMigrator implements FilesystemMigrator {
194
- constructor(private readonly sink: FilesystemMigrationSink = NOOP_FILESYSTEM_MIGRATION_SINK) {}
195
-
196
- async migrate(rootDir: string): Promise<FilesystemMigrationResult> {
197
- const markerPath = join(rootDir, MARKER_REL_PATH)
198
- const lockPath = join(rootDir, LOCK_REL_PATH)
199
- const threadsDir = join(rootDir, 'threads')
200
- const projectsDir = join(rootDir, 'projects')
201
-
202
- // Step 1: completed-marker short-circuit (cheapest idempotency check).
203
- const existing = await readMarker(markerPath)
204
- if (existing) {
205
- return {
206
- kind: 'already_migrated',
207
- migratedThreads: [],
208
- markerPath,
209
- at: existing.at,
210
- }
211
- }
212
-
213
- // Step 2: legacy absent → no-op. Plant the marker so subsequent boots
214
- // do not re-enter this branch. Fresh installs fall through here.
215
- const threadsExists = await directoryExists(threadsDir)
216
- if (!threadsExists) {
217
- const at = new Date()
218
- try {
219
- await writeMarker(markerPath, {
220
- version: MIGRATION_VERSION,
221
- at,
222
- migratedThreads: [],
223
- })
224
- } catch (cause) {
225
- throw new FilesystemMigrationError({
226
- op: 'write_marker',
227
- path: markerPath,
228
- cause,
229
- })
230
- }
231
- return {
232
- kind: 'noop_no_legacy',
233
- migratedThreads: [],
234
- markerPath,
235
- at,
236
- }
237
- }
238
-
239
- // Step 3: cooperate on the tmp lock.
240
- try {
241
- await acquireMigrationLock(lockPath)
242
- } catch (err) {
243
- const code = (err as NodeJS.ErrnoException).code
244
- if (code === 'EEXIST') {
245
- // Another boot is mid-migration — wait and re-read the main marker.
246
- await sleep(LOCK_WAIT_MS)
247
- const follow = await readMarker(markerPath)
248
- if (follow) {
249
- return {
250
- kind: 'already_migrated',
251
- migratedThreads: [],
252
- markerPath,
253
- at: follow.at,
254
- }
255
- }
256
- // Main marker still absent — the winning boot is still going OR
257
- // crashed. We re-throw so the caller sees a contention surface
258
- // rather than silently assuming success.
259
- throw new FilesystemMigrationError({
260
- op: 'acquire_lock',
261
- path: lockPath,
262
- cause: err,
263
- })
264
- }
265
- throw new FilesystemMigrationError({
266
- op: 'acquire_lock',
267
- path: lockPath,
268
- cause: err,
269
- })
270
- }
271
-
272
- try {
273
- // Step 4a: enumerate legacy thread dirs.
274
- let entries: string[]
275
- try {
276
- entries = await readdir(threadsDir)
277
- } catch (cause) {
278
- throw new FilesystemMigrationError({
279
- op: 'enumerate_threads',
280
- path: threadsDir,
281
- cause,
282
- })
283
- }
284
-
285
- const migrated: { legacyThreadId: string; newProjectId: ProjectId }[] = []
286
- const now = new Date()
287
-
288
- for (const entry of entries) {
289
- // Accept only `thd_*` (and tolerate `prj_*` legacy in case of
290
- // rerun after a partial-crash-with-renamed-but-no-marker).
291
- if (!entry.startsWith('thd_')) continue
292
-
293
- const legacyThreadId = entry
294
- const suffix = legacyThreadId.slice('thd_'.length)
295
-
296
- // The suffix comes off the filesystem, and `startsWith('thd_')`
297
- // is the only thing it has passed. A folder named `thd_Not An
298
- // Id` mints `prj_legacy_Not An Id`: structurally a `ProjectId`,
299
- // accepted by no validator, and now a directory name in the new
300
- // layout. The migration is the one place a project id is built
301
- // from data rather than generated, so it is the one place the
302
- // id contract has to be checked.
303
- //
304
- // (Not a containment check — it cannot be one. `readdir` yields
305
- // path components, which hold no separator, and `..` is never
306
- // among them; `prj_legacy_..` is a literal name, not a parent
307
- // reference. Nothing here can leave the root.)
308
- //
309
- // It refuses rather than skipping. A skipped folder is a legacy
310
- // thread whose runs are still on disk and no longer addressable,
311
- // with nothing in the result saying so — and the marker would be
312
- // written as if the migration were complete.
313
- if (!/^[a-z0-9]+$/.test(suffix)) {
314
- throw new FilesystemMigrationError({
315
- op: 'validate_thread_id',
316
- path: join(threadsDir, legacyThreadId),
317
- cause: new Error(
318
- `Legacy thread folder '${legacyThreadId}' is not a thread id: expected 'thd_' followed by lowercase alphanumerics. It is refused rather than migrated because the name is used as a directory name.`,
319
- ),
320
- })
321
- }
322
-
323
- const newProjectId = asProjectId(`${LEGACY_DEFAULT_PROJECT_PREFIX}${suffix}`)
324
-
325
- const legacyRunsDir = join(threadsDir, legacyThreadId, 'runs')
326
- const newProjectDir = join(projectsDir, newProjectId)
327
- const newSessionDir = join(newProjectDir, 'sessions', LEGACY_DEFAULT_SESSION_ID)
328
- const newRunsDir = join(newSessionDir, 'runs')
329
-
330
- // Ensure parent path exists for the atomic rename of `runs/`.
331
- try {
332
- await mkdir(newSessionDir, { recursive: true })
333
- } catch (cause) {
334
- throw new FilesystemMigrationError({
335
- op: 'mkdir_session',
336
- path: newSessionDir,
337
- cause,
338
- })
339
- }
340
-
341
- // Move the whole `runs/` subtree in a single rename — atomic on
342
- // same-filesystem, EXDEV on cross-mount (documented limitation).
343
- const legacyRunsExists = await directoryExists(legacyRunsDir)
344
- if (legacyRunsExists) {
345
- try {
346
- await rename(legacyRunsDir, newRunsDir)
347
- } catch (cause) {
348
- throw new FilesystemMigrationError({
349
- op: 'rename_runs',
350
- path: legacyRunsDir,
351
- cause,
352
- })
353
- }
354
- }
355
-
356
- // Step 4b: synthesize project.json via write-tmp-rename.
357
- const projectJson: SyntheticProject = {
358
- id: newProjectId,
359
- tenantId: UNKNOWN_TENANT_ID,
360
- name: `legacy ${legacyThreadId}`,
361
- config: {
362
- maxDelegationDepth: 4,
363
- maxDelegationWidth: 8,
364
- maxInterventionDepth: 10,
365
- },
366
- createdAt: now.toISOString(),
367
- updatedAt: now.toISOString(),
368
- _legacy: true,
369
- }
370
- const projectJsonPath = join(newProjectDir, 'project.json')
371
- try {
372
- await atomicWriteJson(projectJsonPath, projectJson)
373
- } catch (cause) {
374
- throw new FilesystemMigrationError({
375
- op: 'write_project_json',
376
- path: projectJsonPath,
377
- cause,
378
- })
379
- }
380
-
381
- // Step 4c: synthesize session.json for the legacy-default session.
382
- const sessionJson: SyntheticSession = {
383
- id: LEGACY_DEFAULT_SESSION_ID,
384
- projectId: newProjectId,
385
- tenantId: UNKNOWN_TENANT_ID,
386
- status: 'idle',
387
- currentActor: null,
388
- previousActors: [],
389
- workspaceId: null,
390
- ownerVersion: 0,
391
- createdAt: now.toISOString(),
392
- updatedAt: now.toISOString(),
393
- _legacy: true,
394
- }
395
- const sessionJsonPath = join(newSessionDir, 'session.json')
396
- try {
397
- await atomicWriteJson(sessionJsonPath, sessionJson)
398
- } catch (cause) {
399
- throw new FilesystemMigrationError({
400
- op: 'write_session_json',
401
- path: sessionJsonPath,
402
- cause,
403
- })
404
- }
405
-
406
- migrated.push({ legacyThreadId, newProjectId })
407
- }
408
-
409
- // Step 5: write the completion marker last. Presence = done.
410
- try {
411
- await writeMarker(markerPath, {
412
- version: MIGRATION_VERSION,
413
- at: now,
414
- migratedThreads: migrated,
415
- })
416
- } catch (cause) {
417
- throw new FilesystemMigrationError({
418
- op: 'write_marker',
419
- path: markerPath,
420
- cause,
421
- })
422
- }
423
-
424
- const result: FilesystemMigrationResult = {
425
- kind: 'migrated',
426
- migratedThreads: migrated,
427
- markerPath,
428
- at: now,
429
- }
430
-
431
- // Step 6: emit event.
432
- this.sink.emit({ type: 'filesystem.migrated', result })
433
-
434
- return result
435
- } finally {
436
- // Always release the lock — even on failure, a crashed run with the
437
- // main marker absent will retry on the next boot; the stale `.tmp`
438
- // would otherwise wedge that retry.
439
- await releaseMigrationLock(lockPath).catch(() => undefined)
440
- }
441
- }
442
- }
443
-
444
- /**
445
- * The duplication this replaced existed to keep `session/migration/` free
446
- * of an inbound dependency on the store layer, which was the right
447
- * instinct — and it also meant this copy kept the fixed sidecar name after
448
- * the stores were fixed. Living in `utils/` satisfies both: everything may
449
- * depend on it, so there is nothing left to duplicate.
450
- */
451
- async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
452
- await atomicWriteFile(filePath, JSON.stringify(value, null, 2))
453
- }
454
-
455
- async function directoryExists(path: string): Promise<boolean> {
456
- try {
457
- const s = await stat(path)
458
- return s.isDirectory()
459
- } catch (err) {
460
- const code = (err as NodeJS.ErrnoException).code
461
- if (code === 'ENOENT') return false
462
- throw err
463
- }
464
- }
465
-
466
- function sleep(ms: number): Promise<void> {
467
- return new Promise((resolve) => setTimeout(resolve, ms))
468
- }
@@ -1,166 +0,0 @@
1
- /**
2
- * ID-prefix migration window — read-side compat for the pre-0.2.0 top-level
3
- * `thd_*` container id (D2 meaning (a), ses_020). NZ-TOPIC-04 narrowed the
4
- * Topic layer's own id (D2 meaning (b)) to `top_*`, so as of this release
5
- * `thd_*` means ONLY the legacy container everywhere in this codebase — see
6
- * `types/ids/index.ts` for where the two meanings used to collide.
7
- *
8
- * Consumers that touch raw legacy container IDs (the filesystem migrator,
9
- * wire decoders, CLI imports) route through {@link acceptLegacyContainerId}
10
- * so the warning signal is structured rather than ad-hoc console output
11
- * (Convention #18).
12
- *
13
- * | Window state | Reader accepts | Writer emits | Legacy read behaviour |
14
- * |--------------|---------------------|--------------|-------------------------------|
15
- * | OPEN (now) | `thd_*` AND `prj_*` | `prj_*` only | emits `MigrationWarning` once |
16
- * | CLOSED | `prj_*` only | `prj_*` only | rejects `StalePrefixError` |
17
- *
18
- * The {@link WINDOW_OPEN} constant is the module-level default for
19
- * {@link acceptLegacyContainerId}'s `windowOpen` parameter — the single
20
- * knob that flips this module from soft-accept to hard-reject in
21
- * production. The writer guard {@link rejectLegacyContainerPrefix} has no
22
- * such fork: a writer must never emit `thd_*` in EITHER window state (see
23
- * the table's Writer column, unchanged across both rows), so it takes no
24
- * `windowOpen` parameter at all — one would be unused, which is its own
25
- * failure mode (a-check-that-cannot-fail, applied to an argument no less
26
- * than to a branch). Convention #0: no silent long-lived compat — the
27
- * window is explicit and fails closed when closed.
28
- */
29
-
30
- import type { ProjectId } from '../../types/session/ids.js'
31
- import { asProjectId } from '../../utils/id.js'
32
-
33
- /**
34
- * Structured event emitted when the reader accepts a legacy `thd_*` ID.
35
- *
36
- * Shape is stable across the 0.2.x window — platform consumers can wire
37
- * this into their observability pipeline (metrics, audit log) without
38
- * string parsing (Convention #18).
39
- */
40
- export interface MigrationWarning {
41
- kind: 'id_prefix_legacy_read'
42
- legacyId: string
43
- normalizedId: ProjectId
44
- at: Date
45
- emittedOncePerProcess: true
46
- }
47
-
48
- /** Sink contract — one `emit` method so callers can swap implementations. */
49
- export interface MigrationWarningSink {
50
- emit(warning: MigrationWarning): void
51
- }
52
-
53
- /**
54
- * Default sink used when consumers do not inject one. Drops warnings on the
55
- * floor — migration still runs; observers just lose the signal. Convention
56
- * #5 deny-by-default applies to behaviour, not telemetry; missing a warning
57
- * sink is not a failure mode.
58
- */
59
- export const NOOP_MIGRATION_WARNING_SINK: MigrationWarningSink = {
60
- emit() {},
61
- }
62
-
63
- /**
64
- * Raised when the reader encounters a string that is neither a valid
65
- * `prj_*` nor `thd_*` prefix. In the 0.3.x window the legacy branch will
66
- * also throw this error — flip {@link WINDOW_OPEN} to `false` to cut over.
67
- */
68
- export class StalePrefixError extends Error {
69
- readonly details: { rawId: string; kind: 'thd_rejected' | 'unknown_prefix' }
70
-
71
- constructor(details: { rawId: string; kind: 'thd_rejected' | 'unknown_prefix' }) {
72
- const reason =
73
- details.kind === 'thd_rejected'
74
- ? `Stale legacy container id prefix '${details.rawId.slice(0, 4)}…' — run 'namzu sdk migrate-ids' before 0.3.0`
75
- : `Unknown ID prefix '${details.rawId.slice(0, 4)}…' — expected 'prj_' or 'thd_'`
76
- super(reason)
77
- this.name = 'StalePrefixError'
78
- this.details = details
79
- }
80
- }
81
-
82
- /**
83
- * 0.2.x: compat window OPEN — `thd_*` coerces to `prj_*` with a warning.
84
- * 0.3.x: flip to `false` — legacy branch becomes throw-only.
85
- */
86
- export const WINDOW_OPEN = true
87
-
88
- /**
89
- * Process-lifetime dedup map. Keyed by raw legacy ID so each distinct legacy
90
- * string emits exactly one warning — spamming observability on a hot loop
91
- * of reads is the anti-goal.
92
- */
93
- const seenLegacy = new Set<string>()
94
-
95
- /**
96
- * Accept-on-read for legacy container `thd_*` IDs during the 0.2.x window.
97
- *
98
- * Contract:
99
- * - `prj_*` inputs return as-is; no warning emitted.
100
- * - `thd_*` inputs normalize to `prj_<suffix>` and emit a single
101
- * {@link MigrationWarning} per distinct input string per process.
102
- * - Everything else (including a live `top_*` Topic id — NZ-TOPIC-04)
103
- * throws {@link StalePrefixError} with `kind: 'unknown_prefix'}`.
104
- * - `windowOpen` (default {@link WINDOW_OPEN}) is an explicit parameter
105
- * rather than a read of the module constant so the CLOSED branch below
106
- * is reachable from a test without mutating shared module state
107
- * (a-check-that-cannot-fail). When `false`, the `thd_*` branch throws
108
- * too — single knob, single commit, now also a single argument a test
109
- * can flip per-call.
110
- *
111
- * Testing hook: {@link __resetSeenLegacyForTests} clears the dedup Set so
112
- * each test starts with a clean emission history.
113
- */
114
- export function acceptLegacyContainerId(
115
- raw: string,
116
- sink: MigrationWarningSink,
117
- windowOpen: boolean = WINDOW_OPEN,
118
- ): ProjectId {
119
- if (raw.startsWith('prj_')) {
120
- return raw as ProjectId
121
- }
122
- if (raw.startsWith('thd_')) {
123
- if (!windowOpen) {
124
- throw new StalePrefixError({ rawId: raw, kind: 'thd_rejected' })
125
- }
126
- const normalized = asProjectId(`prj_${raw.slice('thd_'.length)}`)
127
- if (!seenLegacy.has(raw)) {
128
- seenLegacy.add(raw)
129
- sink.emit({
130
- kind: 'id_prefix_legacy_read',
131
- legacyId: raw,
132
- normalizedId: normalized,
133
- at: new Date(),
134
- emittedOncePerProcess: true,
135
- })
136
- }
137
- return normalized
138
- }
139
- throw new StalePrefixError({ rawId: raw, kind: 'unknown_prefix' })
140
- }
141
-
142
- /**
143
- * Writer guard: reject emission of a legacy container `thd_*` id at encode
144
- * time. Phase 1's {@link generateProjectId} already emits `prj_*` only;
145
- * this helper exists so write paths that handle raw strings (e.g.
146
- * synthesis during filesystem migration) can fail fast on accidental
147
- * legacy re-emission. No `windowOpen` parameter — unlike the reader above,
148
- * this guard's outcome does not fork on migration-window state; a writer
149
- * must never emit `thd_*` in either window (see the module header's
150
- * Writer column). Convention #0: no silent back-sliding to the old prefix.
151
- */
152
- export function rejectLegacyContainerPrefix(id: string): void {
153
- if (id.startsWith('thd_')) {
154
- throw new StalePrefixError({ rawId: id, kind: 'thd_rejected' })
155
- }
156
- }
157
-
158
- /**
159
- * Test-only: clear the process-level dedup Set so subsequent
160
- * {@link acceptLegacyContainerId} calls emit warnings again. Production code
161
- * must never call this — the whole point is one warning per distinct
162
- * legacy id per process.
163
- */
164
- export function __resetSeenLegacyForTests(): void {
165
- seenLegacy.clear()
166
- }
@@ -1,41 +0,0 @@
1
- // Sub-barrel for the migration module (Convention #4).
2
- // Public surface for boot-time FS re-layout + ID-prefix read-accept.
3
- // See session-hierarchy.md §13.3.1 (ID prefix) + §13.4.1 (filesystem).
4
-
5
- export {
6
- acceptLegacyContainerId,
7
- /** @deprecated Use `acceptLegacyContainerId`. */
8
- rejectLegacyContainerPrefix,
9
- /** @deprecated Use `rejectLegacyContainerPrefix`. */
10
- NOOP_MIGRATION_WARNING_SINK,
11
- StalePrefixError,
12
- WINDOW_OPEN,
13
- } from './id-prefix.js'
14
- export type { MigrationWarning, MigrationWarningSink } from './id-prefix.js'
15
-
16
- export {
17
- DefaultFilesystemMigrator,
18
- loggingMigrationSink,
19
- NOOP_FILESYSTEM_MIGRATION_SINK,
20
- LEGACY_DEFAULT_SESSION_ID,
21
- LEGACY_DEFAULT_PROJECT_PREFIX,
22
- MIGRATION_VERSION,
23
- MARKER_REL_PATH,
24
- LOCK_REL_PATH,
25
- } from './filesystem.js'
26
- export type {
27
- FilesystemMigrator,
28
- FilesystemMigrationResult,
29
- FilesystemMigrationEvent,
30
- FilesystemMigrationSink,
31
- } from './filesystem.js'
32
-
33
- export {
34
- readMarker,
35
- writeMarker,
36
- acquireMigrationLock,
37
- releaseMigrationLock,
38
- } from './marker.js'
39
- export type { MigrationMarker } from './marker.js'
40
-
41
- export { FilesystemMigrationError } from './errors.js'