@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,13 @@
1
+ // Sub-barrel for the session-scoped persistence module (Convention #4).
2
+ //
3
+ // Messages are scoped to a `SessionId` and every accessor carries explicit
4
+ // `TenantId` (Convention #17). Concrete implementations live in sibling
5
+ // files; re-export them here so consumers import via
6
+ // `../store/session/index.js`.
7
+
8
+ export { InMemorySessionStore } from './memory.js'
9
+ export { DiskSessionStore } from './disk.js'
10
+ export type { DiskSessionStoreConfig } from './disk.js'
11
+ export type { SessionMessage } from './messages.js'
12
+ export { getAncestry, getChildren, orderChildren } from './linkage.js'
13
+ 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,412 @@
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, ThreadId } 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
+ threadId: params.threadId,
122
+ projectId: params.projectId,
123
+ tenantId,
124
+ status: 'idle',
125
+ currentActor: params.currentActor,
126
+ previousActors: [],
127
+ workspaceId: null,
128
+ ownerVersion: 0,
129
+ createdAt: now,
130
+ updatedAt: now,
131
+ }
132
+ this.sessions.set(session.id, { tenantId, session })
133
+ return session
134
+ }
135
+
136
+ async getSession(sessionId: SessionId, tenantId: TenantId): Promise<Session | null> {
137
+ const record = this.sessions.get(sessionId)
138
+ if (!record) return null
139
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
140
+ return record.session
141
+ }
142
+
143
+ async listSessions(threadId: ThreadId, tenantId: TenantId): Promise<readonly Session[]> {
144
+ const matches: Session[] = []
145
+ for (const record of this.sessions.values()) {
146
+ if (record.tenantId !== tenantId) continue
147
+ if (record.session.threadId !== threadId) continue
148
+ matches.push(record.session)
149
+ }
150
+ matches.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
151
+ return matches
152
+ }
153
+
154
+ async updateSession(session: Session, tenantId: TenantId): Promise<void> {
155
+ const record = this.sessions.get(session.id)
156
+ if (!record) {
157
+ throw new Error(`Session ${session.id} not found`)
158
+ }
159
+ this.assertTenant(record.tenantId, tenantId, `session(${session.id})`)
160
+ if (session.tenantId !== tenantId) {
161
+ throw new TenantIsolationError({
162
+ requested: tenantId,
163
+ resource: `session(${session.id}) payload`,
164
+ })
165
+ }
166
+ this.sessions.set(session.id, { tenantId, session: { ...session, updatedAt: new Date() } })
167
+ }
168
+
169
+ async deleteSession(sessionId: SessionId, tenantId: TenantId): Promise<void> {
170
+ const record = this.sessions.get(sessionId)
171
+ if (!record) return // Idempotent: missing = no-op.
172
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
173
+
174
+ // Policy: reject if sub-sessions still attach to this session (either as
175
+ // parent or child). Callers must delete children first — Convention #5
176
+ // deny-by-default; no implicit cascade.
177
+ for (const subRecord of this.subSessions.values()) {
178
+ const { subSession } = subRecord
179
+ if (subSession.parentSessionId === sessionId || subSession.childSessionId === sessionId) {
180
+ throw new Error(
181
+ `Session ${sessionId} has attached sub-sessions; delete them before deleting the session`,
182
+ )
183
+ }
184
+ }
185
+
186
+ this.sessions.delete(sessionId)
187
+ this.messages.delete(sessionId)
188
+ this.summaries.delete(sessionId)
189
+ }
190
+
191
+ // SubSession CRUD ---------------------------------------------------------
192
+
193
+ async createSubSession(params: CreateSubSessionParams, tenantId: TenantId): Promise<SubSession> {
194
+ const parentRecord = this.sessions.get(params.parentSessionId)
195
+ if (!parentRecord) {
196
+ throw new Error(`Parent session ${params.parentSessionId} not found`)
197
+ }
198
+ this.assertTenant(parentRecord.tenantId, tenantId, `session(${params.parentSessionId})`)
199
+
200
+ const childRecord = this.sessions.get(params.childSessionId)
201
+ if (!childRecord) {
202
+ throw new Error(`Child session ${params.childSessionId} not found`)
203
+ }
204
+ this.assertTenant(childRecord.tenantId, tenantId, `session(${params.childSessionId})`)
205
+
206
+ const now = new Date()
207
+ const subSession: SubSession = {
208
+ id: generateSubSessionId(),
209
+ parentSessionId: params.parentSessionId,
210
+ childSessionId: params.childSessionId,
211
+ kind: params.kind,
212
+ status: 'pending',
213
+ spawnedBy: params.spawnedBy,
214
+ spawnedAt: now,
215
+ failureMode: params.failureMode ?? 'delegate',
216
+ completionMode: params.completionMode ?? 'summary_ref',
217
+ workspaceId: null,
218
+ updatedAt: now,
219
+ }
220
+ this.subSessions.set(subSession.id, { tenantId, subSession })
221
+ return subSession
222
+ }
223
+
224
+ async getSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<SubSession | null> {
225
+ const record = this.subSessions.get(subSessionId)
226
+ if (!record) return null
227
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
228
+ return record.subSession
229
+ }
230
+
231
+ async updateSubSession(subSession: SubSession, tenantId: TenantId): Promise<void> {
232
+ const record = this.subSessions.get(subSession.id)
233
+ if (!record) {
234
+ throw new Error(`SubSession ${subSession.id} not found`)
235
+ }
236
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSession.id})`)
237
+ this.subSessions.set(subSession.id, {
238
+ tenantId,
239
+ subSession: { ...subSession, updatedAt: new Date() },
240
+ })
241
+ }
242
+
243
+ async deleteSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<void> {
244
+ const record = this.subSessions.get(subSessionId)
245
+ if (!record) return // Idempotent: missing = no-op.
246
+ this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
247
+ this.subSessions.delete(subSessionId)
248
+ }
249
+
250
+ // Messages ----------------------------------------------------------------
251
+
252
+ async appendMessage(
253
+ sessionId: SessionId,
254
+ message: Message,
255
+ tenantId: TenantId,
256
+ ): Promise<MessageId> {
257
+ const record = this.sessions.get(sessionId)
258
+ if (!record) {
259
+ throw new Error(`Session ${sessionId} not found`)
260
+ }
261
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
262
+
263
+ const id = generateMessageId()
264
+ const entry: SessionMessage = {
265
+ id,
266
+ sessionId,
267
+ tenantId,
268
+ message,
269
+ at: new Date(),
270
+ }
271
+ const existing = this.messages.get(sessionId)
272
+ if (existing) {
273
+ existing.push(entry)
274
+ } else {
275
+ this.messages.set(sessionId, [entry])
276
+ }
277
+ return id
278
+ }
279
+
280
+ async loadMessages(sessionId: SessionId, tenantId: TenantId): Promise<readonly Message[]> {
281
+ const record = this.sessions.get(sessionId)
282
+ if (!record) return []
283
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
284
+ const entries = this.messages.get(sessionId) ?? []
285
+ return entries.map((e) => e.message)
286
+ }
287
+
288
+ async loadSessionMessages(
289
+ sessionId: SessionId,
290
+ tenantId: TenantId,
291
+ ): Promise<readonly SessionMessage[]> {
292
+ const record = this.sessions.get(sessionId)
293
+ if (!record) return []
294
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
295
+ const entries = this.messages.get(sessionId) ?? []
296
+ // Return a shallow copy so callers cannot mutate the internal log.
297
+ return entries.map((e) => ({ ...e }))
298
+ }
299
+
300
+ // Linkage -----------------------------------------------------------------
301
+
302
+ async getChildren(sessionId: SessionId, tenantId: TenantId): Promise<readonly SubSession[]> {
303
+ const record = this.sessions.get(sessionId)
304
+ if (!record) return []
305
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
306
+ return orderChildren(getChildren(this.linkageView(tenantId), sessionId))
307
+ }
308
+
309
+ async getAncestry(sessionId: SessionId, tenantId: TenantId): Promise<readonly SessionId[]> {
310
+ const record = this.sessions.get(sessionId)
311
+ if (!record) return []
312
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
313
+ return getAncestry(this.linkageView(tenantId), sessionId)
314
+ }
315
+
316
+ async drill(sessionId: SessionId, tenantId: TenantId): Promise<SessionView | null> {
317
+ const record = this.sessions.get(sessionId)
318
+ if (!record) return null
319
+ this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
320
+
321
+ const view = this.linkageView(tenantId)
322
+ return {
323
+ session: record.session,
324
+ children: orderChildren(getChildren(view, sessionId)),
325
+ ancestry: getAncestry(view, sessionId),
326
+ }
327
+ }
328
+
329
+ // Summary (§4.7 / §8.1) ---------------------------------------------------
330
+
331
+ async recordSummary(
332
+ summary: SessionSummaryRef & { materializedBy: 'kernel' },
333
+ tenantId: TenantId,
334
+ ): Promise<void> {
335
+ if (summary.tenantId !== tenantId) {
336
+ throw new TenantIsolationError({
337
+ requested: tenantId,
338
+ resource: `summary(${summary.id}) payload`,
339
+ })
340
+ }
341
+ const sessionRecord = this.sessions.get(summary.sessionRef)
342
+ if (!sessionRecord) {
343
+ throw new Error(`Session ${summary.sessionRef} not found`)
344
+ }
345
+ this.assertTenant(sessionRecord.tenantId, tenantId, `session(${summary.sessionRef})`)
346
+
347
+ // Atomic within the call: summary persist + session status flip commit
348
+ // together. An existing summary with the same id is the recovery path —
349
+ // idempotently replay the status flip without duplicating the record.
350
+ const existing = this.summaries.get(summary.sessionRef)
351
+ if (existing && existing.summary.id !== summary.id) {
352
+ throw new SessionAlreadySummarizedError({
353
+ sessionId: summary.sessionRef,
354
+ existingSummaryId: existing.summary.id,
355
+ })
356
+ }
357
+
358
+ if (!existing) {
359
+ this.summaries.set(summary.sessionRef, { tenantId, summary })
360
+ }
361
+
362
+ if (SUMMARY_TERMINAL_FLIP_STATUSES.has(sessionRecord.session.status)) {
363
+ this.sessions.set(summary.sessionRef, {
364
+ tenantId,
365
+ session: {
366
+ ...sessionRecord.session,
367
+ status: 'idle',
368
+ updatedAt: new Date(),
369
+ },
370
+ })
371
+ }
372
+ }
373
+
374
+ async getSummary(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
375
+ const record = this.summaries.get(sessionId)
376
+ if (!record) return null
377
+ this.assertTenant(record.tenantId, tenantId, `summary(${record.summary.id})`)
378
+ return record.summary
379
+ }
380
+
381
+ // Helpers -----------------------------------------------------------------
382
+
383
+ private assertTenant(actual: TenantId, requested: TenantId, resource: string): void {
384
+ if (actual !== requested) {
385
+ throw new TenantIsolationError({ requested, resource })
386
+ }
387
+ }
388
+
389
+ private linkageView(tenantId: TenantId): LinkageView {
390
+ return {
391
+ findChildSubSessions: (parentSessionId) => {
392
+ const matches: SubSession[] = []
393
+ for (const record of this.subSessions.values()) {
394
+ if (record.tenantId !== tenantId) continue
395
+ if (record.subSession.parentSessionId === parentSessionId) {
396
+ matches.push(record.subSession)
397
+ }
398
+ }
399
+ return matches
400
+ },
401
+ findParentSubSession: (childSessionId) => {
402
+ for (const record of this.subSessions.values()) {
403
+ if (record.tenantId !== tenantId) continue
404
+ if (record.subSession.childSessionId === childSessionId) {
405
+ return record.subSession
406
+ }
407
+ }
408
+ return null
409
+ },
410
+ }
411
+ }
412
+ }
@@ -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
+ }