@cat-factory/node-server 0.95.1 → 0.96.1

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 (52) hide show
  1. package/dist/container.d.ts.map +1 -1
  2. package/dist/container.js +16 -5
  3. package/dist/container.js.map +1 -1
  4. package/dist/repositories/drizzle/_shared.d.ts +2 -0
  5. package/dist/repositories/drizzle/_shared.d.ts.map +1 -0
  6. package/dist/repositories/drizzle/_shared.js +11 -0
  7. package/dist/repositories/drizzle/_shared.js.map +1 -0
  8. package/dist/repositories/drizzle/accounts.d.ts +62 -0
  9. package/dist/repositories/drizzle/accounts.d.ts.map +1 -0
  10. package/dist/repositories/drizzle/accounts.js +438 -0
  11. package/dist/repositories/drizzle/accounts.js.map +1 -0
  12. package/dist/repositories/drizzle/board.d.ts +74 -0
  13. package/dist/repositories/drizzle/board.d.ts.map +1 -0
  14. package/dist/repositories/drizzle/board.js +489 -0
  15. package/dist/repositories/drizzle/board.js.map +1 -0
  16. package/dist/repositories/drizzle/connections.d.ts +84 -0
  17. package/dist/repositories/drizzle/connections.d.ts.map +1 -0
  18. package/dist/repositories/drizzle/connections.js +391 -0
  19. package/dist/repositories/drizzle/connections.js.map +1 -0
  20. package/dist/repositories/drizzle/execution.d.ts +58 -0
  21. package/dist/repositories/drizzle/execution.d.ts.map +1 -0
  22. package/dist/repositories/drizzle/execution.js +585 -0
  23. package/dist/repositories/drizzle/execution.js.map +1 -0
  24. package/dist/repositories/drizzle/initiatives.d.ts +54 -0
  25. package/dist/repositories/drizzle/initiatives.d.ts.map +1 -0
  26. package/dist/repositories/drizzle/initiatives.js +343 -0
  27. package/dist/repositories/drizzle/initiatives.js.map +1 -0
  28. package/dist/repositories/drizzle/kaizen.d.ts +34 -0
  29. package/dist/repositories/drizzle/kaizen.d.ts.map +1 -0
  30. package/dist/repositories/drizzle/kaizen.js +192 -0
  31. package/dist/repositories/drizzle/kaizen.js.map +1 -0
  32. package/dist/repositories/drizzle/reviews.d.ts +75 -0
  33. package/dist/repositories/drizzle/reviews.d.ts.map +1 -0
  34. package/dist/repositories/drizzle/reviews.js +449 -0
  35. package/dist/repositories/drizzle/reviews.js.map +1 -0
  36. package/dist/repositories/drizzle/sandbox.d.ts +61 -0
  37. package/dist/repositories/drizzle/sandbox.d.ts.map +1 -0
  38. package/dist/repositories/drizzle/sandbox.js +370 -0
  39. package/dist/repositories/drizzle/sandbox.js.map +1 -0
  40. package/dist/repositories/drizzle/settings.d.ts +76 -0
  41. package/dist/repositories/drizzle/settings.d.ts.map +1 -0
  42. package/dist/repositories/drizzle/settings.js +377 -0
  43. package/dist/repositories/drizzle/settings.js.map +1 -0
  44. package/dist/repositories/drizzle/telemetry.d.ts +60 -0
  45. package/dist/repositories/drizzle/telemetry.d.ts.map +1 -0
  46. package/dist/repositories/drizzle/telemetry.js +559 -0
  47. package/dist/repositories/drizzle/telemetry.js.map +1 -0
  48. package/dist/repositories/drizzle.d.ts +6 -113
  49. package/dist/repositories/drizzle.d.ts.map +1 -1
  50. package/dist/repositories/drizzle.js +20 -4118
  51. package/dist/repositories/drizzle.js.map +1 -1
  52. package/package.json +20 -20
@@ -0,0 +1,585 @@
1
+ // Drizzle/Postgres implementations of the core kernel repository ports, split by
2
+ // domain (mirrors the Cloudflare D1 per-repository layout). The row<->domain mapping
3
+ // is the SAME shared mapping the D1 repos use (@cat-factory/server), so behaviour
4
+ // matches across stores; this layer only owns the Drizzle queries. Assembled into the
5
+ // CoreRepositories set by ./drizzle.ts (the barrel).
6
+ import { agentRunKindSchema } from '@cat-factory/contracts';
7
+ import { decodeEnum, executionToDetail, parseIssueIntakeColumn, rowToExecution, rowToPipeline, serializeIssueIntakeColumn, tryDecodeRows, } from '@cat-factory/server';
8
+ import { and, desc, eq, inArray, lt, notInArray, or, sql } from 'drizzle-orm';
9
+ import { agentRuns, blocks, pipelineScheduleRuns, pipelineSchedules, pipelines, } from '../../db/schema.js';
10
+ export class DrizzlePipelineRepository {
11
+ db;
12
+ constructor(db) {
13
+ this.db = db;
14
+ }
15
+ async listByWorkspace(workspaceId) {
16
+ const rows = await this.db
17
+ .select()
18
+ .from(pipelines)
19
+ .where(eq(pipelines.workspace_id, workspaceId))
20
+ // Order by the monotonic insert `seq` so the catalog comes back in the curated
21
+ // `seedPipelines()` order it was inserted in (Postgres gives no row order without
22
+ // ORDER BY) — deterministic snapshots, a stable default `pipelines[0]`, and parity
23
+ // with the Cloudflare facade's `ORDER BY rowid`.
24
+ .orderBy(pipelines.seq);
25
+ return rows.map(rowToPipeline);
26
+ }
27
+ async get(workspaceId, id) {
28
+ const [row] = await this.db
29
+ .select()
30
+ .from(pipelines)
31
+ .where(and(eq(pipelines.workspace_id, workspaceId), eq(pipelines.id, id)));
32
+ return row ? rowToPipeline(row) : null;
33
+ }
34
+ async insert(workspaceId, pipeline) {
35
+ await this.db.insert(pipelines).values({
36
+ workspace_id: workspaceId,
37
+ id: pipeline.id,
38
+ name: pipeline.name,
39
+ agent_kinds: JSON.stringify(pipeline.agentKinds),
40
+ gates: pipeline.gates ? JSON.stringify(pipeline.gates) : null,
41
+ thresholds: pipeline.thresholds ? JSON.stringify(pipeline.thresholds) : null,
42
+ enabled: pipeline.enabled ? JSON.stringify(pipeline.enabled) : null,
43
+ consensus: pipeline.consensus ? JSON.stringify(pipeline.consensus) : null,
44
+ gating: pipeline.gating ? JSON.stringify(pipeline.gating) : null,
45
+ follow_ups: pipeline.followUps ? JSON.stringify(pipeline.followUps) : null,
46
+ tester_quality: pipeline.testerQuality ? JSON.stringify(pipeline.testerQuality) : null,
47
+ step_options: pipeline.stepOptions ? JSON.stringify(pipeline.stepOptions) : null,
48
+ labels: pipeline.labels ? JSON.stringify(pipeline.labels) : null,
49
+ archived: pipeline.archived ? 1 : null,
50
+ builtin: pipeline.builtin ? 1 : null,
51
+ version: pipeline.version ?? null,
52
+ public: pipeline.public ? 1 : null,
53
+ availability: pipeline.availability ?? null,
54
+ });
55
+ }
56
+ async update(workspaceId, pipeline) {
57
+ // UPDATE in place preserves the row's `seq`, so an edited pipeline keeps its place
58
+ // in the catalog order. `builtin` is immutable, so it is not rewritten. `version` IS
59
+ // rewritten so a reseed bumps the stored copy to the current catalog version.
60
+ await this.db
61
+ .update(pipelines)
62
+ .set({
63
+ name: pipeline.name,
64
+ agent_kinds: JSON.stringify(pipeline.agentKinds),
65
+ gates: pipeline.gates ? JSON.stringify(pipeline.gates) : null,
66
+ thresholds: pipeline.thresholds ? JSON.stringify(pipeline.thresholds) : null,
67
+ enabled: pipeline.enabled ? JSON.stringify(pipeline.enabled) : null,
68
+ consensus: pipeline.consensus ? JSON.stringify(pipeline.consensus) : null,
69
+ gating: pipeline.gating ? JSON.stringify(pipeline.gating) : null,
70
+ follow_ups: pipeline.followUps ? JSON.stringify(pipeline.followUps) : null,
71
+ tester_quality: pipeline.testerQuality ? JSON.stringify(pipeline.testerQuality) : null,
72
+ step_options: pipeline.stepOptions ? JSON.stringify(pipeline.stepOptions) : null,
73
+ labels: pipeline.labels ? JSON.stringify(pipeline.labels) : null,
74
+ archived: pipeline.archived ? 1 : null,
75
+ version: pipeline.version ?? null,
76
+ public: pipeline.public ? 1 : null,
77
+ availability: pipeline.availability ?? null,
78
+ })
79
+ .where(and(eq(pipelines.workspace_id, workspaceId), eq(pipelines.id, pipeline.id)));
80
+ }
81
+ async delete(workspaceId, id) {
82
+ await this.db
83
+ .delete(pipelines)
84
+ .where(and(eq(pipelines.workspace_id, workspaceId), eq(pipelines.id, id)));
85
+ }
86
+ }
87
+ /** Execution runs live as `kind='execution'` rows of the unified agent_runs table. */
88
+ export class DrizzleExecutionRepository {
89
+ db;
90
+ clock;
91
+ constructor(db, clock) {
92
+ this.db = db;
93
+ this.clock = clock;
94
+ }
95
+ isExecution = eq(agentRuns.kind, 'execution');
96
+ async listByWorkspace(workspaceId) {
97
+ const rows = await this.db
98
+ .select()
99
+ .from(agentRuns)
100
+ .where(and(eq(agentRuns.workspace_id, workspaceId), this.isExecution))
101
+ .orderBy(agentRuns.created_at);
102
+ // Snapshot-facing list read: drop a corrupt run rather than failing the whole board load.
103
+ return tryDecodeRows(rows, (r) => rowToExecution(r), (r) => ({ table: 'agent_runs', id: r.id }));
104
+ }
105
+ async listLive(workspaceId) {
106
+ // Lean live-run projection: block_id + status + id only, NEVER the heavy `detail` column.
107
+ // Served by idx_agent_runs_ws_kind_status (workspace_id, kind, status). Mirrors the D1 repo.
108
+ // Unordered: both consumers (dispatch guard's block-id Set, resumePaused's id loop) are
109
+ // order-agnostic.
110
+ const rows = await this.db
111
+ .select({ id: agentRuns.id, blockId: agentRuns.block_id, status: agentRuns.status })
112
+ .from(agentRuns)
113
+ .where(and(eq(agentRuns.workspace_id, workspaceId), this.isExecution, inArray(agentRuns.status, ['running', 'blocked', 'paused'])));
114
+ return rows.map((r) => ({
115
+ id: r.id,
116
+ blockId: r.blockId ?? '',
117
+ status: r.status,
118
+ }));
119
+ }
120
+ async listByService(serviceId) {
121
+ const rows = await this.db
122
+ .select()
123
+ .from(agentRuns)
124
+ .where(and(eq(agentRuns.service_id, serviceId), this.isExecution))
125
+ .orderBy(agentRuns.created_at);
126
+ return tryDecodeRows(rows, (r) => rowToExecution(r), (r) => ({ table: 'agent_runs', id: r.id }));
127
+ }
128
+ async listByServices(serviceIds) {
129
+ if (serviceIds.length === 0)
130
+ return [];
131
+ const out = [];
132
+ // Chunk the IN list to stay well under the bind-parameter limit.
133
+ for (let i = 0; i < serviceIds.length; i += 500) {
134
+ const rows = await this.db
135
+ .select()
136
+ .from(agentRuns)
137
+ .where(and(inArray(agentRuns.service_id, serviceIds.slice(i, i + 500)), this.isExecution))
138
+ .orderBy(agentRuns.created_at);
139
+ out.push(...tryDecodeRows(rows, (r) => rowToExecution(r), (r) => ({ table: 'agent_runs', id: r.id })));
140
+ }
141
+ return out;
142
+ }
143
+ async get(workspaceId, id) {
144
+ const [row] = await this.db
145
+ .select()
146
+ .from(agentRuns)
147
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.id, id), this.isExecution));
148
+ return row ? rowToExecution(row) : null;
149
+ }
150
+ async getByBlock(workspaceId, blockId) {
151
+ const [row] = await this.db
152
+ .select()
153
+ .from(agentRuns)
154
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.block_id, blockId), this.isExecution));
155
+ return row ? rowToExecution(row) : null;
156
+ }
157
+ async upsert(workspaceId, execution) {
158
+ const now = this.clock.now();
159
+ const detail = executionToDetail(execution);
160
+ // Stamp `service_id` from the run's block (subquery) so a shared service's runs surface on
161
+ // every board that mounts it via `listByService`; refreshed on every write so it follows a
162
+ // reparent that re-homes the block. Mirrors the D1 repo.
163
+ const serviceIdSub = sql `(SELECT ${blocks.service_id} FROM ${blocks} WHERE ${blocks.workspace_id} = ${workspaceId} AND ${blocks.id} = ${execution.blockId})`;
164
+ // `rev` is bumped on every write (and read back onto the instance) so a concurrent
165
+ // compareAndSwap can detect the row moved. A fresh insert starts at 0.
166
+ const rows = await this.db
167
+ .insert(agentRuns)
168
+ .values({
169
+ workspace_id: workspaceId,
170
+ id: execution.id,
171
+ kind: 'execution',
172
+ block_id: execution.blockId,
173
+ status: execution.status,
174
+ detail,
175
+ created_at: now,
176
+ updated_at: now,
177
+ workflow_instance_id: execution.id,
178
+ service_id: serviceIdSub,
179
+ rev: 0,
180
+ })
181
+ // error/failure/workflow_instance_id are left out of the update so they survive
182
+ // normal step writes (see markFailed) — mirrors the D1 repo.
183
+ .onConflictDoUpdate({
184
+ target: [agentRuns.workspace_id, agentRuns.id],
185
+ set: {
186
+ block_id: execution.blockId,
187
+ status: execution.status,
188
+ detail,
189
+ updated_at: now,
190
+ service_id: serviceIdSub,
191
+ rev: sql `${agentRuns.rev} + 1`,
192
+ },
193
+ })
194
+ .returning({ rev: agentRuns.rev });
195
+ if (rows[0])
196
+ execution.rev = rows[0].rev;
197
+ }
198
+ async insertLive(workspaceId, execution, opts) {
199
+ // One live run per block, enforced atomically by the partial unique index
200
+ // `uniq_live_execution_per_block` on (workspace_id, block_id) over live execution rows. The
201
+ // cleanup and the insert run inside ONE transaction so a losing concurrent insert can never
202
+ // wipe the winner: the DELETE only ever removes the block's TERMINAL rows and the caller's
203
+ // own `replaceId` (the run it is knowingly superseding) — NEVER another writer's fresh live
204
+ // row — and the index then rejects a second live insert via DO NOTHING (empty returning).
205
+ // Callers therefore MUST NOT `deleteByBlock` first. The conflict target mirrors the D1 repo
206
+ // and the index predicate exactly; the insert columns mirror upsert (service_id subquery,
207
+ // rev 0).
208
+ const now = this.clock.now();
209
+ const detail = executionToDetail(execution);
210
+ const serviceIdSub = sql `(SELECT ${blocks.service_id} FROM ${blocks} WHERE ${blocks.workspace_id} = ${workspaceId} AND ${blocks.id} = ${execution.blockId})`;
211
+ const terminalOrReplaced = opts?.replaceId
212
+ ? or(notInArray(agentRuns.status, ['running', 'blocked', 'paused']), eq(agentRuns.id, opts.replaceId))
213
+ : notInArray(agentRuns.status, ['running', 'blocked', 'paused']);
214
+ const rows = await this.db.transaction(async (tx) => {
215
+ await tx
216
+ .delete(agentRuns)
217
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.block_id, execution.blockId), eq(agentRuns.kind, 'execution'), terminalOrReplaced));
218
+ return tx
219
+ .insert(agentRuns)
220
+ .values({
221
+ workspace_id: workspaceId,
222
+ id: execution.id,
223
+ kind: 'execution',
224
+ block_id: execution.blockId,
225
+ status: execution.status,
226
+ detail,
227
+ created_at: now,
228
+ updated_at: now,
229
+ workflow_instance_id: execution.id,
230
+ service_id: serviceIdSub,
231
+ rev: 0,
232
+ })
233
+ .onConflictDoNothing({
234
+ target: [agentRuns.workspace_id, agentRuns.block_id],
235
+ // For DO NOTHING, `where` is the conflict target's partial-index predicate (the
236
+ // DO-UPDATE `targetWhere`); it must mirror uniq_live_execution_per_block exactly.
237
+ where: sql `${agentRuns.kind} = 'execution' AND ${agentRuns.status} IN ('running', 'blocked', 'paused')`,
238
+ })
239
+ .returning({ rev: agentRuns.rev });
240
+ });
241
+ if (!rows[0])
242
+ return false;
243
+ execution.rev = rows[0].rev;
244
+ return true;
245
+ }
246
+ async compareAndSwap(workspaceId, execution) {
247
+ // Conditional update guarded on the rev last read onto this instance; only writes
248
+ // when the stored row is unchanged. No insert — the run must already exist.
249
+ const expected = execution.rev ?? 0;
250
+ const now = this.clock.now();
251
+ const detail = executionToDetail(execution);
252
+ const serviceIdSub = sql `(SELECT ${blocks.service_id} FROM ${blocks} WHERE ${blocks.workspace_id} = ${workspaceId} AND ${blocks.id} = ${execution.blockId})`;
253
+ const rows = await this.db
254
+ .update(agentRuns)
255
+ .set({
256
+ block_id: execution.blockId,
257
+ status: execution.status,
258
+ detail,
259
+ updated_at: now,
260
+ service_id: serviceIdSub,
261
+ rev: sql `${agentRuns.rev} + 1`,
262
+ })
263
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.id, execution.id), this.isExecution, eq(agentRuns.rev, expected)))
264
+ .returning({ rev: agentRuns.rev });
265
+ if (!rows[0])
266
+ return false;
267
+ execution.rev = rows[0].rev;
268
+ return true;
269
+ }
270
+ async deleteByBlock(workspaceId, blockId) {
271
+ await this.db
272
+ .delete(agentRuns)
273
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.block_id, blockId), this.isExecution));
274
+ }
275
+ async listStale(olderThanEpochMs) {
276
+ const rows = await this.db
277
+ .select({ workspaceId: agentRuns.workspace_id, id: agentRuns.id })
278
+ .from(agentRuns)
279
+ .where(and(this.isExecution, eq(agentRuns.status, 'running'), lt(agentRuns.updated_at, olderThanEpochMs)))
280
+ .orderBy(agentRuns.updated_at);
281
+ return rows;
282
+ }
283
+ async markFailed(workspaceId, id, failure) {
284
+ // Guard against clobbering a row that already reached a terminal state: a `stopRun`
285
+ // racing a run that just merged (`done`) or already failed must not overwrite it. This
286
+ // is the authoritative first-write-wins / no-re-fail-a-merged-run check — `failRun`'s
287
+ // in-memory guard reads a snapshot that can be stale by the time this write lands
288
+ // (race-audit 2.3). Mirrors the D1 `AND status NOT IN ('done','failed')`.
289
+ //
290
+ // BUMP `rev` on the terminal write so it participates in the driver's optimistic
291
+ // concurrency: a `casPersist` from an in-flight driver iteration that loaded the run
292
+ // BEFORE this `stopRun`/`failRun` still holds the pre-fail `rev`, so bumping it here makes
293
+ // that stale write miss its `rev = ?` guard → `RunContendedError` → re-drive → the reload
294
+ // sees `failed` and no-ops. Without the bump `markFailed` left `rev` untouched, so a stale
295
+ // `casPersist` writing a non-terminal status (`pollGate` pending, dispatch, …) would MATCH
296
+ // the unchanged `rev` and RESURRECT the stopped run as `running` (race-audit 2.3, the
297
+ // driver-clobbers-terminal direction — the dual of the SQL status guard above). Mirrors the
298
+ // D1 `rev = rev + 1`.
299
+ await this.db
300
+ .update(agentRuns)
301
+ .set({
302
+ status: 'failed',
303
+ error: failure.message,
304
+ failure: JSON.stringify(failure),
305
+ updated_at: this.clock.now(),
306
+ rev: sql `${agentRuns.rev} + 1`,
307
+ })
308
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.id, id), this.isExecution, notInArray(agentRuns.status, ['done', 'failed'])));
309
+ }
310
+ }
311
+ export class DrizzleAgentRunRepository {
312
+ db;
313
+ constructor(db) {
314
+ this.db = db;
315
+ }
316
+ async getRef(workspaceId, id) {
317
+ const [row] = await this.db
318
+ .select({ kind: agentRuns.kind })
319
+ .from(agentRuns)
320
+ .where(and(eq(agentRuns.workspace_id, workspaceId), eq(agentRuns.id, id)));
321
+ return row
322
+ ? {
323
+ workspaceId,
324
+ id,
325
+ kind: decodeEnum(agentRunKindSchema, row.kind, {
326
+ table: 'agent_runs',
327
+ column: 'kind',
328
+ id,
329
+ }),
330
+ }
331
+ : null;
332
+ }
333
+ async listStale(olderThanEpochMs) {
334
+ const rows = await this.db
335
+ .select({
336
+ workspaceId: agentRuns.workspace_id,
337
+ id: agentRuns.id,
338
+ kind: agentRuns.kind,
339
+ updatedAt: agentRuns.updated_at,
340
+ })
341
+ .from(agentRuns)
342
+ .where(and(eq(agentRuns.status, 'running'), lt(agentRuns.updated_at, olderThanEpochMs)))
343
+ .orderBy(agentRuns.updated_at);
344
+ return rows.map((r) => ({
345
+ workspaceId: r.workspaceId,
346
+ id: r.id,
347
+ updatedAt: r.updatedAt,
348
+ kind: decodeEnum(agentRunKindSchema, r.kind, {
349
+ table: 'agent_runs',
350
+ column: 'kind',
351
+ id: r.id,
352
+ }),
353
+ }));
354
+ }
355
+ async listPausedExecutions() {
356
+ const rows = await this.db
357
+ .select({ workspaceId: agentRuns.workspace_id, id: agentRuns.id })
358
+ .from(agentRuns)
359
+ .where(and(eq(agentRuns.kind, 'execution'), eq(agentRuns.status, 'paused')))
360
+ .orderBy(agentRuns.updated_at);
361
+ return rows.map((r) => ({ workspaceId: r.workspaceId, id: r.id, kind: 'execution' }));
362
+ }
363
+ async liveRunIds(ids) {
364
+ if (ids.length === 0)
365
+ return [];
366
+ const live = [];
367
+ // Chunk the IN list (batch, not a point-read per id) so a large set stays one query each.
368
+ for (let i = 0; i < ids.length; i += 500) {
369
+ const rows = await this.db
370
+ .select({ id: agentRuns.id })
371
+ .from(agentRuns)
372
+ .where(and(inArray(agentRuns.status, ['running', 'blocked', 'paused', 'pending']), inArray(agentRuns.id, ids.slice(i, i + 500))));
373
+ for (const r of rows)
374
+ live.push(r.id);
375
+ }
376
+ return live;
377
+ }
378
+ }
379
+ function rowToSchedule(row) {
380
+ const recurrence = {
381
+ intervalHours: row.interval_hours,
382
+ weekdays: safeWeekdays(row.weekdays),
383
+ windowStartHour: row.window_start_hour,
384
+ windowEndHour: row.window_end_hour,
385
+ timezone: row.timezone,
386
+ };
387
+ const issueIntake = parseIssueIntakeColumn(row.issue_intake);
388
+ return {
389
+ id: row.id,
390
+ serviceId: row.service_id,
391
+ blockId: row.block_id,
392
+ frameId: row.frame_id,
393
+ pipelineId: row.pipeline_id,
394
+ template: row.template,
395
+ name: row.name,
396
+ recurrence,
397
+ onDemand: row.on_demand === 1,
398
+ ...(issueIntake ? { issueIntake } : {}),
399
+ enabled: row.enabled === 1,
400
+ lastRunAt: row.last_run_at,
401
+ nextRunAt: row.next_run_at,
402
+ createdAt: row.created_at,
403
+ };
404
+ }
405
+ function safeWeekdays(value) {
406
+ try {
407
+ const parsed = JSON.parse(value);
408
+ return Array.isArray(parsed) ? parsed.filter((n) => typeof n === 'number') : [];
409
+ }
410
+ catch {
411
+ return [];
412
+ }
413
+ }
414
+ function rowToRun(row) {
415
+ return {
416
+ id: row.id,
417
+ scheduleId: row.schedule_id,
418
+ executionId: row.execution_id,
419
+ status: row.status,
420
+ startedAt: row.started_at,
421
+ finishedAt: row.finished_at,
422
+ outcome: row.outcome,
423
+ };
424
+ }
425
+ export class DrizzlePipelineScheduleRepository {
426
+ db;
427
+ constructor(db) {
428
+ this.db = db;
429
+ }
430
+ values(workspaceId, schedule) {
431
+ const r = schedule.recurrence;
432
+ return {
433
+ workspace_id: workspaceId,
434
+ id: schedule.id,
435
+ service_id: schedule.serviceId,
436
+ block_id: schedule.blockId,
437
+ frame_id: schedule.frameId,
438
+ pipeline_id: schedule.pipelineId,
439
+ template: schedule.template,
440
+ name: schedule.name,
441
+ interval_hours: r.intervalHours,
442
+ weekdays: JSON.stringify(r.weekdays),
443
+ window_start_hour: r.windowStartHour,
444
+ window_end_hour: r.windowEndHour,
445
+ timezone: r.timezone,
446
+ enabled: schedule.enabled ? 1 : 0,
447
+ on_demand: schedule.onDemand ? 1 : 0,
448
+ issue_intake: serializeIssueIntakeColumn(schedule.issueIntake),
449
+ last_run_at: schedule.lastRunAt,
450
+ next_run_at: schedule.nextRunAt,
451
+ created_at: schedule.createdAt,
452
+ };
453
+ }
454
+ async get(workspaceId, id) {
455
+ const [row] = await this.db
456
+ .select()
457
+ .from(pipelineSchedules)
458
+ .where(and(eq(pipelineSchedules.workspace_id, workspaceId), eq(pipelineSchedules.id, id)));
459
+ return row ? rowToSchedule(row) : null;
460
+ }
461
+ async getByBlock(workspaceId, blockId) {
462
+ const [row] = await this.db
463
+ .select()
464
+ .from(pipelineSchedules)
465
+ .where(and(eq(pipelineSchedules.workspace_id, workspaceId), eq(pipelineSchedules.block_id, blockId)));
466
+ return row ? rowToSchedule(row) : null;
467
+ }
468
+ async list(workspaceId) {
469
+ const rows = await this.db
470
+ .select()
471
+ .from(pipelineSchedules)
472
+ .where(eq(pipelineSchedules.workspace_id, workspaceId))
473
+ .orderBy(pipelineSchedules.created_at);
474
+ return rows.map(rowToSchedule);
475
+ }
476
+ async listByService(serviceId) {
477
+ const rows = await this.db
478
+ .select()
479
+ .from(pipelineSchedules)
480
+ .where(eq(pipelineSchedules.service_id, serviceId))
481
+ .orderBy(pipelineSchedules.created_at);
482
+ return rows.map(rowToSchedule);
483
+ }
484
+ async listByServices(serviceIds) {
485
+ if (serviceIds.length === 0)
486
+ return [];
487
+ const out = [];
488
+ // Chunk the IN list to stay well under the bind-parameter limit.
489
+ for (let i = 0; i < serviceIds.length; i += 500) {
490
+ const rows = await this.db
491
+ .select()
492
+ .from(pipelineSchedules)
493
+ .where(inArray(pipelineSchedules.service_id, serviceIds.slice(i, i + 500)))
494
+ .orderBy(pipelineSchedules.created_at);
495
+ for (const row of rows)
496
+ out.push(rowToSchedule(row));
497
+ }
498
+ return out;
499
+ }
500
+ async listDue(asOf) {
501
+ const rows = await this.db
502
+ .select()
503
+ .from(pipelineSchedules)
504
+ .where(and(eq(pipelineSchedules.enabled, 1), eq(pipelineSchedules.on_demand, 0), lt(pipelineSchedules.next_run_at, asOf + 1)))
505
+ .orderBy(pipelineSchedules.next_run_at);
506
+ return rows.map((row) => ({ workspaceId: row.workspace_id, schedule: rowToSchedule(row) }));
507
+ }
508
+ async upsert(workspaceId, schedule) {
509
+ const values = this.values(workspaceId, schedule);
510
+ await this.db
511
+ .insert(pipelineSchedules)
512
+ .values(values)
513
+ .onConflictDoUpdate({
514
+ target: [pipelineSchedules.workspace_id, pipelineSchedules.id],
515
+ set: {
516
+ service_id: values.service_id,
517
+ block_id: values.block_id,
518
+ frame_id: values.frame_id,
519
+ pipeline_id: values.pipeline_id,
520
+ template: values.template,
521
+ name: values.name,
522
+ interval_hours: values.interval_hours,
523
+ weekdays: values.weekdays,
524
+ window_start_hour: values.window_start_hour,
525
+ window_end_hour: values.window_end_hour,
526
+ timezone: values.timezone,
527
+ enabled: values.enabled,
528
+ on_demand: values.on_demand,
529
+ issue_intake: values.issue_intake,
530
+ last_run_at: values.last_run_at,
531
+ next_run_at: values.next_run_at,
532
+ },
533
+ });
534
+ }
535
+ async remove(workspaceId, id) {
536
+ await this.db
537
+ .delete(pipelineSchedules)
538
+ .where(and(eq(pipelineSchedules.workspace_id, workspaceId), eq(pipelineSchedules.id, id)));
539
+ }
540
+ async insertRun(workspaceId, run) {
541
+ await this.db.insert(pipelineScheduleRuns).values({
542
+ workspace_id: workspaceId,
543
+ id: run.id,
544
+ schedule_id: run.scheduleId,
545
+ execution_id: run.executionId,
546
+ status: run.status,
547
+ started_at: run.startedAt,
548
+ finished_at: run.finishedAt,
549
+ outcome: run.outcome,
550
+ });
551
+ }
552
+ async updateRun(workspaceId, runId, patch) {
553
+ const set = {};
554
+ if (patch.status !== undefined)
555
+ set.status = patch.status;
556
+ if (patch.finishedAt !== undefined)
557
+ set.finished_at = patch.finishedAt;
558
+ if (patch.outcome !== undefined)
559
+ set.outcome = patch.outcome;
560
+ if (patch.executionId !== undefined)
561
+ set.execution_id = patch.executionId;
562
+ if (Object.keys(set).length === 0)
563
+ return;
564
+ await this.db
565
+ .update(pipelineScheduleRuns)
566
+ .set(set)
567
+ .where(and(eq(pipelineScheduleRuns.workspace_id, workspaceId), eq(pipelineScheduleRuns.id, runId)));
568
+ }
569
+ async listRuns(workspaceId, scheduleId) {
570
+ const rows = await this.db
571
+ .select()
572
+ .from(pipelineScheduleRuns)
573
+ .where(and(eq(pipelineScheduleRuns.workspace_id, workspaceId), eq(pipelineScheduleRuns.schedule_id, scheduleId)))
574
+ .orderBy(desc(pipelineScheduleRuns.started_at));
575
+ return rows.map(rowToRun);
576
+ }
577
+ async pruneRunsBefore(before) {
578
+ const rows = await this.db
579
+ .delete(pipelineScheduleRuns)
580
+ .where(lt(pipelineScheduleRuns.started_at, before))
581
+ .returning({ id: pipelineScheduleRuns.id });
582
+ return rows.length;
583
+ }
584
+ }
585
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../src/repositories/drizzle/execution.ts"],"names":[],"mappings":"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"}