@namzu/sdk 0.1.7 → 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 (532) hide show
  1. package/CHANGELOG.md +23 -5
  2. package/README.md +14 -9
  3. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  4. package/dist/agents/ReactiveAgent.js +5 -3
  5. package/dist/agents/ReactiveAgent.js.map +1 -1
  6. package/dist/agents/RouterAgent.d.ts.map +1 -1
  7. package/dist/agents/RouterAgent.js +3 -0
  8. package/dist/agents/RouterAgent.js.map +1 -1
  9. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  10. package/dist/agents/SupervisorAgent.js +18 -5
  11. package/dist/agents/SupervisorAgent.js.map +1 -1
  12. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  13. package/dist/bridge/a2a/mapper.js +6 -0
  14. package/dist/bridge/a2a/mapper.js.map +1 -1
  15. package/dist/bridge/a2a/task.d.ts +2 -2
  16. package/dist/bridge/a2a/task.d.ts.map +1 -1
  17. package/dist/bridge/a2a/task.js.map +1 -1
  18. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  19. package/dist/bridge/sse/mapper.js +6 -0
  20. package/dist/bridge/sse/mapper.js.map +1 -1
  21. package/dist/constants/a2a/index.d.ts +2 -2
  22. package/dist/constants/a2a/index.d.ts.map +1 -1
  23. package/dist/constants/a2a/index.js.map +1 -1
  24. package/dist/contracts/api.d.ts +22 -3
  25. package/dist/contracts/api.d.ts.map +1 -1
  26. package/dist/contracts/index.d.ts +3 -1
  27. package/dist/contracts/index.d.ts.map +1 -1
  28. package/dist/contracts/index.js.map +1 -1
  29. package/dist/gateway/local.d.ts.map +1 -1
  30. package/dist/gateway/local.js +6 -0
  31. package/dist/gateway/local.js.map +1 -1
  32. package/dist/index.d.ts +4 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
  37. package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
  38. package/dist/manager/agent/__tests__/lifecycle.test.js +302 -0
  39. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
  40. package/dist/manager/agent/lifecycle.d.ts +58 -3
  41. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  42. package/dist/manager/agent/lifecycle.js +311 -12
  43. package/dist/manager/agent/lifecycle.js.map +1 -1
  44. package/dist/manager/run/persistence.d.ts +8 -1
  45. package/dist/manager/run/persistence.d.ts.map +1 -1
  46. package/dist/manager/run/persistence.js +15 -0
  47. package/dist/manager/run/persistence.js.map +1 -1
  48. package/dist/run/reporter.d.ts.map +1 -1
  49. package/dist/run/reporter.js +25 -0
  50. package/dist/run/reporter.js.map +1 -1
  51. package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
  52. package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
  53. package/dist/runtime/query/__tests__/context.test.js +84 -0
  54. package/dist/runtime/query/__tests__/context.test.js.map +1 -0
  55. package/dist/runtime/query/context.d.ts +55 -2
  56. package/dist/runtime/query/context.d.ts.map +1 -1
  57. package/dist/runtime/query/context.js +48 -8
  58. package/dist/runtime/query/context.js.map +1 -1
  59. package/dist/runtime/query/events.d.ts.map +1 -1
  60. package/dist/runtime/query/events.js +8 -0
  61. package/dist/runtime/query/events.js.map +1 -1
  62. package/dist/runtime/query/index.d.ts +25 -2
  63. package/dist/runtime/query/index.d.ts.map +1 -1
  64. package/dist/runtime/query/index.js +11 -1
  65. package/dist/runtime/query/index.js.map +1 -1
  66. package/dist/session/__tests__/integration/_fixtures.d.ts +115 -0
  67. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
  68. package/dist/session/__tests__/integration/_fixtures.js +198 -0
  69. package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
  70. package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
  71. package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
  72. package/dist/session/__tests__/integration/capacity-caps.test.js +116 -0
  73. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
  74. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
  75. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
  76. package/dist/session/__tests__/integration/e2e-spawn.test.js +226 -0
  77. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
  78. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
  79. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
  80. package/dist/session/__tests__/integration/event-stream-ordering.test.js +323 -0
  81. package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
  82. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
  83. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
  84. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +170 -0
  85. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
  86. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
  87. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
  88. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +146 -0
  89. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
  90. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
  91. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
  92. package/dist/session/__tests__/integration/handoff-single-e2e.test.js +163 -0
  93. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
  94. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
  95. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
  96. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +157 -0
  97. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
  98. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
  99. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
  100. package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
  101. package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
  102. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
  103. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
  104. package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
  105. package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
  106. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
  107. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
  108. package/dist/session/__tests__/integration/prev-artifact-dag.test.js +241 -0
  109. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
  110. package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
  111. package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
  112. package/dist/session/__tests__/integration/retention-archive.test.js +186 -0
  113. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
  114. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
  115. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
  116. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +200 -0
  117. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
  118. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
  119. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
  120. package/dist/session/__tests__/integration/tenant-isolation.test.js +180 -0
  121. package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
  122. package/dist/session/errors.d.ts +60 -0
  123. package/dist/session/errors.d.ts.map +1 -0
  124. package/dist/session/errors.js +50 -0
  125. package/dist/session/errors.js.map +1 -0
  126. package/dist/session/events/index.d.ts +4 -0
  127. package/dist/session/events/index.d.ts.map +1 -0
  128. package/dist/session/events/index.js +8 -0
  129. package/dist/session/events/index.js.map +1 -0
  130. package/dist/session/events/schema-version.d.ts +13 -0
  131. package/dist/session/events/schema-version.d.ts.map +1 -0
  132. package/dist/session/events/schema-version.js +12 -0
  133. package/dist/session/events/schema-version.js.map +1 -0
  134. package/dist/session/events/types.d.ts +64 -0
  135. package/dist/session/events/types.d.ts.map +1 -0
  136. package/dist/session/events/types.js +2 -0
  137. package/dist/session/events/types.js.map +1 -0
  138. package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
  139. package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
  140. package/dist/session/handoff/__tests__/broadcast.test.js +243 -0
  141. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
  142. package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
  143. package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
  144. package/dist/session/handoff/__tests__/capacity.test.js +100 -0
  145. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
  146. package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
  147. package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
  148. package/dist/session/handoff/__tests__/single.test.js +230 -0
  149. package/dist/session/handoff/__tests__/single.test.js.map +1 -0
  150. package/dist/session/handoff/assignment.d.ts +59 -0
  151. package/dist/session/handoff/assignment.d.ts.map +1 -0
  152. package/dist/session/handoff/assignment.js +11 -0
  153. package/dist/session/handoff/assignment.js.map +1 -0
  154. package/dist/session/handoff/broadcast.d.ts +47 -0
  155. package/dist/session/handoff/broadcast.d.ts.map +1 -0
  156. package/dist/session/handoff/broadcast.js +296 -0
  157. package/dist/session/handoff/broadcast.js.map +1 -0
  158. package/dist/session/handoff/capacity.d.ts +66 -0
  159. package/dist/session/handoff/capacity.d.ts.map +1 -0
  160. package/dist/session/handoff/capacity.js +60 -0
  161. package/dist/session/handoff/capacity.js.map +1 -0
  162. package/dist/session/handoff/events.d.ts +66 -0
  163. package/dist/session/handoff/events.d.ts.map +1 -0
  164. package/dist/session/handoff/events.js +13 -0
  165. package/dist/session/handoff/events.js.map +1 -0
  166. package/dist/session/handoff/index.d.ts +12 -0
  167. package/dist/session/handoff/index.d.ts.map +1 -0
  168. package/dist/session/handoff/index.js +9 -0
  169. package/dist/session/handoff/index.js.map +1 -0
  170. package/dist/session/handoff/single.d.ts +62 -0
  171. package/dist/session/handoff/single.d.ts.map +1 -0
  172. package/dist/session/handoff/single.js +217 -0
  173. package/dist/session/handoff/single.js.map +1 -0
  174. package/dist/session/handoff/version.d.ts +52 -0
  175. package/dist/session/handoff/version.d.ts.map +1 -0
  176. package/dist/session/handoff/version.js +36 -0
  177. package/dist/session/handoff/version.js.map +1 -0
  178. package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
  179. package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
  180. package/dist/session/hierarchy/__tests__/session.test.js +67 -0
  181. package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
  182. package/dist/session/hierarchy/actor.d.ts +26 -0
  183. package/dist/session/hierarchy/actor.d.ts.map +1 -0
  184. package/dist/session/hierarchy/actor.js +2 -0
  185. package/dist/session/hierarchy/actor.js.map +1 -0
  186. package/dist/session/hierarchy/index.d.ts +8 -0
  187. package/dist/session/hierarchy/index.d.ts.map +1 -0
  188. package/dist/session/hierarchy/index.js +4 -0
  189. package/dist/session/hierarchy/index.js.map +1 -0
  190. package/dist/session/hierarchy/lineage.d.ts +15 -0
  191. package/dist/session/hierarchy/lineage.d.ts.map +1 -0
  192. package/dist/session/hierarchy/lineage.js +2 -0
  193. package/dist/session/hierarchy/lineage.js.map +1 -0
  194. package/dist/session/hierarchy/project.d.ts +40 -0
  195. package/dist/session/hierarchy/project.d.ts.map +1 -0
  196. package/dist/session/hierarchy/project.js +2 -0
  197. package/dist/session/hierarchy/project.js.map +1 -0
  198. package/dist/session/hierarchy/session.d.ts +59 -0
  199. package/dist/session/hierarchy/session.d.ts.map +1 -0
  200. package/dist/session/hierarchy/session.js +51 -0
  201. package/dist/session/hierarchy/session.js.map +1 -0
  202. package/dist/session/hierarchy/sub-session.d.ts +76 -0
  203. package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
  204. package/dist/session/hierarchy/sub-session.js +2 -0
  205. package/dist/session/hierarchy/sub-session.js.map +1 -0
  206. package/dist/session/hierarchy/tenant.d.ts +13 -0
  207. package/dist/session/hierarchy/tenant.d.ts.map +1 -0
  208. package/dist/session/hierarchy/tenant.js +2 -0
  209. package/dist/session/hierarchy/tenant.js.map +1 -0
  210. package/dist/session/index.d.ts +10 -0
  211. package/dist/session/index.d.ts.map +1 -0
  212. package/dist/session/index.js +15 -0
  213. package/dist/session/index.js.map +1 -0
  214. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
  215. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
  216. package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
  217. package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
  218. package/dist/session/intervention/index.d.ts +3 -0
  219. package/dist/session/intervention/index.d.ts.map +1 -0
  220. package/dist/session/intervention/index.js +8 -0
  221. package/dist/session/intervention/index.js.map +1 -0
  222. package/dist/session/intervention/prev-artifact.d.ts +103 -0
  223. package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
  224. package/dist/session/intervention/prev-artifact.js +112 -0
  225. package/dist/session/intervention/prev-artifact.js.map +1 -0
  226. package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
  227. package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
  228. package/dist/session/migration/__tests__/filesystem.test.js +188 -0
  229. package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
  230. package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
  231. package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
  232. package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
  233. package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
  234. package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
  235. package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
  236. package/dist/session/migration/__tests__/marker.test.js +75 -0
  237. package/dist/session/migration/__tests__/marker.test.js.map +1 -0
  238. package/dist/session/migration/errors.d.ts +26 -0
  239. package/dist/session/migration/errors.d.ts.map +1 -0
  240. package/dist/session/migration/errors.js +22 -0
  241. package/dist/session/migration/errors.js.map +1 -0
  242. package/dist/session/migration/filesystem.d.ts +94 -0
  243. package/dist/session/migration/filesystem.d.ts.map +1 -0
  244. package/dist/session/migration/filesystem.js +319 -0
  245. package/dist/session/migration/filesystem.js.map +1 -0
  246. package/dist/session/migration/id-prefix.d.ts +98 -0
  247. package/dist/session/migration/id-prefix.d.ts.map +1 -0
  248. package/dist/session/migration/id-prefix.js +116 -0
  249. package/dist/session/migration/id-prefix.js.map +1 -0
  250. package/dist/session/migration/index.d.ts +8 -0
  251. package/dist/session/migration/index.d.ts.map +1 -0
  252. package/dist/session/migration/index.js +8 -0
  253. package/dist/session/migration/index.js.map +1 -0
  254. package/dist/session/migration/marker.d.ts +57 -0
  255. package/dist/session/migration/marker.d.ts.map +1 -0
  256. package/dist/session/migration/marker.js +111 -0
  257. package/dist/session/migration/marker.js.map +1 -0
  258. package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
  259. package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
  260. package/dist/session/retention/__tests__/archive.test.js +252 -0
  261. package/dist/session/retention/__tests__/archive.test.js.map +1 -0
  262. package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
  263. package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
  264. package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
  265. package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
  266. package/dist/session/retention/archive-backend-ref.d.ts +18 -0
  267. package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
  268. package/dist/session/retention/archive-backend-ref.js +2 -0
  269. package/dist/session/retention/archive-backend-ref.js.map +1 -0
  270. package/dist/session/retention/archive.d.ts +130 -0
  271. package/dist/session/retention/archive.d.ts.map +1 -0
  272. package/dist/session/retention/archive.js +203 -0
  273. package/dist/session/retention/archive.js.map +1 -0
  274. package/dist/session/retention/backend.d.ts +101 -0
  275. package/dist/session/retention/backend.d.ts.map +1 -0
  276. package/dist/session/retention/backend.js +15 -0
  277. package/dist/session/retention/backend.js.map +1 -0
  278. package/dist/session/retention/disk-backend.d.ts +59 -0
  279. package/dist/session/retention/disk-backend.d.ts.map +1 -0
  280. package/dist/session/retention/disk-backend.js +236 -0
  281. package/dist/session/retention/disk-backend.js.map +1 -0
  282. package/dist/session/retention/index.d.ts +9 -0
  283. package/dist/session/retention/index.d.ts.map +1 -0
  284. package/dist/session/retention/index.js +6 -0
  285. package/dist/session/retention/index.js.map +1 -0
  286. package/dist/session/retention/policy.d.ts +49 -0
  287. package/dist/session/retention/policy.d.ts.map +1 -0
  288. package/dist/session/retention/policy.js +21 -0
  289. package/dist/session/retention/policy.js.map +1 -0
  290. package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
  291. package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
  292. package/dist/session/summary/__tests__/materialize.test.js +269 -0
  293. package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
  294. package/dist/session/summary/deliverable.d.ts +74 -0
  295. package/dist/session/summary/deliverable.d.ts.map +1 -0
  296. package/dist/session/summary/deliverable.js +20 -0
  297. package/dist/session/summary/deliverable.js.map +1 -0
  298. package/dist/session/summary/index.d.ts +6 -0
  299. package/dist/session/summary/index.d.ts.map +1 -0
  300. package/dist/session/summary/index.js +9 -0
  301. package/dist/session/summary/index.js.map +1 -0
  302. package/dist/session/summary/materialize.d.ts +82 -0
  303. package/dist/session/summary/materialize.d.ts.map +1 -0
  304. package/dist/session/summary/materialize.js +117 -0
  305. package/dist/session/summary/materialize.js.map +1 -0
  306. package/dist/session/summary/ref.d.ts +91 -0
  307. package/dist/session/summary/ref.d.ts.map +1 -0
  308. package/dist/session/summary/ref.js +51 -0
  309. package/dist/session/summary/ref.js.map +1 -0
  310. package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
  311. package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
  312. package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
  313. package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
  314. package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
  315. package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
  316. package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
  317. package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
  318. package/dist/session/workspace/driver.d.ts +55 -0
  319. package/dist/session/workspace/driver.d.ts.map +1 -0
  320. package/dist/session/workspace/driver.js +12 -0
  321. package/dist/session/workspace/driver.js.map +1 -0
  322. package/dist/session/workspace/git-worktree.d.ts +65 -0
  323. package/dist/session/workspace/git-worktree.d.ts.map +1 -0
  324. package/dist/session/workspace/git-worktree.js +156 -0
  325. package/dist/session/workspace/git-worktree.js.map +1 -0
  326. package/dist/session/workspace/index.d.ts +8 -0
  327. package/dist/session/workspace/index.d.ts.map +1 -0
  328. package/dist/session/workspace/index.js +7 -0
  329. package/dist/session/workspace/index.js.map +1 -0
  330. package/dist/session/workspace/path-builder.d.ts +50 -0
  331. package/dist/session/workspace/path-builder.d.ts.map +1 -0
  332. package/dist/session/workspace/path-builder.js +50 -0
  333. package/dist/session/workspace/path-builder.js.map +1 -0
  334. package/dist/session/workspace/ref.d.ts +46 -0
  335. package/dist/session/workspace/ref.d.ts.map +1 -0
  336. package/dist/session/workspace/ref.js +11 -0
  337. package/dist/session/workspace/ref.js.map +1 -0
  338. package/dist/session/workspace/registry.d.ts +26 -0
  339. package/dist/session/workspace/registry.d.ts.map +1 -0
  340. package/dist/session/workspace/registry.js +35 -0
  341. package/dist/session/workspace/registry.js.map +1 -0
  342. package/dist/store/conversation/memory.d.ts +22 -0
  343. package/dist/store/conversation/memory.d.ts.map +1 -1
  344. package/dist/store/conversation/memory.js +22 -0
  345. package/dist/store/conversation/memory.js.map +1 -1
  346. package/dist/store/session/__tests__/disk.test.d.ts +2 -0
  347. package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
  348. package/dist/store/session/__tests__/disk.test.js +240 -0
  349. package/dist/store/session/__tests__/disk.test.js.map +1 -0
  350. package/dist/store/session/__tests__/memory.test.d.ts +2 -0
  351. package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
  352. package/dist/store/session/__tests__/memory.test.js +217 -0
  353. package/dist/store/session/__tests__/memory.test.js.map +1 -0
  354. package/dist/store/session/disk.d.ts +85 -0
  355. package/dist/store/session/disk.d.ts.map +1 -0
  356. package/dist/store/session/disk.js +757 -0
  357. package/dist/store/session/disk.js.map +1 -0
  358. package/dist/store/session/index.d.ts +7 -0
  359. package/dist/store/session/index.d.ts.map +1 -0
  360. package/dist/store/session/index.js +11 -0
  361. package/dist/store/session/index.js.map +1 -0
  362. package/dist/store/session/linkage.d.ts +38 -0
  363. package/dist/store/session/linkage.d.ts.map +1 -0
  364. package/dist/store/session/linkage.js +64 -0
  365. package/dist/store/session/linkage.js.map +1 -0
  366. package/dist/store/session/memory.d.ts +48 -0
  367. package/dist/store/session/memory.d.ts.map +1 -0
  368. package/dist/store/session/memory.js +322 -0
  369. package/dist/store/session/memory.js.map +1 -0
  370. package/dist/store/session/messages.d.ts +20 -0
  371. package/dist/store/session/messages.d.ts.map +1 -0
  372. package/dist/store/session/messages.js +12 -0
  373. package/dist/store/session/messages.js.map +1 -0
  374. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
  375. package/dist/types/agent/base.d.ts +28 -1
  376. package/dist/types/agent/base.d.ts.map +1 -1
  377. package/dist/types/agent/task.d.ts +50 -2
  378. package/dist/types/agent/task.d.ts.map +1 -1
  379. package/dist/types/agent/task.js.map +1 -1
  380. package/dist/types/conversation/index.d.ts +7 -0
  381. package/dist/types/conversation/index.d.ts.map +1 -1
  382. package/dist/types/ids/index.d.ts +26 -3
  383. package/dist/types/ids/index.d.ts.map +1 -1
  384. package/dist/types/ids/index.js +8 -1
  385. package/dist/types/ids/index.js.map +1 -1
  386. package/dist/types/invocation/__tests__/state.test.js +36 -29
  387. package/dist/types/invocation/__tests__/state.test.js.map +1 -1
  388. package/dist/types/invocation/index.d.ts +20 -4
  389. package/dist/types/invocation/index.d.ts.map +1 -1
  390. package/dist/types/invocation/index.js +10 -7
  391. package/dist/types/invocation/index.js.map +1 -1
  392. package/dist/types/run/config.d.ts +11 -1
  393. package/dist/types/run/config.d.ts.map +1 -1
  394. package/dist/types/run/events.d.ts +26 -1
  395. package/dist/types/run/events.d.ts.map +1 -1
  396. package/dist/types/run/index.d.ts.map +1 -1
  397. package/dist/types/run/index.js +8 -0
  398. package/dist/types/run/index.js.map +1 -1
  399. package/dist/types/run/metadata.d.ts +24 -1
  400. package/dist/types/run/metadata.d.ts.map +1 -1
  401. package/dist/types/run/status.d.ts +26 -0
  402. package/dist/types/run/status.d.ts.map +1 -0
  403. package/dist/types/run/status.js +2 -0
  404. package/dist/types/run/status.js.map +1 -0
  405. package/dist/types/session/ids.d.ts +18 -0
  406. package/dist/types/session/ids.d.ts.map +1 -0
  407. package/dist/types/session/ids.js +12 -0
  408. package/dist/types/session/ids.js.map +1 -0
  409. package/dist/types/session/index.d.ts +3 -0
  410. package/dist/types/session/index.d.ts.map +1 -0
  411. package/dist/types/session/index.js +5 -0
  412. package/dist/types/session/index.js.map +1 -0
  413. package/dist/types/session/store.d.ts +188 -0
  414. package/dist/types/session/store.d.ts.map +1 -0
  415. package/dist/types/session/store.js +14 -0
  416. package/dist/types/session/store.js.map +1 -0
  417. package/dist/utils/id.d.ts +18 -1
  418. package/dist/utils/id.d.ts.map +1 -1
  419. package/dist/utils/id.js +42 -4
  420. package/dist/utils/id.js.map +1 -1
  421. package/package.json +1 -1
  422. package/src/agents/ReactiveAgent.ts +7 -3
  423. package/src/agents/RouterAgent.ts +5 -0
  424. package/src/agents/SupervisorAgent.ts +26 -6
  425. package/src/bridge/a2a/mapper.ts +7 -0
  426. package/src/bridge/a2a/task.ts +2 -2
  427. package/src/bridge/sse/mapper.ts +8 -1
  428. package/src/constants/a2a/index.ts +2 -2
  429. package/src/contracts/api.ts +23 -3
  430. package/src/contracts/index.ts +2 -0
  431. package/src/gateway/local.ts +6 -0
  432. package/src/index.ts +14 -0
  433. package/src/manager/agent/__tests__/lifecycle.test.ts +452 -0
  434. package/src/manager/agent/lifecycle.ts +434 -19
  435. package/src/manager/run/persistence.ts +20 -1
  436. package/src/run/reporter.ts +28 -0
  437. package/src/runtime/query/__tests__/context.test.ts +101 -0
  438. package/src/runtime/query/context.ts +106 -10
  439. package/src/runtime/query/events.ts +8 -0
  440. package/src/runtime/query/index.ts +41 -3
  441. package/src/session/__tests__/integration/_fixtures.ts +282 -0
  442. package/src/session/__tests__/integration/capacity-caps.test.ts +164 -0
  443. package/src/session/__tests__/integration/e2e-spawn.test.ts +278 -0
  444. package/src/session/__tests__/integration/event-stream-ordering.test.ts +403 -0
  445. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +245 -0
  446. package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +179 -0
  447. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +220 -0
  448. package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +237 -0
  449. package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
  450. package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
  451. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +318 -0
  452. package/src/session/__tests__/integration/retention-archive.test.ts +231 -0
  453. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +237 -0
  454. package/src/session/__tests__/integration/tenant-isolation.test.ts +282 -0
  455. package/src/session/errors.ts +70 -0
  456. package/src/session/events/index.ts +16 -0
  457. package/src/session/events/schema-version.ts +13 -0
  458. package/src/session/events/types.ts +71 -0
  459. package/src/session/handoff/__tests__/broadcast.test.ts +350 -0
  460. package/src/session/handoff/__tests__/capacity.test.ts +123 -0
  461. package/src/session/handoff/__tests__/single.test.ts +316 -0
  462. package/src/session/handoff/assignment.ts +62 -0
  463. package/src/session/handoff/broadcast.ts +381 -0
  464. package/src/session/handoff/capacity.ts +121 -0
  465. package/src/session/handoff/events.ts +72 -0
  466. package/src/session/handoff/index.ts +29 -0
  467. package/src/session/handoff/single.ts +288 -0
  468. package/src/session/handoff/version.ts +59 -0
  469. package/src/session/hierarchy/__tests__/session.test.ts +92 -0
  470. package/src/session/hierarchy/actor.ts +17 -0
  471. package/src/session/hierarchy/index.ts +17 -0
  472. package/src/session/hierarchy/lineage.ts +15 -0
  473. package/src/session/hierarchy/project.ts +41 -0
  474. package/src/session/hierarchy/session.ts +97 -0
  475. package/src/session/hierarchy/sub-session.ts +92 -0
  476. package/src/session/hierarchy/tenant.ts +13 -0
  477. package/src/session/index.ts +15 -0
  478. package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
  479. package/src/session/intervention/index.ts +16 -0
  480. package/src/session/intervention/prev-artifact.ts +180 -0
  481. package/src/session/migration/__tests__/filesystem.test.ts +263 -0
  482. package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
  483. package/src/session/migration/__tests__/marker.test.ts +84 -0
  484. package/src/session/migration/errors.ts +23 -0
  485. package/src/session/migration/filesystem.ts +401 -0
  486. package/src/session/migration/id-prefix.ts +146 -0
  487. package/src/session/migration/index.ts +38 -0
  488. package/src/session/migration/marker.ts +131 -0
  489. package/src/session/retention/__tests__/archive.test.ts +316 -0
  490. package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
  491. package/src/session/retention/archive-backend-ref.ts +17 -0
  492. package/src/session/retention/archive.ts +281 -0
  493. package/src/session/retention/backend.ts +107 -0
  494. package/src/session/retention/disk-backend.ts +304 -0
  495. package/src/session/retention/index.ts +16 -0
  496. package/src/session/retention/policy.ts +53 -0
  497. package/src/session/summary/__tests__/materialize.test.ts +341 -0
  498. package/src/session/summary/deliverable.ts +84 -0
  499. package/src/session/summary/index.ts +31 -0
  500. package/src/session/summary/materialize.ts +169 -0
  501. package/src/session/summary/ref.ts +104 -0
  502. package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
  503. package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
  504. package/src/session/workspace/driver.ts +60 -0
  505. package/src/session/workspace/git-worktree.ts +209 -0
  506. package/src/session/workspace/index.ts +25 -0
  507. package/src/session/workspace/path-builder.ts +71 -0
  508. package/src/session/workspace/ref.ts +50 -0
  509. package/src/session/workspace/registry.ts +42 -0
  510. package/src/store/conversation/memory.ts +23 -0
  511. package/src/store/session/__tests__/disk.test.ts +346 -0
  512. package/src/store/session/__tests__/memory.test.ts +327 -0
  513. package/src/store/session/disk.ts +920 -0
  514. package/src/store/session/index.ts +14 -0
  515. package/src/store/session/linkage.ts +80 -0
  516. package/src/store/session/memory.ts +400 -0
  517. package/src/store/session/messages.ts +21 -0
  518. package/src/types/agent/base.ts +31 -1
  519. package/src/types/agent/task.ts +58 -2
  520. package/src/types/conversation/index.ts +7 -0
  521. package/src/types/ids/index.ts +41 -3
  522. package/src/types/invocation/__tests__/state.test.ts +37 -29
  523. package/src/types/invocation/index.ts +26 -10
  524. package/src/types/run/config.ts +12 -1
  525. package/src/types/run/events.ts +36 -1
  526. package/src/types/run/index.ts +8 -0
  527. package/src/types/run/metadata.ts +24 -1
  528. package/src/types/run/status.ts +33 -0
  529. package/src/types/session/ids.ts +34 -0
  530. package/src/types/session/index.ts +28 -0
  531. package/src/types/session/store.ts +229 -0
  532. package/src/utils/id.ts +55 -4
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Pure Run→Session fan-in helper per session-hierarchy.md §5.1.
3
+ *
4
+ * The precedence (highest first) matches the pattern-doc table:
5
+ * 1. Session-level states that do not fan in from Run status:
6
+ * - `locked` (handoff CAS window) — preserved verbatim
7
+ * - `awaiting_merge` (broadcast source post-fan-out, §5.4) — preserved
8
+ * - `archived` (retention tombstone, §12.3) — preserved
9
+ * 2. Any Run `running` or `awaiting_subsession` → Session `active`.
10
+ * Delegation-in-flight is an active state of the parent — the parent
11
+ * Run is suspended waiting on the child's SessionSummaryMaterializer,
12
+ * and the session is NOT idle while that is pending.
13
+ * 3. Any Run `awaiting_hitl` or `awaiting_hitl_resolution` → Session
14
+ * `awaiting_hitl`.
15
+ * 4. All Runs `failed` and at least one Run present → Session `failed`.
16
+ * 5. Otherwise (all runs terminal — succeeded/cancelled/failed mix, or no
17
+ * runs at all) → Session `idle`.
18
+ *
19
+ * `cancelled` does NOT surface a `failed` Session (§5.1 — "Cancellation is
20
+ * not a terminal Session state"). Only `failed` runs drive the Session to
21
+ * `failed` when every Run ended that way.
22
+ */
23
+ export function deriveStatus(session, runs) {
24
+ // Session-level overrides — these states do not fan in from Run status.
25
+ if (session.status === 'locked')
26
+ return 'locked';
27
+ if (session.status === 'awaiting_merge')
28
+ return 'awaiting_merge';
29
+ if (session.status === 'archived')
30
+ return 'archived';
31
+ // Any active Run (in-flight iteration or awaiting a child sub-session) →
32
+ // `active`. Delegation is an active state: the parent Run is suspended
33
+ // waiting on the child's Materializer, not idle.
34
+ const hasActive = runs.some((r) => r.status === 'running' || r.status === 'awaiting_subsession');
35
+ if (hasActive)
36
+ return 'active';
37
+ // Any HITL block (synchronous or persisted) → `awaiting_hitl`.
38
+ const hasHitl = runs.some((r) => r.status === 'awaiting_hitl' || r.status === 'awaiting_hitl_resolution');
39
+ if (hasHitl)
40
+ return 'awaiting_hitl';
41
+ // All failed (with at least one Run) → `failed`. Note that a `cancelled`
42
+ // Run does NOT drive the Session to `failed`; §5.1 is explicit that
43
+ // cancellation leaves the Session `idle`.
44
+ if (runs.length > 0 && runs.every((r) => r.status === 'failed')) {
45
+ return 'failed';
46
+ }
47
+ // Otherwise — empty run set, or all runs terminated (succeeded / cancelled
48
+ // / mixed with failed) — the Session is `idle`.
49
+ return 'idle';
50
+ }
51
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/session/hierarchy/session.ts"],"names":[],"mappings":"AA2CA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY,CAC3B,OAAgB,EAChB,IAAsC;IAEtC,wEAAwE;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAChD,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB;QAAE,OAAO,gBAAgB,CAAA;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,UAAU,CAAA;IAEpD,yEAAyE;IACzE,uEAAuE;IACvE,iDAAiD;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAA;IAChG,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAA;IAE9B,+DAA+D;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,MAAM,KAAK,0BAA0B,CAC9E,CAAA;IACD,IAAI,OAAO;QAAE,OAAO,eAAe,CAAA;IAEnC,yEAAyE;IACzE,oEAAoE;IACpE,0CAA0C;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjE,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,2EAA2E;IAC3E,gDAAgD;IAChD,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { SessionId } from '../../types/ids/index.js';
2
+ import type { SubSessionId, SummaryId, WorkspaceId } from '../../types/session/ids.js';
3
+ import type { ArchiveBackendRef } from '../retention/archive-backend-ref.js';
4
+ import type { DeliverableRef } from '../summary/deliverable.js';
5
+ import type { ActorRef } from './actor.js';
6
+ /**
7
+ * Full 11-variant status union. See session-hierarchy.md §4.4 and the merge
8
+ * state machine in §4.4.1. Absence of a `closed` state is load-bearing —
9
+ * completed sub-sessions land on `idle` and stay there for drill-down
10
+ * (Decision #5).
11
+ */
12
+ export type SubSessionStatus = 'pending' | 'active' | 'idle' | 'failed' | 'awaiting_merge' | 'pending_merge' | 'merging' | 'merged' | 'merge_conflict' | 'merge_rejected' | 'archived';
13
+ /**
14
+ * Discriminator for how a sub-session was created. Pattern doc §4.4
15
+ * enumerates four variants; the three kept here collapse `user_handoff`
16
+ * and `user_broadcast` into the single `user_handoff` kind (multi-recipient
17
+ * flows are encoded via `broadcastGroupId` in later phases).
18
+ */
19
+ export type SubSessionKind = 'agent_spawn' | 'user_handoff' | 'intervention';
20
+ /**
21
+ * Per-spawn failure policy for parallel fan-out. See session-hierarchy.md
22
+ * §4.4. Default is `delegate` — siblings continue and the parent agent
23
+ * decides what to do with partial results.
24
+ */
25
+ export type FailureMode = 'fail_fast' | 'delegate';
26
+ /**
27
+ * Completion contract the parent expects. See session-hierarchy.md §9.
28
+ *
29
+ * `summary_ref` is the default for agent delegation and interventions.
30
+ * `merge_back` is used by multi-user handoff; full spec lives in
31
+ * `collaboration-primitives.md`.
32
+ */
33
+ export type CompletionMode = 'summary_ref' | 'merge_back';
34
+ /**
35
+ * Re-export of the real {@link DeliverableRef} discriminated union. The
36
+ * concrete shape lives in `../summary/deliverable.ts` — see
37
+ * session-hierarchy.md §4.7 / §8.1. Phase 5 (this phase) replaced the Phase 1
38
+ * `unknown` placeholder with the real type.
39
+ */
40
+ export type { DeliverableRef };
41
+ /**
42
+ * Edge between a parent {@link Session} and a child session, carrying the
43
+ * delegation metadata. The child session itself lives in `SessionStore`
44
+ * like any other session — see session-hierarchy.md §4.4.
45
+ */
46
+ export interface SubSession {
47
+ id: SubSessionId;
48
+ parentSessionId: SessionId;
49
+ childSessionId: SessionId;
50
+ kind: SubSessionKind;
51
+ status: SubSessionStatus;
52
+ spawnedBy: ActorRef;
53
+ spawnedAt: Date;
54
+ failureMode: FailureMode;
55
+ completionMode: CompletionMode;
56
+ workspaceId: WorkspaceId | null;
57
+ /**
58
+ * For interventions, the immutable artifact being addressed. Chains form
59
+ * a strict acyclic DAG — see session-hierarchy.md §4.5.
60
+ */
61
+ prevArtifactRef?: DeliverableRef;
62
+ /** Fan-out bookkeeping for broadcasts (§4.4). */
63
+ broadcastGroupId?: string;
64
+ /** Populated by {@link SessionSummaryMaterializer} on terminalization (§8). */
65
+ summaryRef?: SummaryId;
66
+ /**
67
+ * Pointer to the archive bundle for this sub-session. Present iff
68
+ * `status === 'archived'` (pattern doc §12.3). The paired
69
+ * {@link archivedAt} timestamp captures when the bundle was sealed.
70
+ * Cleared by {@link ArchivalManager.restore}.
71
+ */
72
+ archiveRef?: ArchiveBackendRef;
73
+ archivedAt?: Date;
74
+ updatedAt: Date;
75
+ }
76
+ //# sourceMappingURL=sub-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-session.d.ts","sourceRoot":"","sources":["../../../src/session/hierarchy/sub-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACzB,SAAS,GACT,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,gBAAgB,GAChB,UAAU,CAAA;AAEb;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,CAAA;AAEzD;;;;;GAKG;AACH,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B;;;;GAIG;AACH,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,YAAY,CAAA;IAChB,eAAe,EAAE,SAAS,CAAA;IAC1B,cAAc,EAAE,SAAS,CAAA;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAA;IACxB,SAAS,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B;;;OAGG;IACH,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,SAAS,EAAE,IAAI,CAAA;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sub-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-session.js","sourceRoot":"","sources":["../../../src/session/hierarchy/sub-session.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { TenantId } from '../../types/ids/index.js';
2
+ /**
3
+ * Tenancy boundary for everything in the hierarchy.
4
+ *
5
+ * Intentionally thin — naming, billing, SSO, and quotas live outside the SDK
6
+ * (session-hierarchy.md §4.1 Convention #17). No API surface crosses
7
+ * {@link TenantId}.
8
+ */
9
+ export interface Tenant {
10
+ id: TenantId;
11
+ createdAt: Date;
12
+ }
13
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/session/hierarchy/tenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACtB,EAAE,EAAE,QAAQ,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../../src/session/hierarchy/tenant.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export * from './hierarchy/index.js';
2
+ export * from './events/index.js';
3
+ export * from './workspace/index.js';
4
+ export * from './handoff/index.js';
5
+ export * from './summary/index.js';
6
+ export * from './intervention/index.js';
7
+ export * from './migration/index.js';
8
+ export * from './retention/index.js';
9
+ export { TenantIsolationError, WorkspaceBackendError, AncestryCycleError } from './errors.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAMA,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,15 @@
1
+ // Top-level barrel for the session hierarchy module.
2
+ // Phase 1 populates `hierarchy/`; Phase 2 adds `events/`; Phase 3 adds
3
+ // `workspace/` + `errors.ts`; Phase 4 adds `handoff/`; Phase 5 adds
4
+ // `summary/` + `intervention/`; Phase 7 adds `migration/`; Phase 8 adds
5
+ // `retention/`.
6
+ export * from './hierarchy/index.js';
7
+ export * from './events/index.js';
8
+ export * from './workspace/index.js';
9
+ export * from './handoff/index.js';
10
+ export * from './summary/index.js';
11
+ export * from './intervention/index.js';
12
+ export * from './migration/index.js';
13
+ export * from './retention/index.js';
14
+ export { TenantIsolationError, WorkspaceBackendError, AncestryCycleError } from './errors.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,uEAAuE;AACvE,oEAAoE;AACpE,wEAAwE;AACxE,gBAAgB;AAEhB,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prev-artifact.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prev-artifact.test.d.ts","sourceRoot":"","sources":["../../../../src/session/intervention/__tests__/prev-artifact.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,179 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { ArtifactRefCycleError, InterventionDepthExceeded, validatePrevArtifactChain, } from '../prev-artifact.js';
3
+ // Helpers -------------------------------------------------------------------
4
+ function sessionId(n) {
5
+ return `ses_${n}`;
6
+ }
7
+ function subId(n) {
8
+ return `sub_${n}`;
9
+ }
10
+ function summaryDeliverable(targetSession) {
11
+ return {
12
+ id: 'del_test',
13
+ kind: 'session_summary',
14
+ sessionId: targetSession,
15
+ summaryRef: 'sum_test',
16
+ at: new Date('2026-04-17T00:00:00Z'),
17
+ };
18
+ }
19
+ /**
20
+ * Build a loader that walks a pre-configured chain. `chain[i]` is the node
21
+ * returned for the i'th step (keyed by the session id the previous step
22
+ * targeted). `nodesBySession` keys the loader by `sessionId`.
23
+ */
24
+ function buildLoader(nodes) {
25
+ const map = new Map();
26
+ for (const n of nodes) {
27
+ map.set(n.bySession, {
28
+ subSessionId: n.subSessionId,
29
+ sessionId: n.sessionId,
30
+ ...(n.prevArtifactRef !== undefined && { prevArtifactRef: n.prevArtifactRef }),
31
+ });
32
+ }
33
+ return {
34
+ loadAncestor: async (sid) => map.get(sid) ?? null,
35
+ };
36
+ }
37
+ describe('validatePrevArtifactChain', () => {
38
+ it('accepts a depth-1 chain (direct parent only)', async () => {
39
+ const loader = buildLoader([
40
+ {
41
+ bySession: sessionId(1),
42
+ subSessionId: subId(1),
43
+ sessionId: sessionId(1),
44
+ // No prevArtifactRef — chain terminates here.
45
+ },
46
+ ]);
47
+ const chain = await validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10);
48
+ expect(chain).toEqual([subId(1)]);
49
+ });
50
+ it('accepts a depth-2 chain', async () => {
51
+ const loader = buildLoader([
52
+ {
53
+ bySession: sessionId(1),
54
+ subSessionId: subId(1),
55
+ sessionId: sessionId(1),
56
+ prevArtifactRef: summaryDeliverable(sessionId(2)),
57
+ },
58
+ {
59
+ bySession: sessionId(2),
60
+ subSessionId: subId(2),
61
+ sessionId: sessionId(2),
62
+ },
63
+ ]);
64
+ const chain = await validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10);
65
+ expect(chain).toEqual([subId(1), subId(2)]);
66
+ });
67
+ it('accepts a chain exactly at the depth limit', async () => {
68
+ // 10-deep chain with maxDepth = 10.
69
+ const nodes = [];
70
+ for (let i = 1; i <= 10; i++) {
71
+ nodes.push({
72
+ bySession: sessionId(i),
73
+ subSessionId: subId(i),
74
+ sessionId: sessionId(i),
75
+ ...(i < 10 && { prevArtifactRef: summaryDeliverable(sessionId(i + 1)) }),
76
+ });
77
+ }
78
+ const loader = buildLoader(nodes);
79
+ const chain = await validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10);
80
+ expect(chain).toHaveLength(10);
81
+ });
82
+ it('rejects a chain that would exceed the depth limit', async () => {
83
+ // 11-deep chain with maxDepth = 10.
84
+ const nodes = [];
85
+ for (let i = 1; i <= 11; i++) {
86
+ nodes.push({
87
+ bySession: sessionId(i),
88
+ subSessionId: subId(i),
89
+ sessionId: sessionId(i),
90
+ ...(i < 11 && { prevArtifactRef: summaryDeliverable(sessionId(i + 1)) }),
91
+ });
92
+ }
93
+ const loader = buildLoader(nodes);
94
+ await expect(validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10)).rejects.toBeInstanceOf(InterventionDepthExceeded);
95
+ });
96
+ it('rejects self-reference as a cycle', async () => {
97
+ // proposedChild's prev points at a node whose subSessionId == proposedChild.
98
+ const loader = buildLoader([
99
+ {
100
+ bySession: sessionId(1),
101
+ subSessionId: subId(100), // SAME id as proposedChild
102
+ sessionId: sessionId(1),
103
+ },
104
+ ]);
105
+ await expect(validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10)).rejects.toBeInstanceOf(ArtifactRefCycleError);
106
+ });
107
+ it('rejects a 2-cycle (A -> B -> A)', async () => {
108
+ const loader = buildLoader([
109
+ {
110
+ bySession: sessionId(1),
111
+ subSessionId: subId(1),
112
+ sessionId: sessionId(1),
113
+ prevArtifactRef: summaryDeliverable(sessionId(2)),
114
+ },
115
+ {
116
+ bySession: sessionId(2),
117
+ subSessionId: subId(2),
118
+ sessionId: sessionId(2),
119
+ prevArtifactRef: summaryDeliverable(sessionId(1)),
120
+ },
121
+ ]);
122
+ await expect(validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10)).rejects.toBeInstanceOf(ArtifactRefCycleError);
123
+ });
124
+ it('rejects a 3-cycle (A -> B -> C -> A)', async () => {
125
+ const loader = buildLoader([
126
+ {
127
+ bySession: sessionId(1),
128
+ subSessionId: subId(1),
129
+ sessionId: sessionId(1),
130
+ prevArtifactRef: summaryDeliverable(sessionId(2)),
131
+ },
132
+ {
133
+ bySession: sessionId(2),
134
+ subSessionId: subId(2),
135
+ sessionId: sessionId(2),
136
+ prevArtifactRef: summaryDeliverable(sessionId(3)),
137
+ },
138
+ {
139
+ bySession: sessionId(3),
140
+ subSessionId: subId(3),
141
+ sessionId: sessionId(3),
142
+ prevArtifactRef: summaryDeliverable(sessionId(1)),
143
+ },
144
+ ]);
145
+ await expect(validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 10)).rejects.toBeInstanceOf(ArtifactRefCycleError);
146
+ });
147
+ it('returns an empty chain for a non-session_summary deliverable', async () => {
148
+ const fileRef = {
149
+ id: 'del_file',
150
+ kind: 'file',
151
+ path: 'a.txt',
152
+ contentHash: 'abc',
153
+ sizeBytes: 0,
154
+ };
155
+ const loader = {
156
+ loadAncestor: async () => null,
157
+ };
158
+ const chain = await validatePrevArtifactChain(loader, subId(100), fileRef, 10);
159
+ expect(chain).toEqual([]);
160
+ });
161
+ it('terminates cleanly on unknown ancestor (archived/tombstoned)', async () => {
162
+ const loader = buildLoader([
163
+ // no matching node — loadAncestor returns null for any id
164
+ ]);
165
+ const chain = await validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(42)), 10);
166
+ expect(chain).toEqual([]);
167
+ });
168
+ it('rejects zero/negative maxDepth as depth-exceeded up front', async () => {
169
+ const loader = buildLoader([
170
+ {
171
+ bySession: sessionId(1),
172
+ subSessionId: subId(1),
173
+ sessionId: sessionId(1),
174
+ },
175
+ ]);
176
+ await expect(validatePrevArtifactChain(loader, subId(100), summaryDeliverable(sessionId(1)), 0)).rejects.toBeInstanceOf(InterventionDepthExceeded);
177
+ });
178
+ });
179
+ //# sourceMappingURL=prev-artifact.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prev-artifact.test.js","sourceRoot":"","sources":["../../../../src/session/intervention/__tests__/prev-artifact.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ArtifactRefCycleError, InterventionDepthExceeded, validatePrevArtifactChain, } from './prev-artifact.js';
2
+ export type { InterventionChainLoader, PrevArtifactNode, } from './prev-artifact.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/intervention/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GACzB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACX,uBAAuB,EACvB,gBAAgB,GAChB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,8 @@
1
+ // Sub-barrel for the intervention DAG module (Convention #4).
2
+ //
3
+ // See session-hierarchy.md §4.5 — intervention chains via `prevArtifactRef`
4
+ // form a strict acyclic DAG capped by
5
+ // `Project.config.maxInterventionDepth`. This module owns the pre-commit
6
+ // validator + typed errors; sub-session wiring is Phase 6.
7
+ export { ArtifactRefCycleError, InterventionDepthExceeded, validatePrevArtifactChain, } from './prev-artifact.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/intervention/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,sCAAsC;AACtC,yEAAyE;AACzE,2DAA2D;AAE3D,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GACzB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * prevArtifactRef DAG primitives — acyclic walker, cycle detection, depth
3
+ * enforcement. See session-hierarchy.md §4.5.
4
+ *
5
+ * Intervention chains link successive follow-up sub-sessions via
6
+ * `SubSession.prevArtifactRef`, forming a strict acyclic DAG over prior
7
+ * completed sessions. This module supplies the pre-commit validator that
8
+ * rejects any insertion that would close a cycle or overflow
9
+ * {@link Project.config.maxInterventionDepth} (default 10).
10
+ *
11
+ * Convention #5: deny-by-default. Cycle or depth violation rejects with a
12
+ * typed error; callers never get a silently-truncated chain.
13
+ *
14
+ * Convention #0: no silent fallbacks. The walker surfaces corruption as
15
+ * `ArtifactRefCycleError` rather than infinite-looping.
16
+ */
17
+ import type { SessionId } from '../../types/ids/index.js';
18
+ import type { SubSessionId } from '../../types/session/ids.js';
19
+ import type { DeliverableRef } from '../summary/deliverable.js';
20
+ /**
21
+ * Minimal record the validator needs to step ancestrally from one
22
+ * sub-session to its predecessor. Concrete stores provide this projection.
23
+ *
24
+ * `sessionId` is the completed session this node represents (the one the
25
+ * incoming {@link DeliverableRef} pointed at). `subSessionId` is its own
26
+ * sub-session edge id — used for the visited-set so intervention chains form
27
+ * an acyclic DAG over sub-session identities.
28
+ */
29
+ export interface PrevArtifactNode {
30
+ readonly subSessionId: SubSessionId;
31
+ readonly sessionId: SessionId;
32
+ readonly prevArtifactRef?: DeliverableRef;
33
+ }
34
+ /**
35
+ * Raised when {@link validatePrevArtifactChain} detects a cycle — revisiting
36
+ * a sub-session id already in the ancestry set. Indicates a bug in the caller
37
+ * (or pre-existing store corruption); the write must be rejected.
38
+ */
39
+ export declare class ArtifactRefCycleError extends Error {
40
+ readonly details: {
41
+ readonly startSubSessionId: SubSessionId;
42
+ readonly cyclePath: readonly SubSessionId[];
43
+ };
44
+ constructor(details: {
45
+ startSubSessionId: SubSessionId;
46
+ cyclePath: readonly SubSessionId[];
47
+ });
48
+ }
49
+ /**
50
+ * Raised when the resolved chain length exceeds the configured intervention
51
+ * depth limit (`Project.config.maxInterventionDepth`). Convention #5
52
+ * deny-by-default — the kernel does not auto-truncate.
53
+ */
54
+ export declare class InterventionDepthExceeded extends Error {
55
+ readonly details: {
56
+ readonly subSessionId: SubSessionId;
57
+ readonly depth: number;
58
+ readonly limit: number;
59
+ };
60
+ constructor(details: {
61
+ subSessionId: SubSessionId;
62
+ depth: number;
63
+ limit: number;
64
+ });
65
+ }
66
+ /**
67
+ * Loader surface the validator queries to walk ancestry. Returning `null`
68
+ * means "no further ancestor" — the chain terminates cleanly. The loader is
69
+ * injected so tests can fake a chain without standing up a full
70
+ * {@link SessionStore}.
71
+ */
72
+ export interface InterventionChainLoader {
73
+ /**
74
+ * Resolves the ancestor node for the supplied {@link SessionId} — the
75
+ * session that the last step's `SessionSummaryDeliverable.sessionId` named.
76
+ * Returns `null` when no sub-session edge exists for that session (root
77
+ * session, or an archived/tombstoned ancestor — see §12.3).
78
+ */
79
+ loadAncestor(sessionId: SessionId): Promise<PrevArtifactNode | null>;
80
+ }
81
+ /**
82
+ * Pre-commit validator for adding a `prevArtifactRef` on a proposed child
83
+ * sub-session. Walks from `candidateAncestor` backwards through
84
+ * `loader.loadAncestor`, seeding the visited-set with `proposedChild` so a
85
+ * cycle (the candidate chain loops back to the child) is rejected
86
+ * immediately.
87
+ *
88
+ * Returns the resolved ancestry chain (oldest last, length ≤ `maxDepth`),
89
+ * excluding `proposedChild` itself. The chain is ordered from
90
+ * immediate-ancestor to furthest-ancestor (reverse-chronological per §4.5).
91
+ *
92
+ * Throws:
93
+ * - {@link ArtifactRefCycleError} if the walk revisits `proposedChild` or
94
+ * any already-visited ancestor.
95
+ * - {@link InterventionDepthExceeded} if the chain would exceed `maxDepth`.
96
+ *
97
+ * Non-session_summary deliverables (file / message / artifact_blob) do not
98
+ * form chain links — the walker terminates cleanly when it encounters one,
99
+ * since only `kind: 'session_summary'` references another sub-session's
100
+ * ancestry.
101
+ */
102
+ export declare function validatePrevArtifactChain(loader: InterventionChainLoader, proposedChild: SubSessionId, candidateAncestor: DeliverableRef, maxDepth: number): Promise<readonly SubSessionId[]>;
103
+ //# sourceMappingURL=prev-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prev-artifact.d.ts","sourceRoot":"","sources":["../../../src/session/intervention/prev-artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,cAAc,CAAA;CACzC;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,iBAAiB,EAAE,YAAY,CAAA;QACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAA;KAC3C,CAAA;gBAEW,OAAO,EAAE;QACpB,iBAAiB,EAAE,YAAY,CAAA;QAC/B,SAAS,EAAE,SAAS,YAAY,EAAE,CAAA;KAClC;CAOD;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IACnD,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;QACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KACtB,CAAA;gBAEW,OAAO,EAAE;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CAOjF;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACvC;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;CACpE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,yBAAyB,CAC9C,MAAM,EAAE,uBAAuB,EAC/B,aAAa,EAAE,YAAY,EAC3B,iBAAiB,EAAE,cAAc,EACjC,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAyDlC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * prevArtifactRef DAG primitives — acyclic walker, cycle detection, depth
3
+ * enforcement. See session-hierarchy.md §4.5.
4
+ *
5
+ * Intervention chains link successive follow-up sub-sessions via
6
+ * `SubSession.prevArtifactRef`, forming a strict acyclic DAG over prior
7
+ * completed sessions. This module supplies the pre-commit validator that
8
+ * rejects any insertion that would close a cycle or overflow
9
+ * {@link Project.config.maxInterventionDepth} (default 10).
10
+ *
11
+ * Convention #5: deny-by-default. Cycle or depth violation rejects with a
12
+ * typed error; callers never get a silently-truncated chain.
13
+ *
14
+ * Convention #0: no silent fallbacks. The walker surfaces corruption as
15
+ * `ArtifactRefCycleError` rather than infinite-looping.
16
+ */
17
+ /**
18
+ * Raised when {@link validatePrevArtifactChain} detects a cycle — revisiting
19
+ * a sub-session id already in the ancestry set. Indicates a bug in the caller
20
+ * (or pre-existing store corruption); the write must be rejected.
21
+ */
22
+ export class ArtifactRefCycleError extends Error {
23
+ details;
24
+ constructor(details) {
25
+ super(`prevArtifactRef cycle starting at ${details.startSubSessionId}: ${details.cyclePath.join(' -> ')}`);
26
+ this.name = 'ArtifactRefCycleError';
27
+ this.details = details;
28
+ }
29
+ }
30
+ /**
31
+ * Raised when the resolved chain length exceeds the configured intervention
32
+ * depth limit (`Project.config.maxInterventionDepth`). Convention #5
33
+ * deny-by-default — the kernel does not auto-truncate.
34
+ */
35
+ export class InterventionDepthExceeded extends Error {
36
+ details;
37
+ constructor(details) {
38
+ super(`Intervention chain depth ${details.depth} exceeds limit ${details.limit} at ${details.subSessionId}`);
39
+ this.name = 'InterventionDepthExceeded';
40
+ this.details = details;
41
+ }
42
+ }
43
+ /**
44
+ * Pre-commit validator for adding a `prevArtifactRef` on a proposed child
45
+ * sub-session. Walks from `candidateAncestor` backwards through
46
+ * `loader.loadAncestor`, seeding the visited-set with `proposedChild` so a
47
+ * cycle (the candidate chain loops back to the child) is rejected
48
+ * immediately.
49
+ *
50
+ * Returns the resolved ancestry chain (oldest last, length ≤ `maxDepth`),
51
+ * excluding `proposedChild` itself. The chain is ordered from
52
+ * immediate-ancestor to furthest-ancestor (reverse-chronological per §4.5).
53
+ *
54
+ * Throws:
55
+ * - {@link ArtifactRefCycleError} if the walk revisits `proposedChild` or
56
+ * any already-visited ancestor.
57
+ * - {@link InterventionDepthExceeded} if the chain would exceed `maxDepth`.
58
+ *
59
+ * Non-session_summary deliverables (file / message / artifact_blob) do not
60
+ * form chain links — the walker terminates cleanly when it encounters one,
61
+ * since only `kind: 'session_summary'` references another sub-session's
62
+ * ancestry.
63
+ */
64
+ export async function validatePrevArtifactChain(loader, proposedChild, candidateAncestor, maxDepth) {
65
+ if (maxDepth <= 0) {
66
+ throw new InterventionDepthExceeded({
67
+ subSessionId: proposedChild,
68
+ depth: 1,
69
+ limit: maxDepth,
70
+ });
71
+ }
72
+ // Non-session_summary refs are leaves — no chain links.
73
+ if (candidateAncestor.kind !== 'session_summary') {
74
+ return [];
75
+ }
76
+ const visited = new Set([proposedChild]);
77
+ const chain = [];
78
+ let currentRef = candidateAncestor;
79
+ while (currentRef !== undefined) {
80
+ if (currentRef.kind !== 'session_summary') {
81
+ // Chain terminates on non-session deliverable.
82
+ return chain;
83
+ }
84
+ // `SessionSummaryDeliverable.sessionId` names the completed session the
85
+ // ref points at. The loader resolves that to the sub-session edge
86
+ // carrying its own `prevArtifactRef` (if any), giving us the next step.
87
+ const ancestorNode = await loader.loadAncestor(currentRef.sessionId);
88
+ if (!ancestorNode) {
89
+ // Unknown ancestor (root session, or archived / tombstoned). Chain
90
+ // ends cleanly — absence is not a cycle.
91
+ return chain;
92
+ }
93
+ if (visited.has(ancestorNode.subSessionId)) {
94
+ throw new ArtifactRefCycleError({
95
+ startSubSessionId: proposedChild,
96
+ cyclePath: [...chain, ancestorNode.subSessionId],
97
+ });
98
+ }
99
+ visited.add(ancestorNode.subSessionId);
100
+ chain.push(ancestorNode.subSessionId);
101
+ if (chain.length > maxDepth) {
102
+ throw new InterventionDepthExceeded({
103
+ subSessionId: proposedChild,
104
+ depth: chain.length,
105
+ limit: maxDepth,
106
+ });
107
+ }
108
+ currentRef = ancestorNode.prevArtifactRef;
109
+ }
110
+ return chain;
111
+ }
112
+ //# sourceMappingURL=prev-artifact.js.map