agentenkit 0.2.3 → 0.4.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 (216) hide show
  1. package/README.md +34 -14
  2. package/dist/adapters/inline.d.ts +19 -5
  3. package/dist/adapters/inline.d.ts.map +1 -1
  4. package/dist/adapters/inline.js +87 -14
  5. package/dist/adapters/inline.js.map +1 -1
  6. package/dist/adapters/memory.d.ts +65 -3
  7. package/dist/adapters/memory.d.ts.map +1 -1
  8. package/dist/adapters/memory.js +267 -3
  9. package/dist/adapters/memory.js.map +1 -1
  10. package/dist/adapters/prisma.d.ts +125 -18
  11. package/dist/adapters/prisma.d.ts.map +1 -1
  12. package/dist/adapters/prisma.js +308 -67
  13. package/dist/adapters/prisma.js.map +1 -1
  14. package/dist/adapters/qstash.d.ts +15 -2
  15. package/dist/adapters/qstash.d.ts.map +1 -1
  16. package/dist/adapters/qstash.js +31 -14
  17. package/dist/adapters/qstash.js.map +1 -1
  18. package/dist/adapters/redis.d.ts +40 -4
  19. package/dist/adapters/redis.d.ts.map +1 -1
  20. package/dist/adapters/redis.js +265 -20
  21. package/dist/adapters/redis.js.map +1 -1
  22. package/dist/adapters/sqlite.d.ts +52 -2
  23. package/dist/adapters/sqlite.d.ts.map +1 -1
  24. package/dist/adapters/sqlite.js +342 -35
  25. package/dist/adapters/sqlite.js.map +1 -1
  26. package/dist/adapters/stream-scripts.d.ts +49 -0
  27. package/dist/adapters/stream-scripts.d.ts.map +1 -0
  28. package/dist/adapters/stream-scripts.js +150 -0
  29. package/dist/adapters/stream-scripts.js.map +1 -0
  30. package/dist/adapters/upstash.d.ts +20 -0
  31. package/dist/adapters/upstash.d.ts.map +1 -1
  32. package/dist/adapters/upstash.js +29 -0
  33. package/dist/adapters/upstash.js.map +1 -1
  34. package/dist/admin/memory.d.ts +11 -1
  35. package/dist/admin/memory.d.ts.map +1 -1
  36. package/dist/admin/memory.js +83 -14
  37. package/dist/admin/memory.js.map +1 -1
  38. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
  39. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
  40. package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
  41. package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
  42. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
  43. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
  44. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
  45. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
  46. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
  47. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
  48. package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
  49. package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
  50. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
  51. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
  52. package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
  53. package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
  54. package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
  55. package/dist/admin/migrations/postgres/index.js +16 -1
  56. package/dist/admin/migrations/postgres/index.js.map +1 -1
  57. package/dist/admin/migrations/runner.d.ts +21 -1
  58. package/dist/admin/migrations/runner.d.ts.map +1 -1
  59. package/dist/admin/migrations/runner.js +41 -4
  60. package/dist/admin/migrations/runner.js.map +1 -1
  61. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
  62. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
  63. package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
  64. package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
  65. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
  66. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
  67. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
  68. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
  69. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
  70. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
  71. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
  72. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
  73. package/dist/admin/migrations/sqlite/index.d.ts +2 -2
  74. package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
  75. package/dist/admin/migrations/sqlite/index.js +17 -3
  76. package/dist/admin/migrations/sqlite/index.js.map +1 -1
  77. package/dist/admin/postgres.d.ts +14 -4
  78. package/dist/admin/postgres.d.ts.map +1 -1
  79. package/dist/admin/postgres.js +131 -36
  80. package/dist/admin/postgres.js.map +1 -1
  81. package/dist/admin/shared.d.ts +19 -0
  82. package/dist/admin/shared.d.ts.map +1 -0
  83. package/dist/admin/shared.js +28 -0
  84. package/dist/admin/shared.js.map +1 -0
  85. package/dist/admin/sqlite.d.ts +9 -1
  86. package/dist/admin/sqlite.d.ts.map +1 -1
  87. package/dist/admin/sqlite.js +112 -29
  88. package/dist/admin/sqlite.js.map +1 -1
  89. package/dist/core/admin.d.ts +28 -6
  90. package/dist/core/admin.d.ts.map +1 -1
  91. package/dist/core/admin.js +92 -23
  92. package/dist/core/admin.js.map +1 -1
  93. package/dist/core/agent.d.ts +7 -4
  94. package/dist/core/agent.d.ts.map +1 -1
  95. package/dist/core/agent.js +15 -11
  96. package/dist/core/agent.js.map +1 -1
  97. package/dist/core/agui.d.ts +17 -0
  98. package/dist/core/agui.d.ts.map +1 -0
  99. package/dist/core/agui.js +69 -0
  100. package/dist/core/agui.js.map +1 -0
  101. package/dist/core/context.d.ts +13 -1
  102. package/dist/core/context.d.ts.map +1 -1
  103. package/dist/core/context.js +70 -19
  104. package/dist/core/context.js.map +1 -1
  105. package/dist/core/deleteThread.d.ts.map +1 -1
  106. package/dist/core/deleteThread.js +33 -4
  107. package/dist/core/deleteThread.js.map +1 -1
  108. package/dist/core/engine.d.ts +41 -11
  109. package/dist/core/engine.d.ts.map +1 -1
  110. package/dist/core/engine.js +855 -352
  111. package/dist/core/engine.js.map +1 -1
  112. package/dist/core/follow.d.ts +63 -1
  113. package/dist/core/follow.d.ts.map +1 -1
  114. package/dist/core/follow.js +293 -16
  115. package/dist/core/follow.js.map +1 -1
  116. package/dist/core/hitl.d.ts +43 -0
  117. package/dist/core/hitl.d.ts.map +1 -1
  118. package/dist/core/hitl.js +163 -35
  119. package/dist/core/hitl.js.map +1 -1
  120. package/dist/core/keys.d.ts +22 -4
  121. package/dist/core/keys.d.ts.map +1 -1
  122. package/dist/core/keys.js +23 -5
  123. package/dist/core/keys.js.map +1 -1
  124. package/dist/core/lease.d.ts +46 -0
  125. package/dist/core/lease.d.ts.map +1 -0
  126. package/dist/core/lease.js +142 -0
  127. package/dist/core/lease.js.map +1 -0
  128. package/dist/core/loop.d.ts +27 -7
  129. package/dist/core/loop.d.ts.map +1 -1
  130. package/dist/core/loop.js +140 -55
  131. package/dist/core/loop.js.map +1 -1
  132. package/dist/core/messages.d.ts +21 -2
  133. package/dist/core/messages.d.ts.map +1 -1
  134. package/dist/core/messages.js +61 -2
  135. package/dist/core/messages.js.map +1 -1
  136. package/dist/core/prune.d.ts +24 -0
  137. package/dist/core/prune.d.ts.map +1 -0
  138. package/dist/core/prune.js +43 -0
  139. package/dist/core/prune.js.map +1 -0
  140. package/dist/core/publish.d.ts +38 -10
  141. package/dist/core/publish.d.ts.map +1 -1
  142. package/dist/core/publish.js +126 -12
  143. package/dist/core/publish.js.map +1 -1
  144. package/dist/core/reclaim.d.ts +8 -1
  145. package/dist/core/reclaim.d.ts.map +1 -1
  146. package/dist/core/reclaim.js +149 -18
  147. package/dist/core/reclaim.js.map +1 -1
  148. package/dist/core/run.d.ts +7 -3
  149. package/dist/core/run.d.ts.map +1 -1
  150. package/dist/core/run.js +95 -35
  151. package/dist/core/run.js.map +1 -1
  152. package/dist/core/segment.d.ts +62 -0
  153. package/dist/core/segment.d.ts.map +1 -0
  154. package/dist/core/segment.js +318 -0
  155. package/dist/core/segment.js.map +1 -0
  156. package/dist/core/settle.d.ts +57 -0
  157. package/dist/core/settle.d.ts.map +1 -0
  158. package/dist/core/settle.js +181 -0
  159. package/dist/core/settle.js.map +1 -0
  160. package/dist/core/snapshot.d.ts +36 -0
  161. package/dist/core/snapshot.d.ts.map +1 -0
  162. package/dist/core/snapshot.js +87 -0
  163. package/dist/core/snapshot.js.map +1 -0
  164. package/dist/core/stop.d.ts +16 -1
  165. package/dist/core/stop.d.ts.map +1 -1
  166. package/dist/core/stop.js +69 -15
  167. package/dist/core/stop.js.map +1 -1
  168. package/dist/core/stream-events.d.ts +184 -0
  169. package/dist/core/stream-events.d.ts.map +1 -0
  170. package/dist/core/stream-events.js +26 -0
  171. package/dist/core/stream-events.js.map +1 -0
  172. package/dist/core/stream.d.ts +29 -0
  173. package/dist/core/stream.d.ts.map +1 -1
  174. package/dist/core/stream.js +79 -0
  175. package/dist/core/stream.js.map +1 -1
  176. package/dist/core/subagent.d.ts +36 -5
  177. package/dist/core/subagent.d.ts.map +1 -1
  178. package/dist/core/subagent.js +117 -22
  179. package/dist/core/subagent.js.map +1 -1
  180. package/dist/core/types.d.ts +197 -11
  181. package/dist/core/types.d.ts.map +1 -1
  182. package/dist/core/types.js +26 -1
  183. package/dist/core/types.js.map +1 -1
  184. package/dist/core/usage.d.ts +53 -5
  185. package/dist/core/usage.d.ts.map +1 -1
  186. package/dist/core/usage.js +170 -47
  187. package/dist/core/usage.js.map +1 -1
  188. package/dist/index.d.ts +16 -11
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +12 -7
  191. package/dist/index.js.map +1 -1
  192. package/dist/ports/admin.d.ts +59 -0
  193. package/dist/ports/admin.d.ts.map +1 -1
  194. package/dist/ports/kv.d.ts +17 -0
  195. package/dist/ports/kv.d.ts.map +1 -1
  196. package/dist/ports/queue.d.ts +87 -7
  197. package/dist/ports/queue.d.ts.map +1 -1
  198. package/dist/ports/queue.js +36 -1
  199. package/dist/ports/queue.js.map +1 -1
  200. package/dist/ports/runtime.d.ts +171 -20
  201. package/dist/ports/runtime.d.ts.map +1 -1
  202. package/dist/ports/storage.d.ts +26 -5
  203. package/dist/ports/storage.d.ts.map +1 -1
  204. package/dist/ports/streams.d.ts +60 -0
  205. package/dist/ports/streams.d.ts.map +1 -0
  206. package/dist/ports/streams.js +20 -0
  207. package/dist/ports/streams.js.map +1 -0
  208. package/dist/pricing.d.ts +5 -0
  209. package/dist/pricing.d.ts.map +1 -1
  210. package/dist/pricing.js +35 -10
  211. package/dist/pricing.js.map +1 -1
  212. package/dist/runtime.d.ts +6 -0
  213. package/dist/runtime.d.ts.map +1 -1
  214. package/dist/runtime.js +144 -46
  215. package/dist/runtime.js.map +1 -1
  216. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { addRunTotals, emptyRunTotals, JSON_COLUMNS, RUN_COLUMNS } from './shared.js';
1
2
  import { gatedAdminStore, runMigrations } from './migrations/runner.js';
2
3
  import { dialect, migrations } from './migrations/postgres/index.js';
3
4
  /** Open a `pg` Pool from a connection string. Dynamically imported so the
@@ -33,18 +34,54 @@ async function migrate(db) {
33
34
  client?.release();
34
35
  }
35
36
  }
37
+ /** The RunFilter as a WHERE clause, limit aside. */
38
+ function runWhere(f) {
39
+ const where = [];
40
+ const vals = [];
41
+ if (f.state?.length)
42
+ where.push(`state = ANY($${vals.push(f.state)})`);
43
+ if (f.agent)
44
+ where.push(`agent = $${vals.push(f.agent)}`);
45
+ if (f.threadId)
46
+ where.push(`"threadId" = $${vals.push(f.threadId)}`);
47
+ if (f.threadIds?.length)
48
+ where.push(`"threadId" = ANY($${vals.push(f.threadIds)})`);
49
+ if (f.since)
50
+ where.push(`"startedAt" >= $${vals.push(f.since)}`);
51
+ if (f.until)
52
+ where.push(`"startedAt" <= $${vals.push(f.until)}`);
53
+ if (f.unsettled)
54
+ where.push('"endedAt" IS NOT NULL AND "settledAt" IS NULL');
55
+ if (f.depth !== undefined)
56
+ where.push(`depth = $${vals.push(f.depth)}`);
57
+ if (f.before) {
58
+ where.push(`("startedAt", id) < ($${vals.push(f.before.startedAt)}, $${vals.push(f.before.id)})`);
59
+ }
60
+ return { where: where.length ? ` WHERE ${where.join(' AND ')}` : '', vals };
61
+ }
62
+ /** BIGINT columns come back from `pg` as strings (§2.9). */
63
+ const num = (v) => (v === null || v === undefined ? null : Number(v));
64
+ const toThread = (r) => ({
65
+ id: r.id, state: r.state, model: r.model,
66
+ firstSeenAt: new Date(r.firstSeenAt), updatedAt: new Date(r.updatedAt),
67
+ startedWith: r.startedWith ? { ...r.startedWith, at: new Date(r.startedWith.at) } : null,
68
+ });
36
69
  const toRun = (r) => ({
37
70
  id: r.id, threadId: r.threadId, parentRunId: r.parentRunId ?? null, depth: r.depth,
38
71
  agent: r.agent, model: r.model, state: r.state,
39
72
  stopReason: r.stopReason ?? null, error: r.error ?? null,
40
73
  startedAt: new Date(r.startedAt), endedAt: r.endedAt ? new Date(r.endedAt) : null,
41
- durationMs: r.durationMs ?? null, queuedMs: r.queuedMs ?? null,
74
+ enqueuedAt: r.enqueuedAt ? new Date(r.enqueuedAt) : null,
75
+ durationMs: num(r.durationMs), queuedMs: num(r.queuedMs),
76
+ settledAt: r.settledAt ? new Date(r.settledAt) : null,
77
+ settlingAt: r.settlingAt ? new Date(r.settlingAt) : null,
42
78
  attempts: r.attempts, steps: r.steps,
43
- inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
44
- outputTokens: r.outputTokens, totalTokens: r.totalTokens,
79
+ inputTokens: Number(r.inputTokens), cachedInputTokens: Number(r.cachedInputTokens),
80
+ outputTokens: Number(r.outputTokens), totalTokens: Number(r.totalTokens),
45
81
  result: r.result ?? null,
46
82
  prompt: r.prompt ?? null, tokenBudget: r.tokenBudget ?? null,
47
83
  runState: r.runState ?? null, providerOptions: r.providerOptions ?? null,
84
+ costBudgetMicros: num(r.costBudgetMicros), maxSteps: num(r.maxSteps),
48
85
  });
49
86
  /** Operational history in Postgres — the production store (§2.9), reached
50
87
  * through AGENTIC_KIT_ADMIN_DATABASE_URL. Point it at its own database or the
@@ -56,9 +93,10 @@ export class PostgresAdminStore {
56
93
  }
57
94
  /** The store with its schema migration already running behind it (§2.9).
58
95
  *
59
- * Connecting stays synchronous — a URL that cannot be reached is a
60
- * configuration problem worth failing on at startup. Only the schema moves
61
- * to the background, so a service starts at the same speed whether or not
96
+ * Nothing here touches the network: a `pg` Pool connects lazily, so a
97
+ * URL that cannot be reached shows up as a failed migration, logged, and
98
+ * retried on a later admin call (see `gatedAdminStore`). The schema runs
99
+ * in the background, so a service starts at the same speed whether or not
62
100
  * it has migrating to do, and the returned store waits for it before its
63
101
  * first call.
64
102
  *
@@ -67,14 +105,21 @@ export class PostgresAdminStore {
67
105
  * race. */
68
106
  static connect(db, log) {
69
107
  const store = new PostgresAdminStore(db);
70
- const ready = migrate(db).catch((err) => {
108
+ // A pg Pool emits 'error' when an idle connection drops (a failover, a
109
+ // server restart). An EventEmitter with no listener for it throws, which
110
+ // ends the process. The pool replaces the connection by itself, so a
111
+ // log line is all the error needs. A caller's own listener is left alone.
112
+ const emitter = db;
113
+ if (typeof emitter.on === 'function' && (emitter.listenerCount?.('error') ?? 0) === 0) {
114
+ emitter.on('error', (err) => (log ?? console).error('admin postgres connection error', err));
115
+ }
116
+ return gatedAdminStore(store, () => migrate(db).catch((err) => {
71
117
  // Loud, because everything downstream of this is silent: admin writes
72
118
  // are best effort, so a failed migration shows up as a dashboard with
73
119
  // nothing in it rather than as an error.
74
120
  (log ?? console).error('admin migrations failed', err);
75
121
  throw err;
76
- });
77
- return gatedAdminStore(store, ready);
122
+ }));
78
123
  }
79
124
  threads = {
80
125
  upsert: async (t) => {
@@ -97,23 +142,52 @@ export class PostgresAdminStore {
97
142
  where.push(`"updatedAt" >= $${vals.push(f.since)}`);
98
143
  const { rows } = await this.db.query(`SELECT * FROM agentic_threads${where.length ? ` WHERE ${where.join(' AND ')}` : ''}
99
144
  ORDER BY "updatedAt" DESC LIMIT $${vals.push(f.limit ?? 100)}`, vals);
100
- return rows.map((r) => ({
101
- id: r.id, state: r.state, model: r.model,
102
- firstSeenAt: new Date(r.firstSeenAt), updatedAt: new Date(r.updatedAt),
103
- startedWith: r.startedWith ? { ...r.startedWith, at: new Date(r.startedWith.at) } : null,
104
- }));
145
+ return rows.map(toThread);
146
+ },
147
+ get: async (threadId) => {
148
+ const { rows } = await this.db.query('SELECT * FROM agentic_threads WHERE id = $1', [threadId]);
149
+ return rows[0] ? toThread(rows[0]) : null;
150
+ },
151
+ delete: async (threadId) => {
152
+ await this.transaction(async (q) => {
153
+ await q('DELETE FROM agentic_steps WHERE "threadId" = $1', [threadId]);
154
+ await q('DELETE FROM agentic_runs WHERE "threadId" = $1', [threadId]);
155
+ await q('DELETE FROM agentic_threads WHERE id = $1', [threadId]);
156
+ });
105
157
  },
106
158
  };
159
+ /** Run `fn` in one transaction, on one connection: a pool hands each query
160
+ * whichever connection is free, which is not a transaction at all. */
161
+ async transaction(fn) {
162
+ const conn = this.db.connect ? await this.db.connect() : null;
163
+ const q = (sql, params) => (conn ?? this.db).query(sql, params);
164
+ try {
165
+ await q('BEGIN');
166
+ try {
167
+ await fn(q);
168
+ await q('COMMIT');
169
+ }
170
+ catch (err) {
171
+ await q('ROLLBACK').catch(() => undefined);
172
+ throw err;
173
+ }
174
+ }
175
+ finally {
176
+ conn?.release();
177
+ }
178
+ }
107
179
  runs = {
108
180
  start: async (run) => {
109
181
  const { rows } = await this.db.query(`INSERT INTO agentic_runs
110
182
  (id, "threadId", "parentRunId", depth, agent, model, state,
111
- prompt, "tokenBudget", "runState", "providerOptions")
112
- VALUES ($1, $2, $3, $4, $5, $6, 'RUNNING', $7, $8, $9, $10) RETURNING *`, [
183
+ prompt, "tokenBudget", "runState", "providerOptions", "enqueuedAt", "costBudgetMicros", "maxSteps")
184
+ VALUES ($1, $2, $3, $4, $5, $6, $11, $7, $8, $9, $10, $12, $13, $14) RETURNING *`, [
113
185
  run.id, run.threadId, run.parentRunId ?? null, run.depth ?? 0,
114
186
  run.agent, run.model, run.prompt ?? null, run.tokenBudget ?? null,
115
187
  run.runState ? JSON.stringify(run.runState) : null,
116
188
  run.providerOptions ? JSON.stringify(run.providerOptions) : null,
189
+ run.state ?? 'RUNNING', run.enqueuedAt ?? null,
190
+ run.costBudgetMicros ?? null, run.maxSteps ?? null,
117
191
  ]);
118
192
  return toRun(rows[0]);
119
193
  },
@@ -121,10 +195,11 @@ export class PostgresAdminStore {
121
195
  const sets = [];
122
196
  const vals = [];
123
197
  for (const [k, v] of Object.entries(patch)) {
124
- if (v === undefined)
125
- continue;
198
+ // Only the run's own columns, never a key SQL was built from blindly.
126
199
  // JSON columns need the value serialised; everything else pg handles.
127
- sets.push(`"${k}" = $${vals.push(k === 'result' ? JSON.stringify(v) : v)}`);
200
+ if (v === undefined || !RUN_COLUMNS.has(k))
201
+ continue;
202
+ sets.push(`"${k}" = $${vals.push(JSON_COLUMNS.has(k) ? JSON.stringify(v) : v)}`);
128
203
  }
129
204
  if (sets.length === 0)
130
205
  return;
@@ -139,22 +214,42 @@ export class PostgresAdminStore {
139
214
  return rows.map(toRun);
140
215
  },
141
216
  list: async (f) => {
142
- const where = [];
143
- const vals = [];
144
- if (f.state?.length)
145
- where.push(`state = ANY($${vals.push(f.state)})`);
146
- if (f.agent)
147
- where.push(`agent = $${vals.push(f.agent)}`);
148
- if (f.threadId)
149
- where.push(`"threadId" = $${vals.push(f.threadId)}`);
150
- if (f.since)
151
- where.push(`"startedAt" >= $${vals.push(f.since)}`);
152
- if (f.until)
153
- where.push(`"startedAt" <= $${vals.push(f.until)}`);
154
- const { rows } = await this.db.query(`SELECT * FROM agentic_runs${where.length ? ` WHERE ${where.join(' AND ')}` : ''}
155
- ORDER BY "startedAt" DESC LIMIT $${vals.push(f.limit ?? 100)}`, vals);
217
+ const { where, vals } = runWhere(f);
218
+ // Ordered on the id after the start time, so a page's last run is a
219
+ // cursor that splits the listing exactly (RunFilter.before).
220
+ const { rows } = await this.db.query(`SELECT * FROM agentic_runs${where}
221
+ ORDER BY "startedAt" DESC, id DESC LIMIT $${vals.push(f.limit ?? 100)}`, vals);
156
222
  return rows.map(toRun);
157
223
  },
224
+ increment: async (runId, d) => {
225
+ await this.db.query(`UPDATE agentic_runs SET steps = steps + $1, "inputTokens" = "inputTokens" + $2,
226
+ "cachedInputTokens" = "cachedInputTokens" + $3, "outputTokens" = "outputTokens" + $4,
227
+ "totalTokens" = "totalTokens" + $5 WHERE id = $6`, [d.steps, d.inputTokens, d.cachedInputTokens, d.outputTokens, d.totalTokens, runId]);
228
+ },
229
+ totals: async (f) => {
230
+ const { where, vals } = runWhere({ ...f, before: undefined });
231
+ const { rows } = await this.db.query(`SELECT state, "stopReason", COUNT(*) AS n, COALESCE(SUM(steps),0) AS steps,
232
+ COALESCE(SUM("inputTokens"),0) AS "inputTokens", COALESCE(SUM("cachedInputTokens"),0) AS "cachedInputTokens",
233
+ COALESCE(SUM("outputTokens"),0) AS "outputTokens", COALESCE(SUM("totalTokens"),0) AS "totalTokens"
234
+ FROM agentic_runs${where} GROUP BY state, "stopReason"`, vals);
235
+ const out = emptyRunTotals();
236
+ for (const r of rows)
237
+ addRunTotals(out, r.state, r.stopReason, Number(r.n), r);
238
+ return out;
239
+ },
240
+ claimSettle: async (runId, token, staleBefore) => {
241
+ const { rows } = await this.db.query(`UPDATE agentic_runs SET "settlingAt" = now(), "settleToken" = $1
242
+ WHERE id = $2 AND "settledAt" IS NULL AND ("settlingAt" IS NULL OR "settlingAt" < $3)
243
+ RETURNING id`, [token, runId, staleBefore]);
244
+ return rows.length === 1;
245
+ },
246
+ endSettle: async (runId, token, settled) => {
247
+ await this.db.query(settled
248
+ ? `UPDATE agentic_runs SET "settledAt" = now(), "settlingAt" = NULL, "settleToken" = NULL
249
+ WHERE id = $1 AND "settleToken" = $2`
250
+ : `UPDATE agentic_runs SET "settlingAt" = NULL, "settleToken" = NULL
251
+ WHERE id = $1 AND "settleToken" = $2`, [runId, token]);
252
+ },
158
253
  countByState: async () => {
159
254
  const { rows } = await this.db.query('SELECT state, COUNT(*)::int AS n FROM agentic_runs GROUP BY state');
160
255
  return Object.fromEntries(rows.map((r) => [r.state, r.n]));
@@ -186,9 +281,9 @@ export class PostgresAdminStore {
186
281
  }
187
282
  const toStep = (r) => ({
188
283
  runId: r.runId, threadId: r.threadId ?? '', agentId: r.agentId ?? null, index: r.index,
189
- durationMs: r.durationMs, finishReason: r.finishReason,
190
- inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
191
- outputTokens: r.outputTokens, totalTokens: r.totalTokens,
284
+ durationMs: Number(r.durationMs), finishReason: r.finishReason,
285
+ inputTokens: Number(r.inputTokens), cachedInputTokens: Number(r.cachedInputTokens),
286
+ outputTokens: Number(r.outputTokens), totalTokens: Number(r.totalTokens),
192
287
  tools: r.tools ?? [], text: r.text ?? null,
193
288
  toolCalls: r.toolCalls ?? [], at: new Date(r.at),
194
289
  });
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/admin/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/admin/postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ExecutionState } from '../core/types.js';
2
+ import type { RunTotals } from '../ports/admin.js';
3
+ /** Zero totals over no runs. */
4
+ export declare const emptyRunTotals: () => RunTotals;
5
+ /** Fold one group of `runs` runs (one state and stop reason, with their
6
+ * summed counters) into totals. Every admin store groups the same way. */
7
+ export declare function addRunTotals(out: RunTotals, state: ExecutionState, stopReason: string | null | undefined, runs: number, sums: {
8
+ steps: number;
9
+ inputTokens: number;
10
+ cachedInputTokens: number;
11
+ outputTokens: number;
12
+ totalTokens: number;
13
+ }): void;
14
+ /** The run columns a patch may write (§2.9). Anything else in a patch is
15
+ * ignored rather than turned into SQL. */
16
+ export declare const RUN_COLUMNS: Set<string>;
17
+ /** The run columns that hold JSON. */
18
+ export declare const JSON_COLUMNS: Set<string>;
19
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/admin/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,gCAAgC;AAChC,eAAO,MAAM,cAAc,QAAO,SAGhC,CAAC;AAEH;2EAC2E;AAC3E,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACjH,IAAI,CASN;AAED;2CAC2C;AAC3C,eAAO,MAAM,WAAW,aAItB,CAAC;AACH,sCAAsC;AACtC,eAAO,MAAM,YAAY,aAAqD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** Zero totals over no runs. */
2
+ export const emptyRunTotals = () => ({
3
+ runs: 0, byState: {}, byStopReason: {}, steps: 0,
4
+ inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0,
5
+ });
6
+ /** Fold one group of `runs` runs (one state and stop reason, with their
7
+ * summed counters) into totals. Every admin store groups the same way. */
8
+ export function addRunTotals(out, state, stopReason, runs, sums) {
9
+ out.runs += runs;
10
+ out.byState[state] = (out.byState[state] ?? 0) + runs;
11
+ if (stopReason)
12
+ out.byStopReason[stopReason] = (out.byStopReason[stopReason] ?? 0) + runs;
13
+ out.steps += Number(sums.steps);
14
+ out.inputTokens += Number(sums.inputTokens);
15
+ out.cachedInputTokens += Number(sums.cachedInputTokens);
16
+ out.outputTokens += Number(sums.outputTokens);
17
+ out.totalTokens += Number(sums.totalTokens);
18
+ }
19
+ /** The run columns a patch may write (§2.9). Anything else in a patch is
20
+ * ignored rather than turned into SQL. */
21
+ export const RUN_COLUMNS = new Set([
22
+ 'state', 'stopReason', 'error', 'startedAt', 'endedAt', 'enqueuedAt', 'durationMs', 'queuedMs',
23
+ 'settledAt', 'steps', 'inputTokens', 'cachedInputTokens', 'outputTokens', 'totalTokens',
24
+ 'attempts', 'result', 'prompt', 'tokenBudget', 'runState', 'providerOptions', 'costBudgetMicros', 'maxSteps',
25
+ ]);
26
+ /** The run columns that hold JSON. */
27
+ export const JSON_COLUMNS = new Set(['result', 'runState', 'providerOptions']);
28
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/admin/shared.ts"],"names":[],"mappings":"AAGA,gCAAgC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAc,EAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAChD,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;CACtE,CAAC,CAAC;AAEH;2EAC2E;AAC3E,MAAM,UAAU,YAAY,CAC1B,GAAc,EACd,KAAqB,EACrB,UAAqC,EACrC,IAAY,EACZ,IAAkH;IAElH,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;IACjB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,IAAI,UAAU;QAAE,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1F,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxD,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED;2CAC2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU;IAC9F,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa;IACvF,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU;CAC7G,CAAC,CAAC;AACH,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { ExecutionState, NewRunRecord, RunPatch, RunRecord } from '../core/types.js';
2
- import type { AdminStore, AdminThread, AdminThreadFilter, NewAdminThread, NewStepRecord, RunFilter, StepRecord } from '../ports/admin.js';
2
+ import type { AdminStore, AdminThread, AdminThreadFilter, NewAdminThread, NewStepRecord, RunDeltas, RunFilter, RunTotals, StepRecord } from '../ports/admin.js';
3
3
  import type { SqliteLike } from '../adapters/sqlite.js';
4
4
  /** Operational history in SQLite — what `dev: true` uses (§2.9).
5
5
  *
@@ -32,13 +32,21 @@ export declare class SqliteAdminStore implements AdminStore {
32
32
  upsert: (t: NewAdminThread) => Promise<void>;
33
33
  countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
34
34
  list: (f: AdminThreadFilter) => Promise<AdminThread[]>;
35
+ get: (threadId: string) => Promise<AdminThread | null>;
36
+ delete: (threadId: string) => Promise<void>;
35
37
  };
38
+ /** The RunFilter as a WHERE clause, limit aside. */
39
+ private runWhere;
36
40
  runs: {
37
41
  start: (run: NewRunRecord) => Promise<RunRecord>;
38
42
  patch: (runId: string, patch: RunPatch) => Promise<void>;
39
43
  get: (runId: string) => Promise<RunRecord | null>;
40
44
  listByThread: (threadId: string) => Promise<RunRecord[]>;
41
45
  list: (f: RunFilter) => Promise<RunRecord[]>;
46
+ increment: (runId: string, d: RunDeltas) => Promise<void>;
47
+ totals: (f: RunFilter) => Promise<RunTotals>;
48
+ claimSettle: (runId: string, token: string, staleBefore: Date) => Promise<boolean>;
49
+ endSettle: (runId: string, token: string, settled: boolean) => Promise<void>;
42
50
  countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
43
51
  };
44
52
  steps: {
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/admin/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAC1D,aAAa,EAAE,SAAS,EAAE,UAAU,EACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAaxD;;;;;;;4CAO4C;AAC5C,qBAAa,gBAAiB,YAAW,UAAU;IAG7B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP;;;;;;sCAMkC;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE;QAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,UAAU;IAYnG,kEAAkE;IAClE,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK,CAYV;IAEH,OAAO;oBACa,cAAc;;kBAkBhB,iBAAiB,KAAG,OAAO,CAAC,WAAW,EAAE,CAAC;MAkB1D;IAEF,IAAI;qBACiB,YAAY;uBAcV,MAAM,SAAS,QAAQ;qBAWzB,MAAM;iCAIM,MAAM;kBAGrB,SAAS;;MAsBzB;IAEF,KAAK;oBACe,aAAa;2BASN,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;iCAGxB,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;MAG7D;IAEF,OAAO,CAAC,MAAM,CAOX;CACJ"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/admin/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAC1D,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAC3D,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAaxD;;;;;;;4CAO4C;AAC5C,qBAAa,gBAAiB,YAAW,UAAU;IAG7B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP;;;;;;sCAMkC;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE;QAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,UAAU;IAanG,kEAAkE;IAClE,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK,CAcV;IAEH,OAAO;oBACa,cAAc;;kBAkBhB,iBAAiB,KAAG,OAAO,CAAC,WAAW,EAAE,CAAC;wBAkBpC,MAAM,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;2BAUjC,MAAM;MAY/B;IAEF,oDAAoD;IACpD,OAAO,CAAC,QAAQ;IAwBhB,IAAI;qBACiB,YAAY;uBAgBV,MAAM,SAAS,QAAQ;qBAazB,MAAM;iCAIM,MAAM;kBAGrB,SAAS;2BAUA,MAAM,KAAK,SAAS;oBAQ3B,SAAS,KAAG,OAAO,CAAC,SAAS,CAAC;6BAcrB,MAAM,SAAS,MAAM,eAAe,IAAI;2BAU1C,MAAM,SAAS,MAAM,WAAW,OAAO;;MAkBhE;IAEF,KAAK;oBACe,aAAa;2BASN,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;iCAGxB,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;MAG7D;IAEF,OAAO,CAAC,MAAM,CAOX;CACJ"}
@@ -1,3 +1,4 @@
1
+ import { addRunTotals, emptyRunTotals, JSON_COLUMNS, RUN_COLUMNS } from './shared.js';
1
2
  import { gatedAdminStore, runMigrations } from './migrations/runner.js';
2
3
  import { dialect, migrations } from './migrations/sqlite/index.js';
3
4
  const date = (n) => (n == null ? null : new Date(n));
@@ -32,14 +33,13 @@ export class SqliteAdminStore {
32
33
  * not it has migrating to do. */
33
34
  static open(db, log) {
34
35
  const store = new SqliteAdminStore(db);
35
- const ready = runMigrations(store.driver(), dialect, migrations).catch((err) => {
36
+ return gatedAdminStore(store, () => runMigrations(store.driver(), dialect, migrations).catch((err) => {
36
37
  // Loud, because everything downstream of this is silent: admin writes
37
38
  // are best effort, so a failed migration shows up as a dashboard with
38
39
  // nothing in it rather than as an error.
39
40
  (log ?? console).error('admin migrations failed', err);
40
41
  throw err;
41
- });
42
- return gatedAdminStore(store, ready);
42
+ }));
43
43
  }
44
44
  /** The two calls the migrator needs, over this store's handle. */
45
45
  driver() {
@@ -63,14 +63,16 @@ export class SqliteAdminStore {
63
63
  id: r.id, threadId: r.threadId, parentRunId: r.parentRunId ?? null, depth: r.depth,
64
64
  agent: r.agent, model: r.model, state: r.state,
65
65
  stopReason: r.stopReason ?? null, error: r.error ?? null,
66
- startedAt: new Date(r.startedAt), endedAt: date(r.endedAt),
66
+ startedAt: new Date(r.startedAt), endedAt: date(r.endedAt), enqueuedAt: date(r.enqueuedAt),
67
67
  durationMs: r.durationMs ?? null, queuedMs: r.queuedMs ?? null,
68
+ settledAt: date(r.settledAt), settlingAt: date(r.settlingAt),
68
69
  attempts: r.attempts, steps: r.steps,
69
70
  inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
70
71
  outputTokens: r.outputTokens, totalTokens: r.totalTokens,
71
72
  result: parse(r.result),
72
73
  prompt: r.prompt ?? null, tokenBudget: r.tokenBudget ?? null,
73
74
  runState: parse(r.runState), providerOptions: parse(r.providerOptions),
75
+ costBudgetMicros: r.costBudgetMicros ?? null, maxSteps: r.maxSteps ?? null,
74
76
  });
75
77
  threads = {
76
78
  upsert: async (t) => {
@@ -104,14 +106,81 @@ export class SqliteAdminStore {
104
106
  startedWith: parseStart(r.startedWith),
105
107
  }));
106
108
  },
109
+ get: async (threadId) => {
110
+ const r = this.one('SELECT * FROM agentic_threads WHERE id = ?', threadId);
111
+ return r
112
+ ? {
113
+ id: r.id, state: r.state, model: r.model,
114
+ firstSeenAt: new Date(r.firstSeenAt), updatedAt: new Date(r.updatedAt),
115
+ startedWith: parseStart(r.startedWith),
116
+ }
117
+ : null;
118
+ },
119
+ delete: async (threadId) => {
120
+ this.write('BEGIN IMMEDIATE');
121
+ try {
122
+ this.write('DELETE FROM agentic_steps WHERE threadId = ?', threadId);
123
+ this.write('DELETE FROM agentic_runs WHERE threadId = ?', threadId);
124
+ this.write('DELETE FROM agentic_threads WHERE id = ?', threadId);
125
+ this.write('COMMIT');
126
+ }
127
+ catch (err) {
128
+ try {
129
+ this.write('ROLLBACK');
130
+ }
131
+ catch { /* already gone */ }
132
+ throw err;
133
+ }
134
+ },
107
135
  };
136
+ /** The RunFilter as a WHERE clause, limit aside. */
137
+ runWhere(f) {
138
+ const where = [];
139
+ const vals = [];
140
+ if (f.state?.length) {
141
+ where.push(`state IN (${f.state.map(() => '?').join(',')})`);
142
+ vals.push(...f.state);
143
+ }
144
+ if (f.agent) {
145
+ where.push('agent = ?');
146
+ vals.push(f.agent);
147
+ }
148
+ if (f.threadId) {
149
+ where.push('threadId = ?');
150
+ vals.push(f.threadId);
151
+ }
152
+ if (f.threadIds?.length) {
153
+ where.push(`threadId IN (${f.threadIds.map(() => '?').join(',')})`);
154
+ vals.push(...f.threadIds);
155
+ }
156
+ if (f.since) {
157
+ where.push('startedAt >= ?');
158
+ vals.push(f.since.getTime());
159
+ }
160
+ if (f.until) {
161
+ where.push('startedAt <= ?');
162
+ vals.push(f.until.getTime());
163
+ }
164
+ if (f.unsettled)
165
+ where.push('endedAt IS NOT NULL AND settledAt IS NULL');
166
+ if (f.depth !== undefined) {
167
+ where.push('depth = ?');
168
+ vals.push(f.depth);
169
+ }
170
+ if (f.before) {
171
+ where.push('(startedAt < ? OR startedAt = ? AND id < ?)');
172
+ vals.push(f.before.startedAt.getTime(), f.before.startedAt.getTime(), f.before.id);
173
+ }
174
+ return { where: where.length ? ` WHERE ${where.join(' AND ')}` : '', vals };
175
+ }
108
176
  runs = {
109
177
  start: async (run) => {
110
178
  const startedAt = Date.now();
111
- this.write('INSERT INTO agentic_runs (id,threadId,parentRunId,depth,agent,model,state,startedAt,prompt,tokenBudget,runState,providerOptions) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)', run.id, run.threadId, run.parentRunId ?? null, run.depth ?? 0, run.agent, run.model, 'RUNNING', startedAt, run.prompt ?? null, run.tokenBudget ?? null, json(run.runState), json(run.providerOptions));
179
+ this.write('INSERT INTO agentic_runs (id,threadId,parentRunId,depth,agent,model,state,startedAt,enqueuedAt,prompt,tokenBudget,runState,providerOptions,costBudgetMicros,maxSteps) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', run.id, run.threadId, run.parentRunId ?? null, run.depth ?? 0, run.agent, run.model, run.state ?? 'RUNNING', startedAt, run.enqueuedAt?.getTime() ?? null, run.prompt ?? null, run.tokenBudget ?? null, json(run.runState), json(run.providerOptions), run.costBudgetMicros ?? null, run.maxSteps ?? null);
112
180
  return this.toRun({
113
181
  ...run, parentRunId: run.parentRunId ?? null, depth: run.depth ?? 0,
114
- state: 'RUNNING', startedAt, attempts: 0, steps: 0,
182
+ state: run.state ?? 'RUNNING', startedAt, enqueuedAt: run.enqueuedAt?.getTime() ?? null,
183
+ attempts: 0, steps: 0,
115
184
  inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0,
116
185
  });
117
186
  },
@@ -119,10 +188,12 @@ export class SqliteAdminStore {
119
188
  const cols = [];
120
189
  const vals = [];
121
190
  for (const [k, v] of Object.entries(patch)) {
122
- if (v === undefined)
191
+ // Only the run's own columns, never a key SQL was built from blindly;
192
+ // JSON columns are encoded, since SQLite cannot bind an object.
193
+ if (v === undefined || !RUN_COLUMNS.has(k))
123
194
  continue;
124
195
  cols.push(`${k} = ?`);
125
- vals.push(v instanceof Date ? v.getTime() : k === 'result' ? json(v) : v);
196
+ vals.push(v instanceof Date ? v.getTime() : JSON_COLUMNS.has(k) ? json(v) : v);
126
197
  }
127
198
  if (cols.length === 0)
128
199
  return;
@@ -135,30 +206,42 @@ export class SqliteAdminStore {
135
206
  listByThread: async (threadId) => this.all('SELECT * FROM agentic_runs WHERE threadId = ? ORDER BY startedAt DESC', threadId)
136
207
  .map(this.toRun),
137
208
  list: async (f) => {
138
- const where = [];
139
- const vals = [];
140
- if (f.state?.length) {
141
- where.push(`state IN (${f.state.map(() => '?').join(',')})`);
142
- vals.push(...f.state);
143
- }
144
- if (f.agent) {
145
- where.push('agent = ?');
146
- vals.push(f.agent);
147
- }
148
- if (f.threadId) {
149
- where.push('threadId = ?');
150
- vals.push(f.threadId);
209
+ const { where, vals } = this.runWhere(f);
210
+ // Ordered on the id after the start time, so a page's last run is a
211
+ // cursor that splits the listing exactly (RunFilter.before).
212
+ return this.all(`SELECT * FROM agentic_runs${where}` +
213
+ ' ORDER BY startedAt DESC, id DESC LIMIT ?', ...vals, f.limit ?? 100).map(this.toRun);
214
+ },
215
+ increment: async (runId, d) => {
216
+ this.write(`UPDATE agentic_runs SET steps = steps + ?, inputTokens = inputTokens + ?,
217
+ cachedInputTokens = cachedInputTokens + ?, outputTokens = outputTokens + ?,
218
+ totalTokens = totalTokens + ? WHERE id = ?`, d.steps, d.inputTokens, d.cachedInputTokens, d.outputTokens, d.totalTokens, runId);
219
+ },
220
+ totals: async (f) => {
221
+ const { where, vals } = this.runWhere({ ...f, before: undefined });
222
+ const out = emptyRunTotals();
223
+ for (const r of this.all(`SELECT state, stopReason, COUNT(*) AS n, COALESCE(SUM(steps),0) AS steps,
224
+ COALESCE(SUM(inputTokens),0) AS inputTokens, COALESCE(SUM(cachedInputTokens),0) AS cachedInputTokens,
225
+ COALESCE(SUM(outputTokens),0) AS outputTokens, COALESCE(SUM(totalTokens),0) AS totalTokens
226
+ FROM agentic_runs${where} GROUP BY state, stopReason`, ...vals)) {
227
+ addRunTotals(out, r.state, r.stopReason, Number(r.n), r);
151
228
  }
152
- if (f.since) {
153
- where.push('startedAt >= ?');
154
- vals.push(f.since.getTime());
229
+ return out;
230
+ },
231
+ claimSettle: async (runId, token, staleBefore) => {
232
+ // The token is new for every claim, so reading it back says whether
233
+ // this write is the one that won.
234
+ this.write(`UPDATE agentic_runs SET settlingAt = ?, settleToken = ?
235
+ WHERE id = ? AND settledAt IS NULL AND (settlingAt IS NULL OR settlingAt < ?)`, Date.now(), token, runId, staleBefore.getTime());
236
+ return this.one('SELECT settleToken FROM agentic_runs WHERE id = ?', runId)?.settleToken === token;
237
+ },
238
+ endSettle: async (runId, token, settled) => {
239
+ if (settled) {
240
+ this.write('UPDATE agentic_runs SET settledAt = ?, settlingAt = NULL, settleToken = NULL WHERE id = ? AND settleToken = ?', Date.now(), runId, token);
155
241
  }
156
- if (f.until) {
157
- where.push('startedAt <= ?');
158
- vals.push(f.until.getTime());
242
+ else {
243
+ this.write('UPDATE agentic_runs SET settlingAt = NULL, settleToken = NULL WHERE id = ? AND settleToken = ?', runId, token);
159
244
  }
160
- return this.all(`SELECT * FROM agentic_runs${where.length ? ` WHERE ${where.join(' AND ')}` : ''}` +
161
- ' ORDER BY startedAt DESC LIMIT ?', ...vals, f.limit ?? 100).map(this.toRun);
162
245
  },
163
246
  countByState: async () => Object.fromEntries(this.all('SELECT state, COUNT(*) AS n FROM agentic_runs GROUP BY state')
164
247
  .map((r) => [r.state, r.n])),