@aionis/substrate 0.1.0
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/CHANGELOG.md +29 -0
- package/LICENSE +201 -0
- package/README.md +222 -0
- package/dist/backup.d.ts +38 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +203 -0
- package/dist/backup.js.map +1 -0
- package/dist/event-log.d.ts +18 -0
- package/dist/event-log.d.ts.map +1 -0
- package/dist/event-log.js +157 -0
- package/dist/event-log.js.map +1 -0
- package/dist/file-substrate.d.ts +7 -0
- package/dist/file-substrate.d.ts.map +1 -0
- package/dist/file-substrate.js +409 -0
- package/dist/file-substrate.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime-reference-corpus.d.ts +76 -0
- package/dist/runtime-reference-corpus.d.ts.map +1 -0
- package/dist/runtime-reference-corpus.js +308 -0
- package/dist/runtime-reference-corpus.js.map +1 -0
- package/dist/runtime-snapshot-corpus.d.ts +53 -0
- package/dist/runtime-snapshot-corpus.d.ts.map +1 -0
- package/dist/runtime-snapshot-corpus.js +176 -0
- package/dist/runtime-snapshot-corpus.js.map +1 -0
- package/dist/runtime-snapshot-importer.d.ts +27 -0
- package/dist/runtime-snapshot-importer.d.ts.map +1 -0
- package/dist/runtime-snapshot-importer.js +571 -0
- package/dist/runtime-snapshot-importer.js.map +1 -0
- package/dist/runtime-snapshot-parity.d.ts +40 -0
- package/dist/runtime-snapshot-parity.d.ts.map +1 -0
- package/dist/runtime-snapshot-parity.js +217 -0
- package/dist/runtime-snapshot-parity.js.map +1 -0
- package/dist/search.d.ts +3 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +157 -0
- package/dist/search.js.map +1 -0
- package/dist/sqlite-substrate.d.ts +7 -0
- package/dist/sqlite-substrate.d.ts.map +1 -0
- package/dist/sqlite-substrate.js +666 -0
- package/dist/sqlite-substrate.js.map +1 -0
- package/dist/types.d.ts +253 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/ADAPTER_CONTRACT.md +155 -0
- package/docs/API_USAGE.md +225 -0
- package/docs/BACKUP_RESTORE.md +108 -0
- package/docs/CHECKPOINT_COMPACTION.md +75 -0
- package/docs/EXTERNAL_ADMISSION_PARITY.md +98 -0
- package/docs/RUNTIME_DUAL_WRITE_EXPERIMENT.md +132 -0
- package/docs/RUNTIME_MAPPING.md +69 -0
- package/docs/RUNTIME_REFERENCE_CORPUS.md +129 -0
- package/docs/RUNTIME_SNAPSHOT_CORPUS.md +81 -0
- package/docs/RUNTIME_SNAPSHOT_IMPORT.md +120 -0
- package/docs/STORE_CONTRACT.md +181 -0
- package/examples/basic/README.md +19 -0
- package/examples/basic/index.mjs +112 -0
- package/package.json +65 -0
package/dist/backup.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { DatabaseSync } from "node:sqlite";
|
|
4
|
+
import { checksumAionisEvents, replayAionisEvents, snapshotFromReplayState, } from "./event-log.js";
|
|
5
|
+
import { openSqliteAionisSubstrate } from "./sqlite-substrate.js";
|
|
6
|
+
import { AIONIS_SUBSTRATE_SCHEMA_VERSION, } from "./types.js";
|
|
7
|
+
export const AIONIS_SUBSTRATE_BACKUP_FORMAT = "aionis_substrate_backup";
|
|
8
|
+
export const AIONIS_SUBSTRATE_BACKUP_VERSION = 1;
|
|
9
|
+
function assertValidBackup(backup) {
|
|
10
|
+
const report = verifyAionisSubstrateBackup(backup);
|
|
11
|
+
if (!report.ok)
|
|
12
|
+
throw new Error(`invalid Aionis Substrate backup: ${report.errors.join("; ")}`);
|
|
13
|
+
return report.snapshot;
|
|
14
|
+
}
|
|
15
|
+
export async function exportAionisSubstrateBackup(store, options = {}) {
|
|
16
|
+
const [source, events] = await Promise.all([store.getStoreInfo(), store.listEvents()]);
|
|
17
|
+
const state = replayAionisEvents(events);
|
|
18
|
+
const eventsSha256 = checksumAionisEvents(events);
|
|
19
|
+
return {
|
|
20
|
+
format: AIONIS_SUBSTRATE_BACKUP_FORMAT,
|
|
21
|
+
backupVersion: AIONIS_SUBSTRATE_BACKUP_VERSION,
|
|
22
|
+
schemaVersion: AIONIS_SUBSTRATE_SCHEMA_VERSION,
|
|
23
|
+
createdAt: options.createdAt ?? new Date().toISOString(),
|
|
24
|
+
source,
|
|
25
|
+
eventCount: events.length,
|
|
26
|
+
lastSequence: state.lastSequence,
|
|
27
|
+
checksum: {
|
|
28
|
+
algorithm: "sha256",
|
|
29
|
+
eventsSha256,
|
|
30
|
+
},
|
|
31
|
+
events,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function verifyAionisSubstrateBackup(backup) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
let snapshot = null;
|
|
37
|
+
let eventsSha256 = null;
|
|
38
|
+
let lastSequence = 0;
|
|
39
|
+
if (backup.format !== AIONIS_SUBSTRATE_BACKUP_FORMAT)
|
|
40
|
+
errors.push(`unsupported backup format: ${String(backup.format)}`);
|
|
41
|
+
if (backup.backupVersion !== AIONIS_SUBSTRATE_BACKUP_VERSION)
|
|
42
|
+
errors.push(`unsupported backup version: ${String(backup.backupVersion)}`);
|
|
43
|
+
if (backup.schemaVersion !== AIONIS_SUBSTRATE_SCHEMA_VERSION) {
|
|
44
|
+
errors.push(`unsupported schema version: ${String(backup.schemaVersion)}`);
|
|
45
|
+
}
|
|
46
|
+
if (!Array.isArray(backup.events))
|
|
47
|
+
errors.push("events must be an array");
|
|
48
|
+
if (Array.isArray(backup.events)) {
|
|
49
|
+
try {
|
|
50
|
+
const state = replayAionisEvents(backup.events);
|
|
51
|
+
snapshot = snapshotFromReplayState(state);
|
|
52
|
+
lastSequence = state.lastSequence;
|
|
53
|
+
eventsSha256 = checksumAionisEvents(backup.events);
|
|
54
|
+
if (backup.eventCount !== backup.events.length) {
|
|
55
|
+
errors.push(`eventCount mismatch: header=${backup.eventCount}, actual=${backup.events.length}`);
|
|
56
|
+
}
|
|
57
|
+
if (backup.lastSequence !== state.lastSequence) {
|
|
58
|
+
errors.push(`lastSequence mismatch: header=${backup.lastSequence}, actual=${state.lastSequence}`);
|
|
59
|
+
}
|
|
60
|
+
if (backup.checksum?.algorithm !== "sha256") {
|
|
61
|
+
errors.push(`unsupported checksum algorithm: ${String(backup.checksum?.algorithm)}`);
|
|
62
|
+
}
|
|
63
|
+
if (backup.checksum?.eventsSha256 !== eventsSha256) {
|
|
64
|
+
errors.push("eventsSha256 mismatch");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
errors.push(err.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
ok: errors.length === 0,
|
|
73
|
+
errors,
|
|
74
|
+
schemaVersion: typeof backup.schemaVersion === "number" ? backup.schemaVersion : null,
|
|
75
|
+
eventCount: Array.isArray(backup.events) ? backup.events.length : 0,
|
|
76
|
+
lastSequence,
|
|
77
|
+
eventsSha256,
|
|
78
|
+
snapshot,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function writeAionisSubstrateBackupFile(path, backup) {
|
|
82
|
+
assertValidBackup(backup);
|
|
83
|
+
await mkdir(dirname(path), { recursive: true });
|
|
84
|
+
await writeFile(path, `${JSON.stringify(backup, null, 2)}\n`, "utf8");
|
|
85
|
+
}
|
|
86
|
+
export async function readAionisSubstrateBackupFile(path) {
|
|
87
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
88
|
+
}
|
|
89
|
+
export async function restoreAionisSubstrateBackupToFile(backup, dir, options = {}) {
|
|
90
|
+
const snapshot = assertValidBackup(backup);
|
|
91
|
+
const eventsPath = join(dir, "events.jsonl");
|
|
92
|
+
const snapshotPath = join(dir, "snapshot.json");
|
|
93
|
+
if (options.overwrite) {
|
|
94
|
+
await rm(dir, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await assertFileRestoreTargetEmpty(eventsPath, snapshotPath);
|
|
98
|
+
}
|
|
99
|
+
await mkdir(dir, { recursive: true });
|
|
100
|
+
await writeFile(eventsPath, backup.events.map((event) => JSON.stringify(event)).join("\n") + (backup.events.length > 0 ? "\n" : ""), "utf8");
|
|
101
|
+
await writeFile(snapshotPath, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8");
|
|
102
|
+
return snapshot;
|
|
103
|
+
}
|
|
104
|
+
export async function restoreAionisSubstrateBackupToSqlite(backup, path, options = {}) {
|
|
105
|
+
const snapshot = assertValidBackup(backup);
|
|
106
|
+
if (options.overwrite) {
|
|
107
|
+
await rm(path, { force: true });
|
|
108
|
+
await rm(`${path}-wal`, { force: true });
|
|
109
|
+
await rm(`${path}-shm`, { force: true });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
await assertSqliteRestoreTargetEmpty(path);
|
|
113
|
+
}
|
|
114
|
+
const store = await openSqliteAionisSubstrate({ path });
|
|
115
|
+
await store.close();
|
|
116
|
+
const db = new DatabaseSync(path);
|
|
117
|
+
db.exec("BEGIN IMMEDIATE");
|
|
118
|
+
try {
|
|
119
|
+
db.exec(`
|
|
120
|
+
DELETE FROM decision_traces;
|
|
121
|
+
DELETE FROM memory_feedback;
|
|
122
|
+
DELETE FROM memory_relations;
|
|
123
|
+
DELETE FROM memory_nodes;
|
|
124
|
+
DELETE FROM substrate_events;
|
|
125
|
+
DELETE FROM sqlite_sequence WHERE name = 'substrate_events';
|
|
126
|
+
`);
|
|
127
|
+
for (const event of backup.events) {
|
|
128
|
+
db.prepare("INSERT INTO substrate_events (sequence, id, type, created_at, payload_json) VALUES (?, ?, ?, ?, ?)")
|
|
129
|
+
.run(event.sequence, event.id, event.type, event.createdAt, JSON.stringify(event.payload));
|
|
130
|
+
}
|
|
131
|
+
for (const node of snapshot.nodes)
|
|
132
|
+
insertSqliteNodeRow(db, node);
|
|
133
|
+
for (const relation of snapshot.relations)
|
|
134
|
+
insertSqliteRelationRow(db, relation);
|
|
135
|
+
for (const feedback of snapshot.feedback)
|
|
136
|
+
insertSqliteFeedbackRow(db, feedback);
|
|
137
|
+
for (const decision of snapshot.decisions)
|
|
138
|
+
insertSqliteDecisionRow(db, decision);
|
|
139
|
+
db.prepare(`
|
|
140
|
+
INSERT INTO substrate_metadata (key, value)
|
|
141
|
+
VALUES ('last_restored_at', ?)
|
|
142
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
143
|
+
`).run(new Date().toISOString());
|
|
144
|
+
db.exec("COMMIT");
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
db.exec("ROLLBACK");
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
db.close();
|
|
152
|
+
}
|
|
153
|
+
return snapshot;
|
|
154
|
+
}
|
|
155
|
+
async function assertFileRestoreTargetEmpty(eventsPath, snapshotPath) {
|
|
156
|
+
const existing = await Promise.all([fileExists(eventsPath), fileExists(snapshotPath)]);
|
|
157
|
+
if (existing.some(Boolean))
|
|
158
|
+
throw new Error("restore target file store is not empty; pass overwrite=true to replace it");
|
|
159
|
+
}
|
|
160
|
+
async function assertSqliteRestoreTargetEmpty(path) {
|
|
161
|
+
if (await fileExists(path))
|
|
162
|
+
throw new Error("restore target SQLite store already exists; pass overwrite=true to replace it");
|
|
163
|
+
}
|
|
164
|
+
async function fileExists(path) {
|
|
165
|
+
try {
|
|
166
|
+
await readFile(path);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err.code === "ENOENT")
|
|
171
|
+
return false;
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function insertSqliteNodeRow(db, node) {
|
|
176
|
+
db.prepare(`
|
|
177
|
+
INSERT INTO memory_nodes (
|
|
178
|
+
scope, id, kind, title, summary, lifecycle, authority, confidence, target_files_json,
|
|
179
|
+
payload_ref, agent_id, team_id, metadata_json, created_at, updated_at
|
|
180
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
181
|
+
`).run(node.scope, node.id, node.kind, node.title ?? null, node.summary, node.lifecycle, node.authority, node.confidence, JSON.stringify(node.targetFiles ?? []), node.payloadRef ?? null, node.agentId ?? null, node.teamId ?? null, JSON.stringify(node.metadata ?? {}), node.createdAt, node.updatedAt);
|
|
182
|
+
}
|
|
183
|
+
function insertSqliteRelationRow(db, relation) {
|
|
184
|
+
db.prepare(`
|
|
185
|
+
INSERT INTO memory_relations (
|
|
186
|
+
scope, id, kind, source_id, target_id, confidence, reasons_json, metadata_json, created_at
|
|
187
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
188
|
+
`).run(relation.scope, relation.id, relation.kind, relation.sourceId, relation.targetId, relation.confidence, JSON.stringify(relation.reasons), JSON.stringify(relation.metadata ?? {}), relation.createdAt);
|
|
189
|
+
}
|
|
190
|
+
function insertSqliteFeedbackRow(db, feedback) {
|
|
191
|
+
db.prepare(`
|
|
192
|
+
INSERT INTO memory_feedback (
|
|
193
|
+
scope, id, memory_id, outcome, strength, run_id, evidence_ref, created_at
|
|
194
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
195
|
+
`).run(feedback.scope, feedback.id, feedback.memoryId, feedback.outcome, feedback.strength, feedback.runId ?? null, feedback.evidenceRef ?? null, feedback.createdAt);
|
|
196
|
+
}
|
|
197
|
+
function insertSqliteDecisionRow(db, trace) {
|
|
198
|
+
db.prepare(`
|
|
199
|
+
INSERT INTO decision_traces (scope, id, query, decisions_json, created_at)
|
|
200
|
+
VALUES (?, ?, ?, ?, ?)
|
|
201
|
+
`).run(trace.scope, trace.id, trace.query ?? null, JSON.stringify(trace.decisions), trace.createdAt);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AionisDecisionTrace, AionisEvent, AionisFeedback, AionisMemoryNode, AionisRelation, AionisSubstrateSnapshot } from "./types.ts";
|
|
2
|
+
export type AionisReplayState = {
|
|
3
|
+
lastSequence: number;
|
|
4
|
+
nodes: Map<string, AionisMemoryNode>;
|
|
5
|
+
relations: Map<string, AionisRelation>;
|
|
6
|
+
feedback: Map<string, AionisFeedback>;
|
|
7
|
+
decisions: Map<string, AionisDecisionTrace>;
|
|
8
|
+
events: AionisEvent[];
|
|
9
|
+
};
|
|
10
|
+
export declare function eventKey(scope: string, id: string): string;
|
|
11
|
+
export declare function stableStringify(value: unknown): string;
|
|
12
|
+
export declare function checksumAionisEvents(events: AionisEvent[]): string;
|
|
13
|
+
export declare function emptyReplayState(): AionisReplayState;
|
|
14
|
+
export declare function cloneReplayState(state: AionisReplayState): AionisReplayState;
|
|
15
|
+
export declare function applyAionisEvent(state: AionisReplayState, event: AionisEvent): void;
|
|
16
|
+
export declare function replayAionisEvents(events: AionisEvent[]): AionisReplayState;
|
|
17
|
+
export declare function snapshotFromReplayState(state: AionisReplayState): AionisSubstrateSnapshot;
|
|
18
|
+
//# sourceMappingURL=event-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.d.ts","sourceRoot":"","sources":["../src/event-log.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACrC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC5C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAElE;AAED,wBAAgB,gBAAgB,IAAI,iBAAiB,CASpD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAS5E;AA0CD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA0DnF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAI3E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,uBAAuB,CAUzF"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AIONIS_SUBSTRATE_SCHEMA_VERSION } from "./types.js";
|
|
3
|
+
export function eventKey(scope, id) {
|
|
4
|
+
return `${scope}\u0000${id}`;
|
|
5
|
+
}
|
|
6
|
+
export function stableStringify(value) {
|
|
7
|
+
if (value === null || typeof value !== "object")
|
|
8
|
+
return JSON.stringify(value);
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return `[${value.map((item) => stableStringify(item)).join(",")}]`;
|
|
11
|
+
const entries = Object.entries(value)
|
|
12
|
+
.filter(([, item]) => item !== undefined)
|
|
13
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
14
|
+
return `{${entries.map(([name, item]) => `${JSON.stringify(name)}:${stableStringify(item)}`).join(",")}}`;
|
|
15
|
+
}
|
|
16
|
+
export function checksumAionisEvents(events) {
|
|
17
|
+
return createHash("sha256").update(stableStringify(events)).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
export function emptyReplayState() {
|
|
20
|
+
return {
|
|
21
|
+
lastSequence: 0,
|
|
22
|
+
nodes: new Map(),
|
|
23
|
+
relations: new Map(),
|
|
24
|
+
feedback: new Map(),
|
|
25
|
+
decisions: new Map(),
|
|
26
|
+
events: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function cloneReplayState(state) {
|
|
30
|
+
return {
|
|
31
|
+
lastSequence: state.lastSequence,
|
|
32
|
+
nodes: new Map(state.nodes),
|
|
33
|
+
relations: new Map(state.relations),
|
|
34
|
+
feedback: new Map(state.feedback),
|
|
35
|
+
decisions: new Map(state.decisions),
|
|
36
|
+
events: [...state.events],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function requireString(value, label) {
|
|
40
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
41
|
+
throw new Error(`${label} is required`);
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function requireNumber(value, label) {
|
|
45
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
46
|
+
throw new Error(`${label} must be finite`);
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
function validateEventShape(event) {
|
|
50
|
+
requireString(event.id, "event.id");
|
|
51
|
+
requireNumber(event.sequence, "event.sequence");
|
|
52
|
+
if (!Number.isInteger(event.sequence) || event.sequence < 1)
|
|
53
|
+
throw new Error(`invalid event sequence: ${event.sequence}`);
|
|
54
|
+
requireString(event.createdAt, "event.createdAt");
|
|
55
|
+
requireString(event.type, "event.type");
|
|
56
|
+
if (!event.payload || typeof event.payload !== "object")
|
|
57
|
+
throw new Error(`event payload is required for sequence ${event.sequence}`);
|
|
58
|
+
}
|
|
59
|
+
function validateCheckpointState(nodes, relations, feedback) {
|
|
60
|
+
const nodeKeys = new Set(nodes.map((node) => eventKey(node.scope, node.id)));
|
|
61
|
+
for (const relation of relations) {
|
|
62
|
+
if (!nodeKeys.has(eventKey(relation.scope, relation.sourceId))) {
|
|
63
|
+
throw new Error(`checkpoint relation references missing source memory node: ${relation.sourceId}`);
|
|
64
|
+
}
|
|
65
|
+
if (!nodeKeys.has(eventKey(relation.scope, relation.targetId))) {
|
|
66
|
+
throw new Error(`checkpoint relation references missing target memory node: ${relation.targetId}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const item of feedback) {
|
|
70
|
+
if (!nodeKeys.has(eventKey(item.scope, item.memoryId))) {
|
|
71
|
+
throw new Error(`checkpoint feedback references missing memory node: ${item.memoryId}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function applyAionisEvent(state, event) {
|
|
76
|
+
validateEventShape(event);
|
|
77
|
+
const expectedSequence = state.lastSequence + 1;
|
|
78
|
+
if (event.sequence !== expectedSequence) {
|
|
79
|
+
throw new Error(`event sequence gap at ${event.sequence}; expected ${expectedSequence}`);
|
|
80
|
+
}
|
|
81
|
+
if (state.events.some((item) => item.id === event.id))
|
|
82
|
+
throw new Error(`duplicate event id: ${event.id}`);
|
|
83
|
+
if (event.type === "substrate.checkpoint.created") {
|
|
84
|
+
if (event.payload.schemaVersion !== AIONIS_SUBSTRATE_SCHEMA_VERSION) {
|
|
85
|
+
throw new Error(`unsupported checkpoint schema version: ${event.payload.schemaVersion}`);
|
|
86
|
+
}
|
|
87
|
+
validateCheckpointState(event.payload.state.nodes, event.payload.state.relations, event.payload.state.feedback);
|
|
88
|
+
state.nodes = new Map(event.payload.state.nodes.map((node) => [eventKey(node.scope, node.id), node]));
|
|
89
|
+
state.relations = new Map(event.payload.state.relations.map((relation) => [eventKey(relation.scope, relation.id), relation]));
|
|
90
|
+
state.feedback = new Map(event.payload.state.feedback.map((item) => [eventKey(item.scope, item.id), item]));
|
|
91
|
+
state.decisions = new Map(event.payload.state.decisions.map((item) => [eventKey(item.scope, item.id), item]));
|
|
92
|
+
}
|
|
93
|
+
else if (event.type === "memory.node.upsert") {
|
|
94
|
+
state.nodes.set(eventKey(event.payload.scope, event.payload.id), event.payload);
|
|
95
|
+
}
|
|
96
|
+
else if (event.type === "memory.lifecycle.transition") {
|
|
97
|
+
const nodeKey = eventKey(event.payload.scope, event.payload.memoryId);
|
|
98
|
+
const current = state.nodes.get(nodeKey);
|
|
99
|
+
if (!current)
|
|
100
|
+
throw new Error(`cannot transition missing memory node: ${event.payload.memoryId}`);
|
|
101
|
+
state.nodes.set(nodeKey, {
|
|
102
|
+
...current,
|
|
103
|
+
lifecycle: event.payload.lifecycle,
|
|
104
|
+
authority: event.payload.authority ?? current.authority,
|
|
105
|
+
confidence: event.payload.confidence ?? current.confidence,
|
|
106
|
+
updatedAt: event.createdAt,
|
|
107
|
+
metadata: {
|
|
108
|
+
...(current.metadata ?? {}),
|
|
109
|
+
last_lifecycle_transition_reason: event.payload.reason,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else if (event.type === "memory.relation.upsert") {
|
|
114
|
+
const relation = event.payload;
|
|
115
|
+
if (!state.nodes.has(eventKey(relation.scope, relation.sourceId))) {
|
|
116
|
+
throw new Error(`cannot relate missing source memory node: ${relation.sourceId}`);
|
|
117
|
+
}
|
|
118
|
+
if (!state.nodes.has(eventKey(relation.scope, relation.targetId))) {
|
|
119
|
+
throw new Error(`cannot relate missing target memory node: ${relation.targetId}`);
|
|
120
|
+
}
|
|
121
|
+
state.relations.set(eventKey(relation.scope, relation.id), relation);
|
|
122
|
+
}
|
|
123
|
+
else if (event.type === "memory.feedback.recorded") {
|
|
124
|
+
const feedback = event.payload;
|
|
125
|
+
if (!state.nodes.has(eventKey(feedback.scope, feedback.memoryId))) {
|
|
126
|
+
throw new Error(`cannot record feedback for missing memory node: ${feedback.memoryId}`);
|
|
127
|
+
}
|
|
128
|
+
state.feedback.set(eventKey(feedback.scope, feedback.id), feedback);
|
|
129
|
+
}
|
|
130
|
+
else if (event.type === "memory.decision.recorded") {
|
|
131
|
+
const decision = event.payload;
|
|
132
|
+
state.decisions.set(eventKey(decision.scope, decision.id), decision);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
throw new Error(`unsupported event type: ${event.type}`);
|
|
136
|
+
}
|
|
137
|
+
state.lastSequence = event.sequence;
|
|
138
|
+
state.events.push(event);
|
|
139
|
+
}
|
|
140
|
+
export function replayAionisEvents(events) {
|
|
141
|
+
const state = emptyReplayState();
|
|
142
|
+
for (const event of events)
|
|
143
|
+
applyAionisEvent(state, event);
|
|
144
|
+
return state;
|
|
145
|
+
}
|
|
146
|
+
export function snapshotFromReplayState(state) {
|
|
147
|
+
return {
|
|
148
|
+
version: 1,
|
|
149
|
+
schemaVersion: AIONIS_SUBSTRATE_SCHEMA_VERSION,
|
|
150
|
+
lastSequence: state.lastSequence,
|
|
151
|
+
nodes: Array.from(state.nodes.values()),
|
|
152
|
+
relations: Array.from(state.relations.values()),
|
|
153
|
+
feedback: Array.from(state.feedback.values()),
|
|
154
|
+
decisions: Array.from(state.decisions.values()),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=event-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../src/event-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AionisSubstrate } from "./types.ts";
|
|
2
|
+
export type FileAionisSubstrateOptions = {
|
|
3
|
+
dir: string;
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
};
|
|
6
|
+
export declare function openFileAionisSubstrate(options: FileAionisSubstrateOptions): Promise<AionisSubstrate>;
|
|
7
|
+
//# sourceMappingURL=file-substrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-substrate.d.ts","sourceRoot":"","sources":["../src/file-substrate.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAcV,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAiDF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CA+X3G"}
|