@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 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/control/routes/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CA8F3G"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/control/routes/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAuJ3G"}
@@ -61,6 +61,60 @@ export function registerStatsRoutes(app, statsStore, statusTracker) {
61
61
  }
62
62
  return c.json({ triggers: mergedTriggers, total: mergedTotal, limit, offset });
63
63
  });
64
+ // Paginated jobs (pending + running + completed, no dead letters)
65
+ app.get("/api/stats/jobs", (c) => {
66
+ const limit = Math.min(100, Math.max(1, parseInt(c.req.query("limit") || "50", 10) || 50));
67
+ const offset = Math.max(0, parseInt(c.req.query("offset") || "0", 10) || 0);
68
+ const since = parseInt(c.req.query("since") || "0", 10) || 0;
69
+ const agentFilter = c.req.query("agent") || undefined;
70
+ // Completed/errored jobs from runs table (no dead letters — dead letters aren't jobs)
71
+ const runs = statsStore
72
+ ? statsStore.queryTriggerHistory({ since, limit, offset, includeDeadLetters: false, agentName: agentFilter })
73
+ : [];
74
+ const total = statsStore ? statsStore.countTriggerHistory(since, false, agentFilter) : 0;
75
+ // Running instances (only on first page)
76
+ let mergedJobs = runs;
77
+ let mergedTotal = total;
78
+ if (statusTracker && offset === 0) {
79
+ const running = statusTracker.getInstances()
80
+ .filter((inst) => {
81
+ if (inst.status !== "running")
82
+ return false;
83
+ if (agentFilter && inst.agentName !== agentFilter)
84
+ return false;
85
+ return true;
86
+ })
87
+ .map((inst) => {
88
+ const sep = inst.trigger.indexOf(":");
89
+ return {
90
+ ts: new Date(inst.startedAt).getTime(),
91
+ triggerType: sep > -1 ? inst.trigger.slice(0, sep) : inst.trigger,
92
+ triggerSource: sep > -1 ? inst.trigger.slice(sep + 1).trim() : null,
93
+ agentName: inst.agentName,
94
+ instanceId: inst.id,
95
+ result: "running",
96
+ webhookReceiptId: null,
97
+ deadLetterReason: null,
98
+ };
99
+ });
100
+ const runningIds = new Set(runs.map((r) => r.instanceId));
101
+ const uniqueRunning = running.filter((r) => !runningIds.has(r.instanceId));
102
+ mergedJobs = [...uniqueRunning, ...runs].sort((a, b) => b.ts - a.ts);
103
+ mergedTotal = total + uniqueRunning.length;
104
+ }
105
+ // Pending counts per agent
106
+ const agents = statusTracker ? statusTracker.getAllAgents() : [];
107
+ const pending = {};
108
+ for (const a of agents) {
109
+ if (a.queuedWebhooks > 0) {
110
+ if (!agentFilter || a.name === agentFilter) {
111
+ pending[a.name] = a.queuedWebhooks;
112
+ }
113
+ }
114
+ }
115
+ const totalPending = Object.values(pending).reduce((s, n) => s + n, 0);
116
+ return c.json({ jobs: mergedJobs, total: mergedTotal, pending, totalPending, limit, offset });
117
+ });
64
118
  // Single webhook receipt by ID
65
119
  app.get("/api/stats/webhooks/:receiptId", (c) => {
66
120
  const receiptId = c.req.param("receiptId");
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/control/routes/stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/control/routes/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared database connection factory for action-llama.
3
+ *
4
+ * Creates a Drizzle ORM instance backed by better-sqlite3.
5
+ * All database access should go through the returned Drizzle instance.
6
+ * The underlying better-sqlite3 Database is available via `db.$client`.
7
+ */
8
+ import { drizzle } from "drizzle-orm/better-sqlite3";
9
+ import * as schema from "./schema.js";
10
+ export type AppDb = ReturnType<typeof createDb>;
11
+ /**
12
+ * Create a Drizzle database connection for the given file path.
13
+ * Creates parent directories if needed. Sets WAL mode and performance pragmas.
14
+ */
15
+ export declare function createDb(dbPath: string): ReturnType<typeof drizzle<typeof schema>>;
16
+ /**
17
+ * Create an in-memory Drizzle database for tests.
18
+ */
19
+ export declare function createMemoryDb(): ReturnType<typeof drizzle<typeof schema>>;
20
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC,CAUlF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC,CAE1E"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared database connection factory for action-llama.
3
+ *
4
+ * Creates a Drizzle ORM instance backed by better-sqlite3.
5
+ * All database access should go through the returned Drizzle instance.
6
+ * The underlying better-sqlite3 Database is available via `db.$client`.
7
+ */
8
+ import Database from "better-sqlite3";
9
+ import { drizzle } from "drizzle-orm/better-sqlite3";
10
+ import { mkdirSync } from "fs";
11
+ import { dirname } from "path";
12
+ import * as schema from "./schema.js";
13
+ /**
14
+ * Create a Drizzle database connection for the given file path.
15
+ * Creates parent directories if needed. Sets WAL mode and performance pragmas.
16
+ */
17
+ export function createDb(dbPath) {
18
+ if (dbPath !== ":memory:") {
19
+ mkdirSync(dirname(dbPath), { recursive: true });
20
+ }
21
+ const sqlite = new Database(dbPath);
22
+ sqlite.pragma("journal_mode = WAL");
23
+ sqlite.pragma("synchronous = NORMAL");
24
+ sqlite.pragma("cache_size = 1000");
25
+ sqlite.pragma("temp_store = memory");
26
+ return drizzle(sqlite, { schema });
27
+ }
28
+ /**
29
+ * Create an in-memory Drizzle database for tests.
30
+ */
31
+ export function createMemoryDb() {
32
+ return createDb(":memory:");
33
+ }
34
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACnC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Database layer — re-exports for convenient imports.
3
+ */
4
+ export * from "./schema.js";
5
+ export { createDb, createMemoryDb } from "./connection.js";
6
+ export type { AppDb } from "./connection.js";
7
+ export { runMigrations, applyMigrations, defaultMigrationsFolder } from "./migrate.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Database layer — re-exports for convenient imports.
3
+ */
4
+ export * from "./schema.js";
5
+ export { createDb, createMemoryDb } from "./connection.js";
6
+ export { runMigrations, applyMigrations, defaultMigrationsFolder } from "./migrate.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Auto-migration runner for the consolidated action-llama database.
3
+ *
4
+ * On startup:
5
+ * 1. Backs up any existing .db files to .al/backups/<timestamp>/
6
+ * 2. Runs pending Drizzle migrations against the consolidated DB
7
+ * 3. If legacy separate .db files exist, migrates their data into the consolidated DB (one-time)
8
+ */
9
+ import type { AppDb } from "./connection.js";
10
+ /**
11
+ * Get the default migrations folder path relative to this module.
12
+ */
13
+ export declare function defaultMigrationsFolder(): string;
14
+ /**
15
+ * Run Drizzle migrations on an existing AppDb instance.
16
+ * Useful for standalone stores that create their own connections.
17
+ */
18
+ export declare function applyMigrations(db: AppDb, migrationsFolder?: string): void;
19
+ /**
20
+ * Run pending migrations and optionally migrate legacy data.
21
+ *
22
+ * @param dbPath - Path to the consolidated .al/action-llama.db file
23
+ * @param migrationsFolder - Path to the drizzle migrations folder (defaults to bundled drizzle/)
24
+ * @returns The opened Drizzle database instance (caller is responsible for closing)
25
+ */
26
+ export declare function runMigrations(dbPath: string, migrationsFolder?: string): AppDb;
27
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,CAiB9E"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Auto-migration runner for the consolidated action-llama database.
3
+ *
4
+ * On startup:
5
+ * 1. Backs up any existing .db files to .al/backups/<timestamp>/
6
+ * 2. Runs pending Drizzle migrations against the consolidated DB
7
+ * 3. If legacy separate .db files exist, migrates their data into the consolidated DB (one-time)
8
+ */
9
+ import { migrate } from "drizzle-orm/better-sqlite3/migrator";
10
+ import { existsSync, mkdirSync, copyFileSync } from "fs";
11
+ import { join, dirname, resolve } from "path";
12
+ import { fileURLToPath } from "url";
13
+ import { createDb } from "./connection.js";
14
+ /**
15
+ * Get the default migrations folder path relative to this module.
16
+ */
17
+ export function defaultMigrationsFolder() {
18
+ return resolve(dirname(fileURLToPath(import.meta.url)), "../../drizzle");
19
+ }
20
+ /**
21
+ * Run Drizzle migrations on an existing AppDb instance.
22
+ * Useful for standalone stores that create their own connections.
23
+ */
24
+ export function applyMigrations(db, migrationsFolder) {
25
+ const folder = migrationsFolder ?? defaultMigrationsFolder();
26
+ migrate(db, { migrationsFolder: folder });
27
+ }
28
+ /**
29
+ * Run pending migrations and optionally migrate legacy data.
30
+ *
31
+ * @param dbPath - Path to the consolidated .al/action-llama.db file
32
+ * @param migrationsFolder - Path to the drizzle migrations folder (defaults to bundled drizzle/)
33
+ * @returns The opened Drizzle database instance (caller is responsible for closing)
34
+ */
35
+ export function runMigrations(dbPath, migrationsFolder) {
36
+ const projectAlDir = dirname(dbPath);
37
+ // Back up existing database files before migrating
38
+ backupExistingDbs(projectAlDir);
39
+ // Open/create the consolidated DB
40
+ const db = createDb(dbPath);
41
+ // Run Drizzle migrations (idempotent — only applies pending ones)
42
+ const folder = migrationsFolder ?? defaultMigrationsFolder();
43
+ migrate(db, { migrationsFolder: folder });
44
+ // Migrate legacy data if this is the first time we're consolidating
45
+ migrateLegacyData(db, projectAlDir, dbPath);
46
+ return db;
47
+ }
48
+ /**
49
+ * Copy all existing .db files into .al/backups/<timestamp>/ before migrating.
50
+ */
51
+ function backupExistingDbs(alDir) {
52
+ const legacyFiles = ["state.db", "stats.db", "work-queue.db", "action-llama.db"];
53
+ const toBackup = legacyFiles.filter((f) => existsSync(join(alDir, f)));
54
+ if (toBackup.length === 0)
55
+ return;
56
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
57
+ const backupDir = join(alDir, "backups", ts);
58
+ mkdirSync(backupDir, { recursive: true });
59
+ for (const f of toBackup) {
60
+ const src = join(alDir, f);
61
+ const dst = join(backupDir, f);
62
+ copyFileSync(src, dst);
63
+ }
64
+ }
65
+ /**
66
+ * One-time migration of legacy separate databases into the consolidated DB.
67
+ *
68
+ * Uses the presence of a special marker in kv_store to know if migration
69
+ * has already been performed.
70
+ */
71
+ function migrateLegacyData(db, alDir, consolidatedDbPath) {
72
+ // Check if we've already migrated (using the raw sqlite client for a quick check)
73
+ const client = db.$client;
74
+ const alreadyMigrated = client
75
+ .prepare("SELECT value FROM kv_store WHERE namespace = '__migration__' AND key = 'legacy_migrated' LIMIT 1")
76
+ .get();
77
+ if (alreadyMigrated)
78
+ return;
79
+ const legacyStateDb = join(alDir, "state.db");
80
+ const legacyStatsDb = join(alDir, "stats.db");
81
+ const legacyWorkQueueDb = join(alDir, "work-queue.db");
82
+ const hasLegacy = existsSync(legacyStateDb) ||
83
+ existsSync(legacyStatsDb) ||
84
+ existsSync(legacyWorkQueueDb);
85
+ if (!hasLegacy) {
86
+ // No legacy files — mark as migrated and return
87
+ markMigrated(client);
88
+ return;
89
+ }
90
+ // Perform migration inside a transaction
91
+ const doMigrate = client.transaction(() => {
92
+ // 1. Migrate state.db
93
+ if (existsSync(legacyStateDb)) {
94
+ migrateLegacyState(client, legacyStateDb);
95
+ }
96
+ // 2. Migrate stats.db
97
+ if (existsSync(legacyStatsDb)) {
98
+ migrateLegacyStats(client, legacyStatsDb);
99
+ }
100
+ // 3. Migrate work-queue.db
101
+ if (existsSync(legacyWorkQueueDb)) {
102
+ migrateLegacyWorkQueue(client, legacyWorkQueueDb);
103
+ }
104
+ markMigrated(client);
105
+ });
106
+ doMigrate();
107
+ }
108
+ function markMigrated(client) {
109
+ const now = Date.now();
110
+ client
111
+ .prepare("INSERT OR REPLACE INTO kv_store (namespace, key, value, created_at, updated_at) VALUES ('__migration__', 'legacy_migrated', '\"true\"', ?, ?)")
112
+ .run(now, now);
113
+ }
114
+ function migrateLegacyState(client, legacyPath) {
115
+ try {
116
+ client.exec(`ATTACH DATABASE '${legacyPath.replace(/'/g, "''")}' AS legacy_state`);
117
+ client.exec(`
118
+ INSERT OR IGNORE INTO state (ns, key, value, expires_at)
119
+ SELECT ns, key, value, expires_at FROM legacy_state.state
120
+ `);
121
+ client.exec("DETACH DATABASE legacy_state");
122
+ }
123
+ catch {
124
+ // If the legacy db doesn't have the expected schema, skip
125
+ try {
126
+ client.exec("DETACH DATABASE legacy_state");
127
+ }
128
+ catch { }
129
+ }
130
+ }
131
+ function migrateLegacyStats(client, legacyPath) {
132
+ try {
133
+ client.exec(`ATTACH DATABASE '${legacyPath.replace(/'/g, "''")}' AS legacy_stats`);
134
+ // Migrate webhook_receipts first (runs has a FK-like reference via webhook_receipt_id)
135
+ client.exec(`
136
+ INSERT OR IGNORE INTO webhook_receipts (id, delivery_id, source, event_summary, timestamp, headers, body, matched_agents, status, dead_letter_reason)
137
+ SELECT id, delivery_id, source, event_summary, timestamp, headers, body, matched_agents, status, dead_letter_reason
138
+ FROM legacy_stats.webhook_receipts
139
+ `);
140
+ // Migrate runs
141
+ client.exec(`
142
+ INSERT OR IGNORE INTO runs (id, instance_id, agent_name, trigger_type, trigger_source, result, exit_code, started_at, duration_ms, input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, total_tokens, cost_usd, turn_count, error_message, pre_hook_ms, post_hook_ms, webhook_receipt_id)
143
+ SELECT id, instance_id, agent_name, trigger_type, trigger_source, result, exit_code, started_at, duration_ms,
144
+ COALESCE(input_tokens, 0), COALESCE(output_tokens, 0), COALESCE(cache_read_tokens, 0), COALESCE(cache_write_tokens, 0),
145
+ COALESCE(total_tokens, 0), COALESCE(cost_usd, 0), COALESCE(turn_count, 0),
146
+ error_message, pre_hook_ms, post_hook_ms, webhook_receipt_id
147
+ FROM legacy_stats.runs
148
+ `);
149
+ // Migrate call_edges
150
+ client.exec(`
151
+ INSERT OR IGNORE INTO call_edges (id, caller_agent, caller_instance, target_agent, target_instance, depth, started_at, duration_ms, status)
152
+ SELECT id, caller_agent, caller_instance, target_agent, target_instance, depth, started_at, duration_ms, status
153
+ FROM legacy_stats.call_edges
154
+ `);
155
+ client.exec("DETACH DATABASE legacy_stats");
156
+ }
157
+ catch {
158
+ try {
159
+ client.exec("DETACH DATABASE legacy_stats");
160
+ }
161
+ catch { }
162
+ }
163
+ }
164
+ function migrateLegacyWorkQueue(client, legacyPath) {
165
+ try {
166
+ client.exec(`ATTACH DATABASE '${legacyPath.replace(/'/g, "''")}' AS legacy_wq`);
167
+ client.exec(`
168
+ INSERT OR IGNORE INTO work_queue (id, agent, payload, received_at)
169
+ SELECT id, agent, payload, received_at FROM legacy_wq.work_queue
170
+ `);
171
+ client.exec("DETACH DATABASE legacy_wq");
172
+ }
173
+ catch {
174
+ try {
175
+ client.exec("DETACH DATABASE legacy_wq");
176
+ }
177
+ catch { }
178
+ }
179
+ }
180
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"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"}