@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,14 @@
1
+ // Sub-barrel for the session-scoped persistence module (Convention #4).
2
+ //
3
+ // `SessionStore` replaces the legacy `ConversationStore`; messages are scoped
4
+ // to a `SessionId` (not a bare thread) and every accessor carries explicit
5
+ // `TenantId` per session-hierarchy.md §12.1. Concrete implementations live
6
+ // in sibling files; re-export them here so consumers import via
7
+ // `../store/session/index.js`.
8
+
9
+ export { InMemorySessionStore } from './memory.js'
10
+ export { DiskSessionStore } from './disk.js'
11
+ export type { DiskSessionStoreConfig } from './disk.js'
12
+ export type { SessionMessage } from './messages.js'
13
+ export { getAncestry, getChildren, orderChildren } from './linkage.js'
14
+ export type { LinkageView } from './linkage.js'
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Linkage helpers for {@link SessionStore} — pure functions over raw store
3
+ * maps so they can be reused by both {@link InMemorySessionStore} and
4
+ * {@link DiskSessionStore}.
5
+ *
6
+ * See session-hierarchy.md §10.4 (Parent-Child Linkage) and §14.3 (drill
7
+ * primitive). Ancestry walks are cycle-guarded via visited-set; detection
8
+ * surfaces as {@link AncestryCycleError}.
9
+ */
10
+
11
+ import { AncestryCycleError } from '../../session/errors.js'
12
+ import type { SubSession } from '../../session/hierarchy/sub-session.js'
13
+ import type { SessionId } from '../../types/ids/index.js'
14
+ import type { SubSessionId } from '../../types/session/ids.js'
15
+
16
+ /**
17
+ * Read shape required by the pure linkage helpers. Both in-memory and disk
18
+ * stores project their internal state into this view before delegating.
19
+ */
20
+ export interface LinkageView {
21
+ findChildSubSessions(parentSessionId: SessionId): readonly SubSession[]
22
+ findParentSubSession(childSessionId: SessionId): SubSession | null
23
+ }
24
+
25
+ /**
26
+ * Returns direct children of `sessionId` (one level). Pure over `view`.
27
+ */
28
+ export function getChildren(view: LinkageView, sessionId: SessionId): readonly SubSession[] {
29
+ return view.findChildSubSessions(sessionId)
30
+ }
31
+
32
+ /**
33
+ * Walks parent sub-session links and returns the session id chain from root
34
+ * to `sessionId` inclusive. Guards against cycles via a visited-set — in
35
+ * a healthy store the invariant holds and the guard never fires; a cycle
36
+ * indicates corruption (session-hierarchy.md §4.5 enforces acyclicity on
37
+ * write).
38
+ */
39
+ export function getAncestry(view: LinkageView, sessionId: SessionId): readonly SessionId[] {
40
+ const visited = new Set<SessionId>()
41
+ const chain: SessionId[] = []
42
+ let cursor: SessionId | null = sessionId
43
+
44
+ while (cursor !== null) {
45
+ if (visited.has(cursor)) {
46
+ throw new AncestryCycleError({
47
+ sessionId,
48
+ cyclePath: [...chain, cursor],
49
+ })
50
+ }
51
+ visited.add(cursor)
52
+ chain.push(cursor)
53
+
54
+ const parentEdge: SubSession | null = view.findParentSubSession(cursor)
55
+ cursor = parentEdge ? parentEdge.parentSessionId : null
56
+ }
57
+
58
+ // Reverse so the result is root-to-self, matching session-hierarchy.md §14.3.
59
+ return chain.reverse()
60
+ }
61
+
62
+ /**
63
+ * Pairs {@link SubSession} children with a stable order (spawnedAt ascending,
64
+ * then id as a deterministic tiebreaker). Callers that need a different
65
+ * ordering can re-sort.
66
+ */
67
+ export function orderChildren(children: readonly SubSession[]): readonly SubSession[] {
68
+ return [...children].sort((a, b) => {
69
+ const ta = a.spawnedAt.getTime()
70
+ const tb = b.spawnedAt.getTime()
71
+ if (ta !== tb) return ta - tb
72
+ return compareSubSessionId(a.id, b.id)
73
+ })
74
+ }
75
+
76
+ function compareSubSessionId(a: SubSessionId, b: SubSessionId): number {
77
+ if (a < b) return -1
78
+ if (a > b) return 1
79
+ return 0
80
+ }
@@ -0,0 +1,400 @@
1
+ /**
2
+ * InMemorySessionStore — reference in-memory implementation of
3
+ * {@link SessionStore}.
4
+ *
5
+ * Every accessor takes explicit {@link TenantId} (Convention #17). Any
6
+ * accessor called with a tenantId that does not match the resource's owning
7
+ * tenant throws {@link TenantIsolationError} — there is no fallback
8
+ * (Convention #5 deny-by-default, session-hierarchy.md §12.2).
9
+ */
10
+
11
+ import { TenantIsolationError } from '../../session/errors.js'
12
+ import type { Project } from '../../session/hierarchy/project.js'
13
+ import type { Session } from '../../session/hierarchy/session.js'
14
+ import type { SubSession } from '../../session/hierarchy/sub-session.js'
15
+ import { SessionAlreadySummarizedError } from '../../session/summary/ref.js'
16
+ import type { SessionSummaryRef } from '../../session/summary/ref.js'
17
+ import type { MessageId, SessionId, TenantId } from '../../types/ids/index.js'
18
+ import type { Message } from '../../types/message/index.js'
19
+ import type { ProjectId, SubSessionId } from '../../types/session/ids.js'
20
+ import type {
21
+ CreateProjectParams,
22
+ CreateSessionParams,
23
+ CreateSubSessionParams,
24
+ SessionStore,
25
+ SessionView,
26
+ } from '../../types/session/store.js'
27
+ import {
28
+ generateMessageId,
29
+ generateProjectId,
30
+ generateSessionId,
31
+ generateSubSessionId,
32
+ } from '../../utils/id.js'
33
+ import { getAncestry, getChildren, orderChildren } from './linkage.js'
34
+ import type { LinkageView } from './linkage.js'
35
+ import type { SessionMessage } from './messages.js'
36
+
37
+ interface ProjectRecord {
38
+ tenantId: TenantId
39
+ project: Project
40
+ }
41
+
42
+ interface SessionRecord {
43
+ tenantId: TenantId
44
+ session: Session
45
+ }
46
+
47
+ interface SubSessionRecord {
48
+ tenantId: TenantId
49
+ subSession: SubSession
50
+ }
51
+
52
+ interface SummaryRecord {
53
+ tenantId: TenantId
54
+ summary: SessionSummaryRef
55
+ }
56
+
57
+ /**
58
+ * Non-terminal statuses from which {@link InMemorySessionStore.recordSummary}
59
+ * flips the owning session to `'idle'` as part of the atomic materialize +
60
+ * transition contract (session-hierarchy.md §8.1). Other statuses — already
61
+ * terminal or awaiting HITL — are left untouched.
62
+ */
63
+ const SUMMARY_TERMINAL_FLIP_STATUSES: ReadonlySet<Session['status']> = new Set([
64
+ 'active',
65
+ 'locked',
66
+ 'awaiting_merge',
67
+ ])
68
+
69
+ export class InMemorySessionStore implements SessionStore {
70
+ private readonly projects = new Map<ProjectId, ProjectRecord>()
71
+ private readonly sessions = new Map<SessionId, SessionRecord>()
72
+ private readonly subSessions = new Map<SubSessionId, SubSessionRecord>()
73
+ private readonly messages = new Map<SessionId, SessionMessage[]>()
74
+ private readonly summaries = new Map<SessionId, SummaryRecord>()
75
+
76
+ // Project CRUD ------------------------------------------------------------
77
+
78
+ async createProject(params: CreateProjectParams, tenantId: TenantId): Promise<Project> {
79
+ if (params.tenantId !== tenantId) {
80
+ throw new TenantIsolationError({
81
+ requested: tenantId,
82
+ resource: `project(name=${params.name})`,
83
+ })
84
+ }
85
+ const now = new Date()
86
+ const project: Project = {
87
+ id: generateProjectId(),
88
+ tenantId,
89
+ name: params.name,
90
+ config: {
91
+ maxDelegationDepth: 4,
92
+ maxDelegationWidth: 8,
93
+ maxInterventionDepth: 10,
94
+ },
95
+ createdAt: now,
96
+ updatedAt: now,
97
+ }
98
+ this.projects.set(project.id, { tenantId, project })
99
+ return project
100
+ }
101
+
102
+ async getProject(projectId: ProjectId, tenantId: TenantId): Promise<Project | null> {
103
+ const record = this.projects.get(projectId)
104
+ if (!record) return null
105
+ this.assertTenant(record.tenantId, tenantId, `project(${projectId})`)
106
+ return record.project
107
+ }
108
+
109
+ // Session CRUD ------------------------------------------------------------
110
+
111
+ async createSession(params: CreateSessionParams, tenantId: TenantId): Promise<Session> {
112
+ const projectRecord = this.projects.get(params.projectId)
113
+ if (!projectRecord) {
114
+ throw new Error(`Project ${params.projectId} not found`)
115
+ }
116
+ this.assertTenant(projectRecord.tenantId, tenantId, `project(${params.projectId})`)
117
+
118
+ const now = new Date()
119
+ const session: Session = {
120
+ id: generateSessionId(),
121
+ projectId: params.projectId,
122
+ tenantId,
123
+ status: 'idle',
124
+ currentActor: params.currentActor,
125
+ previousActors: [],
126
+ workspaceId: null,
127
+ ownerVersion: 0,
128
+ createdAt: now,
129
+ updatedAt: now,
130
+ }
131
+ this.sessions.set(session.id, { tenantId, session })
132
+ return session
133
+ }
134
+
135
+ async getSession(sessionId: SessionId, tenantId: TenantId): Promise<Session | null> {
136
+ const record = this.sessions.get(sessionId)
137
+ if (!record) return null
138
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
139
+ return record.session
140
+ }
141
+
142
+ async updateSession(session: Session, tenantId: TenantId): Promise<void> {
143
+ const record = this.sessions.get(session.id)
144
+ if (!record) {
145
+ throw new Error(`Session ${session.id} not found`)
146
+ }
147
+ this.assertTenant(record.tenantId, tenantId, `session(${session.id})`)
148
+ if (session.tenantId !== tenantId) {
149
+ throw new TenantIsolationError({
150
+ requested: tenantId,
151
+ resource: `session(${session.id}) payload`,
152
+ })
153
+ }
154
+ this.sessions.set(session.id, { tenantId, session: { ...session, updatedAt: new Date() } })
155
+ }
156
+
157
+ async deleteSession(sessionId: SessionId, tenantId: TenantId): Promise<void> {
158
+ const record = this.sessions.get(sessionId)
159
+ if (!record) return // Idempotent: missing = no-op.
160
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
161
+
162
+ // Policy: reject if sub-sessions still attach to this session (either as
163
+ // parent or child). Callers must delete children first — Convention #5
164
+ // deny-by-default; no implicit cascade.
165
+ for (const subRecord of this.subSessions.values()) {
166
+ const { subSession } = subRecord
167
+ if (subSession.parentSessionId === sessionId || subSession.childSessionId === sessionId) {
168
+ throw new Error(
169
+ `Session ${sessionId} has attached sub-sessions; delete them before deleting the session`,
170
+ )
171
+ }
172
+ }
173
+
174
+ this.sessions.delete(sessionId)
175
+ this.messages.delete(sessionId)
176
+ this.summaries.delete(sessionId)
177
+ }
178
+
179
+ // SubSession CRUD ---------------------------------------------------------
180
+
181
+ async createSubSession(params: CreateSubSessionParams, tenantId: TenantId): Promise<SubSession> {
182
+ const parentRecord = this.sessions.get(params.parentSessionId)
183
+ if (!parentRecord) {
184
+ throw new Error(`Parent session ${params.parentSessionId} not found`)
185
+ }
186
+ this.assertTenant(parentRecord.tenantId, tenantId, `session(${params.parentSessionId})`)
187
+
188
+ const childRecord = this.sessions.get(params.childSessionId)
189
+ if (!childRecord) {
190
+ throw new Error(`Child session ${params.childSessionId} not found`)
191
+ }
192
+ this.assertTenant(childRecord.tenantId, tenantId, `session(${params.childSessionId})`)
193
+
194
+ const now = new Date()
195
+ const subSession: SubSession = {
196
+ id: generateSubSessionId(),
197
+ parentSessionId: params.parentSessionId,
198
+ childSessionId: params.childSessionId,
199
+ kind: params.kind,
200
+ status: 'pending',
201
+ spawnedBy: params.spawnedBy,
202
+ spawnedAt: now,
203
+ failureMode: params.failureMode ?? 'delegate',
204
+ completionMode: params.completionMode ?? 'summary_ref',
205
+ workspaceId: null,
206
+ updatedAt: now,
207
+ }
208
+ this.subSessions.set(subSession.id, { tenantId, subSession })
209
+ return subSession
210
+ }
211
+
212
+ async getSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<SubSession | null> {
213
+ const record = this.subSessions.get(subSessionId)
214
+ if (!record) return null
215
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
216
+ return record.subSession
217
+ }
218
+
219
+ async updateSubSession(subSession: SubSession, tenantId: TenantId): Promise<void> {
220
+ const record = this.subSessions.get(subSession.id)
221
+ if (!record) {
222
+ throw new Error(`SubSession ${subSession.id} not found`)
223
+ }
224
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSession.id})`)
225
+ this.subSessions.set(subSession.id, {
226
+ tenantId,
227
+ subSession: { ...subSession, updatedAt: new Date() },
228
+ })
229
+ }
230
+
231
+ async deleteSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<void> {
232
+ const record = this.subSessions.get(subSessionId)
233
+ if (!record) return // Idempotent: missing = no-op.
234
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
235
+ this.subSessions.delete(subSessionId)
236
+ }
237
+
238
+ // Messages ----------------------------------------------------------------
239
+
240
+ async appendMessage(
241
+ sessionId: SessionId,
242
+ message: Message,
243
+ tenantId: TenantId,
244
+ ): Promise<MessageId> {
245
+ const record = this.sessions.get(sessionId)
246
+ if (!record) {
247
+ throw new Error(`Session ${sessionId} not found`)
248
+ }
249
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
250
+
251
+ const id = generateMessageId()
252
+ const entry: SessionMessage = {
253
+ id,
254
+ sessionId,
255
+ tenantId,
256
+ message,
257
+ at: new Date(),
258
+ }
259
+ const existing = this.messages.get(sessionId)
260
+ if (existing) {
261
+ existing.push(entry)
262
+ } else {
263
+ this.messages.set(sessionId, [entry])
264
+ }
265
+ return id
266
+ }
267
+
268
+ async loadMessages(sessionId: SessionId, tenantId: TenantId): Promise<readonly Message[]> {
269
+ const record = this.sessions.get(sessionId)
270
+ if (!record) return []
271
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
272
+ const entries = this.messages.get(sessionId) ?? []
273
+ return entries.map((e) => e.message)
274
+ }
275
+
276
+ async loadSessionMessages(
277
+ sessionId: SessionId,
278
+ tenantId: TenantId,
279
+ ): Promise<readonly SessionMessage[]> {
280
+ const record = this.sessions.get(sessionId)
281
+ if (!record) return []
282
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
283
+ const entries = this.messages.get(sessionId) ?? []
284
+ // Return a shallow copy so callers cannot mutate the internal log.
285
+ return entries.map((e) => ({ ...e }))
286
+ }
287
+
288
+ // Linkage -----------------------------------------------------------------
289
+
290
+ async getChildren(sessionId: SessionId, tenantId: TenantId): Promise<readonly SubSession[]> {
291
+ const record = this.sessions.get(sessionId)
292
+ if (!record) return []
293
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
294
+ return orderChildren(getChildren(this.linkageView(tenantId), sessionId))
295
+ }
296
+
297
+ async getAncestry(sessionId: SessionId, tenantId: TenantId): Promise<readonly SessionId[]> {
298
+ const record = this.sessions.get(sessionId)
299
+ if (!record) return []
300
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
301
+ return getAncestry(this.linkageView(tenantId), sessionId)
302
+ }
303
+
304
+ async drill(sessionId: SessionId, tenantId: TenantId): Promise<SessionView | null> {
305
+ const record = this.sessions.get(sessionId)
306
+ if (!record) return null
307
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
308
+
309
+ const view = this.linkageView(tenantId)
310
+ return {
311
+ session: record.session,
312
+ children: orderChildren(getChildren(view, sessionId)),
313
+ ancestry: getAncestry(view, sessionId),
314
+ }
315
+ }
316
+
317
+ // Summary (§4.7 / §8.1) ---------------------------------------------------
318
+
319
+ async recordSummary(
320
+ summary: SessionSummaryRef & { materializedBy: 'kernel' },
321
+ tenantId: TenantId,
322
+ ): Promise<void> {
323
+ if (summary.tenantId !== tenantId) {
324
+ throw new TenantIsolationError({
325
+ requested: tenantId,
326
+ resource: `summary(${summary.id}) payload`,
327
+ })
328
+ }
329
+ const sessionRecord = this.sessions.get(summary.sessionRef)
330
+ if (!sessionRecord) {
331
+ throw new Error(`Session ${summary.sessionRef} not found`)
332
+ }
333
+ this.assertTenant(sessionRecord.tenantId, tenantId, `session(${summary.sessionRef})`)
334
+
335
+ // Atomic within the call: summary persist + session status flip commit
336
+ // together. An existing summary with the same id is the recovery path —
337
+ // idempotently replay the status flip without duplicating the record.
338
+ const existing = this.summaries.get(summary.sessionRef)
339
+ if (existing && existing.summary.id !== summary.id) {
340
+ throw new SessionAlreadySummarizedError({
341
+ sessionId: summary.sessionRef,
342
+ existingSummaryId: existing.summary.id,
343
+ })
344
+ }
345
+
346
+ if (!existing) {
347
+ this.summaries.set(summary.sessionRef, { tenantId, summary })
348
+ }
349
+
350
+ if (SUMMARY_TERMINAL_FLIP_STATUSES.has(sessionRecord.session.status)) {
351
+ this.sessions.set(summary.sessionRef, {
352
+ tenantId,
353
+ session: {
354
+ ...sessionRecord.session,
355
+ status: 'idle',
356
+ updatedAt: new Date(),
357
+ },
358
+ })
359
+ }
360
+ }
361
+
362
+ async getSummary(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
363
+ const record = this.summaries.get(sessionId)
364
+ if (!record) return null
365
+ this.assertTenant(record.tenantId, tenantId, `summary(${record.summary.id})`)
366
+ return record.summary
367
+ }
368
+
369
+ // Helpers -----------------------------------------------------------------
370
+
371
+ private assertTenant(actual: TenantId, requested: TenantId, resource: string): void {
372
+ if (actual !== requested) {
373
+ throw new TenantIsolationError({ requested, resource })
374
+ }
375
+ }
376
+
377
+ private linkageView(tenantId: TenantId): LinkageView {
378
+ return {
379
+ findChildSubSessions: (parentSessionId) => {
380
+ const matches: SubSession[] = []
381
+ for (const record of this.subSessions.values()) {
382
+ if (record.tenantId !== tenantId) continue
383
+ if (record.subSession.parentSessionId === parentSessionId) {
384
+ matches.push(record.subSession)
385
+ }
386
+ }
387
+ return matches
388
+ },
389
+ findParentSubSession: (childSessionId) => {
390
+ for (const record of this.subSessions.values()) {
391
+ if (record.tenantId !== tenantId) continue
392
+ if (record.subSession.childSessionId === childSessionId) {
393
+ return record.subSession
394
+ }
395
+ }
396
+ return null
397
+ },
398
+ }
399
+ }
400
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SessionMessage — the persistence record for a {@link Message} in the
3
+ * session hierarchy.
4
+ *
5
+ * Rename of the legacy `ConversationMessage` concept, scoped by
6
+ * {@link SessionId} and carrying {@link TenantId} for the Convention #17
7
+ * key tuple (session-hierarchy.md §12.1). The `message` field preserves the
8
+ * full Run-scoped `Message` payload verbatim; the wrapper only adds
9
+ * addressability + tenant isolation.
10
+ */
11
+
12
+ import type { MessageId, SessionId, TenantId } from '../../types/ids/index.js'
13
+ import type { Message } from '../../types/message/index.js'
14
+
15
+ export interface SessionMessage {
16
+ readonly id: MessageId
17
+ readonly sessionId: SessionId
18
+ readonly tenantId: TenantId
19
+ readonly message: Message
20
+ readonly at: Date
21
+ }
@@ -1,9 +1,10 @@
1
1
  import type { AgentStatus, CostInfo, TokenUsage } from '../common/index.js'
2
- import type { RunId, ThreadId } from '../ids/index.js'
2
+ import type { RunId, SessionId, TenantId, ThreadId } from '../ids/index.js'
3
3
  import type { InvocationState } from '../invocation/index.js'
4
4
  import type { Message } from '../message/index.js'
5
5
  import type { PermissionMode } from '../permission/index.js'
6
6
  import type { StopReason } from '../run/stop-reason.js'
7
+ import type { ProjectId } from '../session/ids.js'
7
8
  import type { TaskStore } from '../task/index.js'
8
9
  import type { ToolAvailability } from '../tool/index.js'
9
10
 
@@ -22,8 +23,37 @@ export interface BaseAgentConfig {
22
23
  permissionMode?: PermissionMode
23
24
  env?: Record<string, string>
24
25
 
26
+ /**
27
+ * @deprecated Use `projectId`. Kept as a migration-window mirror; when both
28
+ * are present `projectId` wins. See session-hierarchy.md §13.1.
29
+ */
25
30
  threadId?: ThreadId
26
31
 
32
+ /**
33
+ * Long-lived goal scope for the run. Required at runtime in 0.2.0 per
34
+ * session-hierarchy.md §12.1 — `{@link ReactiveAgent}`, `{@link
35
+ * SupervisorAgent}`, etc. reject configs missing this (`'X requires
36
+ * sessionId, projectId, and tenantId in config (§12.1)'`).
37
+ *
38
+ * Kept optional at the TYPE level during the 0.2.x migration window
39
+ * because {@link AgentManager} stamps this field AFTER `configBuilder`
40
+ * returns (manager/agent/lifecycle.ts:228–230). That stamping path is
41
+ * how every `@namzu/agents` configBuilder currently gets its tenant /
42
+ * session / project triple; flipping the type to required without first
43
+ * updating every {@link AgentFactoryOptions} consumer (which does not
44
+ * carry these fields) would be a gratuitous downstream break.
45
+ *
46
+ * Tightening to required is Phase 9 Known Delta #6. The type-level flip
47
+ * lands in 0.3.0 alongside `AgentFactoryOptions` gaining the triple.
48
+ */
49
+ projectId?: ProjectId
50
+
51
+ /** Session under which the run executes. See `projectId` for the tightening plan. */
52
+ sessionId?: SessionId
53
+
54
+ /** Isolation boundary (Convention #17). See `projectId` for the tightening plan. */
55
+ tenantId?: TenantId
56
+
27
57
  parentRunId?: RunId
28
58
 
29
59
  depth?: number
@@ -1,7 +1,10 @@
1
+ import type { ActorRef } from '../../session/hierarchy/actor.js'
2
+ import type { WorkspaceBackendKind } from '../../session/workspace/ref.js'
1
3
  import type { TokenUsage } from '../common/index.js'
2
- import type { RunId, TaskId, ThreadId } from '../ids/index.js'
4
+ import type { RunId, SessionId, TaskId, TenantId } from '../ids/index.js'
3
5
  import type { Message } from '../message/index.js'
4
6
  import type { RunEventListener } from '../run/events.js'
7
+ import type { ProjectId } from '../session/ids.js'
5
8
  import type { AgentInput, BaseAgentConfig, BaseAgentResult } from './base.js'
6
9
  import type { Agent } from './core.js'
7
10
  import type { AgentFactoryOptions } from './factory.js'
@@ -19,6 +22,17 @@ export function isTerminalAgentTaskState(state: AgentTaskState): boolean {
19
22
  return state === 'completed' || state === 'failed' || state === 'canceled' || state === 'rejected'
20
23
  }
21
24
 
25
+ /**
26
+ * Context carried into {@link AgentManager.sendMessage}. Phase 6 promotes
27
+ * `tenantId`, `sessionId`, `projectId`, and `parentActor` to required fields —
28
+ * the spawn path is the ingress point for the session hierarchy; callers must
29
+ * provide the full scoping set (session-hierarchy.md §12.1 required-callsite
30
+ * matrix).
31
+ *
32
+ * `threadId` was removed — `projectId` owns the root scope. The deprecated
33
+ * alias `type ThreadId = ProjectId` still compiles for consumers transitioning
34
+ * off the name, but the shape no longer exposes a separate slot.
35
+ */
22
36
  export interface AgentTaskContext {
23
37
  parentRunId: RunId
24
38
 
@@ -32,7 +46,24 @@ export interface AgentTaskContext {
32
46
 
33
47
  factoryOptions?: AgentFactoryOptions
34
48
 
35
- threadId?: ThreadId
49
+ /** Isolation boundary. Required per session-hierarchy.md §12.1. */
50
+ tenantId: TenantId
51
+
52
+ /**
53
+ * Parent session under which any sub-agent spawn is recorded. Required
54
+ * in 0.2.0; a spawn cannot be attributed without it.
55
+ */
56
+ sessionId: SessionId
57
+
58
+ /** Long-lived goal scope (replaces `threadId`). Required. */
59
+ projectId: ProjectId
60
+
61
+ /**
62
+ * The actor invoking this task. Children built off this context stamp
63
+ * their own `parentActor: ActorRef` linking back via the actor chain
64
+ * (session-hierarchy.md §4.3 / §10.4).
65
+ */
66
+ parentActor: ActorRef
36
67
  }
37
68
 
38
69
  export interface AgentTaskBudget {
@@ -66,6 +97,12 @@ export interface AgentTaskProgress {
66
97
  recentActivities: string[]
67
98
  }
68
99
 
100
+ /**
101
+ * Options accepted by {@link AgentManager.sendMessage}. Phase 6 adds the
102
+ * required sub-session spawn scope (`parentSessionId`, `tenantId`, `projectId`,
103
+ * `parentActor`) so the manager can create a SubSession + child Session +
104
+ * WorkspaceRef triple atomically on every spawn.
105
+ */
69
106
  export interface SendMessageOptions {
70
107
  agentId: string
71
108
 
@@ -77,6 +114,25 @@ export interface SendMessageOptions {
77
114
  tokenBudget?: number
78
115
  timeoutMs?: number
79
116
  }
117
+
118
+ /**
119
+ * Parent session under which the new sub-session is created. Capacity
120
+ * validation (depth + width) is applied against this session.
121
+ */
122
+ parentSessionId: SessionId
123
+
124
+ tenantId: TenantId
125
+
126
+ projectId: ProjectId
127
+
128
+ /** The actor requesting the spawn — seeds the child's `parentActor`. */
129
+ parentActor: ActorRef
130
+
131
+ /**
132
+ * Workspace backend to provision for the child session. Defaults to
133
+ * `git-worktree` — the MVP reference backend from Phase 3.
134
+ */
135
+ workspaceBackend?: WorkspaceBackendKind
80
136
  }
81
137
 
82
138
  export interface AgentManagerConfig {
@@ -1,6 +1,13 @@
1
1
  import type { RunId, ThreadId } from '../ids/index.js'
2
2
  import type { Message } from '../message/index.js'
3
3
 
4
+ /**
5
+ * @deprecated Use `SessionStore` from `@namzu/sdk` (import via
6
+ * `types/session/store.ts` or the root barrel). `ConversationStore` is
7
+ * thread-scoped and does not carry the `tenantId` required by
8
+ * session-hierarchy.md §12.1. Scheduled for removal in 0.3.0; the one-
9
+ * version migration window follows session-hierarchy.md §13.1.
10
+ */
4
11
  export interface ConversationStore {
5
12
  loadMessages(threadId: ThreadId): Message[]
6
13