@melra/storage-sqlite 0.3.0-alpha.3
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 +202 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +611 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +149 -0
- package/dist/index.test.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-store.test.d.ts +2 -0
- package/dist/workflow-store.test.d.ts.map +1 -0
- package/dist/workflow-store.test.js +276 -0
- package/dist/workflow-store.test.js.map +1 -0
- package/package.json +33 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { mkdirSync } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { DatabaseSync } from "node:sqlite";
|
|
6
|
+
import { EncryptedPayloadSchema, WorkflowDefinitionSchema, WorkflowEventSchema, WorkflowRunSchema, WorkflowSnapshotSchema, } from "@melra/protocol";
|
|
7
|
+
function toMemoryRecord(row) {
|
|
8
|
+
return {
|
|
9
|
+
id: row.id,
|
|
10
|
+
scope: row.scope,
|
|
11
|
+
key: row.key,
|
|
12
|
+
value: row.value,
|
|
13
|
+
source: row.source,
|
|
14
|
+
confidence: row.confidence,
|
|
15
|
+
tags: JSON.parse(row.tags),
|
|
16
|
+
...(row.speaker === null ? {} : { speaker: row.speaker }),
|
|
17
|
+
...(row.episodeId === null ? {} : { episodeId: row.episodeId }),
|
|
18
|
+
...(row.sequence === null ? {} : { sequence: row.sequence }),
|
|
19
|
+
...(row.expiresAt === null ? {} : { expiresAt: row.expiresAt }),
|
|
20
|
+
...(row.supersedesId === null ? {} : { supersedesId: row.supersedesId }),
|
|
21
|
+
...(row.supersededBy === null ? {} : { supersededBy: row.supersededBy }),
|
|
22
|
+
createdAt: row.createdAt,
|
|
23
|
+
updatedAt: row.updatedAt,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function parseStored(data, schema, error) {
|
|
27
|
+
try {
|
|
28
|
+
return schema.parse(JSON.parse(data));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error(error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class SqliteStore {
|
|
35
|
+
path;
|
|
36
|
+
database;
|
|
37
|
+
constructor(path) {
|
|
38
|
+
this.path = path;
|
|
39
|
+
if (path !== ":memory:")
|
|
40
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
41
|
+
this.database = new DatabaseSync(path);
|
|
42
|
+
this.database.exec("PRAGMA busy_timeout = 5000");
|
|
43
|
+
this.database.exec("PRAGMA journal_mode = WAL");
|
|
44
|
+
this.database.exec("PRAGMA foreign_keys = ON");
|
|
45
|
+
this.migrate();
|
|
46
|
+
}
|
|
47
|
+
migrate() {
|
|
48
|
+
this.database.exec(`
|
|
49
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
50
|
+
id TEXT PRIMARY KEY,
|
|
51
|
+
data TEXT NOT NULL,
|
|
52
|
+
created_at TEXT NOT NULL,
|
|
53
|
+
updated_at TEXT NOT NULL
|
|
54
|
+
);
|
|
55
|
+
CREATE TABLE IF NOT EXISTS receipts (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
task_id TEXT NOT NULL,
|
|
58
|
+
data TEXT NOT NULL,
|
|
59
|
+
created_at TEXT NOT NULL
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS receipts_task_id ON receipts(task_id);
|
|
62
|
+
CREATE TABLE IF NOT EXISTS certificates (
|
|
63
|
+
id TEXT PRIMARY KEY,
|
|
64
|
+
task_id TEXT NOT NULL UNIQUE,
|
|
65
|
+
data TEXT NOT NULL,
|
|
66
|
+
created_at TEXT NOT NULL
|
|
67
|
+
);
|
|
68
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
69
|
+
id TEXT PRIMARY KEY,
|
|
70
|
+
scope TEXT NOT NULL,
|
|
71
|
+
key TEXT NOT NULL,
|
|
72
|
+
value TEXT NOT NULL,
|
|
73
|
+
source TEXT NOT NULL,
|
|
74
|
+
confidence REAL NOT NULL,
|
|
75
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
76
|
+
speaker TEXT,
|
|
77
|
+
episode_id TEXT,
|
|
78
|
+
sequence INTEGER,
|
|
79
|
+
expires_at TEXT,
|
|
80
|
+
supersedes_id TEXT,
|
|
81
|
+
superseded_by TEXT,
|
|
82
|
+
created_at TEXT NOT NULL,
|
|
83
|
+
updated_at TEXT NOT NULL
|
|
84
|
+
);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS memories_scope ON memories(scope);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS memories_key ON memories(key);
|
|
87
|
+
`);
|
|
88
|
+
this.addColumnIfMissing("memories", "tags", "TEXT NOT NULL DEFAULT '[]'");
|
|
89
|
+
this.addColumnIfMissing("memories", "speaker", "TEXT");
|
|
90
|
+
this.addColumnIfMissing("memories", "episode_id", "TEXT");
|
|
91
|
+
this.addColumnIfMissing("memories", "sequence", "INTEGER");
|
|
92
|
+
this.addColumnIfMissing("memories", "expires_at", "TEXT");
|
|
93
|
+
this.addColumnIfMissing("memories", "supersedes_id", "TEXT");
|
|
94
|
+
this.addColumnIfMissing("memories", "superseded_by", "TEXT");
|
|
95
|
+
this.database.exec(`
|
|
96
|
+
CREATE INDEX IF NOT EXISTS memories_expiry ON memories(expires_at);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS memories_superseded_by ON memories(superseded_by);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS memories_episode_sequence
|
|
99
|
+
ON memories(episode_id, sequence);
|
|
100
|
+
`);
|
|
101
|
+
this.transaction(() => {
|
|
102
|
+
this.database.exec(`
|
|
103
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
104
|
+
version INTEGER PRIMARY KEY,
|
|
105
|
+
applied_at TEXT NOT NULL
|
|
106
|
+
);
|
|
107
|
+
`);
|
|
108
|
+
const applied = this.database
|
|
109
|
+
.prepare("SELECT version FROM schema_migrations WHERE version = 1")
|
|
110
|
+
.get();
|
|
111
|
+
if (applied !== undefined)
|
|
112
|
+
return;
|
|
113
|
+
this.database.exec(`
|
|
114
|
+
CREATE TABLE IF NOT EXISTS task_payloads (
|
|
115
|
+
task_id TEXT PRIMARY KEY,
|
|
116
|
+
request_payload TEXT NOT NULL,
|
|
117
|
+
result_payload TEXT,
|
|
118
|
+
created_at TEXT NOT NULL,
|
|
119
|
+
updated_at TEXT NOT NULL
|
|
120
|
+
);
|
|
121
|
+
CREATE TABLE IF NOT EXISTS workflow_payloads (
|
|
122
|
+
workflow_id TEXT NOT NULL,
|
|
123
|
+
workflow_version INTEGER NOT NULL,
|
|
124
|
+
payload TEXT NOT NULL,
|
|
125
|
+
created_at TEXT NOT NULL,
|
|
126
|
+
PRIMARY KEY(workflow_id, workflow_version)
|
|
127
|
+
);
|
|
128
|
+
CREATE TABLE IF NOT EXISTS workflow_definitions (
|
|
129
|
+
id TEXT NOT NULL,
|
|
130
|
+
version INTEGER NOT NULL,
|
|
131
|
+
data TEXT NOT NULL,
|
|
132
|
+
created_at TEXT NOT NULL,
|
|
133
|
+
PRIMARY KEY(id, version)
|
|
134
|
+
);
|
|
135
|
+
CREATE TABLE IF NOT EXISTS workflow_runs (
|
|
136
|
+
id TEXT PRIMARY KEY,
|
|
137
|
+
definition_id TEXT NOT NULL,
|
|
138
|
+
definition_version INTEGER NOT NULL,
|
|
139
|
+
state_version INTEGER NOT NULL,
|
|
140
|
+
data TEXT NOT NULL,
|
|
141
|
+
created_at TEXT NOT NULL,
|
|
142
|
+
updated_at TEXT NOT NULL
|
|
143
|
+
);
|
|
144
|
+
CREATE TABLE IF NOT EXISTS workflow_events (
|
|
145
|
+
id TEXT PRIMARY KEY,
|
|
146
|
+
aggregate_id TEXT NOT NULL,
|
|
147
|
+
sequence INTEGER NOT NULL,
|
|
148
|
+
trace_id TEXT NOT NULL,
|
|
149
|
+
type TEXT NOT NULL,
|
|
150
|
+
data TEXT NOT NULL,
|
|
151
|
+
occurred_at TEXT NOT NULL,
|
|
152
|
+
UNIQUE(aggregate_id, sequence)
|
|
153
|
+
);
|
|
154
|
+
CREATE INDEX IF NOT EXISTS workflow_events_aggregate
|
|
155
|
+
ON workflow_events(aggregate_id, sequence);
|
|
156
|
+
CREATE TABLE IF NOT EXISTS workflow_snapshots (
|
|
157
|
+
workflow_id TEXT NOT NULL,
|
|
158
|
+
sequence INTEGER NOT NULL,
|
|
159
|
+
data TEXT NOT NULL,
|
|
160
|
+
created_at TEXT NOT NULL,
|
|
161
|
+
PRIMARY KEY(workflow_id, sequence)
|
|
162
|
+
);
|
|
163
|
+
CREATE TABLE IF NOT EXISTS idempotency_commits (
|
|
164
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
165
|
+
task_id TEXT NOT NULL,
|
|
166
|
+
attempt INTEGER NOT NULL,
|
|
167
|
+
committed_at TEXT NOT NULL
|
|
168
|
+
);
|
|
169
|
+
`);
|
|
170
|
+
this.database
|
|
171
|
+
.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (1, ?)")
|
|
172
|
+
.run(new Date().toISOString());
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
transaction(action) {
|
|
176
|
+
this.database.exec("BEGIN IMMEDIATE");
|
|
177
|
+
try {
|
|
178
|
+
const result = action();
|
|
179
|
+
this.database.exec("COMMIT");
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
this.database.exec("ROLLBACK");
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
addColumnIfMissing(table, column, definition) {
|
|
188
|
+
const columns = this.database
|
|
189
|
+
.prepare(`PRAGMA table_info(${table})`)
|
|
190
|
+
.all();
|
|
191
|
+
if (!columns.some((entry) => entry.name === column)) {
|
|
192
|
+
this.database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
saveTask(task) {
|
|
196
|
+
this.database
|
|
197
|
+
.prepare(`
|
|
198
|
+
INSERT INTO tasks(id, data, created_at, updated_at)
|
|
199
|
+
VALUES (?, ?, ?, ?)
|
|
200
|
+
ON CONFLICT(id) DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at
|
|
201
|
+
`)
|
|
202
|
+
.run(task.id, JSON.stringify(task), task.createdAt, task.updatedAt);
|
|
203
|
+
}
|
|
204
|
+
getTask(id) {
|
|
205
|
+
const row = this.database
|
|
206
|
+
.prepare("SELECT data FROM tasks WHERE id = ?")
|
|
207
|
+
.get(id);
|
|
208
|
+
return row === undefined ? undefined : JSON.parse(row.data);
|
|
209
|
+
}
|
|
210
|
+
listTasks(limit = 50) {
|
|
211
|
+
const rows = this.database
|
|
212
|
+
.prepare("SELECT data FROM tasks ORDER BY updated_at DESC LIMIT ?")
|
|
213
|
+
.all(limit);
|
|
214
|
+
return rows.map((row) => JSON.parse(row.data));
|
|
215
|
+
}
|
|
216
|
+
saveTaskPayload(taskId, payload, at) {
|
|
217
|
+
const parsed = EncryptedPayloadSchema.parse(payload);
|
|
218
|
+
this.database
|
|
219
|
+
.prepare(`
|
|
220
|
+
INSERT INTO task_payloads(
|
|
221
|
+
task_id, request_payload, result_payload, created_at, updated_at
|
|
222
|
+
)
|
|
223
|
+
VALUES (?, ?, NULL, ?, ?)
|
|
224
|
+
ON CONFLICT(task_id) DO UPDATE SET
|
|
225
|
+
request_payload = excluded.request_payload,
|
|
226
|
+
updated_at = excluded.updated_at
|
|
227
|
+
`)
|
|
228
|
+
.run(taskId, JSON.stringify(parsed), at, at);
|
|
229
|
+
}
|
|
230
|
+
getTaskPayload(taskId) {
|
|
231
|
+
const row = this.database
|
|
232
|
+
.prepare("SELECT request_payload AS data FROM task_payloads WHERE task_id = ?")
|
|
233
|
+
.get(taskId);
|
|
234
|
+
return row === undefined
|
|
235
|
+
? undefined
|
|
236
|
+
: parseStored(row.data, EncryptedPayloadSchema, "stored_task_payload_invalid");
|
|
237
|
+
}
|
|
238
|
+
saveTaskExecutionResult(task, payload) {
|
|
239
|
+
const parsed = EncryptedPayloadSchema.parse(payload);
|
|
240
|
+
this.transaction(() => {
|
|
241
|
+
this.saveTask(task);
|
|
242
|
+
const result = this.database
|
|
243
|
+
.prepare(`
|
|
244
|
+
UPDATE task_payloads
|
|
245
|
+
SET result_payload = ?, updated_at = ?
|
|
246
|
+
WHERE task_id = ?
|
|
247
|
+
`)
|
|
248
|
+
.run(JSON.stringify(parsed), task.updatedAt, task.id);
|
|
249
|
+
if (Number(result.changes) !== 1) {
|
|
250
|
+
throw new Error("task_payload_not_found");
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
getTaskResult(taskId) {
|
|
255
|
+
const row = this.database
|
|
256
|
+
.prepare("SELECT result_payload AS data FROM task_payloads WHERE task_id = ?")
|
|
257
|
+
.get(taskId);
|
|
258
|
+
return row === undefined || row.data === null
|
|
259
|
+
? undefined
|
|
260
|
+
: parseStored(row.data, EncryptedPayloadSchema, "stored_task_result_invalid");
|
|
261
|
+
}
|
|
262
|
+
deleteTaskPayload(taskId) {
|
|
263
|
+
this.database
|
|
264
|
+
.prepare("DELETE FROM task_payloads WHERE task_id = ?")
|
|
265
|
+
.run(taskId);
|
|
266
|
+
}
|
|
267
|
+
listInterruptedTasks() {
|
|
268
|
+
const rows = this.database
|
|
269
|
+
.prepare(`
|
|
270
|
+
SELECT data FROM tasks
|
|
271
|
+
WHERE json_extract(data, '$.status') IN ('running', 'verifying')
|
|
272
|
+
ORDER BY updated_at
|
|
273
|
+
`)
|
|
274
|
+
.all();
|
|
275
|
+
return rows.map((row) => JSON.parse(row.data));
|
|
276
|
+
}
|
|
277
|
+
getWorkflowPayload(id, version) {
|
|
278
|
+
const row = this.database
|
|
279
|
+
.prepare(`
|
|
280
|
+
SELECT payload AS data FROM workflow_payloads
|
|
281
|
+
WHERE workflow_id = ? AND workflow_version = ?
|
|
282
|
+
`)
|
|
283
|
+
.get(id, version);
|
|
284
|
+
return row === undefined
|
|
285
|
+
? undefined
|
|
286
|
+
: parseStored(row.data, EncryptedPayloadSchema, "stored_workflow_payload_invalid");
|
|
287
|
+
}
|
|
288
|
+
createWorkflow(redactedDefinition, payload, run, events) {
|
|
289
|
+
const definition = WorkflowDefinitionSchema.parse(redactedDefinition);
|
|
290
|
+
const sealed = EncryptedPayloadSchema.parse(payload);
|
|
291
|
+
const projection = WorkflowRunSchema.parse(run);
|
|
292
|
+
const parsedEvents = events.map((item) => WorkflowEventSchema.parse(item));
|
|
293
|
+
if (definition.id !== projection.definitionId ||
|
|
294
|
+
definition.version !== projection.definitionVersion) {
|
|
295
|
+
throw new Error("workflow_definition_mismatch");
|
|
296
|
+
}
|
|
297
|
+
this.assertWorkflowEvents(projection.id, projection.traceId, 0, projection.stateVersion, parsedEvents);
|
|
298
|
+
this.transaction(() => {
|
|
299
|
+
this.database
|
|
300
|
+
.prepare(`
|
|
301
|
+
INSERT INTO workflow_definitions(id, version, data, created_at)
|
|
302
|
+
VALUES (?, ?, ?, ?)
|
|
303
|
+
`)
|
|
304
|
+
.run(definition.id, definition.version, JSON.stringify(definition), projection.createdAt);
|
|
305
|
+
this.database
|
|
306
|
+
.prepare(`
|
|
307
|
+
INSERT INTO workflow_payloads(
|
|
308
|
+
workflow_id, workflow_version, payload, created_at
|
|
309
|
+
)
|
|
310
|
+
VALUES (?, ?, ?, ?)
|
|
311
|
+
`)
|
|
312
|
+
.run(definition.id, definition.version, JSON.stringify(sealed), projection.createdAt);
|
|
313
|
+
this.database
|
|
314
|
+
.prepare(`
|
|
315
|
+
INSERT INTO workflow_runs(
|
|
316
|
+
id, definition_id, definition_version, state_version, data,
|
|
317
|
+
created_at, updated_at
|
|
318
|
+
)
|
|
319
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
320
|
+
`)
|
|
321
|
+
.run(projection.id, projection.definitionId, projection.definitionVersion, projection.stateVersion, JSON.stringify(projection), projection.createdAt, projection.updatedAt);
|
|
322
|
+
for (const item of parsedEvents)
|
|
323
|
+
this.insertWorkflowEvent(item);
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
getWorkflowDefinition(id, version) {
|
|
327
|
+
const row = this.database
|
|
328
|
+
.prepare(`
|
|
329
|
+
SELECT data FROM workflow_definitions WHERE id = ? AND version = ?
|
|
330
|
+
`)
|
|
331
|
+
.get(id, version);
|
|
332
|
+
return row === undefined
|
|
333
|
+
? undefined
|
|
334
|
+
: parseStored(row.data, WorkflowDefinitionSchema, "stored_workflow_definition_invalid");
|
|
335
|
+
}
|
|
336
|
+
getWorkflowRun(id) {
|
|
337
|
+
const row = this.database
|
|
338
|
+
.prepare("SELECT data FROM workflow_runs WHERE id = ?")
|
|
339
|
+
.get(id);
|
|
340
|
+
return row === undefined
|
|
341
|
+
? undefined
|
|
342
|
+
: parseStored(row.data, WorkflowRunSchema, "stored_workflow_run_invalid");
|
|
343
|
+
}
|
|
344
|
+
listWorkflowRuns(statuses = []) {
|
|
345
|
+
const rows = statuses.length === 0
|
|
346
|
+
? this.database
|
|
347
|
+
.prepare("SELECT data FROM workflow_runs ORDER BY updated_at")
|
|
348
|
+
.all()
|
|
349
|
+
: this.database
|
|
350
|
+
.prepare(`
|
|
351
|
+
SELECT data FROM workflow_runs
|
|
352
|
+
WHERE json_extract(data, '$.status') IN (
|
|
353
|
+
${statuses.map(() => "?").join(", ")}
|
|
354
|
+
)
|
|
355
|
+
ORDER BY updated_at
|
|
356
|
+
`)
|
|
357
|
+
.all(...statuses);
|
|
358
|
+
return rows.map((row) => parseStored(row.data, WorkflowRunSchema, "stored_workflow_run_invalid"));
|
|
359
|
+
}
|
|
360
|
+
listWorkflowEvents(id, afterSequence = 0) {
|
|
361
|
+
const rows = this.database
|
|
362
|
+
.prepare(`
|
|
363
|
+
SELECT data FROM workflow_events
|
|
364
|
+
WHERE aggregate_id = ? AND sequence > ?
|
|
365
|
+
ORDER BY sequence
|
|
366
|
+
`)
|
|
367
|
+
.all(id, afterSequence);
|
|
368
|
+
return rows.map((row) => parseStored(row.data, WorkflowEventSchema, "stored_workflow_event_invalid"));
|
|
369
|
+
}
|
|
370
|
+
saveWorkflowSnapshot(snapshot) {
|
|
371
|
+
const parsed = WorkflowSnapshotSchema.parse(snapshot);
|
|
372
|
+
this.database
|
|
373
|
+
.prepare(`
|
|
374
|
+
INSERT INTO workflow_snapshots(
|
|
375
|
+
workflow_id, sequence, data, created_at
|
|
376
|
+
)
|
|
377
|
+
VALUES (?, ?, ?, ?)
|
|
378
|
+
`)
|
|
379
|
+
.run(parsed.workflowId, parsed.sequence, JSON.stringify(parsed), parsed.createdAt);
|
|
380
|
+
}
|
|
381
|
+
getLatestWorkflowSnapshot(id) {
|
|
382
|
+
const row = this.database
|
|
383
|
+
.prepare(`
|
|
384
|
+
SELECT data FROM workflow_snapshots
|
|
385
|
+
WHERE workflow_id = ?
|
|
386
|
+
ORDER BY sequence DESC
|
|
387
|
+
LIMIT 1
|
|
388
|
+
`)
|
|
389
|
+
.get(id);
|
|
390
|
+
return row === undefined
|
|
391
|
+
? undefined
|
|
392
|
+
: parseStored(row.data, WorkflowSnapshotSchema, "stored_workflow_snapshot_invalid");
|
|
393
|
+
}
|
|
394
|
+
transitionWorkflow(id, expectedStateVersion, run, events) {
|
|
395
|
+
const projection = WorkflowRunSchema.parse(run);
|
|
396
|
+
const parsedEvents = events.map((item) => WorkflowEventSchema.parse(item));
|
|
397
|
+
this.assertWorkflowEvents(id, projection.traceId, expectedStateVersion, projection.stateVersion, parsedEvents);
|
|
398
|
+
if (projection.id !== id)
|
|
399
|
+
throw new Error("workflow_projection_id_mismatch");
|
|
400
|
+
this.transaction(() => {
|
|
401
|
+
const current = this.database
|
|
402
|
+
.prepare(`SELECT state_version AS stateVersion, data
|
|
403
|
+
FROM workflow_runs WHERE id = ?`)
|
|
404
|
+
.get(id);
|
|
405
|
+
if (current === undefined)
|
|
406
|
+
throw new Error("workflow_not_found");
|
|
407
|
+
if (current.stateVersion !== expectedStateVersion) {
|
|
408
|
+
throw new Error("workflow_state_conflict");
|
|
409
|
+
}
|
|
410
|
+
const stored = parseStored(current.data, WorkflowRunSchema, "stored_workflow_run_invalid");
|
|
411
|
+
if (projection.definitionId !== stored.definitionId ||
|
|
412
|
+
projection.definitionVersion !== stored.definitionVersion ||
|
|
413
|
+
projection.traceId !== stored.traceId) {
|
|
414
|
+
throw new Error("workflow_projection_identity_mismatch");
|
|
415
|
+
}
|
|
416
|
+
for (const item of parsedEvents)
|
|
417
|
+
this.insertWorkflowEvent(item);
|
|
418
|
+
const updated = this.database
|
|
419
|
+
.prepare(`
|
|
420
|
+
UPDATE workflow_runs
|
|
421
|
+
SET state_version = ?, data = ?, updated_at = ?
|
|
422
|
+
WHERE id = ? AND state_version = ?
|
|
423
|
+
`)
|
|
424
|
+
.run(projection.stateVersion, JSON.stringify(projection), projection.updatedAt, id, expectedStateVersion);
|
|
425
|
+
if (Number(updated.changes) !== 1) {
|
|
426
|
+
throw new Error("workflow_state_conflict");
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
commitIdempotency(key, taskId, attempt, at) {
|
|
431
|
+
const result = this.database
|
|
432
|
+
.prepare(`
|
|
433
|
+
INSERT OR IGNORE INTO idempotency_commits(
|
|
434
|
+
idempotency_key, task_id, attempt, committed_at
|
|
435
|
+
)
|
|
436
|
+
VALUES (?, ?, ?, ?)
|
|
437
|
+
`)
|
|
438
|
+
.run(key, taskId, attempt, at);
|
|
439
|
+
return Number(result.changes) === 1;
|
|
440
|
+
}
|
|
441
|
+
getIdempotencyCommit(key) {
|
|
442
|
+
return this.database
|
|
443
|
+
.prepare(`
|
|
444
|
+
SELECT task_id AS taskId, attempt, committed_at AS committedAt
|
|
445
|
+
FROM idempotency_commits
|
|
446
|
+
WHERE idempotency_key = ?
|
|
447
|
+
`)
|
|
448
|
+
.get(key);
|
|
449
|
+
}
|
|
450
|
+
assertWorkflowEvents(workflowId, traceId, previousStateVersion, nextStateVersion, events) {
|
|
451
|
+
if (events.some((item) => item.aggregateId !== workflowId || item.traceId !== traceId)) {
|
|
452
|
+
throw new Error("workflow_event_identity_invalid");
|
|
453
|
+
}
|
|
454
|
+
if (events.length === 0 ||
|
|
455
|
+
nextStateVersion !== previousStateVersion + events.length ||
|
|
456
|
+
events.some((item, index) => item.sequence !== previousStateVersion + index + 1)) {
|
|
457
|
+
throw new Error("workflow_event_sequence_invalid");
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
insertWorkflowEvent(event) {
|
|
461
|
+
this.database
|
|
462
|
+
.prepare(`
|
|
463
|
+
INSERT INTO workflow_events(
|
|
464
|
+
id, aggregate_id, sequence, trace_id, type, data, occurred_at
|
|
465
|
+
)
|
|
466
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
467
|
+
`)
|
|
468
|
+
.run(event.id, event.aggregateId, event.sequence, event.traceId, event.type, JSON.stringify(event), event.occurredAt);
|
|
469
|
+
}
|
|
470
|
+
saveReceipt(receipt) {
|
|
471
|
+
this.database
|
|
472
|
+
.prepare(`
|
|
473
|
+
INSERT INTO receipts(id, task_id, data, created_at)
|
|
474
|
+
VALUES (?, ?, ?, ?)
|
|
475
|
+
`)
|
|
476
|
+
.run(receipt.receiptId, receipt.taskId, JSON.stringify(receipt), receipt.endedAt);
|
|
477
|
+
}
|
|
478
|
+
getReceipt(id) {
|
|
479
|
+
const row = this.database
|
|
480
|
+
.prepare("SELECT data FROM receipts WHERE id = ?")
|
|
481
|
+
.get(id);
|
|
482
|
+
return row === undefined ? undefined : JSON.parse(row.data);
|
|
483
|
+
}
|
|
484
|
+
getReceiptsForTask(taskId) {
|
|
485
|
+
const rows = this.database
|
|
486
|
+
.prepare("SELECT data FROM receipts WHERE task_id = ? ORDER BY created_at")
|
|
487
|
+
.all(taskId);
|
|
488
|
+
return rows.map((row) => JSON.parse(row.data));
|
|
489
|
+
}
|
|
490
|
+
saveCertificate(certificate) {
|
|
491
|
+
this.database
|
|
492
|
+
.prepare(`
|
|
493
|
+
INSERT INTO certificates(id, task_id, data, created_at)
|
|
494
|
+
VALUES (?, ?, ?, ?)
|
|
495
|
+
ON CONFLICT(task_id) DO UPDATE SET
|
|
496
|
+
id = excluded.id,
|
|
497
|
+
data = excluded.data,
|
|
498
|
+
created_at = excluded.created_at
|
|
499
|
+
`)
|
|
500
|
+
.run(certificate.certificateId, certificate.taskId, JSON.stringify(certificate), certificate.createdAt);
|
|
501
|
+
}
|
|
502
|
+
getCertificateForTask(taskId) {
|
|
503
|
+
const row = this.database
|
|
504
|
+
.prepare("SELECT data FROM certificates WHERE task_id = ?")
|
|
505
|
+
.get(taskId);
|
|
506
|
+
return row === undefined
|
|
507
|
+
? undefined
|
|
508
|
+
: JSON.parse(row.data);
|
|
509
|
+
}
|
|
510
|
+
putMemory(memory) {
|
|
511
|
+
this.database
|
|
512
|
+
.prepare(`
|
|
513
|
+
INSERT INTO memories(
|
|
514
|
+
id, scope, key, value, source, confidence, tags, speaker, episode_id,
|
|
515
|
+
sequence, expires_at, supersedes_id, superseded_by, created_at,
|
|
516
|
+
updated_at
|
|
517
|
+
)
|
|
518
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
519
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
520
|
+
scope = excluded.scope,
|
|
521
|
+
key = excluded.key,
|
|
522
|
+
value = excluded.value,
|
|
523
|
+
source = excluded.source,
|
|
524
|
+
confidence = excluded.confidence,
|
|
525
|
+
tags = excluded.tags,
|
|
526
|
+
speaker = excluded.speaker,
|
|
527
|
+
episode_id = excluded.episode_id,
|
|
528
|
+
sequence = excluded.sequence,
|
|
529
|
+
expires_at = excluded.expires_at,
|
|
530
|
+
supersedes_id = excluded.supersedes_id,
|
|
531
|
+
superseded_by = excluded.superseded_by,
|
|
532
|
+
updated_at = excluded.updated_at
|
|
533
|
+
`)
|
|
534
|
+
.run(memory.id, memory.scope, memory.key, memory.value, memory.source, memory.confidence, JSON.stringify(memory.tags), memory.speaker ?? null, memory.episodeId ?? null, memory.sequence ?? null, memory.expiresAt ?? null, memory.supersedesId ?? null, memory.supersededBy ?? null, memory.createdAt, memory.updatedAt);
|
|
535
|
+
}
|
|
536
|
+
getMemory(id) {
|
|
537
|
+
const row = this.database
|
|
538
|
+
.prepare(`
|
|
539
|
+
SELECT id, scope, key, value, source, confidence, tags, speaker,
|
|
540
|
+
episode_id AS episodeId, sequence,
|
|
541
|
+
expires_at AS expiresAt, supersedes_id AS supersedesId,
|
|
542
|
+
superseded_by AS supersededBy,
|
|
543
|
+
created_at AS createdAt, updated_at AS updatedAt
|
|
544
|
+
FROM memories WHERE id = ?
|
|
545
|
+
`)
|
|
546
|
+
.get(id);
|
|
547
|
+
return row === undefined ? undefined : toMemoryRecord(row);
|
|
548
|
+
}
|
|
549
|
+
listMemories(scope, limit, includeSuperseded = false) {
|
|
550
|
+
const rows = this.database
|
|
551
|
+
.prepare(`
|
|
552
|
+
SELECT id, scope, key, value, source, confidence, tags, speaker,
|
|
553
|
+
episode_id AS episodeId, sequence,
|
|
554
|
+
expires_at AS expiresAt, supersedes_id AS supersedesId,
|
|
555
|
+
superseded_by AS supersededBy,
|
|
556
|
+
created_at AS createdAt, updated_at AS updatedAt
|
|
557
|
+
FROM memories
|
|
558
|
+
WHERE scope = ?
|
|
559
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
560
|
+
AND (? = 1 OR superseded_by IS NULL)
|
|
561
|
+
ORDER BY updated_at DESC
|
|
562
|
+
LIMIT ?
|
|
563
|
+
`)
|
|
564
|
+
.all(scope, new Date().toISOString(), includeSuperseded ? 1 : 0, limit);
|
|
565
|
+
return rows.map(toMemoryRecord);
|
|
566
|
+
}
|
|
567
|
+
memoryCandidates(scope, limit, includeSuperseded = false) {
|
|
568
|
+
const rows = this.database
|
|
569
|
+
.prepare(`
|
|
570
|
+
SELECT id, scope, key, value, source, confidence, tags, speaker,
|
|
571
|
+
episode_id AS episodeId, sequence,
|
|
572
|
+
expires_at AS expiresAt, supersedes_id AS supersedesId,
|
|
573
|
+
superseded_by AS supersededBy,
|
|
574
|
+
created_at AS createdAt, updated_at AS updatedAt
|
|
575
|
+
FROM memories
|
|
576
|
+
WHERE scope = ?
|
|
577
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
578
|
+
AND (? = 1 OR superseded_by IS NULL)
|
|
579
|
+
ORDER BY updated_at DESC
|
|
580
|
+
LIMIT ?
|
|
581
|
+
`)
|
|
582
|
+
.all(scope, new Date().toISOString(), includeSuperseded ? 1 : 0, limit);
|
|
583
|
+
return rows.map(toMemoryRecord);
|
|
584
|
+
}
|
|
585
|
+
supersedeMemory(id, scope, supersededBy) {
|
|
586
|
+
const result = this.database
|
|
587
|
+
.prepare(`
|
|
588
|
+
UPDATE memories
|
|
589
|
+
SET superseded_by = ?, updated_at = ?
|
|
590
|
+
WHERE id = ? AND scope = ? AND superseded_by IS NULL
|
|
591
|
+
`)
|
|
592
|
+
.run(supersededBy, new Date().toISOString(), id, scope);
|
|
593
|
+
return Number(result.changes) > 0;
|
|
594
|
+
}
|
|
595
|
+
deleteMemory(id, scope) {
|
|
596
|
+
const result = this.database
|
|
597
|
+
.prepare("DELETE FROM memories WHERE id = ? AND scope = ?")
|
|
598
|
+
.run(id, scope);
|
|
599
|
+
return Number(result.changes) > 0;
|
|
600
|
+
}
|
|
601
|
+
clearMemories(scope) {
|
|
602
|
+
const result = this.database
|
|
603
|
+
.prepare("DELETE FROM memories WHERE scope = ?")
|
|
604
|
+
.run(scope);
|
|
605
|
+
return Number(result.changes);
|
|
606
|
+
}
|
|
607
|
+
close() {
|
|
608
|
+
this.database.close();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|