@namzu/sdk 0.1.8 → 0.3.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 (626) hide show
  1. package/CHANGELOG.md +69 -2
  2. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  3. package/dist/agents/ReactiveAgent.js +5 -2
  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 +21 -5
  10. package/dist/agents/SupervisorAgent.js.map +1 -1
  11. package/dist/bridge/a2a/index.d.ts +1 -1
  12. package/dist/bridge/a2a/index.d.ts.map +1 -1
  13. package/dist/bridge/a2a/index.js +1 -1
  14. package/dist/bridge/a2a/index.js.map +1 -1
  15. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  16. package/dist/bridge/a2a/mapper.js +6 -0
  17. package/dist/bridge/a2a/mapper.js.map +1 -1
  18. package/dist/bridge/a2a/message.d.ts +0 -2
  19. package/dist/bridge/a2a/message.d.ts.map +1 -1
  20. package/dist/bridge/a2a/message.js +0 -26
  21. package/dist/bridge/a2a/message.js.map +1 -1
  22. package/dist/bridge/a2a/task.d.ts +5 -4
  23. package/dist/bridge/a2a/task.d.ts.map +1 -1
  24. package/dist/bridge/a2a/task.js +4 -4
  25. package/dist/bridge/a2a/task.js.map +1 -1
  26. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  27. package/dist/bridge/sse/mapper.js +6 -0
  28. package/dist/bridge/sse/mapper.js.map +1 -1
  29. package/dist/constants/a2a/index.d.ts +2 -2
  30. package/dist/constants/a2a/index.d.ts.map +1 -1
  31. package/dist/constants/a2a/index.js.map +1 -1
  32. package/dist/contracts/api.d.ts +14 -27
  33. package/dist/contracts/api.d.ts.map +1 -1
  34. package/dist/contracts/ids.d.ts +1 -1
  35. package/dist/contracts/ids.d.ts.map +1 -1
  36. package/dist/contracts/index.d.ts +3 -3
  37. package/dist/contracts/index.d.ts.map +1 -1
  38. package/dist/contracts/index.js +1 -1
  39. package/dist/contracts/index.js.map +1 -1
  40. package/dist/contracts/schemas.d.ts +1 -31
  41. package/dist/contracts/schemas.d.ts.map +1 -1
  42. package/dist/contracts/schemas.js +1 -7
  43. package/dist/contracts/schemas.js.map +1 -1
  44. package/dist/gateway/local.d.ts.map +1 -1
  45. package/dist/gateway/local.js +6 -0
  46. package/dist/gateway/local.js.map +1 -1
  47. package/dist/index.d.ts +6 -3
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +6 -3
  50. package/dist/index.js.map +1 -1
  51. package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
  52. package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
  53. package/dist/manager/agent/__tests__/lifecycle.test.js +316 -0
  54. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
  55. package/dist/manager/agent/lifecycle.d.ts +67 -3
  56. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  57. package/dist/manager/agent/lifecycle.js +375 -14
  58. package/dist/manager/agent/lifecycle.js.map +1 -1
  59. package/dist/manager/index.d.ts +2 -0
  60. package/dist/manager/index.d.ts.map +1 -1
  61. package/dist/manager/index.js +1 -0
  62. package/dist/manager/index.js.map +1 -1
  63. package/dist/manager/run/persistence.d.ts +10 -1
  64. package/dist/manager/run/persistence.d.ts.map +1 -1
  65. package/dist/manager/run/persistence.js +20 -0
  66. package/dist/manager/run/persistence.js.map +1 -1
  67. package/dist/manager/thread/__tests__/lifecycle.test.d.ts +2 -0
  68. package/dist/manager/thread/__tests__/lifecycle.test.d.ts.map +1 -0
  69. package/dist/manager/thread/__tests__/lifecycle.test.js +216 -0
  70. package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -0
  71. package/dist/manager/thread/lifecycle.d.ts +105 -0
  72. package/dist/manager/thread/lifecycle.d.ts.map +1 -0
  73. package/dist/manager/thread/lifecycle.js +186 -0
  74. package/dist/manager/thread/lifecycle.js.map +1 -0
  75. package/dist/rag/retriever.js +2 -2
  76. package/dist/run/reporter.d.ts.map +1 -1
  77. package/dist/run/reporter.js +25 -0
  78. package/dist/run/reporter.js.map +1 -1
  79. package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
  80. package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
  81. package/dist/runtime/query/__tests__/context.test.js +85 -0
  82. package/dist/runtime/query/__tests__/context.test.js.map +1 -0
  83. package/dist/runtime/query/context-cache.d.ts +3 -3
  84. package/dist/runtime/query/context-cache.d.ts.map +1 -1
  85. package/dist/runtime/query/context-cache.js +2 -2
  86. package/dist/runtime/query/context-cache.js.map +1 -1
  87. package/dist/runtime/query/context.d.ts +45 -1
  88. package/dist/runtime/query/context.d.ts.map +1 -1
  89. package/dist/runtime/query/context.js +50 -8
  90. package/dist/runtime/query/context.js.map +1 -1
  91. package/dist/runtime/query/events.d.ts.map +1 -1
  92. package/dist/runtime/query/events.js +8 -0
  93. package/dist/runtime/query/events.js.map +1 -1
  94. package/dist/runtime/query/index.d.ts +22 -1
  95. package/dist/runtime/query/index.d.ts.map +1 -1
  96. package/dist/runtime/query/index.js +11 -0
  97. package/dist/runtime/query/index.js.map +1 -1
  98. package/dist/session/__tests__/integration/_fixtures.d.ts +122 -0
  99. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
  100. package/dist/session/__tests__/integration/_fixtures.js +215 -0
  101. package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
  102. package/dist/session/__tests__/integration/archive-gate.test.d.ts +15 -0
  103. package/dist/session/__tests__/integration/archive-gate.test.d.ts.map +1 -0
  104. package/dist/session/__tests__/integration/archive-gate.test.js +214 -0
  105. package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -0
  106. package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
  107. package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
  108. package/dist/session/__tests__/integration/capacity-caps.test.js +123 -0
  109. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
  110. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
  111. package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
  112. package/dist/session/__tests__/integration/e2e-spawn.test.js +238 -0
  113. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
  114. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
  115. package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
  116. package/dist/session/__tests__/integration/event-stream-ordering.test.js +330 -0
  117. package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
  118. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
  119. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
  120. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +182 -0
  121. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
  122. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
  123. package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
  124. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +156 -0
  125. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
  126. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
  127. package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
  128. package/dist/session/__tests__/integration/handoff-single-e2e.test.js +179 -0
  129. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
  130. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
  131. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
  132. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +158 -0
  133. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
  134. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
  135. package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
  136. package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
  137. package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
  138. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
  139. package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
  140. package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
  141. package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
  142. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
  143. package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
  144. package/dist/session/__tests__/integration/prev-artifact-dag.test.js +242 -0
  145. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
  146. package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
  147. package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
  148. package/dist/session/__tests__/integration/retention-archive.test.js +187 -0
  149. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
  150. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts +26 -0
  151. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts.map +1 -0
  152. package/dist/session/__tests__/integration/spawn-rollback.test.js +236 -0
  153. package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -0
  154. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
  155. package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
  156. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +201 -0
  157. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
  158. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
  159. package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
  160. package/dist/session/__tests__/integration/tenant-isolation.test.js +189 -0
  161. package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
  162. package/dist/session/errors.d.ts +139 -0
  163. package/dist/session/errors.d.ts.map +1 -0
  164. package/dist/session/errors.js +107 -0
  165. package/dist/session/errors.js.map +1 -0
  166. package/dist/session/events/index.d.ts +4 -0
  167. package/dist/session/events/index.d.ts.map +1 -0
  168. package/dist/session/events/index.js +8 -0
  169. package/dist/session/events/index.js.map +1 -0
  170. package/dist/session/events/schema-version.d.ts +13 -0
  171. package/dist/session/events/schema-version.d.ts.map +1 -0
  172. package/dist/session/events/schema-version.js +12 -0
  173. package/dist/session/events/schema-version.js.map +1 -0
  174. package/dist/session/events/types.d.ts +64 -0
  175. package/dist/session/events/types.d.ts.map +1 -0
  176. package/dist/session/events/types.js +2 -0
  177. package/dist/session/events/types.js.map +1 -0
  178. package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
  179. package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
  180. package/dist/session/handoff/__tests__/broadcast.test.js +261 -0
  181. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
  182. package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
  183. package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
  184. package/dist/session/handoff/__tests__/capacity.test.js +103 -0
  185. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
  186. package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
  187. package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
  188. package/dist/session/handoff/__tests__/single.test.js +239 -0
  189. package/dist/session/handoff/__tests__/single.test.js.map +1 -0
  190. package/dist/session/handoff/assignment.d.ts +71 -0
  191. package/dist/session/handoff/assignment.d.ts.map +1 -0
  192. package/dist/session/handoff/assignment.js +11 -0
  193. package/dist/session/handoff/assignment.js.map +1 -0
  194. package/dist/session/handoff/broadcast.d.ts +54 -0
  195. package/dist/session/handoff/broadcast.d.ts.map +1 -0
  196. package/dist/session/handoff/broadcast.js +311 -0
  197. package/dist/session/handoff/broadcast.js.map +1 -0
  198. package/dist/session/handoff/capacity.d.ts +66 -0
  199. package/dist/session/handoff/capacity.d.ts.map +1 -0
  200. package/dist/session/handoff/capacity.js +60 -0
  201. package/dist/session/handoff/capacity.js.map +1 -0
  202. package/dist/session/handoff/events.d.ts +66 -0
  203. package/dist/session/handoff/events.d.ts.map +1 -0
  204. package/dist/session/handoff/events.js +13 -0
  205. package/dist/session/handoff/events.js.map +1 -0
  206. package/dist/session/handoff/index.d.ts +12 -0
  207. package/dist/session/handoff/index.d.ts.map +1 -0
  208. package/dist/session/handoff/index.js +9 -0
  209. package/dist/session/handoff/index.js.map +1 -0
  210. package/dist/session/handoff/single.d.ts +69 -0
  211. package/dist/session/handoff/single.d.ts.map +1 -0
  212. package/dist/session/handoff/single.js +229 -0
  213. package/dist/session/handoff/single.js.map +1 -0
  214. package/dist/session/handoff/version.d.ts +52 -0
  215. package/dist/session/handoff/version.d.ts.map +1 -0
  216. package/dist/session/handoff/version.js +36 -0
  217. package/dist/session/handoff/version.js.map +1 -0
  218. package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
  219. package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
  220. package/dist/session/hierarchy/__tests__/session.test.js +69 -0
  221. package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
  222. package/dist/session/hierarchy/actor.d.ts +26 -0
  223. package/dist/session/hierarchy/actor.d.ts.map +1 -0
  224. package/dist/session/hierarchy/actor.js +2 -0
  225. package/dist/session/hierarchy/actor.js.map +1 -0
  226. package/dist/session/hierarchy/index.d.ts +9 -0
  227. package/dist/session/hierarchy/index.d.ts.map +1 -0
  228. package/dist/session/hierarchy/index.js +4 -0
  229. package/dist/session/hierarchy/index.js.map +1 -0
  230. package/dist/session/hierarchy/lineage.d.ts +15 -0
  231. package/dist/session/hierarchy/lineage.d.ts.map +1 -0
  232. package/dist/session/hierarchy/lineage.js +2 -0
  233. package/dist/session/hierarchy/lineage.js.map +1 -0
  234. package/dist/session/hierarchy/project.d.ts +40 -0
  235. package/dist/session/hierarchy/project.d.ts.map +1 -0
  236. package/dist/session/hierarchy/project.js +2 -0
  237. package/dist/session/hierarchy/project.js.map +1 -0
  238. package/dist/session/hierarchy/session.d.ts +71 -0
  239. package/dist/session/hierarchy/session.d.ts.map +1 -0
  240. package/dist/session/hierarchy/session.js +51 -0
  241. package/dist/session/hierarchy/session.js.map +1 -0
  242. package/dist/session/hierarchy/sub-session.d.ts +76 -0
  243. package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
  244. package/dist/session/hierarchy/sub-session.js +2 -0
  245. package/dist/session/hierarchy/sub-session.js.map +1 -0
  246. package/dist/session/hierarchy/tenant.d.ts +13 -0
  247. package/dist/session/hierarchy/tenant.d.ts.map +1 -0
  248. package/dist/session/hierarchy/tenant.js +2 -0
  249. package/dist/session/hierarchy/tenant.js.map +1 -0
  250. package/dist/session/hierarchy/thread.d.ts +54 -0
  251. package/dist/session/hierarchy/thread.d.ts.map +1 -0
  252. package/dist/session/hierarchy/thread.js +2 -0
  253. package/dist/session/hierarchy/thread.js.map +1 -0
  254. package/dist/session/index.d.ts +10 -0
  255. package/dist/session/index.d.ts.map +1 -0
  256. package/dist/session/index.js +15 -0
  257. package/dist/session/index.js.map +1 -0
  258. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
  259. package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
  260. package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
  261. package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
  262. package/dist/session/intervention/index.d.ts +3 -0
  263. package/dist/session/intervention/index.d.ts.map +1 -0
  264. package/dist/session/intervention/index.js +8 -0
  265. package/dist/session/intervention/index.js.map +1 -0
  266. package/dist/session/intervention/prev-artifact.d.ts +103 -0
  267. package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
  268. package/dist/session/intervention/prev-artifact.js +112 -0
  269. package/dist/session/intervention/prev-artifact.js.map +1 -0
  270. package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
  271. package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
  272. package/dist/session/migration/__tests__/filesystem.test.js +188 -0
  273. package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
  274. package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
  275. package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
  276. package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
  277. package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
  278. package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
  279. package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
  280. package/dist/session/migration/__tests__/marker.test.js +75 -0
  281. package/dist/session/migration/__tests__/marker.test.js.map +1 -0
  282. package/dist/session/migration/errors.d.ts +26 -0
  283. package/dist/session/migration/errors.d.ts.map +1 -0
  284. package/dist/session/migration/errors.js +22 -0
  285. package/dist/session/migration/errors.js.map +1 -0
  286. package/dist/session/migration/filesystem.d.ts +94 -0
  287. package/dist/session/migration/filesystem.d.ts.map +1 -0
  288. package/dist/session/migration/filesystem.js +319 -0
  289. package/dist/session/migration/filesystem.js.map +1 -0
  290. package/dist/session/migration/id-prefix.d.ts +93 -0
  291. package/dist/session/migration/id-prefix.d.ts.map +1 -0
  292. package/dist/session/migration/id-prefix.js +111 -0
  293. package/dist/session/migration/id-prefix.js.map +1 -0
  294. package/dist/session/migration/index.d.ts +8 -0
  295. package/dist/session/migration/index.d.ts.map +1 -0
  296. package/dist/session/migration/index.js +8 -0
  297. package/dist/session/migration/index.js.map +1 -0
  298. package/dist/session/migration/marker.d.ts +57 -0
  299. package/dist/session/migration/marker.d.ts.map +1 -0
  300. package/dist/session/migration/marker.js +111 -0
  301. package/dist/session/migration/marker.js.map +1 -0
  302. package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
  303. package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
  304. package/dist/session/retention/__tests__/archive.test.js +253 -0
  305. package/dist/session/retention/__tests__/archive.test.js.map +1 -0
  306. package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
  307. package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
  308. package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
  309. package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
  310. package/dist/session/retention/archive-backend-ref.d.ts +18 -0
  311. package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
  312. package/dist/session/retention/archive-backend-ref.js +2 -0
  313. package/dist/session/retention/archive-backend-ref.js.map +1 -0
  314. package/dist/session/retention/archive.d.ts +130 -0
  315. package/dist/session/retention/archive.d.ts.map +1 -0
  316. package/dist/session/retention/archive.js +203 -0
  317. package/dist/session/retention/archive.js.map +1 -0
  318. package/dist/session/retention/backend.d.ts +101 -0
  319. package/dist/session/retention/backend.d.ts.map +1 -0
  320. package/dist/session/retention/backend.js +15 -0
  321. package/dist/session/retention/backend.js.map +1 -0
  322. package/dist/session/retention/disk-backend.d.ts +59 -0
  323. package/dist/session/retention/disk-backend.d.ts.map +1 -0
  324. package/dist/session/retention/disk-backend.js +236 -0
  325. package/dist/session/retention/disk-backend.js.map +1 -0
  326. package/dist/session/retention/index.d.ts +9 -0
  327. package/dist/session/retention/index.d.ts.map +1 -0
  328. package/dist/session/retention/index.js +6 -0
  329. package/dist/session/retention/index.js.map +1 -0
  330. package/dist/session/retention/policy.d.ts +49 -0
  331. package/dist/session/retention/policy.d.ts.map +1 -0
  332. package/dist/session/retention/policy.js +21 -0
  333. package/dist/session/retention/policy.js.map +1 -0
  334. package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
  335. package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
  336. package/dist/session/summary/__tests__/materialize.test.js +270 -0
  337. package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
  338. package/dist/session/summary/deliverable.d.ts +74 -0
  339. package/dist/session/summary/deliverable.d.ts.map +1 -0
  340. package/dist/session/summary/deliverable.js +20 -0
  341. package/dist/session/summary/deliverable.js.map +1 -0
  342. package/dist/session/summary/index.d.ts +6 -0
  343. package/dist/session/summary/index.d.ts.map +1 -0
  344. package/dist/session/summary/index.js +9 -0
  345. package/dist/session/summary/index.js.map +1 -0
  346. package/dist/session/summary/materialize.d.ts +82 -0
  347. package/dist/session/summary/materialize.d.ts.map +1 -0
  348. package/dist/session/summary/materialize.js +117 -0
  349. package/dist/session/summary/materialize.js.map +1 -0
  350. package/dist/session/summary/ref.d.ts +91 -0
  351. package/dist/session/summary/ref.d.ts.map +1 -0
  352. package/dist/session/summary/ref.js +51 -0
  353. package/dist/session/summary/ref.js.map +1 -0
  354. package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
  355. package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
  356. package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
  357. package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
  358. package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
  359. package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
  360. package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
  361. package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
  362. package/dist/session/workspace/driver.d.ts +55 -0
  363. package/dist/session/workspace/driver.d.ts.map +1 -0
  364. package/dist/session/workspace/driver.js +12 -0
  365. package/dist/session/workspace/driver.js.map +1 -0
  366. package/dist/session/workspace/git-worktree.d.ts +65 -0
  367. package/dist/session/workspace/git-worktree.d.ts.map +1 -0
  368. package/dist/session/workspace/git-worktree.js +156 -0
  369. package/dist/session/workspace/git-worktree.js.map +1 -0
  370. package/dist/session/workspace/index.d.ts +8 -0
  371. package/dist/session/workspace/index.d.ts.map +1 -0
  372. package/dist/session/workspace/index.js +7 -0
  373. package/dist/session/workspace/index.js.map +1 -0
  374. package/dist/session/workspace/path-builder.d.ts +50 -0
  375. package/dist/session/workspace/path-builder.d.ts.map +1 -0
  376. package/dist/session/workspace/path-builder.js +50 -0
  377. package/dist/session/workspace/path-builder.js.map +1 -0
  378. package/dist/session/workspace/ref.d.ts +46 -0
  379. package/dist/session/workspace/ref.d.ts.map +1 -0
  380. package/dist/session/workspace/ref.js +11 -0
  381. package/dist/session/workspace/ref.js.map +1 -0
  382. package/dist/session/workspace/registry.d.ts +26 -0
  383. package/dist/session/workspace/registry.d.ts.map +1 -0
  384. package/dist/session/workspace/registry.js +35 -0
  385. package/dist/session/workspace/registry.js.map +1 -0
  386. package/dist/store/index.d.ts +0 -2
  387. package/dist/store/index.d.ts.map +1 -1
  388. package/dist/store/index.js +0 -1
  389. package/dist/store/index.js.map +1 -1
  390. package/dist/store/session/__tests__/disk.test.d.ts +2 -0
  391. package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
  392. package/dist/store/session/__tests__/disk.test.js +267 -0
  393. package/dist/store/session/__tests__/disk.test.js.map +1 -0
  394. package/dist/store/session/__tests__/memory.test.d.ts +2 -0
  395. package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
  396. package/dist/store/session/__tests__/memory.test.js +258 -0
  397. package/dist/store/session/__tests__/memory.test.js.map +1 -0
  398. package/dist/store/session/disk.d.ts +86 -0
  399. package/dist/store/session/disk.d.ts.map +1 -0
  400. package/dist/store/session/disk.js +818 -0
  401. package/dist/store/session/disk.js.map +1 -0
  402. package/dist/store/session/index.d.ts +7 -0
  403. package/dist/store/session/index.d.ts.map +1 -0
  404. package/dist/store/session/index.js +10 -0
  405. package/dist/store/session/index.js.map +1 -0
  406. package/dist/store/session/linkage.d.ts +38 -0
  407. package/dist/store/session/linkage.d.ts.map +1 -0
  408. package/dist/store/session/linkage.js +64 -0
  409. package/dist/store/session/linkage.js.map +1 -0
  410. package/dist/store/session/memory.d.ts +49 -0
  411. package/dist/store/session/memory.d.ts.map +1 -0
  412. package/dist/store/session/memory.js +335 -0
  413. package/dist/store/session/memory.js.map +1 -0
  414. package/dist/store/session/messages.d.ts +20 -0
  415. package/dist/store/session/messages.d.ts.map +1 -0
  416. package/dist/store/session/messages.js +12 -0
  417. package/dist/store/session/messages.js.map +1 -0
  418. package/dist/store/thread/disk.d.ts +41 -0
  419. package/dist/store/thread/disk.d.ts.map +1 -0
  420. package/dist/store/thread/disk.js +229 -0
  421. package/dist/store/thread/disk.js.map +1 -0
  422. package/dist/store/thread/index.d.ts +4 -0
  423. package/dist/store/thread/index.d.ts.map +1 -0
  424. package/dist/store/thread/index.js +6 -0
  425. package/dist/store/thread/index.js.map +1 -0
  426. package/dist/store/thread/memory.d.ts +23 -0
  427. package/dist/store/thread/memory.d.ts.map +1 -0
  428. package/dist/store/thread/memory.js +90 -0
  429. package/dist/store/thread/memory.js.map +1 -0
  430. package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
  431. package/dist/types/agent/base.d.ts +24 -1
  432. package/dist/types/agent/base.d.ts.map +1 -1
  433. package/dist/types/agent/factory.d.ts +8 -2
  434. package/dist/types/agent/factory.d.ts.map +1 -1
  435. package/dist/types/agent/task.d.ts +57 -2
  436. package/dist/types/agent/task.d.ts.map +1 -1
  437. package/dist/types/agent/task.js.map +1 -1
  438. package/dist/types/ids/index.d.ts +22 -3
  439. package/dist/types/ids/index.d.ts.map +1 -1
  440. package/dist/types/ids/index.js +8 -1
  441. package/dist/types/ids/index.js.map +1 -1
  442. package/dist/types/invocation/__tests__/state.test.js +36 -29
  443. package/dist/types/invocation/__tests__/state.test.js.map +1 -1
  444. package/dist/types/invocation/index.d.ts +20 -4
  445. package/dist/types/invocation/index.d.ts.map +1 -1
  446. package/dist/types/invocation/index.js +10 -7
  447. package/dist/types/invocation/index.js.map +1 -1
  448. package/dist/types/rag/retrieval.d.ts +4 -3
  449. package/dist/types/rag/retrieval.d.ts.map +1 -1
  450. package/dist/types/run/config.d.ts +12 -1
  451. package/dist/types/run/config.d.ts.map +1 -1
  452. package/dist/types/run/events.d.ts +26 -1
  453. package/dist/types/run/events.d.ts.map +1 -1
  454. package/dist/types/run/index.d.ts.map +1 -1
  455. package/dist/types/run/index.js +8 -0
  456. package/dist/types/run/index.js.map +1 -1
  457. package/dist/types/run/metadata.d.ts +12 -2
  458. package/dist/types/run/metadata.d.ts.map +1 -1
  459. package/dist/types/run/status.d.ts +26 -0
  460. package/dist/types/run/status.d.ts.map +1 -0
  461. package/dist/types/run/status.js +2 -0
  462. package/dist/types/run/status.js.map +1 -0
  463. package/dist/types/session/ids.d.ts +9 -0
  464. package/dist/types/session/ids.d.ts.map +1 -0
  465. package/dist/types/session/ids.js +9 -0
  466. package/dist/types/session/ids.js.map +1 -0
  467. package/dist/types/session/index.d.ts +3 -0
  468. package/dist/types/session/index.d.ts.map +1 -0
  469. package/dist/types/session/index.js +5 -0
  470. package/dist/types/session/index.js.map +1 -0
  471. package/dist/types/session/store.d.ts +210 -0
  472. package/dist/types/session/store.d.ts.map +1 -0
  473. package/dist/types/session/store.js +9 -0
  474. package/dist/types/session/store.js.map +1 -0
  475. package/dist/types/thread/index.d.ts +2 -0
  476. package/dist/types/thread/index.d.ts.map +1 -0
  477. package/dist/types/thread/index.js +5 -0
  478. package/dist/types/thread/index.js.map +1 -0
  479. package/dist/types/thread/store.d.ts +86 -0
  480. package/dist/types/thread/store.d.ts.map +1 -0
  481. package/dist/types/thread/store.js +22 -0
  482. package/dist/types/thread/store.js.map +1 -0
  483. package/dist/utils/id.d.ts +8 -2
  484. package/dist/utils/id.d.ts.map +1 -1
  485. package/dist/utils/id.js +22 -4
  486. package/dist/utils/id.js.map +1 -1
  487. package/package.json +6 -11
  488. package/src/agents/ReactiveAgent.ts +7 -2
  489. package/src/agents/RouterAgent.ts +5 -0
  490. package/src/agents/SupervisorAgent.ts +29 -6
  491. package/src/bridge/a2a/index.ts +0 -1
  492. package/src/bridge/a2a/mapper.ts +7 -0
  493. package/src/bridge/a2a/message.ts +0 -32
  494. package/src/bridge/a2a/task.ts +9 -8
  495. package/src/bridge/sse/mapper.ts +8 -1
  496. package/src/constants/a2a/index.ts +2 -2
  497. package/src/contracts/api.ts +14 -30
  498. package/src/contracts/ids.ts +1 -1
  499. package/src/contracts/index.ts +3 -7
  500. package/src/contracts/schemas.ts +1 -8
  501. package/src/gateway/local.ts +6 -0
  502. package/src/index.ts +14 -4
  503. package/src/manager/agent/__tests__/lifecycle.test.ts +473 -0
  504. package/src/manager/agent/lifecycle.ts +515 -21
  505. package/src/manager/index.ts +3 -0
  506. package/src/manager/run/persistence.ts +26 -1
  507. package/src/manager/thread/__tests__/lifecycle.test.ts +286 -0
  508. package/src/manager/thread/lifecycle.ts +217 -0
  509. package/src/rag/retriever.ts +2 -2
  510. package/src/run/reporter.ts +28 -0
  511. package/src/runtime/query/__tests__/context.test.ts +102 -0
  512. package/src/runtime/query/context-cache.ts +4 -4
  513. package/src/runtime/query/context.ts +98 -9
  514. package/src/runtime/query/events.ts +8 -0
  515. package/src/runtime/query/index.ts +38 -1
  516. package/src/session/__tests__/integration/_fixtures.ts +310 -0
  517. package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
  518. package/src/session/__tests__/integration/capacity-caps.test.ts +171 -0
  519. package/src/session/__tests__/integration/e2e-spawn.test.ts +296 -0
  520. package/src/session/__tests__/integration/event-stream-ordering.test.ts +410 -0
  521. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +271 -0
  522. package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +214 -0
  523. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +251 -0
  524. package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +240 -0
  525. package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
  526. package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
  527. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +325 -0
  528. package/src/session/__tests__/integration/retention-archive.test.ts +233 -0
  529. package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
  530. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +239 -0
  531. package/src/session/__tests__/integration/tenant-isolation.test.ts +292 -0
  532. package/src/session/errors.ts +159 -0
  533. package/src/session/events/index.ts +16 -0
  534. package/src/session/events/schema-version.ts +13 -0
  535. package/src/session/events/types.ts +71 -0
  536. package/src/session/handoff/__tests__/broadcast.test.ts +378 -0
  537. package/src/session/handoff/__tests__/capacity.test.ts +129 -0
  538. package/src/session/handoff/__tests__/single.test.ts +333 -0
  539. package/src/session/handoff/assignment.ts +74 -0
  540. package/src/session/handoff/broadcast.ts +406 -0
  541. package/src/session/handoff/capacity.ts +121 -0
  542. package/src/session/handoff/events.ts +72 -0
  543. package/src/session/handoff/index.ts +29 -0
  544. package/src/session/handoff/single.ts +310 -0
  545. package/src/session/handoff/version.ts +59 -0
  546. package/src/session/hierarchy/__tests__/session.test.ts +100 -0
  547. package/src/session/hierarchy/actor.ts +17 -0
  548. package/src/session/hierarchy/index.ts +18 -0
  549. package/src/session/hierarchy/lineage.ts +15 -0
  550. package/src/session/hierarchy/project.ts +41 -0
  551. package/src/session/hierarchy/session.ts +109 -0
  552. package/src/session/hierarchy/sub-session.ts +92 -0
  553. package/src/session/hierarchy/tenant.ts +13 -0
  554. package/src/session/hierarchy/thread.ts +55 -0
  555. package/src/session/index.ts +15 -0
  556. package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
  557. package/src/session/intervention/index.ts +16 -0
  558. package/src/session/intervention/prev-artifact.ts +180 -0
  559. package/src/session/migration/__tests__/filesystem.test.ts +263 -0
  560. package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
  561. package/src/session/migration/__tests__/marker.test.ts +84 -0
  562. package/src/session/migration/errors.ts +23 -0
  563. package/src/session/migration/filesystem.ts +401 -0
  564. package/src/session/migration/id-prefix.ts +141 -0
  565. package/src/session/migration/index.ts +38 -0
  566. package/src/session/migration/marker.ts +131 -0
  567. package/src/session/retention/__tests__/archive.test.ts +318 -0
  568. package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
  569. package/src/session/retention/archive-backend-ref.ts +17 -0
  570. package/src/session/retention/archive.ts +281 -0
  571. package/src/session/retention/backend.ts +107 -0
  572. package/src/session/retention/disk-backend.ts +304 -0
  573. package/src/session/retention/index.ts +16 -0
  574. package/src/session/retention/policy.ts +53 -0
  575. package/src/session/summary/__tests__/materialize.test.ts +343 -0
  576. package/src/session/summary/deliverable.ts +84 -0
  577. package/src/session/summary/index.ts +31 -0
  578. package/src/session/summary/materialize.ts +169 -0
  579. package/src/session/summary/ref.ts +104 -0
  580. package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
  581. package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
  582. package/src/session/workspace/driver.ts +60 -0
  583. package/src/session/workspace/git-worktree.ts +209 -0
  584. package/src/session/workspace/index.ts +25 -0
  585. package/src/session/workspace/path-builder.ts +71 -0
  586. package/src/session/workspace/ref.ts +50 -0
  587. package/src/session/workspace/registry.ts +42 -0
  588. package/src/store/index.ts +0 -3
  589. package/src/store/session/__tests__/disk.test.ts +397 -0
  590. package/src/store/session/__tests__/memory.test.ts +402 -0
  591. package/src/store/session/disk.ts +976 -0
  592. package/src/store/session/index.ts +13 -0
  593. package/src/store/session/linkage.ts +80 -0
  594. package/src/store/session/memory.ts +412 -0
  595. package/src/store/session/messages.ts +21 -0
  596. package/src/store/thread/disk.ts +261 -0
  597. package/src/store/thread/index.ts +7 -0
  598. package/src/store/thread/memory.ts +104 -0
  599. package/src/types/agent/base.ts +27 -1
  600. package/src/types/agent/factory.ts +8 -3
  601. package/src/types/agent/task.ts +66 -2
  602. package/src/types/ids/index.ts +34 -3
  603. package/src/types/invocation/__tests__/state.test.ts +37 -29
  604. package/src/types/invocation/index.ts +26 -10
  605. package/src/types/rag/retrieval.ts +4 -3
  606. package/src/types/run/config.ts +13 -1
  607. package/src/types/run/events.ts +36 -1
  608. package/src/types/run/index.ts +8 -0
  609. package/src/types/run/metadata.ts +12 -2
  610. package/src/types/run/status.ts +33 -0
  611. package/src/types/session/ids.ts +23 -0
  612. package/src/types/session/index.ts +27 -0
  613. package/src/types/session/store.ts +252 -0
  614. package/src/types/thread/index.ts +5 -0
  615. package/src/types/thread/store.ts +92 -0
  616. package/src/utils/id.ts +34 -4
  617. package/dist/store/conversation/memory.d.ts +0 -21
  618. package/dist/store/conversation/memory.d.ts.map +0 -1
  619. package/dist/store/conversation/memory.js +0 -86
  620. package/dist/store/conversation/memory.js.map +0 -1
  621. package/dist/types/conversation/index.d.ts +0 -7
  622. package/dist/types/conversation/index.d.ts.map +0 -1
  623. package/dist/types/conversation/index.js +0 -2
  624. package/dist/types/conversation/index.js.map +0 -1
  625. package/src/store/conversation/memory.ts +0 -121
  626. package/src/types/conversation/index.ts +0 -8
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Multi-recipient (broadcast) handoff — atomic fan-out with compensating
3
+ * rollback.
4
+ *
5
+ * See session-hierarchy.md §6.2 (Multi-recipient broadcast flow — atomic),
6
+ * §5.4 (broadcast source-session post-fan-out), §6.5 (capacity enforcement).
7
+ *
8
+ * **Atomicity contract** — one transaction boundary: either the full fan-out
9
+ * commits (source CAS-lock + N assignments + N sub-sessions + N worktrees),
10
+ * or none of it is externally observable. On any step failure the kernel
11
+ * executes a compensating rollback and emits `onBroadcastRollback` with
12
+ * accurate `partialState` counts. The rollback itself is idempotent per
13
+ * roadmap Risk #3.
14
+ *
15
+ * Commit / rollback sequence (pattern doc §6.2):
16
+ * ```
17
+ * COMMIT: idle → locked(CAS) → N assignments → N sub-sessions → N worktrees → awaiting_merge
18
+ * ROLLBACK: ( ← tear down partial worktrees ← delete partial sub-sessions ←
19
+ * delete partial assignments ← release CAS ) emit broadcast.rollback;
20
+ * source → idle
21
+ * ```
22
+ */
23
+ import { TenantIsolationError } from '../errors.js';
24
+ import { NOOP_RUN_STATUS_RESOLVER } from './single.js';
25
+ import { HandoffLockRejected, HandoffVersionConflict } from './version.js';
26
+ /**
27
+ * Executes a broadcast fan-out. All assignments MUST share the same
28
+ * `sourceSessionId`, `expectedOwnerVersion`, `broadcastId`, and `projectId`.
29
+ * Duplicate recipients (same actor kind + id) are rejected before any write.
30
+ *
31
+ * Returns one {@link HandoffOutcome} per recipient on success. On failure the
32
+ * source session is restored, every provisioned resource is torn down, and
33
+ * the underlying error propagates after `onBroadcastRollback` is emitted.
34
+ */
35
+ export async function executeBroadcastHandoff(deps, assignments, tenantId) {
36
+ // 1. Shape validation -----------------------------------------------------
37
+ if (assignments.length === 0) {
38
+ throw new Error('executeBroadcastHandoff: assignments must not be empty');
39
+ }
40
+ if (assignments.length === 1) {
41
+ throw new Error('executeBroadcastHandoff: single-recipient handoffs must use executeSingleHandoff');
42
+ }
43
+ const first = assignments[0];
44
+ if (!first)
45
+ throw new Error('executeBroadcastHandoff: assignments[0] undefined');
46
+ if (first.mode !== 'broadcast') {
47
+ throw new Error(`executeBroadcastHandoff: mode must be 'broadcast' (got '${first.mode}')`);
48
+ }
49
+ if (!first.broadcastId) {
50
+ throw new Error('executeBroadcastHandoff: broadcastId required on every assignment');
51
+ }
52
+ for (const a of assignments) {
53
+ if (a.tenantId !== tenantId) {
54
+ throw new TenantIsolationError({
55
+ requested: tenantId,
56
+ resource: `handoff-assignment(${a.id})`,
57
+ });
58
+ }
59
+ if (a.sourceSessionId !== first.sourceSessionId) {
60
+ throw new Error('executeBroadcastHandoff: all assignments must share sourceSessionId');
61
+ }
62
+ if (a.broadcastId !== first.broadcastId) {
63
+ throw new Error('executeBroadcastHandoff: all assignments must share broadcastId');
64
+ }
65
+ if (a.expectedOwnerVersion !== first.expectedOwnerVersion) {
66
+ throw new Error('executeBroadcastHandoff: all assignments must share expectedOwnerVersion');
67
+ }
68
+ if (a.threadId !== first.threadId) {
69
+ throw new Error('executeBroadcastHandoff: all assignments must share threadId');
70
+ }
71
+ if (a.projectId !== first.projectId) {
72
+ throw new Error('executeBroadcastHandoff: all assignments must share projectId');
73
+ }
74
+ if (a.mode !== 'broadcast') {
75
+ throw new Error('executeBroadcastHandoff: every assignment must have mode="broadcast"');
76
+ }
77
+ }
78
+ // 2. Dedupe recipients — same concern as the collab doc's Codex R: two rows
79
+ // targeting the same actor would produce duplicate sub-sessions + racy
80
+ // worktree paths. Reject before any side effect.
81
+ const seen = new Set();
82
+ for (const a of assignments) {
83
+ const key = recipientKey(a.recipientActor);
84
+ if (seen.has(key)) {
85
+ throw new Error(`executeBroadcastHandoff: duplicate recipient detected (${key}). Dedupe before submitting.`);
86
+ }
87
+ seen.add(key);
88
+ }
89
+ // Thread archive gate (Phase 2.6) — runs BEFORE source load/capacity so an
90
+ // archived thread fails fastest with `ThreadClosedError`. All assignments
91
+ // share `threadId` by the shape validation above. Runs BEFORE the CAS
92
+ // lock so a denied fan-out leaves the source session untouched.
93
+ await deps.threadManager.requireOpen(first.threadId, tenantId);
94
+ // 3. Load source + tenant check.
95
+ const source = await deps.store.getSession(first.sourceSessionId, tenantId);
96
+ if (!source) {
97
+ throw new Error(`Source session ${first.sourceSessionId} not found`);
98
+ }
99
+ if (source.tenantId !== tenantId) {
100
+ throw new TenantIsolationError({
101
+ requested: tenantId,
102
+ resource: `session(${source.id})`,
103
+ });
104
+ }
105
+ if (source.threadId !== first.threadId) {
106
+ throw new Error(`Assignment threadId ${first.threadId} does not match source threadId ${source.threadId}`);
107
+ }
108
+ if (source.projectId !== first.projectId) {
109
+ throw new Error(`Assignment projectId ${first.projectId} does not match source projectId ${source.projectId}`);
110
+ }
111
+ // 4. Status check.
112
+ if (source.status !== 'idle') {
113
+ throw new HandoffLockRejected({
114
+ sessionId: source.id,
115
+ reason: source.status === 'active'
116
+ ? 'active_run'
117
+ : source.status === 'awaiting_hitl'
118
+ ? 'pending_hitl'
119
+ : 'pending_subsession',
120
+ });
121
+ }
122
+ // 5. Non-terminal Run fan-in (§5.1).
123
+ const runResolver = deps.runStatus ?? NOOP_RUN_STATUS_RESOLVER;
124
+ const blocking = await runResolver.blockingRun(source.id, tenantId);
125
+ if (blocking) {
126
+ throw new HandoffLockRejected({ sessionId: source.id, reason: blocking.reason });
127
+ }
128
+ // 6. Capacity — width + depth. Width covers N new children in one shot
129
+ // (§6.5); depth covers `source.depth + 1 ≤ maxDepth`.
130
+ const project = await deps.store.getProject(source.projectId, tenantId);
131
+ if (!project) {
132
+ throw new Error(`Project ${source.projectId} not found`);
133
+ }
134
+ await deps.capacity.validateWidth(source.id, assignments.length, project.config.maxDelegationWidth, tenantId);
135
+ await deps.capacity.validateDepth(source.id, project.config.maxDelegationDepth, tenantId);
136
+ // 7. CAS → source `idle → locked`.
137
+ if (source.ownerVersion !== first.expectedOwnerVersion) {
138
+ throw new HandoffVersionConflict({
139
+ sessionId: source.id,
140
+ expected: first.expectedOwnerVersion,
141
+ actual: source.ownerVersion,
142
+ });
143
+ }
144
+ const locked = { ...source, status: 'locked' };
145
+ await deps.store.updateSession(locked, tenantId);
146
+ emit(deps.events.onLocked, { sessionId: source.id, at: new Date() });
147
+ // 8. Fan-out provisioning. Track per-recipient partial state so rollback
148
+ // can compensate precisely.
149
+ const partials = [];
150
+ let assignmentsWritten = 0;
151
+ let subsessionsCreated = 0;
152
+ let worktreesProvisioned = 0;
153
+ try {
154
+ const driver = deps.workspaceRegistry.get('git-worktree');
155
+ for (const assignment of assignments) {
156
+ // Per-recipient: new isolated workspace → new child session → new
157
+ // sub-session edge. Each sub-op advances the partial-state counters.
158
+ const partial = {
159
+ assignmentId: assignment.id,
160
+ recipientActor: assignment.recipientActor,
161
+ workspace: null,
162
+ createdSessionId: null,
163
+ createdSubSessionId: null,
164
+ };
165
+ partials.push(partial);
166
+ partial.workspace = await driver.create({ label: `broadcast-${assignment.id}` });
167
+ worktreesProvisioned += 1;
168
+ const childSession = await deps.store.createSession({
169
+ threadId: source.threadId,
170
+ projectId: source.projectId,
171
+ currentActor: assignment.recipientActor,
172
+ }, tenantId);
173
+ partial.createdSessionId = childSession.id;
174
+ const subSession = await deps.store.createSubSession({
175
+ parentSessionId: source.id,
176
+ childSessionId: childSession.id,
177
+ kind: 'user_handoff',
178
+ spawnedBy: assignment.sourceActor,
179
+ }, tenantId);
180
+ partial.createdSubSessionId = subSession.id;
181
+ subsessionsCreated += 1;
182
+ // "Assignments written" is the last per-recipient step — counts any
183
+ // recipient whose full row reached store-durable state.
184
+ assignmentsWritten += 1;
185
+ }
186
+ // 9. Commit source: `locked → awaiting_merge` (§5.4 — broadcast source is
187
+ // not `idle` until all recipients terminalize; coordinator role).
188
+ const committed = {
189
+ ...source,
190
+ status: 'awaiting_merge',
191
+ ownerVersion: source.ownerVersion + 1,
192
+ };
193
+ await deps.store.updateSession(committed, tenantId);
194
+ emit(deps.events.onCommitted, {
195
+ sessionId: source.id,
196
+ newVersion: committed.ownerVersion,
197
+ handoffIds: assignments.map((a) => a.id),
198
+ at: new Date(),
199
+ });
200
+ return partials.map((p) => {
201
+ if (!p.workspace || !p.createdSessionId) {
202
+ // Unreachable — success path populates both fields on every partial.
203
+ throw new Error(`Broadcast partial for ${p.assignmentId} missing post-commit fields`);
204
+ }
205
+ return {
206
+ assignmentId: p.assignmentId,
207
+ newSessionId: p.createdSessionId,
208
+ workspaceId: p.workspace.id,
209
+ committedOwnerVersion: committed.ownerVersion,
210
+ };
211
+ });
212
+ }
213
+ catch (failure) {
214
+ await rollbackBroadcast(deps, source, partials, tenantId, {
215
+ broadcastId: first.broadcastId,
216
+ reason: failure instanceof Error ? failure.message : String(failure),
217
+ assignmentsWritten,
218
+ subsessionsCreated,
219
+ worktreesProvisioned,
220
+ });
221
+ throw failure;
222
+ }
223
+ }
224
+ /**
225
+ * Compensating rollback — idempotent per Risk #3.
226
+ *
227
+ * Order (reverse of commit): tear down worktrees → delete partially created
228
+ * sub-sessions → delete partially created child sessions → release source
229
+ * CAS lock → emit `onBroadcastRollback`. Every sub-op swallows its own
230
+ * secondary error so the primary failure remains the surfaced cause.
231
+ *
232
+ * Phase 8 closed the Phase 4 Known Delta (INTERP #2): previous implementation
233
+ * flipped partial recipient sessions to `status: 'archived'` as a stopgap
234
+ * because the store had no `deleteSession` primitive. The store now exposes
235
+ * `deleteSession` + `deleteSubSession` (idempotent), so rollback is total —
236
+ * no orphan records remain.
237
+ */
238
+ async function rollbackBroadcast(deps, source, partials, tenantId, meta) {
239
+ // a. Dispose any provisioned worktrees (idempotent by driver contract).
240
+ for (const partial of partials) {
241
+ if (!partial.workspace)
242
+ continue;
243
+ try {
244
+ const driver = deps.workspaceRegistry.get('git-worktree');
245
+ await driver.dispose(partial.workspace);
246
+ }
247
+ catch {
248
+ // Idempotent — secondary failure must not mask the primary one.
249
+ }
250
+ }
251
+ // b. Delete any partially created sub-sessions (reverse order of creation
252
+ // so child-side constraints release before the session below them).
253
+ for (const partial of partials) {
254
+ if (!partial.createdSubSessionId)
255
+ continue;
256
+ try {
257
+ await deps.store.deleteSubSession(partial.createdSubSessionId, tenantId);
258
+ }
259
+ catch {
260
+ // Idempotent.
261
+ }
262
+ }
263
+ // c. Delete partially created recipient sessions (total cleanup — pattern
264
+ // doc §6.2: fan-out is atomic, partial state is externally
265
+ // unobservable).
266
+ for (const partial of partials) {
267
+ if (!partial.createdSessionId)
268
+ continue;
269
+ try {
270
+ await deps.store.deleteSession(partial.createdSessionId, tenantId);
271
+ }
272
+ catch {
273
+ // Idempotent.
274
+ }
275
+ }
276
+ // d. Release source CAS — `locked → idle`, preserving ownerVersion.
277
+ try {
278
+ const reverted = { ...source, status: 'idle' };
279
+ await deps.store.updateSession(reverted, tenantId);
280
+ }
281
+ catch {
282
+ // Idempotent — the write-tmp-rename primitive is itself idempotent
283
+ // against the same payload.
284
+ }
285
+ emit(deps.events.onBroadcastRollback, {
286
+ sessionId: source.id,
287
+ broadcastId: meta.broadcastId,
288
+ reason: meta.reason,
289
+ partialState: {
290
+ assignmentsWritten: meta.assignmentsWritten,
291
+ subsessionsCreated: meta.subsessionsCreated,
292
+ worktreesProvisioned: meta.worktreesProvisioned,
293
+ },
294
+ at: new Date(),
295
+ });
296
+ }
297
+ function recipientKey(actor) {
298
+ switch (actor.kind) {
299
+ case 'user':
300
+ return `user:${actor.userId}`;
301
+ case 'agent':
302
+ return `agent:${actor.agentId}`;
303
+ case 'system':
304
+ return `system:${actor.role}`;
305
+ }
306
+ }
307
+ function emit(handler, event) {
308
+ if (handler)
309
+ handler(event);
310
+ }
311
+ //# sourceMappingURL=broadcast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../../src/session/handoff/broadcast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Delegation capacity validation — depth + width caps applied at the kernel
3
+ * boundary before any write (session-hierarchy.md §6.5).
4
+ *
5
+ * Both `spawnSubSession()` and `broadcastHandoff()` call this module before
6
+ * committing; violations abort with typed {@link DelegationCapacityExceeded}
7
+ * and no partial writes occur (Convention #0: no workarounds; Convention #5:
8
+ * deny-by-default).
9
+ */
10
+ import type { SessionId, TenantId } from '../../types/ids/index.js';
11
+ import type { SessionStore } from '../../types/session/store.js';
12
+ /** Capacity dimension under validation. */
13
+ export type CapacityDimension = 'depth' | 'width';
14
+ /**
15
+ * Raised when a spawn / broadcast would exceed the project's configured
16
+ * capacity caps. The check is a precondition — no partial writes occur on
17
+ * violation (session-hierarchy.md §6.5).
18
+ */
19
+ export declare class DelegationCapacityExceeded extends Error {
20
+ readonly details: {
21
+ dimension: CapacityDimension;
22
+ current: number;
23
+ limit: number;
24
+ sessionId: SessionId;
25
+ };
26
+ constructor(details: {
27
+ dimension: CapacityDimension;
28
+ current: number;
29
+ limit: number;
30
+ sessionId: SessionId;
31
+ });
32
+ }
33
+ /**
34
+ * Capacity validator abstraction. Lets the handoff flows inject a validator
35
+ * without carrying the full {@link SessionStore} surface area into their
36
+ * dependency envelope (Convention #9: function-based flow keeps deps narrow).
37
+ *
38
+ * Both methods throw {@link DelegationCapacityExceeded} on violation and
39
+ * return void on success.
40
+ */
41
+ export interface CapacityValidator {
42
+ /**
43
+ * Asserts `parentSession.depth + 1 ≤ projectMaxDepth`. Depth is computed by
44
+ * walking the ancestry via {@link SessionStore.getAncestry} — root-to-self
45
+ * length minus one equals the session's depth in the delegation tree.
46
+ */
47
+ validateDepth(parentSessionId: SessionId, projectMaxDepth: number, tenantId: TenantId): Promise<void>;
48
+ /**
49
+ * Asserts `existingDirectChildren + pendingNewChildren ≤ projectMaxWidth`
50
+ * under `parentSessionId`. The width cap applies to a single spawn call —
51
+ * a broadcast of N recipients passes `pendingNewChildren = N`.
52
+ */
53
+ validateWidth(parentSessionId: SessionId, pendingNewChildren: number, projectMaxWidth: number, tenantId: TenantId): Promise<void>;
54
+ }
55
+ /**
56
+ * Default validator backed by {@link SessionStore}. Uses `getAncestry` for
57
+ * depth (root-to-self chain length) and `getChildren` for width (count of
58
+ * existing direct sub-sessions).
59
+ */
60
+ export declare class DefaultCapacityValidator implements CapacityValidator {
61
+ private readonly store;
62
+ constructor(store: SessionStore);
63
+ validateDepth(parentSessionId: SessionId, projectMaxDepth: number, tenantId: TenantId): Promise<void>;
64
+ validateWidth(parentSessionId: SessionId, pendingNewChildren: number, projectMaxWidth: number, tenantId: TenantId): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=capacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacity.d.ts","sourceRoot":"","sources":["../../../src/session/handoff/capacity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEhE,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,CAAA;AAEjD;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACpD,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,iBAAiB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,SAAS,CAAA;KACpB,CAAA;gBAEW,OAAO,EAAE;QACpB,SAAS,EAAE,iBAAiB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,SAAS,CAAA;KACpB;CAOD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;;OAIG;IACH,aAAa,CACZ,eAAe,EAAE,SAAS,EAC1B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;OAIG;IACH,aAAa,CACZ,eAAe,EAAE,SAAS,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,IAAI,CAAC,CAAA;CAChB;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAE1C,aAAa,CAClB,eAAe,EAAE,SAAS,EAC1B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IAeV,aAAa,CAClB,eAAe,EAAE,SAAS,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;CAYhB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Delegation capacity validation — depth + width caps applied at the kernel
3
+ * boundary before any write (session-hierarchy.md §6.5).
4
+ *
5
+ * Both `spawnSubSession()` and `broadcastHandoff()` call this module before
6
+ * committing; violations abort with typed {@link DelegationCapacityExceeded}
7
+ * and no partial writes occur (Convention #0: no workarounds; Convention #5:
8
+ * deny-by-default).
9
+ */
10
+ /**
11
+ * Raised when a spawn / broadcast would exceed the project's configured
12
+ * capacity caps. The check is a precondition — no partial writes occur on
13
+ * violation (session-hierarchy.md §6.5).
14
+ */
15
+ export class DelegationCapacityExceeded extends Error {
16
+ details;
17
+ constructor(details) {
18
+ super(`Delegation capacity exceeded: ${details.dimension} ${details.current}/${details.limit} on ${details.sessionId}`);
19
+ this.name = 'DelegationCapacityExceeded';
20
+ this.details = details;
21
+ }
22
+ }
23
+ /**
24
+ * Default validator backed by {@link SessionStore}. Uses `getAncestry` for
25
+ * depth (root-to-self chain length) and `getChildren` for width (count of
26
+ * existing direct sub-sessions).
27
+ */
28
+ export class DefaultCapacityValidator {
29
+ store;
30
+ constructor(store) {
31
+ this.store = store;
32
+ }
33
+ async validateDepth(parentSessionId, projectMaxDepth, tenantId) {
34
+ const ancestry = await this.store.getAncestry(parentSessionId, tenantId);
35
+ // depth is 0-indexed — root session has depth 0. New child depth =
36
+ // ancestry length (root-to-parent inclusive).
37
+ const newDepth = ancestry.length;
38
+ if (newDepth > projectMaxDepth) {
39
+ throw new DelegationCapacityExceeded({
40
+ dimension: 'depth',
41
+ current: newDepth,
42
+ limit: projectMaxDepth,
43
+ sessionId: parentSessionId,
44
+ });
45
+ }
46
+ }
47
+ async validateWidth(parentSessionId, pendingNewChildren, projectMaxWidth, tenantId) {
48
+ const existing = await this.store.getChildren(parentSessionId, tenantId);
49
+ const total = existing.length + pendingNewChildren;
50
+ if (total > projectMaxWidth) {
51
+ throw new DelegationCapacityExceeded({
52
+ dimension: 'width',
53
+ current: total,
54
+ limit: projectMaxWidth,
55
+ sessionId: parentSessionId,
56
+ });
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=capacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacity.js","sourceRoot":"","sources":["../../../src/session/handoff/capacity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC3C,OAAO,CAKf;IAED,YAAY,OAKX;QACA,KAAK,CACJ,iCAAiC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,SAAS,EAAE,CAChH,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAmCD;;;;GAIG;AACH,MAAM,OAAO,wBAAwB;IACP;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,aAAa,CAClB,eAA0B,EAC1B,eAAuB,EACvB,QAAkB;QAElB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QACxE,mEAAmE;QACnE,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAA;QAChC,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,0BAA0B,CAAC;gBACpC,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,QAAQ;gBACjB,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,eAAe;aAC1B,CAAC,CAAA;QACH,CAAC;IACF,CAAC;IAED,KAAK,CAAC,aAAa,CAClB,eAA0B,EAC1B,kBAA0B,EAC1B,eAAuB,EACvB,QAAkB;QAElB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,kBAAkB,CAAA;QAClD,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;YAC7B,MAAM,IAAI,0BAA0B,CAAC;gBACpC,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,eAAe;aAC1B,CAAC,CAAA;QACH,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * HandoffEventSink — pluggable event sink for Phase 4.
3
+ *
4
+ * Phase 4 does NOT extend `RunEvent` with handoff variants (they land in a
5
+ * later phase that wires the full `SessionHierarchyEvent` union referenced
6
+ * by roadmap §1). In the meantime the flow functions invoke this sink so
7
+ * consumers + tests can observe state transitions without a concrete event
8
+ * bus. Every callback is optional; {@link NOOP_HANDOFF_SINK} is the
9
+ * deny-by-default instance to pass when observation is not needed.
10
+ */
11
+ import type { SessionId } from '../../types/ids/index.js';
12
+ import type { HandoffId } from '../../types/session/ids.js';
13
+ /** Fired when a source session transitions `idle → locked` for handoff. */
14
+ export interface HandoffLockedEvent {
15
+ sessionId: SessionId;
16
+ at: Date;
17
+ }
18
+ /**
19
+ * Fired when a compensating rollback returns a source session
20
+ * `locked → idle` (either CAS failure or downstream provisioning failure).
21
+ */
22
+ export interface HandoffUnlockedEvent {
23
+ sessionId: SessionId;
24
+ at: Date;
25
+ }
26
+ /**
27
+ * Fired once per handoff commit. For `single` the `handoffIds` array has one
28
+ * entry; for `broadcast` it contains every recipient's assignment id.
29
+ */
30
+ export interface HandoffCommittedEvent {
31
+ sessionId: SessionId;
32
+ newVersion: number;
33
+ handoffIds: readonly HandoffId[];
34
+ at: Date;
35
+ }
36
+ /**
37
+ * Fired when a broadcast fan-out mid-flight rolls back. `partialState` carries
38
+ * the per-stage counts of resources that were provisioned before the failure
39
+ * was detected — consumers can correlate with their own observability signals
40
+ * to verify the rollback is complete.
41
+ */
42
+ export interface HandoffBroadcastRollbackEvent {
43
+ sessionId: SessionId;
44
+ broadcastId: string;
45
+ reason: string;
46
+ partialState: {
47
+ assignmentsWritten: number;
48
+ subsessionsCreated: number;
49
+ worktreesProvisioned: number;
50
+ };
51
+ at: Date;
52
+ }
53
+ /**
54
+ * Pluggable observer interface. All callbacks optional; consumers implement
55
+ * only what they need (Convention #5 deny-by-default applies to event
56
+ * consumers too — they must opt in explicitly).
57
+ */
58
+ export interface HandoffEventSink {
59
+ onLocked?(ev: HandoffLockedEvent): void;
60
+ onUnlocked?(ev: HandoffUnlockedEvent): void;
61
+ onCommitted?(ev: HandoffCommittedEvent): void;
62
+ onBroadcastRollback?(ev: HandoffBroadcastRollbackEvent): void;
63
+ }
64
+ /** No-op sink — inject when the caller does not need handoff observability. */
65
+ export declare const NOOP_HANDOFF_SINK: HandoffEventSink;
66
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/session/handoff/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3D,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,EAAE,EAAE,IAAI,CAAA;CACR;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,SAAS,CAAA;IACpB,EAAE,EAAE,IAAI,CAAA;CACR;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;IAChC,EAAE,EAAE,IAAI,CAAA;CACR;AAED;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC7C,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE;QACb,kBAAkB,EAAE,MAAM,CAAA;QAC1B,kBAAkB,EAAE,MAAM,CAAA;QAC1B,oBAAoB,EAAE,MAAM,CAAA;KAC5B,CAAA;IACD,EAAE,EAAE,IAAI,CAAA;CACR;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACvC,UAAU,CAAC,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC3C,WAAW,CAAC,CAAC,EAAE,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAC7C,mBAAmB,CAAC,CAAC,EAAE,EAAE,6BAA6B,GAAG,IAAI,CAAA;CAC7D;AAED,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,gBAAoC,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HandoffEventSink — pluggable event sink for Phase 4.
3
+ *
4
+ * Phase 4 does NOT extend `RunEvent` with handoff variants (they land in a
5
+ * later phase that wires the full `SessionHierarchyEvent` union referenced
6
+ * by roadmap §1). In the meantime the flow functions invoke this sink so
7
+ * consumers + tests can observe state transitions without a concrete event
8
+ * bus. Every callback is optional; {@link NOOP_HANDOFF_SINK} is the
9
+ * deny-by-default instance to pass when observation is not needed.
10
+ */
11
+ /** No-op sink — inject when the caller does not need handoff observability. */
12
+ export const NOOP_HANDOFF_SINK = Object.freeze({});
13
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/session/handoff/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6DH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ export type { HandoffAssignment, HandoffMode, HandoffOutcome } from './assignment.js';
2
+ export { DefaultCapacityValidator, DelegationCapacityExceeded, } from './capacity.js';
3
+ export type { CapacityDimension, CapacityValidator } from './capacity.js';
4
+ export { HandoffLockRejected, HandoffVersionConflict } from './version.js';
5
+ export type { HandoffLockRejectedReason } from './version.js';
6
+ export { NOOP_HANDOFF_SINK } from './events.js';
7
+ export type { HandoffBroadcastRollbackEvent, HandoffCommittedEvent, HandoffEventSink, HandoffLockedEvent, HandoffUnlockedEvent, } from './events.js';
8
+ export { executeSingleHandoff, NOOP_RUN_STATUS_RESOLVER } from './single.js';
9
+ export type { RunStatusResolver, SingleHandoffDeps } from './single.js';
10
+ export { executeBroadcastHandoff } from './broadcast.js';
11
+ export type { BroadcastHandoffDeps } from './broadcast.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/handoff/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErF,OAAO,EACN,wBAAwB,EACxB,0BAA0B,GAC1B,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEzE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC1E,YAAY,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EACX,6BAA6B,EAC7B,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,9 @@
1
+ // Sub-barrel for the handoff state machine (Convention #4).
2
+ // Concrete flow functions + types live in sibling files; re-export the public
3
+ // surface here. See session-hierarchy.md §6.
4
+ export { DefaultCapacityValidator, DelegationCapacityExceeded, } from './capacity.js';
5
+ export { HandoffLockRejected, HandoffVersionConflict } from './version.js';
6
+ export { NOOP_HANDOFF_SINK } from './events.js';
7
+ export { executeSingleHandoff, NOOP_RUN_STATUS_RESOLVER } from './single.js';
8
+ export { executeBroadcastHandoff } from './broadcast.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/handoff/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,8EAA8E;AAC9E,6CAA6C;AAI7C,OAAO,EACN,wBAAwB,EACxB,0BAA0B,GAC1B,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAG1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAS/C,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAG5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Single-recipient handoff flow — `idle → locked → CAS → commit | revert`.
3
+ *
4
+ * See session-hierarchy.md §6.1 (single-recipient flow) and §6.4 (concurrent
5
+ * CAS). Function-based per Convention #9 — dependencies arrive as an
6
+ * explicit `deps` envelope so tests can inject mocks and production code
7
+ * composes flows without a class hierarchy.
8
+ *
9
+ * Flow (pattern doc §5.1 + §6.1):
10
+ * 1. Load source session; verify tenant.
11
+ * 2. Check status (must be `idle`); no non-terminal Runs.
12
+ * 3. Validate capacity (depth + width).
13
+ * 4. Transition source `idle → locked` with CAS on `ownerVersion`.
14
+ * 5. Emit `onLocked`.
15
+ * 6. Spawn recipient sub-session + provision isolated workspace.
16
+ * 7. On any step 6 failure: compensating revert (`locked → idle`, version
17
+ * unchanged, dispose any partial worktree), emit `onUnlocked`, rethrow.
18
+ * 8. On success: commit `locked → idle` with updated `currentActor` +
19
+ * appended `previousActors` + bumped `ownerVersion`.
20
+ * 9. Emit `onCommitted` with the new version.
21
+ */
22
+ import type { ThreadManager } from '../../manager/thread/lifecycle.js';
23
+ import type { SessionId, TenantId } from '../../types/ids/index.js';
24
+ import type { SessionStore } from '../../types/session/store.js';
25
+ import type { WorkspaceBackendRegistry } from '../workspace/registry.js';
26
+ import type { HandoffAssignment, HandoffOutcome } from './assignment.js';
27
+ import type { CapacityValidator } from './capacity.js';
28
+ import type { HandoffEventSink } from './events.js';
29
+ /**
30
+ * Minimal surface the handoff flow queries for Run fan-in status. A Run is
31
+ * considered "blocking" if it is in any non-terminal status that prevents the
32
+ * source session from transitioning to `locked` (session-hierarchy.md §5.1).
33
+ *
34
+ * The flow injects the resolver so Phase 4 stays decoupled from Phase 6's
35
+ * Run persistence refactor. Production wires the real Run store; tests stub.
36
+ */
37
+ export interface RunStatusResolver {
38
+ /**
39
+ * Returns the reason the session has a non-terminal Run, or `null` when
40
+ * all Runs are terminal and the lock is allowed.
41
+ */
42
+ blockingRun(sessionId: SessionId, tenantId: TenantId): Promise<{
43
+ reason: 'active_run' | 'pending_hitl' | 'pending_subsession';
44
+ } | null>;
45
+ }
46
+ /** Null resolver — treats every session as unblocked. Used by tests that do not exercise Run fan-in. */
47
+ export declare const NOOP_RUN_STATUS_RESOLVER: RunStatusResolver;
48
+ export interface SingleHandoffDeps {
49
+ store: SessionStore;
50
+ workspaceRegistry: WorkspaceBackendRegistry;
51
+ capacity: CapacityValidator;
52
+ events: HandoffEventSink;
53
+ runStatus?: RunStatusResolver;
54
+ /**
55
+ * Gate the recipient-session creation on the Thread being `'open'`.
56
+ * Added in Phase 2.6 to mirror spawn — a handoff into an archived
57
+ * Thread would otherwise undermine `ThreadManager.archive`.
58
+ */
59
+ threadManager: ThreadManager;
60
+ }
61
+ /**
62
+ * Executes a single-recipient handoff against `deps.store`. Throws
63
+ * {@link HandoffLockRejected}, {@link HandoffVersionConflict},
64
+ * {@link TenantIsolationError}, or {@link DelegationCapacityExceeded} on
65
+ * invariant violations. Workspace provisioning failures surface as
66
+ * {@link WorkspaceBackendError} after the compensating revert.
67
+ */
68
+ export declare function executeSingleHandoff(deps: SingleHandoffDeps, assignment: HandoffAssignment, tenantId: TenantId): Promise<HandoffOutcome>;
69
+ //# sourceMappingURL=single.d.ts.map