@promptwheel/core 0.6.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 (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. package/package.json +126 -0
@@ -0,0 +1,152 @@
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 type { DatabaseAdapter } from '../db/adapter.js';
8
+ export type StepStatus = 'queued' | 'running' | 'success' | 'failed' | 'skipped' | 'canceled';
9
+ export type StepKind = 'command' | 'llm_fix' | 'git' | 'internal';
10
+ export interface RunStep {
11
+ id: string;
12
+ runId: string;
13
+ attempt: number;
14
+ ordinal: number;
15
+ name: string;
16
+ kind: StepKind;
17
+ status: StepStatus;
18
+ cmd: string | null;
19
+ cwd: string | null;
20
+ timeoutMs: number | null;
21
+ exitCode: number | null;
22
+ signal: string | null;
23
+ startedAtMs: number | null;
24
+ endedAtMs: number | null;
25
+ durationMs: number | null;
26
+ stdoutPath: string | null;
27
+ stderrPath: string | null;
28
+ stdoutBytes: number;
29
+ stderrBytes: number;
30
+ stdoutTruncated: boolean;
31
+ stderrTruncated: boolean;
32
+ stdoutTail: string | null;
33
+ stderrTail: string | null;
34
+ errorMessage: string | null;
35
+ metadata: Record<string, unknown>;
36
+ createdAtMs: number;
37
+ updatedAtMs: number;
38
+ }
39
+ /**
40
+ * Get step by ID
41
+ */
42
+ export declare function getById(db: DatabaseAdapter, id: string): Promise<RunStep | null>;
43
+ /**
44
+ * Create a new step
45
+ */
46
+ export declare function create(db: DatabaseAdapter, opts: {
47
+ runId: string;
48
+ attempt?: number;
49
+ ordinal: number;
50
+ name: string;
51
+ kind?: StepKind;
52
+ cmd?: string;
53
+ cwd?: string;
54
+ timeoutMs?: number;
55
+ metadata?: Record<string, unknown>;
56
+ }): Promise<RunStep>;
57
+ /**
58
+ * Create multiple steps at once (for initializing a QA run)
59
+ */
60
+ export declare function createMany(db: DatabaseAdapter, runId: string, steps: Array<{
61
+ name: string;
62
+ cmd: string;
63
+ cwd?: string;
64
+ timeoutMs?: number;
65
+ }>, attempt?: number): Promise<RunStep[]>;
66
+ /**
67
+ * Mark step as started
68
+ */
69
+ export declare function markStarted(db: DatabaseAdapter, id: string): Promise<RunStep | null>;
70
+ /**
71
+ * Mark step as successful
72
+ */
73
+ export declare function markSuccess(db: DatabaseAdapter, id: string, opts?: {
74
+ exitCode?: number;
75
+ stdoutPath?: string;
76
+ stderrPath?: string;
77
+ stdoutBytes?: number;
78
+ stderrBytes?: number;
79
+ stdoutTruncated?: boolean;
80
+ stderrTruncated?: boolean;
81
+ stdoutTail?: string;
82
+ stderrTail?: string;
83
+ metadata?: Record<string, unknown>;
84
+ }): Promise<RunStep | null>;
85
+ /**
86
+ * Mark step as failed
87
+ */
88
+ export declare function markFailed(db: DatabaseAdapter, id: string, opts: {
89
+ exitCode?: number;
90
+ signal?: string;
91
+ errorMessage?: string;
92
+ stdoutPath?: string;
93
+ stderrPath?: string;
94
+ stdoutBytes?: number;
95
+ stderrBytes?: number;
96
+ stdoutTruncated?: boolean;
97
+ stderrTruncated?: boolean;
98
+ stdoutTail?: string;
99
+ stderrTail?: string;
100
+ metadata?: Record<string, unknown>;
101
+ }): Promise<RunStep | null>;
102
+ /**
103
+ * Mark step as skipped
104
+ */
105
+ export declare function markSkipped(db: DatabaseAdapter, id: string, reason?: string): Promise<RunStep | null>;
106
+ /**
107
+ * Mark step as canceled
108
+ */
109
+ export declare function markCanceled(db: DatabaseAdapter, id: string, reason?: string): Promise<RunStep | null>;
110
+ /**
111
+ * List steps for a run
112
+ */
113
+ export declare function listByRun(db: DatabaseAdapter, runId: string, opts?: {
114
+ attempt?: number;
115
+ status?: StepStatus | StepStatus[];
116
+ }): Promise<RunStep[]>;
117
+ /**
118
+ * Get the latest attempt number for a run
119
+ */
120
+ export declare function getLatestAttempt(db: DatabaseAdapter, runId: string): Promise<number>;
121
+ /**
122
+ * Get step counts for a run attempt
123
+ */
124
+ export interface StepCounts {
125
+ passed: number;
126
+ failed: number;
127
+ active: number;
128
+ skipped: number;
129
+ total: number;
130
+ }
131
+ export declare function getStepCounts(db: DatabaseAdapter, runId: string, attempt?: number): Promise<StepCounts>;
132
+ /**
133
+ * Get the first failed step for a run attempt
134
+ */
135
+ export declare function getFirstFailedStep(db: DatabaseAdapter, runId: string, attempt?: number): Promise<RunStep | null>;
136
+ /**
137
+ * Get the currently running step for a run
138
+ */
139
+ export declare function getRunningStep(db: DatabaseAdapter, runId: string, attempt?: number): Promise<RunStep | null>;
140
+ /**
141
+ * Get run step summary for display
142
+ */
143
+ export interface StepSummary {
144
+ runId: string;
145
+ latestAttempt: number;
146
+ counts: StepCounts;
147
+ firstFailedStep: string | null;
148
+ runningStep: string | null;
149
+ totalDurationMs: number;
150
+ }
151
+ export declare function getSummary(db: DatabaseAdapter, runId: string): Promise<StepSummary>;
152
+ //# sourceMappingURL=run_steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_steps.d.ts","sourceRoot":"","sources":["../../src/repos/run_steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,328 @@
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
+ return db.withTransaction(async (tx) => {
81
+ const created = [];
82
+ for (let i = 0; i < steps.length; i++) {
83
+ const id = `stp_${nanoid(12)}`;
84
+ const now = Date.now();
85
+ await tx.query(`INSERT INTO run_steps (
86
+ id, run_id, attempt, ordinal, name, kind,
87
+ cmd, cwd, timeout_ms, meta_json,
88
+ created_at_ms, updated_at_ms
89
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, [
90
+ id, runId, attempt, i, steps[i].name, 'command',
91
+ steps[i].cmd, steps[i].cwd ?? null, steps[i].timeoutMs ?? null,
92
+ JSON.stringify({}), now, now,
93
+ ]);
94
+ const result = await tx.query('SELECT * FROM run_steps WHERE id = $1', [id]);
95
+ if (!result.rows[0])
96
+ throw new Error('Failed to create run step');
97
+ created.push(rowToStep(result.rows[0]));
98
+ }
99
+ return created;
100
+ });
101
+ }
102
+ /**
103
+ * Mark step as started
104
+ */
105
+ export async function markStarted(db, id) {
106
+ const now = Date.now();
107
+ await db.query(`UPDATE run_steps SET
108
+ status = 'running',
109
+ started_at_ms = $1,
110
+ updated_at_ms = $2
111
+ WHERE id = $3`, [now, now, id]);
112
+ return getById(db, id);
113
+ }
114
+ /**
115
+ * Mark step as successful
116
+ */
117
+ export async function markSuccess(db, id, opts) {
118
+ const existing = await getById(db, id);
119
+ if (!existing)
120
+ return null;
121
+ const now = Date.now();
122
+ const durationMs = existing.startedAtMs ? now - existing.startedAtMs : null;
123
+ const merged = { ...existing.metadata, ...opts?.metadata };
124
+ await db.query(`UPDATE run_steps SET
125
+ status = 'success',
126
+ exit_code = $1,
127
+ ended_at_ms = $2,
128
+ duration_ms = $3,
129
+ stdout_path = COALESCE($4, stdout_path),
130
+ stderr_path = COALESCE($5, stderr_path),
131
+ stdout_bytes = COALESCE($6, stdout_bytes),
132
+ stderr_bytes = COALESCE($7, stderr_bytes),
133
+ stdout_truncated = COALESCE($8, stdout_truncated),
134
+ stderr_truncated = COALESCE($9, stderr_truncated),
135
+ stdout_tail = COALESCE($10, stdout_tail),
136
+ stderr_tail = COALESCE($11, stderr_tail),
137
+ meta_json = $12,
138
+ updated_at_ms = $13
139
+ WHERE id = $14`, [
140
+ opts?.exitCode ?? 0,
141
+ now,
142
+ durationMs,
143
+ opts?.stdoutPath ?? null,
144
+ opts?.stderrPath ?? null,
145
+ opts?.stdoutBytes ?? null,
146
+ opts?.stderrBytes ?? null,
147
+ opts?.stdoutTruncated ? 1 : null,
148
+ opts?.stderrTruncated ? 1 : null,
149
+ opts?.stdoutTail ?? null,
150
+ opts?.stderrTail ?? null,
151
+ JSON.stringify(merged),
152
+ now,
153
+ id,
154
+ ]);
155
+ return getById(db, id);
156
+ }
157
+ /**
158
+ * Mark step as failed
159
+ */
160
+ export async function markFailed(db, id, opts) {
161
+ const existing = await getById(db, id);
162
+ if (!existing)
163
+ return null;
164
+ const now = Date.now();
165
+ const durationMs = existing.startedAtMs ? now - existing.startedAtMs : null;
166
+ const merged = { ...existing.metadata, ...opts.metadata };
167
+ await db.query(`UPDATE run_steps SET
168
+ status = 'failed',
169
+ exit_code = $1,
170
+ signal = $2,
171
+ error_message = $3,
172
+ ended_at_ms = $4,
173
+ duration_ms = $5,
174
+ stdout_path = COALESCE($6, stdout_path),
175
+ stderr_path = COALESCE($7, stderr_path),
176
+ stdout_bytes = COALESCE($8, stdout_bytes),
177
+ stderr_bytes = COALESCE($9, stderr_bytes),
178
+ stdout_truncated = COALESCE($10, stdout_truncated),
179
+ stderr_truncated = COALESCE($11, stderr_truncated),
180
+ stdout_tail = COALESCE($12, stdout_tail),
181
+ stderr_tail = COALESCE($13, stderr_tail),
182
+ meta_json = $14,
183
+ updated_at_ms = $15
184
+ WHERE id = $16`, [
185
+ opts.exitCode ?? null,
186
+ opts.signal ?? null,
187
+ opts.errorMessage ?? null,
188
+ now,
189
+ durationMs,
190
+ opts.stdoutPath ?? null,
191
+ opts.stderrPath ?? null,
192
+ opts.stdoutBytes ?? null,
193
+ opts.stderrBytes ?? null,
194
+ opts.stdoutTruncated ? 1 : null,
195
+ opts.stderrTruncated ? 1 : null,
196
+ opts.stdoutTail ?? null,
197
+ opts.stderrTail ?? null,
198
+ JSON.stringify(merged),
199
+ now,
200
+ id,
201
+ ]);
202
+ return getById(db, id);
203
+ }
204
+ /**
205
+ * Mark step as skipped
206
+ */
207
+ export async function markSkipped(db, id, reason) {
208
+ const now = Date.now();
209
+ await db.query(`UPDATE run_steps SET
210
+ status = 'skipped',
211
+ error_message = $1,
212
+ ended_at_ms = $2,
213
+ updated_at_ms = $3
214
+ WHERE id = $4`, [reason ?? null, now, now, id]);
215
+ return getById(db, id);
216
+ }
217
+ /**
218
+ * Mark step as canceled
219
+ */
220
+ export async function markCanceled(db, id, reason) {
221
+ const now = Date.now();
222
+ await db.query(`UPDATE run_steps SET
223
+ status = 'canceled',
224
+ error_message = $1,
225
+ ended_at_ms = $2,
226
+ updated_at_ms = $3
227
+ WHERE id = $4`, [reason ?? null, now, now, id]);
228
+ return getById(db, id);
229
+ }
230
+ /**
231
+ * List steps for a run
232
+ */
233
+ export async function listByRun(db, runId, opts) {
234
+ let sql = 'SELECT * FROM run_steps WHERE run_id = $1';
235
+ const params = [runId];
236
+ let paramIndex = 2;
237
+ if (opts?.attempt !== undefined) {
238
+ sql += ` AND attempt = $${paramIndex++}`;
239
+ params.push(opts.attempt);
240
+ }
241
+ if (opts?.status) {
242
+ const statuses = Array.isArray(opts.status) ? opts.status : [opts.status];
243
+ const placeholders = statuses.map(() => `$${paramIndex++}`).join(', ');
244
+ sql += ` AND status IN (${placeholders})`;
245
+ params.push(...statuses);
246
+ }
247
+ sql += ' ORDER BY attempt ASC, ordinal ASC';
248
+ const result = await db.query(sql, params);
249
+ return result.rows.map(rowToStep);
250
+ }
251
+ /**
252
+ * Get the latest attempt number for a run
253
+ */
254
+ export async function getLatestAttempt(db, runId) {
255
+ const result = await db.query('SELECT COALESCE(MAX(attempt), 0) AS attempt FROM run_steps WHERE run_id = $1', [runId]);
256
+ return result.rows[0]?.attempt ?? 0;
257
+ }
258
+ export async function getStepCounts(db, runId, attempt) {
259
+ const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
260
+ const result = await db.query(`SELECT
261
+ SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS passed,
262
+ SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed,
263
+ SUM(CASE WHEN status IN ('queued', 'running') THEN 1 ELSE 0 END) AS active,
264
+ SUM(CASE WHEN status IN ('skipped', 'canceled') THEN 1 ELSE 0 END) AS skipped,
265
+ COUNT(*) AS total
266
+ FROM run_steps
267
+ WHERE run_id = $1 AND attempt = $2`, [runId, actualAttempt]);
268
+ const row = result.rows[0];
269
+ return {
270
+ passed: parseInt(row?.passed ?? '0', 10),
271
+ failed: parseInt(row?.failed ?? '0', 10),
272
+ active: parseInt(row?.active ?? '0', 10),
273
+ skipped: parseInt(row?.skipped ?? '0', 10),
274
+ total: parseInt(row?.total ?? '0', 10),
275
+ };
276
+ }
277
+ /**
278
+ * Get the first failed step for a run attempt
279
+ */
280
+ export async function getFirstFailedStep(db, runId, attempt) {
281
+ const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
282
+ const result = await db.query(`SELECT * FROM run_steps
283
+ WHERE run_id = $1 AND attempt = $2 AND status = 'failed'
284
+ ORDER BY ordinal ASC
285
+ LIMIT 1`, [runId, actualAttempt]);
286
+ return result.rows[0] ? rowToStep(result.rows[0]) : null;
287
+ }
288
+ /**
289
+ * Get the currently running step for a run
290
+ */
291
+ export async function getRunningStep(db, runId, attempt) {
292
+ const actualAttempt = attempt ?? (await getLatestAttempt(db, runId));
293
+ const result = await db.query(`SELECT * FROM run_steps
294
+ WHERE run_id = $1 AND attempt = $2 AND status = 'running'
295
+ ORDER BY ordinal ASC
296
+ LIMIT 1`, [runId, actualAttempt]);
297
+ return result.rows[0] ? rowToStep(result.rows[0]) : null;
298
+ }
299
+ export async function getSummary(db, runId) {
300
+ const latestAttempt = await getLatestAttempt(db, runId);
301
+ if (latestAttempt === 0) {
302
+ return {
303
+ runId,
304
+ latestAttempt: 0,
305
+ counts: { passed: 0, failed: 0, active: 0, skipped: 0, total: 0 },
306
+ firstFailedStep: null,
307
+ runningStep: null,
308
+ totalDurationMs: 0,
309
+ };
310
+ }
311
+ const [counts, firstFailed, running, durationResult] = await Promise.all([
312
+ getStepCounts(db, runId, latestAttempt),
313
+ getFirstFailedStep(db, runId, latestAttempt),
314
+ getRunningStep(db, runId, latestAttempt),
315
+ db.query(`SELECT COALESCE(SUM(duration_ms), 0) AS total_duration
316
+ FROM run_steps
317
+ WHERE run_id = $1 AND attempt = $2`, [runId, latestAttempt]),
318
+ ]);
319
+ return {
320
+ runId,
321
+ latestAttempt,
322
+ counts,
323
+ firstFailedStep: firstFailed?.name ?? null,
324
+ runningStep: running?.name ?? null,
325
+ totalDurationMs: parseInt(durationResult.rows[0]?.total_duration ?? '0', 10),
326
+ };
327
+ }
328
+ //# 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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"}