@goah/cli 0.1.1 → 0.3.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/dist/cli.js +3 -15
- package/dist/cli.js.map +1 -1
- package/dist/execution.d.ts +2 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +2 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +2 -0
- package/dist/kernel.js.map +1 -0
- package/dist/metrics.d.ts +2 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +2 -0
- package/dist/metrics.js.map +1 -0
- package/dist/runner-pi.d.ts +2 -0
- package/dist/runner-pi.d.ts.map +1 -0
- package/dist/runner-pi.js +2 -0
- package/dist/runner-pi.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2 -0
- package/dist/session.js.map +1 -0
- package/dist/sqlite.d.ts +2 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +2 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/supervisor.d.ts +2 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +2 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.d.ts.map +1 -0
- package/dist/testkit.js +2 -0
- package/dist/testkit.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts +205 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.js +18 -0
- package/node_modules/goah-ledger-contract/dist/execution.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts +5 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.js +5 -0
- package/node_modules/goah-ledger-contract/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts +33 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js +6 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts +40 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js +25 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts +37 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.js +53 -0
- package/node_modules/goah-ledger-contract/dist/session.js.map +1 -0
- package/node_modules/goah-ledger-contract/package.json +29 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts +66 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js +537 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-sqlite/package.json +26 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts +53 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/index.js +229 -0
- package/node_modules/goah-runner-pi/dist/index.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts +13 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js +75 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts +11 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js +263 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts +2 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js +48 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/package.json +28 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts +21 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/context-view.js +33 -0
- package/node_modules/goah-supervisor/dist/context-view.js.map +1 -0
- package/node_modules/goah-supervisor/dist/index.d.ts +54 -0
- package/node_modules/goah-supervisor/dist/index.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/index.js +436 -0
- package/node_modules/goah-supervisor/dist/index.js.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts +3 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.js +8 -0
- package/node_modules/goah-supervisor/dist/roles.js.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts +82 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.js +110 -0
- package/node_modules/goah-supervisor/dist/verification.js.map +1 -0
- package/node_modules/goah-supervisor/package.json +26 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js +29 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js.map +1 -0
- package/node_modules/goah-testkit/dist/index.d.ts +51 -0
- package/node_modules/goah-testkit/dist/index.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/index.js +96 -0
- package/node_modules/goah-testkit/dist/index.js.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js +29 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js.map +1 -0
- package/node_modules/goah-testkit/package.json +29 -0
- package/package.json +27 -8
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { assertActionRequest, assertActionTransition, assertGoalSnapshot, controlStream, goalStream, wakeStream, } from "goah-ledger-contract";
|
|
3
|
+
export const SQLITE_SCHEMA_VERSION = 6;
|
|
4
|
+
const createGoals = `CREATE TABLE IF NOT EXISTS goals (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
parent_id TEXT REFERENCES goals(id),
|
|
7
|
+
objective TEXT NOT NULL,
|
|
8
|
+
owner TEXT NOT NULL,
|
|
9
|
+
phase TEXT NOT NULL,
|
|
10
|
+
revision INTEGER NOT NULL CHECK(revision >= 0)
|
|
11
|
+
) STRICT;`;
|
|
12
|
+
const createWakes = `CREATE TABLE IF NOT EXISTS wakes (
|
|
13
|
+
id TEXT PRIMARY KEY,
|
|
14
|
+
agent TEXT NOT NULL,
|
|
15
|
+
trigger_ref TEXT NOT NULL,
|
|
16
|
+
status TEXT NOT NULL CHECK(status IN ('queued','leased','running','done','abnormal','merge_blocked')),
|
|
17
|
+
lease_until TEXT,
|
|
18
|
+
attempt INTEGER NOT NULL CHECK(attempt >= 0),
|
|
19
|
+
started_at TEXT,
|
|
20
|
+
ended_at TEXT,
|
|
21
|
+
enqueued_seq INTEGER NOT NULL CHECK(enqueued_seq > 0),
|
|
22
|
+
lease_token TEXT,
|
|
23
|
+
runner_pid INTEGER,
|
|
24
|
+
UNIQUE(agent, trigger_ref),
|
|
25
|
+
CHECK((status IN ('leased','running') AND lease_until IS NOT NULL AND lease_token IS NOT NULL) OR status NOT IN ('leased','running')),
|
|
26
|
+
CHECK((status IN ('done','abnormal','merge_blocked') AND ended_at IS NOT NULL) OR status NOT IN ('done','abnormal','merge_blocked'))
|
|
27
|
+
) STRICT;`;
|
|
28
|
+
const createActions = `CREATE TABLE IF NOT EXISTS actions (
|
|
29
|
+
id TEXT PRIMARY KEY,
|
|
30
|
+
agent TEXT NOT NULL,
|
|
31
|
+
kind TEXT NOT NULL,
|
|
32
|
+
connector TEXT NOT NULL,
|
|
33
|
+
payload TEXT NOT NULL CHECK(json_valid(payload)),
|
|
34
|
+
reason TEXT NOT NULL CHECK(length(trim(reason)) > 0),
|
|
35
|
+
evidence TEXT NOT NULL CHECK(json_valid(evidence) AND json_array_length(evidence) > 0),
|
|
36
|
+
gated INTEGER NOT NULL CHECK(gated IN (0,1)),
|
|
37
|
+
status TEXT NOT NULL CHECK(status IN ('requested','approved','dispatching','confirmed','failed','unknown')),
|
|
38
|
+
reconciled_at TEXT,
|
|
39
|
+
external_ref TEXT,
|
|
40
|
+
audit_advice TEXT CHECK(audit_advice IS NULL OR json_valid(audit_advice)),
|
|
41
|
+
advice_acked INTEGER NOT NULL CHECK(advice_acked IN (0,1)),
|
|
42
|
+
CHECK(reconciled_at IS NULL OR status IN ('confirmed','failed'))
|
|
43
|
+
) STRICT;`;
|
|
44
|
+
const indexesAndTriggers = `
|
|
45
|
+
CREATE UNIQUE INDEX IF NOT EXISTS wakes_one_active_agent ON wakes(agent) WHERE status IN ('leased','running');
|
|
46
|
+
CREATE INDEX IF NOT EXISTS wakes_queue_order ON wakes(status, enqueued_seq);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS schedule_due ON schedule(next_wake_at);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS events_actor_type_seq ON events(actor, type, seq DESC);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS events_stream_seq ON events(stream_id, stream_seq);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS events_coalesced_trigger ON events(json_extract(data,'$.triggerRef'), stream_id) WHERE type='wake.trigger_coalesced';
|
|
51
|
+
CREATE INDEX IF NOT EXISTS actions_agent_status ON actions(agent, status);
|
|
52
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(actor, type, data, content='events', content_rowid='seq');
|
|
53
|
+
|
|
54
|
+
CREATE TRIGGER IF NOT EXISTS events_no_update BEFORE UPDATE ON events
|
|
55
|
+
BEGIN SELECT RAISE(ABORT, 'events are append-only'); END;
|
|
56
|
+
CREATE TRIGGER IF NOT EXISTS events_no_delete BEFORE DELETE ON events
|
|
57
|
+
BEGIN SELECT RAISE(ABORT, 'events are append-only'); END;
|
|
58
|
+
CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events
|
|
59
|
+
BEGIN INSERT INTO events_fts(rowid,actor,type,data) VALUES (new.seq,new.actor,new.type,new.data); END;
|
|
60
|
+
|
|
61
|
+
CREATE TRIGGER IF NOT EXISTS wakes_valid_transition BEFORE UPDATE OF status ON wakes
|
|
62
|
+
WHEN OLD.status <> NEW.status AND NOT (
|
|
63
|
+
(OLD.status = 'queued' AND NEW.status IN ('leased','abnormal')) OR
|
|
64
|
+
(OLD.status = 'leased' AND NEW.status IN ('queued','running','abnormal')) OR
|
|
65
|
+
(OLD.status = 'running' AND NEW.status IN ('done','abnormal','merge_blocked'))
|
|
66
|
+
)
|
|
67
|
+
BEGIN SELECT RAISE(ABORT, 'invalid wake transition'); END;
|
|
68
|
+
|
|
69
|
+
CREATE TRIGGER IF NOT EXISTS actions_valid_transition BEFORE UPDATE OF status ON actions
|
|
70
|
+
WHEN OLD.status <> NEW.status AND NOT (
|
|
71
|
+
(OLD.status = 'requested' AND NEW.status IN ('approved','failed')) OR
|
|
72
|
+
(OLD.status = 'approved' AND NEW.status IN ('dispatching','failed')) OR
|
|
73
|
+
(OLD.status = 'dispatching' AND NEW.status IN ('confirmed','failed','unknown')) OR
|
|
74
|
+
(OLD.status = 'unknown' AND NEW.status IN ('dispatching','confirmed','failed'))
|
|
75
|
+
)
|
|
76
|
+
BEGIN SELECT RAISE(ABORT, 'invalid action transition'); END;
|
|
77
|
+
`;
|
|
78
|
+
const schema = `
|
|
79
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
80
|
+
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
+
stream_id TEXT NOT NULL,
|
|
82
|
+
stream_seq INTEGER NOT NULL CHECK(stream_seq > 0),
|
|
83
|
+
ts TEXT NOT NULL,
|
|
84
|
+
actor TEXT NOT NULL,
|
|
85
|
+
type TEXT NOT NULL,
|
|
86
|
+
data TEXT NOT NULL CHECK(json_valid(data)),
|
|
87
|
+
UNIQUE(stream_id, stream_seq)
|
|
88
|
+
) STRICT;
|
|
89
|
+
${createGoals}
|
|
90
|
+
CREATE TABLE IF NOT EXISTS schedule (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
agent TEXT NOT NULL,
|
|
93
|
+
next_wake_at TEXT NOT NULL,
|
|
94
|
+
reason TEXT NOT NULL,
|
|
95
|
+
set_by TEXT NOT NULL
|
|
96
|
+
) STRICT;
|
|
97
|
+
${createWakes}
|
|
98
|
+
CREATE TABLE IF NOT EXISTS mailbox (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
to_agent TEXT NOT NULL,
|
|
101
|
+
from_agent TEXT NOT NULL,
|
|
102
|
+
level TEXT NOT NULL CHECK(level IN ('fyi','decision','emergency')),
|
|
103
|
+
body TEXT NOT NULL CHECK(json_valid(body)),
|
|
104
|
+
read_at TEXT
|
|
105
|
+
) STRICT;
|
|
106
|
+
${createActions}
|
|
107
|
+
${indexesAndTriggers}`;
|
|
108
|
+
class SystemClock {
|
|
109
|
+
now() { return new Date(); }
|
|
110
|
+
}
|
|
111
|
+
export class SqliteLedger {
|
|
112
|
+
db;
|
|
113
|
+
#faultInjector;
|
|
114
|
+
#clock;
|
|
115
|
+
constructor(path = ":memory:", options = {}) {
|
|
116
|
+
this.db = new DatabaseSync(path);
|
|
117
|
+
this.db.exec(`PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = ${options.busyTimeoutMs ?? 5_000};`);
|
|
118
|
+
this.#faultInjector = options.faultInjector;
|
|
119
|
+
this.#clock = options.clock ?? new SystemClock();
|
|
120
|
+
const version = Number(this.db.prepare("PRAGMA user_version").get().user_version);
|
|
121
|
+
if (version > SQLITE_SCHEMA_VERSION) {
|
|
122
|
+
this.db.close();
|
|
123
|
+
throw new Error(`ledger schema ${version} is newer than supported schema ${SQLITE_SCHEMA_VERSION}`);
|
|
124
|
+
}
|
|
125
|
+
if (version === 0) {
|
|
126
|
+
this.db.exec(schema);
|
|
127
|
+
this.db.exec(`PRAGMA user_version = ${SQLITE_SCHEMA_VERSION}`);
|
|
128
|
+
}
|
|
129
|
+
else if (version < SQLITE_SCHEMA_VERSION) {
|
|
130
|
+
this.#migrateLegacy();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
this.db.exec(schema);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
close() { this.db.close(); }
|
|
137
|
+
appendEvent(input) { return this.#transaction(() => this.#insertEvent(input)); }
|
|
138
|
+
appendEvents(inputs) { return this.#transaction(() => inputs.map((input) => this.#insertEvent(input))); }
|
|
139
|
+
readStream(streamId, fromStreamSeq = 1) {
|
|
140
|
+
return this.db.prepare("SELECT * FROM events WHERE stream_id=? AND stream_seq>=? ORDER BY stream_seq").all(streamId, fromStreamSeq).map(mapEvent);
|
|
141
|
+
}
|
|
142
|
+
putGoal(goal, actor, wakeId) {
|
|
143
|
+
assertGoalSnapshot(goal);
|
|
144
|
+
const current = this.#getGoal(goal.id);
|
|
145
|
+
if (current) {
|
|
146
|
+
if (goal.revision !== current.revision + 1)
|
|
147
|
+
throw new Error("goal revision CAS failed");
|
|
148
|
+
if (goal.parentId !== current.parentId)
|
|
149
|
+
throw new Error("goal reparenting is not supported");
|
|
150
|
+
this.#assertGoalAuthority(current.parentId, actor);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (goal.revision !== 0)
|
|
154
|
+
throw new Error("new goal revision must be 0");
|
|
155
|
+
this.#assertGoalAuthority(goal.parentId, actor);
|
|
156
|
+
}
|
|
157
|
+
return this.#project("goals", goal, actor, "goal.put", wakeId, undefined, goalStream(goal.id));
|
|
158
|
+
}
|
|
159
|
+
putSchedule(value, actor, wakeId) {
|
|
160
|
+
if (actor !== "supervisor" && actor !== value.agent)
|
|
161
|
+
throw new Error("schedule may only be set by its agent or supervisor");
|
|
162
|
+
return this.#project("schedule", value, actor, "schedule.put", wakeId);
|
|
163
|
+
}
|
|
164
|
+
enqueueWake(input, actor) {
|
|
165
|
+
if (actor !== "supervisor")
|
|
166
|
+
throw new Error("only supervisor may enqueue wakes");
|
|
167
|
+
if (input.status !== "queued" || input.attempt !== 0 || input.leaseUntil || input.startedAt || input.endedAt || input.leaseToken || input.runnerPid) {
|
|
168
|
+
throw new Error("new wake must be pristine and queued");
|
|
169
|
+
}
|
|
170
|
+
const duplicate = this.wakeByTrigger(input.agent, input.triggerRef);
|
|
171
|
+
if (duplicate) {
|
|
172
|
+
const row = this.db.prepare("SELECT * FROM events WHERE type='wake.enqueued' AND json_extract(data, '$.snapshot.id')=? ORDER BY seq DESC LIMIT 1").get(duplicate.id);
|
|
173
|
+
if (!row)
|
|
174
|
+
throw new Error("wake projection has no source event");
|
|
175
|
+
return { event: mapEvent(row), created: false };
|
|
176
|
+
}
|
|
177
|
+
return this.#transaction(() => {
|
|
178
|
+
const enqueuedSeq = this.#nextEventSeq();
|
|
179
|
+
const wake = { ...input, enqueuedSeq };
|
|
180
|
+
const event = this.#recordProjection("wakes", wake, actor, "wake.enqueued", wake.id, undefined, enqueuedSeq);
|
|
181
|
+
return { event, created: true };
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
claimNextWake(now, leaseUntil, leaseToken) {
|
|
185
|
+
return this.#transaction(() => {
|
|
186
|
+
const row = this.db.prepare(`SELECT * FROM wakes w WHERE status='queued' AND NOT EXISTS (
|
|
187
|
+
SELECT 1 FROM wakes active WHERE active.agent=w.agent AND active.status IN ('leased','running')
|
|
188
|
+
) ORDER BY enqueued_seq LIMIT 1`).get();
|
|
189
|
+
if (!row)
|
|
190
|
+
return null;
|
|
191
|
+
const current = mapWake(row);
|
|
192
|
+
const next = { ...current, status: "leased", leaseUntil, leaseToken, runnerPid: null, attempt: current.attempt + 1 };
|
|
193
|
+
this.#recordProjection("wakes", next, "supervisor", "wake.leased", next.id, now);
|
|
194
|
+
return next;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
markWakeRunning(id, now, leaseToken) {
|
|
198
|
+
const current = this.#requiredWake(id);
|
|
199
|
+
this.#assertLease(current, leaseToken);
|
|
200
|
+
const next = { ...current, status: "running", startedAt: now };
|
|
201
|
+
this.#project("wakes", next, "supervisor", "wake.running", id, now);
|
|
202
|
+
return next;
|
|
203
|
+
}
|
|
204
|
+
attachWakeProcess(id, leaseToken, pid, now) {
|
|
205
|
+
const current = this.#requiredWake(id);
|
|
206
|
+
this.#assertLease(current, leaseToken);
|
|
207
|
+
if (current.status !== "running")
|
|
208
|
+
throw new Error("runner pid may only be attached to a running wake");
|
|
209
|
+
const next = { ...current, runnerPid: pid };
|
|
210
|
+
this.#project("wakes", next, "supervisor", "wake.runner_attached", id, now);
|
|
211
|
+
return next;
|
|
212
|
+
}
|
|
213
|
+
renewWakeLease(id, leaseToken, leaseUntil, now) {
|
|
214
|
+
const current = this.#requiredWake(id);
|
|
215
|
+
this.#assertLease(current, leaseToken);
|
|
216
|
+
if (current.status !== "leased" && current.status !== "running")
|
|
217
|
+
throw new Error("only an active wake lease may be renewed");
|
|
218
|
+
if (leaseUntil <= now)
|
|
219
|
+
throw new Error("renewed lease must expire in the future");
|
|
220
|
+
const next = { ...current, leaseUntil };
|
|
221
|
+
this.#project("wakes", next, "supervisor", "wake.lease_renewed", id, now);
|
|
222
|
+
return next;
|
|
223
|
+
}
|
|
224
|
+
finishWake(id, status, now) {
|
|
225
|
+
const current = this.#requiredWake(id);
|
|
226
|
+
const next = { ...current, status, leaseUntil: null, leaseToken: null, runnerPid: null, endedAt: now };
|
|
227
|
+
this.#project("wakes", next, "supervisor", `wake.${status}`, id, now);
|
|
228
|
+
return next;
|
|
229
|
+
}
|
|
230
|
+
expiredWakes(now) {
|
|
231
|
+
return this.db.prepare("SELECT * FROM wakes WHERE status IN ('leased','running') AND lease_until <= ? ORDER BY enqueued_seq").all(now).map(mapWake);
|
|
232
|
+
}
|
|
233
|
+
recoverExpiredWake(id, now) {
|
|
234
|
+
const current = this.#requiredWake(id);
|
|
235
|
+
if (current.status !== "leased" && current.status !== "running")
|
|
236
|
+
throw new Error("wake is not recoverable");
|
|
237
|
+
if (!current.leaseUntil || current.leaseUntil > now)
|
|
238
|
+
throw new Error("wake lease has not expired");
|
|
239
|
+
const running = current.status === "running";
|
|
240
|
+
const next = { ...current, status: running ? "abnormal" : "queued", leaseUntil: null, leaseToken: null, runnerPid: null, endedAt: running ? now : null };
|
|
241
|
+
this.#project("wakes", next, "supervisor", running ? "wake.expired_abnormal" : "wake.lease_expired", id, now);
|
|
242
|
+
return next;
|
|
243
|
+
}
|
|
244
|
+
appendRunnerEvent(input, leaseToken) {
|
|
245
|
+
return this.#transaction(() => {
|
|
246
|
+
if (!input.streamId.startsWith("wake:"))
|
|
247
|
+
throw new Error("runner event requires a wake stream");
|
|
248
|
+
const wake = this.#requiredWake(input.streamId.slice("wake:".length));
|
|
249
|
+
this.#assertLease(wake, leaseToken);
|
|
250
|
+
if (wake.status !== "running" || !wake.leaseUntil || input.ts > wake.leaseUntil)
|
|
251
|
+
throw new Error("stale runner event rejected");
|
|
252
|
+
return this.#insertEvent(input);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
requestAction(action, actor, wakeId) {
|
|
256
|
+
assertActionRequest(action);
|
|
257
|
+
if (actor !== action.agent)
|
|
258
|
+
throw new Error("action actor does not match action agent");
|
|
259
|
+
this.#assertEvidenceExists(action.evidence);
|
|
260
|
+
return this.#project("actions", action, actor, "action.requested", wakeId);
|
|
261
|
+
}
|
|
262
|
+
approveAction(id, approver, reason, evidence) {
|
|
263
|
+
return this.#decideAction(id, "approved", approver, reason, evidence);
|
|
264
|
+
}
|
|
265
|
+
rejectAction(id, approver, reason, evidence) {
|
|
266
|
+
return this.#decideAction(id, "failed", approver, reason, evidence);
|
|
267
|
+
}
|
|
268
|
+
transitionAction(id, status, patch = {}) {
|
|
269
|
+
const current = this.#requiredAction(id);
|
|
270
|
+
assertActionTransition(current.status, status);
|
|
271
|
+
if (current.status === "unknown" && (status === "confirmed" || status === "failed") && !patch.reconciledAt)
|
|
272
|
+
throw new Error("unknown action requires a reconciliation timestamp");
|
|
273
|
+
if (patch.reconciledAt && current.status !== "unknown")
|
|
274
|
+
throw new Error("reconciledAt is only written after unknown is queried");
|
|
275
|
+
if (patch.reconciledAt && status !== "confirmed" && status !== "failed")
|
|
276
|
+
throw new Error("reconciliation must resolve to a final state");
|
|
277
|
+
const next = { ...current, ...patch, status };
|
|
278
|
+
this.#project("actions", next, "supervisor", `action.${status}`);
|
|
279
|
+
return next;
|
|
280
|
+
}
|
|
281
|
+
recoverDispatchingActions() {
|
|
282
|
+
const rows = this.db.prepare("SELECT id FROM actions WHERE status='dispatching' ORDER BY id").all();
|
|
283
|
+
return rows.map(({ id }) => this.transitionAction(id, "unknown"));
|
|
284
|
+
}
|
|
285
|
+
putAuditAdvice(id, input, wakeId) {
|
|
286
|
+
const advice = { ...input, at: this.#now() };
|
|
287
|
+
this.#assertEvidenceExists(advice.evidence);
|
|
288
|
+
const current = this.#requiredAction(id);
|
|
289
|
+
const next = { ...current, auditAdvice: advice, adviceAcked: false };
|
|
290
|
+
this.#project("actions", next, advice.by, "action.audit_advice", wakeId, advice.at);
|
|
291
|
+
return next;
|
|
292
|
+
}
|
|
293
|
+
ackAuditAdvice(id, agent) {
|
|
294
|
+
const current = this.#requiredAction(id);
|
|
295
|
+
if (current.agent !== agent)
|
|
296
|
+
throw new Error("only the action owner may acknowledge audit advice");
|
|
297
|
+
if (!current.auditAdvice)
|
|
298
|
+
throw new Error("action has no audit advice");
|
|
299
|
+
const next = { ...current, adviceAcked: true };
|
|
300
|
+
this.#project("actions", next, agent, "action.audit_advice_acked");
|
|
301
|
+
return next;
|
|
302
|
+
}
|
|
303
|
+
putMail(mail, actor, wakeId) {
|
|
304
|
+
if (mail.from !== actor && actor !== "supervisor")
|
|
305
|
+
throw new Error("mail sender does not match actor");
|
|
306
|
+
return this.#project("mailbox", mail, actor, "mail.put", wakeId);
|
|
307
|
+
}
|
|
308
|
+
commitHandoff(commit) {
|
|
309
|
+
return this.#transaction(() => {
|
|
310
|
+
const wake = this.#requiredWake(commit.wakeId);
|
|
311
|
+
if (wake.status !== "running" || wake.agent !== commit.agent)
|
|
312
|
+
throw new Error("handoff does not match a running wake");
|
|
313
|
+
const event = this.#insertEvent({ streamId: wakeStream(commit.wakeId), ts: commit.ts, actor: commit.agent, type: "handoff.recorded", data: commit.output.handoff });
|
|
314
|
+
for (const mail of this.unreadMail(commit.agent)) {
|
|
315
|
+
this.#recordProjection("mailbox", { ...mail, readAt: commit.ts }, "supervisor", "mail.read", commit.wakeId, commit.ts);
|
|
316
|
+
}
|
|
317
|
+
for (const mail of commit.outgoingMail) {
|
|
318
|
+
if (mail.from !== commit.agent)
|
|
319
|
+
throw new Error("handoff mail sender does not match agent");
|
|
320
|
+
this.#recordProjection("mailbox", mail, commit.agent, "mail.put", commit.wakeId, commit.ts);
|
|
321
|
+
}
|
|
322
|
+
if (commit.schedule) {
|
|
323
|
+
if (commit.schedule.agent !== commit.agent || commit.schedule.setBy !== commit.agent)
|
|
324
|
+
throw new Error("handoff schedule does not match agent");
|
|
325
|
+
this.#recordProjection("schedule", commit.schedule, commit.agent, "schedule.put", commit.wakeId, commit.ts);
|
|
326
|
+
}
|
|
327
|
+
return event;
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
dueSchedules(now) { return this.db.prepare("SELECT * FROM schedule WHERE next_wake_at <= ? ORDER BY next_wake_at,id").all(now).map(mapSchedule); }
|
|
331
|
+
unreadMail(agent) { return this.db.prepare("SELECT * FROM mailbox WHERE to_agent=? AND read_at IS NULL ORDER BY rowid").all(agent).map(mapMail); }
|
|
332
|
+
unackedAuditAdvice(agent) { return this.db.prepare("SELECT * FROM actions WHERE agent=? AND audit_advice IS NOT NULL AND advice_acked=0 ORDER BY rowid").all(agent).map(mapAction); }
|
|
333
|
+
lastEvent(actor, type) { const row = this.db.prepare("SELECT * FROM events WHERE actor=? AND type=? ORDER BY seq DESC LIMIT 1").get(actor, type); return row ? mapEvent(row) : null; }
|
|
334
|
+
eventsForWake(wakeId) { return this.readStream(wakeStream(wakeId)); }
|
|
335
|
+
wake(id) { const row = this.db.prepare("SELECT * FROM wakes WHERE id=?").get(id); return row ? mapWake(row) : null; }
|
|
336
|
+
wakeByTrigger(agent, triggerRef) {
|
|
337
|
+
const direct = this.db.prepare("SELECT * FROM wakes WHERE agent=? AND trigger_ref=?").get(agent, triggerRef);
|
|
338
|
+
if (direct)
|
|
339
|
+
return mapWake(direct);
|
|
340
|
+
const coalesced = this.db.prepare(`SELECT w.* FROM events e JOIN wakes w ON e.stream_id='wake:'||w.id
|
|
341
|
+
WHERE e.type='wake.trigger_coalesced' AND json_extract(e.data,'$.triggerRef')=? AND w.agent=? LIMIT 1`).get(triggerRef, agent);
|
|
342
|
+
return coalesced ? mapWake(coalesced) : null;
|
|
343
|
+
}
|
|
344
|
+
queuedWakeForAgent(agent) { const row = this.db.prepare("SELECT * FROM wakes WHERE agent=? AND status='queued' ORDER BY enqueued_seq LIMIT 1").get(agent); return row ? mapWake(row) : null; }
|
|
345
|
+
action(id) { const row = this.db.prepare("SELECT * FROM actions WHERE id=?").get(id); return row ? mapAction(row) : null; }
|
|
346
|
+
goalsForOwner(owner) { return this.db.prepare("SELECT * FROM goals WHERE owner=? ORDER BY id").all(owner).map(mapGoal); }
|
|
347
|
+
goal(id) { return this.#getGoal(id); }
|
|
348
|
+
triggeringMail() { return this.db.prepare("SELECT * FROM mailbox WHERE read_at IS NULL AND level IN ('decision','emergency') ORDER BY rowid").all().map(mapMail); }
|
|
349
|
+
eventsSince(seq, types) {
|
|
350
|
+
const events = this.db.prepare("SELECT * FROM events WHERE seq>? ORDER BY seq").all(seq).map(mapEvent);
|
|
351
|
+
return types?.length ? events.filter((event) => types.includes(event.type)) : events;
|
|
352
|
+
}
|
|
353
|
+
searchEvents(query, limit = 50) {
|
|
354
|
+
return this.db.prepare("SELECT e.* FROM events_fts f JOIN events e ON e.seq=f.rowid WHERE events_fts MATCH ? ORDER BY rank LIMIT ?").all(query, limit).map(mapEvent);
|
|
355
|
+
}
|
|
356
|
+
metricSamples(goalId) {
|
|
357
|
+
return this.db.prepare("SELECT data FROM events WHERE type='metric.sampled' AND json_extract(data,'$.goalId')=? ORDER BY seq").all(goalId).map((row) => JSON.parse(row.data));
|
|
358
|
+
}
|
|
359
|
+
events() { return this.db.prepare("SELECT * FROM events ORDER BY seq").all().map(mapEvent); }
|
|
360
|
+
goals() { return this.db.prepare("SELECT * FROM goals ORDER BY id").all().map(mapGoal); }
|
|
361
|
+
schedules() { return this.db.prepare("SELECT * FROM schedule ORDER BY id").all().map(mapSchedule); }
|
|
362
|
+
wakes() { return this.db.prepare("SELECT * FROM wakes ORDER BY enqueued_seq").all().map(mapWake); }
|
|
363
|
+
actions() { return this.db.prepare("SELECT * FROM actions ORDER BY id").all().map(mapAction); }
|
|
364
|
+
mailbox() { return this.db.prepare("SELECT * FROM mailbox ORDER BY rowid").all().map(mapMail); }
|
|
365
|
+
rebuildProjections() {
|
|
366
|
+
const source = this.events();
|
|
367
|
+
this.#transaction(() => {
|
|
368
|
+
this.db.exec("DELETE FROM actions; DELETE FROM mailbox; DELETE FROM wakes; DELETE FROM schedule; DELETE FROM goals;");
|
|
369
|
+
for (const event of source) {
|
|
370
|
+
const data = event.data;
|
|
371
|
+
if (data.projection && data.snapshot)
|
|
372
|
+
this.#applyProjection(data.projection, data.snapshot, event.seq);
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
#decideAction(id, status, approver, reason, evidence) {
|
|
377
|
+
if (!reason.trim())
|
|
378
|
+
throw new Error("approval reason is required");
|
|
379
|
+
this.#assertEvidenceExists(evidence);
|
|
380
|
+
return this.#transaction(() => {
|
|
381
|
+
const current = this.#requiredAction(id);
|
|
382
|
+
assertActionTransition(current.status, status);
|
|
383
|
+
this.#insertEvent({ streamId: controlStream("actions"), ts: this.#now(), actor: approver, type: `action.${status}_decision`, data: { actionId: id, reason, evidence } });
|
|
384
|
+
const next = { ...current, status };
|
|
385
|
+
this.#recordProjection("actions", next, approver, `action.${status}`);
|
|
386
|
+
return next;
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
#assertGoalAuthority(parentId, actor) {
|
|
390
|
+
if (parentId === null) {
|
|
391
|
+
if (actor !== "human")
|
|
392
|
+
throw new Error("only human may modify a root goal");
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const parent = this.#getGoal(parentId);
|
|
396
|
+
if (!parent)
|
|
397
|
+
throw new Error("parent goal does not exist");
|
|
398
|
+
if (parent.owner !== actor)
|
|
399
|
+
throw new Error("only the parent goal owner may modify a child goal");
|
|
400
|
+
}
|
|
401
|
+
#assertEvidenceExists(evidence) {
|
|
402
|
+
const exists = this.db.prepare("SELECT 1 FROM events WHERE seq=?");
|
|
403
|
+
for (const seq of evidence)
|
|
404
|
+
if (!Number.isInteger(seq) || seq <= 0 || !exists.get(seq))
|
|
405
|
+
throw new Error(`evidence event does not exist: ${seq}`);
|
|
406
|
+
}
|
|
407
|
+
#assertLease(wake, leaseToken) {
|
|
408
|
+
if (wake.leaseToken !== leaseToken)
|
|
409
|
+
throw new Error("stale wake lease token");
|
|
410
|
+
}
|
|
411
|
+
#getGoal(id) { const row = this.db.prepare("SELECT * FROM goals WHERE id=?").get(id); return row ? mapGoal(row) : null; }
|
|
412
|
+
#requiredWake(id) { const value = this.wake(id); if (!value)
|
|
413
|
+
throw new Error(`wake not found: ${id}`); return value; }
|
|
414
|
+
#requiredAction(id) { const value = this.action(id); if (!value)
|
|
415
|
+
throw new Error(`action not found: ${id}`); return value; }
|
|
416
|
+
#project(projection, snapshot, actor, type, wakeId, ts, streamId) {
|
|
417
|
+
return this.#transaction(() => this.#recordProjection(projection, snapshot, actor, type, wakeId, ts, undefined, streamId));
|
|
418
|
+
}
|
|
419
|
+
#recordProjection(projection, snapshot, actor, type, wakeId, ts, expectedSeq, streamId) {
|
|
420
|
+
const event = this.#insertEvent({ streamId: streamId ?? (wakeId ? wakeStream(wakeId) : controlStream(projection)), ts: ts ?? this.#now(), actor, type, data: { projection, snapshot } }, expectedSeq);
|
|
421
|
+
this.#faultInjector?.("after_event_before_projection");
|
|
422
|
+
this.#applyProjection(projection, snapshot, event.seq);
|
|
423
|
+
return event;
|
|
424
|
+
}
|
|
425
|
+
#insertEvent(input, expectedSeq) {
|
|
426
|
+
if (!input.streamId.trim() || !input.actor.trim() || !input.type.trim())
|
|
427
|
+
throw new Error("event streamId, actor and type are required");
|
|
428
|
+
const streamSeq = Number(this.db.prepare("SELECT COALESCE(MAX(stream_seq),0)+1 AS next FROM events WHERE stream_id=?").get(input.streamId).next);
|
|
429
|
+
const result = expectedSeq === undefined
|
|
430
|
+
? this.db.prepare("INSERT INTO events(stream_id,stream_seq,ts,actor,type,data) VALUES (?,?,?,?,?,json(?))").run(input.streamId, streamSeq, input.ts, input.actor, input.type, JSON.stringify(input.data))
|
|
431
|
+
: this.db.prepare("INSERT INTO events(seq,stream_id,stream_seq,ts,actor,type,data) VALUES (?,?,?,?,?,?,json(?))").run(expectedSeq, input.streamId, streamSeq, input.ts, input.actor, input.type, JSON.stringify(input.data));
|
|
432
|
+
return { ...input, seq: Number(result.lastInsertRowid), streamSeq };
|
|
433
|
+
}
|
|
434
|
+
#nextEventSeq() {
|
|
435
|
+
const row = this.db.prepare("SELECT seq FROM sqlite_sequence WHERE name='events'").get();
|
|
436
|
+
return Number(row?.seq ?? 0) + 1;
|
|
437
|
+
}
|
|
438
|
+
#applyProjection(projection, raw, sourceSeq) {
|
|
439
|
+
if (projection === "goals") {
|
|
440
|
+
const v = raw;
|
|
441
|
+
this.db.prepare(`INSERT INTO goals VALUES (?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET parent_id=excluded.parent_id,objective=excluded.objective,owner=excluded.owner,phase=excluded.phase,revision=excluded.revision`).run(v.id, v.parentId, v.objective, v.owner, v.phase, v.revision);
|
|
442
|
+
}
|
|
443
|
+
else if (projection === "schedule") {
|
|
444
|
+
const v = raw;
|
|
445
|
+
this.db.prepare(`INSERT INTO schedule VALUES (?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET agent=excluded.agent,next_wake_at=excluded.next_wake_at,reason=excluded.reason,set_by=excluded.set_by`).run(v.id, v.agent, v.nextWakeAt, v.reason, v.setBy);
|
|
446
|
+
}
|
|
447
|
+
else if (projection === "wakes") {
|
|
448
|
+
const old = raw;
|
|
449
|
+
const existing = this.wake(old.id);
|
|
450
|
+
const active = old.status === "leased" || old.status === "running";
|
|
451
|
+
const v = {
|
|
452
|
+
...old,
|
|
453
|
+
enqueuedSeq: old.enqueuedSeq ?? existing?.enqueuedSeq ?? sourceSeq,
|
|
454
|
+
leaseToken: old.leaseToken !== undefined ? old.leaseToken : active ? existing?.leaseToken ?? `legacy:${old.id}:${old.attempt}` : null,
|
|
455
|
+
runnerPid: old.runnerPid !== undefined ? old.runnerPid : existing?.runnerPid ?? null,
|
|
456
|
+
};
|
|
457
|
+
this.db.prepare(`INSERT INTO wakes VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET agent=excluded.agent,trigger_ref=excluded.trigger_ref,status=excluded.status,lease_until=excluded.lease_until,attempt=excluded.attempt,started_at=excluded.started_at,ended_at=excluded.ended_at,enqueued_seq=excluded.enqueued_seq,lease_token=excluded.lease_token,runner_pid=excluded.runner_pid`).run(v.id, v.agent, v.triggerRef, v.status, v.leaseUntil, v.attempt, v.startedAt, v.endedAt, v.enqueuedSeq, v.leaseToken, v.runnerPid);
|
|
458
|
+
}
|
|
459
|
+
else if (projection === "mailbox") {
|
|
460
|
+
const v = raw;
|
|
461
|
+
this.db.prepare(`INSERT INTO mailbox VALUES (?,?,?,?,json(?),?) ON CONFLICT(id) DO UPDATE SET to_agent=excluded.to_agent,from_agent=excluded.from_agent,level=excluded.level,body=excluded.body,read_at=excluded.read_at`).run(v.id, v.to, v.from, v.level, JSON.stringify(v.body), v.readAt);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
const old = raw;
|
|
465
|
+
const v = { ...old, connector: old.connector ?? "legacy" };
|
|
466
|
+
this.db.prepare(`INSERT INTO actions VALUES (?,?,?,?,json(?),?,json(?),?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET agent=excluded.agent,kind=excluded.kind,connector=excluded.connector,payload=excluded.payload,reason=excluded.reason,evidence=excluded.evidence,gated=excluded.gated,status=excluded.status,reconciled_at=excluded.reconciled_at,external_ref=excluded.external_ref,audit_advice=excluded.audit_advice,advice_acked=excluded.advice_acked`).run(v.id, v.agent, v.kind, v.connector, JSON.stringify(v.payload), v.reason, JSON.stringify(v.evidence), v.gated ? 1 : 0, v.status, v.reconciledAt, v.externalRef, v.auditAdvice === null ? null : JSON.stringify(v.auditAdvice), v.adviceAcked ? 1 : 0);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
#migrateLegacy() {
|
|
470
|
+
this.#transaction(() => {
|
|
471
|
+
this.db.exec(`PRAGMA defer_foreign_keys=ON;
|
|
472
|
+
DROP TRIGGER IF EXISTS events_no_update; DROP TRIGGER IF EXISTS events_no_delete; DROP TRIGGER IF EXISTS events_fts_insert;
|
|
473
|
+
DROP TRIGGER IF EXISTS wakes_valid_transition; DROP TRIGGER IF EXISTS actions_valid_transition;
|
|
474
|
+
DROP INDEX IF EXISTS events_agent_kind_seq; DROP INDEX IF EXISTS events_wake_seq; DROP INDEX IF EXISTS events_coalesced_trigger;
|
|
475
|
+
DROP INDEX IF EXISTS events_actor_type_seq; DROP INDEX IF EXISTS events_stream_seq;
|
|
476
|
+
DROP INDEX IF EXISTS wakes_one_active_agent; DROP INDEX IF EXISTS wakes_queue_order; DROP INDEX IF EXISTS schedule_due; DROP INDEX IF EXISTS actions_agent_status;
|
|
477
|
+
DROP TABLE IF EXISTS events_fts;
|
|
478
|
+
|
|
479
|
+
ALTER TABLE goals RENAME TO goals_legacy; ${createGoals}
|
|
480
|
+
INSERT INTO goals(id,parent_id,objective,owner,phase,revision) SELECT id,parent_id,objective,owner,phase,revision FROM goals_legacy;
|
|
481
|
+
DROP TABLE goals_legacy;`);
|
|
482
|
+
const wakeColumns = new Set(this.db.prepare("PRAGMA table_info(wakes)").all().map((row) => row.name));
|
|
483
|
+
if (!wakeColumns.has("enqueued_seq")) {
|
|
484
|
+
this.db.exec(`ALTER TABLE wakes RENAME TO wakes_legacy; ${createWakes}
|
|
485
|
+
INSERT INTO wakes SELECT id,agent,trigger_ref,status,lease_until,attempt,started_at,ended_at,rowid,
|
|
486
|
+
CASE WHEN status IN ('leased','running') THEN 'legacy:'||id||':'||attempt ELSE NULL END,NULL FROM wakes_legacy;
|
|
487
|
+
DROP TABLE wakes_legacy;`);
|
|
488
|
+
}
|
|
489
|
+
const actionColumns = new Set(this.db.prepare("PRAGMA table_info(actions)").all().map((row) => row.name));
|
|
490
|
+
if (!actionColumns.has("connector")) {
|
|
491
|
+
this.db.exec(`ALTER TABLE actions RENAME TO actions_legacy; ${createActions}
|
|
492
|
+
INSERT INTO actions SELECT id,agent,kind,'legacy',payload,reason,evidence,gated,status,reconciled_at,external_ref,audit_advice,advice_acked FROM actions_legacy;
|
|
493
|
+
DROP TABLE actions_legacy;`);
|
|
494
|
+
}
|
|
495
|
+
const eventColumns = new Set(this.db.prepare("PRAGMA table_info(events)").all().map((row) => row.name));
|
|
496
|
+
if (!eventColumns.has("stream_id")) {
|
|
497
|
+
this.db.exec(`ALTER TABLE events RENAME TO events_legacy;
|
|
498
|
+
CREATE TABLE events (
|
|
499
|
+
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
500
|
+
stream_id TEXT NOT NULL,
|
|
501
|
+
stream_seq INTEGER NOT NULL CHECK(stream_seq > 0),
|
|
502
|
+
ts TEXT NOT NULL,
|
|
503
|
+
actor TEXT NOT NULL,
|
|
504
|
+
type TEXT NOT NULL,
|
|
505
|
+
data TEXT NOT NULL CHECK(json_valid(data)),
|
|
506
|
+
UNIQUE(stream_id, stream_seq)
|
|
507
|
+
) STRICT;
|
|
508
|
+
INSERT INTO events(seq,stream_id,stream_seq,ts,actor,type,data)
|
|
509
|
+
SELECT seq,stream_id,ROW_NUMBER() OVER (PARTITION BY stream_id ORDER BY seq),ts,agent,kind,data FROM (
|
|
510
|
+
SELECT seq,ts,agent,kind,data,CASE WHEN wake_id IS NULL THEN 'control:'||agent ELSE 'wake:'||wake_id END AS stream_id FROM events_legacy
|
|
511
|
+
);
|
|
512
|
+
DROP TABLE events_legacy;`);
|
|
513
|
+
}
|
|
514
|
+
this.db.exec(`${indexesAndTriggers} INSERT INTO events_fts(events_fts) VALUES('rebuild'); PRAGMA user_version=${SQLITE_SCHEMA_VERSION};`);
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
#transaction(fn) {
|
|
518
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
519
|
+
try {
|
|
520
|
+
const result = fn();
|
|
521
|
+
this.db.exec("COMMIT");
|
|
522
|
+
return result;
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
this.db.exec("ROLLBACK");
|
|
526
|
+
throw error;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
#now() { return this.#clock.now().toISOString(); }
|
|
530
|
+
}
|
|
531
|
+
function mapEvent(r) { return { seq: Number(r.seq), streamId: String(r.stream_id), streamSeq: Number(r.stream_seq), ts: String(r.ts), actor: String(r.actor), type: String(r.type), data: JSON.parse(String(r.data)) }; }
|
|
532
|
+
function mapGoal(r) { return { id: String(r.id), parentId: r.parent_id === null ? null : String(r.parent_id), objective: String(r.objective), owner: String(r.owner), phase: String(r.phase), revision: Number(r.revision) }; }
|
|
533
|
+
function mapSchedule(r) { return { id: String(r.id), agent: String(r.agent), nextWakeAt: String(r.next_wake_at), reason: String(r.reason), setBy: String(r.set_by) }; }
|
|
534
|
+
function mapWake(r) { return { id: String(r.id), agent: String(r.agent), triggerRef: String(r.trigger_ref), status: String(r.status), leaseUntil: r.lease_until === null ? null : String(r.lease_until), attempt: Number(r.attempt), startedAt: r.started_at === null ? null : String(r.started_at), endedAt: r.ended_at === null ? null : String(r.ended_at), enqueuedSeq: Number(r.enqueued_seq), leaseToken: r.lease_token === null ? null : String(r.lease_token), runnerPid: r.runner_pid === null ? null : Number(r.runner_pid) }; }
|
|
535
|
+
function mapMail(r) { return { id: String(r.id), to: String(r.to_agent), from: String(r.from_agent), level: String(r.level), body: JSON.parse(String(r.body)), readAt: r.read_at === null ? null : String(r.read_at) }; }
|
|
536
|
+
function mapAction(r) { return { id: String(r.id), agent: String(r.agent), kind: String(r.kind), connector: String(r.connector), payload: JSON.parse(String(r.payload)), reason: String(r.reason), evidence: JSON.parse(String(r.evidence)), gated: Boolean(r.gated), status: String(r.status), reconciledAt: r.reconciled_at === null ? null : String(r.reconciled_at), externalRef: r.external_ref === null ? null : String(r.external_ref), auditAdvice: r.audit_advice === null ? null : JSON.parse(String(r.audit_advice)), adviceAcked: Boolean(r.advice_acked) }; }
|
|
537
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "goah-ledger-sqlite",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/billc8128/goah.git",
|
|
9
|
+
"directory": "packages/ledger-sqlite"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=24.0.0"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/**/*.test.*",
|
|
17
|
+
"!dist/.tsbuildinfo"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": "./dist/index.js",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"goah-ledger-contract": "0.3.0"
|
|
25
|
+
}
|
|
26
|
+
}
|