@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,133 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import { DELIVERY_SCHEMA } from './schema.js';
5
+ import { DeliveryLineError } from '../domain/types.js';
6
+ export class SQLiteCaseStore {
7
+ db;
8
+ constructor(path) {
9
+ mkdirSync(dirname(path), { recursive: true });
10
+ this.db = new DatabaseSync(path);
11
+ this.db.exec(DELIVERY_SCHEMA);
12
+ const taskColumns = new Set(this.db.prepare('PRAGMA table_info(delivery_tasks)').all().map(column => column.name));
13
+ if (!taskColumns.has('fencing_token'))
14
+ this.db.exec('ALTER TABLE delivery_tasks ADD COLUMN fencing_token INTEGER NOT NULL DEFAULT 0');
15
+ this.db.exec('PRAGMA busy_timeout = 5000; PRAGMA foreign_keys = ON; PRAGMA synchronous = NORMAL;');
16
+ }
17
+ close() { this.db.close(); }
18
+ async create(record) {
19
+ this.transaction(() => { this.db.prepare('INSERT INTO delivery_cases (id,payload,version,updated_at) VALUES (?,?,?,?)').run(record.id, JSON.stringify(record), record.version, record.updatedAt); this.syncChildren(record); });
20
+ }
21
+ async get(caseId) {
22
+ const row = this.db.prepare('SELECT payload FROM delivery_cases WHERE id = ?').get(caseId);
23
+ if (!row?.payload)
24
+ throw new DeliveryLineError('MISSING_PREREQUISITE', `case not found: ${caseId}`);
25
+ return JSON.parse(row.payload);
26
+ }
27
+ async save(record, expectedVersion) {
28
+ this.transaction(() => { const result = this.db.prepare('UPDATE delivery_cases SET payload = ?, version = ?, updated_at = ? WHERE id = ? AND version = ?').run(JSON.stringify(record), record.version, record.updatedAt, record.id, expectedVersion); if (result.changes !== 1)
29
+ throw new DeliveryLineError('STATE_VERSION_CONFLICT', 'case version changed'); this.syncChildren(record); });
30
+ }
31
+ async appendEvent(event) {
32
+ this.transaction(() => { const prior = this.db.prepare('SELECT payload FROM delivery_events WHERE idempotency_key = ?').get(event.idempotencyKey); if (prior) {
33
+ if (prior.payload !== JSON.stringify(event.payload))
34
+ throw new DeliveryLineError('IDEMPOTENCY_CONFLICT', event.idempotencyKey);
35
+ return;
36
+ } this.db.prepare('INSERT INTO delivery_events (id,case_id,idempotency_key,actor,type,payload,created_at,processed_at) VALUES (?,?,?,?,?,?,?,?)').run(event.id, event.caseId, event.idempotencyKey, JSON.stringify(event.actor), event.type, JSON.stringify(event.payload), event.createdAt, event.processedAt ?? null); });
37
+ }
38
+ async hasIdempotencyKey(key) { return Boolean(this.db.prepare('SELECT 1 AS found FROM delivery_events WHERE idempotency_key = ?').get(key)); }
39
+ async findCaseByIdempotencyKey(key) { const row = this.db.prepare('SELECT c.payload FROM delivery_events e JOIN delivery_cases c ON c.id = e.case_id WHERE e.idempotency_key = ?').get(key); return row?.payload ? JSON.parse(row.payload) : undefined; }
40
+ async listUnprocessedEvents(caseId) {
41
+ const rows = (caseId ? this.db.prepare('SELECT * FROM delivery_events WHERE case_id = ? AND processed_at IS NULL ORDER BY created_at,id').all(caseId) : this.db.prepare('SELECT * FROM delivery_events WHERE processed_at IS NULL ORDER BY created_at,id').all());
42
+ return rows.map(row => ({ id: String(row.id), caseId: String(row.case_id), idempotencyKey: String(row.idempotency_key), actor: JSON.parse(String(row.actor)), type: String(row.type), payload: JSON.parse(String(row.payload)), createdAt: Number(row.created_at) }));
43
+ }
44
+ async markEventProcessed(idempotencyKey, processedAt = Date.now()) { return this.db.prepare('UPDATE delivery_events SET processed_at = ? WHERE idempotency_key = ? AND processed_at IS NULL').run(processedAt, idempotencyKey).changes === 1; }
45
+ async saveSubAgentSession(session) { this.db.prepare('INSERT INTO delivery_subagent_sessions (session_id,case_id,role,agent_id,agent_version,permission_snapshot,status,last_event_id,processed_user_event_ids,last_user_turn,created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(session_id) DO UPDATE SET status=excluded.status,last_event_id=excluded.last_event_id,processed_user_event_ids=excluded.processed_user_event_ids,last_user_turn=excluded.last_user_turn,permission_snapshot=excluded.permission_snapshot').run(session.sessionId, session.caseId, session.role, session.agentId, session.agentVersion, JSON.stringify(session.permissionSnapshot), session.status, session.lastEventId ?? null, JSON.stringify(session.processedUserEventIds), session.lastUserTurn, session.createdAt); }
46
+ async getSubAgentSession(sessionId) { const row = this.db.prepare('SELECT * FROM delivery_subagent_sessions WHERE session_id = ?').get(sessionId); if (!row)
47
+ throw new DeliveryLineError('MISSING_PREREQUISITE', `session not found: ${sessionId}`); return { sessionId: String(row.session_id), caseId: String(row.case_id), role: String(row.role), agentId: String(row.agent_id), agentVersion: String(row.agent_version), permissionSnapshot: JSON.parse(String(row.permission_snapshot)), status: String(row.status), lastEventId: row.last_event_id ? String(row.last_event_id) : undefined, processedUserEventIds: JSON.parse(String(row.processed_user_event_ids)), lastUserTurn: Number(row.last_user_turn), budget: { toolCalls: 0 }, createdAt: Number(row.created_at) }; }
48
+ async prepareOperation(input) {
49
+ return this.transaction(() => {
50
+ const byKey = this.db.prepare('SELECT payload FROM delivery_operations WHERE idempotency_key = ?').get(input.idempotencyKey);
51
+ if (byKey?.payload) {
52
+ const prior = JSON.parse(byKey.payload);
53
+ if (prior.operationId !== input.operationId || prior.requestHash !== input.requestHash)
54
+ throw new DeliveryLineError('IDEMPOTENCY_CONFLICT', input.idempotencyKey);
55
+ return prior;
56
+ }
57
+ const byId = this.db.prepare('SELECT payload FROM delivery_operations WHERE operation_id = ?').get(input.operationId);
58
+ if (byId?.payload)
59
+ return JSON.parse(byId.payload);
60
+ const record = { ...input, status: 'prepared', recovery: 'none' };
61
+ this.db.prepare('INSERT INTO delivery_operations (operation_id,case_id,kind,idempotency_key,status,payload,updated_at) VALUES (?,?,?,?,?,?,?)').run(input.operationId, input.caseId, input.kind, input.idempotencyKey, record.status, JSON.stringify(record), Date.now());
62
+ return record;
63
+ });
64
+ }
65
+ async recordOperation(input) {
66
+ const result = this.db.prepare('UPDATE delivery_operations SET status = ?, payload = ?, updated_at = ? WHERE operation_id = ?').run(input.status, JSON.stringify(input), Date.now(), input.operationId);
67
+ if (result.changes !== 1)
68
+ throw new DeliveryLineError('OPERATION_NOT_FOUND', input.operationId);
69
+ }
70
+ async findOperation(operationId) { const row = this.db.prepare('SELECT payload FROM delivery_operations WHERE operation_id = ?').get(operationId); return row?.payload ? JSON.parse(row.payload) : undefined; }
71
+ listActiveLeases(now = Date.now(), caseId) {
72
+ const rows = (caseId ? this.db.prepare('SELECT id,case_id,lease_owner,lease_expires_at,attempt,version,fencing_token FROM delivery_tasks WHERE case_id = ? AND lease_owner IS NOT NULL AND lease_expires_at > ? ORDER BY id').all(caseId, now) : this.db.prepare('SELECT id,case_id,lease_owner,lease_expires_at,attempt,version,fencing_token FROM delivery_tasks WHERE lease_owner IS NOT NULL AND lease_expires_at > ? ORDER BY id').all(now));
73
+ return rows.map(row => ({ taskId: String(row.id), caseId: String(row.case_id), owner: String(row.lease_owner), expiresAt: Number(row.lease_expires_at), attempt: Number(row.attempt), version: Number(row.version), fencingToken: Number(row.fencing_token ?? 0) }));
74
+ }
75
+ listPendingInteractions(caseId) {
76
+ const rows = (caseId ? this.db.prepare('SELECT * FROM delivery_interactions WHERE case_id = ? AND blocking = 1 AND answer IS NULL ORDER BY turn,id').all(caseId) : this.db.prepare('SELECT * FROM delivery_interactions WHERE blocking = 1 AND answer IS NULL ORDER BY case_id,turn,id').all());
77
+ return rows.map(row => ({ id: String(row.id), phase: String(row.phase), turn: Number(row.turn), question: String(row.prompt_or_summary), actor: JSON.parse(String(row.actor)), answered: false, blocking: true }));
78
+ }
79
+ listUnprocessedHandoffs(caseId) {
80
+ const rows = (caseId ? this.db.prepare('SELECT payload FROM delivery_handoffs WHERE case_id = ? AND processed_at IS NULL ORDER BY id').all(caseId) : this.db.prepare('SELECT payload FROM delivery_handoffs WHERE processed_at IS NULL ORDER BY id').all());
81
+ return rows.map(row => JSON.parse(row.payload));
82
+ }
83
+ listVerifiedNotIntegratedTasks(caseId) {
84
+ const rows = (caseId ? this.db.prepare('SELECT payload FROM delivery_tasks WHERE case_id = ? ORDER BY id').all(caseId) : this.db.prepare('SELECT payload FROM delivery_tasks ORDER BY id').all());
85
+ return rows.map(row => JSON.parse(row.payload)).filter(task => task.status === 'verified' && !task.integratedRevision);
86
+ }
87
+ latestEventCursor(caseId) {
88
+ const row = (caseId ? this.db.prepare('SELECT id,created_at FROM delivery_events WHERE case_id = ? ORDER BY created_at DESC,id DESC LIMIT 1').get(caseId) : this.db.prepare('SELECT id,created_at FROM delivery_events ORDER BY created_at DESC,id DESC LIMIT 1').get());
89
+ return row?.id ? { id: row.id, createdAt: Number(row.created_at) } : undefined;
90
+ }
91
+ recordHandoff(handoff, createdAt = Date.now()) {
92
+ this.db.prepare('INSERT INTO delivery_handoffs (case_id,idempotency_key,source_role,target_role,input_refs,output_refs,context_receipt,status,payload,created_at,processed_at) VALUES (?,?,?,?,?,?,?,?,?,?,NULL)').run(handoff.caseId, handoff.idempotencyKey, handoff.from.role, handoff.to.role, JSON.stringify(handoff.inputRefs), JSON.stringify(handoff.outputRefs), handoff.contextReceipt, handoff.status, JSON.stringify(handoff), createdAt);
93
+ }
94
+ markHandoffProcessed(idempotencyKey, processedAt = Date.now()) { return this.db.prepare('UPDATE delivery_handoffs SET processed_at = ? WHERE idempotency_key = ? AND processed_at IS NULL').run(processedAt, idempotencyKey).changes === 1; }
95
+ acquireTaskLeaseWithFencing(input) {
96
+ let takeover = false;
97
+ const result = this.transaction(() => { const prior = this.db.prepare('SELECT lease_owner,lease_expires_at,fencing_token FROM delivery_tasks WHERE id = ?').get(input.taskId); if (prior && prior.lease_expires_at !== null && prior.lease_expires_at !== undefined && Number(prior.lease_expires_at) > input.now)
98
+ return { acquired: false, owner: String(prior.lease_owner ?? ''), expiresAt: Number(prior.lease_expires_at), fencingToken: Number(prior.fencing_token ?? 0), takeover: false }; takeover = Boolean(prior?.lease_owner); const fencingToken = Number(prior?.fencing_token ?? 0) + 1; const expiresAt = input.now + input.leaseMs; const changed = prior ? this.db.prepare('UPDATE delivery_tasks SET lease_owner = ?, lease_expires_at = ?, fencing_token = ?, version = version + 1, attempt = attempt + 1 WHERE id = ?').run(input.owner, expiresAt, fencingToken, input.taskId).changes === 1 : this.db.prepare('INSERT INTO delivery_tasks (id,case_id,payload,version,lease_owner,lease_expires_at,fencing_token,attempt) VALUES (?,?,?,?,?,?,?,?)').run(input.taskId, input.caseId, input.payload ?? '{}', 1, input.owner, expiresAt, fencingToken, 1).changes === 1; return { acquired: changed, owner: input.owner, expiresAt, fencingToken, takeover }; });
99
+ const changed = result.acquired;
100
+ if (changed && takeover) {
101
+ const key = `lease-takeover:${input.taskId}:${input.owner}:${input.now}`;
102
+ void this.appendEvent({ id: key, caseId: input.caseId, type: 'task.lease_taken_over', idempotencyKey: key, actor: { id: input.owner, kind: 'system' }, payload: { taskId: input.taskId, owner: input.owner }, createdAt: input.now });
103
+ }
104
+ return result;
105
+ }
106
+ acquireTaskLease(input) { return this.acquireTaskLeaseWithFencing(input).acquired; }
107
+ releaseTaskLeaseWithFencing(input) { return this.db.prepare('UPDATE delivery_tasks SET lease_owner = NULL, lease_expires_at = NULL, version = version + 1 WHERE id = ? AND lease_owner = ? AND fencing_token = ?').run(input.taskId, input.owner, input.fencingToken).changes === 1; }
108
+ releaseTaskLease(taskId, owner) { const row = this.db.prepare('SELECT fencing_token FROM delivery_tasks WHERE id = ? AND lease_owner = ?').get(taskId, owner); return row ? this.releaseTaskLeaseWithFencing({ taskId, owner, fencingToken: Number(row.fencing_token ?? 0) }) : false; }
109
+ syncChildren(record) {
110
+ for (const table of ['delivery_tasks', 'delivery_artifacts', 'delivery_approvals', 'delivery_evidence', 'delivery_interactions'])
111
+ this.db.prepare(`DELETE FROM ${table} WHERE case_id = ?`).run(record.id);
112
+ for (const task of record.tasks)
113
+ this.db.prepare('INSERT INTO delivery_tasks (id,case_id,payload,version,lease_owner,lease_expires_at,fencing_token,attempt) VALUES (?,?,?,?,?,?,?,?)').run(task.id, record.id, JSON.stringify(task), task.version, task.leaseOwner ?? null, task.leaseExpiresAt ?? null, task.fencingToken ?? 0, task.attempt);
114
+ for (const artifact of record.artifacts)
115
+ this.db.prepare('INSERT INTO delivery_artifacts (id,case_id,payload,content_hash) VALUES (?,?,?,?)').run(artifact.id, record.id, JSON.stringify(artifact), artifact.contentHash);
116
+ for (const approval of record.approvals)
117
+ this.db.prepare('INSERT INTO delivery_approvals (id,case_id,payload) VALUES (?,?,?)').run(approval.id, record.id, JSON.stringify(approval));
118
+ for (const evidence of record.evidence)
119
+ this.db.prepare('INSERT INTO delivery_evidence (id,case_id,payload,evidence_hash) VALUES (?,?,?,?)').run(evidence.id, record.id, JSON.stringify(evidence), evidence.hash);
120
+ for (const summary of record.interaction.summaries ?? [])
121
+ this.db.prepare('INSERT INTO delivery_interactions (case_id,phase,turn,prompt_or_summary,answer,decision,blocking,artifact_hash,actor,created_at) VALUES (?,?,?,?,?,?,?,?,?,?)').run(record.id, summary.phase, summary.turn, summary.question ?? summary.userStatement ?? summary.understanding ?? '', summary.answer ?? null, summary.decision ?? null, record.interaction.blockingUnknowns.includes(summary.question ?? '') ? 1 : 0, summary.artifactHashes?.[0] ?? null, JSON.stringify(summary.actor), Date.now());
122
+ }
123
+ transaction(fn) { this.db.exec('BEGIN IMMEDIATE'); try {
124
+ const result = fn();
125
+ this.db.exec('COMMIT');
126
+ return result;
127
+ }
128
+ catch (error) {
129
+ this.db.exec('ROLLBACK');
130
+ throw error;
131
+ } }
132
+ }
133
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../src/persistence/sqlite-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAwG,MAAM,oBAAoB,CAAC;AAK7J,MAAM,OAAO,eAAe;IACjB,EAAE,CAAe;IAC1B,YAAY,IAAY;QACtB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChJ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;QACtI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IACrG,CAAC;IACD,KAAK,KAAW,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6EAA6E,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClO,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAqC,CAAC;QAC/H,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAoB,EAAE,eAAuB;QACtD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iGAAiG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/X,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAAoB;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAqC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YAAC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8HAA8H,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1oB,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,GAAW,IAAsB,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxK,KAAK,CAAC,wBAAwB,CAAC,GAAW,IAAuC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+GAA+G,CAAC,CAAC,GAAG,CAAC,GAAG,CAAqC,CAAC,CAAC,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACxV,KAAK,CAAC,qBAAqB,CAAC,MAAe;QACzC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iGAAiG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iFAAiF,CAAC,CAAC,GAAG,EAAE,CAAU,CAAC;QAC3Q,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAoB,CAAA,CAAC,CAAC;IACzR,CAAC;IACD,KAAK,CAAC,kBAAkB,CAAC,cAAsB,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,IAAsB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gGAAgG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACzQ,KAAK,CAAC,mBAAmB,CAAC,OAA8B,IAAmB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,ycAAyc,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACrzB,KAAK,CAAC,kBAAkB,CAAC,SAAiB,IAAoC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC,CAAC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,sBAAsB,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAoC,EAAE,WAAW,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAa,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACh2B,KAAK,CAAC,gBAAgB,CAAC,KAAuB;QAC5C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAqC,CAAC;YACjK,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;gBAC3D,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;oBAAE,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;gBAClK,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAqC,CAAC;YAC1J,IAAI,IAAI,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAoB,CAAC;YACtE,MAAM,MAAM,GAAoB,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACnF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8HAA8H,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1Q,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,KAAsB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+FAA+F,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACxM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAClG,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,WAAmB,IAA0C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAqC,CAAC,CAAC,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACpT,gBAAgB,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,MAAe;QAChD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qLAAqL,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qKAAqK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAU,CAAC;QAC3b,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvQ,CAAC;IACD,uBAAuB,CAAC,MAAe;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,4GAA4G,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oGAAoG,CAAC,CAAC,GAAG,EAAE,CAAU,CAAC;QACzS,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAgC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAwC,CAAA,CAAC,CAAC;IACzR,CAAC;IACD,uBAAuB,CAAC,MAAe;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8FAA8F,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAAE,CAA+B,CAAC;QAC1R,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB,CAAC,CAAC;IAClE,CAAC;IACD,8BAA8B,CAAC,MAAe;QAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EAAE,CAA+B,CAAC;QAChO,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAiB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzI,CAAC;IACD,iBAAiB,CAAC,MAAe;QAC/B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sGAAsG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oFAAoF,CAAC,CAAC,GAAG,EAAE,CAAqD,CAAC;QAC7T,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,CAAC;IACD,aAAa,CAAC,OAAqB,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iMAAiM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;IACxb,CAAC;IACD,oBAAoB,CAAC,cAAsB,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,IAAa,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kGAAkG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9P,2BAA2B,CAAC,KAAwG;QAClI,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oFAAoF,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAA4F,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,GAAG;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+IAA+I,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qIAAqI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjzC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YAAC,MAAM,GAAG,GAAG,kBAAkB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAAC,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAAC,CAAC;QAC7U,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,gBAAgB,CAAC,KAAwG,IAAa,OAAO,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChM,2BAA2B,CAAC,KAA8D,IAAa,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qJAAqJ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxV,gBAAgB,CAAC,MAAc,EAAE,KAAa,IAAa,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAA2C,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnV,YAAY,CAAC,MAAoB;QACvC,KAAK,MAAM,KAAK,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,CAAU;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,oBAAoB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpN,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qIAAqI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChV,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1N,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrL,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClN,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+JAA+J,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnjB,CAAC;IACO,WAAW,CAAI,EAAW,IAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;QAAC,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC;CACzM"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=persistence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.test.d.ts","sourceRoot":"","sources":["../src/persistence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { mkdtempSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { SQLiteCaseStore } from './persistence/sqlite-store.js';
6
+ function caseRecord() {
7
+ return { id: 'case-1', projectRoot: '/repo', baseRef: 'main', integrationRef: 'refs/devflow/case-1', targetRef: 'main', title: 'demo', source: 'human', riskTier: 'low', autonomy: 'manual', stage: 'draft', budgets: { maxInteractionTurns: 4, maxTaskAttempts: 2, maxWallTimeMs: 1000, maxToolCalls: 10 }, artifacts: [], tasks: [], approvals: [], decisions: [], evidence: [], interaction: { phase: 'clarification', status: 'active', turn: 0, openQuestions: [], blockingUnknowns: [], summaryRefs: [] }, createdBy: { id: 'u', kind: 'human' }, updatedAt: 1, version: 0 };
8
+ }
9
+ describe('delivery line sqlite persistence', () => {
10
+ it('persists cases, rejects stale CAS, deduplicates events, and fences leases', async () => {
11
+ const store = new SQLiteCaseStore(join(mkdtempSync(join(tmpdir(), 'delivery-line-')), 'state.db'));
12
+ const record = caseRecord();
13
+ await store.create(record);
14
+ const next = { ...record, version: 1, stage: 'clarifying', updatedAt: 2 };
15
+ await store.save(next, 0);
16
+ await expect(store.save({ ...next, version: 2 }, 0)).rejects.toMatchObject({ code: 'STATE_VERSION_CONFLICT' });
17
+ const event = { id: 'event-1', caseId: record.id, type: 'case.created', idempotencyKey: 'event-key', actor: record.createdBy, payload: { stage: 'clarifying' }, createdAt: 2 };
18
+ await store.appendEvent(event);
19
+ await store.appendEvent(event);
20
+ await expect(store.appendEvent({ ...event, payload: { stage: 'draft' } })).rejects.toMatchObject({ code: 'IDEMPOTENCY_CONFLICT' });
21
+ expect(store.acquireTaskLease({ taskId: 'task-1', caseId: record.id, owner: 'worker-a', now: 10, leaseMs: 100 })).toBe(true);
22
+ expect(store.acquireTaskLease({ taskId: 'task-1', caseId: record.id, owner: 'worker-b', now: 50, leaseMs: 100 })).toBe(false);
23
+ expect(store.acquireTaskLease({ taskId: 'task-1', caseId: record.id, owner: 'worker-b', now: 111, leaseMs: 100 })).toBe(true);
24
+ expect(store.releaseTaskLease('task-1', 'worker-b')).toBe(true);
25
+ store.close();
26
+ });
27
+ });
28
+ //# sourceMappingURL=persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.test.js","sourceRoot":"","sources":["../src/persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,248 @@
1
+ import type { AgentHandoff, ApprovalRecord, ArtifactRef, DecisionRecord, DeliveryCase, DeliveryEvent, DeliveryTask, InteractionSummary, DeliveryStatusView, ReviewReceipt, TaskEnvelope, VerificationReceipt } from '../domain/types.js';
2
+ export type HostCapabilityLevel = 'H1' | 'H2' | 'H3';
3
+ export type HostSessionMode = 'bounded-invocation' | 'recoverable-session';
4
+ export interface HostAvailability {
5
+ available: boolean;
6
+ authenticationState: 'authenticated' | 'unauthenticated' | 'not-required';
7
+ }
8
+ export interface HostProbeResult {
9
+ passed: boolean;
10
+ reason?: string;
11
+ }
12
+ export interface HostDetectInput {
13
+ projectRoot: string;
14
+ env: Record<string, string | undefined>;
15
+ }
16
+ export interface HostProbeInput {
17
+ projectRoot: string;
18
+ capability: string;
19
+ }
20
+ export interface HostConformancePort {
21
+ probe(input: HostProbeInput): Promise<HostProbeResult>;
22
+ }
23
+ export interface OperationPrepare {
24
+ operationId: string;
25
+ caseId: string;
26
+ kind: 'worker' | 'tool' | 'integration' | 'package';
27
+ idempotencyKey: string;
28
+ requestHash?: string;
29
+ }
30
+ export interface OperationRecord extends OperationPrepare {
31
+ status: 'prepared' | 'invoked' | 'recorded' | 'unknown';
32
+ recovery?: 'none' | 'resume' | 'held';
33
+ receipt?: unknown;
34
+ }
35
+ export interface OperationJournalPort {
36
+ prepare(input: OperationPrepare): Promise<OperationRecord>;
37
+ record(input: OperationRecord): Promise<void>;
38
+ recover(operationId: string): Promise<OperationRecord & {
39
+ recovery: 'none' | 'resume' | 'held';
40
+ }>;
41
+ }
42
+ export interface TaskLeaseView {
43
+ taskId: string;
44
+ caseId: string;
45
+ owner: string;
46
+ expiresAt: number;
47
+ attempt: number;
48
+ version: number;
49
+ fencingToken?: number;
50
+ }
51
+ export interface TaskLeaseAcquireInput {
52
+ taskId: string;
53
+ caseId: string;
54
+ owner: string;
55
+ now: number;
56
+ leaseMs: number;
57
+ payload?: string;
58
+ }
59
+ export interface TaskLeaseAcquireResult {
60
+ acquired: boolean;
61
+ owner: string;
62
+ expiresAt: number;
63
+ fencingToken: number;
64
+ takeover: boolean;
65
+ }
66
+ export interface PendingInteractionView extends InteractionSummary {
67
+ answered: boolean;
68
+ blocking: boolean;
69
+ }
70
+ export interface RecoveryCursor {
71
+ id: string;
72
+ createdAt: number;
73
+ }
74
+ export interface SubAgentSessionRecord {
75
+ sessionId: string;
76
+ caseId: string;
77
+ role: string;
78
+ agentId: string;
79
+ agentVersion: string;
80
+ permissionSnapshot: Record<string, unknown>;
81
+ status: 'starting' | 'running' | 'awaiting_user' | 'completed' | 'failed' | 'interrupted';
82
+ lastEventId?: string;
83
+ processedUserEventIds: string[];
84
+ lastUserTurn: number;
85
+ budget: {
86
+ maxToolCalls?: number;
87
+ toolCalls: number;
88
+ };
89
+ createdAt: number;
90
+ }
91
+ export interface CaseStore {
92
+ create(caseRecord: DeliveryCase): Promise<void>;
93
+ get(caseId: string): Promise<DeliveryCase>;
94
+ save(caseRecord: DeliveryCase, expectedVersion: number): Promise<void>;
95
+ appendEvent(event: DeliveryEvent): Promise<void>;
96
+ hasIdempotencyKey(key: string): Promise<boolean>;
97
+ findCaseByIdempotencyKey?(key: string): Promise<DeliveryCase | undefined>;
98
+ listActiveLeases?(now?: number, caseId?: string): TaskLeaseView[] | Promise<TaskLeaseView[]>;
99
+ listPendingInteractions?(caseId?: string): PendingInteractionView[] | Promise<PendingInteractionView[]>;
100
+ listUnprocessedHandoffs?(caseId?: string): AgentHandoff[] | Promise<AgentHandoff[]>;
101
+ listVerifiedNotIntegratedTasks?(caseId?: string): DeliveryTask[] | Promise<DeliveryTask[]>;
102
+ latestEventCursor?(caseId?: string): RecoveryCursor | undefined | Promise<RecoveryCursor | undefined>;
103
+ listUnprocessedEvents?(caseId?: string): DeliveryEvent[] | Promise<DeliveryEvent[]>;
104
+ markEventProcessed?(idempotencyKey: string, processedAt?: number): boolean | Promise<boolean>;
105
+ saveSubAgentSession?(session: SubAgentSessionRecord): Promise<void>;
106
+ getSubAgentSession?(sessionId: string): Promise<SubAgentSessionRecord>;
107
+ prepareOperation?(input: OperationPrepare): Promise<OperationRecord>;
108
+ recordOperation?(input: OperationRecord): Promise<void>;
109
+ findOperation?(operationId: string): Promise<OperationRecord | undefined>;
110
+ acquireTaskLeaseWithFencing?(input: TaskLeaseAcquireInput): TaskLeaseAcquireResult | Promise<TaskLeaseAcquireResult>;
111
+ releaseTaskLeaseWithFencing?(input: {
112
+ taskId: string;
113
+ owner: string;
114
+ fencingToken: number;
115
+ }): boolean | Promise<boolean>;
116
+ }
117
+ export interface ArtifactPort {
118
+ create(input: unknown): Promise<ArtifactRef>;
119
+ get(ref: ArtifactRef): Promise<unknown>;
120
+ }
121
+ export interface DeliveryContextPort {
122
+ build(input: {
123
+ role: 'clarifier' | 'designer' | 'planner' | 'implementer' | 'reviewer';
124
+ retrieval: {
125
+ taskRevision: number;
126
+ projectRoot: string;
127
+ query: string;
128
+ sessionId: string;
129
+ executionId: string;
130
+ requestId: string;
131
+ turnId: string;
132
+ };
133
+ }): Promise<{
134
+ receiptHash: string;
135
+ }>;
136
+ }
137
+ export interface RevisionPort {
138
+ resolveRevision(input: {
139
+ repositoryPath: string;
140
+ revision: string;
141
+ }): Promise<string>;
142
+ }
143
+ export interface InteractionPort {
144
+ turn(input: unknown): Promise<unknown>;
145
+ recordDecision(input: DecisionRecord): Promise<void>;
146
+ }
147
+ export interface WorkerVerificationReceipt {
148
+ passed: true;
149
+ state: 'merge_ready';
150
+ finalRevision: string;
151
+ changedFiles: string[];
152
+ graderReceipts: string[];
153
+ simulationHash: string;
154
+ parentRevision: string;
155
+ }
156
+ export interface ExecutionResult {
157
+ taskId: string;
158
+ status: string;
159
+ worktreePath?: string;
160
+ commit?: string;
161
+ handoff?: {
162
+ finalRevision: string;
163
+ changedFiles: string[];
164
+ durable?: boolean;
165
+ };
166
+ branch?: string;
167
+ workerVerification?: WorkerVerificationReceipt;
168
+ }
169
+ export interface ExecutionPort {
170
+ startTask(input: TaskEnvelope): Promise<ExecutionResult>;
171
+ cancelTask(input: {
172
+ taskId: string;
173
+ }): Promise<void>;
174
+ }
175
+ export interface VerificationPort {
176
+ verify(input: unknown): Promise<VerificationReceipt>;
177
+ }
178
+ export interface ReviewPort {
179
+ review(input: unknown): Promise<ReviewReceipt>;
180
+ }
181
+ export interface ApprovalPort {
182
+ approve(input: unknown): Promise<ApprovalRecord>;
183
+ reject(input: unknown): Promise<ApprovalRecord>;
184
+ requiredRoles?(input: {
185
+ riskTier: 'low' | 'medium' | 'high';
186
+ stage: string;
187
+ }): string[];
188
+ }
189
+ export interface EventPort {
190
+ append(input: DeliveryEvent): Promise<void>;
191
+ }
192
+ export interface SubAgentPort {
193
+ start(input: unknown): Promise<unknown>;
194
+ send(input: AgentHandoff): Promise<unknown>;
195
+ interrupt(input: unknown): Promise<void>;
196
+ recover(input: unknown): Promise<unknown>;
197
+ }
198
+ export interface DeliveryPackagePort {
199
+ prepare(input: unknown): Promise<{
200
+ packageHash: string;
201
+ path: string;
202
+ }>;
203
+ inspect?(input: unknown): Promise<{
204
+ packageHash: string;
205
+ path: string;
206
+ } | null> | {
207
+ packageHash: string;
208
+ path: string;
209
+ } | null;
210
+ verify?(input: {
211
+ path: string;
212
+ packageHash: string;
213
+ }): Promise<void> | void;
214
+ }
215
+ export interface IntegrationPort {
216
+ integrate(input: {
217
+ caseId: string;
218
+ taskId: string;
219
+ integrationRef: string;
220
+ targetRef: string;
221
+ candidateRevision: string;
222
+ expectedBaseRevision: string;
223
+ expectedCurrentRevision: string | null;
224
+ }): Promise<{
225
+ candidateRevision: string;
226
+ }>;
227
+ inspect?(input: {
228
+ integrationRef: string;
229
+ candidateRevision: string;
230
+ }): Promise<{
231
+ candidateRevision: string;
232
+ } | null>;
233
+ }
234
+ export interface DeliveryLinePorts {
235
+ store: CaseStore;
236
+ artifact?: ArtifactPort;
237
+ context?: DeliveryContextPort;
238
+ revision?: RevisionPort;
239
+ execution?: ExecutionPort;
240
+ verification?: VerificationPort;
241
+ review?: ReviewPort;
242
+ approval?: ApprovalPort;
243
+ integration?: IntegrationPort;
244
+ package?: DeliveryPackagePort;
245
+ operationJournal?: OperationJournalPort;
246
+ }
247
+ export type { DeliveryCase, DeliveryStatusView };
248
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ export interface RecoveryTaskState {
2
+ taskId: string;
3
+ status: 'pending' | 'running' | 'blocked' | 'integrated';
4
+ attempt: number;
5
+ idempotencyKey: string;
6
+ }
7
+ export interface RecoverySnapshot {
8
+ caseId: string;
9
+ stage: 'executing' | 'held';
10
+ tasks: RecoveryTaskState[];
11
+ }
12
+ export interface RecoveryExecutor {
13
+ startTask(taskId: string, idempotencyKey: string): Promise<void>;
14
+ }
15
+ export declare class RecoveryCoordinator {
16
+ private readonly state;
17
+ private readonly executor;
18
+ constructor(state: RecoverySnapshot, executor: RecoveryExecutor);
19
+ resume(): Promise<RecoverySnapshot>;
20
+ }
21
+ export declare function cloneRecoverySnapshot(snapshot: RecoverySnapshot): RecoverySnapshot;
22
+ //# sourceMappingURL=recovery-spike.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-spike.d.ts","sourceRoot":"","sources":["../src/recovery-spike.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAoB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAlD,KAAK,EAAE,gBAAgB,EAAmB,QAAQ,EAAE,gBAAgB;IAE3F,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAc1C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAElF"}
@@ -0,0 +1,28 @@
1
+ export class RecoveryCoordinator {
2
+ state;
3
+ executor;
4
+ constructor(state, executor) {
5
+ this.state = state;
6
+ this.executor = executor;
7
+ }
8
+ async resume() {
9
+ for (const task of this.state.tasks) {
10
+ if (task.status !== 'running')
11
+ continue;
12
+ task.status = 'blocked';
13
+ this.state.stage = 'held';
14
+ }
15
+ for (const task of this.state.tasks) {
16
+ if (task.status !== 'pending' || task.attempt > 0)
17
+ continue;
18
+ task.attempt = 1;
19
+ task.status = 'running';
20
+ await this.executor.startTask(task.taskId, task.idempotencyKey);
21
+ }
22
+ return structuredClone(this.state);
23
+ }
24
+ }
25
+ export function cloneRecoverySnapshot(snapshot) {
26
+ return structuredClone(snapshot);
27
+ }
28
+ //# sourceMappingURL=recovery-spike.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-spike.js","sourceRoot":"","sources":["../src/recovery-spike.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,mBAAmB;IACD;IAA0C;IAAvE,YAA6B,KAAuB,EAAmB,QAA0B;QAApE,UAAK,GAAL,KAAK,CAAkB;QAAmB,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAErG,KAAK,CAAC,MAAM;QACV,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YACxC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QAC5B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC;gBAAE,SAAS;YAC5D,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,QAA0B;IAC9D,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recovery-spike.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-spike.test.d.ts","sourceRoot":"","sources":["../src/recovery-spike.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { cloneRecoverySnapshot, RecoveryCoordinator } from './recovery-spike.js';
3
+ describe('delivery line recovery spike', () => {
4
+ it('resumes an unfinished task once after process reconstruction', async () => {
5
+ const calls = [];
6
+ const initial = {
7
+ caseId: 'case-1', stage: 'executing',
8
+ tasks: [{ taskId: 'task-1', status: 'pending', attempt: 0, idempotencyKey: 'case-1:task-1:1' }],
9
+ };
10
+ const first = new RecoveryCoordinator(cloneRecoverySnapshot(initial), { startTask: async (id) => { calls.push(id); } });
11
+ const recovered = await first.resume();
12
+ expect(recovered.tasks[0]).toMatchObject({ status: 'running', attempt: 1 });
13
+ expect(calls).toEqual(['task-1']);
14
+ const second = new RecoveryCoordinator(cloneRecoverySnapshot(recovered), { startTask: async (id) => { calls.push(id); } });
15
+ const resumed = await second.resume();
16
+ expect(resumed.stage).toBe('held');
17
+ expect(calls).toEqual(['task-1']);
18
+ });
19
+ });
20
+ //# sourceMappingURL=recovery-spike.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-spike.test.js","sourceRoot":"","sources":["../src/recovery-spike.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAyB,MAAM,qBAAqB,CAAC;AAExG,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAqB;YAChC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW;YACpC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3H,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type DeliveryHostAdapter } from './host-conformance.js';
2
+ import type { HostAvailability } from '../ports/index.js';
3
+ export declare class ClaudeCodeDeliveryHostAdapter implements DeliveryHostAdapter {
4
+ readonly id = "claude-code";
5
+ readonly version = "cli";
6
+ readonly protocolVersion: "delivery-host.v1";
7
+ readonly declaredCapabilities: {
8
+ worker: boolean;
9
+ subAgent: boolean;
10
+ sessionModes: readonly ["bounded-invocation", "recoverable-session"];
11
+ streamingEvents: boolean;
12
+ historyReplay: boolean;
13
+ toolConfirmation: boolean;
14
+ customTools: boolean;
15
+ interruption: boolean;
16
+ structuredOutput: boolean;
17
+ browser: boolean;
18
+ };
19
+ detect(_input: {
20
+ projectRoot: string;
21
+ env: Record<string, string | undefined>;
22
+ }): Promise<HostAvailability>;
23
+ }
24
+ export declare function probeClaudeStructuredOutput(projectRoot: string): Promise<{
25
+ passed: boolean;
26
+ reason?: string;
27
+ }>;
28
+ //# sourceMappingURL=claude-host-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-host-adapter.d.ts","sourceRoot":"","sources":["../../src/runtime/claude-host-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,qBAAa,6BAA8B,YAAW,mBAAmB;IACvE,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,eAAe,EAAG,kBAAkB,CAAU;IACvD,QAAQ,CAAC,oBAAoB;;;;;;;;;;;MAI3B;IAEI,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAUlH;AAED,wBAAsB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAcpH"}