@blockspool/core 0.4.1 → 0.4.2
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.
- package/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +74 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +321 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +177 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +128 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scout/index.d.ts +15 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +383 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/prompt.d.ts +32 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +104 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +68 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +270 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +35 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +164 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +179 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +239 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +120 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +205 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,321 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run_steps.js","sourceRoot":"","sources":["../../src/repos/run_steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/repos/runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/repos/runs.ts"],"names":[],"mappings":"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"}
|