steroids-cli 0.14.3 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +42 -71
- 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.map +1 -1
- package/dist/runners/wakeup-sanitise-recovery.js +39 -5
- package/dist/runners/wakeup-sanitise-recovery.js.map +1 -1
- package/dist/runners/wakeup-sanitise.d.ts +1 -0
- package/dist/runners/wakeup-sanitise.d.ts.map +1 -1
- package/dist/runners/wakeup-sanitise.js +66 -8
- 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
|
@@ -10,6 +10,7 @@ exports.runPeriodicSanitiseForProject = runPeriodicSanitiseForProject;
|
|
|
10
10
|
exports.sanitisedActionCount = sanitisedActionCount;
|
|
11
11
|
const loader_js_1 = require("../config/loader.js");
|
|
12
12
|
const wakeup_sanitise_recovery_js_1 = require("./wakeup-sanitise-recovery.js");
|
|
13
|
+
const clone_js_1 = require("../parallel/clone.js");
|
|
13
14
|
const DEFAULT_SANITISE_INTERVAL_MINUTES = 5;
|
|
14
15
|
const DEFAULT_SANITISE_INVOCATION_TIMEOUT_SEC = 1800;
|
|
15
16
|
function getSanitiseSettings(projectPath) {
|
|
@@ -53,6 +54,7 @@ function sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, staleInv
|
|
|
53
54
|
releasedTaskLocks: 0,
|
|
54
55
|
releasedSectionLocks: 0,
|
|
55
56
|
recoveredDisputedTasks: 0,
|
|
57
|
+
recoveredFailedTasks: 0,
|
|
56
58
|
};
|
|
57
59
|
const staleCutoffMs = Date.now() - staleInvocationTimeoutSec * 1000;
|
|
58
60
|
// S1/S2: Include parallel session runners (workspace-prefixed paths don't match project_path directly)
|
|
@@ -71,13 +73,15 @@ function sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, staleInv
|
|
|
71
73
|
const hasActiveParallelRunner = activeRunnerTaskRows.some((row) => typeof row.parallel_session_id === 'string' && row.parallel_session_id.length > 0);
|
|
72
74
|
let hasActiveMergeLock = false;
|
|
73
75
|
try {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
const STALE_LOCK_TTL_MS = 90_000;
|
|
77
|
+
const projectId = (0, clone_js_1.getProjectHash)(projectPath);
|
|
78
|
+
const mergeLockRows = globalDb
|
|
79
|
+
.prepare('SELECT heartbeat_at FROM workspace_merge_locks WHERE project_id = ?')
|
|
80
|
+
.all(projectId);
|
|
77
81
|
const nowMs = Date.now();
|
|
78
82
|
hasActiveMergeLock = mergeLockRows.some((row) => {
|
|
79
|
-
const
|
|
80
|
-
return Number.isFinite(
|
|
83
|
+
const hbMs = Date.parse(row.heartbeat_at);
|
|
84
|
+
return Number.isFinite(hbMs) && (nowMs - hbMs) < STALE_LOCK_TTL_MS;
|
|
81
85
|
});
|
|
82
86
|
}
|
|
83
87
|
catch {
|
|
@@ -113,7 +117,8 @@ function sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, staleInv
|
|
|
113
117
|
ORDER BY i.started_at_ms ASC`)
|
|
114
118
|
.all(staleCutoffMs, deadRunnerCutoffMs);
|
|
115
119
|
for (const row of recentRunningInvocations) {
|
|
116
|
-
|
|
120
|
+
const isRebaseRole = row.role === 'rebase_coder' || row.role === 'rebase_reviewer';
|
|
121
|
+
if (activeTaskIds.has(row.task_id) || (hasActiveMergeLock && !isRebaseRole)) {
|
|
117
122
|
continue;
|
|
118
123
|
}
|
|
119
124
|
// Only recover if we can confirm the runner process is dead
|
|
@@ -169,7 +174,7 @@ function sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, staleInv
|
|
|
169
174
|
const ids = disputedRows.map((r) => r.id);
|
|
170
175
|
const placeholders = ids.map(() => '?').join(',');
|
|
171
176
|
projectDb
|
|
172
|
-
.prepare(`UPDATE tasks SET status = 'pending', updated_at = datetime('now')
|
|
177
|
+
.prepare(`UPDATE tasks SET status = 'pending', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now')
|
|
173
178
|
WHERE id IN (${placeholders})`)
|
|
174
179
|
.run(...ids);
|
|
175
180
|
const auditStmt = projectDb.prepare(`INSERT INTO audit (task_id, from_status, to_status, actor, actor_type, notes, created_at)
|
|
@@ -189,6 +194,56 @@ function sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, staleInv
|
|
|
189
194
|
catch {
|
|
190
195
|
// task_invocations may lack role column or audit table schema mismatch — safe to skip
|
|
191
196
|
}
|
|
197
|
+
// S4: Recover failed/skipped tasks stuck > 30 min.
|
|
198
|
+
// Resets to 'pending' — the task selector's S7 logic will route to 'review'
|
|
199
|
+
// (skipping the coder) if the coder already succeeded for the task.
|
|
200
|
+
// Clears failure_count/rejection_count and merge columns for a fresh attempt.
|
|
201
|
+
// Guard: skip tasks with >30 total invocations — they likely have a systemic
|
|
202
|
+
// issue (infrastructure block, repeated provider failures) and should not
|
|
203
|
+
// be retried automatically to avoid burning credits.
|
|
204
|
+
try {
|
|
205
|
+
const failedRows = projectDb
|
|
206
|
+
.prepare(`SELECT t.id, t.status FROM tasks t
|
|
207
|
+
WHERE t.status IN ('failed', 'skipped')
|
|
208
|
+
AND t.updated_at < datetime('now', '-30 minutes')
|
|
209
|
+
AND (
|
|
210
|
+
SELECT COUNT(*) FROM task_invocations i WHERE i.task_id = t.id
|
|
211
|
+
) <= 30`)
|
|
212
|
+
.all();
|
|
213
|
+
if (failedRows.length > 0) {
|
|
214
|
+
const ids = failedRows.map((r) => r.id);
|
|
215
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
216
|
+
projectDb
|
|
217
|
+
.prepare(`UPDATE tasks
|
|
218
|
+
SET status = 'pending',
|
|
219
|
+
failure_count = 0,
|
|
220
|
+
rejection_count = 0,
|
|
221
|
+
merge_phase = NULL,
|
|
222
|
+
approved_sha = NULL,
|
|
223
|
+
rebase_attempts = 0,
|
|
224
|
+
merge_failure_count = 0,
|
|
225
|
+
conflict_count = 0,
|
|
226
|
+
blocked_reason = NULL,
|
|
227
|
+
last_failure_at = NULL,
|
|
228
|
+
updated_at = datetime('now')
|
|
229
|
+
WHERE id IN (${placeholders})`)
|
|
230
|
+
.run(...ids);
|
|
231
|
+
const auditStmt = projectDb.prepare(`INSERT INTO audit (task_id, from_status, to_status, actor, actor_type, notes, created_at)
|
|
232
|
+
VALUES (?, ?, 'pending', 'orchestrator', 'orchestrator',
|
|
233
|
+
'Recovered by periodic sanitise — failed/skipped task reset for retry (S7 routes to correct phase).',
|
|
234
|
+
datetime('now'))`);
|
|
235
|
+
for (const row of failedRows) {
|
|
236
|
+
auditStmt.run(row.id, row.status);
|
|
237
|
+
}
|
|
238
|
+
projectDb
|
|
239
|
+
.prepare(`DELETE FROM task_locks WHERE task_id IN (${placeholders})`)
|
|
240
|
+
.run(...ids);
|
|
241
|
+
}
|
|
242
|
+
summary.recoveredFailedTasks = failedRows.length;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Safe to skip on schema mismatch
|
|
246
|
+
}
|
|
192
247
|
}
|
|
193
248
|
return summary;
|
|
194
249
|
}
|
|
@@ -204,6 +259,7 @@ function runPeriodicSanitiseForProject(globalDb, projectDb, projectPath, dryRun)
|
|
|
204
259
|
releasedTaskLocks: 0,
|
|
205
260
|
releasedSectionLocks: 0,
|
|
206
261
|
recoveredDisputedTasks: 0,
|
|
262
|
+
recoveredFailedTasks: 0,
|
|
207
263
|
};
|
|
208
264
|
}
|
|
209
265
|
if (!shouldRunPeriodicSanitise(globalDb, projectPath, settings.intervalMinutes)) {
|
|
@@ -216,6 +272,7 @@ function runPeriodicSanitiseForProject(globalDb, projectDb, projectPath, dryRun)
|
|
|
216
272
|
releasedTaskLocks: 0,
|
|
217
273
|
releasedSectionLocks: 0,
|
|
218
274
|
recoveredDisputedTasks: 0,
|
|
275
|
+
recoveredFailedTasks: 0,
|
|
219
276
|
};
|
|
220
277
|
}
|
|
221
278
|
const summary = sanitiseProjectState(globalDb, projectDb, projectPath, dryRun, settings.staleInvocationTimeoutSec);
|
|
@@ -230,6 +287,7 @@ function sanitisedActionCount(summary) {
|
|
|
230
287
|
summary.closedStaleInvocations +
|
|
231
288
|
summary.releasedTaskLocks +
|
|
232
289
|
summary.releasedSectionLocks +
|
|
233
|
-
summary.recoveredDisputedTasks
|
|
290
|
+
summary.recoveredDisputedTasks +
|
|
291
|
+
summary.recoveredFailedTasks);
|
|
234
292
|
}
|
|
235
293
|
//# sourceMappingURL=wakeup-sanitise.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wakeup-sanitise.js","sourceRoot":"","sources":["../../src/runners/wakeup-sanitise.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"wakeup-sanitise.js","sourceRoot":"","sources":["../../src/runners/wakeup-sanitise.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,14 @@ export declare function pushWithRetries(cwd: string, remote: string, refspec: st
|
|
|
42
42
|
success: boolean;
|
|
43
43
|
error?: string;
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Async version of pushWithRetries — uses setTimeout instead of busy-wait
|
|
47
|
+
* so heartbeat timers can fire during backoff delays.
|
|
48
|
+
*/
|
|
49
|
+
export declare function pushWithRetriesAsync(cwd: string, remote: string, refspec: string, retries?: number, backoffMs?: number[], forceWithLease?: boolean): Promise<{
|
|
50
|
+
success: boolean;
|
|
51
|
+
error?: string;
|
|
52
|
+
}>;
|
|
45
53
|
/**
|
|
46
54
|
* Check if `ancestor` is an ancestor of `descendant`.
|
|
47
55
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-helpers.d.ts","sourceRoot":"","sources":["../../src/workspace/git-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"git-helpers.d.ts","sourceRoot":"","sources":["../../src/workspace/git-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,cAAc,GACvB,MAAM,GAAG,IAAI,CAef;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,EACnB,SAAS,GAAE,MAAM,EAAwB,EACzC,cAAc,GAAE,OAAe,GAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmCtC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,EACnB,SAAS,GAAE,MAAM,EAAwB,EACzC,cAAc,GAAE,OAAe,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE"}
|
|
@@ -10,12 +10,15 @@ exports.hasMidRebase = hasMidRebase;
|
|
|
10
10
|
exports.abortRebase = abortRebase;
|
|
11
11
|
exports.resolveBaseBranch = resolveBaseBranch;
|
|
12
12
|
exports.pushWithRetries = pushWithRetries;
|
|
13
|
+
exports.pushWithRetriesAsync = pushWithRetriesAsync;
|
|
13
14
|
exports.isAncestor = isAncestor;
|
|
14
15
|
exports.getStatusPorcelain = getStatusPorcelain;
|
|
15
16
|
exports.getLogOneline = getLogOneline;
|
|
16
17
|
const node_child_process_1 = require("node:child_process");
|
|
17
18
|
const node_fs_1 = require("node:fs");
|
|
18
19
|
const node_path_1 = require("node:path");
|
|
20
|
+
const node_util_1 = require("node:util");
|
|
21
|
+
const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
19
22
|
/**
|
|
20
23
|
* Run a git command synchronously. Returns trimmed stdout on success.
|
|
21
24
|
* Throws on non-zero exit unless `tolerateFailure` is set.
|
|
@@ -109,6 +112,37 @@ function pushWithRetries(cwd, remote, refspec, retries = 3, backoffMs = [1000, 4
|
|
|
109
112
|
}
|
|
110
113
|
return { success: false, error: `Push failed after ${retries} attempts: ${lastError}` };
|
|
111
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Async version of pushWithRetries — uses setTimeout instead of busy-wait
|
|
117
|
+
* so heartbeat timers can fire during backoff delays.
|
|
118
|
+
*/
|
|
119
|
+
async function pushWithRetriesAsync(cwd, remote, refspec, retries = 3, backoffMs = [1000, 4000, 16000], forceWithLease = false) {
|
|
120
|
+
const pushArgs = ['push', remote, refspec];
|
|
121
|
+
if (forceWithLease) {
|
|
122
|
+
pushArgs.push('--force-with-lease');
|
|
123
|
+
}
|
|
124
|
+
let lastError = '';
|
|
125
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
126
|
+
try {
|
|
127
|
+
await execFileAsync('git', pushArgs, {
|
|
128
|
+
cwd,
|
|
129
|
+
encoding: 'utf-8',
|
|
130
|
+
timeout: 120_000,
|
|
131
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
|
|
132
|
+
});
|
|
133
|
+
return { success: true };
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
+
const stderr = err?.stderr ?? '';
|
|
138
|
+
lastError = stderr.trim() || msg;
|
|
139
|
+
}
|
|
140
|
+
if (attempt < retries - 1 && attempt < backoffMs.length) {
|
|
141
|
+
await new Promise(r => setTimeout(r, backoffMs[attempt]));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { success: false, error: `Push failed after ${retries} attempts: ${lastError}` };
|
|
145
|
+
}
|
|
112
146
|
/**
|
|
113
147
|
* Check if `ancestor` is an ancestor of `descendant`.
|
|
114
148
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-helpers.js","sourceRoot":"","sources":["../../src/workspace/git-helpers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;
|
|
1
|
+
{"version":3,"file":"git-helpers.js","sourceRoot":"","sources":["../../src/workspace/git-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
import type Database from 'better-sqlite3';
|
|
8
8
|
/**
|
|
9
9
|
* Attempt to acquire the merge lock for a project.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
*
|
|
11
|
+
* When `tryOnce` is true, makes a single attempt and returns immediately.
|
|
12
|
+
* Otherwise polls every `pollMs` until `timeoutMs` elapses.
|
|
13
|
+
* Reclaims stale locks older than 90 seconds.
|
|
12
14
|
*
|
|
13
15
|
* Returns true if the lock was acquired.
|
|
14
16
|
*/
|
|
15
|
-
export declare function acquireWorkspaceMergeLock(globalDb: Database.Database, projectId: string, runnerId: string, slotId: number, timeoutMs?: number, pollMs?: number): boolean;
|
|
17
|
+
export declare function acquireWorkspaceMergeLock(globalDb: Database.Database, projectId: string, runnerId: string, slotId: number, timeoutMs?: number, pollMs?: number, tryOnce?: boolean): boolean;
|
|
16
18
|
/**
|
|
17
19
|
* Release the merge lock for a project.
|
|
18
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-lock.d.ts","sourceRoot":"","sources":["../../src/workspace/merge-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-lock.d.ts","sourceRoot":"","sources":["../../src/workspace/merge-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAgB,EAC3B,MAAM,GAAE,MAAc,EACtB,OAAO,GAAE,OAAe,GACvB,OAAO,CA8DT;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,SAAS,EAAE,MAAM,GAChB,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,IAAI,CAQN"}
|
|
@@ -9,37 +9,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.acquireWorkspaceMergeLock = acquireWorkspaceMergeLock;
|
|
10
10
|
exports.releaseWorkspaceMergeLock = releaseWorkspaceMergeLock;
|
|
11
11
|
exports.refreshWorkspaceMergeLockHeartbeat = refreshWorkspaceMergeLockHeartbeat;
|
|
12
|
+
const STALE_LOCK_TTL_MS = 90_000; // 90s — merge queue uses heartbeats, so stale = missed ~3 heartbeat cycles
|
|
12
13
|
/**
|
|
13
14
|
* Attempt to acquire the merge lock for a project.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
15
|
+
*
|
|
16
|
+
* When `tryOnce` is true, makes a single attempt and returns immediately.
|
|
17
|
+
* Otherwise polls every `pollMs` until `timeoutMs` elapses.
|
|
18
|
+
* Reclaims stale locks older than 90 seconds.
|
|
16
19
|
*
|
|
17
20
|
* Returns true if the lock was acquired.
|
|
18
21
|
*/
|
|
19
|
-
function acquireWorkspaceMergeLock(globalDb, projectId, runnerId, slotId, timeoutMs = 300_000, pollMs = 5_000) {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
while (Date.now() < deadline) {
|
|
23
|
-
const acquired = globalDb.transaction(() => {
|
|
24
|
-
// Check for existing lock
|
|
22
|
+
function acquireWorkspaceMergeLock(globalDb, projectId, runnerId, slotId, timeoutMs = 300_000, pollMs = 5_000, tryOnce = false) {
|
|
23
|
+
const attemptAcquire = () => {
|
|
24
|
+
return globalDb.transaction(() => {
|
|
25
25
|
const existing = globalDb
|
|
26
26
|
.prepare('SELECT * FROM workspace_merge_locks WHERE project_id = ?')
|
|
27
27
|
.get(projectId);
|
|
28
28
|
if (existing) {
|
|
29
|
-
// Check if stale
|
|
30
29
|
const age = Date.now() - existing.heartbeat_at;
|
|
31
30
|
if (age > STALE_LOCK_TTL_MS) {
|
|
32
|
-
// Reclaim stale lock
|
|
33
31
|
globalDb
|
|
34
32
|
.prepare('DELETE FROM workspace_merge_locks WHERE id = ?')
|
|
35
33
|
.run(existing.id);
|
|
36
34
|
}
|
|
37
35
|
else {
|
|
38
|
-
// Lock is held by another runner
|
|
39
36
|
return false;
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
|
-
// Insert new lock
|
|
43
39
|
const now = Date.now();
|
|
44
40
|
try {
|
|
45
41
|
globalDb
|
|
@@ -51,15 +47,20 @@ function acquireWorkspaceMergeLock(globalDb, projectId, runnerId, slotId, timeou
|
|
|
51
47
|
}
|
|
52
48
|
catch (error) {
|
|
53
49
|
if (error.message?.includes('UNIQUE constraint')) {
|
|
54
|
-
return false;
|
|
50
|
+
return false;
|
|
55
51
|
}
|
|
56
52
|
throw error;
|
|
57
53
|
}
|
|
58
54
|
}).immediate();
|
|
59
|
-
|
|
55
|
+
};
|
|
56
|
+
if (tryOnce) {
|
|
57
|
+
return attemptAcquire();
|
|
58
|
+
}
|
|
59
|
+
const deadline = Date.now() + timeoutMs;
|
|
60
|
+
while (Date.now() < deadline) {
|
|
61
|
+
if (attemptAcquire()) {
|
|
60
62
|
return true;
|
|
61
63
|
}
|
|
62
|
-
// Wait before retrying
|
|
63
64
|
const remaining = deadline - Date.now();
|
|
64
65
|
if (remaining <= 0)
|
|
65
66
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-lock.js","sourceRoot":"","sources":["../../src/workspace/merge-lock.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"merge-lock.js","sourceRoot":"","sources":["../../src/workspace/merge-lock.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAeH,8DAsEC;AAKD,8DAOC;AAMD,gFAYC;AA/GD,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,2EAA2E;AAE7G;;;;;;;;GAQG;AACH,SAAgB,yBAAyB,CACvC,QAA2B,EAC3B,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,YAAoB,OAAO,EAC3B,SAAiB,KAAK,EACtB,UAAmB,KAAK;IAExB,MAAM,cAAc,GAAG,GAAY,EAAE;QACnC,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;YAC/B,MAAM,QAAQ,GAAG,QAAQ;iBACtB,OAAO,CAAC,0DAA0D,CAAC;iBACnE,GAAG,CAAC,SAAS,CAIH,CAAC;YAEd,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC;gBAC/C,IAAI,GAAG,GAAG,iBAAiB,EAAE,CAAC;oBAC5B,QAAQ;yBACL,OAAO,CAAC,gDAAgD,CAAC;yBACzD,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ;qBACL,OAAO,CACN;;oCAEwB,CACzB;qBACA,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBACjD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,SAAS,IAAI,CAAC;YAAE,MAAM;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;YACxB,gDAAgD;QAClD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CACvC,QAA2B,EAC3B,SAAiB;IAEjB,QAAQ;SACL,OAAO,CAAC,wDAAwD,CAAC;SACjE,GAAG,CAAC,SAAS,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,kCAAkC,CAChD,QAA2B,EAC3B,SAAiB,EACjB,QAAgB;IAEhB,QAAQ;SACL,OAAO,CACN;;8CAEwC,CACzC;SACA,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- UP
|
|
2
|
+
ALTER TABLE tasks ADD COLUMN merge_phase TEXT;
|
|
3
|
+
ALTER TABLE tasks ADD COLUMN approved_sha TEXT;
|
|
4
|
+
ALTER TABLE tasks ADD COLUMN rebase_attempts INTEGER DEFAULT 0;
|
|
5
|
+
|
|
6
|
+
-- DOWN
|
|
7
|
+
-- SQLite does not support DROP COLUMN; these columns are nullable/defaulted
|
|
8
|
+
-- and harmless if left in place after rollback.
|
package/migrations/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.2.3",
|
|
3
|
-
"latestDbVersion":
|
|
3
|
+
"latestDbVersion": 28,
|
|
4
4
|
"migrations": [
|
|
5
5
|
{
|
|
6
6
|
"id": 1,
|
|
@@ -217,6 +217,14 @@
|
|
|
217
217
|
"description": "Add task_dependencies table for explicit task-level dependency tracking",
|
|
218
218
|
"checksum": "",
|
|
219
219
|
"cliVersion": "0.12.7"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": 28,
|
|
223
|
+
"name": "028_add_merge_queue_fields",
|
|
224
|
+
"file": "028_add_merge_queue_fields.sql",
|
|
225
|
+
"description": "Add merge_phase, approved_sha, rebase_attempts columns for merge queue pipeline",
|
|
226
|
+
"checksum": "",
|
|
227
|
+
"cliVersion": "0.14.3"
|
|
220
228
|
}
|
|
221
229
|
]
|
|
222
230
|
}
|