steroids-cli 0.14.2 → 0.15.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.
- package/dist/commands/ai-run.d.ts +10 -0
- package/dist/commands/ai-run.d.ts.map +1 -0
- package/dist/commands/ai-run.js +255 -0
- package/dist/commands/ai-run.js.map +1 -0
- package/dist/commands/ai.d.ts.map +1 -1
- package/dist/commands/ai.js +7 -1
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/coder-noop-submission.d.ts +2 -2
- package/dist/commands/coder-noop-submission.d.ts.map +1 -1
- package/dist/commands/coder-noop-submission.js +8 -1
- package/dist/commands/coder-noop-submission.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +9 -0
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/loop-phases-coder-decision.d.ts +2 -0
- package/dist/commands/loop-phases-coder-decision.d.ts.map +1 -1
- package/dist/commands/loop-phases-coder-decision.js +18 -41
- package/dist/commands/loop-phases-coder-decision.js.map +1 -1
- package/dist/commands/loop-phases-coder.d.ts.map +1 -1
- package/dist/commands/loop-phases-coder.js +2 -1
- package/dist/commands/loop-phases-coder.js.map +1 -1
- package/dist/commands/loop-phases-reviewer.d.ts.map +1 -1
- package/dist/commands/loop-phases-reviewer.js +78 -74
- package/dist/commands/loop-phases-reviewer.js.map +1 -1
- package/dist/commands/loop.d.ts.map +1 -1
- package/dist/commands/loop.js +6 -0
- package/dist/commands/loop.js.map +1 -1
- package/dist/commands/push-task-branch.d.ts +12 -0
- package/dist/commands/push-task-branch.d.ts.map +1 -0
- package/dist/commands/push-task-branch.js +24 -0
- package/dist/commands/push-task-branch.js.map +1 -0
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +1 -1
- package/dist/database/queries.d.ts +8 -2
- package/dist/database/queries.d.ts.map +1 -1
- package/dist/database/queries.js +17 -1
- package/dist/database/queries.js.map +1 -1
- package/dist/git/section-pr.js +1 -1
- package/dist/health/stuck-task-detector-types.d.ts +3 -3
- package/dist/health/stuck-task-detector-types.d.ts.map +1 -1
- package/dist/health/stuck-task-detector.js +21 -5
- package/dist/health/stuck-task-detector.js.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/monitor/investigator-actions.d.ts.map +1 -1
- package/dist/monitor/investigator-actions.js +44 -39
- package/dist/monitor/investigator-actions.js.map +1 -1
- package/dist/monitor/investigator-agent.d.ts +9 -0
- package/dist/monitor/investigator-agent.d.ts.map +1 -1
- package/dist/monitor/investigator-agent.js +2 -0
- package/dist/monitor/investigator-agent.js.map +1 -1
- package/dist/monitor/investigator-helpers.d.ts +5 -0
- package/dist/monitor/investigator-helpers.d.ts.map +1 -0
- package/dist/monitor/investigator-helpers.js +44 -0
- package/dist/monitor/investigator-helpers.js.map +1 -0
- package/dist/monitor/investigator-prompt.d.ts.map +1 -1
- package/dist/monitor/investigator-prompt.js +11 -3
- package/dist/monitor/investigator-prompt.js.map +1 -1
- package/dist/monitor/scanner-queries.d.ts +3 -0
- package/dist/monitor/scanner-queries.d.ts.map +1 -1
- package/dist/monitor/scanner-queries.js +57 -0
- package/dist/monitor/scanner-queries.js.map +1 -1
- package/dist/monitor/scanner.d.ts +1 -1
- package/dist/monitor/scanner.d.ts.map +1 -1
- package/dist/monitor/scanner.js +10 -2
- package/dist/monitor/scanner.js.map +1 -1
- package/dist/orchestrator/merge-queue-rebase.d.ts +27 -0
- package/dist/orchestrator/merge-queue-rebase.d.ts.map +1 -0
- package/dist/orchestrator/merge-queue-rebase.js +355 -0
- package/dist/orchestrator/merge-queue-rebase.js.map +1 -0
- package/dist/orchestrator/merge-queue.d.ts +40 -0
- package/dist/orchestrator/merge-queue.d.ts.map +1 -0
- package/dist/orchestrator/merge-queue.js +352 -0
- package/dist/orchestrator/merge-queue.js.map +1 -0
- package/dist/orchestrator/task-selector.d.ts +2 -1
- package/dist/orchestrator/task-selector.d.ts.map +1 -1
- package/dist/orchestrator/task-selector.js +20 -5
- package/dist/orchestrator/task-selector.js.map +1 -1
- package/dist/parallel/clone.d.ts +0 -15
- package/dist/parallel/clone.d.ts.map +1 -1
- package/dist/parallel/clone.js +0 -37
- package/dist/parallel/clone.js.map +1 -1
- package/dist/providers/invocation-logger.d.ts +2 -2
- package/dist/providers/invocation-logger.d.ts.map +1 -1
- package/dist/providers/invocation-logger.js +1 -1
- package/dist/providers/invocation-logger.js.map +1 -1
- package/dist/runners/daemon.d.ts.map +1 -1
- package/dist/runners/daemon.js +0 -79
- package/dist/runners/daemon.js.map +1 -1
- package/dist/runners/orchestrator-loop.d.ts.map +1 -1
- package/dist/runners/orchestrator-loop.js +11 -29
- package/dist/runners/orchestrator-loop.js.map +1 -1
- package/dist/runners/wakeup-checks.js +1 -1
- package/dist/runners/wakeup-checks.js.map +1 -1
- package/dist/runners/wakeup-sanitise-recovery.d.ts +21 -0
- package/dist/runners/wakeup-sanitise-recovery.d.ts.map +1 -0
- package/dist/runners/wakeup-sanitise-recovery.js +209 -0
- package/dist/runners/wakeup-sanitise-recovery.js.map +1 -0
- package/dist/runners/wakeup-sanitise.d.ts +1 -1
- package/dist/runners/wakeup-sanitise.d.ts.map +1 -1
- package/dist/runners/wakeup-sanitise.js +58 -179
- package/dist/runners/wakeup-sanitise.js.map +1 -1
- package/dist/workspace/git-helpers.d.ts +8 -0
- package/dist/workspace/git-helpers.d.ts.map +1 -1
- package/dist/workspace/git-helpers.js +34 -0
- package/dist/workspace/git-helpers.js.map +1 -1
- package/dist/workspace/merge-lock.d.ts +5 -3
- package/dist/workspace/merge-lock.d.ts.map +1 -1
- package/dist/workspace/merge-lock.js +16 -15
- package/dist/workspace/merge-lock.js.map +1 -1
- package/migrations/028_add_merge_queue_fields.sql +8 -0
- package/migrations/manifest.json +9 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner-queries.d.ts","sourceRoot":"","sources":["../../src/monitor/scanner-queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAY5C,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAiBX;AAYD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,uBAAuB,EAAE,MAAM,GAC9B,OAAO,EAAE,CA6BX;AAaD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAuBX;AAYD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAmBX"}
|
|
1
|
+
{"version":3,"file":"scanner-queries.d.ts","sourceRoot":"","sources":["../../src/monitor/scanner-queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAY5C,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAiBX;AAYD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,uBAAuB,EAAE,MAAM,GAC9B,OAAO,EAAE,CA6BX;AAaD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAuBX;AAYD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAmBX;AAaD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAsBX;AAWD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,EAAE,CAeX;AAaD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,EAAE,CAqBX"}
|
|
@@ -8,6 +8,9 @@ exports.scanFailedAndSkippedTasks = scanFailedAndSkippedTasks;
|
|
|
8
8
|
exports.scanHighInvocations = scanHighInvocations;
|
|
9
9
|
exports.scanRepeatedFailures = scanRepeatedFailures;
|
|
10
10
|
exports.scanBlockedTasks = scanBlockedTasks;
|
|
11
|
+
exports.scanStuckMergePhase = scanStuckMergePhase;
|
|
12
|
+
exports.scanDisputedTasks = scanDisputedTasks;
|
|
13
|
+
exports.scanStaleMergeLocks = scanStaleMergeLocks;
|
|
11
14
|
function scanFailedAndSkippedTasks(projectDb, projectPath, projectName) {
|
|
12
15
|
const rows = projectDb
|
|
13
16
|
.prepare(`SELECT id, title, status FROM tasks WHERE status IN ('failed', 'skipped')`)
|
|
@@ -88,4 +91,58 @@ function scanBlockedTasks(projectDb, projectPath, projectName) {
|
|
|
88
91
|
context: { status: row.status },
|
|
89
92
|
}));
|
|
90
93
|
}
|
|
94
|
+
function scanStuckMergePhase(projectDb, projectPath, projectName) {
|
|
95
|
+
const rows = projectDb
|
|
96
|
+
.prepare(`SELECT id, title, merge_phase, updated_at FROM tasks
|
|
97
|
+
WHERE status = 'merge_pending' AND merge_phase IS NOT NULL
|
|
98
|
+
AND (
|
|
99
|
+
(merge_phase = 'queued' AND updated_at < datetime('now', '-15 minutes'))
|
|
100
|
+
OR (merge_phase IN ('rebasing', 'rebase_review') AND updated_at < datetime('now', '-90 minutes'))
|
|
101
|
+
)`)
|
|
102
|
+
.all();
|
|
103
|
+
return rows.map((row) => ({
|
|
104
|
+
type: 'stuck_merge_phase',
|
|
105
|
+
severity: 'warning',
|
|
106
|
+
projectPath,
|
|
107
|
+
projectName,
|
|
108
|
+
taskId: row.id,
|
|
109
|
+
taskTitle: row.title,
|
|
110
|
+
details: `Task "${row.title}" stuck in merge phase '${row.merge_phase}'`,
|
|
111
|
+
context: { mergePhase: row.merge_phase, updatedAt: row.updated_at },
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
function scanDisputedTasks(projectDb, projectPath, projectName) {
|
|
115
|
+
const rows = projectDb
|
|
116
|
+
.prepare(`SELECT id, title FROM tasks WHERE status = 'disputed'`)
|
|
117
|
+
.all();
|
|
118
|
+
return rows.map((row) => ({
|
|
119
|
+
type: 'disputed_task',
|
|
120
|
+
severity: 'warning',
|
|
121
|
+
projectPath,
|
|
122
|
+
projectName,
|
|
123
|
+
taskId: row.id,
|
|
124
|
+
taskTitle: row.title,
|
|
125
|
+
details: `Task "${row.title}" is disputed — needs manual resolution`,
|
|
126
|
+
context: {},
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
function scanStaleMergeLocks(globalDb, projectPath, projectName, projectId) {
|
|
130
|
+
const staleCutoffMs = Date.now() - 5 * 60_000; // 5 minutes
|
|
131
|
+
const row = globalDb
|
|
132
|
+
.prepare(`SELECT project_id, runner_id, acquired_at, heartbeat_at
|
|
133
|
+
FROM workspace_merge_locks
|
|
134
|
+
WHERE project_id = ? AND heartbeat_at < ?`)
|
|
135
|
+
.get(projectId, staleCutoffMs);
|
|
136
|
+
if (!row)
|
|
137
|
+
return [];
|
|
138
|
+
const ageMinutes = Math.round((Date.now() - row.heartbeat_at) / 60_000);
|
|
139
|
+
return [{
|
|
140
|
+
type: 'stale_merge_lock',
|
|
141
|
+
severity: 'warning',
|
|
142
|
+
projectPath,
|
|
143
|
+
projectName,
|
|
144
|
+
details: `Merge lock held for ${ageMinutes}m without heartbeat (runner: ${row.runner_id})`,
|
|
145
|
+
context: { runnerId: row.runner_id, acquiredAt: row.acquired_at, heartbeatAt: row.heartbeat_at },
|
|
146
|
+
}];
|
|
147
|
+
}
|
|
91
148
|
//# sourceMappingURL=scanner-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner-queries.js","sourceRoot":"","sources":["../../src/monitor/scanner-queries.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAeH,8DAqBC;AAYD,kDAmCC;AAaD,oDA2BC;AAYD,4CAuBC;
|
|
1
|
+
{"version":3,"file":"scanner-queries.js","sourceRoot":"","sources":["../../src/monitor/scanner-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - Graceful: missing/corrupt project DBs are skipped with a warning
|
|
12
12
|
*/
|
|
13
13
|
export interface Anomaly {
|
|
14
|
-
type: 'orphaned_task' | 'hanging_invocation' | 'zombie_runner' | 'dead_runner' | 'db_inconsistency' | 'credit_exhaustion' | 'failed_task' | 'skipped_task' | 'idle_project' | 'high_invocations' | 'repeated_failures' | 'blocked_task';
|
|
14
|
+
type: 'orphaned_task' | 'hanging_invocation' | 'zombie_runner' | 'dead_runner' | 'db_inconsistency' | 'credit_exhaustion' | 'failed_task' | 'skipped_task' | 'idle_project' | 'high_invocations' | 'repeated_failures' | 'blocked_task' | 'stale_merge_lock' | 'stuck_merge_phase' | 'disputed_task';
|
|
15
15
|
severity: 'info' | 'warning' | 'critical';
|
|
16
16
|
projectPath: string;
|
|
17
17
|
projectName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/monitor/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/monitor/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+BH,MAAM,WAAW,OAAO;IACtB,IAAI,EACA,eAAe,GACf,oBAAoB,GACpB,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,mBAAmB,GACnB,aAAa,GACb,cAAc,GACd,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AA4MD,wBAAsB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CA8JnD"}
|
package/dist/monitor/scanner.js
CHANGED
|
@@ -23,6 +23,7 @@ const node_path_2 = require("node:path");
|
|
|
23
23
|
const stuck_task_detector_js_1 = require("../health/stuck-task-detector.js");
|
|
24
24
|
const global_db_connection_js_1 = require("../runners/global-db-connection.js");
|
|
25
25
|
const cron_js_1 = require("../runners/cron.js");
|
|
26
|
+
const clone_js_1 = require("../parallel/clone.js");
|
|
26
27
|
const global_db_backoffs_js_1 = require("../runners/global-db-backoffs.js");
|
|
27
28
|
const scanner_queries_js_1 = require("./scanner-queries.js");
|
|
28
29
|
// ---------------------------------------------------------------------------
|
|
@@ -91,7 +92,7 @@ function hasPendingWork(projectDb) {
|
|
|
91
92
|
// disputed tasks (S3's sanitiser auto-resolves them after 30 min).
|
|
92
93
|
const row = projectDb
|
|
93
94
|
.prepare(`SELECT COUNT(*) as count FROM tasks
|
|
94
|
-
WHERE status IN ('pending', 'in_progress', 'review')`)
|
|
95
|
+
WHERE status IN ('pending', 'in_progress', 'review', 'merge_pending')`)
|
|
95
96
|
.get();
|
|
96
97
|
return row.count > 0;
|
|
97
98
|
}
|
|
@@ -252,7 +253,14 @@ async function runScan() {
|
|
|
252
253
|
anomalies.push(...(0, scanner_queries_js_1.scanRepeatedFailures)(projectDb, projectPath, projectName));
|
|
253
254
|
// 5. Blocked tasks (merge conflicts or errors needing reset)
|
|
254
255
|
anomalies.push(...(0, scanner_queries_js_1.scanBlockedTasks)(projectDb, projectPath, projectName));
|
|
255
|
-
// 6.
|
|
256
|
+
// 6. Stuck merge phase (queued > 15 min, rebasing > 90 min)
|
|
257
|
+
anomalies.push(...(0, scanner_queries_js_1.scanStuckMergePhase)(projectDb, projectPath, projectName));
|
|
258
|
+
// 7. Disputed tasks
|
|
259
|
+
anomalies.push(...(0, scanner_queries_js_1.scanDisputedTasks)(projectDb, projectPath, projectName));
|
|
260
|
+
// 8. Stale merge locks (>5 min without heartbeat)
|
|
261
|
+
const projectId = (0, clone_js_1.getProjectHash)(projectPath);
|
|
262
|
+
anomalies.push(...(0, scanner_queries_js_1.scanStaleMergeLocks)(globalDb, projectPath, projectName, projectId));
|
|
263
|
+
// 9. Idle project check — warning if cron is running (should have spawned a runner)
|
|
256
264
|
if (hasPendingWork(projectDb) && !hasActiveRunner(globalDb, projectPath)) {
|
|
257
265
|
const cronActive = (0, cron_js_1.cronStatus)().installed;
|
|
258
266
|
// S6: Check if any provider is backed off — this legitimately prevents wakeup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/monitor/scanner.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/monitor/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge queue rebase cycle — handles LLM-powered conflict resolution.
|
|
3
|
+
*
|
|
4
|
+
* Responsibility: rebase coder invocation, diff fence validation,
|
|
5
|
+
* rebase review orchestration, and merge_phase transitions.
|
|
6
|
+
*
|
|
7
|
+
* Step functions are exported for unit testing.
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
import type { Task } from '../database/queries.js';
|
|
11
|
+
import type { SteroidsConfig } from '../config/loader.js';
|
|
12
|
+
export declare function resetBranchToSha(slotPath: string, taskBranch: string, sha: string): void;
|
|
13
|
+
export interface ConflictCapture {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
conflictFiles: string[];
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function captureConflictFiles(slotPath: string, taskBranch: string, targetBranch: string): ConflictCapture;
|
|
19
|
+
export interface DiffFenceResult {
|
|
20
|
+
valid: boolean;
|
|
21
|
+
violations: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function validateDiffFence(slotPath: string, allowedFiles: string[], baseRef: string): DiffFenceResult;
|
|
24
|
+
export declare function handleRebaseCoder(db: Database.Database, task: Task, config: SteroidsConfig, slotPath: string, targetBranch: string, taskBranch: string, runnerId?: string): Promise<void>;
|
|
25
|
+
export declare function handleRebaseReview(db: Database.Database, task: Task, config: SteroidsConfig, slotPath: string, targetBranch: string, taskBranch: string, runnerId?: string): Promise<void>;
|
|
26
|
+
export declare function parseRebaseReviewDecision(stdout: string): 'approve' | 'reject';
|
|
27
|
+
//# sourceMappingURL=merge-queue-rebase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-queue-rebase.d.ts","sourceRoot":"","sources":["../../src/orchestrator/merge-queue-rebase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAS1D,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,IAAI,CAIN;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,eAAe,CAoCjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,MAAM,GACd,eAAe,CAejB;AAyCD,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAsJf;AAID,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Hf;AAID,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAQ9E"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Merge queue rebase cycle — handles LLM-powered conflict resolution.
|
|
4
|
+
*
|
|
5
|
+
* Responsibility: rebase coder invocation, diff fence validation,
|
|
6
|
+
* rebase review orchestration, and merge_phase transitions.
|
|
7
|
+
*
|
|
8
|
+
* Step functions are exported for unit testing.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.resetBranchToSha = resetBranchToSha;
|
|
12
|
+
exports.captureConflictFiles = captureConflictFiles;
|
|
13
|
+
exports.validateDiffFence = validateDiffFence;
|
|
14
|
+
exports.handleRebaseCoder = handleRebaseCoder;
|
|
15
|
+
exports.handleRebaseReview = handleRebaseReview;
|
|
16
|
+
exports.parseRebaseReviewDecision = parseRebaseReviewDecision;
|
|
17
|
+
const node_child_process_1 = require("node:child_process");
|
|
18
|
+
const queries_js_1 = require("../database/queries.js");
|
|
19
|
+
const merge_queue_js_1 = require("./merge-queue.js");
|
|
20
|
+
const registry_js_1 = require("../providers/registry.js");
|
|
21
|
+
const invocation_logger_js_1 = require("../providers/invocation-logger.js");
|
|
22
|
+
const node_fs_1 = require("node:fs");
|
|
23
|
+
const node_os_1 = require("node:os");
|
|
24
|
+
const node_path_1 = require("node:path");
|
|
25
|
+
// ─── Pure step functions ────────────────────────────────────────────────────
|
|
26
|
+
function resetBranchToSha(slotPath, taskBranch, sha) {
|
|
27
|
+
(0, node_child_process_1.execFileSync)('git', ['checkout', '-B', taskBranch, sha], {
|
|
28
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 30_000,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function captureConflictFiles(slotPath, taskBranch, targetBranch) {
|
|
32
|
+
// Start rebase to discover conflicts
|
|
33
|
+
try {
|
|
34
|
+
(0, node_child_process_1.execFileSync)('git', ['rebase', `origin/${targetBranch}`], {
|
|
35
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 120_000,
|
|
36
|
+
});
|
|
37
|
+
// No conflicts — rebase succeeded cleanly (shouldn't reach here if
|
|
38
|
+
// attemptRebaseAndFastForward already failed, but handle gracefully)
|
|
39
|
+
return { ok: true, conflictFiles: [] };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Expected — rebase failed due to conflicts
|
|
43
|
+
}
|
|
44
|
+
// Capture conflicting files
|
|
45
|
+
let conflictFiles = [];
|
|
46
|
+
try {
|
|
47
|
+
const output = (0, node_child_process_1.execFileSync)('git', ['diff', '--name-only', '--diff-filter=U'], {
|
|
48
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 10_000,
|
|
49
|
+
}).trim();
|
|
50
|
+
conflictFiles = output ? output.split('\n').filter(Boolean) : [];
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fallback: no conflict info available
|
|
54
|
+
}
|
|
55
|
+
// Abort the in-progress rebase
|
|
56
|
+
try {
|
|
57
|
+
(0, node_child_process_1.execFileSync)('git', ['rebase', '--abort'], {
|
|
58
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 10_000,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch { /* already clean */ }
|
|
62
|
+
if (conflictFiles.length === 0) {
|
|
63
|
+
return { ok: false, conflictFiles: [], error: 'Could not determine conflicting files' };
|
|
64
|
+
}
|
|
65
|
+
return { ok: true, conflictFiles };
|
|
66
|
+
}
|
|
67
|
+
function validateDiffFence(slotPath, allowedFiles, baseRef) {
|
|
68
|
+
let modifiedFiles;
|
|
69
|
+
try {
|
|
70
|
+
const output = (0, node_child_process_1.execFileSync)('git', ['diff', '--name-only', baseRef], {
|
|
71
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 10_000,
|
|
72
|
+
}).trim();
|
|
73
|
+
modifiedFiles = output ? output.split('\n').filter(Boolean) : [];
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return { valid: false, violations: ['Could not determine modified files'] };
|
|
77
|
+
}
|
|
78
|
+
const allowedSet = new Set(allowedFiles);
|
|
79
|
+
const violations = modifiedFiles.filter(f => !allowedSet.has(f));
|
|
80
|
+
return { valid: violations.length === 0, violations };
|
|
81
|
+
}
|
|
82
|
+
// ─── Rebase coder prompt ────────────────────────────────────────────────────
|
|
83
|
+
function buildRebaseCoderPrompt(task, conflictFiles, targetBranch) {
|
|
84
|
+
return [
|
|
85
|
+
`TASK ID: ${task.id}`,
|
|
86
|
+
'',
|
|
87
|
+
'# Rebase Conflict Resolution',
|
|
88
|
+
'',
|
|
89
|
+
`You are resolving merge conflicts so this task branch can be merged into \`${targetBranch}\`.`,
|
|
90
|
+
'',
|
|
91
|
+
'## Conflict Files',
|
|
92
|
+
...conflictFiles.map(f => `- ${f}`),
|
|
93
|
+
'',
|
|
94
|
+
'## Rules',
|
|
95
|
+
'1. Read CLAUDE.md and AGENTS.md before starting.',
|
|
96
|
+
'2. ONLY modify files listed above. Do NOT touch any other files.',
|
|
97
|
+
'3. Resolve each conflict by understanding both sides and producing correct merged code.',
|
|
98
|
+
'4. Run the build command to verify your changes compile.',
|
|
99
|
+
'5. Run the test command to verify nothing is broken.',
|
|
100
|
+
'6. If you cannot resolve a conflict correctly, say so — do not guess.',
|
|
101
|
+
'',
|
|
102
|
+
'## Task Context',
|
|
103
|
+
`Title: ${task.title}`,
|
|
104
|
+
'',
|
|
105
|
+
'## Instructions',
|
|
106
|
+
`1. Run: git rebase origin/${targetBranch}`,
|
|
107
|
+
'2. For each conflict file, resolve the conflict markers.',
|
|
108
|
+
'3. Stage resolved files: git add <file>',
|
|
109
|
+
'4. Continue rebase: git rebase --continue',
|
|
110
|
+
'5. Build and test to verify.',
|
|
111
|
+
].join('\n');
|
|
112
|
+
}
|
|
113
|
+
// ─── Orchestrator: handleRebaseCoder ────────────────────────────────────────
|
|
114
|
+
async function handleRebaseCoder(db, task, config, slotPath, targetBranch, taskBranch, runnerId) {
|
|
115
|
+
const approvedSha = task.approved_sha;
|
|
116
|
+
if (!approvedSha) {
|
|
117
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', '[merge_queue] No approved_sha for rebase — cannot proceed');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Step 1: Reset task branch to approved_sha (clean slate for each attempt)
|
|
121
|
+
try {
|
|
122
|
+
(0, node_child_process_1.execFileSync)('git', ['fetch', 'origin', targetBranch, taskBranch], {
|
|
123
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 120_000,
|
|
124
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Transient — retry next iteration
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
resetBranchToSha(slotPath, taskBranch, `origin/${taskBranch}`);
|
|
132
|
+
// Step 2: Capture conflict files
|
|
133
|
+
const capture = captureConflictFiles(slotPath, taskBranch, targetBranch);
|
|
134
|
+
if (!capture.ok) {
|
|
135
|
+
if (capture.conflictFiles.length === 0 && !capture.error) {
|
|
136
|
+
// Clean rebase succeeded — no conflicts, go back to queued for merge attempt
|
|
137
|
+
db.prepare(`UPDATE tasks SET merge_phase = 'queued', updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
db.prepare(`UPDATE tasks SET status = 'disputed', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
141
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'disputed', 'orchestrator', {
|
|
142
|
+
actorType: 'orchestrator',
|
|
143
|
+
notes: `[merge_queue] Could not capture conflict files: ${capture.error}`,
|
|
144
|
+
});
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (capture.conflictFiles.length === 0) {
|
|
148
|
+
// No conflicts — go back to queued
|
|
149
|
+
db.prepare(`UPDATE tasks SET merge_phase = 'queued', updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Reset branch again for the LLM to work on
|
|
153
|
+
resetBranchToSha(slotPath, taskBranch, `origin/${taskBranch}`);
|
|
154
|
+
const preRebaseSha = (0, node_child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], {
|
|
155
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 10_000,
|
|
156
|
+
}).trim();
|
|
157
|
+
// Step 3: Invoke LLM rebase coder
|
|
158
|
+
const coderConfig = config.ai?.coder;
|
|
159
|
+
if (!coderConfig?.provider || !coderConfig.model) {
|
|
160
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', '[merge_queue] No coder AI provider configured for rebase');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const prompt = buildRebaseCoderPrompt(task, capture.conflictFiles, targetBranch);
|
|
164
|
+
const promptFile = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-rebase-coder-${Date.now()}.txt`);
|
|
165
|
+
(0, node_fs_1.writeFileSync)(promptFile, prompt, 'utf-8');
|
|
166
|
+
let llmSuccess = false;
|
|
167
|
+
try {
|
|
168
|
+
const registry = await (0, registry_js_1.getProviderRegistry)();
|
|
169
|
+
const provider = registry.get(coderConfig.provider);
|
|
170
|
+
if (!(await provider.isAvailable())) {
|
|
171
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', `[merge_queue] Rebase coder provider '${coderConfig.provider}' not available`);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const result = await (0, invocation_logger_js_1.logInvocation)(prompt, (ctx) => provider.invoke(prompt, {
|
|
175
|
+
model: coderConfig.model,
|
|
176
|
+
timeout: 1800_000, // 30 min
|
|
177
|
+
cwd: slotPath,
|
|
178
|
+
promptFile,
|
|
179
|
+
role: 'coder',
|
|
180
|
+
streamOutput: false,
|
|
181
|
+
onActivity: ctx?.onActivity,
|
|
182
|
+
}), {
|
|
183
|
+
role: 'rebase_coder',
|
|
184
|
+
provider: coderConfig.provider,
|
|
185
|
+
model: coderConfig.model,
|
|
186
|
+
taskId: task.id,
|
|
187
|
+
projectPath: slotPath,
|
|
188
|
+
runnerId,
|
|
189
|
+
});
|
|
190
|
+
llmSuccess = result.success;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
llmSuccess = false;
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
try {
|
|
197
|
+
(0, node_fs_1.unlinkSync)(promptFile);
|
|
198
|
+
}
|
|
199
|
+
catch { /* ignore */ }
|
|
200
|
+
}
|
|
201
|
+
if (!llmSuccess) {
|
|
202
|
+
db.prepare(`UPDATE tasks SET status = 'disputed', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
203
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'disputed', 'orchestrator', {
|
|
204
|
+
actorType: 'orchestrator',
|
|
205
|
+
notes: '[merge_queue] LLM rebase coder failed — escalating to disputed',
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Step 4: Validate diff fence
|
|
210
|
+
const fence = validateDiffFence(slotPath, capture.conflictFiles, preRebaseSha);
|
|
211
|
+
if (!fence.valid) {
|
|
212
|
+
db.prepare(`UPDATE tasks SET status = 'disputed', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
213
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'disputed', 'orchestrator', {
|
|
214
|
+
actorType: 'orchestrator',
|
|
215
|
+
notes: `[merge_queue] Diff fence violation — LLM modified files outside conflict scope: ${fence.violations.join(', ')}`,
|
|
216
|
+
});
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Step 5: Force-push updated task branch
|
|
220
|
+
try {
|
|
221
|
+
(0, node_child_process_1.execFileSync)('git', ['push', 'origin', taskBranch, '--force-with-lease'], {
|
|
222
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 60_000,
|
|
223
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', '[merge_queue] Failed to push rebased task branch');
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Step 6: Transition to rebase_review (do NOT set approved_sha)
|
|
231
|
+
db.prepare(`UPDATE tasks SET merge_phase = 'rebase_review', updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
232
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'merge_pending', 'orchestrator', {
|
|
233
|
+
actorType: 'orchestrator',
|
|
234
|
+
notes: `[merge_queue] Rebase coder completed — awaiting rebase review (conflicts: ${capture.conflictFiles.join(', ')})`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// ─── Orchestrator: handleRebaseReview ───────────────────────────────────────
|
|
238
|
+
async function handleRebaseReview(db, task, config, slotPath, targetBranch, taskBranch, runnerId) {
|
|
239
|
+
// Fetch latest
|
|
240
|
+
try {
|
|
241
|
+
(0, node_child_process_1.execFileSync)('git', ['fetch', 'origin', targetBranch, taskBranch], {
|
|
242
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 120_000,
|
|
243
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return; // Transient — retry next iteration
|
|
248
|
+
}
|
|
249
|
+
// Invoke reviewer on the rebased task branch
|
|
250
|
+
const reviewerConfig = config.ai?.reviewer;
|
|
251
|
+
if (!reviewerConfig?.provider || !reviewerConfig.model) {
|
|
252
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', '[merge_queue] No reviewer AI provider configured for rebase review');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const prompt = [
|
|
256
|
+
`TASK ID: ${task.id}`,
|
|
257
|
+
'',
|
|
258
|
+
'# Rebase Review',
|
|
259
|
+
'',
|
|
260
|
+
'Review the conflict resolution changes on this task branch.',
|
|
261
|
+
'Focus on: correctness of merge conflict resolution, no regressions, build passes.',
|
|
262
|
+
'',
|
|
263
|
+
`Task: ${task.title}`,
|
|
264
|
+
'',
|
|
265
|
+
'Instructions:',
|
|
266
|
+
'1. Read CLAUDE.md and AGENTS.md.',
|
|
267
|
+
`2. Review the diff: git diff origin/${targetBranch}...origin/${taskBranch}`,
|
|
268
|
+
'3. Verify build and tests pass.',
|
|
269
|
+
'4. Output DECISION: APPROVE or DECISION: REJECT with reasoning.',
|
|
270
|
+
].join('\n');
|
|
271
|
+
const promptFile = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-rebase-reviewer-${Date.now()}.txt`);
|
|
272
|
+
(0, node_fs_1.writeFileSync)(promptFile, prompt, 'utf-8');
|
|
273
|
+
let reviewerStdout = '';
|
|
274
|
+
let reviewerSuccess = false;
|
|
275
|
+
try {
|
|
276
|
+
const registry = await (0, registry_js_1.getProviderRegistry)();
|
|
277
|
+
const provider = registry.get(reviewerConfig.provider);
|
|
278
|
+
if (!(await provider.isAvailable())) {
|
|
279
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', `[merge_queue] Rebase reviewer provider '${reviewerConfig.provider}' not available`);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const result = await (0, invocation_logger_js_1.logInvocation)(prompt, (ctx) => provider.invoke(prompt, {
|
|
283
|
+
model: reviewerConfig.model,
|
|
284
|
+
timeout: 900_000, // 15 min
|
|
285
|
+
cwd: slotPath,
|
|
286
|
+
promptFile,
|
|
287
|
+
role: 'reviewer',
|
|
288
|
+
streamOutput: false,
|
|
289
|
+
onActivity: ctx?.onActivity,
|
|
290
|
+
}), {
|
|
291
|
+
role: 'rebase_reviewer',
|
|
292
|
+
provider: reviewerConfig.provider,
|
|
293
|
+
model: reviewerConfig.model,
|
|
294
|
+
taskId: task.id,
|
|
295
|
+
projectPath: slotPath,
|
|
296
|
+
runnerId,
|
|
297
|
+
});
|
|
298
|
+
reviewerStdout = result.stdout;
|
|
299
|
+
reviewerSuccess = result.success;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
reviewerSuccess = false;
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
try {
|
|
306
|
+
(0, node_fs_1.unlinkSync)(promptFile);
|
|
307
|
+
}
|
|
308
|
+
catch { /* ignore */ }
|
|
309
|
+
}
|
|
310
|
+
if (!reviewerSuccess) {
|
|
311
|
+
db.prepare(`UPDATE tasks SET status = 'disputed', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now') WHERE id = ?`).run(task.id);
|
|
312
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'disputed', 'orchestrator', {
|
|
313
|
+
actorType: 'orchestrator',
|
|
314
|
+
notes: '[merge_queue] Rebase reviewer failed — escalating to disputed',
|
|
315
|
+
});
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
// Parse decision from reviewer output
|
|
319
|
+
const decision = parseRebaseReviewDecision(reviewerStdout);
|
|
320
|
+
if (decision === 'approve') {
|
|
321
|
+
// Re-record approved_sha from remote HEAD of task branch
|
|
322
|
+
let newApprovedSha;
|
|
323
|
+
try {
|
|
324
|
+
newApprovedSha = (0, node_child_process_1.execFileSync)('git', ['rev-parse', `origin/${taskBranch}`], {
|
|
325
|
+
cwd: slotPath, encoding: 'utf-8', timeout: 10_000,
|
|
326
|
+
}).trim();
|
|
327
|
+
}
|
|
328
|
+
catch { /* fall through */ }
|
|
329
|
+
if (!newApprovedSha) {
|
|
330
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'blocked_error', 'orchestrator', '[merge_queue] Could not resolve approved_sha after rebase review');
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
db.prepare(`UPDATE tasks SET merge_phase = 'queued', approved_sha = ?, updated_at = datetime('now')
|
|
334
|
+
WHERE id = ?`).run(newApprovedSha, task.id);
|
|
335
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'merge_pending', 'orchestrator', {
|
|
336
|
+
actorType: 'orchestrator',
|
|
337
|
+
notes: `[merge_queue] Rebase review approved — re-queued for merge (new sha: ${newApprovedSha})`,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
// Reject — transition back to rebasing (handles increment + cap)
|
|
342
|
+
(0, merge_queue_js_1.transitionToRebasing)(db, task.id, 'Rebase review rejected');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ─── Decision parser ────────────────────────────────────────────────────────
|
|
346
|
+
function parseRebaseReviewDecision(stdout) {
|
|
347
|
+
const upper = stdout.toUpperCase();
|
|
348
|
+
// Look for explicit DECISION: APPROVE/REJECT tokens
|
|
349
|
+
if (upper.includes('DECISION: APPROVE') || upper.includes('DECISION:APPROVE')) {
|
|
350
|
+
return 'approve';
|
|
351
|
+
}
|
|
352
|
+
// Default to reject if no clear approval signal
|
|
353
|
+
return 'reject';
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=merge-queue-rebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-queue-rebase.js","sourceRoot":"","sources":["../../src/orchestrator/merge-queue-rebase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge queue pipeline — routes merge_pending tasks through the merge gate.
|
|
3
|
+
*
|
|
4
|
+
* Responsibility: pipeline routing, merge orchestration, pool slot and lock lifecycle.
|
|
5
|
+
* Step functions (fetchAndPrepare, attemptRebaseAndFastForward, etc.) are composed
|
|
6
|
+
* here but contain their own logic.
|
|
7
|
+
*/
|
|
8
|
+
import type Database from 'better-sqlite3';
|
|
9
|
+
import type { Task } from '../database/queries.js';
|
|
10
|
+
import type { SteroidsConfig } from '../config/loader.js';
|
|
11
|
+
export type PushErrorClass = 'race_loss' | 'transient' | 'permanent';
|
|
12
|
+
export type FetchErrorClass = 'transient' | 'permanent';
|
|
13
|
+
export declare function classifyPushError(error: string): PushErrorClass;
|
|
14
|
+
export declare function classifyFetchError(error: string): FetchErrorClass;
|
|
15
|
+
export interface PrepResult {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
alreadyMerged?: boolean;
|
|
18
|
+
error?: 'sha_mismatch' | 'fetch_transient' | 'fetch_permanent';
|
|
19
|
+
slotPath?: string;
|
|
20
|
+
taskBranchLocal?: string;
|
|
21
|
+
targetBranch?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function fetchAndPrepare(slotPath: string, taskBranch: string, targetBranch: string, approvedSha: string): PrepResult;
|
|
24
|
+
export declare function handlePrepFailure(db: Database.Database, taskId: string, error: 'sha_mismatch' | 'fetch_transient' | 'fetch_permanent'): void;
|
|
25
|
+
export interface MergeAttemptResult {
|
|
26
|
+
merged: boolean;
|
|
27
|
+
reason?: 'conflicts' | 'ff_only';
|
|
28
|
+
}
|
|
29
|
+
export declare function attemptRebaseAndFastForward(slotPath: string, taskBranch: string, targetBranch: string): MergeAttemptResult;
|
|
30
|
+
export declare function pushTargetBranch(slotPath: string, targetBranch: string): Promise<{
|
|
31
|
+
ok: boolean;
|
|
32
|
+
errorClass?: PushErrorClass;
|
|
33
|
+
error?: string;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function cleanupTaskBranch(slotPath: string, taskBranch: string): void;
|
|
36
|
+
export declare function markCompleted(db: Database.Database, taskId: string, mergedSha?: string): void;
|
|
37
|
+
export declare function transitionToRebasing(db: Database.Database, taskId: string, reason: string): void;
|
|
38
|
+
export declare function handleMergeAttempt(db: Database.Database, task: Task, config: SteroidsConfig, sourceProjectPath: string, runnerId?: string): Promise<void>;
|
|
39
|
+
export declare function processMergeQueue(db: Database.Database, task: Task, config: SteroidsConfig, sourceProjectPath: string, runnerId?: string): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=merge-queue.d.ts.map
|