@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,201 @@
1
+ /**
2
+ * Integration — SessionSummaryMaterializer + SessionStore atomic transition,
3
+ * plus the crash-recovery path.
4
+ *
5
+ * Covers roadmap §5 invariants: §8.1 (summary kernel-owned, no agent-callable
6
+ * emission surface), §8.1 atomic with terminal transition, recovery path
7
+ * when the status-flip lost to a mid-flight crash. `SessionAlreadySummarizedError`
8
+ * on concurrent re-materialize.
9
+ *
10
+ * The kernel-ownership assertion is expressed both structurally (the
11
+ * `materializedBy: 'kernel'` brand on the persisted record) and by routing
12
+ * every successful materialize through the Materializer — no test below calls
13
+ * `store.recordSummary` directly, and the compile-time type narrows the
14
+ * argument to `& { materializedBy: 'kernel' }` so an agent-constructed payload
15
+ * would fail typecheck (not just runtime validation).
16
+ */
17
+ import { describe, expect, it } from 'vitest';
18
+ import { InMemorySessionStore } from '../../../store/session/memory.js';
19
+ import { SessionSummaryMaterializer } from '../../summary/materialize.js';
20
+ import { SessionAlreadySummarizedError } from '../../summary/ref.js';
21
+ import { DEFAULT_TENANT, agentActor } from './_fixtures.js';
22
+ const TEST_THREAD_ID = 'thd_test';
23
+ async function seedActive(store) {
24
+ const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'summary' }, DEFAULT_TENANT);
25
+ const session = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor('agt_worker') }, DEFAULT_TENANT);
26
+ await store.updateSession({ ...session, status: 'active' }, DEFAULT_TENANT);
27
+ return { project, session: { ...session, status: 'active' } };
28
+ }
29
+ function makeGen() {
30
+ let n = 0;
31
+ return () => `sum_materialize_${++n}`;
32
+ }
33
+ describe('Integration — summary materialization E2E', () => {
34
+ it('Materializer writes summary + flips session active→idle atomically', async () => {
35
+ const store = new InMemorySessionStore();
36
+ const { session } = await seedActive(store);
37
+ const materializer = new SessionSummaryMaterializer({
38
+ store,
39
+ generateSummaryId: makeGen(),
40
+ });
41
+ const summary = await materializer.materialize({
42
+ sessionId: session.id,
43
+ tenantId: DEFAULT_TENANT,
44
+ finalOutcome: { status: 'succeeded' },
45
+ agentSummary: 'done',
46
+ declaredDeliverables: [],
47
+ keyDecisions: [],
48
+ });
49
+ // Persisted.
50
+ const stored = await store.getSummary(session.id, DEFAULT_TENANT);
51
+ expect(stored?.id).toBe(summary.id);
52
+ expect(stored?.materializedBy).toBe('kernel');
53
+ // Status atomically flipped.
54
+ const reloaded = await store.getSession(session.id, DEFAULT_TENANT);
55
+ expect(reloaded?.status).toBe('idle');
56
+ });
57
+ it('§8.1 atomicity invariant: no external observer sees terminal without summary', async () => {
58
+ // With InMemorySessionStore the two writes happen inside a single Map
59
+ // method call — there is no observable mid-state. We assert by reading
60
+ // both resources immediately after a single awaited materialize: the
61
+ // terminal status and the summary are visible together.
62
+ const store = new InMemorySessionStore();
63
+ const { session } = await seedActive(store);
64
+ const materializer = new SessionSummaryMaterializer({
65
+ store,
66
+ generateSummaryId: makeGen(),
67
+ });
68
+ await materializer.materialize({
69
+ sessionId: session.id,
70
+ tenantId: DEFAULT_TENANT,
71
+ finalOutcome: { status: 'succeeded' },
72
+ agentSummary: '',
73
+ declaredDeliverables: [],
74
+ keyDecisions: [],
75
+ });
76
+ const [finalSession, finalSummary] = await Promise.all([
77
+ store.getSession(session.id, DEFAULT_TENANT),
78
+ store.getSummary(session.id, DEFAULT_TENANT),
79
+ ]);
80
+ // Atomic pairing: idle status AND persisted summary present together.
81
+ expect(finalSession?.status).toBe('idle');
82
+ expect(finalSummary).not.toBeNull();
83
+ });
84
+ it('concurrent re-materialize rejects with SessionAlreadySummarizedError', async () => {
85
+ const store = new InMemorySessionStore();
86
+ const { session } = await seedActive(store);
87
+ const materializer = new SessionSummaryMaterializer({
88
+ store,
89
+ generateSummaryId: makeGen(),
90
+ });
91
+ await materializer.materialize({
92
+ sessionId: session.id,
93
+ tenantId: DEFAULT_TENANT,
94
+ finalOutcome: { status: 'succeeded' },
95
+ agentSummary: 'first',
96
+ declaredDeliverables: [],
97
+ keyDecisions: [],
98
+ });
99
+ await expect(materializer.materialize({
100
+ sessionId: session.id,
101
+ tenantId: DEFAULT_TENANT,
102
+ finalOutcome: { status: 'succeeded' },
103
+ agentSummary: 'second',
104
+ declaredDeliverables: [],
105
+ keyDecisions: [],
106
+ })).rejects.toBeInstanceOf(SessionAlreadySummarizedError);
107
+ });
108
+ it('crash recovery: summary persisted + session still active → recover() replays idempotently', async () => {
109
+ const store = new InMemorySessionStore();
110
+ const { session } = await seedActive(store);
111
+ const materializer = new SessionSummaryMaterializer({
112
+ store,
113
+ generateSummaryId: makeGen(),
114
+ });
115
+ // Materialize once (happy path writes both). Then simulate a crash by
116
+ // forcing the session status back to `active` while the summary record
117
+ // stays intact — mimicking summary.json landing but session.json being
118
+ // lost to a mid-write power failure (see session/summary/materialize.ts
119
+ // `recover()` docs).
120
+ await materializer.materialize({
121
+ sessionId: session.id,
122
+ tenantId: DEFAULT_TENANT,
123
+ finalOutcome: { status: 'succeeded' },
124
+ agentSummary: '',
125
+ declaredDeliverables: [],
126
+ keyDecisions: [],
127
+ });
128
+ const mid = await store.getSession(session.id, DEFAULT_TENANT);
129
+ if (!mid)
130
+ throw new Error('mid session missing');
131
+ await store.updateSession({ ...mid, status: 'active' }, DEFAULT_TENANT);
132
+ // Recovery call re-triggers the store's flip path without minting a
133
+ // new summary id.
134
+ const recovered = await materializer.recover(session.id, DEFAULT_TENANT);
135
+ expect(recovered).not.toBeNull();
136
+ const reloaded = await store.getSession(session.id, DEFAULT_TENANT);
137
+ expect(reloaded?.status).toBe('idle');
138
+ // Second recover call with session already idle: still idempotent.
139
+ const recovered2 = await materializer.recover(session.id, DEFAULT_TENANT);
140
+ expect(recovered2?.id).toBe(recovered?.id);
141
+ const reloaded2 = await store.getSession(session.id, DEFAULT_TENANT);
142
+ expect(reloaded2?.status).toBe('idle');
143
+ });
144
+ it('agent cannot construct SessionSummaryRef directly: recordSummary rejects non-kernel payload', async () => {
145
+ // The SessionStore contract narrows `recordSummary` to
146
+ // `SessionSummaryRef & { materializedBy: 'kernel' }`. Agents cannot
147
+ // type-construct a brand literal of `'kernel'` without going through
148
+ // the Materializer (see session/summary/ref.ts module header). Even
149
+ // attempting to cast into the shape and call directly would bypass
150
+ // the materialize ordering (status-check, length-check,
151
+ // already-exists guard). This test exercises the runtime guard: a
152
+ // second kernel-branded record for an already-summarized session
153
+ // rejects with SessionAlreadySummarizedError.
154
+ const store = new InMemorySessionStore();
155
+ const { session } = await seedActive(store);
156
+ const materializer = new SessionSummaryMaterializer({
157
+ store,
158
+ generateSummaryId: makeGen(),
159
+ });
160
+ await materializer.materialize({
161
+ sessionId: session.id,
162
+ tenantId: DEFAULT_TENANT,
163
+ finalOutcome: { status: 'succeeded' },
164
+ agentSummary: '',
165
+ declaredDeliverables: [],
166
+ keyDecisions: [],
167
+ });
168
+ // Direct call with a fabricated "kernel" ref payload — rejected
169
+ // because a summary already exists (store guard). The kernel-brand
170
+ // check at the type layer prevents naive agent-side construction; the
171
+ // runtime guard here catches store-level re-entry (materialize goes
172
+ // through the same path).
173
+ await expect(store.recordSummary({
174
+ id: 'sum_fake',
175
+ sessionRef: session.id,
176
+ tenantId: DEFAULT_TENANT,
177
+ outcome: { status: 'succeeded' },
178
+ deliverables: [],
179
+ agentSummary: 'forged',
180
+ keyDecisions: [],
181
+ at: new Date(),
182
+ materializedBy: 'kernel',
183
+ }, DEFAULT_TENANT)).rejects.toBeInstanceOf(SessionAlreadySummarizedError);
184
+ });
185
+ it('missing session: materialize throws a not-found error', async () => {
186
+ const store = new InMemorySessionStore();
187
+ const materializer = new SessionSummaryMaterializer({
188
+ store,
189
+ generateSummaryId: makeGen(),
190
+ });
191
+ await expect(materializer.materialize({
192
+ sessionId: 'ses_never',
193
+ tenantId: DEFAULT_TENANT,
194
+ finalOutcome: { status: 'succeeded' },
195
+ agentSummary: '',
196
+ declaredDeliverables: [],
197
+ keyDecisions: [],
198
+ })).rejects.toThrow(/not found/);
199
+ });
200
+ });
201
+ //# sourceMappingURL=summary-materialization-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-materialization-e2e.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/summary-materialization-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Integration — multi-tenant isolation enforcement at every store accessor
3
+ * and cross-store boundary.
4
+ *
5
+ * Covers roadmap §5 invariants: §12 `tenantId` denormalized on every
6
+ * persisted entity, §12.2 cross-tenant rejection (TenantIsolationError at
7
+ * every accessor), broadcast handoff rejecting when recipient tenant
8
+ * differs.
9
+ *
10
+ * Every assertion here crosses a kernel boundary with a mismatched tenantId
11
+ * and checks that the SDK rejects rather than silently re-scoping.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=tenant-isolation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-isolation.test.d.ts","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Integration — multi-tenant isolation enforcement at every store accessor
3
+ * and cross-store boundary.
4
+ *
5
+ * Covers roadmap §5 invariants: §12 `tenantId` denormalized on every
6
+ * persisted entity, §12.2 cross-tenant rejection (TenantIsolationError at
7
+ * every accessor), broadcast handoff rejecting when recipient tenant
8
+ * differs.
9
+ *
10
+ * Every assertion here crosses a kernel boundary with a mismatched tenantId
11
+ * and checks that the SDK rejects rather than silently re-scoping.
12
+ */
13
+ import { describe, expect, it } from 'vitest';
14
+ import { InMemorySessionStore } from '../../../store/session/memory.js';
15
+ import { createUserMessage } from '../../../types/message/index.js';
16
+ import { TenantIsolationError } from '../../errors.js';
17
+ import { DEFAULT_TENANT, OTHER_TENANT, agentActor, userActor } from './_fixtures.js';
18
+ const TEST_THREAD_ID = 'thd_test';
19
+ async function seedTenantAResources() {
20
+ const store = new InMemorySessionStore();
21
+ const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'tenA' }, DEFAULT_TENANT);
22
+ const parent = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: userActor('usr_a') }, DEFAULT_TENANT);
23
+ const child = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor('agt_a') }, DEFAULT_TENANT);
24
+ const sub = await store.createSubSession({
25
+ parentSessionId: parent.id,
26
+ childSessionId: child.id,
27
+ kind: 'agent_spawn',
28
+ spawnedBy: userActor('usr_a'),
29
+ }, DEFAULT_TENANT);
30
+ return { store, project, parent, child, sub };
31
+ }
32
+ describe('Integration — tenant isolation', () => {
33
+ it('getProject with wrong tenantId → TenantIsolationError', async () => {
34
+ const { store, project } = await seedTenantAResources();
35
+ await expect(store.getProject(project.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
36
+ });
37
+ it('getSession with wrong tenantId → TenantIsolationError', async () => {
38
+ const { store, parent } = await seedTenantAResources();
39
+ await expect(store.getSession(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
40
+ });
41
+ it('getSubSession with wrong tenantId → TenantIsolationError', async () => {
42
+ const { store, sub } = await seedTenantAResources();
43
+ await expect(store.getSubSession(sub.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
44
+ });
45
+ it('updateSession with wrong tenantId → TenantIsolationError', async () => {
46
+ const { store, parent } = await seedTenantAResources();
47
+ await expect(store.updateSession({ ...parent, status: 'active' }, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
48
+ });
49
+ it('createSubSession from a session owned by another tenant → TenantIsolationError', async () => {
50
+ const { store, parent, child } = await seedTenantAResources();
51
+ await expect(store.createSubSession({
52
+ parentSessionId: parent.id,
53
+ childSessionId: child.id,
54
+ kind: 'agent_spawn',
55
+ spawnedBy: userActor('usr_intruder', OTHER_TENANT),
56
+ }, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
57
+ });
58
+ it('appendMessage with wrong tenantId → TenantIsolationError', async () => {
59
+ const { store, child } = await seedTenantAResources();
60
+ await expect(store.appendMessage(child.id, createUserMessage('intruder'), OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
61
+ });
62
+ it('loadSessionMessages cross-tenant → TenantIsolationError', async () => {
63
+ const { store, child } = await seedTenantAResources();
64
+ await store.appendMessage(child.id, createUserMessage('legit'), DEFAULT_TENANT);
65
+ await expect(store.loadSessionMessages(child.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
66
+ });
67
+ it('loadMessages cross-tenant → TenantIsolationError', async () => {
68
+ const { store, child } = await seedTenantAResources();
69
+ await store.appendMessage(child.id, createUserMessage('legit'), DEFAULT_TENANT);
70
+ await expect(store.loadMessages(child.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
71
+ });
72
+ it('drill(sessionId, OTHER_TENANT) on an existing session → TenantIsolationError (pattern doc §12.2 hard reject)', async () => {
73
+ const { store, parent } = await seedTenantAResources();
74
+ // Existing session owned by DEFAULT_TENANT, caller supplies OTHER_TENANT.
75
+ // Pattern doc §12 specifies hard reject — no silent null masking.
76
+ await expect(store.drill(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
77
+ });
78
+ it('drill on a missing session returns null (deny-by-default surface without leaking tenant info)', async () => {
79
+ const { store } = await seedTenantAResources();
80
+ const view = await store.drill('ses_never_existed', OTHER_TENANT);
81
+ // Missing session for the queried tenant returns null (Convention #5).
82
+ // The tenant check is conditional on the resource existing; absent
83
+ // resources don't leak tenant info via a thrown isolation error.
84
+ expect(view).toBeNull();
85
+ });
86
+ it('getChildren cross-tenant → TenantIsolationError', async () => {
87
+ const { store, parent } = await seedTenantAResources();
88
+ await expect(store.getChildren(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
89
+ });
90
+ it('getAncestry cross-tenant → TenantIsolationError', async () => {
91
+ const { store, parent } = await seedTenantAResources();
92
+ await expect(store.getAncestry(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
93
+ });
94
+ it('recordSummary with mismatched payload tenantId → TenantIsolationError', async () => {
95
+ const { store, parent } = await seedTenantAResources();
96
+ // Attempt to record a summary whose payload tenantId differs from the
97
+ // caller tenantId — runtime guard rejects.
98
+ await expect(store.recordSummary({
99
+ id: 'sum_intruder',
100
+ sessionRef: parent.id,
101
+ tenantId: OTHER_TENANT,
102
+ outcome: { status: 'succeeded' },
103
+ deliverables: [],
104
+ agentSummary: '',
105
+ keyDecisions: [],
106
+ at: new Date(),
107
+ materializedBy: 'kernel',
108
+ }, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
109
+ });
110
+ it('getSummary cross-tenant → TenantIsolationError when a summary exists', async () => {
111
+ const { store, parent } = await seedTenantAResources();
112
+ await store.updateSession({ ...parent, status: 'active' }, DEFAULT_TENANT);
113
+ await store.recordSummary({
114
+ id: 'sum_ok',
115
+ sessionRef: parent.id,
116
+ tenantId: DEFAULT_TENANT,
117
+ outcome: { status: 'succeeded' },
118
+ deliverables: [],
119
+ agentSummary: '',
120
+ keyDecisions: [],
121
+ at: new Date(),
122
+ materializedBy: 'kernel',
123
+ }, DEFAULT_TENANT);
124
+ await expect(store.getSummary(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
125
+ });
126
+ it('createProject with params.tenantId ≠ caller tenantId → TenantIsolationError (deep check)', async () => {
127
+ const store = new InMemorySessionStore();
128
+ await expect(store.createProject({ tenantId: OTHER_TENANT, name: 'mismatch' }, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
129
+ });
130
+ it('createSession with project owned by another tenant → TenantIsolationError', async () => {
131
+ const { store, project } = await seedTenantAResources();
132
+ await expect(store.createSession({
133
+ threadId: TEST_THREAD_ID,
134
+ projectId: project.id,
135
+ currentActor: userActor('usr_intruder', OTHER_TENANT),
136
+ }, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
137
+ });
138
+ it('tenant denormalization: Session, SubSession records carry tenantId explicitly', async () => {
139
+ const { store, parent, sub } = await seedTenantAResources();
140
+ const parentReloaded = await store.getSession(parent.id, DEFAULT_TENANT);
141
+ expect(parentReloaded?.tenantId).toBe(DEFAULT_TENANT);
142
+ // SubSession record itself does not carry tenantId in its shape — the
143
+ // isolation is stored via the parent record tuple (subSessions map:
144
+ // { tenantId, subSession }). Getting it via the correct tenant succeeds;
145
+ // via the wrong tenant rejects — already covered above. This test just
146
+ // confirms the successful access path.
147
+ const reloaded = await store.getSubSession(sub.id, DEFAULT_TENANT);
148
+ expect(reloaded?.id).toBe(sub.id);
149
+ });
150
+ it('broadcast-style cross-tenant attempt: cannot createSubSession linking parents owned by another tenant', async () => {
151
+ // Pattern doc §12 requires recipient & source to share tenant. The
152
+ // store-level guard here catches the shape violation — createSubSession
153
+ // refuses to link parent/child across tenants.
154
+ const { store, parent } = await seedTenantAResources();
155
+ // Create a session in OTHER_TENANT with its own project.
156
+ const otherProject = await store.createProject({ tenantId: OTHER_TENANT, name: 'other' }, OTHER_TENANT);
157
+ const otherChild = await store.createSession({
158
+ threadId: TEST_THREAD_ID,
159
+ projectId: otherProject.id,
160
+ currentActor: userActor('usr_other', OTHER_TENANT),
161
+ }, OTHER_TENANT);
162
+ await expect(store.createSubSession({
163
+ parentSessionId: parent.id, // DEFAULT_TENANT
164
+ childSessionId: otherChild.id, // OTHER_TENANT
165
+ kind: 'agent_spawn',
166
+ spawnedBy: userActor('usr_a'),
167
+ }, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
168
+ });
169
+ it('deleteSubSession cross-tenant → TenantIsolationError', async () => {
170
+ const { store, sub } = await seedTenantAResources();
171
+ await expect(store.deleteSubSession(sub.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
172
+ });
173
+ it('deleteSession cross-tenant → TenantIsolationError', async () => {
174
+ const { store } = await seedTenantAResources();
175
+ // Parent has a sub-session attached → deleteSession would fail anyway,
176
+ // but the tenant guard fires first. Use a standalone session.
177
+ const project = (await store.createProject({ tenantId: DEFAULT_TENANT, name: 'del' }, DEFAULT_TENANT)).id;
178
+ const lonely = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project, currentActor: userActor('usr_lonely') }, DEFAULT_TENANT);
179
+ await expect(store.deleteSession(lonely.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
180
+ });
181
+ it('missing sub-session returns null for correct tenant (not a leak channel)', async () => {
182
+ const { store } = await seedTenantAResources();
183
+ // Missing id via correct tenant → null, not thrown. Confirms the
184
+ // missing-resource fast-path doesn't pre-empt the tenant check.
185
+ const missing = await store.getSubSession('sub_never_existed', DEFAULT_TENANT);
186
+ expect(missing).toBeNull();
187
+ });
188
+ });
189
+ //# sourceMappingURL=tenant-isolation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-isolation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEpF,MAAM,cAAc,GAAG,UAAsB,CAAA;AAE7C,KAAK,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAC1C,cAAc,CACd,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CACvC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EACrF,cAAc,CACd,CAAA;IACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CACtC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,EACtF,cAAc,CACd,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CACvC;QACC,eAAe,EAAE,MAAM,CAAC,EAAE;QAC1B,cAAc,EAAE,KAAK,CAAC,EAAE;QACxB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;KAC7B,EACD,cAAc,CACd,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AAC9C,CAAC;AAED,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACnD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,YAAY,CAAC,CAClE,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC7D,MAAM,MAAM,CACX,KAAK,CAAC,gBAAgB,CACrB;YACC,eAAe,EAAE,MAAM,CAAC,EAAE;YAC1B,cAAc,EAAE,KAAK,CAAC,EAAE;YACxB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;SAClD,EACD,YAAY,CACZ,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAC1E,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAA;QAC/E,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CACrF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAA;QAC/E,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;QAC7H,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC9G,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAC7B,mBAAwD,EACxD,YAAY,CACZ,CAAA;QACD,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,sEAAsE;QACtE,2CAA2C;QAC3C,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,EAAE,EAAE,cAA2B;YAC/B,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;QAC1E,MAAM,KAAK,CAAC,aAAa,CACxB;YACC,EAAE,EAAE,QAAqB;YACzB,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CAAA;QAED,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,CACjF,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,YAAY,EAAE,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;SACrD,EACD,YAAY,CACZ,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC3D,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxE,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAErD,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QACzE,uEAAuE;QACvE,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uGAAuG,EAAE,KAAK,IAAI,EAAE;QACtH,mEAAmE;QACnE,wEAAwE;QACxE,+CAA+C;QAC/C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAEtD,yDAAyD;QACzD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,aAAa,CAC7C,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EACzC,YAAY,CACZ,CAAA;QACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,aAAa,CAC3C;YACC,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,YAAY,CAAC,EAAE;YAC1B,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;SAClD,EACD,YAAY,CACZ,CAAA;QAED,MAAM,MAAM,CACX,KAAK,CAAC,gBAAgB,CACrB;YACC,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,iBAAiB;YAC7C,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,eAAe;YAC9C,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;SAC7B,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACnD,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAChF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,OAAO,GAAc,CAC1B,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,cAAc,CAAC,CACpF,CAAC,EAAE,CAAA;QACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CACvC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,EAAE,EACvF,cAAc,CACd,CAAA;QACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAChF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,mBAAmC,EAAE,cAAc,CAAC,CAAA;QAC9F,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Typed errors for the session hierarchy module.
3
+ *
4
+ * See session-hierarchy.md §12.2 (cross-tenant rejection), §6.2 (workspace
5
+ * backend operation failures), §4.5 (intervention DAG). Each error carries a
6
+ * structured `details` payload so consumers can route without string parsing
7
+ * (Convention #5: deny-by-default, fail fast).
8
+ */
9
+ import type { SessionId, TenantId } from '../types/ids/index.js';
10
+ import type { ThreadId } from '../types/session/ids.js';
11
+ import type { SessionStatus } from './hierarchy/session.js';
12
+ import type { WorkspaceBackendKind } from './workspace/driver.js';
13
+ /**
14
+ * Raised by {@link SessionStore} accessors when the supplied {@link TenantId}
15
+ * does not match the tenant owning the target resource. Convention #17:
16
+ * cross-tenant access is a hard error at the kernel boundary — there is no
17
+ * escape hatch. See session-hierarchy.md §12.2.
18
+ */
19
+ export declare class TenantIsolationError extends Error {
20
+ readonly details: {
21
+ requested: TenantId;
22
+ resource: string;
23
+ };
24
+ constructor(details: {
25
+ requested: TenantId;
26
+ resource: string;
27
+ });
28
+ }
29
+ /**
30
+ * Raised by {@link SessionStore.getAncestry} / {@link SessionStore.drill}
31
+ * when walking parent sub-session links encounters a revisit. Indicates store
32
+ * corruption — the write path enforces acyclicity (session-hierarchy.md §4.5).
33
+ */
34
+ export declare class AncestryCycleError extends Error {
35
+ readonly details: {
36
+ sessionId: SessionId;
37
+ cyclePath: readonly SessionId[];
38
+ };
39
+ constructor(details: {
40
+ sessionId: SessionId;
41
+ cyclePath: readonly SessionId[];
42
+ });
43
+ }
44
+ /**
45
+ * Raised by {@link WorkspaceBackendDriver} implementations on any I/O or
46
+ * invariant failure. Wraps the underlying cause; callers can match on
47
+ * `details.op` + `details.kind` for routing (Convention #0: no silent
48
+ * fallbacks — surface the failure). See session-hierarchy.md §6.2 / §7.
49
+ */
50
+ export declare class WorkspaceBackendError extends Error {
51
+ readonly details: {
52
+ op: string;
53
+ kind: WorkspaceBackendKind;
54
+ cause?: unknown;
55
+ };
56
+ constructor(details: {
57
+ op: string;
58
+ kind: WorkspaceBackendKind;
59
+ cause?: unknown;
60
+ });
61
+ }
62
+ /**
63
+ * Raised by {@link import('../types/thread/store.js').ThreadStore.updateThread}
64
+ * when the supplied {@link Thread.ownerVersion} does not match the persisted
65
+ * record. The caller must re-read via `getThread`, re-apply its intended
66
+ * mutation on top of the fresh record, and retry. Mirrors the Session
67
+ * handoff CAS pattern (§6.1).
68
+ */
69
+ export declare class StaleThreadError extends Error {
70
+ readonly details: {
71
+ threadId: ThreadId;
72
+ expectedVersion: number;
73
+ actualVersion: number;
74
+ };
75
+ constructor(details: {
76
+ threadId: ThreadId;
77
+ expectedVersion: number;
78
+ actualVersion: number;
79
+ });
80
+ }
81
+ /**
82
+ * Raised by the spawn path (and any caller that enforces the open-thread
83
+ * precondition) when a Thread is in `'archived'` state and would-be mutations
84
+ * require it to be `'open'`. Convention #5: deny-by-default — archival is a
85
+ * hard read-only boundary.
86
+ */
87
+ export declare class ThreadClosedError extends Error {
88
+ readonly details: {
89
+ threadId: ThreadId;
90
+ op: string;
91
+ };
92
+ constructor(details: {
93
+ threadId: ThreadId;
94
+ op: string;
95
+ });
96
+ }
97
+ /**
98
+ * Raised by {@link import('../manager/thread/lifecycle.js').ThreadManager.archive}
99
+ * and `.delete` when the Thread's session-presence precondition is violated:
100
+ *
101
+ * - `op: 'archive'` — at least one Session under the Thread is in a
102
+ * non-terminal state (`active | locked | awaiting_hitl | awaiting_merge`).
103
+ * The caller must first quiesce those sessions (let them reach `idle`,
104
+ * `failed`, or `archived`) before flipping the Thread to archived.
105
+ * - `op: 'delete'` — the Thread still has at least one attached Session.
106
+ * Callers must either archive + tombstone those sessions (`deleteSession`)
107
+ * before calling `deleteThread`, or accept that deletion is not yet safe.
108
+ *
109
+ * `blockingSessions` carries the first {@link THREAD_NOT_EMPTY_SAMPLE_LIMIT}
110
+ * offenders with their current status so operator tooling can surface an
111
+ * actionable list without unbounded error payloads on large threads.
112
+ * `totalBlockingSessions` holds the full count even when the sample is
113
+ * truncated. Convention #5: deny-by-default — no implicit cascade, no silent
114
+ * no-op.
115
+ */
116
+ export declare const THREAD_NOT_EMPTY_SAMPLE_LIMIT = 50;
117
+ export declare class ThreadNotEmptyError extends Error {
118
+ readonly details: {
119
+ threadId: ThreadId;
120
+ tenantId: TenantId;
121
+ op: 'archive' | 'delete';
122
+ blockingSessions: ReadonlyArray<{
123
+ sessionId: SessionId;
124
+ status: SessionStatus;
125
+ }>;
126
+ totalBlockingSessions: number;
127
+ };
128
+ constructor(details: {
129
+ threadId: ThreadId;
130
+ tenantId: TenantId;
131
+ op: 'archive' | 'delete';
132
+ blockingSessions: ReadonlyArray<{
133
+ sessionId: SessionId;
134
+ status: SessionStatus;
135
+ }>;
136
+ totalBlockingSessions: number;
137
+ });
138
+ }
139
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,QAAQ,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;KAChB,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK9D;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,SAAS,CAAA;QACpB,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAC/B,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE;CAO9E;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QACjB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,oBAAoB,CAAA;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;gBAEW,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,eAAe,EAAE,MAAM,CAAA;QACvB,aAAa,EAAE,MAAM,CAAA;KACrB,CAAA;gBAEW,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAO3F;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,MAAM,CAAA;KACV,CAAA;gBAEW,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;CAKvD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAA;AAE/C,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAA;QACxB,gBAAgB,EAAE,aAAa,CAAC;YAAE,SAAS,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;QAChF,qBAAqB,EAAE,MAAM,CAAA;KAC7B,CAAA;gBAEW,OAAO,EAAE;QACpB,QAAQ,EAAE,QAAQ,CAAA;QAClB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAA;QACxB,gBAAgB,EAAE,aAAa,CAAC;YAAE,SAAS,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;QAChF,qBAAqB,EAAE,MAAM,CAAA;KAC7B;CAOD"}