@blockspool/core 0.3.3 → 0.4.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 (93) hide show
  1. package/package.json +1 -1
  2. package/dist/db/adapter.d.ts +0 -191
  3. package/dist/db/adapter.d.ts.map +0 -1
  4. package/dist/db/adapter.js +0 -40
  5. package/dist/db/adapter.js.map +0 -1
  6. package/dist/db/contract.d.ts +0 -47
  7. package/dist/db/contract.d.ts.map +0 -1
  8. package/dist/db/contract.js +0 -258
  9. package/dist/db/contract.js.map +0 -1
  10. package/dist/db/index.d.ts +0 -6
  11. package/dist/db/index.d.ts.map +0 -1
  12. package/dist/db/index.js +0 -7
  13. package/dist/db/index.js.map +0 -1
  14. package/dist/exec/index.d.ts +0 -5
  15. package/dist/exec/index.d.ts.map +0 -1
  16. package/dist/exec/index.js +0 -5
  17. package/dist/exec/index.js.map +0 -1
  18. package/dist/exec/types.d.ts +0 -64
  19. package/dist/exec/types.d.ts.map +0 -1
  20. package/dist/exec/types.js +0 -8
  21. package/dist/exec/types.js.map +0 -1
  22. package/dist/index.d.ts +0 -23
  23. package/dist/index.d.ts.map +0 -1
  24. package/dist/index.js +0 -27
  25. package/dist/index.js.map +0 -1
  26. package/dist/repos/index.d.ts +0 -15
  27. package/dist/repos/index.d.ts.map +0 -1
  28. package/dist/repos/index.js +0 -11
  29. package/dist/repos/index.js.map +0 -1
  30. package/dist/repos/projects.d.ts +0 -41
  31. package/dist/repos/projects.d.ts.map +0 -1
  32. package/dist/repos/projects.js +0 -74
  33. package/dist/repos/projects.js.map +0 -1
  34. package/dist/repos/run_steps.d.ts +0 -152
  35. package/dist/repos/run_steps.d.ts.map +0 -1
  36. package/dist/repos/run_steps.js +0 -321
  37. package/dist/repos/run_steps.js.map +0 -1
  38. package/dist/repos/runs.d.ts +0 -92
  39. package/dist/repos/runs.d.ts.map +0 -1
  40. package/dist/repos/runs.js +0 -177
  41. package/dist/repos/runs.js.map +0 -1
  42. package/dist/repos/tickets.d.ts +0 -71
  43. package/dist/repos/tickets.d.ts.map +0 -1
  44. package/dist/repos/tickets.js +0 -128
  45. package/dist/repos/tickets.js.map +0 -1
  46. package/dist/scout/index.d.ts +0 -15
  47. package/dist/scout/index.d.ts.map +0 -1
  48. package/dist/scout/index.js +0 -383
  49. package/dist/scout/index.js.map +0 -1
  50. package/dist/scout/prompt.d.ts +0 -32
  51. package/dist/scout/prompt.d.ts.map +0 -1
  52. package/dist/scout/prompt.js +0 -104
  53. package/dist/scout/prompt.js.map +0 -1
  54. package/dist/scout/runner.d.ts +0 -68
  55. package/dist/scout/runner.d.ts.map +0 -1
  56. package/dist/scout/runner.js +0 -270
  57. package/dist/scout/runner.js.map +0 -1
  58. package/dist/scout/scanner.d.ts +0 -35
  59. package/dist/scout/scanner.d.ts.map +0 -1
  60. package/dist/scout/scanner.js +0 -164
  61. package/dist/scout/scanner.js.map +0 -1
  62. package/dist/scout/types.d.ts +0 -179
  63. package/dist/scout/types.d.ts.map +0 -1
  64. package/dist/scout/types.js +0 -44
  65. package/dist/scout/types.js.map +0 -1
  66. package/dist/services/index.d.ts +0 -10
  67. package/dist/services/index.d.ts.map +0 -1
  68. package/dist/services/index.js +0 -9
  69. package/dist/services/index.js.map +0 -1
  70. package/dist/services/qa.d.ts +0 -76
  71. package/dist/services/qa.d.ts.map +0 -1
  72. package/dist/services/qa.js +0 -239
  73. package/dist/services/qa.js.map +0 -1
  74. package/dist/services/scout.d.ts +0 -120
  75. package/dist/services/scout.d.ts.map +0 -1
  76. package/dist/services/scout.js +0 -205
  77. package/dist/services/scout.js.map +0 -1
  78. package/dist/utils/id.d.ts +0 -12
  79. package/dist/utils/id.d.ts.map +0 -1
  80. package/dist/utils/id.js +0 -24
  81. package/dist/utils/id.js.map +0 -1
  82. package/dist/utils/id.test.d.ts +0 -5
  83. package/dist/utils/id.test.d.ts.map +0 -1
  84. package/dist/utils/id.test.js +0 -173
  85. package/dist/utils/id.test.js.map +0 -1
  86. package/dist/utils/index.d.ts +0 -6
  87. package/dist/utils/index.d.ts.map +0 -1
  88. package/dist/utils/index.js +0 -6
  89. package/dist/utils/index.js.map +0 -1
  90. package/dist/utils/json.d.ts +0 -9
  91. package/dist/utils/json.d.ts.map +0 -1
  92. package/dist/utils/json.js +0 -19
  93. package/dist/utils/json.js.map +0 -1
@@ -1,321 +0,0 @@
1
- /**
2
- * Run Steps repository - Database operations for run steps
3
- *
4
- * Steps are individual commands/actions within a run (e.g., QA commands).
5
- * Supports retry attempts with full history preserved.
6
- */
7
- import { nanoid } from '../utils/id.js';
8
- function rowToStep(row) {
9
- return {
10
- id: row.id,
11
- runId: row.run_id,
12
- attempt: row.attempt,
13
- ordinal: row.ordinal,
14
- name: row.name,
15
- kind: row.kind,
16
- status: row.status,
17
- cmd: row.cmd,
18
- cwd: row.cwd,
19
- timeoutMs: row.timeout_ms,
20
- exitCode: row.exit_code,
21
- signal: row.signal,
22
- startedAtMs: row.started_at_ms,
23
- endedAtMs: row.ended_at_ms,
24
- durationMs: row.duration_ms,
25
- stdoutPath: row.stdout_path,
26
- stderrPath: row.stderr_path,
27
- stdoutBytes: row.stdout_bytes,
28
- stderrBytes: row.stderr_bytes,
29
- stdoutTruncated: row.stdout_truncated === 1,
30
- stderrTruncated: row.stderr_truncated === 1,
31
- stdoutTail: row.stdout_tail,
32
- stderrTail: row.stderr_tail,
33
- errorMessage: row.error_message,
34
- metadata: row.meta_json ? JSON.parse(row.meta_json) : {},
35
- createdAtMs: row.created_at_ms,
36
- updatedAtMs: row.updated_at_ms,
37
- };
38
- }
39
- /**
40
- * Get step by ID
41
- */
42
- export async function getById(db, id) {
43
- const result = await db.query('SELECT * FROM run_steps WHERE id = $1', [id]);
44
- return result.rows[0] ? rowToStep(result.rows[0]) : null;
45
- }
46
- /**
47
- * Create a new step
48
- */
49
- export async function create(db, opts) {
50
- const id = `stp_${nanoid(12)}`;
51
- const now = Date.now();
52
- await db.query(`INSERT INTO run_steps (
53
- id, run_id, attempt, ordinal, name, kind,
54
- cmd, cwd, timeout_ms, meta_json,
55
- created_at_ms, updated_at_ms
56
- ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, [
57
- id,
58
- opts.runId,
59
- opts.attempt ?? 1,
60
- opts.ordinal,
61
- opts.name,
62
- opts.kind ?? 'command',
63
- opts.cmd ?? null,
64
- opts.cwd ?? null,
65
- opts.timeoutMs ?? null,
66
- JSON.stringify(opts.metadata ?? {}),
67
- now,
68
- now,
69
- ]);
70
- const step = await getById(db, id);
71
- if (!step) {
72
- throw new Error('Failed to create run step');
73
- }
74
- return step;
75
- }
76
- /**
77
- * Create multiple steps at once (for initializing a QA run)
78
- */
79
- export async function createMany(db, runId, steps, attempt = 1) {
80
- const created = [];
81
- for (let i = 0; i < steps.length; i++) {
82
- const step = await create(db, {
83
- runId,
84
- attempt,
85
- ordinal: i,
86
- name: steps[i].name,
87
- cmd: steps[i].cmd,
88
- cwd: steps[i].cwd,
89
- timeoutMs: steps[i].timeoutMs,
90
- });
91
- created.push(step);
92
- }
93
- return created;
94
- }
95
- /**
96
- * Mark step as started
97
- */
98
- export async function markStarted(db, id) {
99
- const now = Date.now();
100
- await db.query(`UPDATE run_steps SET
101
- status = 'running',
102
- started_at_ms = $1,
103
- updated_at_ms = $2
104
- WHERE id = $3`, [now, now, id]);
105
- return getById(db, id);
106
- }
107
- /**
108
- * Mark step as successful
109
- */
110
- export async function markSuccess(db, id, opts) {
111
- const existing = await getById(db, id);
112
- if (!existing)
113
- return null;
114
- const now = Date.now();
115
- const durationMs = existing.startedAtMs ? now - existing.startedAtMs : null;
116
- const merged = { ...existing.metadata, ...opts?.metadata };
117
- await db.query(`UPDATE run_steps SET
118
- status = 'success',
119
- exit_code = $1,
120
- ended_at_ms = $2,
121
- duration_ms = $3,
122
- stdout_path = COALESCE($4, stdout_path),
123
- stderr_path = COALESCE($5, stderr_path),
124
- stdout_bytes = COALESCE($6, stdout_bytes),
125
- stderr_bytes = COALESCE($7, stderr_bytes),
126
- stdout_truncated = COALESCE($8, stdout_truncated),
127
- stderr_truncated = COALESCE($9, stderr_truncated),
128
- stdout_tail = COALESCE($10, stdout_tail),
129
- stderr_tail = COALESCE($11, stderr_tail),
130
- meta_json = $12,
131
- updated_at_ms = $13
132
- WHERE id = $14`, [
133
- opts?.exitCode ?? 0,
134
- now,
135
- durationMs,
136
- opts?.stdoutPath ?? null,
137
- opts?.stderrPath ?? null,
138
- opts?.stdoutBytes ?? null,
139
- opts?.stderrBytes ?? null,
140
- opts?.stdoutTruncated ? 1 : null,
141
- opts?.stderrTruncated ? 1 : null,
142
- opts?.stdoutTail ?? null,
143
- opts?.stderrTail ?? null,
144
- JSON.stringify(merged),
145
- now,
146
- id,
147
- ]);
148
- return getById(db, id);
149
- }
150
- /**
151
- * Mark step as failed
152
- */
153
- export async function markFailed(db, id, opts) {
154
- const existing = await getById(db, id);
155
- if (!existing)
156
- return null;
157
- const now = Date.now();
158
- const durationMs = existing.startedAtMs ? now - existing.startedAtMs : null;
159
- const merged = { ...existing.metadata, ...opts.metadata };
160
- await db.query(`UPDATE run_steps SET
161
- status = 'failed',
162
- exit_code = $1,
163
- signal = $2,
164
- error_message = $3,
165
- ended_at_ms = $4,
166
- duration_ms = $5,
167
- stdout_path = COALESCE($6, stdout_path),
168
- stderr_path = COALESCE($7, stderr_path),
169
- stdout_bytes = COALESCE($8, stdout_bytes),
170
- stderr_bytes = COALESCE($9, stderr_bytes),
171
- stdout_truncated = COALESCE($10, stdout_truncated),
172
- stderr_truncated = COALESCE($11, stderr_truncated),
173
- stdout_tail = COALESCE($12, stdout_tail),
174
- stderr_tail = COALESCE($13, stderr_tail),
175
- meta_json = $14,
176
- updated_at_ms = $15
177
- WHERE id = $16`, [
178
- opts.exitCode ?? null,
179
- opts.signal ?? null,
180
- opts.errorMessage ?? null,
181
- now,
182
- durationMs,
183
- opts.stdoutPath ?? null,
184
- opts.stderrPath ?? null,
185
- opts.stdoutBytes ?? null,
186
- opts.stderrBytes ?? null,
187
- opts.stdoutTruncated ? 1 : null,
188
- opts.stderrTruncated ? 1 : null,
189
- opts.stdoutTail ?? null,
190
- opts.stderrTail ?? null,
191
- JSON.stringify(merged),
192
- now,
193
- id,
194
- ]);
195
- return getById(db, id);
196
- }
197
- /**
198
- * Mark step as skipped
199
- */
200
- export async function markSkipped(db, id, reason) {
201
- const now = Date.now();
202
- await db.query(`UPDATE run_steps SET
203
- status = 'skipped',
204
- error_message = $1,
205
- ended_at_ms = $2,
206
- updated_at_ms = $3
207
- WHERE id = $4`, [reason ?? null, now, now, id]);
208
- return getById(db, id);
209
- }
210
- /**
211
- * Mark step as canceled
212
- */
213
- export async function markCanceled(db, id, reason) {
214
- const now = Date.now();
215
- await db.query(`UPDATE run_steps SET
216
- status = 'canceled',
217
- error_message = $1,
218
- ended_at_ms = $2,
219
- updated_at_ms = $3
220
- WHERE id = $4`, [reason ?? null, now, now, id]);
221
- return getById(db, id);
222
- }
223
- /**
224
- * List steps for a run
225
- */
226
- export async function listByRun(db, runId, opts) {
227
- let sql = 'SELECT * FROM run_steps WHERE run_id = $1';
228
- const params = [runId];
229
- let paramIndex = 2;
230
- if (opts?.attempt !== undefined) {
231
- sql += ` AND attempt = $${paramIndex++}`;
232
- params.push(opts.attempt);
233
- }
234
- if (opts?.status) {
235
- const statuses = Array.isArray(opts.status) ? opts.status : [opts.status];
236
- const placeholders = statuses.map(() => `$${paramIndex++}`).join(', ');
237
- sql += ` AND status IN (${placeholders})`;
238
- params.push(...statuses);
239
- }
240
- sql += ' ORDER BY attempt ASC, ordinal ASC';
241
- const result = await db.query(sql, params);
242
- return result.rows.map(rowToStep);
243
- }
244
- /**
245
- * Get the latest attempt number for a run
246
- */
247
- export async function getLatestAttempt(db, runId) {
248
- const result = await db.query('SELECT COALESCE(MAX(attempt), 0) AS attempt FROM run_steps WHERE run_id = $1', [runId]);
249
- return result.rows[0]?.attempt ?? 0;
250
- }
251
- export async function getStepCounts(db, runId, attempt) {
252
- const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
253
- const result = await db.query(`SELECT
254
- SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS passed,
255
- SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed,
256
- SUM(CASE WHEN status IN ('queued', 'running') THEN 1 ELSE 0 END) AS active,
257
- SUM(CASE WHEN status IN ('skipped', 'canceled') THEN 1 ELSE 0 END) AS skipped,
258
- COUNT(*) AS total
259
- FROM run_steps
260
- WHERE run_id = $1 AND attempt = $2`, [runId, actualAttempt]);
261
- const row = result.rows[0];
262
- return {
263
- passed: parseInt(row?.passed ?? '0', 10),
264
- failed: parseInt(row?.failed ?? '0', 10),
265
- active: parseInt(row?.active ?? '0', 10),
266
- skipped: parseInt(row?.skipped ?? '0', 10),
267
- total: parseInt(row?.total ?? '0', 10),
268
- };
269
- }
270
- /**
271
- * Get the first failed step for a run attempt
272
- */
273
- export async function getFirstFailedStep(db, runId, attempt) {
274
- const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
275
- const result = await db.query(`SELECT * FROM run_steps
276
- WHERE run_id = $1 AND attempt = $2 AND status = 'failed'
277
- ORDER BY ordinal ASC
278
- LIMIT 1`, [runId, actualAttempt]);
279
- return result.rows[0] ? rowToStep(result.rows[0]) : null;
280
- }
281
- /**
282
- * Get the currently running step for a run
283
- */
284
- export async function getRunningStep(db, runId, attempt) {
285
- const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
286
- const result = await db.query(`SELECT * FROM run_steps
287
- WHERE run_id = $1 AND attempt = $2 AND status = 'running'
288
- ORDER BY ordinal ASC
289
- LIMIT 1`, [runId, actualAttempt]);
290
- return result.rows[0] ? rowToStep(result.rows[0]) : null;
291
- }
292
- export async function getSummary(db, runId) {
293
- const latestAttempt = await getLatestAttempt(db, runId);
294
- if (latestAttempt === 0) {
295
- return {
296
- runId,
297
- latestAttempt: 0,
298
- counts: { passed: 0, failed: 0, active: 0, skipped: 0, total: 0 },
299
- firstFailedStep: null,
300
- runningStep: null,
301
- totalDurationMs: 0,
302
- };
303
- }
304
- const [counts, firstFailed, running, durationResult] = await Promise.all([
305
- getStepCounts(db, runId, latestAttempt),
306
- getFirstFailedStep(db, runId, latestAttempt),
307
- getRunningStep(db, runId, latestAttempt),
308
- db.query(`SELECT COALESCE(SUM(duration_ms), 0) AS total_duration
309
- FROM run_steps
310
- WHERE run_id = $1 AND attempt = $2`, [runId, latestAttempt]),
311
- ]);
312
- return {
313
- runId,
314
- latestAttempt,
315
- counts,
316
- firstFailedStep: firstFailed?.name ?? null,
317
- runningStep: running?.name ?? null,
318
- totalDurationMs: parseInt(durationResult.rows[0]?.total_duration ?? '0', 10),
319
- };
320
- }
321
- //# sourceMappingURL=run_steps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run_steps.js","sourceRoot":"","sources":["../../src/repos/run_steps.ts"],"names":[],"mappings":"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"}
@@ -1,92 +0,0 @@
1
- /**
2
- * Run repository - Database operations for runs
3
- */
4
- import type { DatabaseAdapter } from '../db/adapter.js';
5
- export type RunStatus = 'pending' | 'running' | 'success' | 'failure' | 'aborted';
6
- export type RunType = 'scout' | 'worker' | 'qa' | 'merge';
7
- export interface Run {
8
- id: string;
9
- ticketId: string | null;
10
- projectId: string;
11
- type: RunType;
12
- status: RunStatus;
13
- iteration: number;
14
- maxIterations: number;
15
- startedAt: Date | null;
16
- completedAt: Date | null;
17
- error: string | null;
18
- metadata: Record<string, unknown>;
19
- createdAt: Date;
20
- }
21
- /**
22
- * Get run by ID
23
- */
24
- export declare function getById(db: DatabaseAdapter, id: string): Promise<Run | null>;
25
- /**
26
- * Create a new run
27
- */
28
- export declare function create(db: DatabaseAdapter, opts: {
29
- projectId: string;
30
- type: RunType;
31
- ticketId?: string;
32
- maxIterations?: number;
33
- metadata?: Record<string, unknown>;
34
- }): Promise<Run>;
35
- /**
36
- * Mark run as successful
37
- */
38
- export declare function markSuccess(db: DatabaseAdapter, id: string, metadata?: Record<string, unknown>): Promise<Run | null>;
39
- /**
40
- * Mark run as failed
41
- */
42
- export declare function markFailure(db: DatabaseAdapter, id: string, error: Error | string, metadata?: Record<string, unknown>): Promise<Run | null>;
43
- /**
44
- * List runs for a project
45
- */
46
- export declare function listByProject(db: DatabaseAdapter, projectId: string, opts?: {
47
- type?: RunType;
48
- status?: RunStatus | RunStatus[];
49
- limit?: number;
50
- }): Promise<Run[]>;
51
- /**
52
- * Count active runs
53
- */
54
- export declare function countActive(db: DatabaseAdapter, projectId?: string): Promise<number>;
55
- /**
56
- * Get the latest run of a specific type for a project
57
- */
58
- export declare function getLatestByType(db: DatabaseAdapter, projectId: string, type: RunType): Promise<Run | null>;
59
- /**
60
- * Get run summary for status display
61
- */
62
- export interface RunSummary {
63
- lastScout: {
64
- id: string;
65
- status: RunStatus;
66
- completedAt: Date | null;
67
- proposalCount: number;
68
- ticketCount: number;
69
- scannedFiles: number;
70
- durationMs: number;
71
- } | null;
72
- lastQa: {
73
- id: string;
74
- status: RunStatus;
75
- completedAt: Date | null;
76
- stepsPassed: number;
77
- stepsFailed: number;
78
- durationMs: number;
79
- } | null;
80
- lastExecute: {
81
- id: string;
82
- ticketId: string | null;
83
- status: RunStatus;
84
- completedAt: Date | null;
85
- branchName: string | null;
86
- prUrl: string | null;
87
- durationMs: number;
88
- } | null;
89
- activeRuns: number;
90
- }
91
- export declare function getSummary(db: DatabaseAdapter, projectId: string): Promise<RunSummary>;
92
- //# sourceMappingURL=runs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/repos/runs.ts"],"names":[],"mappings":"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"}
@@ -1,177 +0,0 @@
1
- /**
2
- * Run repository - Database operations for runs
3
- */
4
- import { nanoid } from '../utils/id.js';
5
- function rowToRun(row) {
6
- return {
7
- id: row.id,
8
- ticketId: row.ticket_id,
9
- projectId: row.project_id,
10
- type: row.type,
11
- status: row.status,
12
- iteration: row.iteration,
13
- maxIterations: row.max_iterations,
14
- startedAt: row.started_at ? new Date(row.started_at) : null,
15
- completedAt: row.completed_at ? new Date(row.completed_at) : null,
16
- error: row.error,
17
- metadata: row.metadata ? JSON.parse(row.metadata) : {},
18
- createdAt: new Date(row.created_at),
19
- };
20
- }
21
- /**
22
- * Get run by ID
23
- */
24
- export async function getById(db, id) {
25
- const result = await db.query('SELECT * FROM runs WHERE id = $1', [id]);
26
- return result.rows[0] ? rowToRun(result.rows[0]) : null;
27
- }
28
- /**
29
- * Create a new run
30
- */
31
- export async function create(db, opts) {
32
- const id = `run_${nanoid(12)}`;
33
- await db.query(`INSERT INTO runs (
34
- id, ticket_id, project_id, type, status,
35
- max_iterations, metadata, started_at
36
- ) VALUES ($1, $2, $3, $4, $5, $6, $7, datetime('now'))`, [
37
- id,
38
- opts.ticketId ?? null,
39
- opts.projectId,
40
- opts.type,
41
- 'running',
42
- opts.maxIterations ?? 10,
43
- JSON.stringify(opts.metadata ?? {}),
44
- ]);
45
- const run = await getById(db, id);
46
- if (!run) {
47
- throw new Error('Failed to create run');
48
- }
49
- return run;
50
- }
51
- /**
52
- * Mark run as successful
53
- */
54
- export async function markSuccess(db, id, metadata) {
55
- const existing = await getById(db, id);
56
- if (!existing)
57
- return null;
58
- const merged = { ...existing.metadata, ...metadata };
59
- await db.query(`UPDATE runs SET
60
- status = 'success',
61
- completed_at = datetime('now'),
62
- metadata = $1
63
- WHERE id = $2`, [JSON.stringify(merged), id]);
64
- return getById(db, id);
65
- }
66
- /**
67
- * Mark run as failed
68
- */
69
- export async function markFailure(db, id, error, metadata) {
70
- const existing = await getById(db, id);
71
- if (!existing)
72
- return null;
73
- const merged = { ...existing.metadata, ...metadata };
74
- const errorMsg = error instanceof Error ? error.message : error;
75
- await db.query(`UPDATE runs SET
76
- status = 'failure',
77
- completed_at = datetime('now'),
78
- error = $1,
79
- metadata = $2
80
- WHERE id = $3`, [errorMsg, JSON.stringify(merged), id]);
81
- return getById(db, id);
82
- }
83
- /**
84
- * List runs for a project
85
- */
86
- export async function listByProject(db, projectId, opts) {
87
- let sql = 'SELECT * FROM runs WHERE project_id = $1';
88
- const params = [projectId];
89
- let paramIndex = 2;
90
- if (opts?.type) {
91
- sql += ` AND type = $${paramIndex++}`;
92
- params.push(opts.type);
93
- }
94
- if (opts?.status) {
95
- const statuses = Array.isArray(opts.status) ? opts.status : [opts.status];
96
- const placeholders = statuses.map(() => `$${paramIndex++}`).join(', ');
97
- sql += ` AND status IN (${placeholders})`;
98
- params.push(...statuses);
99
- }
100
- sql += ' ORDER BY created_at DESC';
101
- if (opts?.limit !== undefined) {
102
- sql += ` LIMIT $${paramIndex}`;
103
- params.push(opts.limit);
104
- }
105
- const result = await db.query(sql, params);
106
- return result.rows.map(rowToRun);
107
- }
108
- /**
109
- * Count active runs
110
- */
111
- export async function countActive(db, projectId) {
112
- const sql = projectId
113
- ? `SELECT COUNT(*) as count FROM runs WHERE status IN ('pending', 'running') AND project_id = $1`
114
- : `SELECT COUNT(*) as count FROM runs WHERE status IN ('pending', 'running')`;
115
- const result = await db.query(sql, projectId ? [projectId] : []);
116
- return parseInt(result.rows[0]?.count ?? '0', 10);
117
- }
118
- /**
119
- * Get the latest run of a specific type for a project
120
- */
121
- export async function getLatestByType(db, projectId, type) {
122
- const result = await db.query(`SELECT * FROM runs
123
- WHERE project_id = $1 AND type = $2
124
- ORDER BY created_at DESC
125
- LIMIT 1`, [projectId, type]);
126
- return result.rows[0] ? rowToRun(result.rows[0]) : null;
127
- }
128
- export async function getSummary(db, projectId) {
129
- const [lastScoutRun, lastQaRun, lastExecuteRun, activeCount] = await Promise.all([
130
- getLatestByType(db, projectId, 'scout'),
131
- getLatestByType(db, projectId, 'qa'),
132
- getLatestByType(db, projectId, 'worker'),
133
- countActive(db, projectId),
134
- ]);
135
- // For QA runs, get step counts from run_steps table
136
- let qaStepsPassed = 0;
137
- let qaStepsFailed = 0;
138
- if (lastQaRun) {
139
- const stepCounts = await db.query(`SELECT
140
- SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS passed,
141
- SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed
142
- FROM run_steps
143
- WHERE run_id = $1`, [lastQaRun.id]);
144
- qaStepsPassed = parseInt(stepCounts.rows[0]?.passed ?? '0', 10);
145
- qaStepsFailed = parseInt(stepCounts.rows[0]?.failed ?? '0', 10);
146
- }
147
- return {
148
- lastScout: lastScoutRun ? {
149
- id: lastScoutRun.id,
150
- status: lastScoutRun.status,
151
- completedAt: lastScoutRun.completedAt,
152
- proposalCount: lastScoutRun.metadata.proposalCount ?? 0,
153
- ticketCount: lastScoutRun.metadata.ticketCount ?? 0,
154
- scannedFiles: lastScoutRun.metadata.scannedFiles ?? 0,
155
- durationMs: lastScoutRun.metadata.durationMs ?? 0,
156
- } : null,
157
- lastQa: lastQaRun ? {
158
- id: lastQaRun.id,
159
- status: lastQaRun.status,
160
- completedAt: lastQaRun.completedAt,
161
- stepsPassed: qaStepsPassed,
162
- stepsFailed: qaStepsFailed,
163
- durationMs: lastQaRun.metadata.durationMs ?? 0,
164
- } : null,
165
- lastExecute: lastExecuteRun ? {
166
- id: lastExecuteRun.id,
167
- ticketId: lastExecuteRun.ticketId,
168
- status: lastExecuteRun.status,
169
- completedAt: lastExecuteRun.completedAt,
170
- branchName: lastExecuteRun.metadata.branchName ?? null,
171
- prUrl: lastExecuteRun.metadata.prUrl ?? null,
172
- durationMs: lastExecuteRun.metadata.durationMs ?? 0,
173
- } : null,
174
- activeRuns: activeCount,
175
- };
176
- }
177
- //# sourceMappingURL=runs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/repos/runs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAmCxC,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI,EAAE,GAAG,CAAC,IAAe;QACzB,MAAM,EAAE,GAAG,CAAC,MAAmB;QAC/B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3D,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;QACjE,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QACtD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAmB,EACnB,EAAU;IAEV,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,kCAAkC,EAClC,CAAC,EAAE,CAAC,CACL,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,EAAmB,EACnB,IAMC;IAED,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAE/B,MAAM,EAAE,CAAC,KAAK,CACZ;;;2DAGuD,EACvD;QACE,EAAE;QACF,IAAI,CAAC,QAAQ,IAAI,IAAI;QACrB,IAAI,CAAC,SAAS;QACd,IAAI,CAAC,IAAI;QACT,SAAS;QACT,IAAI,CAAC,aAAa,IAAI,EAAE;QACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;KACpC,CACF,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAmB,EACnB,EAAU,EACV,QAAkC;IAElC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAErD,MAAM,EAAE,CAAC,KAAK,CACZ;;;;mBAIe,EACf,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAC7B,CAAC;IAEF,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAmB,EACnB,EAAU,EACV,KAAqB,EACrB,QAAkC;IAElC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhE,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;mBAKe,EACf,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CACvC,CAAC;IAEF,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAmB,EACnB,SAAiB,EACjB,IAIC;IAED,IAAI,GAAG,GAAG,0CAA0C,CAAC;IACrD,MAAM,MAAM,GAAc,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QACf,GAAG,IAAI,gBAAgB,UAAU,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,GAAG,IAAI,mBAAmB,YAAY,GAAG,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,IAAI,2BAA2B,CAAC;IAEnC,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,GAAG,IAAI,WAAW,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAS,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAmB,EACnB,SAAkB;IAElB,MAAM,GAAG,GAAG,SAAS;QACnB,CAAC,CAAC,+FAA+F;QACjG,CAAC,CAAC,2EAA2E,CAAC;IAEhF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,GAAG,EACH,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAmB,EACnB,SAAiB,EACjB,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;;;aAGS,EACT,CAAC,SAAS,EAAE,IAAI,CAAC,CAClB,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAmCD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAmB,EACnB,SAAiB;IAEjB,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/E,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC;QACvC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC;QACpC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACxC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC;KAC3B,CAAC,CAAC;IAEH,oDAAoD;IACpD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,KAAK,CAC/B;;;;yBAImB,EACnB,CAAC,SAAS,CAAC,EAAE,CAAC,CACf,CAAC;QACF,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAChE,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YACxB,EAAE,EAAE,YAAY,CAAC,EAAE;YACnB,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,aAAa,EAAG,YAAY,CAAC,QAAQ,CAAC,aAAwB,IAAI,CAAC;YACnE,WAAW,EAAG,YAAY,CAAC,QAAQ,CAAC,WAAsB,IAAI,CAAC;YAC/D,YAAY,EAAG,YAAY,CAAC,QAAQ,CAAC,YAAuB,IAAI,CAAC;YACjE,UAAU,EAAG,YAAY,CAAC,QAAQ,CAAC,UAAqB,IAAI,CAAC;SAC9D,CAAC,CAAC,CAAC,IAAI;QACR,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YAClB,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;YAC1B,UAAU,EAAG,SAAS,CAAC,QAAQ,CAAC,UAAqB,IAAI,CAAC;SAC3D,CAAC,CAAC,CAAC,IAAI;QACR,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;YAC5B,EAAE,EAAE,cAAc,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,UAAU,EAAG,cAAc,CAAC,QAAQ,CAAC,UAAqB,IAAI,IAAI;YAClE,KAAK,EAAG,cAAc,CAAC,QAAQ,CAAC,KAAgB,IAAI,IAAI;YACxD,UAAU,EAAG,cAAc,CAAC,QAAQ,CAAC,UAAqB,IAAI,CAAC;SAChE,CAAC,CAAC,CAAC,IAAI;QACR,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC"}