@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.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/__tests__/artifact-generation.test.d.ts +2 -0
- package/dist/__tests__/artifact-generation.test.d.ts.map +1 -0
- package/dist/__tests__/artifact-generation.test.js +16 -0
- package/dist/__tests__/artifact-generation.test.js.map +1 -0
- package/dist/__tests__/backend-scenario.e2e.test.d.ts +2 -0
- package/dist/__tests__/backend-scenario.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/backend-scenario.e2e.test.js +25 -0
- package/dist/__tests__/backend-scenario.e2e.test.js.map +1 -0
- package/dist/__tests__/claude-events.test.d.ts +2 -0
- package/dist/__tests__/claude-events.test.d.ts.map +1 -0
- package/dist/__tests__/claude-events.test.js +28 -0
- package/dist/__tests__/claude-events.test.js.map +1 -0
- package/dist/__tests__/facade-e2e.test.d.ts +2 -0
- package/dist/__tests__/facade-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/facade-e2e.test.js +167 -0
- package/dist/__tests__/facade-e2e.test.js.map +1 -0
- package/dist/__tests__/frontend-scenario.e2e.test.d.ts +2 -0
- package/dist/__tests__/frontend-scenario.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/frontend-scenario.e2e.test.js +35 -0
- package/dist/__tests__/frontend-scenario.e2e.test.js.map +1 -0
- package/dist/__tests__/git-artifact-store.test.d.ts +2 -0
- package/dist/__tests__/git-artifact-store.test.d.ts.map +1 -0
- package/dist/__tests__/git-artifact-store.test.js +44 -0
- package/dist/__tests__/git-artifact-store.test.js.map +1 -0
- package/dist/__tests__/governance-adapters.test.d.ts +2 -0
- package/dist/__tests__/governance-adapters.test.d.ts.map +1 -0
- package/dist/__tests__/governance-adapters.test.js +51 -0
- package/dist/__tests__/governance-adapters.test.js.map +1 -0
- package/dist/__tests__/handoff-validator.test.d.ts +2 -0
- package/dist/__tests__/handoff-validator.test.d.ts.map +1 -0
- package/dist/__tests__/handoff-validator.test.js +13 -0
- package/dist/__tests__/handoff-validator.test.js.map +1 -0
- package/dist/__tests__/interaction-session.test.d.ts +2 -0
- package/dist/__tests__/interaction-session.test.d.ts.map +1 -0
- package/dist/__tests__/interaction-session.test.js +13 -0
- package/dist/__tests__/interaction-session.test.js.map +1 -0
- package/dist/__tests__/interaction.test.d.ts +2 -0
- package/dist/__tests__/interaction.test.d.ts.map +1 -0
- package/dist/__tests__/interaction.test.js +27 -0
- package/dist/__tests__/interaction.test.js.map +1 -0
- package/dist/__tests__/persistence.test.d.ts +2 -0
- package/dist/__tests__/persistence.test.d.ts.map +1 -0
- package/dist/__tests__/persistence.test.js +41 -0
- package/dist/__tests__/persistence.test.js.map +1 -0
- package/dist/__tests__/recovery-spike.test.d.ts +2 -0
- package/dist/__tests__/recovery-spike.test.d.ts.map +1 -0
- package/dist/__tests__/recovery-spike.test.js +20 -0
- package/dist/__tests__/recovery-spike.test.js.map +1 -0
- package/dist/__tests__/sqlite-recovery.test.d.ts +2 -0
- package/dist/__tests__/sqlite-recovery.test.d.ts.map +1 -0
- package/dist/__tests__/sqlite-recovery.test.js +90 -0
- package/dist/__tests__/sqlite-recovery.test.js.map +1 -0
- package/dist/__tests__/state-machine.test.d.ts +2 -0
- package/dist/__tests__/state-machine.test.d.ts.map +1 -0
- package/dist/__tests__/state-machine.test.js +49 -0
- package/dist/__tests__/state-machine.test.js.map +1 -0
- package/dist/__tests__/subagent-orchestrator.test.d.ts +2 -0
- package/dist/__tests__/subagent-orchestrator.test.d.ts.map +1 -0
- package/dist/__tests__/subagent-orchestrator.test.js +33 -0
- package/dist/__tests__/subagent-orchestrator.test.js.map +1 -0
- package/dist/__tests__/subagent-recovery.e2e.test.d.ts +2 -0
- package/dist/__tests__/subagent-recovery.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/subagent-recovery.e2e.test.js +35 -0
- package/dist/__tests__/subagent-recovery.e2e.test.js.map +1 -0
- package/dist/__tests__/task-dag.test.d.ts +2 -0
- package/dist/__tests__/task-dag.test.d.ts.map +1 -0
- package/dist/__tests__/task-dag.test.js +31 -0
- package/dist/__tests__/task-dag.test.js.map +1 -0
- package/dist/__tests__/worker-integration.test.d.ts +2 -0
- package/dist/__tests__/worker-integration.test.d.ts.map +1 -0
- package/dist/__tests__/worker-integration.test.js +217 -0
- package/dist/__tests__/worker-integration.test.js.map +1 -0
- package/dist/adapters/approval.d.ts +40 -0
- package/dist/adapters/approval.d.ts.map +1 -0
- package/dist/adapters/approval.js +100 -0
- package/dist/adapters/approval.js.map +1 -0
- package/dist/adapters/delivery-package.d.ts +23 -0
- package/dist/adapters/delivery-package.d.ts.map +1 -0
- package/dist/adapters/delivery-package.js +37 -0
- package/dist/adapters/delivery-package.js.map +1 -0
- package/dist/adapters/integration.d.ts +37 -0
- package/dist/adapters/integration.d.ts.map +1 -0
- package/dist/adapters/integration.js +84 -0
- package/dist/adapters/integration.js.map +1 -0
- package/dist/adapters/review.d.ts +12 -0
- package/dist/adapters/review.d.ts.map +1 -0
- package/dist/adapters/review.js +33 -0
- package/dist/adapters/review.js.map +1 -0
- package/dist/adapters/verification.d.ts +25 -0
- package/dist/adapters/verification.d.ts.map +1 -0
- package/dist/adapters/verification.js +57 -0
- package/dist/adapters/verification.js.map +1 -0
- package/dist/adapters/workflow-execution.d.ts +130 -0
- package/dist/adapters/workflow-execution.d.ts.map +1 -0
- package/dist/adapters/workflow-execution.js +135 -0
- package/dist/adapters/workflow-execution.js.map +1 -0
- package/dist/artifact-generation.test.d.ts +2 -0
- package/dist/artifact-generation.test.d.ts.map +1 -0
- package/dist/artifact-generation.test.js +11 -0
- package/dist/artifact-generation.test.js.map +1 -0
- package/dist/artifacts/context-manifest.d.ts +20 -0
- package/dist/artifacts/context-manifest.d.ts.map +1 -0
- package/dist/artifacts/context-manifest.js +24 -0
- package/dist/artifacts/context-manifest.js.map +1 -0
- package/dist/artifacts/generation-guard.d.ts +13 -0
- package/dist/artifacts/generation-guard.d.ts.map +1 -0
- package/dist/artifacts/generation-guard.js +16 -0
- package/dist/artifacts/generation-guard.js.map +1 -0
- package/dist/artifacts/git-artifact-store.d.ts +16 -0
- package/dist/artifacts/git-artifact-store.d.ts.map +1 -0
- package/dist/artifacts/git-artifact-store.js +47 -0
- package/dist/artifacts/git-artifact-store.js.map +1 -0
- package/dist/claude-events.test.d.ts +2 -0
- package/dist/claude-events.test.d.ts.map +1 -0
- package/dist/claude-events.test.js +14 -0
- package/dist/claude-events.test.js.map +1 -0
- package/dist/composition.d.ts +13 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js +47 -0
- package/dist/composition.js.map +1 -0
- package/dist/domain/interaction.d.ts +23 -0
- package/dist/domain/interaction.d.ts.map +1 -0
- package/dist/domain/interaction.js +60 -0
- package/dist/domain/interaction.js.map +1 -0
- package/dist/domain/state-machine.d.ts +26 -0
- package/dist/domain/state-machine.d.ts.map +1 -0
- package/dist/domain/state-machine.js +67 -0
- package/dist/domain/state-machine.js.map +1 -0
- package/dist/domain/task-dag.d.ts +5 -0
- package/dist/domain/task-dag.d.ts.map +1 -0
- package/dist/domain/task-dag.js +78 -0
- package/dist/domain/task-dag.js.map +1 -0
- package/dist/domain/types.d.ts +320 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +9 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/facade/delivery-line-facade.d.ts +77 -0
- package/dist/facade/delivery-line-facade.d.ts.map +1 -0
- package/dist/facade/delivery-line-facade.js +417 -0
- package/dist/facade/delivery-line-facade.js.map +1 -0
- package/dist/git-artifact-store.test.d.ts +2 -0
- package/dist/git-artifact-store.test.d.ts.map +1 -0
- package/dist/git-artifact-store.test.js +27 -0
- package/dist/git-artifact-store.test.js.map +1 -0
- package/dist/governance-adapters.test.d.ts +2 -0
- package/dist/governance-adapters.test.d.ts.map +1 -0
- package/dist/governance-adapters.test.js +14 -0
- package/dist/governance-adapters.test.js.map +1 -0
- package/dist/handoff-validator.test.d.ts +2 -0
- package/dist/handoff-validator.test.d.ts.map +1 -0
- package/dist/handoff-validator.test.js +10 -0
- package/dist/handoff-validator.test.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction-session.d.ts +12 -0
- package/dist/interaction-session.d.ts.map +1 -0
- package/dist/interaction-session.js +21 -0
- package/dist/interaction-session.js.map +1 -0
- package/dist/interaction-session.test.d.ts +2 -0
- package/dist/interaction-session.test.d.ts.map +1 -0
- package/dist/interaction-session.test.js +13 -0
- package/dist/interaction-session.test.js.map +1 -0
- package/dist/persistence/cas.d.ts +4 -0
- package/dist/persistence/cas.d.ts.map +1 -0
- package/dist/persistence/cas.js +7 -0
- package/dist/persistence/cas.js.map +1 -0
- package/dist/persistence/event-ledger.d.ts +10 -0
- package/dist/persistence/event-ledger.d.ts.map +1 -0
- package/dist/persistence/event-ledger.js +6 -0
- package/dist/persistence/event-ledger.js.map +1 -0
- package/dist/persistence/memory-store.d.ts +51 -0
- package/dist/persistence/memory-store.d.ts.map +1 -0
- package/dist/persistence/memory-store.js +99 -0
- package/dist/persistence/memory-store.js.map +1 -0
- package/dist/persistence/schema.d.ts +2 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +107 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/sqlite-store.d.ts +59 -0
- package/dist/persistence/sqlite-store.d.ts.map +1 -0
- package/dist/persistence/sqlite-store.js +133 -0
- package/dist/persistence/sqlite-store.js.map +1 -0
- package/dist/persistence.test.d.ts +2 -0
- package/dist/persistence.test.d.ts.map +1 -0
- package/dist/persistence.test.js +28 -0
- package/dist/persistence.test.js.map +1 -0
- package/dist/ports/index.d.ts +248 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/recovery-spike.d.ts +22 -0
- package/dist/recovery-spike.d.ts.map +1 -0
- package/dist/recovery-spike.js +28 -0
- package/dist/recovery-spike.js.map +1 -0
- package/dist/recovery-spike.test.d.ts +2 -0
- package/dist/recovery-spike.test.d.ts.map +1 -0
- package/dist/recovery-spike.test.js +20 -0
- package/dist/recovery-spike.test.js.map +1 -0
- package/dist/runtime/claude-host-adapter.d.ts +28 -0
- package/dist/runtime/claude-host-adapter.d.ts.map +1 -0
- package/dist/runtime/claude-host-adapter.js +43 -0
- package/dist/runtime/claude-host-adapter.js.map +1 -0
- package/dist/runtime/context-binder.d.ts +61 -0
- package/dist/runtime/context-binder.d.ts.map +1 -0
- package/dist/runtime/context-binder.js +26 -0
- package/dist/runtime/context-binder.js.map +1 -0
- package/dist/runtime/execution-coordinator.d.ts +32 -0
- package/dist/runtime/execution-coordinator.d.ts.map +1 -0
- package/dist/runtime/execution-coordinator.js +243 -0
- package/dist/runtime/execution-coordinator.js.map +1 -0
- package/dist/runtime/gate-queue.d.ts +17 -0
- package/dist/runtime/gate-queue.d.ts.map +1 -0
- package/dist/runtime/gate-queue.js +33 -0
- package/dist/runtime/gate-queue.js.map +1 -0
- package/dist/runtime/host-conformance.d.ts +47 -0
- package/dist/runtime/host-conformance.d.ts.map +1 -0
- package/dist/runtime/host-conformance.js +61 -0
- package/dist/runtime/host-conformance.js.map +1 -0
- package/dist/runtime/host-routing.d.ts +5 -0
- package/dist/runtime/host-routing.d.ts.map +1 -0
- package/dist/runtime/host-routing.js +42 -0
- package/dist/runtime/host-routing.js.map +1 -0
- package/dist/runtime/memory-writeback.d.ts +18 -0
- package/dist/runtime/memory-writeback.d.ts.map +1 -0
- package/dist/runtime/memory-writeback.js +23 -0
- package/dist/runtime/memory-writeback.js.map +1 -0
- package/dist/runtime/operation-journal.d.ts +13 -0
- package/dist/runtime/operation-journal.d.ts.map +1 -0
- package/dist/runtime/operation-journal.js +38 -0
- package/dist/runtime/operation-journal.js.map +1 -0
- package/dist/runtime/plan-compiler.d.ts +37 -0
- package/dist/runtime/plan-compiler.d.ts.map +1 -0
- package/dist/runtime/plan-compiler.js +62 -0
- package/dist/runtime/plan-compiler.js.map +1 -0
- package/dist/runtime/project-runtime-factory.d.ts +15 -0
- package/dist/runtime/project-runtime-factory.d.ts.map +1 -0
- package/dist/runtime/project-runtime-factory.js +11 -0
- package/dist/runtime/project-runtime-factory.js.map +1 -0
- package/dist/runtime/review-coordinator.d.ts +25 -0
- package/dist/runtime/review-coordinator.d.ts.map +1 -0
- package/dist/runtime/review-coordinator.js +22 -0
- package/dist/runtime/review-coordinator.js.map +1 -0
- package/dist/subagents/claude-events.d.ts +59 -0
- package/dist/subagents/claude-events.d.ts.map +1 -0
- package/dist/subagents/claude-events.js +60 -0
- package/dist/subagents/claude-events.js.map +1 -0
- package/dist/subagents/handoff-validator.d.ts +8 -0
- package/dist/subagents/handoff-validator.d.ts.map +1 -0
- package/dist/subagents/handoff-validator.js +20 -0
- package/dist/subagents/handoff-validator.js.map +1 -0
- package/dist/subagents/orchestrator.d.ts +47 -0
- package/dist/subagents/orchestrator.d.ts.map +1 -0
- package/dist/subagents/orchestrator.js +85 -0
- package/dist/subagents/orchestrator.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|