@devflow-tools/delivery-line 0.18.8

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/__tests__/artifact-generation.test.d.ts +2 -0
  4. package/dist/__tests__/artifact-generation.test.d.ts.map +1 -0
  5. package/dist/__tests__/artifact-generation.test.js +16 -0
  6. package/dist/__tests__/artifact-generation.test.js.map +1 -0
  7. package/dist/__tests__/backend-scenario.e2e.test.d.ts +2 -0
  8. package/dist/__tests__/backend-scenario.e2e.test.d.ts.map +1 -0
  9. package/dist/__tests__/backend-scenario.e2e.test.js +25 -0
  10. package/dist/__tests__/backend-scenario.e2e.test.js.map +1 -0
  11. package/dist/__tests__/claude-events.test.d.ts +2 -0
  12. package/dist/__tests__/claude-events.test.d.ts.map +1 -0
  13. package/dist/__tests__/claude-events.test.js +28 -0
  14. package/dist/__tests__/claude-events.test.js.map +1 -0
  15. package/dist/__tests__/facade-e2e.test.d.ts +2 -0
  16. package/dist/__tests__/facade-e2e.test.d.ts.map +1 -0
  17. package/dist/__tests__/facade-e2e.test.js +167 -0
  18. package/dist/__tests__/facade-e2e.test.js.map +1 -0
  19. package/dist/__tests__/frontend-scenario.e2e.test.d.ts +2 -0
  20. package/dist/__tests__/frontend-scenario.e2e.test.d.ts.map +1 -0
  21. package/dist/__tests__/frontend-scenario.e2e.test.js +35 -0
  22. package/dist/__tests__/frontend-scenario.e2e.test.js.map +1 -0
  23. package/dist/__tests__/git-artifact-store.test.d.ts +2 -0
  24. package/dist/__tests__/git-artifact-store.test.d.ts.map +1 -0
  25. package/dist/__tests__/git-artifact-store.test.js +44 -0
  26. package/dist/__tests__/git-artifact-store.test.js.map +1 -0
  27. package/dist/__tests__/governance-adapters.test.d.ts +2 -0
  28. package/dist/__tests__/governance-adapters.test.d.ts.map +1 -0
  29. package/dist/__tests__/governance-adapters.test.js +51 -0
  30. package/dist/__tests__/governance-adapters.test.js.map +1 -0
  31. package/dist/__tests__/handoff-validator.test.d.ts +2 -0
  32. package/dist/__tests__/handoff-validator.test.d.ts.map +1 -0
  33. package/dist/__tests__/handoff-validator.test.js +13 -0
  34. package/dist/__tests__/handoff-validator.test.js.map +1 -0
  35. package/dist/__tests__/interaction-session.test.d.ts +2 -0
  36. package/dist/__tests__/interaction-session.test.d.ts.map +1 -0
  37. package/dist/__tests__/interaction-session.test.js +13 -0
  38. package/dist/__tests__/interaction-session.test.js.map +1 -0
  39. package/dist/__tests__/interaction.test.d.ts +2 -0
  40. package/dist/__tests__/interaction.test.d.ts.map +1 -0
  41. package/dist/__tests__/interaction.test.js +27 -0
  42. package/dist/__tests__/interaction.test.js.map +1 -0
  43. package/dist/__tests__/persistence.test.d.ts +2 -0
  44. package/dist/__tests__/persistence.test.d.ts.map +1 -0
  45. package/dist/__tests__/persistence.test.js +41 -0
  46. package/dist/__tests__/persistence.test.js.map +1 -0
  47. package/dist/__tests__/recovery-spike.test.d.ts +2 -0
  48. package/dist/__tests__/recovery-spike.test.d.ts.map +1 -0
  49. package/dist/__tests__/recovery-spike.test.js +20 -0
  50. package/dist/__tests__/recovery-spike.test.js.map +1 -0
  51. package/dist/__tests__/sqlite-recovery.test.d.ts +2 -0
  52. package/dist/__tests__/sqlite-recovery.test.d.ts.map +1 -0
  53. package/dist/__tests__/sqlite-recovery.test.js +90 -0
  54. package/dist/__tests__/sqlite-recovery.test.js.map +1 -0
  55. package/dist/__tests__/state-machine.test.d.ts +2 -0
  56. package/dist/__tests__/state-machine.test.d.ts.map +1 -0
  57. package/dist/__tests__/state-machine.test.js +49 -0
  58. package/dist/__tests__/state-machine.test.js.map +1 -0
  59. package/dist/__tests__/subagent-orchestrator.test.d.ts +2 -0
  60. package/dist/__tests__/subagent-orchestrator.test.d.ts.map +1 -0
  61. package/dist/__tests__/subagent-orchestrator.test.js +33 -0
  62. package/dist/__tests__/subagent-orchestrator.test.js.map +1 -0
  63. package/dist/__tests__/subagent-recovery.e2e.test.d.ts +2 -0
  64. package/dist/__tests__/subagent-recovery.e2e.test.d.ts.map +1 -0
  65. package/dist/__tests__/subagent-recovery.e2e.test.js +35 -0
  66. package/dist/__tests__/subagent-recovery.e2e.test.js.map +1 -0
  67. package/dist/__tests__/task-dag.test.d.ts +2 -0
  68. package/dist/__tests__/task-dag.test.d.ts.map +1 -0
  69. package/dist/__tests__/task-dag.test.js +31 -0
  70. package/dist/__tests__/task-dag.test.js.map +1 -0
  71. package/dist/__tests__/worker-integration.test.d.ts +2 -0
  72. package/dist/__tests__/worker-integration.test.d.ts.map +1 -0
  73. package/dist/__tests__/worker-integration.test.js +217 -0
  74. package/dist/__tests__/worker-integration.test.js.map +1 -0
  75. package/dist/adapters/approval.d.ts +40 -0
  76. package/dist/adapters/approval.d.ts.map +1 -0
  77. package/dist/adapters/approval.js +100 -0
  78. package/dist/adapters/approval.js.map +1 -0
  79. package/dist/adapters/delivery-package.d.ts +23 -0
  80. package/dist/adapters/delivery-package.d.ts.map +1 -0
  81. package/dist/adapters/delivery-package.js +37 -0
  82. package/dist/adapters/delivery-package.js.map +1 -0
  83. package/dist/adapters/integration.d.ts +37 -0
  84. package/dist/adapters/integration.d.ts.map +1 -0
  85. package/dist/adapters/integration.js +84 -0
  86. package/dist/adapters/integration.js.map +1 -0
  87. package/dist/adapters/review.d.ts +12 -0
  88. package/dist/adapters/review.d.ts.map +1 -0
  89. package/dist/adapters/review.js +33 -0
  90. package/dist/adapters/review.js.map +1 -0
  91. package/dist/adapters/verification.d.ts +25 -0
  92. package/dist/adapters/verification.d.ts.map +1 -0
  93. package/dist/adapters/verification.js +57 -0
  94. package/dist/adapters/verification.js.map +1 -0
  95. package/dist/adapters/workflow-execution.d.ts +130 -0
  96. package/dist/adapters/workflow-execution.d.ts.map +1 -0
  97. package/dist/adapters/workflow-execution.js +135 -0
  98. package/dist/adapters/workflow-execution.js.map +1 -0
  99. package/dist/artifact-generation.test.d.ts +2 -0
  100. package/dist/artifact-generation.test.d.ts.map +1 -0
  101. package/dist/artifact-generation.test.js +11 -0
  102. package/dist/artifact-generation.test.js.map +1 -0
  103. package/dist/artifacts/context-manifest.d.ts +20 -0
  104. package/dist/artifacts/context-manifest.d.ts.map +1 -0
  105. package/dist/artifacts/context-manifest.js +24 -0
  106. package/dist/artifacts/context-manifest.js.map +1 -0
  107. package/dist/artifacts/generation-guard.d.ts +13 -0
  108. package/dist/artifacts/generation-guard.d.ts.map +1 -0
  109. package/dist/artifacts/generation-guard.js +16 -0
  110. package/dist/artifacts/generation-guard.js.map +1 -0
  111. package/dist/artifacts/git-artifact-store.d.ts +16 -0
  112. package/dist/artifacts/git-artifact-store.d.ts.map +1 -0
  113. package/dist/artifacts/git-artifact-store.js +47 -0
  114. package/dist/artifacts/git-artifact-store.js.map +1 -0
  115. package/dist/claude-events.test.d.ts +2 -0
  116. package/dist/claude-events.test.d.ts.map +1 -0
  117. package/dist/claude-events.test.js +14 -0
  118. package/dist/claude-events.test.js.map +1 -0
  119. package/dist/composition.d.ts +13 -0
  120. package/dist/composition.d.ts.map +1 -0
  121. package/dist/composition.js +47 -0
  122. package/dist/composition.js.map +1 -0
  123. package/dist/domain/interaction.d.ts +23 -0
  124. package/dist/domain/interaction.d.ts.map +1 -0
  125. package/dist/domain/interaction.js +60 -0
  126. package/dist/domain/interaction.js.map +1 -0
  127. package/dist/domain/state-machine.d.ts +26 -0
  128. package/dist/domain/state-machine.d.ts.map +1 -0
  129. package/dist/domain/state-machine.js +67 -0
  130. package/dist/domain/state-machine.js.map +1 -0
  131. package/dist/domain/task-dag.d.ts +5 -0
  132. package/dist/domain/task-dag.d.ts.map +1 -0
  133. package/dist/domain/task-dag.js +78 -0
  134. package/dist/domain/task-dag.js.map +1 -0
  135. package/dist/domain/types.d.ts +320 -0
  136. package/dist/domain/types.d.ts.map +1 -0
  137. package/dist/domain/types.js +9 -0
  138. package/dist/domain/types.js.map +1 -0
  139. package/dist/facade/delivery-line-facade.d.ts +77 -0
  140. package/dist/facade/delivery-line-facade.d.ts.map +1 -0
  141. package/dist/facade/delivery-line-facade.js +417 -0
  142. package/dist/facade/delivery-line-facade.js.map +1 -0
  143. package/dist/git-artifact-store.test.d.ts +2 -0
  144. package/dist/git-artifact-store.test.d.ts.map +1 -0
  145. package/dist/git-artifact-store.test.js +27 -0
  146. package/dist/git-artifact-store.test.js.map +1 -0
  147. package/dist/governance-adapters.test.d.ts +2 -0
  148. package/dist/governance-adapters.test.d.ts.map +1 -0
  149. package/dist/governance-adapters.test.js +14 -0
  150. package/dist/governance-adapters.test.js.map +1 -0
  151. package/dist/handoff-validator.test.d.ts +2 -0
  152. package/dist/handoff-validator.test.d.ts.map +1 -0
  153. package/dist/handoff-validator.test.js +10 -0
  154. package/dist/handoff-validator.test.js.map +1 -0
  155. package/dist/index.d.ts +37 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +37 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/interaction-session.d.ts +12 -0
  160. package/dist/interaction-session.d.ts.map +1 -0
  161. package/dist/interaction-session.js +21 -0
  162. package/dist/interaction-session.js.map +1 -0
  163. package/dist/interaction-session.test.d.ts +2 -0
  164. package/dist/interaction-session.test.d.ts.map +1 -0
  165. package/dist/interaction-session.test.js +13 -0
  166. package/dist/interaction-session.test.js.map +1 -0
  167. package/dist/persistence/cas.d.ts +4 -0
  168. package/dist/persistence/cas.d.ts.map +1 -0
  169. package/dist/persistence/cas.js +7 -0
  170. package/dist/persistence/cas.js.map +1 -0
  171. package/dist/persistence/event-ledger.d.ts +10 -0
  172. package/dist/persistence/event-ledger.d.ts.map +1 -0
  173. package/dist/persistence/event-ledger.js +6 -0
  174. package/dist/persistence/event-ledger.js.map +1 -0
  175. package/dist/persistence/memory-store.d.ts +51 -0
  176. package/dist/persistence/memory-store.d.ts.map +1 -0
  177. package/dist/persistence/memory-store.js +99 -0
  178. package/dist/persistence/memory-store.js.map +1 -0
  179. package/dist/persistence/schema.d.ts +2 -0
  180. package/dist/persistence/schema.d.ts.map +1 -0
  181. package/dist/persistence/schema.js +107 -0
  182. package/dist/persistence/schema.js.map +1 -0
  183. package/dist/persistence/sqlite-store.d.ts +59 -0
  184. package/dist/persistence/sqlite-store.d.ts.map +1 -0
  185. package/dist/persistence/sqlite-store.js +133 -0
  186. package/dist/persistence/sqlite-store.js.map +1 -0
  187. package/dist/persistence.test.d.ts +2 -0
  188. package/dist/persistence.test.d.ts.map +1 -0
  189. package/dist/persistence.test.js +28 -0
  190. package/dist/persistence.test.js.map +1 -0
  191. package/dist/ports/index.d.ts +248 -0
  192. package/dist/ports/index.d.ts.map +1 -0
  193. package/dist/ports/index.js +2 -0
  194. package/dist/ports/index.js.map +1 -0
  195. package/dist/recovery-spike.d.ts +22 -0
  196. package/dist/recovery-spike.d.ts.map +1 -0
  197. package/dist/recovery-spike.js +28 -0
  198. package/dist/recovery-spike.js.map +1 -0
  199. package/dist/recovery-spike.test.d.ts +2 -0
  200. package/dist/recovery-spike.test.d.ts.map +1 -0
  201. package/dist/recovery-spike.test.js +20 -0
  202. package/dist/recovery-spike.test.js.map +1 -0
  203. package/dist/runtime/claude-host-adapter.d.ts +28 -0
  204. package/dist/runtime/claude-host-adapter.d.ts.map +1 -0
  205. package/dist/runtime/claude-host-adapter.js +43 -0
  206. package/dist/runtime/claude-host-adapter.js.map +1 -0
  207. package/dist/runtime/context-binder.d.ts +61 -0
  208. package/dist/runtime/context-binder.d.ts.map +1 -0
  209. package/dist/runtime/context-binder.js +26 -0
  210. package/dist/runtime/context-binder.js.map +1 -0
  211. package/dist/runtime/execution-coordinator.d.ts +32 -0
  212. package/dist/runtime/execution-coordinator.d.ts.map +1 -0
  213. package/dist/runtime/execution-coordinator.js +243 -0
  214. package/dist/runtime/execution-coordinator.js.map +1 -0
  215. package/dist/runtime/gate-queue.d.ts +17 -0
  216. package/dist/runtime/gate-queue.d.ts.map +1 -0
  217. package/dist/runtime/gate-queue.js +33 -0
  218. package/dist/runtime/gate-queue.js.map +1 -0
  219. package/dist/runtime/host-conformance.d.ts +47 -0
  220. package/dist/runtime/host-conformance.d.ts.map +1 -0
  221. package/dist/runtime/host-conformance.js +61 -0
  222. package/dist/runtime/host-conformance.js.map +1 -0
  223. package/dist/runtime/host-routing.d.ts +5 -0
  224. package/dist/runtime/host-routing.d.ts.map +1 -0
  225. package/dist/runtime/host-routing.js +42 -0
  226. package/dist/runtime/host-routing.js.map +1 -0
  227. package/dist/runtime/memory-writeback.d.ts +18 -0
  228. package/dist/runtime/memory-writeback.d.ts.map +1 -0
  229. package/dist/runtime/memory-writeback.js +23 -0
  230. package/dist/runtime/memory-writeback.js.map +1 -0
  231. package/dist/runtime/operation-journal.d.ts +13 -0
  232. package/dist/runtime/operation-journal.d.ts.map +1 -0
  233. package/dist/runtime/operation-journal.js +38 -0
  234. package/dist/runtime/operation-journal.js.map +1 -0
  235. package/dist/runtime/plan-compiler.d.ts +37 -0
  236. package/dist/runtime/plan-compiler.d.ts.map +1 -0
  237. package/dist/runtime/plan-compiler.js +62 -0
  238. package/dist/runtime/plan-compiler.js.map +1 -0
  239. package/dist/runtime/project-runtime-factory.d.ts +15 -0
  240. package/dist/runtime/project-runtime-factory.d.ts.map +1 -0
  241. package/dist/runtime/project-runtime-factory.js +11 -0
  242. package/dist/runtime/project-runtime-factory.js.map +1 -0
  243. package/dist/runtime/review-coordinator.d.ts +25 -0
  244. package/dist/runtime/review-coordinator.d.ts.map +1 -0
  245. package/dist/runtime/review-coordinator.js +22 -0
  246. package/dist/runtime/review-coordinator.js.map +1 -0
  247. package/dist/subagents/claude-events.d.ts +59 -0
  248. package/dist/subagents/claude-events.d.ts.map +1 -0
  249. package/dist/subagents/claude-events.js +60 -0
  250. package/dist/subagents/claude-events.js.map +1 -0
  251. package/dist/subagents/handoff-validator.d.ts +8 -0
  252. package/dist/subagents/handoff-validator.d.ts.map +1 -0
  253. package/dist/subagents/handoff-validator.js +20 -0
  254. package/dist/subagents/handoff-validator.js.map +1 -0
  255. package/dist/subagents/orchestrator.d.ts +47 -0
  256. package/dist/subagents/orchestrator.d.ts.map +1 -0
  257. package/dist/subagents/orchestrator.js +85 -0
  258. package/dist/subagents/orchestrator.js.map +1 -0
  259. package/package.json +45 -0
@@ -0,0 +1,37 @@
1
+ export * from './domain/types.js';
2
+ export * from './domain/state-machine.js';
3
+ export * from './domain/task-dag.js';
4
+ export * from './ports/index.js';
5
+ export * from './recovery-spike.js';
6
+ export * from './artifacts/context-manifest.js';
7
+ export * from './artifacts/generation-guard.js';
8
+ export * from './artifacts/git-artifact-store.js';
9
+ export * from './subagents/handoff-validator.js';
10
+ export * from './subagents/claude-events.js';
11
+ export * from './subagents/orchestrator.js';
12
+ export * from './adapters/workflow-execution.js';
13
+ export * from './adapters/review.js';
14
+ export * from './adapters/approval.js';
15
+ export * from './adapters/integration.js';
16
+ export * from './adapters/verification.js';
17
+ export * from './adapters/delivery-package.js';
18
+ export * from './interaction-session.js';
19
+ export * from './persistence/sqlite-store.js';
20
+ export * from './persistence/memory-store.js';
21
+ export * from './persistence/schema.js';
22
+ export * from './persistence/event-ledger.js';
23
+ export * from './persistence/cas.js';
24
+ export * from './facade/delivery-line-facade.js';
25
+ export * from './composition.js';
26
+ export * from './runtime/host-conformance.js';
27
+ export * from './runtime/operation-journal.js';
28
+ export * from './runtime/project-runtime-factory.js';
29
+ export * from './runtime/plan-compiler.js';
30
+ export * from './runtime/context-binder.js';
31
+ export * from './runtime/execution-coordinator.js';
32
+ export * from './runtime/review-coordinator.js';
33
+ export * from './runtime/host-routing.js';
34
+ export * from './runtime/gate-queue.js';
35
+ export * from './runtime/memory-writeback.js';
36
+ export * from './runtime/claude-host-adapter.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ export * from './domain/types.js';
2
+ export * from './domain/state-machine.js';
3
+ export * from './domain/task-dag.js';
4
+ export * from './ports/index.js';
5
+ export * from './recovery-spike.js';
6
+ export * from './artifacts/context-manifest.js';
7
+ export * from './artifacts/generation-guard.js';
8
+ export * from './artifacts/git-artifact-store.js';
9
+ export * from './subagents/handoff-validator.js';
10
+ export * from './subagents/claude-events.js';
11
+ export * from './subagents/orchestrator.js';
12
+ export * from './adapters/workflow-execution.js';
13
+ export * from './adapters/review.js';
14
+ export * from './adapters/approval.js';
15
+ export * from './adapters/integration.js';
16
+ export * from './adapters/verification.js';
17
+ export * from './adapters/delivery-package.js';
18
+ export * from './interaction-session.js';
19
+ export * from './persistence/sqlite-store.js';
20
+ export * from './persistence/memory-store.js';
21
+ export * from './persistence/schema.js';
22
+ export * from './persistence/event-ledger.js';
23
+ export * from './persistence/cas.js';
24
+ export * from './facade/delivery-line-facade.js';
25
+ export * from './composition.js';
26
+ export * from './runtime/host-conformance.js';
27
+ export * from './runtime/operation-journal.js';
28
+ export * from './runtime/project-runtime-factory.js';
29
+ export * from './runtime/plan-compiler.js';
30
+ export * from './runtime/context-binder.js';
31
+ export * from './runtime/execution-coordinator.js';
32
+ export * from './runtime/review-coordinator.js';
33
+ export * from './runtime/host-routing.js';
34
+ export * from './runtime/gate-queue.js';
35
+ export * from './runtime/memory-writeback.js';
36
+ export * from './runtime/claude-host-adapter.js';
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type DecisionRecord, type InteractionState } from './domain/types.js';
2
+ export declare class InteractionSession {
3
+ private state;
4
+ private readonly maxTurns;
5
+ constructor(state: InteractionState, maxTurns: number);
6
+ ask(question: string, blocking?: boolean): InteractionState;
7
+ answer(turn: number): InteractionState;
8
+ decide(decision: DecisionRecord): DecisionRecord;
9
+ revise(): InteractionState;
10
+ get snapshot(): InteractionState;
11
+ }
12
+ //# sourceMappingURL=interaction-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-session.d.ts","sourceRoot":"","sources":["../src/interaction-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElG,qBAAa,kBAAkB;IACjB,OAAO,CAAC,KAAK;IAAoB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAlD,KAAK,EAAE,gBAAgB,EAAmB,QAAQ,EAAE,MAAM;IAC9E,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,gBAAgB;IAKxD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IACtC,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc;IAChD,MAAM,IAAI,gBAAgB;IAC1B,IAAI,QAAQ,IAAI,gBAAgB,CAAwC;CACzE"}
@@ -0,0 +1,21 @@
1
+ import { answerInteraction, openInteractionTurn, validateDecision } from './domain/interaction.js';
2
+ import { DeliveryLineError } from './domain/types.js';
3
+ export class InteractionSession {
4
+ state;
5
+ maxTurns;
6
+ constructor(state, maxTurns) {
7
+ this.state = state;
8
+ this.maxTurns = maxTurns;
9
+ }
10
+ ask(question, blocking = true) {
11
+ if (this.state.turn >= this.maxTurns)
12
+ throw new DeliveryLineError('BUDGET_EXCEEDED', 'interaction budget exceeded');
13
+ this.state = openInteractionTurn({ state: this.state, question, blocking, turn: this.state.turn + 1 });
14
+ return structuredClone(this.state);
15
+ }
16
+ answer(turn) { this.state = answerInteraction(this.state, turn); return structuredClone(this.state); }
17
+ decide(decision) { validateDecision(decision); return structuredClone(decision); }
18
+ revise() { this.state = { ...this.state, status: 'active', openQuestions: [], blockingUnknowns: [], summaryRefs: [...this.state.summaryRefs] }; return structuredClone(this.state); }
19
+ get snapshot() { return structuredClone(this.state); }
20
+ }
21
+ //# sourceMappingURL=interaction-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-session.js","sourceRoot":"","sources":["../src/interaction-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAA8C,MAAM,mBAAmB,CAAC;AAElG,MAAM,OAAO,kBAAkB;IACT;IAA0C;IAA9D,YAAoB,KAAuB,EAAmB,QAAgB;QAA1D,UAAK,GAAL,KAAK,CAAkB;QAAmB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAClF,GAAG,CAAC,QAAgB,EAAE,QAAQ,GAAG,IAAI;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,iBAAiB,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;QACpH,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvG,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,CAAC,IAAY,IAAsB,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChI,MAAM,CAAC,QAAwB,IAAoB,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClH,MAAM,KAAuB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvM,IAAI,QAAQ,KAAuB,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CACzE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interaction-session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-session.test.d.ts","sourceRoot":"","sources":["../src/interaction-session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { InteractionSession } from './interaction-session.js';
3
+ import { DeliveryLineError } from './domain/types.js';
4
+ describe('interaction session', () => {
5
+ it('requires one answer before the next blocking question and enforces budget', () => {
6
+ const session = new InteractionSession({ phase: 'clarification', status: 'active', turn: 0, openQuestions: [], blockingUnknowns: [], summaryRefs: [] }, 1);
7
+ session.ask('Who owns the decision?');
8
+ expect(() => session.ask('What is the error contract?')).toThrow(DeliveryLineError);
9
+ session.answer(1);
10
+ expect(() => session.ask('What is the error contract?')).toThrow('interaction budget exceeded');
11
+ });
12
+ });
13
+ //# sourceMappingURL=interaction-session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-session.test.js","sourceRoot":"","sources":["../src/interaction-session.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3J,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpF,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type DeliveryCase } from '../domain/types.js';
2
+ import type { CaseStore } from '../ports/index.js';
3
+ export declare function saveCaseCas(store: CaseStore, record: DeliveryCase, expectedVersion: number): Promise<void>;
4
+ //# sourceMappingURL=cas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cas.d.ts","sourceRoot":"","sources":["../../src/persistence/cas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhH"}
@@ -0,0 +1,7 @@
1
+ import { DeliveryLineError } from '../domain/types.js';
2
+ export async function saveCaseCas(store, record, expectedVersion) {
3
+ if (record.version !== expectedVersion + 1)
4
+ throw new DeliveryLineError('STATE_VERSION_CONFLICT', 'invalid next case version');
5
+ await store.save(record, expectedVersion);
6
+ }
7
+ //# sourceMappingURL=cas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cas.js","sourceRoot":"","sources":["../../src/persistence/cas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAqB,MAAM,oBAAoB,CAAC;AAG1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB,EAAE,MAAoB,EAAE,eAAuB;IAC/F,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,GAAG,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,CAAC;IAC/H,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CaseStore } from '../ports/index.js';
2
+ import type { ActorRef, DeliveryEvent } from '../domain/types.js';
3
+ export declare function appendLedgerEvent(store: CaseStore, input: {
4
+ caseId: string;
5
+ type: string;
6
+ actor: ActorRef;
7
+ idempotencyKey: string;
8
+ payload: Record<string, unknown>;
9
+ }): Promise<DeliveryEvent>;
10
+ //# sourceMappingURL=event-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-ledger.d.ts","sourceRoot":"","sources":["../../src/persistence/event-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAIpM"}
@@ -0,0 +1,6 @@
1
+ export async function appendLedgerEvent(store, input) {
2
+ const event = { id: `${input.caseId}:${input.idempotencyKey}`, createdAt: Date.now(), ...input };
3
+ await store.appendEvent(event);
4
+ return event;
5
+ }
6
+ //# sourceMappingURL=event-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-ledger.js","sourceRoot":"","sources":["../../src/persistence/event-ledger.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAgB,EAAE,KAAkH;IAC1K,MAAM,KAAK,GAAkB,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;IAChH,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { type AgentHandoff, type DeliveryCase, type DeliveryEvent, type DeliveryTask } from '../domain/types.js';
2
+ import type { CaseStore, OperationPrepare, OperationRecord, PendingInteractionView, RecoveryCursor, SubAgentSessionRecord, TaskLeaseView } from '../ports/index.js';
3
+ export declare class MemoryCaseStore implements CaseStore {
4
+ private readonly cases;
5
+ private readonly events;
6
+ private readonly handoffs;
7
+ private readonly processedHandoffs;
8
+ private readonly sessions;
9
+ private readonly operations;
10
+ create(caseRecord: DeliveryCase): Promise<void>;
11
+ get(caseId: string): Promise<DeliveryCase>;
12
+ save(caseRecord: DeliveryCase, expectedVersion: number): Promise<void>;
13
+ appendEvent(event: DeliveryEvent): Promise<void>;
14
+ hasIdempotencyKey(key: string): Promise<boolean>;
15
+ findCaseByIdempotencyKey(key: string): Promise<DeliveryCase | undefined>;
16
+ listUnprocessedEvents(caseId?: string): Promise<DeliveryEvent[]>;
17
+ markEventProcessed(idempotencyKey: string, processedAt?: number): Promise<boolean>;
18
+ listEvents(): DeliveryEvent[];
19
+ listActiveLeases(now?: number, caseId?: string): TaskLeaseView[];
20
+ listPendingInteractions(caseId?: string): PendingInteractionView[];
21
+ listUnprocessedHandoffs(caseId?: string): AgentHandoff[];
22
+ listVerifiedNotIntegratedTasks(caseId?: string): DeliveryTask[];
23
+ latestEventCursor(caseId?: string): RecoveryCursor | undefined;
24
+ recordHandoff(handoff: AgentHandoff): void;
25
+ markHandoffProcessed(idempotencyKey: string): boolean;
26
+ saveSubAgentSession(session: SubAgentSessionRecord): Promise<void>;
27
+ getSubAgentSession(sessionId: string): Promise<SubAgentSessionRecord>;
28
+ prepareOperation(input: OperationPrepare): Promise<OperationRecord>;
29
+ recordOperation(input: OperationRecord): Promise<void>;
30
+ findOperation(operationId: string): Promise<OperationRecord | undefined>;
31
+ acquireTaskLeaseWithFencing(input: {
32
+ taskId: string;
33
+ caseId: string;
34
+ owner: string;
35
+ now: number;
36
+ leaseMs: number;
37
+ payload?: string;
38
+ }): {
39
+ acquired: boolean;
40
+ owner: string;
41
+ expiresAt: number;
42
+ fencingToken: number;
43
+ takeover: boolean;
44
+ };
45
+ releaseTaskLeaseWithFencing(input: {
46
+ taskId: string;
47
+ owner: string;
48
+ fencingToken: number;
49
+ }): boolean;
50
+ }
51
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/persistence/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { DeliveryLineError } from '../domain/types.js';
2
+ export class MemoryCaseStore {
3
+ cases = new Map();
4
+ events = new Map();
5
+ handoffs = new Map();
6
+ processedHandoffs = new Set();
7
+ sessions = new Map();
8
+ operations = new Map();
9
+ async create(caseRecord) { this.cases.set(caseRecord.id, structuredClone(caseRecord)); }
10
+ async get(caseId) {
11
+ const value = this.cases.get(caseId);
12
+ if (!value)
13
+ throw new DeliveryLineError('MISSING_PREREQUISITE', `case not found: ${caseId}`);
14
+ return structuredClone(value);
15
+ }
16
+ async save(caseRecord, expectedVersion) {
17
+ const current = await this.get(caseRecord.id);
18
+ if (current.version !== expectedVersion)
19
+ throw new DeliveryLineError('STATE_VERSION_CONFLICT', 'case version changed');
20
+ this.cases.set(caseRecord.id, structuredClone(caseRecord));
21
+ }
22
+ async appendEvent(event) {
23
+ const prior = [...this.events.values()].find(item => item.idempotencyKey === event.idempotencyKey);
24
+ if (prior && JSON.stringify(prior.payload) !== JSON.stringify(event.payload))
25
+ throw new DeliveryLineError('IDEMPOTENCY_CONFLICT', event.idempotencyKey);
26
+ if (!prior)
27
+ this.events.set(event.id, structuredClone(event));
28
+ }
29
+ async hasIdempotencyKey(key) { return [...this.events.values()].some(event => event.idempotencyKey === key); }
30
+ async findCaseByIdempotencyKey(key) { const event = [...this.events.values()].find(item => item.idempotencyKey === key); const record = event ? this.cases.get(event.caseId) : undefined; return record ? structuredClone(record) : undefined; }
31
+ async listUnprocessedEvents(caseId) { return [...this.events.values()].filter(event => !event.processedAt && (!caseId || event.caseId === caseId)).sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id)).map(event => structuredClone(event)); }
32
+ async markEventProcessed(idempotencyKey, processedAt = Date.now()) { const event = [...this.events.values()].find(item => item.idempotencyKey === idempotencyKey); if (!event || event.processedAt)
33
+ return false; event.processedAt = processedAt; return true; }
34
+ listEvents() { return [...this.events.values()].map(event => structuredClone(event)); }
35
+ listActiveLeases(now = Date.now(), caseId) {
36
+ return [...this.cases.values()].flatMap(record => record.tasks.filter(task => task.leaseOwner && task.leaseExpiresAt && task.leaseExpiresAt > now && (!caseId || record.id === caseId)).map(task => ({ taskId: task.id, caseId: record.id, owner: task.leaseOwner, expiresAt: task.leaseExpiresAt, attempt: task.attempt, version: task.version, fencingToken: task.fencingToken ?? 0 })));
37
+ }
38
+ listPendingInteractions(caseId) {
39
+ return [...this.cases.values()].filter(record => !caseId || record.id === caseId).flatMap(record => (record.interaction.summaries ?? []).filter(summary => summary.question && !summary.answer && record.interaction.blockingUnknowns.includes(summary.question)).map(summary => ({ ...summary, answered: false, blocking: true })));
40
+ }
41
+ listUnprocessedHandoffs(caseId) { return [...this.handoffs].filter(([key, handoff]) => !this.processedHandoffs.has(key) && (!caseId || handoff.caseId === caseId)).map(([, handoff]) => structuredClone(handoff)); }
42
+ listVerifiedNotIntegratedTasks(caseId) { return [...this.cases.values()].filter(record => !caseId || record.id === caseId).flatMap(record => record.tasks.filter(task => task.status === 'verified' && !task.integratedRevision).map(task => structuredClone(task))); }
43
+ latestEventCursor(caseId) { const events = [...this.events.values()].filter(event => !caseId || event.caseId === caseId).sort((a, b) => b.createdAt - a.createdAt || b.id.localeCompare(a.id)); const event = events[0]; return event ? { id: event.id, createdAt: event.createdAt } : undefined; }
44
+ recordHandoff(handoff) { this.handoffs.set(handoff.idempotencyKey, structuredClone(handoff)); }
45
+ markHandoffProcessed(idempotencyKey) { if (!this.handoffs.has(idempotencyKey) || this.processedHandoffs.has(idempotencyKey))
46
+ return false; this.processedHandoffs.add(idempotencyKey); return true; }
47
+ async saveSubAgentSession(session) { this.sessions.set(session.sessionId, structuredClone(session)); }
48
+ async getSubAgentSession(sessionId) { const session = this.sessions.get(sessionId); if (!session)
49
+ throw new DeliveryLineError('MISSING_PREREQUISITE', `session not found: ${sessionId}`); return structuredClone(session); }
50
+ async prepareOperation(input) {
51
+ const byKey = [...this.operations.values()].find(item => item.idempotencyKey === input.idempotencyKey);
52
+ if (byKey && (byKey.operationId !== input.operationId || byKey.requestHash !== input.requestHash))
53
+ throw new DeliveryLineError('IDEMPOTENCY_CONFLICT', input.idempotencyKey);
54
+ const prior = this.operations.get(input.operationId);
55
+ if (prior)
56
+ return structuredClone(prior);
57
+ const record = { ...input, status: 'prepared', recovery: 'none' };
58
+ this.operations.set(input.operationId, structuredClone(record));
59
+ return record;
60
+ }
61
+ async recordOperation(input) {
62
+ if (!this.operations.has(input.operationId))
63
+ throw new DeliveryLineError('OPERATION_NOT_FOUND', input.operationId);
64
+ this.operations.set(input.operationId, structuredClone(input));
65
+ }
66
+ async findOperation(operationId) { const record = this.operations.get(operationId); return record ? structuredClone(record) : undefined; }
67
+ acquireTaskLeaseWithFencing(input) {
68
+ const record = this.cases.get(input.caseId);
69
+ const task = record?.tasks.find(item => item.id === input.taskId);
70
+ if (!task)
71
+ return { acquired: false, owner: '', expiresAt: 0, fencingToken: 0, takeover: false };
72
+ if (task.leaseExpiresAt && task.leaseExpiresAt > input.now && task.leaseOwner !== input.owner)
73
+ return { acquired: false, owner: task.leaseOwner ?? '', expiresAt: task.leaseExpiresAt, fencingToken: task.fencingToken ?? 0, takeover: false };
74
+ const takeover = Boolean(task.leaseOwner && task.leaseOwner !== input.owner);
75
+ task.leaseOwner = input.owner;
76
+ task.leaseExpiresAt = input.now + input.leaseMs;
77
+ task.fencingToken = (task.fencingToken ?? 0) + 1;
78
+ task.attempt += 1;
79
+ task.version += 1;
80
+ if (takeover) {
81
+ const idempotencyKey = `lease-takeover:${input.taskId}:${input.owner}:${input.now}`;
82
+ this.events.set(idempotencyKey, { id: idempotencyKey, caseId: input.caseId, type: 'task.lease_taken_over', idempotencyKey, actor: { id: input.owner, kind: 'system' }, payload: { taskId: input.taskId, owner: input.owner, fencingToken: task.fencingToken }, createdAt: input.now });
83
+ }
84
+ return { acquired: true, owner: input.owner, expiresAt: task.leaseExpiresAt, fencingToken: task.fencingToken, takeover };
85
+ }
86
+ releaseTaskLeaseWithFencing(input) {
87
+ for (const record of this.cases.values()) {
88
+ const task = record.tasks.find(item => item.id === input.taskId);
89
+ if (task && task.leaseOwner === input.owner && task.fencingToken === input.fencingToken) {
90
+ task.leaseOwner = undefined;
91
+ task.leaseExpiresAt = undefined;
92
+ task.version += 1;
93
+ return true;
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ }
99
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/persistence/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const DELIVERY_SCHEMA = "\nPRAGMA journal_mode = WAL;\nPRAGMA foreign_keys = ON;\nCREATE TABLE IF NOT EXISTS delivery_cases (\n id TEXT PRIMARY KEY,\n payload TEXT NOT NULL,\n version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_events (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n idempotency_key TEXT NOT NULL UNIQUE,\n actor TEXT NOT NULL,\n type TEXT NOT NULL,\n payload TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n processed_at INTEGER\n);\nCREATE TABLE IF NOT EXISTS delivery_tasks (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n payload TEXT NOT NULL,\n version INTEGER NOT NULL,\n lease_owner TEXT,\n lease_expires_at INTEGER,\n fencing_token INTEGER NOT NULL DEFAULT 0,\n attempt INTEGER NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_artifacts (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n payload TEXT NOT NULL,\n content_hash TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_approvals (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n payload TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_evidence (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n payload TEXT NOT NULL,\n evidence_hash TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_interactions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n case_id TEXT NOT NULL,\n phase TEXT NOT NULL,\n turn INTEGER NOT NULL,\n prompt_or_summary TEXT NOT NULL,\n answer TEXT,\n decision TEXT,\n blocking INTEGER NOT NULL,\n artifact_hash TEXT,\n actor TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_subagent_sessions (\n session_id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n role TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_version TEXT NOT NULL,\n permission_snapshot TEXT NOT NULL,\n status TEXT NOT NULL,\n last_event_id TEXT,\n processed_user_event_ids TEXT NOT NULL DEFAULT '[]',\n last_user_turn INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL\n);\nCREATE TABLE IF NOT EXISTS delivery_handoffs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n case_id TEXT NOT NULL,\n idempotency_key TEXT NOT NULL UNIQUE,\n source_role TEXT NOT NULL,\n target_role TEXT NOT NULL,\n input_refs TEXT NOT NULL,\n output_refs TEXT NOT NULL,\n context_receipt TEXT NOT NULL,\n status TEXT NOT NULL,\n payload TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n processed_at INTEGER\n);\nCREATE TABLE IF NOT EXISTS delivery_operations (\n operation_id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n idempotency_key TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n payload TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS delivery_tasks_active_lease_idx\n ON delivery_tasks (case_id, lease_expires_at);\nCREATE INDEX IF NOT EXISTS delivery_interactions_pending_idx\n ON delivery_interactions (case_id, blocking, answer);\nCREATE INDEX IF NOT EXISTS delivery_handoffs_unprocessed_idx\n ON delivery_handoffs (case_id, processed_at, status);\nCREATE INDEX IF NOT EXISTS delivery_events_cursor_idx\n ON delivery_events (case_id, created_at, id);\nCREATE INDEX IF NOT EXISTS delivery_operations_case_idx\n ON delivery_operations (case_id, updated_at, operation_id);\n";
2
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/persistence/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,qqGAyG3B,CAAC"}
@@ -0,0 +1,107 @@
1
+ export const DELIVERY_SCHEMA = `
2
+ PRAGMA journal_mode = WAL;
3
+ PRAGMA foreign_keys = ON;
4
+ CREATE TABLE IF NOT EXISTS delivery_cases (
5
+ id TEXT PRIMARY KEY,
6
+ payload TEXT NOT NULL,
7
+ version INTEGER NOT NULL,
8
+ updated_at INTEGER NOT NULL
9
+ );
10
+ CREATE TABLE IF NOT EXISTS delivery_events (
11
+ id TEXT PRIMARY KEY,
12
+ case_id TEXT NOT NULL,
13
+ idempotency_key TEXT NOT NULL UNIQUE,
14
+ actor TEXT NOT NULL,
15
+ type TEXT NOT NULL,
16
+ payload TEXT NOT NULL,
17
+ created_at INTEGER NOT NULL,
18
+ processed_at INTEGER
19
+ );
20
+ CREATE TABLE IF NOT EXISTS delivery_tasks (
21
+ id TEXT PRIMARY KEY,
22
+ case_id TEXT NOT NULL,
23
+ payload TEXT NOT NULL,
24
+ version INTEGER NOT NULL,
25
+ lease_owner TEXT,
26
+ lease_expires_at INTEGER,
27
+ fencing_token INTEGER NOT NULL DEFAULT 0,
28
+ attempt INTEGER NOT NULL
29
+ );
30
+ CREATE TABLE IF NOT EXISTS delivery_artifacts (
31
+ id TEXT PRIMARY KEY,
32
+ case_id TEXT NOT NULL,
33
+ payload TEXT NOT NULL,
34
+ content_hash TEXT NOT NULL
35
+ );
36
+ CREATE TABLE IF NOT EXISTS delivery_approvals (
37
+ id TEXT PRIMARY KEY,
38
+ case_id TEXT NOT NULL,
39
+ payload TEXT NOT NULL
40
+ );
41
+ CREATE TABLE IF NOT EXISTS delivery_evidence (
42
+ id TEXT PRIMARY KEY,
43
+ case_id TEXT NOT NULL,
44
+ payload TEXT NOT NULL,
45
+ evidence_hash TEXT NOT NULL
46
+ );
47
+ CREATE TABLE IF NOT EXISTS delivery_interactions (
48
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
49
+ case_id TEXT NOT NULL,
50
+ phase TEXT NOT NULL,
51
+ turn INTEGER NOT NULL,
52
+ prompt_or_summary TEXT NOT NULL,
53
+ answer TEXT,
54
+ decision TEXT,
55
+ blocking INTEGER NOT NULL,
56
+ artifact_hash TEXT,
57
+ actor TEXT NOT NULL,
58
+ created_at INTEGER NOT NULL
59
+ );
60
+ CREATE TABLE IF NOT EXISTS delivery_subagent_sessions (
61
+ session_id TEXT PRIMARY KEY,
62
+ case_id TEXT NOT NULL,
63
+ role TEXT NOT NULL,
64
+ agent_id TEXT NOT NULL,
65
+ agent_version TEXT NOT NULL,
66
+ permission_snapshot TEXT NOT NULL,
67
+ status TEXT NOT NULL,
68
+ last_event_id TEXT,
69
+ processed_user_event_ids TEXT NOT NULL DEFAULT '[]',
70
+ last_user_turn INTEGER NOT NULL DEFAULT 0,
71
+ created_at INTEGER NOT NULL
72
+ );
73
+ CREATE TABLE IF NOT EXISTS delivery_handoffs (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ case_id TEXT NOT NULL,
76
+ idempotency_key TEXT NOT NULL UNIQUE,
77
+ source_role TEXT NOT NULL,
78
+ target_role TEXT NOT NULL,
79
+ input_refs TEXT NOT NULL,
80
+ output_refs TEXT NOT NULL,
81
+ context_receipt TEXT NOT NULL,
82
+ status TEXT NOT NULL,
83
+ payload TEXT NOT NULL,
84
+ created_at INTEGER NOT NULL,
85
+ processed_at INTEGER
86
+ );
87
+ CREATE TABLE IF NOT EXISTS delivery_operations (
88
+ operation_id TEXT PRIMARY KEY,
89
+ case_id TEXT NOT NULL,
90
+ kind TEXT NOT NULL,
91
+ idempotency_key TEXT NOT NULL UNIQUE,
92
+ status TEXT NOT NULL,
93
+ payload TEXT NOT NULL,
94
+ updated_at INTEGER NOT NULL
95
+ );
96
+ CREATE INDEX IF NOT EXISTS delivery_tasks_active_lease_idx
97
+ ON delivery_tasks (case_id, lease_expires_at);
98
+ CREATE INDEX IF NOT EXISTS delivery_interactions_pending_idx
99
+ ON delivery_interactions (case_id, blocking, answer);
100
+ CREATE INDEX IF NOT EXISTS delivery_handoffs_unprocessed_idx
101
+ ON delivery_handoffs (case_id, processed_at, status);
102
+ CREATE INDEX IF NOT EXISTS delivery_events_cursor_idx
103
+ ON delivery_events (case_id, created_at, id);
104
+ CREATE INDEX IF NOT EXISTS delivery_operations_case_idx
105
+ ON delivery_operations (case_id, updated_at, operation_id);
106
+ `;
107
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/persistence/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyG9B,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { type AgentHandoff, type DeliveryCase, type DeliveryEvent, type DeliveryTask } from '../domain/types.js';
3
+ import type { CaseStore, OperationPrepare, OperationRecord, PendingInteractionView, RecoveryCursor, SubAgentSessionRecord, TaskLeaseView } from '../ports/index.js';
4
+ export declare class SQLiteCaseStore implements CaseStore {
5
+ readonly db: DatabaseSync;
6
+ constructor(path: string);
7
+ close(): void;
8
+ create(record: DeliveryCase): Promise<void>;
9
+ get(caseId: string): Promise<DeliveryCase>;
10
+ save(record: DeliveryCase, expectedVersion: number): Promise<void>;
11
+ appendEvent(event: DeliveryEvent): Promise<void>;
12
+ hasIdempotencyKey(key: string): Promise<boolean>;
13
+ findCaseByIdempotencyKey(key: string): Promise<DeliveryCase | undefined>;
14
+ listUnprocessedEvents(caseId?: string): Promise<DeliveryEvent[]>;
15
+ markEventProcessed(idempotencyKey: string, processedAt?: number): Promise<boolean>;
16
+ saveSubAgentSession(session: SubAgentSessionRecord): Promise<void>;
17
+ getSubAgentSession(sessionId: string): Promise<SubAgentSessionRecord>;
18
+ prepareOperation(input: OperationPrepare): Promise<OperationRecord>;
19
+ recordOperation(input: OperationRecord): Promise<void>;
20
+ findOperation(operationId: string): Promise<OperationRecord | undefined>;
21
+ listActiveLeases(now?: number, caseId?: string): TaskLeaseView[];
22
+ listPendingInteractions(caseId?: string): PendingInteractionView[];
23
+ listUnprocessedHandoffs(caseId?: string): AgentHandoff[];
24
+ listVerifiedNotIntegratedTasks(caseId?: string): DeliveryTask[];
25
+ latestEventCursor(caseId?: string): RecoveryCursor | undefined;
26
+ recordHandoff(handoff: AgentHandoff, createdAt?: number): void;
27
+ markHandoffProcessed(idempotencyKey: string, processedAt?: number): boolean;
28
+ acquireTaskLeaseWithFencing(input: {
29
+ taskId: string;
30
+ caseId: string;
31
+ owner: string;
32
+ now: number;
33
+ leaseMs: number;
34
+ payload?: string;
35
+ }): {
36
+ acquired: boolean;
37
+ owner: string;
38
+ expiresAt: number;
39
+ fencingToken: number;
40
+ takeover: boolean;
41
+ };
42
+ acquireTaskLease(input: {
43
+ taskId: string;
44
+ caseId: string;
45
+ owner: string;
46
+ now: number;
47
+ leaseMs: number;
48
+ payload?: string;
49
+ }): boolean;
50
+ releaseTaskLeaseWithFencing(input: {
51
+ taskId: string;
52
+ owner: string;
53
+ fencingToken: number;
54
+ }): boolean;
55
+ releaseTaskLease(taskId: string, owner: string): boolean;
56
+ private syncChildren;
57
+ private transaction;
58
+ }
59
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/persistence/sqlite-store.ts"],"names":[],"mappings":"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"}