@namzu/sdk 0.2.0 → 0.4.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 (329) hide show
  1. package/CHANGELOG.md +74 -2
  2. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  3. package/dist/agents/ReactiveAgent.js +3 -2
  4. package/dist/agents/ReactiveAgent.js.map +1 -1
  5. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  6. package/dist/agents/SupervisorAgent.js +5 -2
  7. package/dist/agents/SupervisorAgent.js.map +1 -1
  8. package/dist/bridge/a2a/index.d.ts +1 -1
  9. package/dist/bridge/a2a/index.d.ts.map +1 -1
  10. package/dist/bridge/a2a/index.js +1 -1
  11. package/dist/bridge/a2a/index.js.map +1 -1
  12. package/dist/bridge/a2a/message.d.ts +0 -2
  13. package/dist/bridge/a2a/message.d.ts.map +1 -1
  14. package/dist/bridge/a2a/message.js +0 -26
  15. package/dist/bridge/a2a/message.js.map +1 -1
  16. package/dist/bridge/a2a/task.d.ts +4 -3
  17. package/dist/bridge/a2a/task.d.ts.map +1 -1
  18. package/dist/bridge/a2a/task.js +4 -4
  19. package/dist/bridge/a2a/task.js.map +1 -1
  20. package/dist/contracts/api.d.ts +6 -38
  21. package/dist/contracts/api.d.ts.map +1 -1
  22. package/dist/contracts/ids.d.ts +1 -1
  23. package/dist/contracts/ids.d.ts.map +1 -1
  24. package/dist/contracts/index.d.ts +3 -5
  25. package/dist/contracts/index.d.ts.map +1 -1
  26. package/dist/contracts/index.js +1 -1
  27. package/dist/contracts/index.js.map +1 -1
  28. package/dist/contracts/schemas.d.ts +1 -31
  29. package/dist/contracts/schemas.d.ts.map +1 -1
  30. package/dist/contracts/schemas.js +1 -7
  31. package/dist/contracts/schemas.js.map +1 -1
  32. package/dist/index.d.ts +2 -7
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +5 -6
  35. package/dist/index.js.map +1 -1
  36. package/dist/manager/agent/__tests__/lifecycle.test.js +27 -13
  37. package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -1
  38. package/dist/manager/agent/lifecycle.d.ts +9 -0
  39. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  40. package/dist/manager/agent/lifecycle.js +93 -31
  41. package/dist/manager/agent/lifecycle.js.map +1 -1
  42. package/dist/manager/index.d.ts +2 -0
  43. package/dist/manager/index.d.ts.map +1 -1
  44. package/dist/manager/index.js +1 -0
  45. package/dist/manager/index.js.map +1 -1
  46. package/dist/manager/run/persistence.d.ts +3 -1
  47. package/dist/manager/run/persistence.d.ts.map +1 -1
  48. package/dist/manager/run/persistence.js +5 -0
  49. package/dist/manager/run/persistence.js.map +1 -1
  50. package/dist/manager/thread/__tests__/lifecycle.test.d.ts +2 -0
  51. package/dist/manager/thread/__tests__/lifecycle.test.d.ts.map +1 -0
  52. package/dist/manager/thread/__tests__/lifecycle.test.js +216 -0
  53. package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -0
  54. package/dist/manager/thread/lifecycle.d.ts +105 -0
  55. package/dist/manager/thread/lifecycle.d.ts.map +1 -0
  56. package/dist/manager/thread/lifecycle.js +186 -0
  57. package/dist/manager/thread/lifecycle.js.map +1 -0
  58. package/dist/rag/retriever.js +2 -2
  59. package/dist/registry/tool/execute.js +1 -1
  60. package/dist/registry/tool/execute.js.map +1 -1
  61. package/dist/runtime/query/__tests__/context.test.js +8 -7
  62. package/dist/runtime/query/__tests__/context.test.js.map +1 -1
  63. package/dist/runtime/query/context-cache.d.ts +3 -3
  64. package/dist/runtime/query/context-cache.d.ts.map +1 -1
  65. package/dist/runtime/query/context-cache.js +2 -2
  66. package/dist/runtime/query/context-cache.js.map +1 -1
  67. package/dist/runtime/query/context.d.ts +12 -21
  68. package/dist/runtime/query/context.d.ts.map +1 -1
  69. package/dist/runtime/query/context.js +3 -1
  70. package/dist/runtime/query/context.js.map +1 -1
  71. package/dist/runtime/query/index.d.ts +13 -15
  72. package/dist/runtime/query/index.d.ts.map +1 -1
  73. package/dist/runtime/query/index.js +2 -1
  74. package/dist/runtime/query/index.js.map +1 -1
  75. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  76. package/dist/runtime/query/iteration/index.js +1 -1
  77. package/dist/runtime/query/iteration/index.js.map +1 -1
  78. package/dist/session/__tests__/integration/_fixtures.d.ts +11 -4
  79. package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -1
  80. package/dist/session/__tests__/integration/_fixtures.js +23 -6
  81. package/dist/session/__tests__/integration/_fixtures.js.map +1 -1
  82. package/dist/session/__tests__/integration/archive-gate.test.d.ts +15 -0
  83. package/dist/session/__tests__/integration/archive-gate.test.d.ts.map +1 -0
  84. package/dist/session/__tests__/integration/archive-gate.test.js +214 -0
  85. package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -0
  86. package/dist/session/__tests__/integration/capacity-caps.test.js +13 -6
  87. package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -1
  88. package/dist/session/__tests__/integration/e2e-spawn.test.js +14 -2
  89. package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -1
  90. package/dist/session/__tests__/integration/event-stream-ordering.test.js +14 -7
  91. package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -1
  92. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +26 -14
  93. package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -1
  94. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +30 -20
  95. package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -1
  96. package/dist/session/__tests__/integration/handoff-single-e2e.test.js +25 -9
  97. package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -1
  98. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +11 -10
  99. package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -1
  100. package/dist/session/__tests__/integration/prev-artifact-dag.test.js +5 -4
  101. package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -1
  102. package/dist/session/__tests__/integration/retention-archive.test.js +3 -2
  103. package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -1
  104. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts +26 -0
  105. package/dist/session/__tests__/integration/spawn-rollback.test.d.ts.map +1 -0
  106. package/dist/session/__tests__/integration/spawn-rollback.test.js +236 -0
  107. package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -0
  108. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +2 -1
  109. package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -1
  110. package/dist/session/__tests__/integration/tenant-isolation.test.js +14 -5
  111. package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -1
  112. package/dist/session/errors.d.ts +79 -0
  113. package/dist/session/errors.d.ts.map +1 -1
  114. package/dist/session/errors.js +57 -0
  115. package/dist/session/errors.js.map +1 -1
  116. package/dist/session/handoff/__tests__/broadcast.test.js +49 -31
  117. package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -1
  118. package/dist/session/handoff/__tests__/capacity.test.js +21 -18
  119. package/dist/session/handoff/__tests__/capacity.test.js.map +1 -1
  120. package/dist/session/handoff/__tests__/single.test.js +39 -30
  121. package/dist/session/handoff/__tests__/single.test.js.map +1 -1
  122. package/dist/session/handoff/assignment.d.ts +13 -1
  123. package/dist/session/handoff/assignment.d.ts.map +1 -1
  124. package/dist/session/handoff/broadcast.d.ts +7 -0
  125. package/dist/session/handoff/broadcast.d.ts.map +1 -1
  126. package/dist/session/handoff/broadcast.js +16 -1
  127. package/dist/session/handoff/broadcast.js.map +1 -1
  128. package/dist/session/handoff/single.d.ts +7 -0
  129. package/dist/session/handoff/single.d.ts.map +1 -1
  130. package/dist/session/handoff/single.js +13 -1
  131. package/dist/session/handoff/single.js.map +1 -1
  132. package/dist/session/hierarchy/__tests__/session.test.js +2 -0
  133. package/dist/session/hierarchy/__tests__/session.test.js.map +1 -1
  134. package/dist/session/hierarchy/index.d.ts +1 -0
  135. package/dist/session/hierarchy/index.d.ts.map +1 -1
  136. package/dist/session/hierarchy/index.js.map +1 -1
  137. package/dist/session/hierarchy/session.d.ts +15 -3
  138. package/dist/session/hierarchy/session.d.ts.map +1 -1
  139. package/dist/session/hierarchy/session.js.map +1 -1
  140. package/dist/session/hierarchy/thread.d.ts +54 -0
  141. package/dist/session/hierarchy/thread.d.ts.map +1 -0
  142. package/dist/session/hierarchy/thread.js +2 -0
  143. package/dist/session/hierarchy/thread.js.map +1 -0
  144. package/dist/session/migration/id-prefix.d.ts +8 -13
  145. package/dist/session/migration/id-prefix.d.ts.map +1 -1
  146. package/dist/session/migration/id-prefix.js +8 -13
  147. package/dist/session/migration/id-prefix.js.map +1 -1
  148. package/dist/session/retention/__tests__/archive.test.js +3 -2
  149. package/dist/session/retention/__tests__/archive.test.js.map +1 -1
  150. package/dist/session/summary/__tests__/materialize.test.js +4 -3
  151. package/dist/session/summary/__tests__/materialize.test.js.map +1 -1
  152. package/dist/store/index.d.ts +0 -2
  153. package/dist/store/index.d.ts.map +1 -1
  154. package/dist/store/index.js +0 -1
  155. package/dist/store/index.js.map +1 -1
  156. package/dist/store/session/__tests__/disk.test.js +32 -5
  157. package/dist/store/session/__tests__/disk.test.js.map +1 -1
  158. package/dist/store/session/__tests__/memory.test.js +50 -9
  159. package/dist/store/session/__tests__/memory.test.js.map +1 -1
  160. package/dist/store/session/disk.d.ts +2 -1
  161. package/dist/store/session/disk.d.ts.map +1 -1
  162. package/dist/store/session/disk.js +61 -0
  163. package/dist/store/session/disk.js.map +1 -1
  164. package/dist/store/session/index.d.ts.map +1 -1
  165. package/dist/store/session/index.js +3 -4
  166. package/dist/store/session/index.js.map +1 -1
  167. package/dist/store/session/memory.d.ts +2 -1
  168. package/dist/store/session/memory.d.ts.map +1 -1
  169. package/dist/store/session/memory.js +13 -0
  170. package/dist/store/session/memory.js.map +1 -1
  171. package/dist/store/thread/disk.d.ts +41 -0
  172. package/dist/store/thread/disk.d.ts.map +1 -0
  173. package/dist/store/thread/disk.js +229 -0
  174. package/dist/store/thread/disk.js.map +1 -0
  175. package/dist/store/thread/index.d.ts +4 -0
  176. package/dist/store/thread/index.d.ts.map +1 -0
  177. package/dist/store/thread/index.js +6 -0
  178. package/dist/store/thread/index.js.map +1 -0
  179. package/dist/store/thread/memory.d.ts +23 -0
  180. package/dist/store/thread/memory.d.ts.map +1 -0
  181. package/dist/store/thread/memory.js +90 -0
  182. package/dist/store/thread/memory.js.map +1 -0
  183. package/dist/telemetry/runtime-accessors.d.ts +4 -0
  184. package/dist/telemetry/runtime-accessors.d.ts.map +1 -0
  185. package/dist/telemetry/runtime-accessors.js +17 -0
  186. package/dist/telemetry/runtime-accessors.js.map +1 -0
  187. package/dist/types/agent/base.d.ts +17 -21
  188. package/dist/types/agent/base.d.ts.map +1 -1
  189. package/dist/types/agent/factory.d.ts +8 -2
  190. package/dist/types/agent/factory.d.ts.map +1 -1
  191. package/dist/types/agent/task.d.ts +18 -11
  192. package/dist/types/agent/task.d.ts.map +1 -1
  193. package/dist/types/ids/index.d.ts +5 -9
  194. package/dist/types/ids/index.d.ts.map +1 -1
  195. package/dist/types/ids/index.js +4 -4
  196. package/dist/types/ids/index.js.map +1 -1
  197. package/dist/types/rag/retrieval.d.ts +4 -3
  198. package/dist/types/rag/retrieval.d.ts.map +1 -1
  199. package/dist/types/run/config.d.ts +6 -5
  200. package/dist/types/run/config.d.ts.map +1 -1
  201. package/dist/types/run/metadata.d.ts +5 -18
  202. package/dist/types/run/metadata.d.ts.map +1 -1
  203. package/dist/types/session/ids.d.ts +4 -13
  204. package/dist/types/session/ids.d.ts.map +1 -1
  205. package/dist/types/session/ids.js +3 -6
  206. package/dist/types/session/ids.js.map +1 -1
  207. package/dist/types/session/index.d.ts +1 -1
  208. package/dist/types/session/index.d.ts.map +1 -1
  209. package/dist/types/session/store.d.ts +32 -10
  210. package/dist/types/session/store.d.ts.map +1 -1
  211. package/dist/types/session/store.js +3 -8
  212. package/dist/types/session/store.js.map +1 -1
  213. package/dist/types/thread/index.d.ts +2 -0
  214. package/dist/types/thread/index.d.ts.map +1 -0
  215. package/dist/types/thread/index.js +5 -0
  216. package/dist/types/thread/index.js.map +1 -0
  217. package/dist/types/thread/store.d.ts +86 -0
  218. package/dist/types/thread/store.d.ts.map +1 -0
  219. package/dist/types/thread/store.js +22 -0
  220. package/dist/types/thread/store.js.map +1 -0
  221. package/dist/utils/id.d.ts +1 -12
  222. package/dist/utils/id.d.ts.map +1 -1
  223. package/dist/utils/id.js +3 -23
  224. package/dist/utils/id.js.map +1 -1
  225. package/package.json +11 -20
  226. package/src/agents/ReactiveAgent.ts +3 -2
  227. package/src/agents/SupervisorAgent.ts +5 -2
  228. package/src/bridge/a2a/index.ts +0 -1
  229. package/src/bridge/a2a/message.ts +0 -32
  230. package/src/bridge/a2a/task.ts +8 -7
  231. package/src/contracts/api.ts +6 -42
  232. package/src/contracts/ids.ts +1 -1
  233. package/src/contracts/index.ts +2 -8
  234. package/src/contracts/schemas.ts +1 -8
  235. package/src/index.ts +3 -15
  236. package/src/manager/agent/__tests__/lifecycle.test.ts +34 -13
  237. package/src/manager/agent/lifecycle.ts +114 -35
  238. package/src/manager/index.ts +3 -0
  239. package/src/manager/run/persistence.ts +7 -1
  240. package/src/manager/thread/__tests__/lifecycle.test.ts +286 -0
  241. package/src/manager/thread/lifecycle.ts +217 -0
  242. package/src/rag/retriever.ts +2 -2
  243. package/src/registry/tool/execute.ts +1 -1
  244. package/src/runtime/query/__tests__/context.test.ts +9 -8
  245. package/src/runtime/query/context-cache.ts +4 -4
  246. package/src/runtime/query/context.ts +15 -22
  247. package/src/runtime/query/index.ts +16 -17
  248. package/src/runtime/query/iteration/index.ts +1 -1
  249. package/src/session/__tests__/integration/_fixtures.ts +36 -8
  250. package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
  251. package/src/session/__tests__/integration/capacity-caps.test.ts +13 -6
  252. package/src/session/__tests__/integration/e2e-spawn.test.ts +20 -2
  253. package/src/session/__tests__/integration/event-stream-ordering.test.ts +14 -7
  254. package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +39 -13
  255. package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +54 -19
  256. package/src/session/__tests__/integration/handoff-single-e2e.test.ts +40 -9
  257. package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +13 -10
  258. package/src/session/__tests__/integration/prev-artifact-dag.test.ts +12 -5
  259. package/src/session/__tests__/integration/retention-archive.test.ts +5 -3
  260. package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
  261. package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +4 -2
  262. package/src/session/__tests__/integration/tenant-isolation.test.ts +16 -6
  263. package/src/session/errors.ts +89 -0
  264. package/src/session/handoff/__tests__/broadcast.test.ts +56 -28
  265. package/src/session/handoff/__tests__/capacity.test.ts +26 -20
  266. package/src/session/handoff/__tests__/single.test.ts +45 -28
  267. package/src/session/handoff/assignment.ts +13 -1
  268. package/src/session/handoff/broadcast.ts +26 -1
  269. package/src/session/handoff/single.ts +23 -1
  270. package/src/session/hierarchy/__tests__/session.test.ts +9 -1
  271. package/src/session/hierarchy/index.ts +1 -0
  272. package/src/session/hierarchy/session.ts +15 -3
  273. package/src/session/hierarchy/thread.ts +55 -0
  274. package/src/session/migration/id-prefix.ts +8 -13
  275. package/src/session/retention/__tests__/archive.test.ts +5 -3
  276. package/src/session/summary/__tests__/materialize.test.ts +6 -4
  277. package/src/store/index.ts +0 -3
  278. package/src/store/session/__tests__/disk.test.ts +57 -6
  279. package/src/store/session/__tests__/memory.test.ts +84 -9
  280. package/src/store/session/disk.ts +57 -1
  281. package/src/store/session/index.ts +3 -4
  282. package/src/store/session/memory.ts +13 -1
  283. package/src/store/thread/disk.ts +261 -0
  284. package/src/store/thread/index.ts +7 -0
  285. package/src/store/thread/memory.ts +104 -0
  286. package/src/telemetry/runtime-accessors.ts +19 -0
  287. package/src/types/agent/base.ts +17 -21
  288. package/src/types/agent/factory.ts +8 -3
  289. package/src/types/agent/task.ts +19 -11
  290. package/src/types/ids/index.ts +8 -15
  291. package/src/types/rag/retrieval.ts +4 -3
  292. package/src/types/run/config.ts +6 -5
  293. package/src/types/run/metadata.ts +5 -18
  294. package/src/types/session/ids.ts +4 -15
  295. package/src/types/session/index.ts +1 -2
  296. package/src/types/session/store.ts +34 -11
  297. package/src/types/thread/index.ts +5 -0
  298. package/src/types/thread/store.ts +92 -0
  299. package/src/utils/id.ts +3 -24
  300. package/dist/provider/telemetry/setup.d.ts +0 -19
  301. package/dist/provider/telemetry/setup.d.ts.map +0 -1
  302. package/dist/provider/telemetry/setup.js +0 -102
  303. package/dist/provider/telemetry/setup.js.map +0 -1
  304. package/dist/store/conversation/memory.d.ts +0 -43
  305. package/dist/store/conversation/memory.d.ts.map +0 -1
  306. package/dist/store/conversation/memory.js +0 -108
  307. package/dist/store/conversation/memory.js.map +0 -1
  308. package/dist/telemetry/index.d.ts +0 -6
  309. package/dist/telemetry/index.d.ts.map +0 -1
  310. package/dist/telemetry/index.js +0 -4
  311. package/dist/telemetry/index.js.map +0 -1
  312. package/dist/telemetry/metrics.d.ts +0 -8
  313. package/dist/telemetry/metrics.d.ts.map +0 -1
  314. package/dist/telemetry/metrics.js +0 -53
  315. package/dist/telemetry/metrics.js.map +0 -1
  316. package/dist/types/conversation/index.d.ts +0 -14
  317. package/dist/types/conversation/index.d.ts.map +0 -1
  318. package/dist/types/conversation/index.js +0 -2
  319. package/dist/types/conversation/index.js.map +0 -1
  320. package/dist/types/telemetry/index.d.ts +0 -10
  321. package/dist/types/telemetry/index.d.ts.map +0 -1
  322. package/dist/types/telemetry/index.js +0 -2
  323. package/dist/types/telemetry/index.js.map +0 -1
  324. package/src/provider/telemetry/setup.ts +0 -125
  325. package/src/store/conversation/memory.ts +0 -144
  326. package/src/telemetry/index.ts +0 -14
  327. package/src/telemetry/metrics.ts +0 -69
  328. package/src/types/conversation/index.ts +0 -15
  329. package/src/types/telemetry/index.ts +0 -10
@@ -7,6 +7,8 @@
7
7
  * (Convention #5: deny-by-default, fail fast).
8
8
  */
9
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';
10
12
  import type { WorkspaceBackendKind } from './workspace/driver.js';
11
13
  /**
12
14
  * Raised by {@link SessionStore} accessors when the supplied {@link TenantId}
@@ -57,4 +59,81 @@ export declare class WorkspaceBackendError extends Error {
57
59
  cause?: unknown;
58
60
  });
59
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
+ }
60
139
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +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,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"}
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"}
@@ -47,4 +47,61 @@ export class WorkspaceBackendError extends Error {
47
47
  this.details = details;
48
48
  }
49
49
  }
50
+ /**
51
+ * Raised by {@link import('../types/thread/store.js').ThreadStore.updateThread}
52
+ * when the supplied {@link Thread.ownerVersion} does not match the persisted
53
+ * record. The caller must re-read via `getThread`, re-apply its intended
54
+ * mutation on top of the fresh record, and retry. Mirrors the Session
55
+ * handoff CAS pattern (§6.1).
56
+ */
57
+ export class StaleThreadError extends Error {
58
+ details;
59
+ constructor(details) {
60
+ super(`Stale Thread ${details.threadId}: expected ownerVersion=${details.expectedVersion}, actual=${details.actualVersion}`);
61
+ this.name = 'StaleThreadError';
62
+ this.details = details;
63
+ }
64
+ }
65
+ /**
66
+ * Raised by the spawn path (and any caller that enforces the open-thread
67
+ * precondition) when a Thread is in `'archived'` state and would-be mutations
68
+ * require it to be `'open'`. Convention #5: deny-by-default — archival is a
69
+ * hard read-only boundary.
70
+ */
71
+ export class ThreadClosedError extends Error {
72
+ details;
73
+ constructor(details) {
74
+ super(`Thread ${details.threadId} is archived; operation '${details.op}' rejected`);
75
+ this.name = 'ThreadClosedError';
76
+ this.details = details;
77
+ }
78
+ }
79
+ /**
80
+ * Raised by {@link import('../manager/thread/lifecycle.js').ThreadManager.archive}
81
+ * and `.delete` when the Thread's session-presence precondition is violated:
82
+ *
83
+ * - `op: 'archive'` — at least one Session under the Thread is in a
84
+ * non-terminal state (`active | locked | awaiting_hitl | awaiting_merge`).
85
+ * The caller must first quiesce those sessions (let them reach `idle`,
86
+ * `failed`, or `archived`) before flipping the Thread to archived.
87
+ * - `op: 'delete'` — the Thread still has at least one attached Session.
88
+ * Callers must either archive + tombstone those sessions (`deleteSession`)
89
+ * before calling `deleteThread`, or accept that deletion is not yet safe.
90
+ *
91
+ * `blockingSessions` carries the first {@link THREAD_NOT_EMPTY_SAMPLE_LIMIT}
92
+ * offenders with their current status so operator tooling can surface an
93
+ * actionable list without unbounded error payloads on large threads.
94
+ * `totalBlockingSessions` holds the full count even when the sample is
95
+ * truncated. Convention #5: deny-by-default — no implicit cascade, no silent
96
+ * no-op.
97
+ */
98
+ export const THREAD_NOT_EMPTY_SAMPLE_LIMIT = 50;
99
+ export class ThreadNotEmptyError extends Error {
100
+ details;
101
+ constructor(details) {
102
+ super(`Thread ${details.threadId} ${details.op} blocked: ${details.totalBlockingSessions} session(s) still attached`);
103
+ this.name = 'ThreadNotEmptyError';
104
+ this.details = details;
105
+ }
106
+ }
50
107
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACrC,OAAO,CAGf;IAED,YAAY,OAAkD;QAC7D,KAAK,CAAC,+BAA+B,OAAO,CAAC,SAAS,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,OAAO,CAGf;IAED,YAAY,OAAkE;QAC7E,KAAK,CACJ,uCAAuC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC7F,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAIf;IAED,YAAY,OAAoE;QAC/E,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACrC,OAAO,CAGf;IAED,YAAY,OAAkD;QAC7D,KAAK,CAAC,+BAA+B,OAAO,CAAC,SAAS,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,OAAO,CAGf;IAED,YAAY,OAAkE;QAC7E,KAAK,CACJ,uCAAuC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC7F,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAIf;IAED,YAAY,OAAoE;QAC/E,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;;GAMG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACjC,OAAO,CAIf;IAED,YAAY,OAA+E;QAC1F,KAAK,CACJ,gBAAgB,OAAO,CAAC,QAAQ,2BAA2B,OAAO,CAAC,eAAe,YAAY,OAAO,CAAC,aAAa,EAAE,CACrH,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAClC,OAAO,CAGf;IAED,YAAY,OAA2C;QACtD,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,4BAA4B,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;QACnF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAE/C,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACpC,OAAO,CAMf;IAED,YAAY,OAMX;QACA,KAAK,CACJ,UAAU,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,aAAa,OAAO,CAAC,qBAAqB,4BAA4B,CAC9G,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
@@ -1,7 +1,9 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { ThreadManager } from '../../../manager/thread/lifecycle.js';
2
3
  import { GitWorktreeDriver, } from '../../../session/workspace/git-worktree.js';
3
4
  import { WorkspaceBackendRegistry } from '../../../session/workspace/registry.js';
4
5
  import { InMemorySessionStore } from '../../../store/session/memory.js';
6
+ import { InMemoryThreadStore } from '../../../store/thread/memory.js';
5
7
  import { generateHandoffId } from '../../../utils/id.js';
6
8
  import { executeBroadcastHandoff } from '../broadcast.js';
7
9
  import { DefaultCapacityValidator } from '../capacity.js';
@@ -24,7 +26,7 @@ function okExec(stdout = '', stderr = '') {
24
26
  function user(userId) {
25
27
  return { kind: 'user', userId: userId, tenantId: tenant };
26
28
  }
27
- function buildDeps(store, execOverride) {
29
+ function buildDeps(store, threadStore, execOverride) {
28
30
  const exec = execOverride ? execOverride : async (_file, _args) => okExec();
29
31
  const driver = new GitWorktreeDriver({
30
32
  repoRoot: '/repo',
@@ -39,27 +41,31 @@ function buildDeps(store, execOverride) {
39
41
  onCommitted: vi.fn(),
40
42
  onBroadcastRollback: vi.fn(),
41
43
  };
44
+ const threadManager = new ThreadManager({ threadStore, sessionStore: store });
42
45
  return {
43
46
  deps: {
44
47
  store,
45
48
  workspaceRegistry: registry,
46
49
  capacity: new DefaultCapacityValidator(store),
47
50
  events,
51
+ threadManager,
48
52
  },
49
53
  events,
50
54
  };
51
55
  }
52
- async function seedIdle(store) {
56
+ async function seedIdle(store, threadStore) {
53
57
  const project = await store.createProject({ tenantId: tenant, name: 'p' }, tenant);
54
- const session = await store.createSession({ projectId: project.id, currentActor: user('usr_source') }, tenant);
55
- return { project, session };
58
+ const thread = await threadStore.createThread({ projectId: project.id, title: 'handoff-broadcast-test' }, tenant);
59
+ const session = await store.createSession({ threadId: thread.id, projectId: project.id, currentActor: user('usr_source') }, tenant);
60
+ return { project, thread, session };
56
61
  }
57
- function buildAssignments(sourceSessionId, projectId, expectedOwnerVersion, recipients, broadcastId = 'bc_1') {
62
+ function buildAssignments(sourceSessionId, projectId, threadId, expectedOwnerVersion, recipients, broadcastId = 'bc_1') {
58
63
  return recipients.map((recipientActor) => ({
59
64
  id: generateHandoffId(),
60
65
  mode: 'broadcast',
61
66
  sourceSessionId,
62
67
  tenantId: tenant,
68
+ threadId,
63
69
  projectId,
64
70
  sourceActor: user('usr_source'),
65
71
  recipientActor,
@@ -70,13 +76,15 @@ function buildAssignments(sourceSessionId, projectId, expectedOwnerVersion, reci
70
76
  }
71
77
  describe('executeBroadcastHandoff', () => {
72
78
  let store;
79
+ let threadStore;
73
80
  beforeEach(() => {
74
81
  store = new InMemorySessionStore();
82
+ threadStore = new InMemoryThreadStore();
75
83
  });
76
84
  it('happy path: 3 recipients → source ends in awaiting_merge with 3 new children', async () => {
77
- const { project, session } = await seedIdle(store);
78
- const { deps, events } = buildDeps(store);
79
- const assignments = buildAssignments(session.id, project.id, 0, [
85
+ const { project, thread, session } = await seedIdle(store, threadStore);
86
+ const { deps, events } = buildDeps(store, threadStore);
87
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [
80
88
  user('usr_bob'),
81
89
  user('usr_carol'),
82
90
  user('usr_dan'),
@@ -95,7 +103,7 @@ describe('executeBroadcastHandoff', () => {
95
103
  expect(events.onBroadcastRollback).not.toHaveBeenCalled();
96
104
  });
97
105
  it('rollback on mid-fan-out failure (2nd recipient worktree add fails): source reverts, rollback emits accurate partialState', async () => {
98
- const { project, session } = await seedIdle(store);
106
+ const { project, thread, session } = await seedIdle(store, threadStore);
99
107
  let addCount = 0;
100
108
  const exec = async (_file, args) => {
101
109
  if (args.includes('add')) {
@@ -105,8 +113,8 @@ describe('executeBroadcastHandoff', () => {
105
113
  }
106
114
  return okExec();
107
115
  };
108
- const { deps, events } = buildDeps(store, exec);
109
- const assignments = buildAssignments(session.id, project.id, 0, [
116
+ const { deps, events } = buildDeps(store, threadStore, exec);
117
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [
110
118
  user('usr_b'),
111
119
  user('usr_c'),
112
120
  user('usr_d'),
@@ -134,7 +142,7 @@ describe('executeBroadcastHandoff', () => {
134
142
  expect(children).toHaveLength(0);
135
143
  });
136
144
  it('rollback performs full cleanup via deleteSubSession/deleteSession (no status-flip stopgap)', async () => {
137
- const { project, session } = await seedIdle(store);
145
+ const { project, thread, session } = await seedIdle(store, threadStore);
138
146
  let addCount = 0;
139
147
  const exec = async (_file, args) => {
140
148
  if (args.includes('add')) {
@@ -144,8 +152,11 @@ describe('executeBroadcastHandoff', () => {
144
152
  }
145
153
  return okExec();
146
154
  };
147
- const { deps } = buildDeps(store, exec);
148
- const assignments = buildAssignments(session.id, project.id, 0, [user('usr_b'), user('usr_c')]);
155
+ const { deps } = buildDeps(store, threadStore, exec);
156
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [
157
+ user('usr_b'),
158
+ user('usr_c'),
159
+ ]);
149
160
  await expect(executeBroadcastHandoff(deps, assignments, tenant)).rejects.toThrow();
150
161
  // No sub-session record remains.
151
162
  const children = await store.getChildren(session.id, tenant);
@@ -157,7 +168,7 @@ describe('executeBroadcastHandoff', () => {
157
168
  expect(reloaded?.ownerVersion).toBe(0);
158
169
  });
159
170
  it('rollback idempotency: worktree dispose throwing during rollback does not bubble a secondary failure', async () => {
160
- const { project, session } = await seedIdle(store);
171
+ const { project, thread, session } = await seedIdle(store, threadStore);
161
172
  let addCount = 0;
162
173
  let removeCount = 0;
163
174
  const exec = async (_file, args) => {
@@ -175,8 +186,11 @@ describe('executeBroadcastHandoff', () => {
175
186
  }
176
187
  return okExec();
177
188
  };
178
- const { deps, events } = buildDeps(store, exec);
179
- const assignments = buildAssignments(session.id, project.id, 0, [user('usr_b'), user('usr_c')]);
189
+ const { deps, events } = buildDeps(store, threadStore, exec);
190
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [
191
+ user('usr_b'),
192
+ user('usr_c'),
193
+ ]);
180
194
  // Outer failure is the PRIMARY one — the secondary dispose failure is
181
195
  // swallowed. Primary wraps in WorkspaceBackendError (create op).
182
196
  await expect(executeBroadcastHandoff(deps, assignments, tenant)).rejects.toThrow(/Workspace backend git-worktree failed on create/);
@@ -188,10 +202,14 @@ describe('executeBroadcastHandoff', () => {
188
202
  expect(reloaded?.status).toBe('idle');
189
203
  });
190
204
  it('dedupe: two assignments targeting same recipient → rejected pre-lock (no side effects)', async () => {
191
- const { project, session } = await seedIdle(store);
192
- const { deps, events } = buildDeps(store);
205
+ const { project, thread, session } = await seedIdle(store, threadStore);
206
+ const { deps, events } = buildDeps(store, threadStore);
193
207
  const bob = user('usr_bob');
194
- const assignments = buildAssignments(session.id, project.id, 0, [bob, bob, user('usr_dan')]);
208
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [
209
+ bob,
210
+ bob,
211
+ user('usr_dan'),
212
+ ]);
195
213
  await expect(executeBroadcastHandoff(deps, assignments, tenant)).rejects.toThrow(/duplicate recipient/);
196
214
  // Source never locked — no events fired.
197
215
  expect(events.onLocked).not.toHaveBeenCalled();
@@ -201,10 +219,10 @@ describe('executeBroadcastHandoff', () => {
201
219
  expect(reloaded?.status).toBe('idle');
202
220
  });
203
221
  it('width cap: 9 recipients exceeds default maxWidth=8 → rejected before source lock', async () => {
204
- const { project, session } = await seedIdle(store);
205
- const { deps, events } = buildDeps(store);
222
+ const { project, thread, session } = await seedIdle(store, threadStore);
223
+ const { deps, events } = buildDeps(store, threadStore);
206
224
  const recipients = Array.from({ length: 9 }, (_, i) => user(`usr_${i}`));
207
- const assignments = buildAssignments(session.id, project.id, 0, recipients);
225
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, recipients);
208
226
  await expect(executeBroadcastHandoff(deps, assignments, tenant)).rejects.toThrow(/Delegation capacity exceeded/);
209
227
  expect(events.onLocked).not.toHaveBeenCalled();
210
228
  expect(events.onBroadcastRollback).not.toHaveBeenCalled();
@@ -212,9 +230,9 @@ describe('executeBroadcastHandoff', () => {
212
230
  expect(reloaded?.status).toBe('idle');
213
231
  });
214
232
  it('concurrent broadcast on same source: second attempt rejected with HandoffVersionConflict', async () => {
215
- const { project, session } = await seedIdle(store);
216
- const { deps } = buildDeps(store);
217
- const firstAssignments = buildAssignments(session.id, project.id, 0, [user('usr_b'), user('usr_c')], 'bc_1');
233
+ const { project, thread, session } = await seedIdle(store, threadStore);
234
+ const { deps } = buildDeps(store, threadStore);
235
+ const firstAssignments = buildAssignments(session.id, project.id, thread.id, 0, [user('usr_b'), user('usr_c')], 'bc_1');
218
236
  await executeBroadcastHandoff(deps, firstAssignments, tenant);
219
237
  // Second broadcast still has expectedOwnerVersion = 0 but source is now 1.
220
238
  // It should also observe source.status === 'awaiting_merge' (non-idle) —
@@ -225,18 +243,18 @@ describe('executeBroadcastHandoff', () => {
225
243
  if (!reloaded)
226
244
  throw new Error('source missing');
227
245
  await store.updateSession({ ...reloaded, status: 'idle' }, tenant);
228
- const second = buildAssignments(session.id, project.id, 0, // stale — actual is 1
246
+ const second = buildAssignments(session.id, project.id, thread.id, 0, // stale — actual is 1
229
247
  [user('usr_d'), user('usr_e')], 'bc_2');
230
248
  await expect(executeBroadcastHandoff(deps, second, tenant)).rejects.toBeInstanceOf(HandoffVersionConflict);
231
249
  });
232
250
  it('empty assignments → throws a descriptive error', async () => {
233
- const { deps } = buildDeps(store);
251
+ const { deps } = buildDeps(store, threadStore);
234
252
  await expect(executeBroadcastHandoff(deps, [], tenant)).rejects.toThrow(/assignments must not be empty/);
235
253
  });
236
254
  it('single-row broadcast → rejected (caller must use executeSingleHandoff)', async () => {
237
- const { project, session } = await seedIdle(store);
238
- const { deps } = buildDeps(store);
239
- const assignments = buildAssignments(session.id, project.id, 0, [user('usr_b')]);
255
+ const { project, thread, session } = await seedIdle(store, threadStore);
256
+ const { deps } = buildDeps(store, threadStore);
257
+ const assignments = buildAssignments(session.id, project.id, thread.id, 0, [user('usr_b')]);
240
258
  await expect(executeBroadcastHandoff(deps, assignments, tenant)).rejects.toThrow(/single-recipient handoffs must use executeSingleHandoff/);
241
259
  });
242
260
  });
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.test.js","sourceRoot":"","sources":["../../../../src/session/handoff/__tests__/broadcast.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"broadcast.test.js","sourceRoot":"","sources":["../../../../src/session/handoff/__tests__/broadcast.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AAEpE,OAAO,EAGN,iBAAiB,GACjB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAGrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAA6B,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAQzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,MAAM,GAAG,WAAuB,CAAA;AAEtC,SAAS,UAAU;IAClB,OAAO;QACN,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,KAAK;YACJ,OAAO,UAAU,EAAE,CAAA;QACpB,CAAC;KACD,CAAA;AACF,CAAC;AAED,SAAS,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE;IACvC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,MAAc;IAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AACpE,CAAC;AAcD,SAAS,SAAS,CACjB,KAA2B,EAC3B,WAAgC,EAChC,YAAuB;IAEvB,MAAM,IAAI,GAAa,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAA;IACrF,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACpC,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,UAAU,EAAE;QACpB,QAAQ,EAAE,IAAI;KACd,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAA;IAC/C,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAEzB,MAAM,MAAM,GAA2B;QACtC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAoC;QACnD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAsC;QACvD,WAAW,EAAE,EAAE,CAAC,EAAE,EAAuC;QACzD,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAA+C;KACzE,CAAA;IAED,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7E,OAAO;QACN,IAAI,EAAE;YACL,KAAK;YACL,iBAAiB,EAAE,QAAQ;YAC3B,QAAQ,EAAE,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAC7C,MAAM;YACN,aAAa;SACb;QACD,MAAM;KACN,CAAA;AACF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAA2B,EAAE,WAAgC;IACpF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAC5C,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAC1D,MAAM,CACN,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAChF,MAAM,CACN,CAAA;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACpC,CAAC;AAED,SAAS,gBAAgB,CACxB,eAA0B,EAC1B,SAAoB,EACpB,QAAwE,EACxE,oBAA4B,EAC5B,UAAsB,EACtB,WAAW,GAAG,MAAM;IAEpB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,EAAE,iBAAiB,EAAE;QACvB,IAAI,EAAE,WAAoB;QAC1B,eAAe;QACf,QAAQ,EAAE,MAAM;QAChB,QAAQ;QACR,SAAS;QACT,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC;QAC/B,cAAc;QACd,oBAAoB;QACpB,WAAW;QACX,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;KACjC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACxC,IAAI,KAA2B,CAAA;IAC/B,IAAI,WAAgC,CAAA;IAEpC,UAAU,CAAC,GAAG,EAAE;QACf,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAClC,WAAW,GAAG,IAAI,mBAAmB,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEtD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1E,IAAI,CAAC,SAAS,CAAC;YACf,IAAI,CAAC,WAAW,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC;SACf,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACzE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC/C,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAEhC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAChD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0HAA0H,EAAE,KAAK,IAAI,EAAE;QACzI,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEvE,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,MAAM,IAAI,GAAa,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,IAAI,CAAC,CAAA;gBACb,IAAI,QAAQ,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACpE,CAAC;YACD,OAAO,MAAM,EAAE,CAAA;QAChB,CAAC,CAAA;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAE5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1E,IAAI,CAAC,OAAO,CAAC;YACb,IAAI,CAAC,OAAO,CAAC;YACb,IAAI,CAAC,OAAO,CAAC;SACb,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,iDAAiD,CACjD,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEtC,uEAAuE;QACvE,sDAAsD;QACtD,oDAAoD;QACpD,kDAAkD;QAClD,kDAAkD;QAClD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAClE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/D,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7D,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7D,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE9C,kEAAkE;QAClE,sEAAsE;QACtE,qDAAqD;QACrD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC3G,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEvE,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,MAAM,IAAI,GAAa,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,IAAI,CAAC,CAAA;gBACb,IAAI,QAAQ,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACzD,CAAC;YACD,OAAO,MAAM,EAAE,CAAA;QAChB,CAAC,CAAA;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAEpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1E,IAAI,CAAC,OAAO,CAAC;YACb,IAAI,CAAC,OAAO,CAAC;SACb,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;QAElF,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAEhC,2EAA2E;QAC3E,gCAAgC;QAChC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACpH,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEvE,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,MAAM,IAAI,GAAa,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,IAAI,CAAC,CAAA;gBACb,IAAI,QAAQ,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACvE,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,WAAW,IAAI,CAAC,CAAA;gBAChB,qEAAqE;gBACrE,kEAAkE;gBAClE,iBAAiB;gBACjB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;YACnE,CAAC;YACD,OAAO,MAAM,EAAE,CAAA;QAChB,CAAC,CAAA;QACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QAE5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1E,IAAI,CAAC,OAAO,CAAC;YACb,IAAI,CAAC,OAAO,CAAC;SACb,CAAC,CAAA;QAEF,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,iDAAiD,CACjD,CAAA;QAED,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAE3D,wEAAwE;QACxE,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEtD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3B,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1E,GAAG;YACH,GAAG;YACH,IAAI,CAAC,SAAS,CAAC;SACf,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,qBAAqB,CACrB,CAAA;QAED,yCAAyC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAEtD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;QAEtF,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,8BAA8B,CAC9B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAEzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAE9C,MAAM,gBAAgB,GAAG,gBAAgB,CACxC,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,EAAE,EACV,MAAM,CAAC,EAAE,EACT,CAAC,EACD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAC9B,MAAM,CACN,CAAA;QACD,MAAM,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAA;QAE7D,2EAA2E;QAC3E,yEAAyE;QACzE,uEAAuE;QACvE,2EAA2E;QAC3E,yEAAyE;QACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3D,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAChD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QAElE,MAAM,MAAM,GAAG,gBAAgB,CAC9B,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,EAAE,EACV,MAAM,CAAC,EAAE,EACT,CAAC,EAAE,sBAAsB;QACzB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAC9B,MAAM,CACN,CAAA;QACD,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CACjF,sBAAsB,CACtB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAC9C,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACtE,+BAA+B,CAC/B,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QACvE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAE3F,MAAM,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,yDAAyD,CACzD,CAAA;IACF,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { InMemorySessionStore } from '../../../store/session/memory.js';
3
+ import { InMemoryThreadStore } from '../../../store/thread/memory.js';
3
4
  import { DefaultCapacityValidator, DelegationCapacityExceeded } from '../capacity.js';
4
5
  const tenant = 'tnt_alpha';
5
6
  function user() {
@@ -10,11 +11,13 @@ function agent() {
10
11
  }
11
12
  async function seedProject(store) {
12
13
  const project = await store.createProject({ tenantId: tenant, name: 'p' }, tenant);
13
- const root = await store.createSession({ projectId: project.id, currentActor: user() }, tenant);
14
- return { project, root };
14
+ const threadStore = new InMemoryThreadStore();
15
+ const thread = await threadStore.createThread({ projectId: project.id, title: 'default' }, tenant);
16
+ const root = await store.createSession({ threadId: thread.id, projectId: project.id, currentActor: user() }, tenant);
17
+ return { project, thread, root };
15
18
  }
16
- async function spawnChild(store, parentId, projectId) {
17
- const child = await store.createSession({ projectId, currentActor: user() }, tenant);
19
+ async function spawnChild(store, parentId, projectId, threadId) {
20
+ const child = await store.createSession({ threadId, projectId, currentActor: user() }, tenant);
18
21
  await store.createSubSession({
19
22
  parentSessionId: parentId,
20
23
  childSessionId: child.id,
@@ -32,22 +35,22 @@ describe('DefaultCapacityValidator', () => {
32
35
  });
33
36
  it('depth: chain of 4 (root→c1→c2→c3→c4) allows a 5th (depth 5) to pass when limit = 5', async () => {
34
37
  const store = new InMemorySessionStore();
35
- const { project, root } = await seedProject(store);
36
- const c1 = await spawnChild(store, root.id, project.id);
37
- const c2 = await spawnChild(store, c1.childId, project.id);
38
- const c3 = await spawnChild(store, c2.childId, project.id);
39
- const c4 = await spawnChild(store, c3.childId, project.id);
38
+ const { project, thread, root } = await seedProject(store);
39
+ const c1 = await spawnChild(store, root.id, project.id, thread.id);
40
+ const c2 = await spawnChild(store, c1.childId, project.id, thread.id);
41
+ const c3 = await spawnChild(store, c2.childId, project.id, thread.id);
42
+ const c4 = await spawnChild(store, c3.childId, project.id, thread.id);
40
43
  const validator = new DefaultCapacityValidator(store);
41
44
  // Ancestry of c4: root→c1→c2→c3→c4 = length 5. Spawning under c4 = depth 5.
42
45
  await expect(validator.validateDepth(c4.childId, 5, tenant)).resolves.toBeUndefined();
43
46
  });
44
47
  it('depth: over-limit throws DelegationCapacityExceeded with dimension=depth', async () => {
45
48
  const store = new InMemorySessionStore();
46
- const { project, root } = await seedProject(store);
47
- const c1 = await spawnChild(store, root.id, project.id);
48
- const c2 = await spawnChild(store, c1.childId, project.id);
49
- const c3 = await spawnChild(store, c2.childId, project.id);
50
- const c4 = await spawnChild(store, c3.childId, project.id);
49
+ const { project, thread, root } = await seedProject(store);
50
+ const c1 = await spawnChild(store, root.id, project.id, thread.id);
51
+ const c2 = await spawnChild(store, c1.childId, project.id, thread.id);
52
+ const c3 = await spawnChild(store, c2.childId, project.id, thread.id);
53
+ const c4 = await spawnChild(store, c3.childId, project.id, thread.id);
51
54
  const validator = new DefaultCapacityValidator(store);
52
55
  try {
53
56
  // Ancestry of c4 has length 5; limit=4 means depth 5 > 4 → reject.
@@ -70,18 +73,18 @@ describe('DefaultCapacityValidator', () => {
70
73
  });
71
74
  it('width: existing 5 + pending 3 = 8 passes exactly at the limit', async () => {
72
75
  const store = new InMemorySessionStore();
73
- const { project, root } = await seedProject(store);
76
+ const { project, thread, root } = await seedProject(store);
74
77
  for (let i = 0; i < 5; i++) {
75
- await spawnChild(store, root.id, project.id);
78
+ await spawnChild(store, root.id, project.id, thread.id);
76
79
  }
77
80
  const validator = new DefaultCapacityValidator(store);
78
81
  await expect(validator.validateWidth(root.id, 3, 8, tenant)).resolves.toBeUndefined();
79
82
  });
80
83
  it('width: existing 6 + pending 3 = 9 exceeds 8, throws dimension=width', async () => {
81
84
  const store = new InMemorySessionStore();
82
- const { project, root } = await seedProject(store);
85
+ const { project, thread, root } = await seedProject(store);
83
86
  for (let i = 0; i < 6; i++) {
84
- await spawnChild(store, root.id, project.id);
87
+ await spawnChild(store, root.id, project.id, thread.id);
85
88
  }
86
89
  const validator = new DefaultCapacityValidator(store);
87
90
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"capacity.test.js","sourceRoot":"","sources":["../../../../src/session/handoff/__tests__/capacity.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capacity.test.js","sourceRoot":"","sources":["../../../../src/session/handoff/__tests__/capacity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAGrE,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAErF,MAAM,MAAM,GAAG,WAAuB,CAAA;AAEtC,SAAS,IAAI;IACZ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AACrE,CAAC;AAED,SAAS,KAAK;IACb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AACxE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAA2B;IACrD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;IAClF,MAAM,WAAW,GAAG,IAAI,mBAAmB,EAAE,CAAA;IAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAA;IAClG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,aAAa,CACrC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EACpE,MAAM,CACN,CAAA;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AACjC,CAAC;AAED,KAAK,UAAU,UAAU,CACxB,KAA2B,EAC3B,QAAmB,EACnB,SAAoB,EACpB,QAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAC9F,MAAM,KAAK,CAAC,gBAAgB,CAC3B;QACC,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,KAAK,CAAC,EAAE;QACxB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,KAAK,EAAE;KAClB,EACD,MAAM,CACN,CAAA;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAA;AAC7B,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QAErD,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAClE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAErE,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACrD,4EAA4E;QAC5E,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAClE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAErE,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACrD,IAAI,CAAC;YACJ,mEAAmE;YACnE,MAAM,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAA;YACtD,MAAM,CAAC,GAAG,GAAiC,CAAA;YAC3C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QAErD,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACrD,IAAI,CAAC;YACJ,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAA;YACtD,MAAM,CAAC,GAAG,GAAiC,CAAA;YAC3C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACzC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC;IACF,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}