@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.
Files changed (188) hide show
  1. package/dist/agents/container-entry.d.ts.map +1 -1
  2. package/dist/agents/container-entry.js +16 -158
  3. package/dist/agents/container-entry.js.map +1 -1
  4. package/dist/agents/container-runner.d.ts +10 -1
  5. package/dist/agents/container-runner.d.ts.map +1 -1
  6. package/dist/agents/container-runner.js +125 -121
  7. package/dist/agents/container-runner.js.map +1 -1
  8. package/dist/agents/session-loop.d.ts +22 -0
  9. package/dist/agents/session-loop.d.ts.map +1 -0
  10. package/dist/agents/session-loop.js +159 -0
  11. package/dist/agents/session-loop.js.map +1 -0
  12. package/dist/agents/types.d.ts +17 -0
  13. package/dist/agents/types.d.ts.map +1 -0
  14. package/dist/agents/types.js +2 -0
  15. package/dist/agents/types.js.map +1 -0
  16. package/dist/build-info.json +1 -1
  17. package/dist/cli/commands/run-agent.d.ts.map +1 -1
  18. package/dist/cli/commands/run-agent.js +16 -117
  19. package/dist/cli/commands/run-agent.js.map +1 -1
  20. package/dist/control/routes/dashboard-api.d.ts.map +1 -1
  21. package/dist/control/routes/dashboard-api.js +43 -0
  22. package/dist/control/routes/dashboard-api.js.map +1 -1
  23. package/dist/control/routes/stats.d.ts.map +1 -1
  24. package/dist/control/routes/stats.js +54 -0
  25. package/dist/control/routes/stats.js.map +1 -1
  26. package/dist/db/connection.d.ts +20 -0
  27. package/dist/db/connection.d.ts.map +1 -0
  28. package/dist/db/connection.js +34 -0
  29. package/dist/db/connection.js.map +1 -0
  30. package/dist/db/index.d.ts +8 -0
  31. package/dist/db/index.d.ts.map +1 -0
  32. package/dist/db/index.js +7 -0
  33. package/dist/db/index.js.map +1 -0
  34. package/dist/db/migrate.d.ts +27 -0
  35. package/dist/db/migrate.d.ts.map +1 -0
  36. package/dist/db/migrate.js +180 -0
  37. package/dist/db/migrate.js.map +1 -0
  38. package/dist/db/schema.d.ts +1383 -0
  39. package/dist/db/schema.d.ts.map +1 -0
  40. package/dist/db/schema.js +158 -0
  41. package/dist/db/schema.js.map +1 -0
  42. package/dist/docker/local-runtime.js +1 -1
  43. package/dist/docker/local-runtime.js.map +1 -1
  44. package/dist/docker/ssh-docker-runtime.js +1 -1
  45. package/dist/docker/ssh-docker-runtime.js.map +1 -1
  46. package/dist/events/event-queue-sqlite.d.ts +8 -3
  47. package/dist/events/event-queue-sqlite.d.ts.map +1 -1
  48. package/dist/events/event-queue-sqlite.js +42 -41
  49. package/dist/events/event-queue-sqlite.js.map +1 -1
  50. package/dist/execution/execution.d.ts +1 -0
  51. package/dist/execution/execution.d.ts.map +1 -1
  52. package/dist/execution/execution.js +8 -3
  53. package/dist/execution/execution.js.map +1 -1
  54. package/dist/frontend/assets/index-BO_q8PRQ.css +2 -0
  55. package/dist/frontend/assets/index-DKQX_6iM.js +13 -0
  56. package/dist/frontend/index.html +2 -2
  57. package/dist/gateway/frontend.d.ts +20 -0
  58. package/dist/gateway/frontend.d.ts.map +1 -0
  59. package/dist/gateway/frontend.js +80 -0
  60. package/dist/gateway/frontend.js.map +1 -0
  61. package/dist/gateway/index.d.ts +3 -70
  62. package/dist/gateway/index.d.ts.map +1 -1
  63. package/dist/gateway/index.js +109 -214
  64. package/dist/gateway/index.js.map +1 -1
  65. package/dist/gateway/middleware/auth.d.ts +12 -0
  66. package/dist/gateway/middleware/auth.d.ts.map +1 -0
  67. package/dist/gateway/middleware/auth.js +25 -0
  68. package/dist/gateway/middleware/auth.js.map +1 -0
  69. package/dist/gateway/middleware/request-logging.d.ts +9 -0
  70. package/dist/gateway/middleware/request-logging.d.ts.map +1 -0
  71. package/dist/gateway/middleware/request-logging.js +26 -0
  72. package/dist/gateway/middleware/request-logging.js.map +1 -0
  73. package/dist/gateway/middleware/telemetry.d.ts +7 -0
  74. package/dist/gateway/middleware/telemetry.d.ts.map +1 -0
  75. package/dist/gateway/middleware/telemetry.js +28 -0
  76. package/dist/gateway/middleware/telemetry.js.map +1 -0
  77. package/dist/gateway/routes/chat.d.ts +32 -0
  78. package/dist/gateway/routes/chat.d.ts.map +1 -0
  79. package/dist/gateway/routes/chat.js +24 -0
  80. package/dist/gateway/routes/chat.js.map +1 -0
  81. package/dist/gateway/routes/dashboard.d.ts +19 -0
  82. package/dist/gateway/routes/dashboard.d.ts.map +1 -0
  83. package/dist/gateway/routes/dashboard.js +26 -0
  84. package/dist/gateway/routes/dashboard.js.map +1 -0
  85. package/dist/gateway/routes/execution.d.ts +24 -0
  86. package/dist/gateway/routes/execution.d.ts.map +1 -0
  87. package/dist/gateway/routes/execution.js +13 -0
  88. package/dist/gateway/routes/execution.js.map +1 -0
  89. package/dist/gateway/routes/system.d.ts +14 -0
  90. package/dist/gateway/routes/system.d.ts.map +1 -0
  91. package/dist/gateway/routes/system.js +18 -0
  92. package/dist/gateway/routes/system.js.map +1 -0
  93. package/dist/gateway/routes/webhooks.d.ts +20 -0
  94. package/dist/gateway/routes/webhooks.d.ts.map +1 -0
  95. package/dist/gateway/routes/webhooks.js +11 -0
  96. package/dist/gateway/routes/webhooks.js.map +1 -0
  97. package/dist/gateway/stores.d.ts +21 -0
  98. package/dist/gateway/stores.d.ts.map +1 -0
  99. package/dist/gateway/stores.js +24 -0
  100. package/dist/gateway/stores.js.map +1 -0
  101. package/dist/gateway/types.d.ts +65 -0
  102. package/dist/gateway/types.d.ts.map +1 -0
  103. package/dist/gateway/types.js +2 -0
  104. package/dist/gateway/types.js.map +1 -0
  105. package/dist/scheduler/dependencies.d.ts +11 -0
  106. package/dist/scheduler/dependencies.d.ts.map +1 -0
  107. package/dist/scheduler/dependencies.js +34 -0
  108. package/dist/scheduler/dependencies.js.map +1 -0
  109. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  110. package/dist/scheduler/gateway-setup.js +8 -2
  111. package/dist/scheduler/gateway-setup.js.map +1 -1
  112. package/dist/scheduler/index.d.ts +1 -1
  113. package/dist/scheduler/index.d.ts.map +1 -1
  114. package/dist/scheduler/index.js +20 -176
  115. package/dist/scheduler/index.js.map +1 -1
  116. package/dist/scheduler/orphan-recovery.d.ts +25 -0
  117. package/dist/scheduler/orphan-recovery.d.ts.map +1 -0
  118. package/dist/scheduler/orphan-recovery.js +130 -0
  119. package/dist/scheduler/orphan-recovery.js.map +1 -0
  120. package/dist/scheduler/persistence.d.ts +18 -0
  121. package/dist/scheduler/persistence.d.ts.map +1 -0
  122. package/dist/scheduler/persistence.js +42 -0
  123. package/dist/scheduler/persistence.js.map +1 -0
  124. package/dist/scheduler/shutdown.d.ts +2 -0
  125. package/dist/scheduler/shutdown.d.ts.map +1 -1
  126. package/dist/scheduler/shutdown.js +8 -1
  127. package/dist/scheduler/shutdown.js.map +1 -1
  128. package/dist/shared/config/index.d.ts +5 -0
  129. package/dist/shared/config/index.d.ts.map +1 -0
  130. package/dist/shared/config/index.js +5 -0
  131. package/dist/shared/config/index.js.map +1 -0
  132. package/dist/shared/config/load-agent.d.ts +27 -0
  133. package/dist/shared/config/load-agent.d.ts.map +1 -0
  134. package/dist/shared/config/load-agent.js +169 -0
  135. package/dist/shared/config/load-agent.js.map +1 -0
  136. package/dist/shared/config/load-project.d.ts +22 -0
  137. package/dist/shared/config/load-project.d.ts.map +1 -0
  138. package/dist/shared/config/load-project.js +84 -0
  139. package/dist/shared/config/load-project.js.map +1 -0
  140. package/dist/shared/config/types.d.ts +115 -0
  141. package/dist/shared/config/types.d.ts.map +1 -0
  142. package/dist/shared/config/types.js +2 -0
  143. package/dist/shared/config/types.js.map +1 -0
  144. package/dist/shared/config/validate.d.ts +4 -0
  145. package/dist/shared/config/validate.d.ts.map +1 -0
  146. package/dist/shared/config/validate.js +23 -0
  147. package/dist/shared/config/validate.js.map +1 -0
  148. package/dist/shared/config.d.ts +4 -161
  149. package/dist/shared/config.d.ts.map +1 -1
  150. package/dist/shared/config.js +5 -269
  151. package/dist/shared/config.js.map +1 -1
  152. package/dist/shared/constants.d.ts +2 -0
  153. package/dist/shared/constants.d.ts.map +1 -1
  154. package/dist/shared/constants.js +2 -0
  155. package/dist/shared/constants.js.map +1 -1
  156. package/dist/shared/errors.js +1 -1
  157. package/dist/shared/errors.js.map +1 -1
  158. package/dist/shared/paths.d.ts +6 -0
  159. package/dist/shared/paths.d.ts.map +1 -1
  160. package/dist/shared/paths.js +12 -0
  161. package/dist/shared/paths.js.map +1 -1
  162. package/dist/shared/persistence/backends/sqlite.d.ts +9 -5
  163. package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -1
  164. package/dist/shared/persistence/backends/sqlite.js +107 -135
  165. package/dist/shared/persistence/backends/sqlite.js.map +1 -1
  166. package/dist/shared/queue-sqlite.d.ts +9 -4
  167. package/dist/shared/queue-sqlite.d.ts.map +1 -1
  168. package/dist/shared/queue-sqlite.js +41 -36
  169. package/dist/shared/queue-sqlite.js.map +1 -1
  170. package/dist/shared/state-store-sqlite.d.ts +8 -3
  171. package/dist/shared/state-store-sqlite.d.ts.map +1 -1
  172. package/dist/shared/state-store-sqlite.js +55 -37
  173. package/dist/shared/state-store-sqlite.js.map +1 -1
  174. package/dist/stats/store.d.ts +11 -2
  175. package/dist/stats/store.d.ts.map +1 -1
  176. package/dist/stats/store.js +200 -291
  177. package/dist/stats/store.js.map +1 -1
  178. package/package.json +4 -1
  179. package/dist/agents/execution-engine.d.ts +0 -19
  180. package/dist/agents/execution-engine.d.ts.map +0 -1
  181. package/dist/agents/execution-engine.js +0 -179
  182. package/dist/agents/execution-engine.js.map +0 -1
  183. package/dist/agents/runner.d.ts +0 -38
  184. package/dist/agents/runner.d.ts.map +0 -1
  185. package/dist/agents/runner.js +0 -375
  186. package/dist/agents/runner.js.map +0 -1
  187. package/dist/frontend/assets/index-CSIS2n0j.css +0 -2
  188. 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 Database from "better-sqlite3";
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
- stmts = {};
19
+ ownDb;
16
20
  sweepTimer;
17
21
  transactionDepth = 0;
18
- constructor(dbPath) {
19
- this.dbPath = dbPath;
20
- if (dbPath !== ":memory:") {
21
- mkdirSync(dirname(dbPath), { recursive: true });
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
- // Create tables
31
- this.db.exec(`
32
- CREATE TABLE IF NOT EXISTS kv_store (
33
- namespace TEXT NOT NULL,
34
- key TEXT NOT NULL,
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 row = this.stmts.kvGet.get(namespace, key, Date.now());
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.stmts.kvSet.run(namespace, key, JSON.stringify(value), expiresAt, now);
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.stmts.kvDelete.run(namespace, key);
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.stmts.kvDeleteAll.run(namespace);
72
+ this.db.delete(kvStoreTable).where(eq(kvStoreTable.namespace, namespace)).run();
143
73
  }
144
74
  async kvList(namespace) {
145
- const rows = this.stmts.kvList.all(namespace, Date.now());
146
- return rows.map(row => ({ key: row.key, value: JSON.parse(row.value) }));
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
- this.stmts.eventAppend.run(id, stream, event.type, JSON.stringify(event.data), event.metadata ? JSON.stringify(event.metadata) : null, timestamp, event.version, stream // for the sequence subquery
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 || null;
165
- const from = query?.from || null;
166
- const to = query?.to || null;
167
- const limit = Math.min(query?.limit || 1000, 10000); // Cap at 10k for safety
168
- const offset = query?.offset || 0;
169
- const rows = this.stmts.eventReplay.all(stream, type, type, from, from, to, to, limit, offset);
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 row = this.stmts.snapshotGet.get(stream, type);
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.stmts.snapshotSet.run(stream, type, JSON.stringify(data), eventId, now);
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.stmts.eventListStreams.all();
191
- return rows.map(row => row.stream);
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 : 'unknown error'}`);
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.stmts.sweep.run(now);
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.db.close();
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":"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"}
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 file use a single `queue` table,
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 stmts;
23
+ private ownDb;
19
24
  private readonly name;
20
25
  private _dequeueTransaction;
21
- constructor(dbPath: string, name: string);
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":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,KAAK,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAgC;IAG1C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,mBAAmB,CAIxB;gBAES,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IA+ClC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMpC,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;IAaxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
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 file use a single `queue` table,
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
- // better-sqlite3 generic Statement types don't compose with ReturnType<>;
22
- // the public Queue interface provides the type safety boundary.
23
- stmts;
25
+ ownDb;
24
26
  name;
25
27
  _dequeueTransaction;
26
- constructor(dbPath, name) {
28
+ constructor(dbOrPath, name) {
27
29
  this.name = name;
28
- mkdirSync(dirname(dbPath), { recursive: true });
29
- this.db = new Database(dbPath);
30
- this.db.pragma("journal_mode = WAL");
31
- this.db.exec(`
32
- CREATE TABLE IF NOT EXISTS queue (
33
- id TEXT NOT NULL,
34
- name TEXT NOT NULL,
35
- payload TEXT NOT NULL,
36
- enqueued_at INTEGER NOT NULL,
37
- PRIMARY KEY (name, id)
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 = this.db.transaction((name, limit) => {
50
- const rows = this.stmts.peek.all(name, limit);
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
- this.stmts.delete.run(name, row.id);
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.stmts.enqueue.run(id, this.name, JSON.stringify(payload), Date.now());
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.stmts.peek.all(this.name, limit);
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.stmts.size.get(this.name);
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.db.close();
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":"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"}
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 stmts;
16
+ private ownDb;
12
17
  private sweepTimer;
13
- constructor(dbPath: string);
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":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,EAAE,CAAgC;IAG1C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,UAAU,CAA6C;gBAEnD,MAAM,EAAE,MAAM;IAyCpB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKlD,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;IAKjF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,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;IAKpE,+DAA+D;IAC/D,KAAK,IAAI,MAAM;IAIT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
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"}