@namzu/sdk 0.1.8 → 0.2.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 (531) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  3. package/dist/agents/ReactiveAgent.js +5 -3
  4. package/dist/agents/ReactiveAgent.js.map +1 -1
  5. package/dist/agents/RouterAgent.d.ts.map +1 -1
  6. package/dist/agents/RouterAgent.js +3 -0
  7. package/dist/agents/RouterAgent.js.map +1 -1
  8. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  9. package/dist/agents/SupervisorAgent.js +18 -5
  10. package/dist/agents/SupervisorAgent.js.map +1 -1
  11. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  12. package/dist/bridge/a2a/mapper.js +6 -0
  13. package/dist/bridge/a2a/mapper.js.map +1 -1
  14. package/dist/bridge/a2a/task.d.ts +2 -2
  15. package/dist/bridge/a2a/task.d.ts.map +1 -1
  16. package/dist/bridge/a2a/task.js.map +1 -1
  17. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  18. package/dist/bridge/sse/mapper.js +6 -0
  19. package/dist/bridge/sse/mapper.js.map +1 -1
  20. package/dist/constants/a2a/index.d.ts +2 -2
  21. package/dist/constants/a2a/index.d.ts.map +1 -1
  22. package/dist/constants/a2a/index.js.map +1 -1
  23. package/dist/contracts/api.d.ts +22 -3
  24. package/dist/contracts/api.d.ts.map +1 -1
  25. package/dist/contracts/index.d.ts +3 -1
  26. package/dist/contracts/index.d.ts.map +1 -1
  27. package/dist/contracts/index.js.map +1 -1
  28. package/dist/gateway/local.d.ts.map +1 -1
  29. package/dist/gateway/local.js +6 -0
  30. package/dist/gateway/local.js.map +1 -1
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +4 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
  36. package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
  37. package/dist/manager/agent/__tests__/lifecycle.test.js +302 -0
  38. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
  39. package/dist/manager/agent/lifecycle.d.ts +58 -3
  40. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  41. package/dist/manager/agent/lifecycle.js +311 -12
  42. package/dist/manager/agent/lifecycle.js.map +1 -1
  43. package/dist/manager/run/persistence.d.ts +8 -1
  44. package/dist/manager/run/persistence.d.ts.map +1 -1
  45. package/dist/manager/run/persistence.js +15 -0
  46. package/dist/manager/run/persistence.js.map +1 -1
  47. package/dist/run/reporter.d.ts.map +1 -1
  48. package/dist/run/reporter.js +25 -0
  49. package/dist/run/reporter.js.map +1 -1
  50. package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
  51. package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
  52. package/dist/runtime/query/__tests__/context.test.js +84 -0
  53. package/dist/runtime/query/__tests__/context.test.js.map +1 -0
  54. package/dist/runtime/query/context.d.ts +55 -2
  55. package/dist/runtime/query/context.d.ts.map +1 -1
  56. package/dist/runtime/query/context.js +48 -8
  57. package/dist/runtime/query/context.js.map +1 -1
  58. package/dist/runtime/query/events.d.ts.map +1 -1
  59. package/dist/runtime/query/events.js +8 -0
  60. package/dist/runtime/query/events.js.map +1 -1
  61. package/dist/runtime/query/index.d.ts +25 -2
  62. package/dist/runtime/query/index.d.ts.map +1 -1
  63. package/dist/runtime/query/index.js +11 -1
  64. package/dist/runtime/query/index.js.map +1 -1
  65. package/dist/session/__tests__/integration/_fixtures.d.ts +115 -0
  66. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
  67. package/dist/session/__tests__/integration/_fixtures.js +198 -0
  68. package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
  69. package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
  70. package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
  71. package/dist/session/__tests__/integration/capacity-caps.test.js +116 -0
  72. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
  73. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
  74. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
  75. package/dist/session/__tests__/integration/e2e-spawn.test.js +226 -0
  76. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
  77. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
  78. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
  79. package/dist/session/__tests__/integration/event-stream-ordering.test.js +323 -0
  80. package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
  81. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
  82. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
  83. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +170 -0
  84. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
  85. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
  86. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
  87. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +146 -0
  88. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
  89. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
  90. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
  91. package/dist/session/__tests__/integration/handoff-single-e2e.test.js +163 -0
  92. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
  93. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
  94. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
  95. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +157 -0
  96. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
  97. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
  98. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
  99. package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
  100. package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
  101. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
  102. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
  103. package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
  104. package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
  105. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
  106. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
  107. package/dist/session/__tests__/integration/prev-artifact-dag.test.js +241 -0
  108. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
  109. package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
  110. package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
  111. package/dist/session/__tests__/integration/retention-archive.test.js +186 -0
  112. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
  113. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
  114. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
  115. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +200 -0
  116. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
  117. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
  118. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
  119. package/dist/session/__tests__/integration/tenant-isolation.test.js +180 -0
  120. package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
  121. package/dist/session/errors.d.ts +60 -0
  122. package/dist/session/errors.d.ts.map +1 -0
  123. package/dist/session/errors.js +50 -0
  124. package/dist/session/errors.js.map +1 -0
  125. package/dist/session/events/index.d.ts +4 -0
  126. package/dist/session/events/index.d.ts.map +1 -0
  127. package/dist/session/events/index.js +8 -0
  128. package/dist/session/events/index.js.map +1 -0
  129. package/dist/session/events/schema-version.d.ts +13 -0
  130. package/dist/session/events/schema-version.d.ts.map +1 -0
  131. package/dist/session/events/schema-version.js +12 -0
  132. package/dist/session/events/schema-version.js.map +1 -0
  133. package/dist/session/events/types.d.ts +64 -0
  134. package/dist/session/events/types.d.ts.map +1 -0
  135. package/dist/session/events/types.js +2 -0
  136. package/dist/session/events/types.js.map +1 -0
  137. package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
  138. package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
  139. package/dist/session/handoff/__tests__/broadcast.test.js +243 -0
  140. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
  141. package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
  142. package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
  143. package/dist/session/handoff/__tests__/capacity.test.js +100 -0
  144. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
  145. package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
  146. package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
  147. package/dist/session/handoff/__tests__/single.test.js +230 -0
  148. package/dist/session/handoff/__tests__/single.test.js.map +1 -0
  149. package/dist/session/handoff/assignment.d.ts +59 -0
  150. package/dist/session/handoff/assignment.d.ts.map +1 -0
  151. package/dist/session/handoff/assignment.js +11 -0
  152. package/dist/session/handoff/assignment.js.map +1 -0
  153. package/dist/session/handoff/broadcast.d.ts +47 -0
  154. package/dist/session/handoff/broadcast.d.ts.map +1 -0
  155. package/dist/session/handoff/broadcast.js +296 -0
  156. package/dist/session/handoff/broadcast.js.map +1 -0
  157. package/dist/session/handoff/capacity.d.ts +66 -0
  158. package/dist/session/handoff/capacity.d.ts.map +1 -0
  159. package/dist/session/handoff/capacity.js +60 -0
  160. package/dist/session/handoff/capacity.js.map +1 -0
  161. package/dist/session/handoff/events.d.ts +66 -0
  162. package/dist/session/handoff/events.d.ts.map +1 -0
  163. package/dist/session/handoff/events.js +13 -0
  164. package/dist/session/handoff/events.js.map +1 -0
  165. package/dist/session/handoff/index.d.ts +12 -0
  166. package/dist/session/handoff/index.d.ts.map +1 -0
  167. package/dist/session/handoff/index.js +9 -0
  168. package/dist/session/handoff/index.js.map +1 -0
  169. package/dist/session/handoff/single.d.ts +62 -0
  170. package/dist/session/handoff/single.d.ts.map +1 -0
  171. package/dist/session/handoff/single.js +217 -0
  172. package/dist/session/handoff/single.js.map +1 -0
  173. package/dist/session/handoff/version.d.ts +52 -0
  174. package/dist/session/handoff/version.d.ts.map +1 -0
  175. package/dist/session/handoff/version.js +36 -0
  176. package/dist/session/handoff/version.js.map +1 -0
  177. package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
  178. package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
  179. package/dist/session/hierarchy/__tests__/session.test.js +67 -0
  180. package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
  181. package/dist/session/hierarchy/actor.d.ts +26 -0
  182. package/dist/session/hierarchy/actor.d.ts.map +1 -0
  183. package/dist/session/hierarchy/actor.js +2 -0
  184. package/dist/session/hierarchy/actor.js.map +1 -0
  185. package/dist/session/hierarchy/index.d.ts +8 -0
  186. package/dist/session/hierarchy/index.d.ts.map +1 -0
  187. package/dist/session/hierarchy/index.js +4 -0
  188. package/dist/session/hierarchy/index.js.map +1 -0
  189. package/dist/session/hierarchy/lineage.d.ts +15 -0
  190. package/dist/session/hierarchy/lineage.d.ts.map +1 -0
  191. package/dist/session/hierarchy/lineage.js +2 -0
  192. package/dist/session/hierarchy/lineage.js.map +1 -0
  193. package/dist/session/hierarchy/project.d.ts +40 -0
  194. package/dist/session/hierarchy/project.d.ts.map +1 -0
  195. package/dist/session/hierarchy/project.js +2 -0
  196. package/dist/session/hierarchy/project.js.map +1 -0
  197. package/dist/session/hierarchy/session.d.ts +59 -0
  198. package/dist/session/hierarchy/session.d.ts.map +1 -0
  199. package/dist/session/hierarchy/session.js +51 -0
  200. package/dist/session/hierarchy/session.js.map +1 -0
  201. package/dist/session/hierarchy/sub-session.d.ts +76 -0
  202. package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
  203. package/dist/session/hierarchy/sub-session.js +2 -0
  204. package/dist/session/hierarchy/sub-session.js.map +1 -0
  205. package/dist/session/hierarchy/tenant.d.ts +13 -0
  206. package/dist/session/hierarchy/tenant.d.ts.map +1 -0
  207. package/dist/session/hierarchy/tenant.js +2 -0
  208. package/dist/session/hierarchy/tenant.js.map +1 -0
  209. package/dist/session/index.d.ts +10 -0
  210. package/dist/session/index.d.ts.map +1 -0
  211. package/dist/session/index.js +15 -0
  212. package/dist/session/index.js.map +1 -0
  213. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
  214. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
  215. package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
  216. package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
  217. package/dist/session/intervention/index.d.ts +3 -0
  218. package/dist/session/intervention/index.d.ts.map +1 -0
  219. package/dist/session/intervention/index.js +8 -0
  220. package/dist/session/intervention/index.js.map +1 -0
  221. package/dist/session/intervention/prev-artifact.d.ts +103 -0
  222. package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
  223. package/dist/session/intervention/prev-artifact.js +112 -0
  224. package/dist/session/intervention/prev-artifact.js.map +1 -0
  225. package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
  226. package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
  227. package/dist/session/migration/__tests__/filesystem.test.js +188 -0
  228. package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
  229. package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
  230. package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
  231. package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
  232. package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
  233. package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
  234. package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
  235. package/dist/session/migration/__tests__/marker.test.js +75 -0
  236. package/dist/session/migration/__tests__/marker.test.js.map +1 -0
  237. package/dist/session/migration/errors.d.ts +26 -0
  238. package/dist/session/migration/errors.d.ts.map +1 -0
  239. package/dist/session/migration/errors.js +22 -0
  240. package/dist/session/migration/errors.js.map +1 -0
  241. package/dist/session/migration/filesystem.d.ts +94 -0
  242. package/dist/session/migration/filesystem.d.ts.map +1 -0
  243. package/dist/session/migration/filesystem.js +319 -0
  244. package/dist/session/migration/filesystem.js.map +1 -0
  245. package/dist/session/migration/id-prefix.d.ts +98 -0
  246. package/dist/session/migration/id-prefix.d.ts.map +1 -0
  247. package/dist/session/migration/id-prefix.js +116 -0
  248. package/dist/session/migration/id-prefix.js.map +1 -0
  249. package/dist/session/migration/index.d.ts +8 -0
  250. package/dist/session/migration/index.d.ts.map +1 -0
  251. package/dist/session/migration/index.js +8 -0
  252. package/dist/session/migration/index.js.map +1 -0
  253. package/dist/session/migration/marker.d.ts +57 -0
  254. package/dist/session/migration/marker.d.ts.map +1 -0
  255. package/dist/session/migration/marker.js +111 -0
  256. package/dist/session/migration/marker.js.map +1 -0
  257. package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
  258. package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
  259. package/dist/session/retention/__tests__/archive.test.js +252 -0
  260. package/dist/session/retention/__tests__/archive.test.js.map +1 -0
  261. package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
  262. package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
  263. package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
  264. package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
  265. package/dist/session/retention/archive-backend-ref.d.ts +18 -0
  266. package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
  267. package/dist/session/retention/archive-backend-ref.js +2 -0
  268. package/dist/session/retention/archive-backend-ref.js.map +1 -0
  269. package/dist/session/retention/archive.d.ts +130 -0
  270. package/dist/session/retention/archive.d.ts.map +1 -0
  271. package/dist/session/retention/archive.js +203 -0
  272. package/dist/session/retention/archive.js.map +1 -0
  273. package/dist/session/retention/backend.d.ts +101 -0
  274. package/dist/session/retention/backend.d.ts.map +1 -0
  275. package/dist/session/retention/backend.js +15 -0
  276. package/dist/session/retention/backend.js.map +1 -0
  277. package/dist/session/retention/disk-backend.d.ts +59 -0
  278. package/dist/session/retention/disk-backend.d.ts.map +1 -0
  279. package/dist/session/retention/disk-backend.js +236 -0
  280. package/dist/session/retention/disk-backend.js.map +1 -0
  281. package/dist/session/retention/index.d.ts +9 -0
  282. package/dist/session/retention/index.d.ts.map +1 -0
  283. package/dist/session/retention/index.js +6 -0
  284. package/dist/session/retention/index.js.map +1 -0
  285. package/dist/session/retention/policy.d.ts +49 -0
  286. package/dist/session/retention/policy.d.ts.map +1 -0
  287. package/dist/session/retention/policy.js +21 -0
  288. package/dist/session/retention/policy.js.map +1 -0
  289. package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
  290. package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
  291. package/dist/session/summary/__tests__/materialize.test.js +269 -0
  292. package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
  293. package/dist/session/summary/deliverable.d.ts +74 -0
  294. package/dist/session/summary/deliverable.d.ts.map +1 -0
  295. package/dist/session/summary/deliverable.js +20 -0
  296. package/dist/session/summary/deliverable.js.map +1 -0
  297. package/dist/session/summary/index.d.ts +6 -0
  298. package/dist/session/summary/index.d.ts.map +1 -0
  299. package/dist/session/summary/index.js +9 -0
  300. package/dist/session/summary/index.js.map +1 -0
  301. package/dist/session/summary/materialize.d.ts +82 -0
  302. package/dist/session/summary/materialize.d.ts.map +1 -0
  303. package/dist/session/summary/materialize.js +117 -0
  304. package/dist/session/summary/materialize.js.map +1 -0
  305. package/dist/session/summary/ref.d.ts +91 -0
  306. package/dist/session/summary/ref.d.ts.map +1 -0
  307. package/dist/session/summary/ref.js +51 -0
  308. package/dist/session/summary/ref.js.map +1 -0
  309. package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
  310. package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
  311. package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
  312. package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
  313. package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
  314. package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
  315. package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
  316. package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
  317. package/dist/session/workspace/driver.d.ts +55 -0
  318. package/dist/session/workspace/driver.d.ts.map +1 -0
  319. package/dist/session/workspace/driver.js +12 -0
  320. package/dist/session/workspace/driver.js.map +1 -0
  321. package/dist/session/workspace/git-worktree.d.ts +65 -0
  322. package/dist/session/workspace/git-worktree.d.ts.map +1 -0
  323. package/dist/session/workspace/git-worktree.js +156 -0
  324. package/dist/session/workspace/git-worktree.js.map +1 -0
  325. package/dist/session/workspace/index.d.ts +8 -0
  326. package/dist/session/workspace/index.d.ts.map +1 -0
  327. package/dist/session/workspace/index.js +7 -0
  328. package/dist/session/workspace/index.js.map +1 -0
  329. package/dist/session/workspace/path-builder.d.ts +50 -0
  330. package/dist/session/workspace/path-builder.d.ts.map +1 -0
  331. package/dist/session/workspace/path-builder.js +50 -0
  332. package/dist/session/workspace/path-builder.js.map +1 -0
  333. package/dist/session/workspace/ref.d.ts +46 -0
  334. package/dist/session/workspace/ref.d.ts.map +1 -0
  335. package/dist/session/workspace/ref.js +11 -0
  336. package/dist/session/workspace/ref.js.map +1 -0
  337. package/dist/session/workspace/registry.d.ts +26 -0
  338. package/dist/session/workspace/registry.d.ts.map +1 -0
  339. package/dist/session/workspace/registry.js +35 -0
  340. package/dist/session/workspace/registry.js.map +1 -0
  341. package/dist/store/conversation/memory.d.ts +22 -0
  342. package/dist/store/conversation/memory.d.ts.map +1 -1
  343. package/dist/store/conversation/memory.js +22 -0
  344. package/dist/store/conversation/memory.js.map +1 -1
  345. package/dist/store/session/__tests__/disk.test.d.ts +2 -0
  346. package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
  347. package/dist/store/session/__tests__/disk.test.js +240 -0
  348. package/dist/store/session/__tests__/disk.test.js.map +1 -0
  349. package/dist/store/session/__tests__/memory.test.d.ts +2 -0
  350. package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
  351. package/dist/store/session/__tests__/memory.test.js +217 -0
  352. package/dist/store/session/__tests__/memory.test.js.map +1 -0
  353. package/dist/store/session/disk.d.ts +85 -0
  354. package/dist/store/session/disk.d.ts.map +1 -0
  355. package/dist/store/session/disk.js +757 -0
  356. package/dist/store/session/disk.js.map +1 -0
  357. package/dist/store/session/index.d.ts +7 -0
  358. package/dist/store/session/index.d.ts.map +1 -0
  359. package/dist/store/session/index.js +11 -0
  360. package/dist/store/session/index.js.map +1 -0
  361. package/dist/store/session/linkage.d.ts +38 -0
  362. package/dist/store/session/linkage.d.ts.map +1 -0
  363. package/dist/store/session/linkage.js +64 -0
  364. package/dist/store/session/linkage.js.map +1 -0
  365. package/dist/store/session/memory.d.ts +48 -0
  366. package/dist/store/session/memory.d.ts.map +1 -0
  367. package/dist/store/session/memory.js +322 -0
  368. package/dist/store/session/memory.js.map +1 -0
  369. package/dist/store/session/messages.d.ts +20 -0
  370. package/dist/store/session/messages.d.ts.map +1 -0
  371. package/dist/store/session/messages.js +12 -0
  372. package/dist/store/session/messages.js.map +1 -0
  373. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
  374. package/dist/types/agent/base.d.ts +28 -1
  375. package/dist/types/agent/base.d.ts.map +1 -1
  376. package/dist/types/agent/task.d.ts +50 -2
  377. package/dist/types/agent/task.d.ts.map +1 -1
  378. package/dist/types/agent/task.js.map +1 -1
  379. package/dist/types/conversation/index.d.ts +7 -0
  380. package/dist/types/conversation/index.d.ts.map +1 -1
  381. package/dist/types/ids/index.d.ts +26 -3
  382. package/dist/types/ids/index.d.ts.map +1 -1
  383. package/dist/types/ids/index.js +8 -1
  384. package/dist/types/ids/index.js.map +1 -1
  385. package/dist/types/invocation/__tests__/state.test.js +36 -29
  386. package/dist/types/invocation/__tests__/state.test.js.map +1 -1
  387. package/dist/types/invocation/index.d.ts +20 -4
  388. package/dist/types/invocation/index.d.ts.map +1 -1
  389. package/dist/types/invocation/index.js +10 -7
  390. package/dist/types/invocation/index.js.map +1 -1
  391. package/dist/types/run/config.d.ts +11 -1
  392. package/dist/types/run/config.d.ts.map +1 -1
  393. package/dist/types/run/events.d.ts +26 -1
  394. package/dist/types/run/events.d.ts.map +1 -1
  395. package/dist/types/run/index.d.ts.map +1 -1
  396. package/dist/types/run/index.js +8 -0
  397. package/dist/types/run/index.js.map +1 -1
  398. package/dist/types/run/metadata.d.ts +24 -1
  399. package/dist/types/run/metadata.d.ts.map +1 -1
  400. package/dist/types/run/status.d.ts +26 -0
  401. package/dist/types/run/status.d.ts.map +1 -0
  402. package/dist/types/run/status.js +2 -0
  403. package/dist/types/run/status.js.map +1 -0
  404. package/dist/types/session/ids.d.ts +18 -0
  405. package/dist/types/session/ids.d.ts.map +1 -0
  406. package/dist/types/session/ids.js +12 -0
  407. package/dist/types/session/ids.js.map +1 -0
  408. package/dist/types/session/index.d.ts +3 -0
  409. package/dist/types/session/index.d.ts.map +1 -0
  410. package/dist/types/session/index.js +5 -0
  411. package/dist/types/session/index.js.map +1 -0
  412. package/dist/types/session/store.d.ts +188 -0
  413. package/dist/types/session/store.d.ts.map +1 -0
  414. package/dist/types/session/store.js +14 -0
  415. package/dist/types/session/store.js.map +1 -0
  416. package/dist/utils/id.d.ts +18 -1
  417. package/dist/utils/id.d.ts.map +1 -1
  418. package/dist/utils/id.js +42 -4
  419. package/dist/utils/id.js.map +1 -1
  420. package/package.json +1 -1
  421. package/src/agents/ReactiveAgent.ts +7 -3
  422. package/src/agents/RouterAgent.ts +5 -0
  423. package/src/agents/SupervisorAgent.ts +26 -6
  424. package/src/bridge/a2a/mapper.ts +7 -0
  425. package/src/bridge/a2a/task.ts +2 -2
  426. package/src/bridge/sse/mapper.ts +8 -1
  427. package/src/constants/a2a/index.ts +2 -2
  428. package/src/contracts/api.ts +23 -3
  429. package/src/contracts/index.ts +2 -0
  430. package/src/gateway/local.ts +6 -0
  431. package/src/index.ts +14 -0
  432. package/src/manager/agent/__tests__/lifecycle.test.ts +452 -0
  433. package/src/manager/agent/lifecycle.ts +434 -19
  434. package/src/manager/run/persistence.ts +20 -1
  435. package/src/run/reporter.ts +28 -0
  436. package/src/runtime/query/__tests__/context.test.ts +101 -0
  437. package/src/runtime/query/context.ts +106 -10
  438. package/src/runtime/query/events.ts +8 -0
  439. package/src/runtime/query/index.ts +41 -3
  440. package/src/session/__tests__/integration/_fixtures.ts +282 -0
  441. package/src/session/__tests__/integration/capacity-caps.test.ts +164 -0
  442. package/src/session/__tests__/integration/e2e-spawn.test.ts +278 -0
  443. package/src/session/__tests__/integration/event-stream-ordering.test.ts +403 -0
  444. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +245 -0
  445. package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +179 -0
  446. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +220 -0
  447. package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +237 -0
  448. package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
  449. package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
  450. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +318 -0
  451. package/src/session/__tests__/integration/retention-archive.test.ts +231 -0
  452. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +237 -0
  453. package/src/session/__tests__/integration/tenant-isolation.test.ts +282 -0
  454. package/src/session/errors.ts +70 -0
  455. package/src/session/events/index.ts +16 -0
  456. package/src/session/events/schema-version.ts +13 -0
  457. package/src/session/events/types.ts +71 -0
  458. package/src/session/handoff/__tests__/broadcast.test.ts +350 -0
  459. package/src/session/handoff/__tests__/capacity.test.ts +123 -0
  460. package/src/session/handoff/__tests__/single.test.ts +316 -0
  461. package/src/session/handoff/assignment.ts +62 -0
  462. package/src/session/handoff/broadcast.ts +381 -0
  463. package/src/session/handoff/capacity.ts +121 -0
  464. package/src/session/handoff/events.ts +72 -0
  465. package/src/session/handoff/index.ts +29 -0
  466. package/src/session/handoff/single.ts +288 -0
  467. package/src/session/handoff/version.ts +59 -0
  468. package/src/session/hierarchy/__tests__/session.test.ts +92 -0
  469. package/src/session/hierarchy/actor.ts +17 -0
  470. package/src/session/hierarchy/index.ts +17 -0
  471. package/src/session/hierarchy/lineage.ts +15 -0
  472. package/src/session/hierarchy/project.ts +41 -0
  473. package/src/session/hierarchy/session.ts +97 -0
  474. package/src/session/hierarchy/sub-session.ts +92 -0
  475. package/src/session/hierarchy/tenant.ts +13 -0
  476. package/src/session/index.ts +15 -0
  477. package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
  478. package/src/session/intervention/index.ts +16 -0
  479. package/src/session/intervention/prev-artifact.ts +180 -0
  480. package/src/session/migration/__tests__/filesystem.test.ts +263 -0
  481. package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
  482. package/src/session/migration/__tests__/marker.test.ts +84 -0
  483. package/src/session/migration/errors.ts +23 -0
  484. package/src/session/migration/filesystem.ts +401 -0
  485. package/src/session/migration/id-prefix.ts +146 -0
  486. package/src/session/migration/index.ts +38 -0
  487. package/src/session/migration/marker.ts +131 -0
  488. package/src/session/retention/__tests__/archive.test.ts +316 -0
  489. package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
  490. package/src/session/retention/archive-backend-ref.ts +17 -0
  491. package/src/session/retention/archive.ts +281 -0
  492. package/src/session/retention/backend.ts +107 -0
  493. package/src/session/retention/disk-backend.ts +304 -0
  494. package/src/session/retention/index.ts +16 -0
  495. package/src/session/retention/policy.ts +53 -0
  496. package/src/session/summary/__tests__/materialize.test.ts +341 -0
  497. package/src/session/summary/deliverable.ts +84 -0
  498. package/src/session/summary/index.ts +31 -0
  499. package/src/session/summary/materialize.ts +169 -0
  500. package/src/session/summary/ref.ts +104 -0
  501. package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
  502. package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
  503. package/src/session/workspace/driver.ts +60 -0
  504. package/src/session/workspace/git-worktree.ts +209 -0
  505. package/src/session/workspace/index.ts +25 -0
  506. package/src/session/workspace/path-builder.ts +71 -0
  507. package/src/session/workspace/ref.ts +50 -0
  508. package/src/session/workspace/registry.ts +42 -0
  509. package/src/store/conversation/memory.ts +23 -0
  510. package/src/store/session/__tests__/disk.test.ts +346 -0
  511. package/src/store/session/__tests__/memory.test.ts +327 -0
  512. package/src/store/session/disk.ts +920 -0
  513. package/src/store/session/index.ts +14 -0
  514. package/src/store/session/linkage.ts +80 -0
  515. package/src/store/session/memory.ts +400 -0
  516. package/src/store/session/messages.ts +21 -0
  517. package/src/types/agent/base.ts +31 -1
  518. package/src/types/agent/task.ts +58 -2
  519. package/src/types/conversation/index.ts +7 -0
  520. package/src/types/ids/index.ts +41 -3
  521. package/src/types/invocation/__tests__/state.test.ts +37 -29
  522. package/src/types/invocation/index.ts +26 -10
  523. package/src/types/run/config.ts +12 -1
  524. package/src/types/run/events.ts +36 -1
  525. package/src/types/run/index.ts +8 -0
  526. package/src/types/run/metadata.ts +24 -1
  527. package/src/types/run/status.ts +33 -0
  528. package/src/types/session/ids.ts +34 -0
  529. package/src/types/session/index.ts +28 -0
  530. package/src/types/session/store.ts +229 -0
  531. package/src/utils/id.ts +55 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prev-artifact.js","sourceRoot":"","sources":["../../../src/session/intervention/prev-artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqBH;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAGf;IAED,YAAY,OAGX;QACA,KAAK,CACJ,qCAAqC,OAAO,CAAC,iBAAiB,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACnG,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC1C,OAAO,CAIf;IAED,YAAY,OAAqE;QAChF,KAAK,CACJ,4BAA4B,OAAO,CAAC,KAAK,kBAAkB,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,EAAE,CACrG,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAkBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,MAA+B,EAC/B,aAA2B,EAC3B,iBAAiC,EACjC,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,yBAAyB,CAAC;YACnC,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,QAAQ;SACf,CAAC,CAAA;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,iBAAiB,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAClD,OAAO,EAAE,CAAA;IACV,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAe,CAAC,aAAa,CAAC,CAAC,CAAA;IACtD,MAAM,KAAK,GAAmB,EAAE,CAAA;IAEhC,IAAI,UAAU,GAA+B,iBAAiB,CAAA;IAE9D,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC3C,+CAA+C;YAC/C,OAAO,KAAK,CAAA;QACb,CAAC;QAED,wEAAwE;QACxE,kEAAkE;QAClE,wEAAwE;QACxE,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACpE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,mEAAmE;YACnE,yCAAyC;YACzC,OAAO,KAAK,CAAA;QACb,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,qBAAqB,CAAC;gBAC/B,iBAAiB,EAAE,aAAa;gBAChC,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC;aAChD,CAAC,CAAA;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACtC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QAErC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC;gBACnC,YAAY,EAAE,aAAa;gBAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,KAAK,EAAE,QAAQ;aACf,CAAC,CAAA;QACH,CAAC;QAED,UAAU,GAAG,YAAY,CAAC,eAAe,CAAA;IAC1C,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filesystem.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/filesystem.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,188 @@
1
+ import { chmod, mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { UNKNOWN_TENANT_ID } from '../../../types/ids/index.js';
6
+ import { FilesystemMigrationError } from '../errors.js';
7
+ import { DefaultFilesystemMigrator, LEGACY_DEFAULT_PROJECT_PREFIX, LEGACY_DEFAULT_SESSION_ID, MARKER_REL_PATH, MIGRATION_VERSION, } from '../filesystem.js';
8
+ import { acquireMigrationLock, writeMarker } from '../marker.js';
9
+ function collectingSink() {
10
+ const events = [];
11
+ return {
12
+ events,
13
+ sink: {
14
+ emit(ev) {
15
+ events.push(ev);
16
+ },
17
+ },
18
+ };
19
+ }
20
+ async function seedLegacyThread(root, thread, runs) {
21
+ for (const run of runs) {
22
+ const dir = join(root, 'threads', thread, 'runs', run);
23
+ await mkdir(dir, { recursive: true });
24
+ await writeFile(join(dir, 'run.json'), JSON.stringify({ id: run }), 'utf-8');
25
+ }
26
+ }
27
+ async function pathExists(p) {
28
+ try {
29
+ await stat(p);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ describe('DefaultFilesystemMigrator.migrate', () => {
37
+ let root;
38
+ beforeEach(async () => {
39
+ root = await mkdtemp(join(tmpdir(), 'namzu-fsmig-'));
40
+ });
41
+ afterEach(async () => {
42
+ // chmod first in case a test left 000 perms on a directory.
43
+ await chmod(root, 0o755).catch(() => undefined);
44
+ await rm(root, { recursive: true, force: true });
45
+ });
46
+ it('cold boot with a single legacy thread: migrates, emits event, writes marker', async () => {
47
+ await seedLegacyThread(root, 'thd_abc', ['run_xyz']);
48
+ const { events, sink } = collectingSink();
49
+ const migrator = new DefaultFilesystemMigrator(sink);
50
+ const result = await migrator.migrate(root);
51
+ expect(result.kind).toBe('migrated');
52
+ expect(result.migratedThreads).toEqual([
53
+ { legacyThreadId: 'thd_abc', newProjectId: `${LEGACY_DEFAULT_PROJECT_PREFIX}abc` },
54
+ ]);
55
+ // New layout exists.
56
+ const newRunDir = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}abc`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'runs', 'run_xyz');
57
+ expect(await pathExists(newRunDir)).toBe(true);
58
+ expect(await pathExists(join(newRunDir, 'run.json'))).toBe(true);
59
+ // Legacy path moved (runs/ sub-tree renamed).
60
+ expect(await pathExists(join(root, 'threads', 'thd_abc', 'runs'))).toBe(false);
61
+ // Marker landed.
62
+ const markerRaw = await readFile(join(root, MARKER_REL_PATH), 'utf-8');
63
+ const markerParsed = JSON.parse(markerRaw);
64
+ expect(markerParsed.version).toBe(MIGRATION_VERSION);
65
+ expect(markerParsed.migratedThreads).toHaveLength(1);
66
+ // Event emitted with accurate result.
67
+ expect(events).toHaveLength(1);
68
+ expect(events[0]?.type).toBe('filesystem.migrated');
69
+ expect(events[0]?.result.kind).toBe('migrated');
70
+ });
71
+ it('warm boot with an existing marker short-circuits to already_migrated', async () => {
72
+ await writeMarker(join(root, MARKER_REL_PATH), {
73
+ version: MIGRATION_VERSION,
74
+ at: new Date(),
75
+ migratedThreads: [],
76
+ });
77
+ await seedLegacyThread(root, 'thd_stillhere', ['run_ignored']);
78
+ const { events, sink } = collectingSink();
79
+ const migrator = new DefaultFilesystemMigrator(sink);
80
+ const result = await migrator.migrate(root);
81
+ expect(result.kind).toBe('already_migrated');
82
+ expect(events).toHaveLength(0);
83
+ // No migration happened — legacy path untouched.
84
+ expect(await pathExists(join(root, 'threads', 'thd_stillhere', 'runs', 'run_ignored'))).toBe(true);
85
+ });
86
+ it('cold boot with neither legacy nor marker writes a marker and returns noop_no_legacy', async () => {
87
+ const { events, sink } = collectingSink();
88
+ const migrator = new DefaultFilesystemMigrator(sink);
89
+ const result = await migrator.migrate(root);
90
+ expect(result.kind).toBe('noop_no_legacy');
91
+ expect(events).toHaveLength(0);
92
+ expect(await pathExists(join(root, MARKER_REL_PATH))).toBe(true);
93
+ });
94
+ it('cooperates with a concurrent migrator: main marker lands → already_migrated', async () => {
95
+ await seedLegacyThread(root, 'thd_abc', ['run_1']);
96
+ // Pre-seed the tmp lock to simulate another boot mid-migration.
97
+ await acquireMigrationLock(join(root, '.migration', 'v0.2.0.tmp'));
98
+ // Now write the main marker as the "winner" would. The loser must
99
+ // see this on the re-check after waiting and return already_migrated.
100
+ await writeMarker(join(root, MARKER_REL_PATH), {
101
+ version: MIGRATION_VERSION,
102
+ at: new Date(),
103
+ migratedThreads: [
104
+ { legacyThreadId: 'thd_abc', newProjectId: `${LEGACY_DEFAULT_PROJECT_PREFIX}abc` },
105
+ ],
106
+ });
107
+ // Because readMarker is checked FIRST (before lock contention), this
108
+ // actually returns already_migrated on step 1. That is the correct
109
+ // semantics: the main marker is the single source of truth.
110
+ const migrator = new DefaultFilesystemMigrator();
111
+ const result = await migrator.migrate(root);
112
+ expect(result.kind).toBe('already_migrated');
113
+ });
114
+ it('migrates multiple legacy threads in one pass with marker listing all', async () => {
115
+ await seedLegacyThread(root, 'thd_a', ['run_a1', 'run_a2']);
116
+ await seedLegacyThread(root, 'thd_b', ['run_b1']);
117
+ await seedLegacyThread(root, 'thd_c', ['run_c1']);
118
+ const migrator = new DefaultFilesystemMigrator();
119
+ const result = await migrator.migrate(root);
120
+ expect(result.kind).toBe('migrated');
121
+ expect(result.migratedThreads).toHaveLength(3);
122
+ const ids = result.migratedThreads.map((m) => m.legacyThreadId).sort();
123
+ expect(ids).toEqual(['thd_a', 'thd_b', 'thd_c']);
124
+ // Marker content mirrors result.
125
+ const markerRaw = await readFile(join(root, MARKER_REL_PATH), 'utf-8');
126
+ const markerParsed = JSON.parse(markerRaw);
127
+ expect(markerParsed.migratedThreads).toHaveLength(3);
128
+ });
129
+ it('synthesized project.json has _legacy: true and tenantId: UNKNOWN_TENANT_ID', async () => {
130
+ await seedLegacyThread(root, 'thd_tenantcheck', ['run_0']);
131
+ const migrator = new DefaultFilesystemMigrator();
132
+ await migrator.migrate(root);
133
+ const projectJsonPath = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}tenantcheck`, 'project.json');
134
+ const parsed = JSON.parse(await readFile(projectJsonPath, 'utf-8'));
135
+ expect(parsed._legacy).toBe(true);
136
+ expect(parsed.tenantId).toBe(UNKNOWN_TENANT_ID);
137
+ expect(parsed.id).toBe(`${LEGACY_DEFAULT_PROJECT_PREFIX}tenantcheck`);
138
+ expect(parsed.config).toMatchObject({
139
+ maxDelegationDepth: 4,
140
+ maxDelegationWidth: 8,
141
+ maxInterventionDepth: 10,
142
+ });
143
+ });
144
+ it('synthesized session.json is idle and flagged _legacy', async () => {
145
+ await seedLegacyThread(root, 'thd_sescheck', ['run_0']);
146
+ const migrator = new DefaultFilesystemMigrator();
147
+ await migrator.migrate(root);
148
+ const sessionJsonPath = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}sescheck`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'session.json');
149
+ const parsed = JSON.parse(await readFile(sessionJsonPath, 'utf-8'));
150
+ expect(parsed.id).toBe(LEGACY_DEFAULT_SESSION_ID);
151
+ expect(parsed.status).toBe('idle');
152
+ expect(parsed.tenantId).toBe(UNKNOWN_TENANT_ID);
153
+ expect(parsed._legacy).toBe(true);
154
+ });
155
+ it('idempotent: two successive migrate() calls produce the same end-state', async () => {
156
+ await seedLegacyThread(root, 'thd_idem', ['run_1']);
157
+ const migrator = new DefaultFilesystemMigrator();
158
+ const first = await migrator.migrate(root);
159
+ const second = await migrator.migrate(root);
160
+ expect(first.kind).toBe('migrated');
161
+ expect(second.kind).toBe('already_migrated');
162
+ expect(second.migratedThreads).toHaveLength(0);
163
+ // End state still valid.
164
+ const newRunDir = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}idem`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'runs', 'run_1');
165
+ expect(await pathExists(newRunDir)).toBe(true);
166
+ });
167
+ it('error path: unwritable marker directory surfaces FilesystemMigrationError', async () => {
168
+ // Make the rootDir read-only so write_marker fails on the noop branch
169
+ // (simplest repro — no legacy threads needed).
170
+ await chmod(root, 0o555);
171
+ const migrator = new DefaultFilesystemMigrator();
172
+ try {
173
+ await migrator.migrate(root);
174
+ expect.fail('expected migrate() to throw');
175
+ }
176
+ catch (err) {
177
+ expect(err).toBeInstanceOf(FilesystemMigrationError);
178
+ const details = err.details;
179
+ expect(details.op).toBe('write_marker');
180
+ expect(details.path).toContain('v0.2.0');
181
+ }
182
+ finally {
183
+ // restore perms so afterEach can clean up
184
+ await chmod(root, 0o755).catch(() => undefined);
185
+ }
186
+ });
187
+ });
188
+ //# sourceMappingURL=filesystem.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/filesystem.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=id-prefix.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-prefix.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/id-prefix.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { NOOP_MIGRATION_WARNING_SINK, StalePrefixError, __resetSeenLegacyForTests, acceptLegacyThreadId, rejectLegacyPrefix, } from '../id-prefix.js';
3
+ function collectingSink() {
4
+ const emitted = [];
5
+ return {
6
+ emitted,
7
+ sink: {
8
+ emit(w) {
9
+ emitted.push(w);
10
+ },
11
+ },
12
+ };
13
+ }
14
+ describe('acceptLegacyThreadId', () => {
15
+ beforeEach(() => {
16
+ __resetSeenLegacyForTests();
17
+ });
18
+ it('coerces thd_* to prj_* and emits a warning on first encounter', () => {
19
+ const { emitted, sink } = collectingSink();
20
+ const result = acceptLegacyThreadId('thd_abc', sink);
21
+ expect(result).toBe('prj_abc');
22
+ expect(emitted).toHaveLength(1);
23
+ expect(emitted[0]?.kind).toBe('id_prefix_legacy_read');
24
+ expect(emitted[0]?.legacyId).toBe('thd_abc');
25
+ expect(emitted[0]?.normalizedId).toBe('prj_abc');
26
+ expect(emitted[0]?.emittedOncePerProcess).toBe(true);
27
+ expect(emitted[0]?.at).toBeInstanceOf(Date);
28
+ });
29
+ it('does NOT re-emit a warning for the same legacy id on a second call', () => {
30
+ const { emitted, sink } = collectingSink();
31
+ acceptLegacyThreadId('thd_abc', sink);
32
+ acceptLegacyThreadId('thd_abc', sink);
33
+ acceptLegacyThreadId('thd_abc', sink);
34
+ expect(emitted).toHaveLength(1);
35
+ });
36
+ it('emits distinct warnings for distinct legacy ids', () => {
37
+ const { emitted, sink } = collectingSink();
38
+ acceptLegacyThreadId('thd_abc', sink);
39
+ acceptLegacyThreadId('thd_xyz', sink);
40
+ expect(emitted).toHaveLength(2);
41
+ expect(emitted.map((w) => w.legacyId).sort()).toEqual(['thd_abc', 'thd_xyz']);
42
+ });
43
+ it('returns prj_* ids unchanged and emits no warning', () => {
44
+ const { emitted, sink } = collectingSink();
45
+ const result = acceptLegacyThreadId('prj_keepme', sink);
46
+ expect(result).toBe('prj_keepme');
47
+ expect(emitted).toHaveLength(0);
48
+ });
49
+ it('rejects unknown prefixes with StalePrefixError', () => {
50
+ const { sink } = collectingSink();
51
+ expect(() => acceptLegacyThreadId('xyz_nope', sink)).toThrowError(StalePrefixError);
52
+ });
53
+ it('StalePrefixError carries structured details for unknown prefixes', () => {
54
+ const { sink } = collectingSink();
55
+ try {
56
+ acceptLegacyThreadId('xyz_nope', sink);
57
+ expect.fail('expected throw');
58
+ }
59
+ catch (err) {
60
+ expect(err).toBeInstanceOf(StalePrefixError);
61
+ expect(err.details.rawId).toBe('xyz_nope');
62
+ expect(err.details.kind).toBe('unknown_prefix');
63
+ }
64
+ });
65
+ it('NOOP_MIGRATION_WARNING_SINK swallows warnings without error', () => {
66
+ expect(() => acceptLegacyThreadId('thd_noop', NOOP_MIGRATION_WARNING_SINK)).not.toThrow();
67
+ });
68
+ });
69
+ describe('rejectLegacyPrefix', () => {
70
+ it('throws StalePrefixError for thd_* input', () => {
71
+ expect(() => rejectLegacyPrefix('thd_abc')).toThrowError(StalePrefixError);
72
+ });
73
+ it('accepts prj_* input without throwing', () => {
74
+ expect(() => rejectLegacyPrefix('prj_abc')).not.toThrow();
75
+ });
76
+ it('accepts non-thread prefixes without throwing (writer guard is scoped)', () => {
77
+ // The guard is specifically for thd_* re-emission; unrelated prefixes
78
+ // are a concern for their own parse functions.
79
+ expect(() => rejectLegacyPrefix('ses_abc')).not.toThrow();
80
+ expect(() => rejectLegacyPrefix('run_abc')).not.toThrow();
81
+ });
82
+ });
83
+ //# sourceMappingURL=id-prefix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-prefix.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/id-prefix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,EACN,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GAClB,MAAM,iBAAiB,CAAA;AAGxB,SAAS,cAAc;IACtB,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,OAAO;QACN,OAAO;QACP,IAAI,EAAE;YACL,IAAI,CAAC,CAAC;gBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;SACD;KACD,CAAA;AACF,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACf,yBAAyB,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAsB,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAyB,CAAC,CAAA;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QACjC,IAAI,CAAC;YACJ,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;YACtC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;YAC5C,MAAM,CAAE,GAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAChE,MAAM,CAAE,GAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACtE,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1F,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,sEAAsE;QACtE,+CAA+C;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=marker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/marker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { acquireMigrationLock, readMarker, releaseMigrationLock, writeMarker } from '../marker.js';
6
+ describe('migration marker I/O', () => {
7
+ let root;
8
+ beforeEach(async () => {
9
+ root = await mkdtemp(join(tmpdir(), 'namzu-marker-'));
10
+ });
11
+ afterEach(async () => {
12
+ await rm(root, { recursive: true, force: true });
13
+ });
14
+ it('readMarker returns null when the file is missing', async () => {
15
+ const result = await readMarker(join(root, 'missing.json'));
16
+ expect(result).toBeNull();
17
+ });
18
+ it('readMarker parses a valid JSON marker', async () => {
19
+ const path = join(root, 'v0.2.0');
20
+ const at = new Date('2026-04-17T00:00:00.000Z');
21
+ await writeMarker(path, {
22
+ version: '0.2.0',
23
+ at,
24
+ migratedThreads: [{ legacyThreadId: 'thd_abc', newProjectId: 'prj_legacy_abc' }],
25
+ });
26
+ const result = await readMarker(path);
27
+ expect(result).not.toBeNull();
28
+ expect(result?.version).toBe('0.2.0');
29
+ expect(result?.at.toISOString()).toBe('2026-04-17T00:00:00.000Z');
30
+ expect(result?.migratedThreads).toEqual([
31
+ { legacyThreadId: 'thd_abc', newProjectId: 'prj_legacy_abc' },
32
+ ]);
33
+ });
34
+ it('readMarker returns null on corrupt JSON (retry-safe)', async () => {
35
+ const path = join(root, 'corrupt.json');
36
+ await writeFile(path, '{ not valid json', 'utf-8');
37
+ const result = await readMarker(path);
38
+ expect(result).toBeNull();
39
+ });
40
+ it('writeMarker atomically writes via tmp-rename (no partial content)', async () => {
41
+ const path = join(root, 'v0.2.0');
42
+ await writeMarker(path, {
43
+ version: '0.2.0',
44
+ at: new Date(),
45
+ migratedThreads: [],
46
+ });
47
+ const content = await readFile(path, 'utf-8');
48
+ const parsed = JSON.parse(content);
49
+ expect(parsed.version).toBe('0.2.0');
50
+ });
51
+ it('acquireMigrationLock succeeds on first call and throws EEXIST on the second', async () => {
52
+ const lockPath = join(root, 'v0.2.0.tmp');
53
+ await acquireMigrationLock(lockPath);
54
+ let caught = null;
55
+ try {
56
+ await acquireMigrationLock(lockPath);
57
+ }
58
+ catch (err) {
59
+ caught = err;
60
+ }
61
+ expect(caught).not.toBeNull();
62
+ expect(caught?.code).toBe('EEXIST');
63
+ });
64
+ it('releaseMigrationLock tolerates a missing file (idempotent)', async () => {
65
+ const lockPath = join(root, 'never-existed.tmp');
66
+ await expect(releaseMigrationLock(lockPath)).resolves.toBeUndefined();
67
+ });
68
+ it('releaseMigrationLock clears the lock so re-acquire succeeds', async () => {
69
+ const lockPath = join(root, 'v0.2.0.tmp');
70
+ await acquireMigrationLock(lockPath);
71
+ await releaseMigrationLock(lockPath);
72
+ await expect(acquireMigrationLock(lockPath)).resolves.toBeUndefined();
73
+ });
74
+ });
75
+ //# sourceMappingURL=marker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marker.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/marker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Typed errors for the migration module.
3
+ *
4
+ * See session-hierarchy.md §13.4.1. Structured `details` payload lets
5
+ * consumers route failures without string parsing (Convention #5: fail
6
+ * fast, surface cause, no silent swallowing).
7
+ */
8
+ /**
9
+ * Raised when any filesystem step during the boot-time v0.2.0 re-layout
10
+ * fails (enumerate, rename, synthesize project.json, write marker).
11
+ * `op` is a short stable tag so consumers can dashboard on failure mode;
12
+ * `cause` carries the underlying `Error` for stack preservation.
13
+ */
14
+ export declare class FilesystemMigrationError extends Error {
15
+ readonly details: {
16
+ op: string;
17
+ path: string;
18
+ cause?: unknown;
19
+ };
20
+ constructor(details: {
21
+ op: string;
22
+ path: string;
23
+ cause?: unknown;
24
+ });
25
+ }
26
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/session/migration/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,QAAQ,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;gBAEnD,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKlE"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Typed errors for the migration module.
3
+ *
4
+ * See session-hierarchy.md §13.4.1. Structured `details` payload lets
5
+ * consumers route failures without string parsing (Convention #5: fail
6
+ * fast, surface cause, no silent swallowing).
7
+ */
8
+ /**
9
+ * Raised when any filesystem step during the boot-time v0.2.0 re-layout
10
+ * fails (enumerate, rename, synthesize project.json, write marker).
11
+ * `op` is a short stable tag so consumers can dashboard on failure mode;
12
+ * `cause` carries the underlying `Error` for stack preservation.
13
+ */
14
+ export class FilesystemMigrationError extends Error {
15
+ details;
16
+ constructor(details) {
17
+ super(`Filesystem migration failed at ${details.op} on ${details.path}`);
18
+ this.name = 'FilesystemMigrationError';
19
+ this.details = details;
20
+ }
21
+ }
22
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/session/migration/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACzC,OAAO,CAA+C;IAE/D,YAAY,OAAsD;QACjE,KAAK,CAAC,kCAAkC,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Boot-time filesystem re-layout — `.namzu/threads/{thd_X}/` →
3
+ * `.namzu/projects/{prj_legacy_<X>}/sessions/ses_legacy_default/runs/...`.
4
+ *
5
+ * Trigger: first {@link RunContextFactory.build} call per process. The
6
+ * factory invokes {@link DefaultFilesystemMigrator.migrate} before resolving
7
+ * any path so legacy runs are never orphaned by the new layout.
8
+ *
9
+ * See session-hierarchy.md §13.4.1 for the detection / trigger / atomicity
10
+ * contract. Concurrency model:
11
+ *
12
+ * 1. Main marker present → short-circuit `already_migrated`. Idempotent.
13
+ * 2. Legacy `.namzu/threads/` absent → write the main marker and return
14
+ * `noop_no_legacy`. This plants the marker on fresh installs so the
15
+ * `threads/` detection branch is only ever entered once.
16
+ * 3. Legacy layout detected → acquire the `.tmp` lock via `wx`; on
17
+ * EEXIST another boot is mid-migration. The loser waits 100ms and
18
+ * re-checks the main marker — cooperating, not competing. Roadmap
19
+ * Risk #4 mitigation.
20
+ * 4. Per-legacy-thread: rename the whole `runs/` subtree in a single
21
+ * `fs.rename` call (cross-OS atomic on the same filesystem; different
22
+ * filesystems fall back to copy-then-unlink via Node's default — a
23
+ * known limitation documented below).
24
+ * 5. Synthesize `project.json` + `session.json` via write-tmp-rename
25
+ * (Convention #8) so partial crashes leave no half-serialised state.
26
+ * 6. Write main marker last — presence of the marker is the canonical
27
+ * "migration done" signal.
28
+ *
29
+ * Known limitations:
30
+ * - Cross-filesystem moves: Node's `fs.rename` rejects with `EXDEV` when
31
+ * source and target live on different filesystems. This migrator does
32
+ * NOT fall back to copy-then-unlink; the error surfaces as
33
+ * {@link FilesystemMigrationError} with op `'rename_runs'`. Consumers
34
+ * running `.namzu/threads` and `.namzu/projects` on different mounts
35
+ * must migrate manually (documented INTERP flag).
36
+ * - `UNKNOWN_TENANT_ID`: legacy threads have no tenant denormalisation on
37
+ * disk. The synthesised project.json carries the sentinel so consumers
38
+ * know these are legacy-rehomed and can either tag-then-retain or
39
+ * reject until a real tenant is assigned (policy is consumer-owned).
40
+ */
41
+ import type { ProjectId, SessionId } from '../../types/session/ids.js';
42
+ /**
43
+ * Sentinel SessionId used for legacy pre-0.2.0 runs that pre-date the
44
+ * Session entity. Every migrated thread collapses into this single session
45
+ * so consumers can still address the runs through the new layout.
46
+ */
47
+ export declare const LEGACY_DEFAULT_SESSION_ID: SessionId;
48
+ /** Prefix for projects synthesised from legacy `thd_*` folders. */
49
+ export declare const LEGACY_DEFAULT_PROJECT_PREFIX = "prj_legacy_";
50
+ /** Marker version string persisted at `.migration/v0.2.0`. */
51
+ export declare const MIGRATION_VERSION = "0.2.0";
52
+ /** Marker file path relative to rootDir. */
53
+ export declare const MARKER_REL_PATH: string;
54
+ /** In-flight lock file path relative to rootDir. */
55
+ export declare const LOCK_REL_PATH: string;
56
+ /**
57
+ * Result of a migration attempt. `kind` discriminates the three outcomes;
58
+ * `migratedThreads` is only non-empty for `kind: 'migrated'`. Sinks and
59
+ * callers can switch on `kind` without string parsing.
60
+ */
61
+ export interface FilesystemMigrationResult {
62
+ kind: 'migrated' | 'already_migrated' | 'noop_no_legacy';
63
+ migratedThreads: readonly {
64
+ legacyThreadId: string;
65
+ newProjectId: ProjectId;
66
+ }[];
67
+ markerPath: string;
68
+ at: Date;
69
+ }
70
+ /** Event emitted on successful migration (`kind === 'migrated'` only). */
71
+ export interface FilesystemMigrationEvent {
72
+ type: 'filesystem.migrated';
73
+ result: FilesystemMigrationResult;
74
+ }
75
+ /** Sink contract — one `emit` method. */
76
+ export interface FilesystemMigrationSink {
77
+ emit(event: FilesystemMigrationEvent): void;
78
+ }
79
+ export declare const NOOP_FILESYSTEM_MIGRATION_SINK: FilesystemMigrationSink;
80
+ /** Interface so consumers can inject a stub migrator in tests. */
81
+ export interface FilesystemMigrator {
82
+ migrate(rootDir: string): Promise<FilesystemMigrationResult>;
83
+ }
84
+ /**
85
+ * Default implementation. Migration is driven by the contract documented in
86
+ * the module header — readers should trace concerns to this comment rather
87
+ * than re-deriving from code.
88
+ */
89
+ export declare class DefaultFilesystemMigrator implements FilesystemMigrator {
90
+ private readonly sink;
91
+ constructor(sink?: FilesystemMigrationSink);
92
+ migrate(rootDir: string): Promise<FilesystemMigrationResult>;
93
+ }
94
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../src/session/migration/filesystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAItE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAA2B,SAAS,CAAA;AAE1E,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,gBAAgB,CAAA;AAE1D,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,UAAU,CAAA;AAExC,4CAA4C;AAC5C,eAAO,MAAM,eAAe,QAA+B,CAAA;AAE3D,oDAAoD;AACpD,eAAO,MAAM,aAAa,QAAmC,CAAA;AAK7D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;IACxD,eAAe,EAAE,SAAS;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,SAAS,CAAA;KAAE,EAAE,CAAA;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,IAAI,CAAA;CACR;AAED,0EAA0E;AAC1E,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,MAAM,EAAE,yBAAyB,CAAA;CACjC;AAED,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAC3C;AAED,eAAO,MAAM,8BAA8B,EAAE,uBAE5C,CAAA;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;CAC5D;AAyCD;;;;GAIG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,uBAAwD;IAErF,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CA0NlE"}