@melra/storage-sqlite 0.3.0-alpha.11 → 0.3.0-alpha.13
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/README.md +5 -1
- package/dist/index.d.ts +63 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +246 -29
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -309
- package/dist/index.test.js.map +0 -1
- package/dist/workflow-store.test.d.ts +0 -2
- package/dist/workflow-store.test.d.ts.map +0 -1
- package/dist/workflow-store.test.js +0 -277
- package/dist/workflow-store.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npm install @melra/storage-sqlite
|
|
|
11
11
|
```ts
|
|
12
12
|
import { SqliteStore } from "@melra/storage-sqlite";
|
|
13
13
|
|
|
14
|
-
const store = new SqliteStore(`${dataDirectory}/melra.
|
|
14
|
+
const store = new SqliteStore(`${dataDirectory}/melra.sqlite`);
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
Workflow transitions append events and update the projection inside one
|
|
@@ -29,6 +29,10 @@ Persisted values are the redacted copies. Exact task requests and adapter result
|
|
|
29
29
|
are sealed with AES-256-GCM bound to record identity and purpose, so reading the
|
|
30
30
|
database file does not hand over the payloads.
|
|
31
31
|
|
|
32
|
+
Pass `{ readOnly: true }` to open an existing database without creating it or
|
|
33
|
+
taking a write lock — what `melra tasks`, `watch`, and `status` do beside a
|
|
34
|
+
running server.
|
|
35
|
+
|
|
32
36
|
Schema changes need a new migration rather than an edit to an existing one.
|
|
33
37
|
|
|
34
38
|
Uses `node:sqlite`, which emits an experimental warning on Node 22 and 24.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
2
|
import type { MemoryScope, TaskRecord } from "./types.js";
|
|
3
|
-
import { type EncryptedPayload, type WorkflowDefinition, type WorkflowEvent, type WorkflowRun, type WorkflowSnapshot } from "@melra/protocol";
|
|
3
|
+
import { type EncryptedPayload, type ApprovalDecision, type WorkflowDefinition, type WorkflowEvent, type WorkflowRun, type WorkflowSnapshot } from "@melra/protocol";
|
|
4
4
|
import type { ActionReceipt, ExecutionCertificate } from "@melra/receipt-schema";
|
|
5
5
|
export interface MemoryRecord {
|
|
6
6
|
id: string;
|
|
@@ -27,14 +27,55 @@ interface IdempotencyCommitRow {
|
|
|
27
27
|
export declare class SqliteStore {
|
|
28
28
|
readonly path: string;
|
|
29
29
|
readonly database: DatabaseSync;
|
|
30
|
-
|
|
30
|
+
private owner?;
|
|
31
|
+
/**
|
|
32
|
+
* Tasks something in this process is executing or recovering through this
|
|
33
|
+
* store. Ownership is per store, so this is too: a row this store owns that
|
|
34
|
+
* is not in here was orphaned by a write that failed, and may be taken back.
|
|
35
|
+
*/
|
|
36
|
+
readonly inFlight: Set<string>;
|
|
37
|
+
/**
|
|
38
|
+
* `readOnly` is for observers (`melra tasks`, `status`, `watch`) that sit
|
|
39
|
+
* beside a live server. Such a connection never migrates, never switches the
|
|
40
|
+
* journal mode, and cannot take a write lock, so a poll can never stall a
|
|
41
|
+
* writer — in WAL mode a reader and a writer do not block each other. The
|
|
42
|
+
* database must already exist; an observer has no business creating one.
|
|
43
|
+
*/
|
|
44
|
+
constructor(path: string, options?: {
|
|
45
|
+
readOnly?: boolean;
|
|
46
|
+
});
|
|
31
47
|
private migrate;
|
|
32
48
|
private applyMigration;
|
|
33
49
|
private transaction;
|
|
34
50
|
private addColumnIfMissing;
|
|
35
|
-
|
|
51
|
+
/** Without `owner`, a save keeps whichever owner the row already has. */
|
|
52
|
+
saveTask(task: TaskRecord, owner?: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* This store's owner id, created on first use. "Alive" means someone holds
|
|
55
|
+
* an exclusive SQLite lock on `<db>-owners/<id>`; the kernel drops that lock
|
|
56
|
+
* however the process ends, so a crash needs no clock or heartbeat to show.
|
|
57
|
+
* The lock is taken before the id is returned, so no row can ever name an
|
|
58
|
+
* owner whose lock was not yet held.
|
|
59
|
+
*/
|
|
60
|
+
ownerId(): string;
|
|
61
|
+
/**
|
|
62
|
+
* Deletes lock files whose process is gone, which a crash or an exit without
|
|
63
|
+
* `close()` leaves behind. Only files older than a minute: a younger one may
|
|
64
|
+
* belong to a process that has created it and not yet locked it.
|
|
65
|
+
*/
|
|
66
|
+
private pruneOwners;
|
|
67
|
+
private ownerAlive;
|
|
68
|
+
/**
|
|
69
|
+
* Takes over a running or verifying task whose owner is gone, or returns
|
|
70
|
+
* undefined. The compare-and-set on the owner means that of two recoverers
|
|
71
|
+
* only one gets the task, and a live owner's task is never handed out. This
|
|
72
|
+
* store's own rows count as abandoned when nothing here has them in flight.
|
|
73
|
+
*/
|
|
74
|
+
claimInterruptedTask(id: string): TaskRecord | undefined;
|
|
36
75
|
getTask(id: string): TaskRecord | undefined;
|
|
37
|
-
listTasks(limit?: number): TaskRecord[];
|
|
76
|
+
listTasks(limit?: number, status?: TaskRecord["status"]): TaskRecord[];
|
|
77
|
+
/** Counted in SQL so a summary does not have to load every task to add them up. */
|
|
78
|
+
taskStatusCounts(): Record<string, number>;
|
|
38
79
|
saveTaskPayload(taskId: string, payload: EncryptedPayload, at: string): void;
|
|
39
80
|
getTaskPayload(taskId: string): EncryptedPayload | undefined;
|
|
40
81
|
saveTaskExecutionResult(task: TaskRecord, payload: EncryptedPayload): void;
|
|
@@ -42,7 +83,12 @@ export declare class SqliteStore {
|
|
|
42
83
|
deleteTaskPayload(taskId: string): void;
|
|
43
84
|
listInterruptedTasks(): TaskRecord[];
|
|
44
85
|
getWorkflowPayload(id: string, version: number): EncryptedPayload | undefined;
|
|
45
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Store a new run. `payload` undefined means the definition is already
|
|
88
|
+
* stored under this id and version (the caller has checked it is the same
|
|
89
|
+
* one), so only the run and its events are written.
|
|
90
|
+
*/
|
|
91
|
+
createWorkflow(redactedDefinition: WorkflowDefinition, payload: EncryptedPayload | undefined, run: WorkflowRun, events: WorkflowEvent[]): void;
|
|
46
92
|
getWorkflowDefinition(id: string, version: number): WorkflowDefinition | undefined;
|
|
47
93
|
getWorkflowRun(id: string): WorkflowRun | undefined;
|
|
48
94
|
listWorkflowRuns(statuses?: WorkflowRun["status"][]): WorkflowRun[];
|
|
@@ -51,8 +97,17 @@ export declare class SqliteStore {
|
|
|
51
97
|
getLatestWorkflowSnapshot(id: string): WorkflowSnapshot | undefined;
|
|
52
98
|
transitionWorkflow(id: string, expectedStateVersion: number, run: WorkflowRun, events: WorkflowEvent[]): void;
|
|
53
99
|
acquireWorkflowLease(workflowId: string, owner: string, now: string, expiresAt: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* `acquireWorkflowLease`, saying whether a lease was already there. Recovery
|
|
102
|
+
* needs that: an expired lease it replaced marks a run still waiting for a
|
|
103
|
+
* repair, while a lease it created means whoever held one released it.
|
|
104
|
+
*/
|
|
105
|
+
takeWorkflowLease(workflowId: string, owner: string, now: string, expiresAt: string): "refused" | "created" | "replaced";
|
|
54
106
|
renewWorkflowLease(workflowId: string, owner: string, expiresAt: string): boolean;
|
|
55
107
|
releaseWorkflowLease(workflowId: string, owner: string): void;
|
|
108
|
+
/** Gives back a claim this store holds, so any process may take the task next. */
|
|
109
|
+
releaseTaskClaim(id: string): void;
|
|
110
|
+
expiredWorkflowLeases(now: string): string[];
|
|
56
111
|
getWorkflowLease(workflowId: string): {
|
|
57
112
|
owner: string;
|
|
58
113
|
acquiredAt: string;
|
|
@@ -69,6 +124,9 @@ export declare class SqliteStore {
|
|
|
69
124
|
* never at plan time — so a refused, failed, or cancelled operation leaves
|
|
70
125
|
* the budget where it found it.
|
|
71
126
|
*/
|
|
127
|
+
/** False when a decision for this approval was already recorded. */
|
|
128
|
+
recordApprovalDecision(decision: ApprovalDecision): boolean;
|
|
129
|
+
getApprovalDecision(approvalId: string): ApprovalDecision | undefined;
|
|
72
130
|
recordCapabilityUse(grantId: string, taskId: string, amount: number, at: string): void;
|
|
73
131
|
/**
|
|
74
132
|
* What a grant has spent: every operation ever, and the declared amounts
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 XAGI Labs Private Limited
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
5
6
|
import { DatabaseSync } from "node:sqlite";
|
|
6
7
|
import { EncryptedPayloadSchema, WorkflowDefinitionSchema, WorkflowEventSchema, WorkflowRunSchema, WorkflowSnapshotSchema, } from "@melra/protocol";
|
|
7
8
|
function toMemoryRecord(row) {
|
|
@@ -34,8 +35,29 @@ function parseStored(data, schema, error) {
|
|
|
34
35
|
export class SqliteStore {
|
|
35
36
|
path;
|
|
36
37
|
database;
|
|
37
|
-
|
|
38
|
+
// Held as a field on purpose: a garbage-collected handle would drop the lock
|
|
39
|
+
// and make this live process look dead to every other one.
|
|
40
|
+
owner;
|
|
41
|
+
/**
|
|
42
|
+
* Tasks something in this process is executing or recovering through this
|
|
43
|
+
* store. Ownership is per store, so this is too: a row this store owns that
|
|
44
|
+
* is not in here was orphaned by a write that failed, and may be taken back.
|
|
45
|
+
*/
|
|
46
|
+
inFlight = new Set();
|
|
47
|
+
/**
|
|
48
|
+
* `readOnly` is for observers (`melra tasks`, `status`, `watch`) that sit
|
|
49
|
+
* beside a live server. Such a connection never migrates, never switches the
|
|
50
|
+
* journal mode, and cannot take a write lock, so a poll can never stall a
|
|
51
|
+
* writer — in WAL mode a reader and a writer do not block each other. The
|
|
52
|
+
* database must already exist; an observer has no business creating one.
|
|
53
|
+
*/
|
|
54
|
+
constructor(path, options = {}) {
|
|
38
55
|
this.path = path;
|
|
56
|
+
if (options.readOnly === true) {
|
|
57
|
+
this.database = new DatabaseSync(path, { readOnly: true });
|
|
58
|
+
this.database.exec("PRAGMA busy_timeout = 5000");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
39
61
|
if (path !== ":memory:")
|
|
40
62
|
mkdirSync(dirname(path), { recursive: true });
|
|
41
63
|
this.database = new DatabaseSync(path);
|
|
@@ -196,6 +218,27 @@ export class SqliteStore {
|
|
|
196
218
|
);
|
|
197
219
|
CREATE INDEX IF NOT EXISTS idx_capability_usage_window
|
|
198
220
|
ON capability_usage(grant_id, committed_at);
|
|
221
|
+
`);
|
|
222
|
+
// Migration 4 records which process is running each task, so recovery can
|
|
223
|
+
// tell a live peer's work from a crashed one's. The index expression must
|
|
224
|
+
// match the status filters' text exactly for SQLite to use it.
|
|
225
|
+
this.applyMigration(4, `
|
|
226
|
+
ALTER TABLE tasks ADD COLUMN owner TEXT;
|
|
227
|
+
CREATE INDEX IF NOT EXISTS tasks_status
|
|
228
|
+
ON tasks(json_extract(data, '$.status'));
|
|
229
|
+
`);
|
|
230
|
+
// Migration 5 records operator approval decisions. Insert-once, and kept
|
|
231
|
+
// off TaskRecord, because a task row is a whole-record write where the
|
|
232
|
+
// last writer wins across processes; a decision must not be lost to one.
|
|
233
|
+
this.applyMigration(5, `
|
|
234
|
+
CREATE TABLE IF NOT EXISTS approval_decisions (
|
|
235
|
+
approval_id TEXT PRIMARY KEY,
|
|
236
|
+
task_id TEXT NOT NULL,
|
|
237
|
+
render_digest TEXT NOT NULL,
|
|
238
|
+
channel TEXT NOT NULL,
|
|
239
|
+
approver TEXT NOT NULL,
|
|
240
|
+
decided_at TEXT NOT NULL
|
|
241
|
+
);
|
|
199
242
|
`);
|
|
200
243
|
}
|
|
201
244
|
applyMigration(version, statements) {
|
|
@@ -231,14 +274,111 @@ export class SqliteStore {
|
|
|
231
274
|
this.database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
232
275
|
}
|
|
233
276
|
}
|
|
234
|
-
|
|
277
|
+
/** Without `owner`, a save keeps whichever owner the row already has. */
|
|
278
|
+
saveTask(task, owner) {
|
|
235
279
|
this.database
|
|
236
280
|
.prepare(`
|
|
237
|
-
INSERT INTO tasks(id, data, created_at, updated_at)
|
|
238
|
-
VALUES (?, ?, ?, ?)
|
|
239
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
281
|
+
INSERT INTO tasks(id, data, created_at, updated_at, owner)
|
|
282
|
+
VALUES (?, ?, ?, ?, ?)
|
|
283
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
284
|
+
data = excluded.data,
|
|
285
|
+
updated_at = excluded.updated_at,
|
|
286
|
+
owner = COALESCE(excluded.owner, tasks.owner)
|
|
287
|
+
`)
|
|
288
|
+
.run(task.id, JSON.stringify(task), task.createdAt, task.updatedAt, owner ?? null);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* This store's owner id, created on first use. "Alive" means someone holds
|
|
292
|
+
* an exclusive SQLite lock on `<db>-owners/<id>`; the kernel drops that lock
|
|
293
|
+
* however the process ends, so a crash needs no clock or heartbeat to show.
|
|
294
|
+
* The lock is taken before the id is returned, so no row can ever name an
|
|
295
|
+
* owner whose lock was not yet held.
|
|
296
|
+
*/
|
|
297
|
+
ownerId() {
|
|
298
|
+
if (this.owner !== undefined)
|
|
299
|
+
return this.owner.id;
|
|
300
|
+
const id = randomUUID();
|
|
301
|
+
if (this.path === ":memory:")
|
|
302
|
+
return (this.owner = { id }).id;
|
|
303
|
+
const directory = `${this.path}-owners`;
|
|
304
|
+
mkdirSync(directory, { recursive: true });
|
|
305
|
+
this.pruneOwners(directory);
|
|
306
|
+
const file = join(directory, id);
|
|
307
|
+
const lock = new DatabaseSync(file);
|
|
308
|
+
// Never open these files through node:fs in the holding process: POSIX
|
|
309
|
+
// drops all of a process's locks on an inode when any descriptor to it
|
|
310
|
+
// closes. SQLite defers its own closes, so its probes are safe, and the
|
|
311
|
+
// server reserves this directory from its file adapters. The write is
|
|
312
|
+
// synced, so no row can name a file a power cut left unreadable.
|
|
313
|
+
lock.exec("PRAGMA locking_mode = EXCLUSIVE; PRAGMA journal_mode = MEMORY; PRAGMA user_version = 1");
|
|
314
|
+
this.owner = { id, lock, file };
|
|
315
|
+
return id;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Deletes lock files whose process is gone, which a crash or an exit without
|
|
319
|
+
* `close()` leaves behind. Only files older than a minute: a younger one may
|
|
320
|
+
* belong to a process that has created it and not yet locked it.
|
|
321
|
+
*/
|
|
322
|
+
pruneOwners(directory) {
|
|
323
|
+
for (const name of readdirSync(directory)) {
|
|
324
|
+
const file = join(directory, name);
|
|
325
|
+
try {
|
|
326
|
+
if (Date.now() - statSync(file).mtimeMs < 60_000)
|
|
327
|
+
continue;
|
|
328
|
+
if (!this.ownerAlive(name))
|
|
329
|
+
rmSync(file, { force: true });
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
// Gone already, or still open in a peer's probe on Windows.
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
ownerAlive(id) {
|
|
337
|
+
if (id === this.owner?.id)
|
|
338
|
+
return true;
|
|
339
|
+
const file = join(`${this.path}-owners`, id);
|
|
340
|
+
if (!existsSync(file))
|
|
341
|
+
return false;
|
|
342
|
+
let probe;
|
|
343
|
+
try {
|
|
344
|
+
// node:sqlite's busy timeout is 0, so a held lock answers at once.
|
|
345
|
+
probe = new DatabaseSync(file, { readOnly: true });
|
|
346
|
+
probe.prepare("SELECT count(*) FROM sqlite_master").get();
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// Busy means alive. Any other failure counts as alive too: recovery never
|
|
351
|
+
// rewrites a task on a guess.
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
finally {
|
|
355
|
+
probe?.close();
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Takes over a running or verifying task whose owner is gone, or returns
|
|
360
|
+
* undefined. The compare-and-set on the owner means that of two recoverers
|
|
361
|
+
* only one gets the task, and a live owner's task is never handed out. This
|
|
362
|
+
* store's own rows count as abandoned when nothing here has them in flight.
|
|
363
|
+
*/
|
|
364
|
+
claimInterruptedTask(id) {
|
|
365
|
+
const row = this.database
|
|
366
|
+
.prepare("SELECT owner FROM tasks WHERE id = ?")
|
|
367
|
+
.get(id);
|
|
368
|
+
const orphaned = row?.owner === this.owner?.id && !this.inFlight.has(id);
|
|
369
|
+
if (row === undefined ||
|
|
370
|
+
(row.owner !== null && !orphaned && this.ownerAlive(row.owner))) {
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
const claimed = this.database
|
|
374
|
+
.prepare(`
|
|
375
|
+
UPDATE tasks SET owner = ?
|
|
376
|
+
WHERE id = ? AND owner IS ?
|
|
377
|
+
AND json_extract(data, '$.status') IN ('running', 'verifying')
|
|
378
|
+
RETURNING data
|
|
240
379
|
`)
|
|
241
|
-
.
|
|
380
|
+
.get(this.ownerId(), id, row.owner);
|
|
381
|
+
return claimed === undefined ? undefined : JSON.parse(claimed.data);
|
|
242
382
|
}
|
|
243
383
|
getTask(id) {
|
|
244
384
|
const row = this.database
|
|
@@ -246,12 +386,25 @@ export class SqliteStore {
|
|
|
246
386
|
.get(id);
|
|
247
387
|
return row === undefined ? undefined : JSON.parse(row.data);
|
|
248
388
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
389
|
+
// The status filter runs in SQL, before the limit: filtering the newest N
|
|
390
|
+
// afterwards would silently drop older matches.
|
|
391
|
+
listTasks(limit = 50, status) {
|
|
392
|
+
const rows = (status === undefined
|
|
393
|
+
? this.database
|
|
394
|
+
.prepare("SELECT data FROM tasks ORDER BY updated_at DESC LIMIT ?")
|
|
395
|
+
.all(limit)
|
|
396
|
+
: this.database
|
|
397
|
+
.prepare("SELECT data FROM tasks WHERE json_extract(data, '$.status') = ? ORDER BY updated_at DESC LIMIT ?")
|
|
398
|
+
.all(status, limit));
|
|
253
399
|
return rows.map((row) => JSON.parse(row.data));
|
|
254
400
|
}
|
|
401
|
+
/** Counted in SQL so a summary does not have to load every task to add them up. */
|
|
402
|
+
taskStatusCounts() {
|
|
403
|
+
const rows = this.database
|
|
404
|
+
.prepare("SELECT json_extract(data, '$.status') AS status, COUNT(*) AS count FROM tasks GROUP BY 1")
|
|
405
|
+
.all();
|
|
406
|
+
return Object.fromEntries(rows.map((row) => [row.status, Number(row.count)]));
|
|
407
|
+
}
|
|
255
408
|
saveTaskPayload(taskId, payload, at) {
|
|
256
409
|
const parsed = EncryptedPayloadSchema.parse(payload);
|
|
257
410
|
this.database
|
|
@@ -324,9 +477,17 @@ export class SqliteStore {
|
|
|
324
477
|
? undefined
|
|
325
478
|
: parseStored(row.data, EncryptedPayloadSchema, "stored_workflow_payload_invalid");
|
|
326
479
|
}
|
|
480
|
+
/**
|
|
481
|
+
* Store a new run. `payload` undefined means the definition is already
|
|
482
|
+
* stored under this id and version (the caller has checked it is the same
|
|
483
|
+
* one), so only the run and its events are written.
|
|
484
|
+
*/
|
|
327
485
|
createWorkflow(redactedDefinition, payload, run, events) {
|
|
328
486
|
const definition = WorkflowDefinitionSchema.parse(redactedDefinition);
|
|
329
|
-
const sealed = EncryptedPayloadSchema.parse(payload);
|
|
487
|
+
const sealed = payload === undefined ? undefined : EncryptedPayloadSchema.parse(payload);
|
|
488
|
+
if (sealed === undefined && this.getWorkflowPayload(definition.id, definition.version) === undefined) {
|
|
489
|
+
throw new Error("workflow_payload_not_found");
|
|
490
|
+
}
|
|
330
491
|
const projection = WorkflowRunSchema.parse(run);
|
|
331
492
|
const parsedEvents = events.map((item) => WorkflowEventSchema.parse(item));
|
|
332
493
|
if (definition.id !== projection.definitionId ||
|
|
@@ -335,20 +496,22 @@ export class SqliteStore {
|
|
|
335
496
|
}
|
|
336
497
|
this.assertWorkflowEvents(projection.id, projection.traceId, 0, projection.stateVersion, parsedEvents);
|
|
337
498
|
this.transaction(() => {
|
|
338
|
-
|
|
339
|
-
.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
.
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
499
|
+
if (sealed !== undefined) {
|
|
500
|
+
this.database
|
|
501
|
+
.prepare(`
|
|
502
|
+
INSERT INTO workflow_definitions(id, version, data, created_at)
|
|
503
|
+
VALUES (?, ?, ?, ?)
|
|
504
|
+
`)
|
|
505
|
+
.run(definition.id, definition.version, JSON.stringify(definition), projection.createdAt);
|
|
506
|
+
this.database
|
|
507
|
+
.prepare(`
|
|
508
|
+
INSERT INTO workflow_payloads(
|
|
509
|
+
workflow_id, workflow_version, payload, created_at
|
|
510
|
+
)
|
|
511
|
+
VALUES (?, ?, ?, ?)
|
|
512
|
+
`)
|
|
513
|
+
.run(definition.id, definition.version, JSON.stringify(sealed), projection.createdAt);
|
|
514
|
+
}
|
|
352
515
|
this.database
|
|
353
516
|
.prepare(`
|
|
354
517
|
INSERT INTO workflow_runs(
|
|
@@ -471,6 +634,14 @@ export class SqliteStore {
|
|
|
471
634
|
// data directory serialize here and exactly one wins the row. Leases expire
|
|
472
635
|
// so a killed process cannot strand a workflow forever.
|
|
473
636
|
acquireWorkflowLease(workflowId, owner, now, expiresAt) {
|
|
637
|
+
return this.takeWorkflowLease(workflowId, owner, now, expiresAt) !== "refused";
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* `acquireWorkflowLease`, saying whether a lease was already there. Recovery
|
|
641
|
+
* needs that: an expired lease it replaced marks a run still waiting for a
|
|
642
|
+
* repair, while a lease it created means whoever held one released it.
|
|
643
|
+
*/
|
|
644
|
+
takeWorkflowLease(workflowId, owner, now, expiresAt) {
|
|
474
645
|
return this.transaction(() => {
|
|
475
646
|
const existing = this.database
|
|
476
647
|
.prepare(`SELECT owner, expires_at AS expiresAt
|
|
@@ -479,7 +650,7 @@ export class SqliteStore {
|
|
|
479
650
|
if (existing !== undefined &&
|
|
480
651
|
existing.owner !== owner &&
|
|
481
652
|
existing.expiresAt > now) {
|
|
482
|
-
return
|
|
653
|
+
return "refused";
|
|
483
654
|
}
|
|
484
655
|
this.database
|
|
485
656
|
.prepare(`
|
|
@@ -493,7 +664,7 @@ export class SqliteStore {
|
|
|
493
664
|
expires_at = excluded.expires_at
|
|
494
665
|
`)
|
|
495
666
|
.run(workflowId, owner, now, expiresAt);
|
|
496
|
-
return
|
|
667
|
+
return existing === undefined ? "created" : "replaced";
|
|
497
668
|
});
|
|
498
669
|
}
|
|
499
670
|
renewWorkflowLease(workflowId, owner, expiresAt) {
|
|
@@ -508,6 +679,20 @@ export class SqliteStore {
|
|
|
508
679
|
.prepare("DELETE FROM workflow_leases WHERE workflow_id = ? AND owner = ?")
|
|
509
680
|
.run(workflowId, owner);
|
|
510
681
|
}
|
|
682
|
+
/** Gives back a claim this store holds, so any process may take the task next. */
|
|
683
|
+
releaseTaskClaim(id) {
|
|
684
|
+
if (this.owner === undefined)
|
|
685
|
+
return;
|
|
686
|
+
this.database
|
|
687
|
+
.prepare("UPDATE tasks SET owner = NULL WHERE id = ? AND owner = ?")
|
|
688
|
+
.run(id, this.owner.id);
|
|
689
|
+
}
|
|
690
|
+
expiredWorkflowLeases(now) {
|
|
691
|
+
const rows = this.database
|
|
692
|
+
.prepare("SELECT workflow_id AS id FROM workflow_leases WHERE expires_at <= ?")
|
|
693
|
+
.all(now);
|
|
694
|
+
return rows.map((row) => row.id);
|
|
695
|
+
}
|
|
511
696
|
getWorkflowLease(workflowId) {
|
|
512
697
|
return this.database
|
|
513
698
|
.prepare(`
|
|
@@ -545,6 +730,28 @@ export class SqliteStore {
|
|
|
545
730
|
* never at plan time — so a refused, failed, or cancelled operation leaves
|
|
546
731
|
* the budget where it found it.
|
|
547
732
|
*/
|
|
733
|
+
/** False when a decision for this approval was already recorded. */
|
|
734
|
+
recordApprovalDecision(decision) {
|
|
735
|
+
const result = this.database
|
|
736
|
+
.prepare(`
|
|
737
|
+
INSERT OR IGNORE INTO approval_decisions(
|
|
738
|
+
approval_id, task_id, render_digest, channel, approver, decided_at
|
|
739
|
+
)
|
|
740
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
741
|
+
`)
|
|
742
|
+
.run(decision.approvalId, decision.taskId, decision.renderDigest, decision.channel, decision.approver, decision.decidedAt);
|
|
743
|
+
return Number(result.changes) === 1;
|
|
744
|
+
}
|
|
745
|
+
getApprovalDecision(approvalId) {
|
|
746
|
+
return this.database
|
|
747
|
+
.prepare(`
|
|
748
|
+
SELECT approval_id AS approvalId, task_id AS taskId,
|
|
749
|
+
render_digest AS renderDigest, channel, approver,
|
|
750
|
+
decided_at AS decidedAt
|
|
751
|
+
FROM approval_decisions WHERE approval_id = ?
|
|
752
|
+
`)
|
|
753
|
+
.get(approvalId);
|
|
754
|
+
}
|
|
548
755
|
recordCapabilityUse(grantId, taskId, amount, at) {
|
|
549
756
|
this.database
|
|
550
757
|
.prepare(`
|
|
@@ -782,6 +989,16 @@ export class SqliteStore {
|
|
|
782
989
|
});
|
|
783
990
|
}
|
|
784
991
|
close() {
|
|
992
|
+
if (this.owner?.lock !== undefined) {
|
|
993
|
+
this.owner.lock.close();
|
|
994
|
+
try {
|
|
995
|
+
rmSync(this.owner.file, { force: true });
|
|
996
|
+
}
|
|
997
|
+
catch {
|
|
998
|
+
// On Windows a peer's probe may have it open. An unlocked file left
|
|
999
|
+
// behind still reads as a dead owner.
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
785
1002
|
this.database.close();
|
|
786
1003
|
}
|
|
787
1004
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@melra/storage-sqlite",
|
|
3
|
-
"version": "0.3.0-alpha.
|
|
3
|
+
"version": "0.3.0-alpha.13",
|
|
4
4
|
"description": "Transactional SQLite task, workflow, event, payload, and evidence storage for MELRA.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
"dist"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@melra/
|
|
25
|
-
"@melra/
|
|
24
|
+
"@melra/protocol": "0.3.0-alpha.13",
|
|
25
|
+
"@melra/receipt-schema": "0.3.0-alpha.13"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
28
|
"build": "tsc -p tsconfig.json",
|
|
29
29
|
"clean": "rm -rf dist",
|
|
30
30
|
"test": "vitest run --no-file-parallelism --testTimeout=30000",
|
|
31
|
-
"typecheck": "tsc -p tsconfig.json
|
|
31
|
+
"typecheck": "tsc -p tsconfig.test.json"
|
|
32
32
|
}
|
|
33
33
|
}
|
package/dist/index.test.d.ts
DELETED
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
package/dist/index.test.js
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { DatabaseSync } from "node:sqlite";
|
|
7
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
8
|
-
import { TaskRequestSchema } from "@melra/protocol";
|
|
9
|
-
import { SqliteStore } from "./index.js";
|
|
10
|
-
let store;
|
|
11
|
-
let tempDirectory;
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
store?.close();
|
|
14
|
-
store = undefined;
|
|
15
|
-
if (tempDirectory !== undefined) {
|
|
16
|
-
rmSync(tempDirectory, { recursive: true, force: true });
|
|
17
|
-
tempDirectory = undefined;
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
describe("SqliteStore", () => {
|
|
21
|
-
it("migrates an existing alpha database exactly once", () => {
|
|
22
|
-
tempDirectory = mkdtempSync(join(tmpdir(), "melra-storage-migration-"));
|
|
23
|
-
const databasePath = join(tempDirectory, "melra.sqlite");
|
|
24
|
-
const legacy = new DatabaseSync(databasePath);
|
|
25
|
-
legacy.exec(`
|
|
26
|
-
CREATE TABLE tasks (
|
|
27
|
-
id TEXT PRIMARY KEY,
|
|
28
|
-
data TEXT NOT NULL,
|
|
29
|
-
created_at TEXT NOT NULL,
|
|
30
|
-
updated_at TEXT NOT NULL
|
|
31
|
-
);
|
|
32
|
-
CREATE TABLE receipts (
|
|
33
|
-
id TEXT PRIMARY KEY,
|
|
34
|
-
task_id TEXT NOT NULL,
|
|
35
|
-
data TEXT NOT NULL,
|
|
36
|
-
created_at TEXT NOT NULL
|
|
37
|
-
);
|
|
38
|
-
CREATE TABLE certificates (
|
|
39
|
-
id TEXT PRIMARY KEY,
|
|
40
|
-
task_id TEXT NOT NULL UNIQUE,
|
|
41
|
-
data TEXT NOT NULL,
|
|
42
|
-
created_at TEXT NOT NULL
|
|
43
|
-
);
|
|
44
|
-
CREATE TABLE memories (
|
|
45
|
-
id TEXT PRIMARY KEY,
|
|
46
|
-
scope TEXT NOT NULL,
|
|
47
|
-
key TEXT NOT NULL,
|
|
48
|
-
value TEXT NOT NULL,
|
|
49
|
-
source TEXT NOT NULL,
|
|
50
|
-
confidence REAL NOT NULL,
|
|
51
|
-
tags TEXT NOT NULL DEFAULT '[]',
|
|
52
|
-
speaker TEXT,
|
|
53
|
-
episode_id TEXT,
|
|
54
|
-
sequence INTEGER,
|
|
55
|
-
expires_at TEXT,
|
|
56
|
-
supersedes_id TEXT,
|
|
57
|
-
superseded_by TEXT,
|
|
58
|
-
created_at TEXT NOT NULL,
|
|
59
|
-
updated_at TEXT NOT NULL
|
|
60
|
-
);
|
|
61
|
-
`);
|
|
62
|
-
legacy.close();
|
|
63
|
-
store = new SqliteStore(databasePath);
|
|
64
|
-
const applied = store.database
|
|
65
|
-
.prepare("SELECT version FROM schema_migrations ORDER BY version")
|
|
66
|
-
.all().map((row) => row.version);
|
|
67
|
-
// Recorded once each, in order, with no gaps — the property this test is
|
|
68
|
-
// about. A literal list would only restate which migrations exist today and
|
|
69
|
-
// would fail on every unrelated one added afterwards.
|
|
70
|
-
expect(applied.length).toBeGreaterThanOrEqual(2);
|
|
71
|
-
expect(applied).toEqual(applied.map((_, index) => index + 1));
|
|
72
|
-
});
|
|
73
|
-
it("grants a workflow lease to one owner and expires it", () => {
|
|
74
|
-
store = new SqliteStore(":memory:");
|
|
75
|
-
const workflowId = "11111111-1111-4111-8111-111111111111";
|
|
76
|
-
const soon = new Date(Date.now() + 60_000).toISOString();
|
|
77
|
-
const now = new Date().toISOString();
|
|
78
|
-
expect(store.acquireWorkflowLease(workflowId, "a", now, soon)).toBe(true);
|
|
79
|
-
expect(store.acquireWorkflowLease(workflowId, "b", now, soon)).toBe(false);
|
|
80
|
-
// The holder re-entering is not contention.
|
|
81
|
-
expect(store.acquireWorkflowLease(workflowId, "a", now, soon)).toBe(true);
|
|
82
|
-
expect(store.getWorkflowLease(workflowId)?.owner).toBe("a");
|
|
83
|
-
// Renewal only works for the holder, so a loser cannot extend a lease it
|
|
84
|
-
// never won.
|
|
85
|
-
expect(store.renewWorkflowLease(workflowId, "b", soon)).toBe(false);
|
|
86
|
-
expect(store.renewWorkflowLease(workflowId, "a", soon)).toBe(true);
|
|
87
|
-
// A dead holder's lease lapses rather than stranding the workflow.
|
|
88
|
-
const past = new Date(Date.now() - 1_000).toISOString();
|
|
89
|
-
store.renewWorkflowLease(workflowId, "a", past);
|
|
90
|
-
expect(store.acquireWorkflowLease(workflowId, "b", now, soon)).toBe(true);
|
|
91
|
-
store.releaseWorkflowLease(workflowId, "b");
|
|
92
|
-
expect(store.getWorkflowLease(workflowId)).toBeUndefined();
|
|
93
|
-
});
|
|
94
|
-
it("persists tasks and scoped memories", () => {
|
|
95
|
-
store = new SqliteStore(":memory:");
|
|
96
|
-
const now = new Date().toISOString();
|
|
97
|
-
const request = TaskRequestSchema.parse({
|
|
98
|
-
goal: "Inspect the system",
|
|
99
|
-
operation: { kind: "system", action: "info" },
|
|
100
|
-
});
|
|
101
|
-
store.saveTask({
|
|
102
|
-
id: "605a411d-d39d-494b-a6de-0e8c3b96a564",
|
|
103
|
-
request,
|
|
104
|
-
status: "planned",
|
|
105
|
-
policyDecision: {
|
|
106
|
-
outcome: "allow",
|
|
107
|
-
effect: "read",
|
|
108
|
-
risk: "low",
|
|
109
|
-
reason: "read_only_operation",
|
|
110
|
-
policyVersion: "1",
|
|
111
|
-
traits: [],
|
|
112
|
-
},
|
|
113
|
-
receiptIds: [],
|
|
114
|
-
createdAt: now,
|
|
115
|
-
updatedAt: now,
|
|
116
|
-
});
|
|
117
|
-
expect(store.getTask("605a411d-d39d-494b-a6de-0e8c3b96a564")?.request.goal).toBe("Inspect the system");
|
|
118
|
-
store.putMemory({
|
|
119
|
-
id: "8170fc74-9885-4ee5-973e-161fa441e510",
|
|
120
|
-
scope: "workspace",
|
|
121
|
-
key: "runtime",
|
|
122
|
-
value: "MELRA uses SQLite",
|
|
123
|
-
source: "test",
|
|
124
|
-
confidence: 0.9,
|
|
125
|
-
tags: ["runtime"],
|
|
126
|
-
createdAt: now,
|
|
127
|
-
updatedAt: now,
|
|
128
|
-
});
|
|
129
|
-
expect(store.memoryCandidates("workspace", 5)).toHaveLength(1);
|
|
130
|
-
expect(store.listMemories("user", 5)).toHaveLength(0);
|
|
131
|
-
});
|
|
132
|
-
it("compacts only memories no read path can return", () => {
|
|
133
|
-
store = new SqliteStore(":memory:");
|
|
134
|
-
// `supersedeMemory` stamps `updated_at` from the real clock, so `now` has to
|
|
135
|
-
// come from the same clock — a pinned instant made the test pass or fail on
|
|
136
|
-
// the time of day it happened to run at.
|
|
137
|
-
const now = new Date(Date.now() + 1_000);
|
|
138
|
-
const old = new Date("2026-01-01T00:00:00.000Z").toISOString();
|
|
139
|
-
const base = {
|
|
140
|
-
scope: "workspace",
|
|
141
|
-
source: "test",
|
|
142
|
-
confidence: 0.9,
|
|
143
|
-
tags: [],
|
|
144
|
-
createdAt: old,
|
|
145
|
-
};
|
|
146
|
-
// Expired: filtered out of every query already, so nothing can miss it.
|
|
147
|
-
store.putMemory({
|
|
148
|
-
...base,
|
|
149
|
-
id: "11111111-1111-4111-8111-111111111111",
|
|
150
|
-
key: "expired",
|
|
151
|
-
value: "gone",
|
|
152
|
-
expiresAt: "2026-08-01T00:00:00.000Z",
|
|
153
|
-
updatedAt: old,
|
|
154
|
-
});
|
|
155
|
-
// A superseded chain: `stale` -> `middle` -> `head`, `head` still live.
|
|
156
|
-
store.putMemory({
|
|
157
|
-
...base,
|
|
158
|
-
id: "22222222-2222-4222-8222-222222222222",
|
|
159
|
-
key: "stale",
|
|
160
|
-
value: "v1",
|
|
161
|
-
updatedAt: old,
|
|
162
|
-
});
|
|
163
|
-
store.putMemory({
|
|
164
|
-
...base,
|
|
165
|
-
id: "33333333-3333-4333-8333-333333333333",
|
|
166
|
-
key: "middle",
|
|
167
|
-
value: "v2",
|
|
168
|
-
supersedesId: "22222222-2222-4222-8222-222222222222",
|
|
169
|
-
updatedAt: old,
|
|
170
|
-
});
|
|
171
|
-
store.putMemory({
|
|
172
|
-
...base,
|
|
173
|
-
id: "44444444-4444-4444-8444-444444444444",
|
|
174
|
-
key: "head",
|
|
175
|
-
value: "v3",
|
|
176
|
-
supersedesId: "33333333-3333-4333-8333-333333333333",
|
|
177
|
-
updatedAt: old,
|
|
178
|
-
});
|
|
179
|
-
store.supersedeMemory("22222222-2222-4222-8222-222222222222", "workspace", "33333333-3333-4333-8333-333333333333");
|
|
180
|
-
store.supersedeMemory("33333333-3333-4333-8333-333333333333", "workspace", "44444444-4444-4444-8444-444444444444");
|
|
181
|
-
// Live and untouched by compaction at the default ceiling of none.
|
|
182
|
-
store.putMemory({
|
|
183
|
-
...base,
|
|
184
|
-
id: "55555555-5555-4555-8555-555555555555",
|
|
185
|
-
key: "live",
|
|
186
|
-
value: "keep me",
|
|
187
|
-
updatedAt: old,
|
|
188
|
-
});
|
|
189
|
-
// `supersedeMemory` stamps `updated_at`, so the chain is only as old as the
|
|
190
|
-
// supersession — measure age from now rather than from the seeded dates.
|
|
191
|
-
const compacted = store.compactMemories("workspace", { maxAgeDays: 0, maxPerScope: 0 }, now);
|
|
192
|
-
expect(compacted.expired).toBe(1);
|
|
193
|
-
// `stale` goes; `middle` stays because live `head` still points at it, so
|
|
194
|
-
// `supersedesId` never dangles.
|
|
195
|
-
expect(compacted.superseded).toBe(1);
|
|
196
|
-
expect(compacted.evicted).toBe(0);
|
|
197
|
-
expect(store.getMemory("22222222-2222-4222-8222-222222222222")).toBeUndefined();
|
|
198
|
-
expect(store.getMemory("33333333-3333-4333-8333-333333333333")).toBeDefined();
|
|
199
|
-
expect(store.listMemories("workspace", 10).map((row) => row.key)).toEqual([
|
|
200
|
-
"head",
|
|
201
|
-
"live",
|
|
202
|
-
]);
|
|
203
|
-
// An opt-in ceiling evicts live memories, oldest first.
|
|
204
|
-
expect(store.compactMemories("workspace", { maxAgeDays: 30, maxPerScope: 1 }, now).evicted).toBe(1);
|
|
205
|
-
expect(store.listMemories("workspace", 10)).toHaveLength(1);
|
|
206
|
-
});
|
|
207
|
-
it("migrates existing memory tables before persisting episode metadata", () => {
|
|
208
|
-
tempDirectory = mkdtempSync(join(tmpdir(), "melra-memory-migration-"));
|
|
209
|
-
const databasePath = join(tempDirectory, "melra.sqlite");
|
|
210
|
-
const legacy = new DatabaseSync(databasePath);
|
|
211
|
-
legacy.exec(`
|
|
212
|
-
CREATE TABLE memories (
|
|
213
|
-
id TEXT PRIMARY KEY,
|
|
214
|
-
scope TEXT NOT NULL,
|
|
215
|
-
key TEXT NOT NULL,
|
|
216
|
-
value TEXT NOT NULL,
|
|
217
|
-
source TEXT NOT NULL,
|
|
218
|
-
confidence REAL NOT NULL,
|
|
219
|
-
tags TEXT NOT NULL DEFAULT '[]',
|
|
220
|
-
expires_at TEXT,
|
|
221
|
-
supersedes_id TEXT,
|
|
222
|
-
superseded_by TEXT,
|
|
223
|
-
created_at TEXT NOT NULL,
|
|
224
|
-
updated_at TEXT NOT NULL
|
|
225
|
-
);
|
|
226
|
-
`);
|
|
227
|
-
legacy.close();
|
|
228
|
-
store = new SqliteStore(databasePath);
|
|
229
|
-
const now = new Date().toISOString();
|
|
230
|
-
store.putMemory({
|
|
231
|
-
id: "4a9b5e8d-0b5b-4fe4-8db4-e2275c733f11",
|
|
232
|
-
scope: "workspace",
|
|
233
|
-
key: "answer",
|
|
234
|
-
value: "Adoption agencies.",
|
|
235
|
-
source: "test",
|
|
236
|
-
confidence: 1,
|
|
237
|
-
tags: [],
|
|
238
|
-
speaker: "Alex",
|
|
239
|
-
episodeId: "conversation-a",
|
|
240
|
-
sequence: 11,
|
|
241
|
-
createdAt: now,
|
|
242
|
-
updatedAt: now,
|
|
243
|
-
});
|
|
244
|
-
expect(store.getMemory("4a9b5e8d-0b5b-4fe4-8db4-e2275c733f11")).toMatchObject({
|
|
245
|
-
speaker: "Alex",
|
|
246
|
-
episodeId: "conversation-a",
|
|
247
|
-
sequence: 11,
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
it("keeps a superseded record while something live still points at it", () => {
|
|
251
|
-
store = new SqliteStore(":memory:");
|
|
252
|
-
const old = "5f1c1c30-0f3a-4a70-8f52-1b0a3d5d9c01";
|
|
253
|
-
const ancient = "2000-01-01T00:00:00.000Z";
|
|
254
|
-
store.putMemory({
|
|
255
|
-
id: old,
|
|
256
|
-
scope: "workspace",
|
|
257
|
-
key: "city",
|
|
258
|
-
value: "Chennai",
|
|
259
|
-
source: "test",
|
|
260
|
-
confidence: 1,
|
|
261
|
-
tags: [],
|
|
262
|
-
supersededBy: "5f1c1c30-0f3a-4a70-8f52-1b0a3d5d9c02",
|
|
263
|
-
createdAt: ancient,
|
|
264
|
-
updatedAt: ancient,
|
|
265
|
-
});
|
|
266
|
-
store.putMemory({
|
|
267
|
-
id: "5f1c1c30-0f3a-4a70-8f52-1b0a3d5d9c02",
|
|
268
|
-
scope: "workspace",
|
|
269
|
-
key: "city",
|
|
270
|
-
value: "Bengaluru",
|
|
271
|
-
source: "test",
|
|
272
|
-
confidence: 1,
|
|
273
|
-
tags: [],
|
|
274
|
-
supersedesId: old,
|
|
275
|
-
createdAt: ancient,
|
|
276
|
-
updatedAt: ancient,
|
|
277
|
-
});
|
|
278
|
-
// Deleting the old row here would leave the live record's `supersedesId`
|
|
279
|
-
// pointing at nothing, so the history it claims to have could not be read.
|
|
280
|
-
expect(store.compactMemories("workspace", { maxAgeDays: 0, maxPerScope: 0 })).toMatchObject({ superseded: 0 });
|
|
281
|
-
expect(store.getMemory(old)).toBeDefined();
|
|
282
|
-
});
|
|
283
|
-
it("evicts the oldest live memories only once a ceiling is set", () => {
|
|
284
|
-
store = new SqliteStore(":memory:");
|
|
285
|
-
const ids = ["a", "b", "c"].map((suffix, index) => `6d2e0000-0000-4000-8000-00000000000${index}${suffix}`);
|
|
286
|
-
ids.forEach((id, index) => {
|
|
287
|
-
const stamp = new Date(1_700_000_000_000 + index * 1_000).toISOString();
|
|
288
|
-
store.putMemory({
|
|
289
|
-
id,
|
|
290
|
-
scope: "workspace",
|
|
291
|
-
key: `k${index}`,
|
|
292
|
-
value: "v",
|
|
293
|
-
source: "test",
|
|
294
|
-
confidence: 1,
|
|
295
|
-
tags: [],
|
|
296
|
-
createdAt: stamp,
|
|
297
|
-
updatedAt: stamp,
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
// `maxPerScope` deletes records that are still readable, so the default of
|
|
301
|
-
// 0 has to mean "no ceiling" rather than "keep nothing".
|
|
302
|
-
expect(store.compactMemories("workspace", { maxAgeDays: 30, maxPerScope: 0 })).toMatchObject({ evicted: 0 });
|
|
303
|
-
expect(store.listMemories("workspace", 10)).toHaveLength(3);
|
|
304
|
-
expect(store.compactMemories("workspace", { maxAgeDays: 30, maxPerScope: 2 })).toMatchObject({ evicted: 1 });
|
|
305
|
-
expect(store.getMemory(ids[0])).toBeUndefined();
|
|
306
|
-
expect(store.getMemory(ids[2])).toBeDefined();
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-store.test.d.ts","sourceRoot":"","sources":["../src/workflow-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
-
import { EncryptedPayloadSchema, TaskRequestSchema, WorkflowDefinitionSchema, WorkflowEventSchema, WorkflowRunSchema, WorkflowSnapshotSchema, } from "@melra/protocol";
|
|
8
|
-
import { SqliteStore } from "./index.js";
|
|
9
|
-
const now = "2026-07-30T12:00:00.000Z";
|
|
10
|
-
const definitionId = "11111111-1111-4111-8111-111111111111";
|
|
11
|
-
const workflowId = "22222222-2222-4222-8222-222222222222";
|
|
12
|
-
const traceId = "33333333-3333-4333-8333-333333333333";
|
|
13
|
-
const taskId = "44444444-4444-4444-8444-444444444444";
|
|
14
|
-
const roots = [];
|
|
15
|
-
const stores = [];
|
|
16
|
-
afterEach(async () => {
|
|
17
|
-
for (const store of stores.splice(0))
|
|
18
|
-
store.close();
|
|
19
|
-
await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
|
|
20
|
-
});
|
|
21
|
-
function envelope(seed) {
|
|
22
|
-
return EncryptedPayloadSchema.parse({
|
|
23
|
-
version: 1,
|
|
24
|
-
algorithm: "aes-256-gcm",
|
|
25
|
-
iv: Buffer.from(`iv-${seed}`).toString("base64url"),
|
|
26
|
-
ciphertext: Buffer.from(`ciphertext-${seed}`).toString("base64url"),
|
|
27
|
-
tag: Buffer.from(`tag-${seed}`).toString("base64url"),
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
function definition(goal = "Inspect the runtime") {
|
|
31
|
-
return WorkflowDefinitionSchema.parse({
|
|
32
|
-
schemaVersion: "1.0.0",
|
|
33
|
-
id: definitionId,
|
|
34
|
-
version: 1,
|
|
35
|
-
name: "restart-safe",
|
|
36
|
-
nodes: [
|
|
37
|
-
{
|
|
38
|
-
id: "inspect",
|
|
39
|
-
type: "operation",
|
|
40
|
-
dependsOn: [],
|
|
41
|
-
request: {
|
|
42
|
-
goal,
|
|
43
|
-
operation: { kind: "system", action: "info" },
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
function run(stateVersion = 1, status = "draft") {
|
|
50
|
-
return WorkflowRunSchema.parse({
|
|
51
|
-
schemaVersion: "1.0.0",
|
|
52
|
-
id: workflowId,
|
|
53
|
-
definitionId,
|
|
54
|
-
definitionVersion: 1,
|
|
55
|
-
status,
|
|
56
|
-
stateVersion,
|
|
57
|
-
nodes: { inspect: { status: "pending" } },
|
|
58
|
-
traceId,
|
|
59
|
-
createdAt: now,
|
|
60
|
-
updatedAt: now,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
function event(sequence, id, type = "workflow.created") {
|
|
64
|
-
return WorkflowEventSchema.parse({
|
|
65
|
-
schemaVersion: "1.0.0",
|
|
66
|
-
id,
|
|
67
|
-
aggregateId: workflowId,
|
|
68
|
-
sequence,
|
|
69
|
-
traceId,
|
|
70
|
-
type,
|
|
71
|
-
data: { nodeId: "inspect" },
|
|
72
|
-
occurredAt: now,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
function task(status = "verifying") {
|
|
76
|
-
return {
|
|
77
|
-
id: taskId,
|
|
78
|
-
request: TaskRequestSchema.parse({
|
|
79
|
-
goal: "[REDACTED]",
|
|
80
|
-
operation: { kind: "system", action: "info" },
|
|
81
|
-
}),
|
|
82
|
-
status,
|
|
83
|
-
policyDecision: {
|
|
84
|
-
outcome: "allow",
|
|
85
|
-
effect: "read",
|
|
86
|
-
risk: "low",
|
|
87
|
-
reason: "read_only_operation",
|
|
88
|
-
policyVersion: "1",
|
|
89
|
-
traits: [],
|
|
90
|
-
},
|
|
91
|
-
receiptIds: [],
|
|
92
|
-
createdAt: now,
|
|
93
|
-
updatedAt: now,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
describe("durable workflow storage", () => {
|
|
97
|
-
it("stores only sealed execution payloads and reads validated records", async () => {
|
|
98
|
-
const root = await mkdtemp(join(tmpdir(), "melra-workflow-store-"));
|
|
99
|
-
roots.push(root);
|
|
100
|
-
const databasePath = join(root, "melra.sqlite");
|
|
101
|
-
const store = new SqliteStore(databasePath);
|
|
102
|
-
stores.push(store);
|
|
103
|
-
const initialRun = run();
|
|
104
|
-
const created = event(1, "55555555-5555-4555-8555-555555555555");
|
|
105
|
-
store.saveTask(task("planned"));
|
|
106
|
-
store.saveTaskPayload(taskId, envelope("one-time-secret-request"), now);
|
|
107
|
-
store.saveTaskExecutionResult(task(), envelope("one-time-secret-result"));
|
|
108
|
-
store.createWorkflow(definition("[REDACTED]"), envelope("one-time-secret-workflow"), initialRun, [created]);
|
|
109
|
-
store.saveWorkflowSnapshot(WorkflowSnapshotSchema.parse({
|
|
110
|
-
schemaVersion: "1.0.0",
|
|
111
|
-
workflowId,
|
|
112
|
-
sequence: 1,
|
|
113
|
-
run: initialRun,
|
|
114
|
-
createdAt: now,
|
|
115
|
-
}));
|
|
116
|
-
expect(store.getTaskPayload(taskId)).toEqual(envelope("one-time-secret-request"));
|
|
117
|
-
expect(store.getTaskResult(taskId)).toEqual(envelope("one-time-secret-result"));
|
|
118
|
-
expect(store.getWorkflowDefinition(definitionId, 1)?.name).toBe("restart-safe");
|
|
119
|
-
expect(store.getWorkflowPayload(definitionId, 1)).toEqual(envelope("one-time-secret-workflow"));
|
|
120
|
-
expect(store.getWorkflowRun(workflowId)).toEqual(initialRun);
|
|
121
|
-
expect(store.listWorkflowEvents(workflowId)).toEqual([created]);
|
|
122
|
-
expect(store.getLatestWorkflowSnapshot(workflowId)?.sequence).toBe(1);
|
|
123
|
-
expect(store.listInterruptedTasks()).toEqual([task()]);
|
|
124
|
-
expect(store.commitIdempotency("stable-key", taskId, 1, now)).toBe(true);
|
|
125
|
-
expect(store.commitIdempotency("stable-key", taskId, 2, now)).toBe(false);
|
|
126
|
-
expect(store.getIdempotencyCommit("stable-key")).toEqual({
|
|
127
|
-
taskId,
|
|
128
|
-
attempt: 1,
|
|
129
|
-
committedAt: now,
|
|
130
|
-
});
|
|
131
|
-
store.deleteTaskPayload(taskId);
|
|
132
|
-
expect(store.getTaskPayload(taskId)).toBeUndefined();
|
|
133
|
-
expect(store.getTaskResult(taskId)).toBeUndefined();
|
|
134
|
-
store.close();
|
|
135
|
-
stores.splice(stores.indexOf(store), 1);
|
|
136
|
-
expect((await readFile(databasePath)).toString()).not.toContain("one-time-secret");
|
|
137
|
-
});
|
|
138
|
-
it("appends events monotonically and rejects stale projections", () => {
|
|
139
|
-
const store = new SqliteStore(":memory:");
|
|
140
|
-
stores.push(store);
|
|
141
|
-
const initialRun = run();
|
|
142
|
-
const created = event(1, "55555555-5555-4555-8555-555555555555");
|
|
143
|
-
store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [created]);
|
|
144
|
-
const nextRun = run(2, "planned");
|
|
145
|
-
const planned = event(2, "66666666-6666-4666-8666-666666666666", "workflow.status_changed");
|
|
146
|
-
store.transitionWorkflow(workflowId, 1, nextRun, [planned]);
|
|
147
|
-
expect(store.listWorkflowEvents(workflowId).map((item) => item.sequence)).toEqual([1, 2]);
|
|
148
|
-
expect(store
|
|
149
|
-
.listWorkflowEvents(workflowId, 1)
|
|
150
|
-
.map((item) => item.sequence)).toEqual([2]);
|
|
151
|
-
expect(() => store.transitionWorkflow(workflowId, 1, nextRun, [
|
|
152
|
-
event(2, "77777777-7777-4777-8777-777777777777", "workflow.status_changed"),
|
|
153
|
-
])).toThrow("workflow_state_conflict");
|
|
154
|
-
});
|
|
155
|
-
it("rolls back the projection and every event when an append fails", () => {
|
|
156
|
-
const store = new SqliteStore(":memory:");
|
|
157
|
-
stores.push(store);
|
|
158
|
-
const initialRun = run();
|
|
159
|
-
const created = event(1, "55555555-5555-4555-8555-555555555555");
|
|
160
|
-
store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [created]);
|
|
161
|
-
const blocking = event(3, "99999999-9999-4999-8999-999999999999", "workflow.node_ready");
|
|
162
|
-
store.database
|
|
163
|
-
.prepare(`
|
|
164
|
-
INSERT INTO workflow_events(
|
|
165
|
-
id, aggregate_id, sequence, trace_id, type, data, occurred_at
|
|
166
|
-
)
|
|
167
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
168
|
-
`)
|
|
169
|
-
.run(blocking.id, blocking.aggregateId, blocking.sequence, blocking.traceId, blocking.type, JSON.stringify(blocking), blocking.occurredAt);
|
|
170
|
-
expect(() => store.transitionWorkflow(workflowId, 1, run(3, "running"), [
|
|
171
|
-
event(2, "88888888-8888-4888-8888-888888888888", "workflow.status_changed"),
|
|
172
|
-
event(3, "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "workflow.node_ready"),
|
|
173
|
-
])).toThrow();
|
|
174
|
-
expect(store.getWorkflowRun(workflowId)).toEqual(initialRun);
|
|
175
|
-
expect(store.listWorkflowEvents(workflowId).map((item) => item.sequence)).toEqual([1, 3]);
|
|
176
|
-
});
|
|
177
|
-
it("rolls back the task projection when result payload storage fails", () => {
|
|
178
|
-
const store = new SqliteStore(":memory:");
|
|
179
|
-
stores.push(store);
|
|
180
|
-
expect(() => store.saveTaskExecutionResult(task(), envelope("result"))).toThrow("task_payload_not_found");
|
|
181
|
-
expect(store.getTask(taskId)).toBeUndefined();
|
|
182
|
-
});
|
|
183
|
-
it("rejects mismatched definition and event identities", () => {
|
|
184
|
-
const definitionMismatch = new SqliteStore(":memory:");
|
|
185
|
-
stores.push(definitionMismatch);
|
|
186
|
-
const otherDefinition = WorkflowDefinitionSchema.parse({
|
|
187
|
-
...definition("[REDACTED]"),
|
|
188
|
-
id: "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
|
|
189
|
-
});
|
|
190
|
-
expect(() => definitionMismatch.createWorkflow(otherDefinition, envelope("workflow"), run(), [event(1, "55555555-5555-4555-8555-555555555555")])).toThrow("workflow_definition_mismatch");
|
|
191
|
-
expect(definitionMismatch.getWorkflowRun(workflowId)).toBeUndefined();
|
|
192
|
-
const traceMismatch = new SqliteStore(":memory:");
|
|
193
|
-
stores.push(traceMismatch);
|
|
194
|
-
const wrongTrace = WorkflowEventSchema.parse({
|
|
195
|
-
...event(1, "66666666-6666-4666-8666-666666666666"),
|
|
196
|
-
traceId: "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
|
|
197
|
-
});
|
|
198
|
-
expect(() => traceMismatch.createWorkflow(definition("[REDACTED]"), envelope("workflow"), run(), [wrongTrace])).toThrow("workflow_event_identity_invalid");
|
|
199
|
-
expect(traceMismatch.getWorkflowRun(workflowId)).toBeUndefined();
|
|
200
|
-
const projectionMismatch = new SqliteStore(":memory:");
|
|
201
|
-
stores.push(projectionMismatch);
|
|
202
|
-
const initialRun = run();
|
|
203
|
-
projectionMismatch.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [event(1, "77777777-7777-4777-8777-777777777777")]);
|
|
204
|
-
const wrongTraceRun = WorkflowRunSchema.parse({
|
|
205
|
-
...run(2, "planned"),
|
|
206
|
-
traceId: "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
|
|
207
|
-
});
|
|
208
|
-
const wrongTraceEvent = WorkflowEventSchema.parse({
|
|
209
|
-
...event(2, "88888888-8888-4888-8888-888888888888", "workflow.status_changed"),
|
|
210
|
-
traceId: wrongTraceRun.traceId,
|
|
211
|
-
});
|
|
212
|
-
expect(() => projectionMismatch.transitionWorkflow(workflowId, 1, wrongTraceRun, [wrongTraceEvent])).toThrow("workflow_projection_identity_mismatch");
|
|
213
|
-
expect(projectionMismatch.getWorkflowRun(workflowId)).toEqual(initialRun);
|
|
214
|
-
});
|
|
215
|
-
it.each([
|
|
216
|
-
[
|
|
217
|
-
"workflow definition",
|
|
218
|
-
"UPDATE workflow_definitions SET data = '{}'",
|
|
219
|
-
"stored_workflow_definition_invalid",
|
|
220
|
-
(store) => store.getWorkflowDefinition(definitionId, 1),
|
|
221
|
-
],
|
|
222
|
-
[
|
|
223
|
-
"workflow run",
|
|
224
|
-
"UPDATE workflow_runs SET data = '{}'",
|
|
225
|
-
"stored_workflow_run_invalid",
|
|
226
|
-
(store) => store.getWorkflowRun(workflowId),
|
|
227
|
-
],
|
|
228
|
-
[
|
|
229
|
-
"workflow event",
|
|
230
|
-
"UPDATE workflow_events SET data = '{}'",
|
|
231
|
-
"stored_workflow_event_invalid",
|
|
232
|
-
(store) => store.listWorkflowEvents(workflowId),
|
|
233
|
-
],
|
|
234
|
-
[
|
|
235
|
-
"workflow payload",
|
|
236
|
-
"UPDATE workflow_payloads SET payload = '{}'",
|
|
237
|
-
"stored_workflow_payload_invalid",
|
|
238
|
-
(store) => store.getWorkflowPayload(definitionId, 1),
|
|
239
|
-
],
|
|
240
|
-
[
|
|
241
|
-
"workflow snapshot",
|
|
242
|
-
"UPDATE workflow_snapshots SET data = '{}'",
|
|
243
|
-
"stored_workflow_snapshot_invalid",
|
|
244
|
-
(store) => store.getLatestWorkflowSnapshot(workflowId),
|
|
245
|
-
],
|
|
246
|
-
[
|
|
247
|
-
"task request payload",
|
|
248
|
-
"UPDATE task_payloads SET request_payload = '{}'",
|
|
249
|
-
"stored_task_payload_invalid",
|
|
250
|
-
(store) => store.getTaskPayload(taskId),
|
|
251
|
-
],
|
|
252
|
-
[
|
|
253
|
-
"task result payload",
|
|
254
|
-
"UPDATE task_payloads SET result_payload = '{}'",
|
|
255
|
-
"stored_task_result_invalid",
|
|
256
|
-
(store) => store.getTaskResult(taskId),
|
|
257
|
-
],
|
|
258
|
-
])("rejects corrupt %s JSON", (_record, update, expected, read) => {
|
|
259
|
-
const store = new SqliteStore(":memory:");
|
|
260
|
-
stores.push(store);
|
|
261
|
-
store.saveTask(task("planned"));
|
|
262
|
-
store.saveTaskPayload(taskId, envelope("request"), now);
|
|
263
|
-
store.saveTaskExecutionResult(task(), envelope("result"));
|
|
264
|
-
const initialRun = run();
|
|
265
|
-
store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [event(1, "55555555-5555-4555-8555-555555555555")]);
|
|
266
|
-
store.saveWorkflowSnapshot(WorkflowSnapshotSchema.parse({
|
|
267
|
-
schemaVersion: "1.0.0",
|
|
268
|
-
workflowId,
|
|
269
|
-
sequence: 1,
|
|
270
|
-
run: initialRun,
|
|
271
|
-
createdAt: now,
|
|
272
|
-
}));
|
|
273
|
-
store.database.exec(update);
|
|
274
|
-
expect(() => read(store)).toThrow(expected);
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
//# sourceMappingURL=workflow-store.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-store.test.js","sourceRoot":"","sources":["../src/workflow-store.test.ts"],"names":[],"mappings":"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"}
|