@action-llama/action-llama 0.18.11 → 0.19.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/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +16 -158
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/container-runner.d.ts +10 -1
- package/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +125 -121
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/agents/session-loop.d.ts +22 -0
- package/dist/agents/session-loop.d.ts.map +1 -0
- package/dist/agents/session-loop.js +159 -0
- package/dist/agents/session-loop.js.map +1 -0
- package/dist/agents/types.d.ts +17 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/run-agent.d.ts.map +1 -1
- package/dist/cli/commands/run-agent.js +16 -117
- package/dist/cli/commands/run-agent.js.map +1 -1
- package/dist/control/routes/dashboard-api.d.ts.map +1 -1
- package/dist/control/routes/dashboard-api.js +43 -0
- package/dist/control/routes/dashboard-api.js.map +1 -1
- package/dist/control/routes/stats.d.ts.map +1 -1
- package/dist/control/routes/stats.js +54 -0
- package/dist/control/routes/stats.js.map +1 -1
- package/dist/db/connection.d.ts +20 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +34 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +27 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +180 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +1383 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +158 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/docker/local-runtime.js +1 -1
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/docker/ssh-docker-runtime.js +1 -1
- package/dist/docker/ssh-docker-runtime.js.map +1 -1
- package/dist/events/event-queue-sqlite.d.ts +8 -3
- package/dist/events/event-queue-sqlite.d.ts.map +1 -1
- package/dist/events/event-queue-sqlite.js +42 -41
- package/dist/events/event-queue-sqlite.js.map +1 -1
- package/dist/execution/execution.d.ts +1 -0
- package/dist/execution/execution.d.ts.map +1 -1
- package/dist/execution/execution.js +8 -3
- package/dist/execution/execution.js.map +1 -1
- package/dist/frontend/assets/index-BO_q8PRQ.css +2 -0
- package/dist/frontend/assets/index-DKQX_6iM.js +13 -0
- package/dist/frontend/index.html +2 -2
- package/dist/gateway/frontend.d.ts +20 -0
- package/dist/gateway/frontend.d.ts.map +1 -0
- package/dist/gateway/frontend.js +80 -0
- package/dist/gateway/frontend.js.map +1 -0
- package/dist/gateway/index.d.ts +3 -70
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +109 -214
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/middleware/auth.d.ts +12 -0
- package/dist/gateway/middleware/auth.d.ts.map +1 -0
- package/dist/gateway/middleware/auth.js +25 -0
- package/dist/gateway/middleware/auth.js.map +1 -0
- package/dist/gateway/middleware/request-logging.d.ts +9 -0
- package/dist/gateway/middleware/request-logging.d.ts.map +1 -0
- package/dist/gateway/middleware/request-logging.js +26 -0
- package/dist/gateway/middleware/request-logging.js.map +1 -0
- package/dist/gateway/middleware/telemetry.d.ts +7 -0
- package/dist/gateway/middleware/telemetry.d.ts.map +1 -0
- package/dist/gateway/middleware/telemetry.js +28 -0
- package/dist/gateway/middleware/telemetry.js.map +1 -0
- package/dist/gateway/routes/chat.d.ts +32 -0
- package/dist/gateway/routes/chat.d.ts.map +1 -0
- package/dist/gateway/routes/chat.js +24 -0
- package/dist/gateway/routes/chat.js.map +1 -0
- package/dist/gateway/routes/dashboard.d.ts +19 -0
- package/dist/gateway/routes/dashboard.d.ts.map +1 -0
- package/dist/gateway/routes/dashboard.js +26 -0
- package/dist/gateway/routes/dashboard.js.map +1 -0
- package/dist/gateway/routes/execution.d.ts +24 -0
- package/dist/gateway/routes/execution.d.ts.map +1 -0
- package/dist/gateway/routes/execution.js +13 -0
- package/dist/gateway/routes/execution.js.map +1 -0
- package/dist/gateway/routes/system.d.ts +14 -0
- package/dist/gateway/routes/system.d.ts.map +1 -0
- package/dist/gateway/routes/system.js +18 -0
- package/dist/gateway/routes/system.js.map +1 -0
- package/dist/gateway/routes/webhooks.d.ts +20 -0
- package/dist/gateway/routes/webhooks.d.ts.map +1 -0
- package/dist/gateway/routes/webhooks.js +11 -0
- package/dist/gateway/routes/webhooks.js.map +1 -0
- package/dist/gateway/stores.d.ts +21 -0
- package/dist/gateway/stores.d.ts.map +1 -0
- package/dist/gateway/stores.js +24 -0
- package/dist/gateway/stores.js.map +1 -0
- package/dist/gateway/types.d.ts +65 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +2 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/scheduler/dependencies.d.ts +11 -0
- package/dist/scheduler/dependencies.d.ts.map +1 -0
- package/dist/scheduler/dependencies.js +34 -0
- package/dist/scheduler/dependencies.js.map +1 -0
- package/dist/scheduler/gateway-setup.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.js +8 -2
- package/dist/scheduler/gateway-setup.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +20 -176
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/orphan-recovery.d.ts +25 -0
- package/dist/scheduler/orphan-recovery.d.ts.map +1 -0
- package/dist/scheduler/orphan-recovery.js +130 -0
- package/dist/scheduler/orphan-recovery.js.map +1 -0
- package/dist/scheduler/persistence.d.ts +18 -0
- package/dist/scheduler/persistence.d.ts.map +1 -0
- package/dist/scheduler/persistence.js +42 -0
- package/dist/scheduler/persistence.js.map +1 -0
- package/dist/scheduler/shutdown.d.ts +2 -0
- package/dist/scheduler/shutdown.d.ts.map +1 -1
- package/dist/scheduler/shutdown.js +8 -1
- package/dist/scheduler/shutdown.js.map +1 -1
- package/dist/shared/config/index.d.ts +5 -0
- package/dist/shared/config/index.d.ts.map +1 -0
- package/dist/shared/config/index.js +5 -0
- package/dist/shared/config/index.js.map +1 -0
- package/dist/shared/config/load-agent.d.ts +27 -0
- package/dist/shared/config/load-agent.d.ts.map +1 -0
- package/dist/shared/config/load-agent.js +169 -0
- package/dist/shared/config/load-agent.js.map +1 -0
- package/dist/shared/config/load-project.d.ts +22 -0
- package/dist/shared/config/load-project.d.ts.map +1 -0
- package/dist/shared/config/load-project.js +84 -0
- package/dist/shared/config/load-project.js.map +1 -0
- package/dist/shared/config/types.d.ts +115 -0
- package/dist/shared/config/types.d.ts.map +1 -0
- package/dist/shared/config/types.js +2 -0
- package/dist/shared/config/types.js.map +1 -0
- package/dist/shared/config/validate.d.ts +4 -0
- package/dist/shared/config/validate.d.ts.map +1 -0
- package/dist/shared/config/validate.js +23 -0
- package/dist/shared/config/validate.js.map +1 -0
- package/dist/shared/config.d.ts +4 -161
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +5 -269
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/errors.js +1 -1
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/paths.d.ts +6 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +12 -0
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/persistence/backends/sqlite.d.ts +9 -5
- package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -1
- package/dist/shared/persistence/backends/sqlite.js +107 -135
- package/dist/shared/persistence/backends/sqlite.js.map +1 -1
- package/dist/shared/queue-sqlite.d.ts +9 -4
- package/dist/shared/queue-sqlite.d.ts.map +1 -1
- package/dist/shared/queue-sqlite.js +41 -36
- package/dist/shared/queue-sqlite.js.map +1 -1
- package/dist/shared/state-store-sqlite.d.ts +8 -3
- package/dist/shared/state-store-sqlite.d.ts.map +1 -1
- package/dist/shared/state-store-sqlite.js +55 -37
- package/dist/shared/state-store-sqlite.js.map +1 -1
- package/dist/stats/store.d.ts +11 -2
- package/dist/stats/store.d.ts.map +1 -1
- package/dist/stats/store.js +200 -291
- package/dist/stats/store.js.map +1 -1
- package/package.json +4 -1
- package/dist/agents/execution-engine.d.ts +0 -19
- package/dist/agents/execution-engine.d.ts.map +0 -1
- package/dist/agents/execution-engine.js +0 -179
- package/dist/agents/execution-engine.js.map +0 -1
- package/dist/agents/runner.d.ts +0 -38
- package/dist/agents/runner.d.ts.map +0 -1
- package/dist/agents/runner.js +0 -375
- package/dist/agents/runner.js.map +0 -1
- package/dist/frontend/assets/index-CSIS2n0j.css +0 -2
- package/dist/frontend/assets/index-W_Sfmu8j.js +0 -13
|
@@ -1,156 +1,99 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLite backend for unified persistence layer.
|
|
2
|
+
* SQLite backend for unified persistence layer using Drizzle ORM.
|
|
3
3
|
*
|
|
4
4
|
* Implements the PersistenceBackend interface with SQLite storage,
|
|
5
5
|
* combining key-value operations, event sourcing, and query capabilities
|
|
6
6
|
* in a single database with optimized indexes and transaction support.
|
|
7
|
+
*
|
|
8
|
+
* Supports two constructor signatures:
|
|
9
|
+
* new SqliteBackend(dbPath: string) — creates its own connection (backward compat)
|
|
10
|
+
* new SqliteBackend(db: AppDb) — uses a shared connection (preferred)
|
|
7
11
|
*/
|
|
8
|
-
import
|
|
9
|
-
import { mkdirSync } from "fs";
|
|
10
|
-
import { dirname } from "path";
|
|
12
|
+
import { eq, and, isNull, or, gt } from "drizzle-orm";
|
|
11
13
|
import { randomUUID } from "crypto";
|
|
14
|
+
import { createDb } from "../../../db/connection.js";
|
|
15
|
+
import { applyMigrations } from "../../../db/migrate.js";
|
|
16
|
+
import { kvStoreTable, snapshotsTable } from "../../../db/schema.js";
|
|
12
17
|
export class SqliteBackend {
|
|
13
|
-
dbPath;
|
|
14
18
|
db;
|
|
15
|
-
|
|
19
|
+
ownDb;
|
|
16
20
|
sweepTimer;
|
|
17
21
|
transactionDepth = 0;
|
|
18
|
-
constructor(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
constructor(dbOrPath) {
|
|
23
|
+
if (typeof dbOrPath === "string") {
|
|
24
|
+
this.db = createDb(dbOrPath);
|
|
25
|
+
this.ownDb = true;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.db = dbOrPath;
|
|
29
|
+
this.ownDb = false;
|
|
22
30
|
}
|
|
23
|
-
this.db = new Database(dbPath);
|
|
24
|
-
this.db.pragma("journal_mode = WAL");
|
|
25
|
-
this.db.pragma("synchronous = NORMAL");
|
|
26
|
-
this.db.pragma("cache_size = 1000");
|
|
27
|
-
this.db.pragma("temp_store = memory");
|
|
28
31
|
}
|
|
29
32
|
async init() {
|
|
30
|
-
//
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
value TEXT NOT NULL,
|
|
36
|
-
expires_at INTEGER,
|
|
37
|
-
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
38
|
-
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
39
|
-
PRIMARY KEY (namespace, key)
|
|
40
|
-
)
|
|
41
|
-
`);
|
|
42
|
-
this.db.exec(`
|
|
43
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
44
|
-
id TEXT PRIMARY KEY,
|
|
45
|
-
stream TEXT NOT NULL,
|
|
46
|
-
type TEXT NOT NULL,
|
|
47
|
-
data TEXT NOT NULL,
|
|
48
|
-
metadata TEXT,
|
|
49
|
-
timestamp INTEGER NOT NULL,
|
|
50
|
-
version INTEGER NOT NULL DEFAULT 1,
|
|
51
|
-
sequence INTEGER NOT NULL
|
|
52
|
-
)
|
|
53
|
-
`);
|
|
54
|
-
this.db.exec(`
|
|
55
|
-
CREATE TABLE IF NOT EXISTS snapshots (
|
|
56
|
-
stream TEXT NOT NULL,
|
|
57
|
-
type TEXT NOT NULL,
|
|
58
|
-
data TEXT NOT NULL,
|
|
59
|
-
event_id TEXT NOT NULL,
|
|
60
|
-
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
61
|
-
PRIMARY KEY (stream, type)
|
|
62
|
-
)
|
|
63
|
-
`);
|
|
64
|
-
// Create indexes
|
|
65
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_kv_expires ON kv_store(expires_at) WHERE expires_at IS NOT NULL");
|
|
66
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_kv_namespace ON kv_store(namespace)");
|
|
67
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_events_stream ON events(stream, sequence)");
|
|
68
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_events_type ON events(stream, type, timestamp)");
|
|
69
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(stream, timestamp)");
|
|
70
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_snapshots_stream ON snapshots(stream)");
|
|
71
|
-
// Prepare statements
|
|
72
|
-
this.stmts = {
|
|
73
|
-
// Key-value operations
|
|
74
|
-
kvGet: this.db.prepare(`
|
|
75
|
-
SELECT value FROM kv_store
|
|
76
|
-
WHERE namespace = ? AND key = ? AND (expires_at IS NULL OR expires_at > ?)
|
|
77
|
-
`),
|
|
78
|
-
kvSet: this.db.prepare(`
|
|
79
|
-
INSERT OR REPLACE INTO kv_store (namespace, key, value, expires_at, updated_at)
|
|
80
|
-
VALUES (?, ?, ?, ?, ?)
|
|
81
|
-
`),
|
|
82
|
-
kvDelete: this.db.prepare("DELETE FROM kv_store WHERE namespace = ? AND key = ?"),
|
|
83
|
-
kvDeleteAll: this.db.prepare("DELETE FROM kv_store WHERE namespace = ?"),
|
|
84
|
-
kvList: this.db.prepare(`
|
|
85
|
-
SELECT key, value FROM kv_store
|
|
86
|
-
WHERE namespace = ? AND (expires_at IS NULL OR expires_at > ?)
|
|
87
|
-
ORDER BY key
|
|
88
|
-
`),
|
|
89
|
-
// Event operations
|
|
90
|
-
eventAppend: this.db.prepare(`
|
|
91
|
-
INSERT INTO events (id, stream, type, data, metadata, timestamp, version, sequence)
|
|
92
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, (
|
|
93
|
-
SELECT COALESCE(MAX(sequence), 0) + 1 FROM events WHERE stream = ?
|
|
94
|
-
))
|
|
95
|
-
`),
|
|
96
|
-
eventReplay: this.db.prepare(`
|
|
97
|
-
SELECT id, stream, type, data, metadata, timestamp, version, sequence
|
|
98
|
-
FROM events
|
|
99
|
-
WHERE stream = ?
|
|
100
|
-
AND (? IS NULL OR type = ?)
|
|
101
|
-
AND (? IS NULL OR timestamp >= ?)
|
|
102
|
-
AND (? IS NULL OR timestamp < ?)
|
|
103
|
-
ORDER BY sequence ASC
|
|
104
|
-
LIMIT ? OFFSET ?
|
|
105
|
-
`),
|
|
106
|
-
eventCount: this.db.prepare(`
|
|
107
|
-
SELECT COUNT(*) as count FROM events
|
|
108
|
-
WHERE stream = ?
|
|
109
|
-
AND (? IS NULL OR type = ?)
|
|
110
|
-
AND (? IS NULL OR timestamp >= ?)
|
|
111
|
-
AND (? IS NULL OR timestamp < ?)
|
|
112
|
-
`),
|
|
113
|
-
eventListStreams: this.db.prepare("SELECT DISTINCT stream FROM events ORDER BY stream"),
|
|
114
|
-
// Snapshot operations
|
|
115
|
-
snapshotGet: this.db.prepare("SELECT data FROM snapshots WHERE stream = ? AND type = ?"),
|
|
116
|
-
snapshotSet: this.db.prepare(`
|
|
117
|
-
INSERT OR REPLACE INTO snapshots (stream, type, data, event_id, created_at)
|
|
118
|
-
VALUES (?, ?, ?, ?, ?)
|
|
119
|
-
`),
|
|
120
|
-
// Cleanup
|
|
121
|
-
sweep: this.db.prepare("DELETE FROM kv_store WHERE expires_at IS NOT NULL AND expires_at <= ?"),
|
|
122
|
-
};
|
|
123
|
-
// Start periodic cleanup of expired KV entries
|
|
33
|
+
// When this instance owns its DB connection, run migrations to set up schema.
|
|
34
|
+
if (this.ownDb) {
|
|
35
|
+
applyMigrations(this.db);
|
|
36
|
+
}
|
|
37
|
+
// Start periodic cleanup of expired KV entries.
|
|
124
38
|
this.sweepTimer = setInterval(() => this.sweep(), 60_000);
|
|
125
39
|
if (this.sweepTimer.unref)
|
|
126
40
|
this.sweepTimer.unref();
|
|
127
41
|
}
|
|
128
42
|
// Key-value operations
|
|
129
43
|
async kvGet(namespace, key) {
|
|
130
|
-
const
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
const rows = this.db
|
|
46
|
+
.select({ value: kvStoreTable.value })
|
|
47
|
+
.from(kvStoreTable)
|
|
48
|
+
.where(and(eq(kvStoreTable.namespace, namespace), eq(kvStoreTable.key, key), or(isNull(kvStoreTable.expiresAt), gt(kvStoreTable.expiresAt, now))))
|
|
49
|
+
.all();
|
|
50
|
+
const row = rows[0];
|
|
131
51
|
return row ? JSON.parse(row.value) : null;
|
|
132
52
|
}
|
|
133
53
|
async kvSet(namespace, key, value, ttlMs) {
|
|
134
54
|
const expiresAt = ttlMs ? Date.now() + ttlMs : null;
|
|
135
55
|
const now = Date.now();
|
|
136
|
-
this.
|
|
56
|
+
this.db
|
|
57
|
+
.insert(kvStoreTable)
|
|
58
|
+
.values({ namespace, key, value: JSON.stringify(value), expiresAt, createdAt: now, updatedAt: now })
|
|
59
|
+
.onConflictDoUpdate({
|
|
60
|
+
target: [kvStoreTable.namespace, kvStoreTable.key],
|
|
61
|
+
set: { value: JSON.stringify(value), expiresAt, updatedAt: now },
|
|
62
|
+
})
|
|
63
|
+
.run();
|
|
137
64
|
}
|
|
138
65
|
async kvDelete(namespace, key) {
|
|
139
|
-
this.
|
|
66
|
+
this.db
|
|
67
|
+
.delete(kvStoreTable)
|
|
68
|
+
.where(and(eq(kvStoreTable.namespace, namespace), eq(kvStoreTable.key, key)))
|
|
69
|
+
.run();
|
|
140
70
|
}
|
|
141
71
|
async kvDeleteAll(namespace) {
|
|
142
|
-
this.
|
|
72
|
+
this.db.delete(kvStoreTable).where(eq(kvStoreTable.namespace, namespace)).run();
|
|
143
73
|
}
|
|
144
74
|
async kvList(namespace) {
|
|
145
|
-
const
|
|
146
|
-
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const rows = this.db
|
|
77
|
+
.select({ key: kvStoreTable.key, value: kvStoreTable.value })
|
|
78
|
+
.from(kvStoreTable)
|
|
79
|
+
.where(and(eq(kvStoreTable.namespace, namespace), or(isNull(kvStoreTable.expiresAt), gt(kvStoreTable.expiresAt, now))))
|
|
80
|
+
.all();
|
|
81
|
+
return rows.map((row) => ({ key: row.key, value: JSON.parse(row.value) }));
|
|
147
82
|
}
|
|
148
83
|
// Event operations
|
|
149
84
|
async eventAppend(stream, event) {
|
|
150
85
|
const id = randomUUID();
|
|
151
86
|
const timestamp = Date.now();
|
|
152
|
-
|
|
153
|
-
|
|
87
|
+
// Compute next sequence number and insert atomically using raw SQL subquery
|
|
88
|
+
const client = this.db.$client;
|
|
89
|
+
client
|
|
90
|
+
.prepare(`
|
|
91
|
+
INSERT INTO events (id, stream, type, data, metadata, timestamp, version, sequence)
|
|
92
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, (
|
|
93
|
+
SELECT COALESCE(MAX(sequence), 0) + 1 FROM events WHERE stream = ?
|
|
94
|
+
))
|
|
95
|
+
`)
|
|
96
|
+
.run(id, stream, event.type, JSON.stringify(event.data), event.metadata ? JSON.stringify(event.metadata) : null, timestamp, event.version, stream);
|
|
154
97
|
return {
|
|
155
98
|
id,
|
|
156
99
|
timestamp,
|
|
@@ -161,12 +104,23 @@ export class SqliteBackend {
|
|
|
161
104
|
};
|
|
162
105
|
}
|
|
163
106
|
async *eventReplay(stream, query) {
|
|
164
|
-
const type = query?.type
|
|
165
|
-
const from = query?.from
|
|
166
|
-
const to = query?.to
|
|
167
|
-
const limit = Math.min(query?.limit
|
|
168
|
-
const offset = query?.offset
|
|
169
|
-
const rows = this.
|
|
107
|
+
const type = query?.type ?? null;
|
|
108
|
+
const from = query?.from ?? null;
|
|
109
|
+
const to = query?.to ?? null;
|
|
110
|
+
const limit = Math.min(query?.limit ?? 1000, 10000);
|
|
111
|
+
const offset = query?.offset ?? 0;
|
|
112
|
+
const rows = this.db.$client
|
|
113
|
+
.prepare(`
|
|
114
|
+
SELECT id, stream, type, data, metadata, timestamp, version, sequence
|
|
115
|
+
FROM events
|
|
116
|
+
WHERE stream = ?
|
|
117
|
+
AND (? IS NULL OR type = ?)
|
|
118
|
+
AND (? IS NULL OR timestamp >= ?)
|
|
119
|
+
AND (? IS NULL OR timestamp < ?)
|
|
120
|
+
ORDER BY sequence ASC
|
|
121
|
+
LIMIT ? OFFSET ?
|
|
122
|
+
`)
|
|
123
|
+
.all(stream, type, type, from, from, to, to, limit, offset);
|
|
170
124
|
for (const row of rows) {
|
|
171
125
|
yield {
|
|
172
126
|
id: row.id,
|
|
@@ -179,44 +133,58 @@ export class SqliteBackend {
|
|
|
179
133
|
}
|
|
180
134
|
}
|
|
181
135
|
async eventGetSnapshot(stream, type) {
|
|
182
|
-
const
|
|
136
|
+
const rows = this.db
|
|
137
|
+
.select({ data: snapshotsTable.data })
|
|
138
|
+
.from(snapshotsTable)
|
|
139
|
+
.where(and(eq(snapshotsTable.stream, stream), eq(snapshotsTable.type, type)))
|
|
140
|
+
.all();
|
|
141
|
+
const row = rows[0];
|
|
183
142
|
return row ? JSON.parse(row.data) : null;
|
|
184
143
|
}
|
|
185
144
|
async eventSaveSnapshot(stream, type, data, eventId) {
|
|
186
145
|
const now = Date.now();
|
|
187
|
-
this.
|
|
146
|
+
this.db
|
|
147
|
+
.insert(snapshotsTable)
|
|
148
|
+
.values({ stream, type, data: JSON.stringify(data), eventId, createdAt: now })
|
|
149
|
+
.onConflictDoUpdate({
|
|
150
|
+
target: [snapshotsTable.stream, snapshotsTable.type],
|
|
151
|
+
set: { data: JSON.stringify(data), eventId, createdAt: now },
|
|
152
|
+
})
|
|
153
|
+
.run();
|
|
188
154
|
}
|
|
189
155
|
async eventListStreams() {
|
|
190
|
-
const rows = this.
|
|
191
|
-
|
|
156
|
+
const rows = this.db.$client
|
|
157
|
+
.prepare("SELECT DISTINCT stream FROM events ORDER BY stream")
|
|
158
|
+
.all();
|
|
159
|
+
return rows.map((row) => row.stream);
|
|
192
160
|
}
|
|
193
|
-
// Query operations
|
|
161
|
+
// Query operations — allow arbitrary SQL strings
|
|
194
162
|
async querySql(query, params = []) {
|
|
195
163
|
try {
|
|
196
|
-
const stmt = this.db.prepare(query);
|
|
164
|
+
const stmt = this.db.$client.prepare(query);
|
|
197
165
|
return stmt.all(...params);
|
|
198
166
|
}
|
|
199
167
|
catch (error) {
|
|
200
|
-
throw new Error(`SQL query failed: ${error instanceof Error ? error.message :
|
|
168
|
+
throw new Error(`SQL query failed: ${error instanceof Error ? error.message : "unknown error"}`);
|
|
201
169
|
}
|
|
202
170
|
}
|
|
203
171
|
// Transaction operations
|
|
204
172
|
async transactionBegin() {
|
|
205
173
|
if (this.transactionDepth === 0) {
|
|
206
|
-
this.db.exec("BEGIN");
|
|
174
|
+
this.db.$client.exec("BEGIN");
|
|
207
175
|
}
|
|
208
176
|
this.transactionDepth++;
|
|
209
177
|
}
|
|
210
178
|
async transactionCommit() {
|
|
211
179
|
this.transactionDepth--;
|
|
212
180
|
if (this.transactionDepth === 0) {
|
|
213
|
-
this.db.exec("COMMIT");
|
|
181
|
+
this.db.$client.exec("COMMIT");
|
|
214
182
|
}
|
|
215
183
|
}
|
|
216
184
|
async transactionRollback() {
|
|
217
185
|
this.transactionDepth--;
|
|
218
186
|
if (this.transactionDepth === 0) {
|
|
219
|
-
this.db.exec("ROLLBACK");
|
|
187
|
+
this.db.$client.exec("ROLLBACK");
|
|
220
188
|
}
|
|
221
189
|
}
|
|
222
190
|
async transactionRun(fn) {
|
|
@@ -234,7 +202,9 @@ export class SqliteBackend {
|
|
|
234
202
|
// Cleanup and maintenance
|
|
235
203
|
sweep() {
|
|
236
204
|
const now = Date.now();
|
|
237
|
-
const result = this.
|
|
205
|
+
const result = this.db.$client
|
|
206
|
+
.prepare("DELETE FROM kv_store WHERE expires_at IS NOT NULL AND expires_at <= ?")
|
|
207
|
+
.run(now);
|
|
238
208
|
if (result.changes > 0) {
|
|
239
209
|
console.debug(`Cleaned up ${result.changes} expired KV entries`);
|
|
240
210
|
}
|
|
@@ -244,7 +214,9 @@ export class SqliteBackend {
|
|
|
244
214
|
clearInterval(this.sweepTimer);
|
|
245
215
|
this.sweepTimer = undefined;
|
|
246
216
|
}
|
|
247
|
-
this.
|
|
217
|
+
if (this.ownDb) {
|
|
218
|
+
this.db.$client.close();
|
|
219
|
+
}
|
|
248
220
|
}
|
|
249
221
|
}
|
|
250
222
|
//# sourceMappingURL=sqlite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../src/shared/persistence/backends/sqlite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../src/shared/persistence/backends/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { AppDb } from "../db/connection.js";
|
|
1
2
|
import type { Queue, QueueItem } from "./queue.js";
|
|
2
3
|
/**
|
|
3
|
-
* SQLite-backed Queue.
|
|
4
|
+
* SQLite-backed Queue using Drizzle ORM.
|
|
4
5
|
*
|
|
5
|
-
* All queue instances sharing a
|
|
6
|
+
* All queue instances sharing a connection use a single `queue` table,
|
|
6
7
|
* differentiated by a `name` column — the same pattern SqliteStateStore
|
|
7
8
|
* uses for namespaces.
|
|
8
9
|
*
|
|
@@ -12,13 +13,17 @@ import type { Queue, QueueItem } from "./queue.js";
|
|
|
12
13
|
*
|
|
13
14
|
* Dequeue is atomic: a transaction selects and deletes the head rows
|
|
14
15
|
* so concurrent readers (if any) cannot claim the same items.
|
|
16
|
+
*
|
|
17
|
+
* Supports two constructor signatures:
|
|
18
|
+
* new SqliteQueue(dbPath: string, name) — creates its own connection (backward compat)
|
|
19
|
+
* new SqliteQueue(db: AppDb, name) — uses a shared connection (preferred)
|
|
15
20
|
*/
|
|
16
21
|
export declare class SqliteQueue<T> implements Queue<T> {
|
|
17
22
|
private db;
|
|
18
|
-
private
|
|
23
|
+
private ownDb;
|
|
19
24
|
private readonly name;
|
|
20
25
|
private _dequeueTransaction;
|
|
21
|
-
constructor(
|
|
26
|
+
constructor(dbOrPath: string | AppDb, name: string);
|
|
22
27
|
enqueue(payload: T): Promise<string>;
|
|
23
28
|
dequeue(limit?: number): Promise<QueueItem<T>[]>;
|
|
24
29
|
peek(limit?: number): Promise<QueueItem<T>[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-sqlite.d.ts","sourceRoot":"","sources":["../../src/shared/queue-sqlite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-sqlite.d.ts","sourceRoot":"","sources":["../../src/shared/queue-sqlite.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,KAAK,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAQ;IAClB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,mBAAmB,CAIxB;gBAES,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM;IA4B5C,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWpC,OAAO,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAS3C,IAAI,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAWxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAOvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import Database from "better-sqlite3";
|
|
2
|
-
import { mkdirSync } from "fs";
|
|
3
|
-
import { dirname } from "path";
|
|
4
1
|
import { randomUUID } from "crypto";
|
|
2
|
+
import { createDb } from "../db/connection.js";
|
|
3
|
+
import { applyMigrations } from "../db/migrate.js";
|
|
4
|
+
import { queueTable } from "../db/schema.js";
|
|
5
5
|
/**
|
|
6
|
-
* SQLite-backed Queue.
|
|
6
|
+
* SQLite-backed Queue using Drizzle ORM.
|
|
7
7
|
*
|
|
8
|
-
* All queue instances sharing a
|
|
8
|
+
* All queue instances sharing a connection use a single `queue` table,
|
|
9
9
|
* differentiated by a `name` column — the same pattern SqliteStateStore
|
|
10
10
|
* uses for namespaces.
|
|
11
11
|
*
|
|
@@ -15,48 +15,47 @@ import { randomUUID } from "crypto";
|
|
|
15
15
|
*
|
|
16
16
|
* Dequeue is atomic: a transaction selects and deletes the head rows
|
|
17
17
|
* so concurrent readers (if any) cannot claim the same items.
|
|
18
|
+
*
|
|
19
|
+
* Supports two constructor signatures:
|
|
20
|
+
* new SqliteQueue(dbPath: string, name) — creates its own connection (backward compat)
|
|
21
|
+
* new SqliteQueue(db: AppDb, name) — uses a shared connection (preferred)
|
|
18
22
|
*/
|
|
19
23
|
export class SqliteQueue {
|
|
20
24
|
db;
|
|
21
|
-
|
|
22
|
-
// the public Queue interface provides the type safety boundary.
|
|
23
|
-
stmts;
|
|
25
|
+
ownDb;
|
|
24
26
|
name;
|
|
25
27
|
_dequeueTransaction;
|
|
26
|
-
constructor(
|
|
28
|
+
constructor(dbOrPath, name) {
|
|
27
29
|
this.name = name;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
)
|
|
39
|
-
`);
|
|
40
|
-
this.db.exec("CREATE INDEX IF NOT EXISTS idx_queue_name ON queue(name)");
|
|
41
|
-
// Prepare statements once for performance.
|
|
42
|
-
this.stmts = {
|
|
43
|
-
enqueue: this.db.prepare("INSERT INTO queue (id, name, payload, enqueued_at) VALUES (?, ?, ?, ?)"),
|
|
44
|
-
peek: this.db.prepare("SELECT id, payload, enqueued_at FROM queue WHERE name = ? ORDER BY rowid ASC LIMIT ?"),
|
|
45
|
-
delete: this.db.prepare("DELETE FROM queue WHERE name = ? AND id = ?"),
|
|
46
|
-
size: this.db.prepare("SELECT COUNT(*) AS n FROM queue WHERE name = ?"),
|
|
47
|
-
};
|
|
30
|
+
if (typeof dbOrPath === "string") {
|
|
31
|
+
this.db = createDb(dbOrPath);
|
|
32
|
+
this.ownDb = true;
|
|
33
|
+
applyMigrations(this.db);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.db = dbOrPath;
|
|
37
|
+
this.ownDb = false;
|
|
38
|
+
}
|
|
39
|
+
const client = this.db.$client;
|
|
48
40
|
// Pre-compiled transaction for atomic dequeue (select + delete in one shot).
|
|
49
|
-
this._dequeueTransaction =
|
|
50
|
-
const rows =
|
|
41
|
+
this._dequeueTransaction = client.transaction((queueName, limit) => {
|
|
42
|
+
const rows = client
|
|
43
|
+
.prepare("SELECT id, payload, enqueued_at FROM queue WHERE name = ? ORDER BY rowid ASC LIMIT ?")
|
|
44
|
+
.all(queueName, limit);
|
|
51
45
|
for (const row of rows) {
|
|
52
|
-
|
|
46
|
+
client.prepare("DELETE FROM queue WHERE name = ? AND id = ?").run(queueName, row.id);
|
|
53
47
|
}
|
|
54
48
|
return rows;
|
|
55
49
|
});
|
|
56
50
|
}
|
|
57
51
|
async enqueue(payload) {
|
|
58
52
|
const id = randomUUID();
|
|
59
|
-
this.
|
|
53
|
+
this.db.insert(queueTable).values({
|
|
54
|
+
id,
|
|
55
|
+
name: this.name,
|
|
56
|
+
payload: JSON.stringify(payload),
|
|
57
|
+
enqueuedAt: Date.now(),
|
|
58
|
+
}).run();
|
|
60
59
|
return id;
|
|
61
60
|
}
|
|
62
61
|
async dequeue(limit = 1) {
|
|
@@ -68,7 +67,9 @@ export class SqliteQueue {
|
|
|
68
67
|
}));
|
|
69
68
|
}
|
|
70
69
|
async peek(limit = 1) {
|
|
71
|
-
const rows = this.
|
|
70
|
+
const rows = this.db.$client
|
|
71
|
+
.prepare("SELECT id, payload, enqueued_at FROM queue WHERE name = ? ORDER BY rowid ASC LIMIT ?")
|
|
72
|
+
.all(this.name, limit);
|
|
72
73
|
return rows.map((r) => ({
|
|
73
74
|
id: r.id,
|
|
74
75
|
payload: JSON.parse(r.payload),
|
|
@@ -76,11 +77,15 @@ export class SqliteQueue {
|
|
|
76
77
|
}));
|
|
77
78
|
}
|
|
78
79
|
async size() {
|
|
79
|
-
const row = this.
|
|
80
|
+
const row = this.db.$client
|
|
81
|
+
.prepare("SELECT COUNT(*) AS n FROM queue WHERE name = ?")
|
|
82
|
+
.get(this.name);
|
|
80
83
|
return row.n;
|
|
81
84
|
}
|
|
82
85
|
async close() {
|
|
83
|
-
this.
|
|
86
|
+
if (this.ownDb) {
|
|
87
|
+
this.db.$client.close();
|
|
88
|
+
}
|
|
84
89
|
}
|
|
85
90
|
}
|
|
86
91
|
//# sourceMappingURL=queue-sqlite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-sqlite.js","sourceRoot":"","sources":["../../src/shared/queue-sqlite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-sqlite.js","sourceRoot":"","sources":["../../src/shared/queue-sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
import type { AppDb } from "../db/connection.js";
|
|
1
2
|
import type { StateStore } from "./state-store.js";
|
|
2
3
|
/**
|
|
3
4
|
* SQLite-backed StateStore for local mode.
|
|
4
5
|
*
|
|
5
|
-
* Uses better-sqlite3 for fast, synchronous, embedded storage.
|
|
6
|
+
* Uses Drizzle ORM with better-sqlite3 for fast, synchronous, embedded storage.
|
|
6
7
|
* The async interface is preserved for API compatibility with the
|
|
7
8
|
* DynamoDB backend — all operations resolve immediately.
|
|
9
|
+
*
|
|
10
|
+
* Supports two constructor signatures:
|
|
11
|
+
* new SqliteStateStore(dbPath: string) — creates its own connection (backward compat)
|
|
12
|
+
* new SqliteStateStore(db: AppDb) — uses a shared connection (preferred)
|
|
8
13
|
*/
|
|
9
14
|
export declare class SqliteStateStore implements StateStore {
|
|
10
15
|
private db;
|
|
11
|
-
private
|
|
16
|
+
private ownDb;
|
|
12
17
|
private sweepTimer;
|
|
13
|
-
constructor(
|
|
18
|
+
constructor(dbOrPath: string | AppDb);
|
|
14
19
|
get<T>(ns: string, key: string): Promise<T | null>;
|
|
15
20
|
set<T>(ns: string, key: string, value: T, opts?: {
|
|
16
21
|
ttl?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-store-sqlite.d.ts","sourceRoot":"","sources":["../../src/shared/state-store-sqlite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state-store-sqlite.d.ts","sourceRoot":"","sources":["../../src/shared/state-store-sqlite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,EAAE,CAAQ;IAClB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,UAAU,CAA6C;gBAEnD,QAAQ,EAAE,MAAM,GAAG,KAAK;IAe9B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiBlD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAepE,+DAA+D;IAC/D,KAAK,IAAI,MAAM;IAST,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}
|