@action-llama/action-llama 0.15.0 → 0.16.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 (137) hide show
  1. package/dist/build-info.json +1 -1
  2. package/dist/cli/commands/doctor.d.ts +1 -0
  3. package/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/dist/cli/commands/doctor.js +101 -4
  5. package/dist/cli/commands/doctor.js.map +1 -1
  6. package/dist/cli/commands/webhook.d.ts +11 -0
  7. package/dist/cli/commands/webhook.d.ts.map +1 -0
  8. package/dist/cli/commands/webhook.js +271 -0
  9. package/dist/cli/commands/webhook.js.map +1 -0
  10. package/dist/cli/main.js +17 -0
  11. package/dist/cli/main.js.map +1 -1
  12. package/dist/docker/local-runtime.d.ts.map +1 -1
  13. package/dist/docker/local-runtime.js +36 -7
  14. package/dist/docker/local-runtime.js.map +1 -1
  15. package/dist/docker/runtime.d.ts +4 -0
  16. package/dist/docker/runtime.d.ts.map +1 -1
  17. package/dist/gateway/index.d.ts +2 -0
  18. package/dist/gateway/index.d.ts.map +1 -1
  19. package/dist/gateway/index.js +1 -1
  20. package/dist/gateway/index.js.map +1 -1
  21. package/dist/gateway/routes/webhooks.d.ts +2 -1
  22. package/dist/gateway/routes/webhooks.d.ts.map +1 -1
  23. package/dist/gateway/routes/webhooks.js +3 -2
  24. package/dist/gateway/routes/webhooks.js.map +1 -1
  25. package/dist/remote/push.d.ts.map +1 -1
  26. package/dist/remote/push.js +11 -2
  27. package/dist/remote/push.js.map +1 -1
  28. package/dist/scheduler/event-queue-unified.d.ts +50 -0
  29. package/dist/scheduler/event-queue-unified.d.ts.map +1 -0
  30. package/dist/scheduler/event-queue-unified.js +280 -0
  31. package/dist/scheduler/event-queue-unified.js.map +1 -0
  32. package/dist/scheduler/execution.d.ts +2 -1
  33. package/dist/scheduler/execution.d.ts.map +1 -1
  34. package/dist/scheduler/execution.js +48 -8
  35. package/dist/scheduler/execution.js.map +1 -1
  36. package/dist/scheduler/gateway-setup.d.ts +2 -1
  37. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  38. package/dist/scheduler/gateway-setup.js +2 -1
  39. package/dist/scheduler/gateway-setup.js.map +1 -1
  40. package/dist/scheduler/index.js +1 -1
  41. package/dist/scheduler/index.js.map +1 -1
  42. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts +114 -0
  43. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts.map +1 -0
  44. package/dist/scheduler/lifecycle/agent-lifecycle.js +236 -0
  45. package/dist/scheduler/lifecycle/agent-lifecycle.js.map +1 -0
  46. package/dist/scheduler/lifecycle/index.d.ts +60 -0
  47. package/dist/scheduler/lifecycle/index.d.ts.map +1 -0
  48. package/dist/scheduler/lifecycle/index.js +103 -0
  49. package/dist/scheduler/lifecycle/index.js.map +1 -0
  50. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts +88 -0
  51. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts.map +1 -0
  52. package/dist/scheduler/lifecycle/instance-lifecycle.js +142 -0
  53. package/dist/scheduler/lifecycle/instance-lifecycle.js.map +1 -0
  54. package/dist/scheduler/types.d.ts +2 -0
  55. package/dist/scheduler/types.d.ts.map +1 -1
  56. package/dist/scheduler/webhook-setup.d.ts +1 -0
  57. package/dist/scheduler/webhook-setup.d.ts.map +1 -1
  58. package/dist/scheduler/webhook-setup.js +14 -2
  59. package/dist/scheduler/webhook-setup.js.map +1 -1
  60. package/dist/shared/config.d.ts +1 -0
  61. package/dist/shared/config.d.ts.map +1 -1
  62. package/dist/shared/config.js.map +1 -1
  63. package/dist/shared/constants.d.ts +16 -0
  64. package/dist/shared/constants.d.ts.map +1 -1
  65. package/dist/shared/constants.js +54 -0
  66. package/dist/shared/constants.js.map +1 -1
  67. package/dist/shared/persistence/adapters/state-store.d.ts +24 -0
  68. package/dist/shared/persistence/adapters/state-store.d.ts.map +1 -0
  69. package/dist/shared/persistence/adapters/state-store.js +32 -0
  70. package/dist/shared/persistence/adapters/state-store.js.map +1 -0
  71. package/dist/shared/persistence/adapters/stats-store.d.ts +49 -0
  72. package/dist/shared/persistence/adapters/stats-store.d.ts.map +1 -0
  73. package/dist/shared/persistence/adapters/stats-store.js +213 -0
  74. package/dist/shared/persistence/adapters/stats-store.js.map +1 -0
  75. package/dist/shared/persistence/backends/memory.d.ts +39 -0
  76. package/dist/shared/persistence/backends/memory.d.ts.map +1 -0
  77. package/dist/shared/persistence/backends/memory.js +214 -0
  78. package/dist/shared/persistence/backends/memory.js.map +1 -0
  79. package/dist/shared/persistence/backends/sqlite.d.ts +38 -0
  80. package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -0
  81. package/dist/shared/persistence/backends/sqlite.js +250 -0
  82. package/dist/shared/persistence/backends/sqlite.js.map +1 -0
  83. package/dist/shared/persistence/event-store.d.ts +77 -0
  84. package/dist/shared/persistence/event-store.d.ts.map +1 -0
  85. package/dist/shared/persistence/event-store.js +139 -0
  86. package/dist/shared/persistence/event-store.js.map +1 -0
  87. package/dist/shared/persistence/index.d.ts +119 -0
  88. package/dist/shared/persistence/index.d.ts.map +1 -0
  89. package/dist/shared/persistence/index.js +93 -0
  90. package/dist/shared/persistence/index.js.map +1 -0
  91. package/dist/shared/persistence/migration.d.ts +47 -0
  92. package/dist/shared/persistence/migration.d.ts.map +1 -0
  93. package/dist/shared/persistence/migration.js +297 -0
  94. package/dist/shared/persistence/migration.js.map +1 -0
  95. package/dist/shared/validation.d.ts +61 -0
  96. package/dist/shared/validation.d.ts.map +1 -0
  97. package/dist/shared/validation.js +280 -0
  98. package/dist/shared/validation.js.map +1 -0
  99. package/dist/stats/event-store.d.ts +37 -0
  100. package/dist/stats/event-store.d.ts.map +1 -0
  101. package/dist/stats/event-store.js +366 -0
  102. package/dist/stats/event-store.js.map +1 -0
  103. package/dist/tui/status-tracker.d.ts +19 -0
  104. package/dist/tui/status-tracker.d.ts.map +1 -1
  105. package/dist/tui/status-tracker.js +96 -1
  106. package/dist/tui/status-tracker.js.map +1 -1
  107. package/dist/webhooks/providers/github.d.ts +1 -1
  108. package/dist/webhooks/providers/github.d.ts.map +1 -1
  109. package/dist/webhooks/providers/github.js +2 -2
  110. package/dist/webhooks/providers/github.js.map +1 -1
  111. package/dist/webhooks/providers/linear.d.ts +1 -1
  112. package/dist/webhooks/providers/linear.d.ts.map +1 -1
  113. package/dist/webhooks/providers/linear.js +2 -2
  114. package/dist/webhooks/providers/linear.js.map +1 -1
  115. package/dist/webhooks/providers/mintlify.d.ts +1 -1
  116. package/dist/webhooks/providers/mintlify.d.ts.map +1 -1
  117. package/dist/webhooks/providers/mintlify.js +2 -2
  118. package/dist/webhooks/providers/mintlify.js.map +1 -1
  119. package/dist/webhooks/providers/sentry.d.ts +1 -1
  120. package/dist/webhooks/providers/sentry.d.ts.map +1 -1
  121. package/dist/webhooks/providers/sentry.js +2 -2
  122. package/dist/webhooks/providers/sentry.js.map +1 -1
  123. package/dist/webhooks/providers/test.d.ts +1 -1
  124. package/dist/webhooks/providers/test.d.ts.map +1 -1
  125. package/dist/webhooks/providers/test.js +1 -1
  126. package/dist/webhooks/providers/test.js.map +1 -1
  127. package/dist/webhooks/registry.d.ts +8 -2
  128. package/dist/webhooks/registry.d.ts.map +1 -1
  129. package/dist/webhooks/registry.js +155 -3
  130. package/dist/webhooks/registry.js.map +1 -1
  131. package/dist/webhooks/types.d.ts +28 -1
  132. package/dist/webhooks/types.d.ts.map +1 -1
  133. package/dist/webhooks/validation.d.ts +7 -6
  134. package/dist/webhooks/validation.d.ts.map +1 -1
  135. package/dist/webhooks/validation.js +11 -9
  136. package/dist/webhooks/validation.js.map +1 -1
  137. package/package.json +1 -1
@@ -0,0 +1,250 @@
1
+ /**
2
+ * SQLite backend for unified persistence layer.
3
+ *
4
+ * Implements the PersistenceBackend interface with SQLite storage,
5
+ * combining key-value operations, event sourcing, and query capabilities
6
+ * in a single database with optimized indexes and transaction support.
7
+ */
8
+ import Database from "better-sqlite3";
9
+ import { mkdirSync } from "fs";
10
+ import { dirname } from "path";
11
+ import { randomUUID } from "crypto";
12
+ export class SqliteBackend {
13
+ dbPath;
14
+ db;
15
+ stmts = {};
16
+ sweepTimer;
17
+ transactionDepth = 0;
18
+ constructor(dbPath) {
19
+ this.dbPath = dbPath;
20
+ if (dbPath !== ":memory:") {
21
+ mkdirSync(dirname(dbPath), { recursive: true });
22
+ }
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
+ }
29
+ 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
124
+ this.sweepTimer = setInterval(() => this.sweep(), 60_000);
125
+ if (this.sweepTimer.unref)
126
+ this.sweepTimer.unref();
127
+ }
128
+ // Key-value operations
129
+ async kvGet(namespace, key) {
130
+ const row = this.stmts.kvGet.get(namespace, key, Date.now());
131
+ return row ? JSON.parse(row.value) : null;
132
+ }
133
+ async kvSet(namespace, key, value, ttlMs) {
134
+ const expiresAt = ttlMs ? Date.now() + ttlMs : null;
135
+ const now = Date.now();
136
+ this.stmts.kvSet.run(namespace, key, JSON.stringify(value), expiresAt, now);
137
+ }
138
+ async kvDelete(namespace, key) {
139
+ this.stmts.kvDelete.run(namespace, key);
140
+ }
141
+ async kvDeleteAll(namespace) {
142
+ this.stmts.kvDeleteAll.run(namespace);
143
+ }
144
+ 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) }));
147
+ }
148
+ // Event operations
149
+ async eventAppend(stream, event) {
150
+ const id = randomUUID();
151
+ 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
+ );
154
+ return {
155
+ id,
156
+ timestamp,
157
+ type: event.type,
158
+ data: event.data,
159
+ metadata: event.metadata,
160
+ version: event.version,
161
+ };
162
+ }
163
+ 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);
170
+ for (const row of rows) {
171
+ yield {
172
+ id: row.id,
173
+ type: row.type,
174
+ data: JSON.parse(row.data),
175
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
176
+ timestamp: row.timestamp,
177
+ version: row.version,
178
+ };
179
+ }
180
+ }
181
+ async eventGetSnapshot(stream, type) {
182
+ const row = this.stmts.snapshotGet.get(stream, type);
183
+ return row ? JSON.parse(row.data) : null;
184
+ }
185
+ async eventSaveSnapshot(stream, type, data, eventId) {
186
+ const now = Date.now();
187
+ this.stmts.snapshotSet.run(stream, type, JSON.stringify(data), eventId, now);
188
+ }
189
+ async eventListStreams() {
190
+ const rows = this.stmts.eventListStreams.all();
191
+ return rows.map(row => row.stream);
192
+ }
193
+ // Query operations
194
+ async querySql(query, params = []) {
195
+ try {
196
+ const stmt = this.db.prepare(query);
197
+ return stmt.all(...params);
198
+ }
199
+ catch (error) {
200
+ throw new Error(`SQL query failed: ${error instanceof Error ? error.message : 'unknown error'}`);
201
+ }
202
+ }
203
+ // Transaction operations
204
+ async transactionBegin() {
205
+ if (this.transactionDepth === 0) {
206
+ this.db.exec("BEGIN");
207
+ }
208
+ this.transactionDepth++;
209
+ }
210
+ async transactionCommit() {
211
+ this.transactionDepth--;
212
+ if (this.transactionDepth === 0) {
213
+ this.db.exec("COMMIT");
214
+ }
215
+ }
216
+ async transactionRollback() {
217
+ this.transactionDepth--;
218
+ if (this.transactionDepth === 0) {
219
+ this.db.exec("ROLLBACK");
220
+ }
221
+ }
222
+ async transactionRun(fn) {
223
+ await this.transactionBegin();
224
+ try {
225
+ const result = await fn();
226
+ await this.transactionCommit();
227
+ return result;
228
+ }
229
+ catch (error) {
230
+ await this.transactionRollback();
231
+ throw error;
232
+ }
233
+ }
234
+ // Cleanup and maintenance
235
+ sweep() {
236
+ const now = Date.now();
237
+ const result = this.stmts.sweep.run(now);
238
+ if (result.changes > 0) {
239
+ console.debug(`Cleaned up ${result.changes} expired KV entries`);
240
+ }
241
+ }
242
+ async close() {
243
+ if (this.sweepTimer) {
244
+ clearInterval(this.sweepTimer);
245
+ this.sweepTimer = undefined;
246
+ }
247
+ this.db.close();
248
+ }
249
+ }
250
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../src/shared/persistence/backends/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Event sourcing utilities and helpers.
3
+ *
4
+ * Provides event versioning, schema evolution helpers, and common event patterns
5
+ * used throughout the Action Llama system.
6
+ */
7
+ import type { Event, EventStream } from "./index.js";
8
+ /** Common event types used across the system */
9
+ export declare namespace EventTypes {
10
+ const RUN_STARTED = "run.started";
11
+ const RUN_COMPLETED = "run.completed";
12
+ const RUN_FAILED = "run.failed";
13
+ const CALL_INITIATED = "call.initiated";
14
+ const CALL_COMPLETED = "call.completed";
15
+ const CALL_FAILED = "call.failed";
16
+ const WORK_QUEUED = "work.queued";
17
+ const WORK_DEQUEUED = "work.dequeued";
18
+ const WORK_DROPPED = "work.dropped";
19
+ const LOCK_ACQUIRED = "lock.acquired";
20
+ const LOCK_RELEASED = "lock.released";
21
+ const LOCK_EXPIRED = "lock.expired";
22
+ const SESSION_CREATED = "session.created";
23
+ const SESSION_EXPIRED = "session.expired";
24
+ }
25
+ /** Event metadata standard fields */
26
+ export interface EventMetadata {
27
+ /** Source system/component that generated the event */
28
+ source?: string;
29
+ /** Correlation ID for tracing related events */
30
+ correlationId?: string;
31
+ /** User or system that triggered the event */
32
+ actor?: string;
33
+ /** Additional tags for filtering/grouping */
34
+ tags?: string[];
35
+ }
36
+ /** Helper for creating events with proper defaults */
37
+ export declare function createEvent(type: string, data: any, metadata?: EventMetadata, version?: number): Omit<Event, 'id' | 'timestamp'>;
38
+ /** Schema evolution helper */
39
+ export interface EventMigration {
40
+ fromVersion: number;
41
+ toVersion: number;
42
+ migrate: (event: Event) => Event;
43
+ }
44
+ export declare class EventMigrator {
45
+ private migrations;
46
+ addMigration(eventType: string, migration: EventMigration): void;
47
+ migrate(event: Event, targetVersion: number): Event;
48
+ }
49
+ /** Event stream wrapper with additional utilities */
50
+ export declare class EventStreamWrapper {
51
+ private stream;
52
+ constructor(stream: EventStream);
53
+ /** Append a typed event */
54
+ appendTyped<T>(type: string, data: T, metadata?: EventMetadata, version?: number): Promise<Event>;
55
+ /** Replay events from the stream */
56
+ replay(query?: import("./index.js").EventQuery): AsyncIterable<Event>;
57
+ /** Get snapshot from the stream */
58
+ getSnapshot<T>(type: string): Promise<T | null>;
59
+ /** Save snapshot to the stream */
60
+ saveSnapshot<T>(type: string, data: T, eventId: string): Promise<void>;
61
+ /** Replay events of a specific type */
62
+ replayType<T>(type: string, from?: number, to?: number): AsyncIterable<Event & {
63
+ data: T;
64
+ }>;
65
+ /** Build a projection from events */
66
+ buildProjection<T>(initialState: T, reducer: (state: T, event: Event) => T, from?: number): Promise<T>;
67
+ /** Get the latest event of a specific type */
68
+ getLatestEvent(type: string): Promise<Event | null>;
69
+ }
70
+ /** Common projection builders */
71
+ export declare namespace Projections {
72
+ /** Count events by type */
73
+ function eventCounts(events: AsyncIterable<Event>): Promise<Map<string, number>>;
74
+ /** Group events by time window */
75
+ function timeWindow(events: AsyncIterable<Event>, windowMs: number): Promise<Map<number, Event[]>>;
76
+ }
77
+ //# sourceMappingURL=event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../../src/shared/persistence/event-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Event sourcing utilities and helpers.
3
+ *
4
+ * Provides event versioning, schema evolution helpers, and common event patterns
5
+ * used throughout the Action Llama system.
6
+ */
7
+ /** Common event types used across the system */
8
+ export var EventTypes;
9
+ (function (EventTypes) {
10
+ // Run lifecycle events
11
+ EventTypes.RUN_STARTED = "run.started";
12
+ EventTypes.RUN_COMPLETED = "run.completed";
13
+ EventTypes.RUN_FAILED = "run.failed";
14
+ // Call events
15
+ EventTypes.CALL_INITIATED = "call.initiated";
16
+ EventTypes.CALL_COMPLETED = "call.completed";
17
+ EventTypes.CALL_FAILED = "call.failed";
18
+ // Work queue events
19
+ EventTypes.WORK_QUEUED = "work.queued";
20
+ EventTypes.WORK_DEQUEUED = "work.dequeued";
21
+ EventTypes.WORK_DROPPED = "work.dropped";
22
+ // Lock events
23
+ EventTypes.LOCK_ACQUIRED = "lock.acquired";
24
+ EventTypes.LOCK_RELEASED = "lock.released";
25
+ EventTypes.LOCK_EXPIRED = "lock.expired";
26
+ // Session events
27
+ EventTypes.SESSION_CREATED = "session.created";
28
+ EventTypes.SESSION_EXPIRED = "session.expired";
29
+ })(EventTypes || (EventTypes = {}));
30
+ /** Helper for creating events with proper defaults */
31
+ export function createEvent(type, data, metadata, version = 1) {
32
+ return {
33
+ type,
34
+ data,
35
+ metadata: {
36
+ ...metadata,
37
+ source: "action-llama", // Always use consistent source for audit purposes
38
+ },
39
+ version,
40
+ };
41
+ }
42
+ export class EventMigrator {
43
+ migrations = new Map();
44
+ addMigration(eventType, migration) {
45
+ if (!this.migrations.has(eventType)) {
46
+ this.migrations.set(eventType, []);
47
+ }
48
+ this.migrations.get(eventType).push(migration);
49
+ }
50
+ migrate(event, targetVersion) {
51
+ const migrations = this.migrations.get(event.type) || [];
52
+ let currentEvent = { ...event };
53
+ while (currentEvent.version < targetVersion) {
54
+ const migration = migrations.find(m => m.fromVersion === currentEvent.version);
55
+ if (!migration) {
56
+ throw new Error(`No migration found for ${event.type} from version ${currentEvent.version}`);
57
+ }
58
+ currentEvent = migration.migrate(currentEvent);
59
+ }
60
+ return currentEvent;
61
+ }
62
+ }
63
+ /** Event stream wrapper with additional utilities */
64
+ export class EventStreamWrapper {
65
+ stream;
66
+ constructor(stream) {
67
+ this.stream = stream;
68
+ }
69
+ /** Append a typed event */
70
+ async appendTyped(type, data, metadata, version = 1) {
71
+ return this.stream.append(createEvent(type, data, metadata, version));
72
+ }
73
+ /** Replay events from the stream */
74
+ replay(query) {
75
+ return this.stream.replay(query);
76
+ }
77
+ /** Get snapshot from the stream */
78
+ getSnapshot(type) {
79
+ return this.stream.getSnapshot(type);
80
+ }
81
+ /** Save snapshot to the stream */
82
+ saveSnapshot(type, data, eventId) {
83
+ return this.stream.saveSnapshot(type, data, eventId);
84
+ }
85
+ /** Replay events of a specific type */
86
+ async *replayType(type, from, to) {
87
+ for await (const event of this.stream.replay({ type, from, to })) {
88
+ yield event;
89
+ }
90
+ }
91
+ /** Build a projection from events */
92
+ async buildProjection(initialState, reducer, from) {
93
+ let state = initialState;
94
+ for await (const event of this.stream.replay({ from })) {
95
+ state = reducer(state, event);
96
+ }
97
+ return state;
98
+ }
99
+ /** Get the latest event of a specific type */
100
+ async getLatestEvent(type) {
101
+ const events = [];
102
+ for await (const event of this.stream.replay({ type, limit: 1 })) {
103
+ events.push(event);
104
+ }
105
+ return events[0] || null;
106
+ }
107
+ }
108
+ /** Common projection builders */
109
+ export var Projections;
110
+ (function (Projections) {
111
+ /** Count events by type */
112
+ function eventCounts(events) {
113
+ return buildProjectionFromIterable(events, new Map(), (counts, event) => {
114
+ counts.set(event.type, (counts.get(event.type) || 0) + 1);
115
+ return counts;
116
+ });
117
+ }
118
+ Projections.eventCounts = eventCounts;
119
+ /** Group events by time window */
120
+ function timeWindow(events, windowMs) {
121
+ return buildProjectionFromIterable(events, new Map(), (windows, event) => {
122
+ const window = Math.floor(event.timestamp / windowMs) * windowMs;
123
+ if (!windows.has(window)) {
124
+ windows.set(window, []);
125
+ }
126
+ windows.get(window).push(event);
127
+ return windows;
128
+ });
129
+ }
130
+ Projections.timeWindow = timeWindow;
131
+ })(Projections || (Projections = {}));
132
+ async function buildProjectionFromIterable(events, initialState, reducer) {
133
+ let state = initialState;
134
+ for await (const event of events) {
135
+ state = reducer(state, event);
136
+ }
137
+ return state;
138
+ }
139
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../src/shared/persistence/event-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Unified persistence layer combining key-value storage, event sourcing, and query capabilities.
3
+ *
4
+ * Replaces the fragmented StateStore/StatsStore/WorkQueue pattern with a single abstraction
5
+ * that supports namespaces, TTL, and append-only event storage for features like replay,
6
+ * audit, and high availability.
7
+ */
8
+ export interface Event {
9
+ /** Unique event identifier */
10
+ id: string;
11
+ /** Event type/category */
12
+ type: string;
13
+ /** Event data payload */
14
+ data: any;
15
+ /** Event metadata (source, correlation id, etc.) */
16
+ metadata?: Record<string, any>;
17
+ /** Event timestamp (milliseconds since epoch) */
18
+ timestamp: number;
19
+ /** Event version for schema evolution */
20
+ version: number;
21
+ }
22
+ export interface EventQuery {
23
+ /** Event type filter */
24
+ type?: string;
25
+ /** Start timestamp (inclusive) */
26
+ from?: number;
27
+ /** End timestamp (exclusive) */
28
+ to?: number;
29
+ /** Maximum number of events to return */
30
+ limit?: number;
31
+ /** Offset for pagination */
32
+ offset?: number;
33
+ }
34
+ export interface EventStream {
35
+ /** Append an event to the stream */
36
+ append(event: Omit<Event, 'id' | 'timestamp'>): Promise<Event>;
37
+ /** Replay events from the stream */
38
+ replay(query?: EventQuery): AsyncIterable<Event>;
39
+ /** Get the latest snapshot for a given type */
40
+ getSnapshot<T>(type: string): Promise<T | null>;
41
+ /** Save a snapshot to optimize future replays */
42
+ saveSnapshot<T>(type: string, data: T, eventId: string): Promise<void>;
43
+ /** Subscribe to new events (optional - for real-time features) */
44
+ subscribe?(callback: (event: Event) => void): () => void;
45
+ }
46
+ export interface PersistenceStore {
47
+ /** Key-value operations with namespacing */
48
+ kv: {
49
+ /** Get a value by namespace and key */
50
+ get<T>(namespace: string, key: string): Promise<T | null>;
51
+ /** Set a value with optional TTL */
52
+ set<T>(namespace: string, key: string, value: T, opts?: {
53
+ ttl?: number;
54
+ }): Promise<void>;
55
+ /** Delete a single key */
56
+ delete(namespace: string, key: string): Promise<void>;
57
+ /** Delete all keys in a namespace */
58
+ deleteAll(namespace: string): Promise<void>;
59
+ /** List all non-expired entries in a namespace */
60
+ list<T>(namespace: string): Promise<Array<{
61
+ key: string;
62
+ value: T;
63
+ }>>;
64
+ };
65
+ /** Event sourcing operations */
66
+ events: {
67
+ /** Get or create an event stream */
68
+ stream(name: string): EventStream;
69
+ /** List available streams */
70
+ listStreams(): Promise<string[]>;
71
+ };
72
+ /** Query operations for analytics */
73
+ query: {
74
+ /** Execute a SQL query for analytics (backend-specific) */
75
+ sql<T>(query: string, params?: any[]): Promise<T[]>;
76
+ };
77
+ /** Transaction operations */
78
+ transaction<T>(fn: (store: PersistenceStore) => Promise<T>): Promise<T>;
79
+ /** Close the store and release resources */
80
+ close(): Promise<void>;
81
+ }
82
+ export interface PersistenceBackend {
83
+ /** Initialize the backend (create tables, etc.) */
84
+ init(): Promise<void>;
85
+ /** Implement the key-value operations */
86
+ kvGet<T>(namespace: string, key: string): Promise<T | null>;
87
+ kvSet<T>(namespace: string, key: string, value: T, ttlMs?: number): Promise<void>;
88
+ kvDelete(namespace: string, key: string): Promise<void>;
89
+ kvDeleteAll(namespace: string): Promise<void>;
90
+ kvList<T>(namespace: string): Promise<Array<{
91
+ key: string;
92
+ value: T;
93
+ }>>;
94
+ /** Implement the event operations */
95
+ eventAppend(stream: string, event: Omit<Event, 'id' | 'timestamp'>): Promise<Event>;
96
+ eventReplay(stream: string, query?: EventQuery): AsyncIterable<Event>;
97
+ eventGetSnapshot<T>(stream: string, type: string): Promise<T | null>;
98
+ eventSaveSnapshot<T>(stream: string, type: string, data: T, eventId: string): Promise<void>;
99
+ eventListStreams(): Promise<string[]>;
100
+ /** Implement query operations */
101
+ querySql<T>(query: string, params?: any[]): Promise<T[]>;
102
+ /** Implement transaction operations */
103
+ transactionBegin(): Promise<void>;
104
+ transactionCommit(): Promise<void>;
105
+ transactionRollback(): Promise<void>;
106
+ transactionRun<T>(fn: () => Promise<T>): Promise<T>;
107
+ /** Close and cleanup */
108
+ close(): Promise<void>;
109
+ }
110
+ export interface PersistenceConfig {
111
+ type: "sqlite" | "memory";
112
+ path?: string;
113
+ maxSize?: number;
114
+ }
115
+ /**
116
+ * Create a persistence store from configuration.
117
+ */
118
+ export declare function createPersistenceStore(config: PersistenceConfig): Promise<PersistenceStore>;
119
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/persistence/index.ts"],"names":[],"mappings":"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"}