@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.
@@ -0,0 +1,149 @@
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
+ expect(store.database
65
+ .prepare("SELECT version FROM schema_migrations ORDER BY version")
66
+ .all()).toEqual([{ version: 1 }]);
67
+ });
68
+ it("persists tasks and scoped memories", () => {
69
+ store = new SqliteStore(":memory:");
70
+ const now = new Date().toISOString();
71
+ const request = TaskRequestSchema.parse({
72
+ goal: "Inspect the system",
73
+ operation: { kind: "system", action: "info" },
74
+ });
75
+ store.saveTask({
76
+ id: "605a411d-d39d-494b-a6de-0e8c3b96a564",
77
+ request,
78
+ status: "planned",
79
+ policyDecision: {
80
+ outcome: "allow",
81
+ effect: "read",
82
+ risk: "low",
83
+ reason: "read_only_operation",
84
+ policyVersion: "1",
85
+ },
86
+ receiptIds: [],
87
+ createdAt: now,
88
+ updatedAt: now,
89
+ });
90
+ expect(store.getTask("605a411d-d39d-494b-a6de-0e8c3b96a564")?.request.goal).toBe("Inspect the system");
91
+ store.putMemory({
92
+ id: "8170fc74-9885-4ee5-973e-161fa441e510",
93
+ scope: "workspace",
94
+ key: "runtime",
95
+ value: "MELRA uses SQLite",
96
+ source: "test",
97
+ confidence: 0.9,
98
+ tags: ["runtime"],
99
+ createdAt: now,
100
+ updatedAt: now,
101
+ });
102
+ expect(store.memoryCandidates("workspace", 5)).toHaveLength(1);
103
+ expect(store.listMemories("user", 5)).toHaveLength(0);
104
+ });
105
+ it("migrates existing memory tables before persisting episode metadata", () => {
106
+ tempDirectory = mkdtempSync(join(tmpdir(), "melra-memory-migration-"));
107
+ const databasePath = join(tempDirectory, "melra.sqlite");
108
+ const legacy = new DatabaseSync(databasePath);
109
+ legacy.exec(`
110
+ CREATE TABLE memories (
111
+ id TEXT PRIMARY KEY,
112
+ scope TEXT NOT NULL,
113
+ key TEXT NOT NULL,
114
+ value TEXT NOT NULL,
115
+ source TEXT NOT NULL,
116
+ confidence REAL NOT NULL,
117
+ tags TEXT NOT NULL DEFAULT '[]',
118
+ expires_at TEXT,
119
+ supersedes_id TEXT,
120
+ superseded_by TEXT,
121
+ created_at TEXT NOT NULL,
122
+ updated_at TEXT NOT NULL
123
+ );
124
+ `);
125
+ legacy.close();
126
+ store = new SqliteStore(databasePath);
127
+ const now = new Date().toISOString();
128
+ store.putMemory({
129
+ id: "4a9b5e8d-0b5b-4fe4-8db4-e2275c733f11",
130
+ scope: "workspace",
131
+ key: "answer",
132
+ value: "Adoption agencies.",
133
+ source: "test",
134
+ confidence: 1,
135
+ tags: [],
136
+ speaker: "Alex",
137
+ episodeId: "conversation-a",
138
+ sequence: 11,
139
+ createdAt: now,
140
+ updatedAt: now,
141
+ });
142
+ expect(store.getMemory("4a9b5e8d-0b5b-4fe4-8db4-e2275c733f11")).toMatchObject({
143
+ speaker: "Alex",
144
+ episodeId: "conversation-a",
145
+ sequence: 11,
146
+ });
147
+ });
148
+ });
149
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MemoryScope as ProtocolMemoryScope, TaskRecord } from "@melra/protocol";
2
+ export type MemoryScope = ProtocolMemoryScope;
3
+ export type { TaskRecord };
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,IAAI,mBAAmB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtF,MAAM,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // Copyright 2026 XAGI Labs Private Limited
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workflow-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-store.test.d.ts","sourceRoot":"","sources":["../src/workflow-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,276 @@
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
+ },
90
+ receiptIds: [],
91
+ createdAt: now,
92
+ updatedAt: now,
93
+ };
94
+ }
95
+ describe("durable workflow storage", () => {
96
+ it("stores only sealed execution payloads and reads validated records", async () => {
97
+ const root = await mkdtemp(join(tmpdir(), "melra-workflow-store-"));
98
+ roots.push(root);
99
+ const databasePath = join(root, "melra.sqlite");
100
+ const store = new SqliteStore(databasePath);
101
+ stores.push(store);
102
+ const initialRun = run();
103
+ const created = event(1, "55555555-5555-4555-8555-555555555555");
104
+ store.saveTask(task("planned"));
105
+ store.saveTaskPayload(taskId, envelope("one-time-secret-request"), now);
106
+ store.saveTaskExecutionResult(task(), envelope("one-time-secret-result"));
107
+ store.createWorkflow(definition("[REDACTED]"), envelope("one-time-secret-workflow"), initialRun, [created]);
108
+ store.saveWorkflowSnapshot(WorkflowSnapshotSchema.parse({
109
+ schemaVersion: "1.0.0",
110
+ workflowId,
111
+ sequence: 1,
112
+ run: initialRun,
113
+ createdAt: now,
114
+ }));
115
+ expect(store.getTaskPayload(taskId)).toEqual(envelope("one-time-secret-request"));
116
+ expect(store.getTaskResult(taskId)).toEqual(envelope("one-time-secret-result"));
117
+ expect(store.getWorkflowDefinition(definitionId, 1)?.name).toBe("restart-safe");
118
+ expect(store.getWorkflowPayload(definitionId, 1)).toEqual(envelope("one-time-secret-workflow"));
119
+ expect(store.getWorkflowRun(workflowId)).toEqual(initialRun);
120
+ expect(store.listWorkflowEvents(workflowId)).toEqual([created]);
121
+ expect(store.getLatestWorkflowSnapshot(workflowId)?.sequence).toBe(1);
122
+ expect(store.listInterruptedTasks()).toEqual([task()]);
123
+ expect(store.commitIdempotency("stable-key", taskId, 1, now)).toBe(true);
124
+ expect(store.commitIdempotency("stable-key", taskId, 2, now)).toBe(false);
125
+ expect(store.getIdempotencyCommit("stable-key")).toEqual({
126
+ taskId,
127
+ attempt: 1,
128
+ committedAt: now,
129
+ });
130
+ store.deleteTaskPayload(taskId);
131
+ expect(store.getTaskPayload(taskId)).toBeUndefined();
132
+ expect(store.getTaskResult(taskId)).toBeUndefined();
133
+ store.close();
134
+ stores.splice(stores.indexOf(store), 1);
135
+ expect((await readFile(databasePath)).toString()).not.toContain("one-time-secret");
136
+ });
137
+ it("appends events monotonically and rejects stale projections", () => {
138
+ const store = new SqliteStore(":memory:");
139
+ stores.push(store);
140
+ const initialRun = run();
141
+ const created = event(1, "55555555-5555-4555-8555-555555555555");
142
+ store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [created]);
143
+ const nextRun = run(2, "planned");
144
+ const planned = event(2, "66666666-6666-4666-8666-666666666666", "workflow.status_changed");
145
+ store.transitionWorkflow(workflowId, 1, nextRun, [planned]);
146
+ expect(store.listWorkflowEvents(workflowId).map((item) => item.sequence)).toEqual([1, 2]);
147
+ expect(store
148
+ .listWorkflowEvents(workflowId, 1)
149
+ .map((item) => item.sequence)).toEqual([2]);
150
+ expect(() => store.transitionWorkflow(workflowId, 1, nextRun, [
151
+ event(2, "77777777-7777-4777-8777-777777777777", "workflow.status_changed"),
152
+ ])).toThrow("workflow_state_conflict");
153
+ });
154
+ it("rolls back the projection and every event when an append fails", () => {
155
+ const store = new SqliteStore(":memory:");
156
+ stores.push(store);
157
+ const initialRun = run();
158
+ const created = event(1, "55555555-5555-4555-8555-555555555555");
159
+ store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [created]);
160
+ const blocking = event(3, "99999999-9999-4999-8999-999999999999", "workflow.node_ready");
161
+ store.database
162
+ .prepare(`
163
+ INSERT INTO workflow_events(
164
+ id, aggregate_id, sequence, trace_id, type, data, occurred_at
165
+ )
166
+ VALUES (?, ?, ?, ?, ?, ?, ?)
167
+ `)
168
+ .run(blocking.id, blocking.aggregateId, blocking.sequence, blocking.traceId, blocking.type, JSON.stringify(blocking), blocking.occurredAt);
169
+ expect(() => store.transitionWorkflow(workflowId, 1, run(3, "running"), [
170
+ event(2, "88888888-8888-4888-8888-888888888888", "workflow.status_changed"),
171
+ event(3, "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa", "workflow.node_ready"),
172
+ ])).toThrow();
173
+ expect(store.getWorkflowRun(workflowId)).toEqual(initialRun);
174
+ expect(store.listWorkflowEvents(workflowId).map((item) => item.sequence)).toEqual([1, 3]);
175
+ });
176
+ it("rolls back the task projection when result payload storage fails", () => {
177
+ const store = new SqliteStore(":memory:");
178
+ stores.push(store);
179
+ expect(() => store.saveTaskExecutionResult(task(), envelope("result"))).toThrow("task_payload_not_found");
180
+ expect(store.getTask(taskId)).toBeUndefined();
181
+ });
182
+ it("rejects mismatched definition and event identities", () => {
183
+ const definitionMismatch = new SqliteStore(":memory:");
184
+ stores.push(definitionMismatch);
185
+ const otherDefinition = WorkflowDefinitionSchema.parse({
186
+ ...definition("[REDACTED]"),
187
+ id: "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
188
+ });
189
+ expect(() => definitionMismatch.createWorkflow(otherDefinition, envelope("workflow"), run(), [event(1, "55555555-5555-4555-8555-555555555555")])).toThrow("workflow_definition_mismatch");
190
+ expect(definitionMismatch.getWorkflowRun(workflowId)).toBeUndefined();
191
+ const traceMismatch = new SqliteStore(":memory:");
192
+ stores.push(traceMismatch);
193
+ const wrongTrace = WorkflowEventSchema.parse({
194
+ ...event(1, "66666666-6666-4666-8666-666666666666"),
195
+ traceId: "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
196
+ });
197
+ expect(() => traceMismatch.createWorkflow(definition("[REDACTED]"), envelope("workflow"), run(), [wrongTrace])).toThrow("workflow_event_identity_invalid");
198
+ expect(traceMismatch.getWorkflowRun(workflowId)).toBeUndefined();
199
+ const projectionMismatch = new SqliteStore(":memory:");
200
+ stores.push(projectionMismatch);
201
+ const initialRun = run();
202
+ projectionMismatch.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [event(1, "77777777-7777-4777-8777-777777777777")]);
203
+ const wrongTraceRun = WorkflowRunSchema.parse({
204
+ ...run(2, "planned"),
205
+ traceId: "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
206
+ });
207
+ const wrongTraceEvent = WorkflowEventSchema.parse({
208
+ ...event(2, "88888888-8888-4888-8888-888888888888", "workflow.status_changed"),
209
+ traceId: wrongTraceRun.traceId,
210
+ });
211
+ expect(() => projectionMismatch.transitionWorkflow(workflowId, 1, wrongTraceRun, [wrongTraceEvent])).toThrow("workflow_projection_identity_mismatch");
212
+ expect(projectionMismatch.getWorkflowRun(workflowId)).toEqual(initialRun);
213
+ });
214
+ it.each([
215
+ [
216
+ "workflow definition",
217
+ "UPDATE workflow_definitions SET data = '{}'",
218
+ "stored_workflow_definition_invalid",
219
+ (store) => store.getWorkflowDefinition(definitionId, 1),
220
+ ],
221
+ [
222
+ "workflow run",
223
+ "UPDATE workflow_runs SET data = '{}'",
224
+ "stored_workflow_run_invalid",
225
+ (store) => store.getWorkflowRun(workflowId),
226
+ ],
227
+ [
228
+ "workflow event",
229
+ "UPDATE workflow_events SET data = '{}'",
230
+ "stored_workflow_event_invalid",
231
+ (store) => store.listWorkflowEvents(workflowId),
232
+ ],
233
+ [
234
+ "workflow payload",
235
+ "UPDATE workflow_payloads SET payload = '{}'",
236
+ "stored_workflow_payload_invalid",
237
+ (store) => store.getWorkflowPayload(definitionId, 1),
238
+ ],
239
+ [
240
+ "workflow snapshot",
241
+ "UPDATE workflow_snapshots SET data = '{}'",
242
+ "stored_workflow_snapshot_invalid",
243
+ (store) => store.getLatestWorkflowSnapshot(workflowId),
244
+ ],
245
+ [
246
+ "task request payload",
247
+ "UPDATE task_payloads SET request_payload = '{}'",
248
+ "stored_task_payload_invalid",
249
+ (store) => store.getTaskPayload(taskId),
250
+ ],
251
+ [
252
+ "task result payload",
253
+ "UPDATE task_payloads SET result_payload = '{}'",
254
+ "stored_task_result_invalid",
255
+ (store) => store.getTaskResult(taskId),
256
+ ],
257
+ ])("rejects corrupt %s JSON", (_record, update, expected, read) => {
258
+ const store = new SqliteStore(":memory:");
259
+ stores.push(store);
260
+ store.saveTask(task("planned"));
261
+ store.saveTaskPayload(taskId, envelope("request"), now);
262
+ store.saveTaskExecutionResult(task(), envelope("result"));
263
+ const initialRun = run();
264
+ store.createWorkflow(definition("[REDACTED]"), envelope("workflow"), initialRun, [event(1, "55555555-5555-4555-8555-555555555555")]);
265
+ store.saveWorkflowSnapshot(WorkflowSnapshotSchema.parse({
266
+ schemaVersion: "1.0.0",
267
+ workflowId,
268
+ sequence: 1,
269
+ run: initialRun,
270
+ createdAt: now,
271
+ }));
272
+ store.database.exec(update);
273
+ expect(() => read(store)).toThrow(expected);
274
+ });
275
+ });
276
+ //# sourceMappingURL=workflow-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-store.test.js","sourceRoot":"","sources":["../src/workflow-store.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@melra/storage-sqlite",
3
+ "version": "0.3.0-alpha.3",
4
+ "description": "Transactional SQLite task, workflow, event, payload, and evidence storage for MELRA.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/XAGI-Lab/melra.git",
9
+ "directory": "packages/storage-sqlite"
10
+ },
11
+ "homepage": "https://github.com/XAGI-Lab/melra#readme",
12
+ "bugs": "https://github.com/XAGI-Lab/melra/issues",
13
+ "type": "module",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "dependencies": {
24
+ "@melra/protocol": "0.3.0-alpha.3",
25
+ "@melra/receipt-schema": "0.3.0-alpha.3"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "clean": "rm -rf dist",
30
+ "test": "vitest run --no-file-parallelism --testTimeout=30000",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit"
32
+ }
33
+ }