@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,16 @@
1
+ // Sub-barrel for the retention/archival module (Convention #4).
2
+ // Concrete types + manager live in sibling files.
3
+
4
+ export type { ArchiveBackendRef } from './archive-backend-ref.js'
5
+ export type { RetentionPolicy } from './policy.js'
6
+ export { RETENTION_POLICY_DISABLED } from './policy.js'
7
+ export type { ArchiveBackend, ArchiveInput, ArchiveOutput, SubSessionTombstone } from './backend.js'
8
+ export {
9
+ ArchivalManager,
10
+ ArchiveNotConfiguredError,
11
+ SubSessionNotArchivableError,
12
+ SubSessionNotArchivedError,
13
+ } from './archive.js'
14
+ export type { ArchivalManagerDeps, WorkspaceResolver } from './archive.js'
15
+ export { ArchiveNotFoundError, DiskArchiveBackend } from './disk-backend.js'
16
+ export type { DiskArchiveBackendConfig } from './disk-backend.js'
@@ -0,0 +1,53 @@
1
+ /**
2
+ * RetentionPolicy — per-project configuration for sub-session retention and
3
+ * archival. See session-hierarchy.md §12.3.
4
+ *
5
+ * Deny-by-default (Convention #5): the absence of any field means "no
6
+ * automatic archival." A policy without an `archiveBackend` cannot drive
7
+ * archival at all — {@link ArchivalManager.archive} rejects with
8
+ * {@link ArchiveNotConfiguredError}. The primitive Phase 8 ships is
9
+ * on-demand `archive(subSessionId)`; a scheduler that invokes the primitive
10
+ * is platform-layer (out of SDK scope per the roadmap "What's OUT" list).
11
+ *
12
+ * Phase 8 replaces the Phase 1 `RetentionPolicyRef = unknown` placeholder at
13
+ * `session/hierarchy/project.ts` with this real type.
14
+ */
15
+
16
+ import type { ArchiveBackendRef } from './archive-backend-ref.js'
17
+
18
+ /**
19
+ * Retention policy. Every field is optional (deny-by-default): no policy, no
20
+ * archival. See pattern doc §12.3 for rationale.
21
+ */
22
+ export interface RetentionPolicy {
23
+ /**
24
+ * Idle sub-sessions older than this are eligible for archival. Expressed in
25
+ * milliseconds to stay dependency-free — no `Duration` type in the kernel
26
+ * today. Absent field = no TTL (eligibility never triggers on age alone).
27
+ */
28
+ readonly idleSubSessionTTL?: number
29
+
30
+ /**
31
+ * Hard cap on sub-sessions per project. When exceeded, the oldest-idle
32
+ * sub-sessions become archival-eligible. Absent = no cap.
33
+ *
34
+ * Note: enforcement of this cap is platform-layer (scheduler territory).
35
+ * The SDK primitive `archive()` takes an explicit {@link SubSessionId} —
36
+ * it does not walk the project tree.
37
+ */
38
+ readonly maxSubSessionsPerProject?: number
39
+
40
+ /**
41
+ * Ref for the backing {@link ArchiveBackend}. Absent = archival disabled
42
+ * even if TTL/cap are set — {@link ArchivalManager.archive} rejects with
43
+ * {@link ArchiveNotConfiguredError}. This is the deny-by-default gate.
44
+ */
45
+ readonly archiveBackend?: ArchiveBackendRef
46
+ }
47
+
48
+ /**
49
+ * The empty retention policy — archival fully disabled. Exported as a named
50
+ * constant so call sites declare their deny-by-default posture explicitly
51
+ * rather than relying on `{}` literals (Convention #0, #5).
52
+ */
53
+ export const RETENTION_POLICY_DISABLED: RetentionPolicy = Object.freeze({})
@@ -0,0 +1,343 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { TenantIsolationError } from '../../../session/errors.js'
3
+ import type { ActorRef } from '../../../session/hierarchy/actor.js'
4
+ import { InMemorySessionStore } from '../../../store/session/memory.js'
5
+ import type { AgentId, SessionId, TenantId, UserId } from '../../../types/ids/index.js'
6
+ import type { SummaryId, ThreadId } from '../../../types/session/ids.js'
7
+ import type { DeliverableRef } from '../deliverable.js'
8
+ import { SessionSummaryMaterializer } from '../materialize.js'
9
+ import {
10
+ AGENT_SUMMARY_MAX_CHARS,
11
+ AgentSummaryTooLongError,
12
+ SessionAlreadySummarizedError,
13
+ } from '../ref.js'
14
+
15
+ const TEST_THREAD_ID = 'thd_test' as ThreadId
16
+
17
+ const tenantA = 'tnt_alpha' as TenantId
18
+ const tenantB = 'tnt_beta' as TenantId
19
+
20
+ function userActor(tenantId: TenantId): ActorRef {
21
+ return { kind: 'user', userId: 'usr_a' as UserId, tenantId }
22
+ }
23
+
24
+ function agentActor(tenantId: TenantId): ActorRef {
25
+ return { kind: 'agent', agentId: 'agt_a' as AgentId, tenantId }
26
+ }
27
+
28
+ function makeSummaryIdGenerator(): () => SummaryId {
29
+ let n = 0
30
+ return (): SummaryId => `sum_test_${++n}` as SummaryId
31
+ }
32
+
33
+ async function seedActiveSession(store: InMemorySessionStore, tenantId: TenantId) {
34
+ const project = await store.createProject({ tenantId, name: 'p1' }, tenantId)
35
+ const session = await store.createSession(
36
+ { threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor(tenantId) },
37
+ tenantId,
38
+ )
39
+ // Put the session into `active` so the materializer's status-flip behavior
40
+ // is observable.
41
+ await store.updateSession({ ...session, status: 'active' }, tenantId)
42
+ return { project, session: { ...session, status: 'active' as const } }
43
+ }
44
+
45
+ function buildMaterializer(store: InMemorySessionStore) {
46
+ return new SessionSummaryMaterializer({
47
+ store,
48
+ generateSummaryId: makeSummaryIdGenerator(),
49
+ now: () => new Date('2026-04-17T00:00:00Z'),
50
+ })
51
+ }
52
+
53
+ describe('SessionSummaryMaterializer.materialize', () => {
54
+ it('materializes on an active session and flips status to idle', async () => {
55
+ const store = new InMemorySessionStore()
56
+ const { session } = await seedActiveSession(store, tenantA)
57
+ const materializer = buildMaterializer(store)
58
+
59
+ const summary = await materializer.materialize({
60
+ sessionId: session.id,
61
+ tenantId: tenantA,
62
+ finalOutcome: { status: 'succeeded', verdict: 'done' },
63
+ agentSummary: 'Completed task X.',
64
+ declaredDeliverables: [],
65
+ keyDecisions: [],
66
+ })
67
+
68
+ expect(summary.id).toBe('sum_test_1')
69
+ expect(summary.sessionRef).toBe(session.id)
70
+ expect(summary.materializedBy).toBe('kernel')
71
+
72
+ const stored = await store.getSummary(session.id, tenantA)
73
+ expect(stored?.id).toBe(summary.id)
74
+
75
+ const reloaded = await store.getSession(session.id, tenantA)
76
+ expect(reloaded?.status).toBe('idle')
77
+ })
78
+
79
+ it('rejects an agentSummary exceeding AGENT_SUMMARY_MAX_CHARS', async () => {
80
+ const store = new InMemorySessionStore()
81
+ const { session } = await seedActiveSession(store, tenantA)
82
+ const materializer = buildMaterializer(store)
83
+
84
+ await expect(
85
+ materializer.materialize({
86
+ sessionId: session.id,
87
+ tenantId: tenantA,
88
+ finalOutcome: { status: 'succeeded' },
89
+ agentSummary: 'x'.repeat(AGENT_SUMMARY_MAX_CHARS + 1),
90
+ declaredDeliverables: [],
91
+ keyDecisions: [],
92
+ }),
93
+ ).rejects.toBeInstanceOf(AgentSummaryTooLongError)
94
+ })
95
+
96
+ it('rejects re-materialization when a summary already exists', async () => {
97
+ const store = new InMemorySessionStore()
98
+ const { session } = await seedActiveSession(store, tenantA)
99
+ const materializer = buildMaterializer(store)
100
+
101
+ await materializer.materialize({
102
+ sessionId: session.id,
103
+ tenantId: tenantA,
104
+ finalOutcome: { status: 'succeeded' },
105
+ agentSummary: 'first',
106
+ declaredDeliverables: [],
107
+ keyDecisions: [],
108
+ })
109
+
110
+ await expect(
111
+ materializer.materialize({
112
+ sessionId: session.id,
113
+ tenantId: tenantA,
114
+ finalOutcome: { status: 'succeeded' },
115
+ agentSummary: 'second',
116
+ declaredDeliverables: [],
117
+ keyDecisions: [],
118
+ }),
119
+ ).rejects.toBeInstanceOf(SessionAlreadySummarizedError)
120
+ })
121
+
122
+ it('rejects cross-tenant materialize with TenantIsolationError', async () => {
123
+ const store = new InMemorySessionStore()
124
+ const { session } = await seedActiveSession(store, tenantA)
125
+ const materializer = buildMaterializer(store)
126
+
127
+ await expect(
128
+ materializer.materialize({
129
+ sessionId: session.id,
130
+ tenantId: tenantB,
131
+ finalOutcome: { status: 'succeeded' },
132
+ agentSummary: 'x',
133
+ declaredDeliverables: [],
134
+ keyDecisions: [],
135
+ }),
136
+ ).rejects.toBeInstanceOf(TenantIsolationError)
137
+ })
138
+
139
+ it('preserves declaredDeliverables verbatim in the emitted ref', async () => {
140
+ const store = new InMemorySessionStore()
141
+ const { session } = await seedActiveSession(store, tenantA)
142
+ const materializer = buildMaterializer(store)
143
+
144
+ const deliverables: DeliverableRef[] = [
145
+ {
146
+ id: 'del_a' as DeliverableRef['id'],
147
+ kind: 'file',
148
+ path: 'src/foo.ts',
149
+ contentHash: 'abc123',
150
+ sizeBytes: 42,
151
+ },
152
+ {
153
+ id: 'del_b' as DeliverableRef['id'],
154
+ kind: 'artifact_blob',
155
+ storageRef: 'blob://x',
156
+ mediaType: 'application/json',
157
+ },
158
+ ]
159
+
160
+ const summary = await materializer.materialize({
161
+ sessionId: session.id,
162
+ tenantId: tenantA,
163
+ finalOutcome: { status: 'partial' },
164
+ agentSummary: '',
165
+ declaredDeliverables: deliverables,
166
+ keyDecisions: [],
167
+ })
168
+
169
+ expect(summary.deliverables).toEqual(deliverables)
170
+ })
171
+
172
+ it('preserves keyDecisions verbatim in the emitted ref', async () => {
173
+ const store = new InMemorySessionStore()
174
+ const { session } = await seedActiveSession(store, tenantA)
175
+ const materializer = buildMaterializer(store)
176
+
177
+ const decisions = [
178
+ { at: new Date('2026-04-17T01:00:00Z'), summary: 'plan approved' },
179
+ { at: new Date('2026-04-17T02:00:00Z'), summary: 'hitl granted' },
180
+ ]
181
+
182
+ const summary = await materializer.materialize({
183
+ sessionId: session.id,
184
+ tenantId: tenantA,
185
+ finalOutcome: { status: 'succeeded' },
186
+ agentSummary: '',
187
+ declaredDeliverables: [],
188
+ keyDecisions: decisions,
189
+ })
190
+
191
+ expect(summary.keyDecisions).toEqual(decisions)
192
+ })
193
+
194
+ it('constructs SummaryId via the injected generator', async () => {
195
+ const store = new InMemorySessionStore()
196
+ const { session } = await seedActiveSession(store, tenantA)
197
+
198
+ const gen = makeSummaryIdGenerator()
199
+ const materializer = new SessionSummaryMaterializer({
200
+ store,
201
+ generateSummaryId: gen,
202
+ })
203
+
204
+ const summary = await materializer.materialize({
205
+ sessionId: session.id,
206
+ tenantId: tenantA,
207
+ finalOutcome: { status: 'succeeded' },
208
+ agentSummary: '',
209
+ declaredDeliverables: [],
210
+ keyDecisions: [],
211
+ })
212
+
213
+ expect(summary.id).toBe('sum_test_1')
214
+ })
215
+
216
+ it('always sets materializedBy to "kernel"', async () => {
217
+ const store = new InMemorySessionStore()
218
+ const { session } = await seedActiveSession(store, tenantA)
219
+ const materializer = buildMaterializer(store)
220
+
221
+ const summary = await materializer.materialize({
222
+ sessionId: session.id,
223
+ tenantId: tenantA,
224
+ finalOutcome: { status: 'succeeded' },
225
+ agentSummary: '',
226
+ declaredDeliverables: [],
227
+ keyDecisions: [],
228
+ })
229
+
230
+ expect(summary.materializedBy).toBe('kernel')
231
+ })
232
+
233
+ it('leaves already-idle sessions in idle (no spurious flip)', async () => {
234
+ const store = new InMemorySessionStore()
235
+ const project = await store.createProject({ tenantId: tenantA, name: 'p1' }, tenantA)
236
+ const session = await store.createSession(
237
+ { threadId: TEST_THREAD_ID, projectId: project.id, currentActor: userActor(tenantA) },
238
+ tenantA,
239
+ )
240
+ // session.status defaults to 'idle'
241
+ const materializer = buildMaterializer(store)
242
+
243
+ await materializer.materialize({
244
+ sessionId: session.id,
245
+ tenantId: tenantA,
246
+ finalOutcome: { status: 'succeeded' },
247
+ agentSummary: '',
248
+ declaredDeliverables: [],
249
+ keyDecisions: [],
250
+ })
251
+
252
+ const reloaded = await store.getSession(session.id, tenantA)
253
+ expect(reloaded?.status).toBe('idle')
254
+ })
255
+
256
+ it('leaves failed sessions in failed (materialize does not resurrect)', async () => {
257
+ const store = new InMemorySessionStore()
258
+ const project = await store.createProject({ tenantId: tenantA, name: 'p1' }, tenantA)
259
+ const session = await store.createSession(
260
+ { threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor(tenantA) },
261
+ tenantA,
262
+ )
263
+ await store.updateSession({ ...session, status: 'failed' }, tenantA)
264
+ const materializer = buildMaterializer(store)
265
+
266
+ await materializer.materialize({
267
+ sessionId: session.id,
268
+ tenantId: tenantA,
269
+ finalOutcome: { status: 'failed', verdict: 'gave up' },
270
+ agentSummary: '',
271
+ declaredDeliverables: [],
272
+ keyDecisions: [],
273
+ })
274
+
275
+ const reloaded = await store.getSession(session.id, tenantA)
276
+ expect(reloaded?.status).toBe('failed')
277
+ })
278
+ })
279
+
280
+ describe('SessionSummaryMaterializer.recover', () => {
281
+ it('returns null when no summary file exists (no side effect)', async () => {
282
+ const store = new InMemorySessionStore()
283
+ const { session } = await seedActiveSession(store, tenantA)
284
+ const materializer = buildMaterializer(store)
285
+
286
+ const recovered = await materializer.recover(session.id, tenantA)
287
+ expect(recovered).toBeNull()
288
+
289
+ const reloaded = await store.getSession(session.id, tenantA)
290
+ // No side effect — still active.
291
+ expect(reloaded?.status).toBe('active')
292
+ })
293
+
294
+ it('flips dangling session status idempotently when summary is present', async () => {
295
+ const store = new InMemorySessionStore()
296
+ const { session } = await seedActiveSession(store, tenantA)
297
+ const materializer = buildMaterializer(store)
298
+
299
+ // Simulate mid-crash: write summary directly, then force session back to
300
+ // active (mimicking a process death between the two atomic writes).
301
+ await materializer.materialize({
302
+ sessionId: session.id,
303
+ tenantId: tenantA,
304
+ finalOutcome: { status: 'succeeded' },
305
+ agentSummary: '',
306
+ declaredDeliverables: [],
307
+ keyDecisions: [],
308
+ })
309
+ const mid = await store.getSession(session.id, tenantA)
310
+ if (!mid) throw new Error('seed mid session missing')
311
+ await store.updateSession({ ...mid, status: 'active' }, tenantA)
312
+
313
+ const recovered = await materializer.recover(session.id, tenantA)
314
+ expect(recovered).not.toBeNull()
315
+
316
+ const reloaded = await store.getSession(session.id, tenantA)
317
+ expect(reloaded?.status).toBe('idle')
318
+
319
+ // Idempotent: calling recover again with session already idle is a no-op.
320
+ const recovered2 = await materializer.recover(session.id, tenantA)
321
+ expect(recovered2?.id).toBe(recovered?.id)
322
+ const reloaded2 = await store.getSession(session.id, tenantA)
323
+ expect(reloaded2?.status).toBe('idle')
324
+ })
325
+ })
326
+
327
+ describe('SessionSummaryMaterializer missing session', () => {
328
+ it('throws when the session does not exist', async () => {
329
+ const store = new InMemorySessionStore()
330
+ const materializer = buildMaterializer(store)
331
+
332
+ await expect(
333
+ materializer.materialize({
334
+ sessionId: 'ses_missing' as SessionId,
335
+ tenantId: tenantA,
336
+ finalOutcome: { status: 'succeeded' },
337
+ agentSummary: '',
338
+ declaredDeliverables: [],
339
+ keyDecisions: [],
340
+ }),
341
+ ).rejects.toThrow(/not found/)
342
+ })
343
+ })
@@ -0,0 +1,84 @@
1
+ /**
2
+ * DeliverableRef — discriminated union of artifact types a completed
3
+ * sub-session may emit.
4
+ *
5
+ * Consumed by two surfaces:
6
+ * 1. `SessionSummaryRef.deliverables` — authoritative list of artifacts a
7
+ * completed sub-session produced. See session-hierarchy.md §4.7.
8
+ * 2. `SubSession.prevArtifactRef` — intervention chains reference a prior
9
+ * immutable artifact. See session-hierarchy.md §4.5, §8.1.
10
+ *
11
+ * The `session_summary` variant is what intervention sub-sessions use — a
12
+ * follow-up intervention points at the previous completed session's summary,
13
+ * forming a strict acyclic DAG validated by
14
+ * `session/intervention/prev-artifact.ts`.
15
+ *
16
+ * Convention #6: this is a discriminated union on `kind`; any consumer must
17
+ * handle all variants exhaustively.
18
+ */
19
+
20
+ import type { RunId, SessionId } from '../../types/ids/index.js'
21
+ import type { DeliverableId, SummaryId } from '../../types/session/ids.js'
22
+
23
+ /** Discriminator for {@link DeliverableRef}. */
24
+ export type DeliverableKind = 'file' | 'session_summary' | 'message' | 'artifact_blob'
25
+
26
+ /**
27
+ * A file deliverable — a path relative to the workspace root, plus a content
28
+ * hash pinning the file to its state at materialize time. Subsequent edits to
29
+ * the file on disk do not mutate the deliverable; the ref is a snapshot.
30
+ */
31
+ export interface FileDeliverable {
32
+ readonly id: DeliverableId
33
+ readonly kind: 'file'
34
+ /** Path relative to the owning session's workspace root. */
35
+ readonly path: string
36
+ /** sha256 of the file's content at materialize time. */
37
+ readonly contentHash: string
38
+ readonly sizeBytes: number
39
+ }
40
+
41
+ /**
42
+ * A pointer to a previously-materialized {@link SessionSummaryRef}. The
43
+ * intervention DAG uses this variant to reference the immutable output of a
44
+ * prior completed session.
45
+ */
46
+ export interface SessionSummaryDeliverable {
47
+ readonly id: DeliverableId
48
+ readonly kind: 'session_summary'
49
+ readonly sessionId: SessionId
50
+ readonly summaryRef: SummaryId
51
+ readonly at: Date
52
+ }
53
+
54
+ /**
55
+ * A specific persisted message within a session run — useful for referencing
56
+ * a single LLM turn as an artifact (e.g. a decision record).
57
+ */
58
+ export interface MessageDeliverable {
59
+ readonly id: DeliverableId
60
+ readonly kind: 'message'
61
+ readonly sessionId: SessionId
62
+ readonly runId: RunId
63
+ /** Opaque identifier bound to the run's persisted message log. */
64
+ readonly messageId: string
65
+ }
66
+
67
+ /**
68
+ * An opaque blob deliverable — content lives in an out-of-band storage
69
+ * backend (object store, artifact registry). The SDK does not fetch or
70
+ * validate blob contents; callers resolve via the `storageRef`.
71
+ */
72
+ export interface ArtifactBlobDeliverable {
73
+ readonly id: DeliverableId
74
+ readonly kind: 'artifact_blob'
75
+ /** Opaque — bound to a storage backend the consumer owns. */
76
+ readonly storageRef: string
77
+ readonly mediaType?: string
78
+ }
79
+
80
+ export type DeliverableRef =
81
+ | FileDeliverable
82
+ | SessionSummaryDeliverable
83
+ | MessageDeliverable
84
+ | ArtifactBlobDeliverable
@@ -0,0 +1,31 @@
1
+ // Sub-barrel for the session summary module (Convention #4).
2
+ //
3
+ // See session-hierarchy.md §4.7 (SessionSummaryRef shape) and §8.1
4
+ // (kernel-only emission invariant). Concrete types and the materializer live
5
+ // in sibling files; re-export them here so consumers import via
6
+ // `../session/summary/index.js`.
7
+
8
+ export type {
9
+ ArtifactBlobDeliverable,
10
+ DeliverableKind,
11
+ DeliverableRef,
12
+ FileDeliverable,
13
+ MessageDeliverable,
14
+ SessionSummaryDeliverable,
15
+ } from './deliverable.js'
16
+ export {
17
+ AGENT_SUMMARY_MAX_CHARS,
18
+ AgentSummaryTooLongError,
19
+ SessionAlreadySummarizedError,
20
+ } from './ref.js'
21
+ export type {
22
+ SessionSummaryKeyDecision,
23
+ SessionSummaryOutcome,
24
+ SessionSummaryOutcomeStatus,
25
+ SessionSummaryRef,
26
+ } from './ref.js'
27
+ export { SessionSummaryMaterializer } from './materialize.js'
28
+ export type {
29
+ MaterializeInput,
30
+ SessionSummaryMaterializerDeps,
31
+ } from './materialize.js'
@@ -0,0 +1,169 @@
1
+ /**
2
+ * SessionSummaryMaterializer — kernel terminalization primitive.
3
+ *
4
+ * The sole producer of {@link SessionSummaryRef}. No agent-callable surface
5
+ * exists to bypass this (Convention #0 load-bearing — see
6
+ * session-hierarchy.md §8.1).
7
+ *
8
+ * Atomicity contract (§8.1): the summary write and the owning session's
9
+ * `non-terminal → idle` status flip commit as one logical unit. In the
10
+ * InMemory store the two happen within the same method call under the store's
11
+ * Map guard; in the Disk store they are two sequential write-tmp-renames
12
+ * (summary.json first, then session.json). A mid-step crash leaves the
13
+ * summary persisted but the session still active — `recover()` replays the
14
+ * session-status flip idempotently on next boot.
15
+ *
16
+ * The class is function-call-style (no internal state beyond deps). Tests
17
+ * inject a fake generator for deterministic IDs; production uses
18
+ * `generateSummaryId` from `utils/id.ts`.
19
+ */
20
+
21
+ import type { SessionId, TenantId } from '../../types/ids/index.js'
22
+ import type { SummaryId } from '../../types/session/ids.js'
23
+ import type { SessionStore } from '../../types/session/store.js'
24
+ import type { Session } from '../hierarchy/session.js'
25
+ import type { DeliverableRef } from './deliverable.js'
26
+ import {
27
+ AGENT_SUMMARY_MAX_CHARS,
28
+ AgentSummaryTooLongError,
29
+ SessionAlreadySummarizedError,
30
+ type SessionSummaryKeyDecision,
31
+ type SessionSummaryOutcome,
32
+ type SessionSummaryRef,
33
+ } from './ref.js'
34
+
35
+ /**
36
+ * Dependencies for {@link SessionSummaryMaterializer}. The generator is
37
+ * injected so tests can produce deterministic IDs; production code wires
38
+ * `generateSummaryId` from `utils/id.ts`.
39
+ */
40
+ export interface SessionSummaryMaterializerDeps {
41
+ readonly store: SessionStore
42
+ readonly generateSummaryId: () => SummaryId
43
+ /** Clock hook — defaults to `new Date()` when omitted. */
44
+ readonly now?: () => Date
45
+ }
46
+
47
+ /**
48
+ * Caller-supplied payload for {@link SessionSummaryMaterializer.materialize}.
49
+ * The materializer validates `agentSummary` length, constructs the
50
+ * `SessionSummaryRef`, and delegates the atomic write to the store.
51
+ */
52
+ export interface MaterializeInput {
53
+ readonly sessionId: SessionId
54
+ readonly tenantId: TenantId
55
+ readonly finalOutcome: SessionSummaryOutcome
56
+ readonly agentSummary: string
57
+ readonly declaredDeliverables: readonly DeliverableRef[]
58
+ readonly keyDecisions: readonly SessionSummaryKeyDecision[]
59
+ }
60
+
61
+ /**
62
+ * Session statuses from which a materialize call may legally transition to
63
+ * `'idle'` as part of the terminalization. Other states (already `'idle'`,
64
+ * `'failed'`, `'archived'`, `'awaiting_hitl'`) are left untouched; the
65
+ * materializer never moves a session *out of* `'failed'` or `'archived'`.
66
+ */
67
+ const TERMINALIZABLE_STATUSES: ReadonlySet<Session['status']> = new Set([
68
+ 'active',
69
+ 'locked',
70
+ 'awaiting_merge',
71
+ ])
72
+
73
+ export class SessionSummaryMaterializer {
74
+ private readonly deps: SessionSummaryMaterializerDeps
75
+
76
+ constructor(deps: SessionSummaryMaterializerDeps) {
77
+ this.deps = deps
78
+ }
79
+
80
+ /**
81
+ * Kernel emission path. Validates, builds the immutable
82
+ * {@link SessionSummaryRef}, and hands it to the store for atomic write +
83
+ * status-flip. Rejects with:
84
+ *
85
+ * - {@link AgentSummaryTooLongError} — `agentSummary` exceeds the max char
86
+ * cap ({@link AGENT_SUMMARY_MAX_CHARS}).
87
+ * - `TenantIsolationError` — session is owned by a different tenant.
88
+ * - {@link SessionAlreadySummarizedError} — the session already has a
89
+ * persisted summary. Re-materialization would duplicate history; the
90
+ * caller should instead open an intervention sub-session (§4.5).
91
+ */
92
+ async materialize(input: MaterializeInput): Promise<SessionSummaryRef> {
93
+ this.assertSummaryLength(input.agentSummary)
94
+
95
+ const session = await this.deps.store.getSession(input.sessionId, input.tenantId)
96
+ if (!session) {
97
+ throw new Error(`Session ${input.sessionId} not found`)
98
+ }
99
+
100
+ const existing = await this.deps.store.getSummary(input.sessionId, input.tenantId)
101
+ if (existing) {
102
+ throw new SessionAlreadySummarizedError({
103
+ sessionId: input.sessionId,
104
+ existingSummaryId: existing.id,
105
+ })
106
+ }
107
+
108
+ const summary: SessionSummaryRef = {
109
+ id: this.deps.generateSummaryId(),
110
+ sessionRef: input.sessionId,
111
+ tenantId: input.tenantId,
112
+ outcome: input.finalOutcome,
113
+ deliverables: input.declaredDeliverables,
114
+ agentSummary: input.agentSummary,
115
+ keyDecisions: input.keyDecisions,
116
+ at: this.clock(),
117
+ materializedBy: 'kernel',
118
+ }
119
+
120
+ await this.deps.store.recordSummary(summary, input.tenantId)
121
+ return summary
122
+ }
123
+
124
+ /**
125
+ * Recovery path. Called at boot (or explicitly by the lifecycle manager)
126
+ * for sessions whose `summary.json` is persisted but whose `session.json`
127
+ * still reports a non-terminal status — the crash window between the two
128
+ * atomic writes on disk.
129
+ *
130
+ * Idempotent: if the session is already `'idle'` (or another terminal
131
+ * state), no write occurs; the existing summary is returned. If no summary
132
+ * is persisted, returns `null` and no side effect occurs. This is the only
133
+ * non-materialize path that may touch the stored summary — it does not
134
+ * mint a new ID, only re-triggers the store's status flip via
135
+ * `recordSummary` when it detects the dangling session.
136
+ */
137
+ async recover(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
138
+ const summary = await this.deps.store.getSummary(sessionId, tenantId)
139
+ if (!summary) return null
140
+
141
+ const session = await this.deps.store.getSession(sessionId, tenantId)
142
+ if (!session) return summary
143
+
144
+ if (TERMINALIZABLE_STATUSES.has(session.status)) {
145
+ // Dangling: summary persisted but session never flipped. Replay the
146
+ // status transition by re-invoking `recordSummary` — store impls
147
+ // treat an existing-summary path as "flip-only, no duplicate write".
148
+ // Cast preserves the kernel brand on the recovered record.
149
+ await this.deps.store.recordSummary(
150
+ summary as SessionSummaryRef & { materializedBy: 'kernel' },
151
+ tenantId,
152
+ )
153
+ }
154
+ return summary
155
+ }
156
+
157
+ private assertSummaryLength(agentSummary: string): void {
158
+ if (agentSummary.length > AGENT_SUMMARY_MAX_CHARS) {
159
+ throw new AgentSummaryTooLongError({
160
+ actual: agentSummary.length,
161
+ max: AGENT_SUMMARY_MAX_CHARS,
162
+ })
163
+ }
164
+ }
165
+
166
+ private clock(): Date {
167
+ return this.deps.now ? this.deps.now() : new Date()
168
+ }
169
+ }