steroids-cli 0.17.1 → 0.18.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/README.md +8 -0
- package/dist/commands/loop-phases-coder-decision.d.ts.map +1 -1
- package/dist/commands/loop-phases-coder-decision.js +2 -1
- package/dist/commands/loop-phases-coder-decision.js.map +1 -1
- package/dist/commands/loop-phases-helpers.d.ts.map +1 -1
- package/dist/commands/loop-phases-helpers.js.map +1 -1
- package/dist/commands/loop-phases-reviewer.d.ts.map +1 -1
- package/dist/commands/loop-phases-reviewer.js +18 -39
- package/dist/commands/loop-phases-reviewer.js.map +1 -1
- package/dist/commands/monitor-respond.d.ts.map +1 -1
- package/dist/commands/monitor-respond.js +15 -2
- package/dist/commands/monitor-respond.js.map +1 -1
- package/dist/commands/monitor.d.ts +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +41 -6
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/reviewer-preflight.d.ts.map +1 -1
- package/dist/commands/reviewer-preflight.js +8 -64
- package/dist/commands/reviewer-preflight.js.map +1 -1
- package/dist/commands/sections-delete.d.ts.map +1 -1
- package/dist/commands/sections-delete.js +16 -1
- package/dist/commands/sections-delete.js.map +1 -1
- package/dist/commands/task-runtime-cleanup.d.ts +13 -0
- package/dist/commands/task-runtime-cleanup.d.ts.map +1 -0
- package/dist/commands/task-runtime-cleanup.js +134 -0
- package/dist/commands/task-runtime-cleanup.js.map +1 -0
- package/dist/commands/tasks-reset.d.ts.map +1 -1
- package/dist/commands/tasks-reset.js +20 -52
- package/dist/commands/tasks-reset.js.map +1 -1
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +10 -68
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/web.d.ts +1 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +6 -1
- package/dist/commands/web.js.map +1 -1
- package/dist/database/queries.d.ts.map +1 -1
- package/dist/database/queries.js +3 -0
- package/dist/database/queries.js.map +1 -1
- package/dist/git/section-pr.d.ts +4 -3
- package/dist/git/section-pr.d.ts.map +1 -1
- package/dist/git/section-pr.js +8 -15
- package/dist/git/section-pr.js.map +1 -1
- package/dist/intake/reviewer-approval.d.ts +5 -1
- package/dist/intake/reviewer-approval.d.ts.map +1 -1
- package/dist/intake/reviewer-approval.js +90 -15
- package/dist/intake/reviewer-approval.js.map +1 -1
- package/dist/monitor/investigator-agent.d.ts +2 -1
- package/dist/monitor/investigator-agent.d.ts.map +1 -1
- package/dist/monitor/investigator-agent.js +26 -6
- package/dist/monitor/investigator-agent.js.map +1 -1
- package/dist/monitor/investigator-prompt.d.ts +2 -1
- package/dist/monitor/investigator-prompt.d.ts.map +1 -1
- package/dist/monitor/investigator-prompt.js +110 -69
- package/dist/monitor/investigator-prompt.js.map +1 -1
- package/dist/monitor/loop.d.ts.map +1 -1
- package/dist/monitor/loop.js +63 -7
- package/dist/monitor/loop.js.map +1 -1
- package/dist/monitor/response-mode.d.ts +38 -0
- package/dist/monitor/response-mode.d.ts.map +1 -0
- package/dist/monitor/response-mode.js +189 -0
- package/dist/monitor/response-mode.js.map +1 -0
- package/dist/orchestrator/approval-effects-replay.d.ts +17 -0
- package/dist/orchestrator/approval-effects-replay.d.ts.map +1 -0
- package/dist/orchestrator/approval-effects-replay.js +55 -0
- package/dist/orchestrator/approval-effects-replay.js.map +1 -0
- package/dist/orchestrator/automated-approval-effects.d.ts +26 -0
- package/dist/orchestrator/automated-approval-effects.d.ts.map +1 -0
- package/dist/orchestrator/automated-approval-effects.js +294 -0
- package/dist/orchestrator/automated-approval-effects.js.map +1 -0
- package/dist/orchestrator/merge-queue-completion.d.ts +12 -0
- package/dist/orchestrator/merge-queue-completion.d.ts.map +1 -0
- package/dist/orchestrator/merge-queue-completion.js +33 -0
- package/dist/orchestrator/merge-queue-completion.js.map +1 -0
- package/dist/orchestrator/merge-queue.d.ts +8 -1
- package/dist/orchestrator/merge-queue.d.ts.map +1 -1
- package/dist/orchestrator/merge-queue.js +48 -13
- package/dist/orchestrator/merge-queue.js.map +1 -1
- package/dist/orchestrator/reviewer-approval-outcome.d.ts +26 -0
- package/dist/orchestrator/reviewer-approval-outcome.d.ts.map +1 -0
- package/dist/orchestrator/reviewer-approval-outcome.js +52 -0
- package/dist/orchestrator/reviewer-approval-outcome.js.map +1 -0
- package/dist/orchestrator/reviewer-policy.d.ts +12 -0
- package/dist/orchestrator/reviewer-policy.d.ts.map +1 -0
- package/dist/orchestrator/reviewer-policy.js +53 -0
- package/dist/orchestrator/reviewer-policy.js.map +1 -0
- package/dist/orchestrator/reviewer.d.ts +4 -19
- package/dist/orchestrator/reviewer.d.ts.map +1 -1
- package/dist/orchestrator/reviewer.js +14 -63
- package/dist/orchestrator/reviewer.js.map +1 -1
- package/dist/orchestrator/section-completion.d.ts +9 -0
- package/dist/orchestrator/section-completion.d.ts.map +1 -0
- package/dist/orchestrator/section-completion.js +22 -0
- package/dist/orchestrator/section-completion.js.map +1 -0
- package/dist/orchestrator/submission-context.d.ts +30 -0
- package/dist/orchestrator/submission-context.d.ts.map +1 -0
- package/dist/orchestrator/submission-context.js +124 -0
- package/dist/orchestrator/submission-context.js.map +1 -0
- package/dist/runners/global-db-connection.d.ts.map +1 -1
- package/dist/runners/global-db-connection.js +21 -0
- package/dist/runners/global-db-connection.js.map +1 -1
- package/dist/runners/global-db-schema-migrations-v21.d.ts +3 -2
- package/dist/runners/global-db-schema-migrations-v21.d.ts.map +1 -1
- package/dist/runners/global-db-schema-migrations-v21.js +8 -3
- package/dist/runners/global-db-schema-migrations-v21.js.map +1 -1
- package/dist/runners/global-db-schema.d.ts +2 -1
- package/dist/runners/global-db-schema.d.ts.map +1 -1
- package/dist/runners/global-db-schema.js +6 -1
- package/dist/runners/global-db-schema.js.map +1 -1
- package/dist/runners/wakeup-project.d.ts.map +1 -1
- package/dist/runners/wakeup-project.js +9 -1
- package/dist/runners/wakeup-project.js.map +1 -1
- package/dist/runners/wakeup-sanitise-recovery.d.ts +1 -1
- package/dist/runners/wakeup-sanitise-recovery.d.ts.map +1 -1
- package/dist/runners/wakeup-sanitise-recovery.js +26 -15
- package/dist/runners/wakeup-sanitise-recovery.js.map +1 -1
- 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 +5 -5
- package/dist/runners/wakeup-sanitise.js.map +1 -1
- package/package.json +28 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-mode.js","sourceRoot":"","sources":["../../src/monitor/response-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IntakePipelineTransition } from '../intake/pipeline-glue.js';
|
|
2
|
+
import type { IntakeSource } from '../intake/types.js';
|
|
3
|
+
export interface IntakeApprovalReplayInput {
|
|
4
|
+
kind: 'intake';
|
|
5
|
+
source: IntakeSource;
|
|
6
|
+
externalId: string;
|
|
7
|
+
phase: 'triage' | 'reproduction';
|
|
8
|
+
currentTaskTitle: string;
|
|
9
|
+
transition: IntakePipelineTransition;
|
|
10
|
+
}
|
|
11
|
+
export interface ApprovalEffectsReplayInput {
|
|
12
|
+
version: 1;
|
|
13
|
+
intake?: IntakeApprovalReplayInput;
|
|
14
|
+
}
|
|
15
|
+
export declare function createEmptyApprovalEffectsReplayInput(): ApprovalEffectsReplayInput;
|
|
16
|
+
export declare function parseApprovalEffectsReplayInput(value: unknown): ApprovalEffectsReplayInput;
|
|
17
|
+
//# sourceMappingURL=approval-effects-replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-effects-replay.d.ts","sourceRoot":"","sources":["../../src/orchestrator/approval-effects-replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,cAAc,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC;AA6CD,wBAAgB,qCAAqC,IAAI,0BAA0B,CAElF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAkB1F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEmptyApprovalEffectsReplayInput = createEmptyApprovalEffectsReplayInput;
|
|
4
|
+
exports.parseApprovalEffectsReplayInput = parseApprovalEffectsReplayInput;
|
|
5
|
+
function isPlainObject(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function isTransition(value) {
|
|
9
|
+
if (!isPlainObject(value)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (value.action === 'complete') {
|
|
13
|
+
return ((value.phase === 'triage' || value.phase === 'reproduction') &&
|
|
14
|
+
typeof value.summary === 'string' &&
|
|
15
|
+
typeof value.resolutionCode === 'string' &&
|
|
16
|
+
(value.comment === undefined || typeof value.comment === 'string'));
|
|
17
|
+
}
|
|
18
|
+
return ((value.action === 'advance' || value.action === 'retry') &&
|
|
19
|
+
(value.phase === 'triage' || value.phase === 'reproduction') &&
|
|
20
|
+
(value.nextPhase === 'reproduction' || value.nextPhase === 'fix') &&
|
|
21
|
+
typeof value.summary === 'string' &&
|
|
22
|
+
(value.comment === undefined || typeof value.comment === 'string') &&
|
|
23
|
+
(value.nextTaskTitle === undefined || typeof value.nextTaskTitle === 'string'));
|
|
24
|
+
}
|
|
25
|
+
function isIntakeReplayInput(value) {
|
|
26
|
+
if (!isPlainObject(value)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return (value.kind === 'intake' &&
|
|
30
|
+
(value.source === 'github' || value.source === 'sentry') &&
|
|
31
|
+
typeof value.externalId === 'string' &&
|
|
32
|
+
(value.phase === 'triage' || value.phase === 'reproduction') &&
|
|
33
|
+
typeof value.currentTaskTitle === 'string' &&
|
|
34
|
+
isTransition(value.transition));
|
|
35
|
+
}
|
|
36
|
+
function createEmptyApprovalEffectsReplayInput() {
|
|
37
|
+
return { version: 1 };
|
|
38
|
+
}
|
|
39
|
+
function parseApprovalEffectsReplayInput(value) {
|
|
40
|
+
if (!isPlainObject(value)) {
|
|
41
|
+
throw new Error('Approval effects replay input must be an object');
|
|
42
|
+
}
|
|
43
|
+
if (value.version !== 1) {
|
|
44
|
+
throw new Error(`Unsupported approval effects replay input version: ${String(value.version)}`);
|
|
45
|
+
}
|
|
46
|
+
if (value.intake !== undefined && !isIntakeReplayInput(value.intake)) {
|
|
47
|
+
throw new Error('Approval effects replay input contains invalid intake metadata');
|
|
48
|
+
}
|
|
49
|
+
const replayInput = { version: 1 };
|
|
50
|
+
if (value.intake) {
|
|
51
|
+
replayInput.intake = value.intake;
|
|
52
|
+
}
|
|
53
|
+
return replayInput;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=approval-effects-replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-effects-replay.js","sourceRoot":"","sources":["../../src/orchestrator/approval-effects-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { SteroidsConfig } from '../config/loader.js';
|
|
3
|
+
import { type Task } from '../database/queries.js';
|
|
4
|
+
import { type ApprovalEffectsReplayInput } from './approval-effects-replay.js';
|
|
5
|
+
interface AutomatedApprovalTask extends Pick<Task, 'id' | 'title' | 'source_file' | 'section_id'> {
|
|
6
|
+
}
|
|
7
|
+
export interface AutomatedApprovalEffectOptions {
|
|
8
|
+
config: SteroidsConfig;
|
|
9
|
+
projectPath: string;
|
|
10
|
+
intakeProjectPath?: string;
|
|
11
|
+
hooksEnabled?: boolean;
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildApprovalEffectsReplayInput(task: AutomatedApprovalTask, projectPath: string): ApprovalEffectsReplayInput;
|
|
15
|
+
export declare function markApprovalEffectsPending(db: Database.Database, taskId: string, actor: string, replayInput: ApprovalEffectsReplayInput): void;
|
|
16
|
+
export declare function runPendingApprovalEffects(db: Database.Database, task: AutomatedApprovalTask, options: AutomatedApprovalEffectOptions, replayInput: ApprovalEffectsReplayInput, actor?: string): Promise<void>;
|
|
17
|
+
export declare function completeTaskWithApprovalEffects(db: Database.Database, task: AutomatedApprovalTask, options: AutomatedApprovalEffectOptions & {
|
|
18
|
+
actor: string;
|
|
19
|
+
notes: string;
|
|
20
|
+
commitSha?: string;
|
|
21
|
+
replayInput?: ApprovalEffectsReplayInput;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare function reconcilePendingApprovalEffects(db: Database.Database, options: AutomatedApprovalEffectOptions): Promise<number>;
|
|
24
|
+
export declare function loadQueuedApprovalEffectsReplayInput(db: Database.Database, taskId: string): ApprovalEffectsReplayInput | null;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=automated-approval-effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automated-approval-effects.d.ts","sourceRoot":"","sources":["../../src/orchestrator/automated-approval-effects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAML,KAAK,IAAI,EAEV,MAAM,wBAAwB,CAAC;AAYhC,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,8BAA8B,CAAC;AAGtC,UAAU,qBAAsB,SAAQ,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC;CAAG;AAEpG,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwPD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,qBAAqB,EAC3B,WAAW,EAAE,MAAM,GAClB,0BAA0B,CAK5B;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,0BAA0B,GACtC,IAAI,CAON;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,8BAA8B,EACvC,WAAW,EAAE,0BAA0B,EACvC,KAAK,SAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,8BAA8B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,0BAA0B,CAAC;CAC1C,GACA,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,MAAM,CAAC,CAsFjB;AAED,wBAAgB,oCAAoC,CAClD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,GACb,0BAA0B,GAAG,IAAI,CAEnC"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildApprovalEffectsReplayInput = buildApprovalEffectsReplayInput;
|
|
4
|
+
exports.markApprovalEffectsPending = markApprovalEffectsPending;
|
|
5
|
+
exports.runPendingApprovalEffects = runPendingApprovalEffects;
|
|
6
|
+
exports.completeTaskWithApprovalEffects = completeTaskWithApprovalEffects;
|
|
7
|
+
exports.reconcilePendingApprovalEffects = reconcilePendingApprovalEffects;
|
|
8
|
+
exports.loadQueuedApprovalEffectsReplayInput = loadQueuedApprovalEffectsReplayInput;
|
|
9
|
+
const queries_js_1 = require("../database/queries.js");
|
|
10
|
+
const section_pr_js_1 = require("../git/section-pr.js");
|
|
11
|
+
const integration_js_1 = require("../hooks/integration.js");
|
|
12
|
+
const reviewer_approval_js_1 = require("../intake/reviewer-approval.js");
|
|
13
|
+
const task_reference_js_1 = require("../intake/task-reference.js");
|
|
14
|
+
const approval_effects_replay_js_1 = require("./approval-effects-replay.js");
|
|
15
|
+
const section_completion_js_1 = require("./section-completion.js");
|
|
16
|
+
const CATEGORY_APPROVAL_EFFECTS_PENDING = 'approval_effects_pending';
|
|
17
|
+
const CATEGORY_APPROVAL_EFFECTS_APPLIED = 'approval_effects_applied';
|
|
18
|
+
const CATEGORY_APPROVAL_EFFECT_STEP_APPLIED = 'approval_effect_step_applied';
|
|
19
|
+
const CATEGORY_APPROVAL_EFFECTS_MIGRATION_ANOMALY = 'approval_effects_migration_anomaly';
|
|
20
|
+
function hasAuditCategory(db, taskId, category) {
|
|
21
|
+
const row = db
|
|
22
|
+
.prepare(`SELECT 1
|
|
23
|
+
FROM audit
|
|
24
|
+
WHERE task_id = ?
|
|
25
|
+
AND category = ?
|
|
26
|
+
LIMIT 1`)
|
|
27
|
+
.get(taskId, category);
|
|
28
|
+
return Boolean(row);
|
|
29
|
+
}
|
|
30
|
+
function getAppliedEffectSteps(db, taskId) {
|
|
31
|
+
const rows = db
|
|
32
|
+
.prepare(`SELECT metadata
|
|
33
|
+
FROM audit
|
|
34
|
+
WHERE task_id = ?
|
|
35
|
+
AND category = ?
|
|
36
|
+
ORDER BY id ASC`)
|
|
37
|
+
.all(taskId, CATEGORY_APPROVAL_EFFECT_STEP_APPLIED);
|
|
38
|
+
const steps = new Set();
|
|
39
|
+
for (const row of rows) {
|
|
40
|
+
if (!row.metadata) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(row.metadata);
|
|
45
|
+
if (parsed.step) {
|
|
46
|
+
steps.add(parsed.step);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Ignore corrupt historical metadata and keep replay deterministic.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return steps;
|
|
54
|
+
}
|
|
55
|
+
function markEffectStepApplied(db, taskId, actor, step) {
|
|
56
|
+
(0, queries_js_1.addAuditEntry)(db, taskId, 'completed', 'completed', actor, {
|
|
57
|
+
actorType: 'orchestrator',
|
|
58
|
+
category: CATEGORY_APPROVAL_EFFECT_STEP_APPLIED,
|
|
59
|
+
notes: `[approval_effects] Applied step: ${step}`,
|
|
60
|
+
metadata: { step },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function loadReplayInputFromCategory(db, taskId, category) {
|
|
64
|
+
const row = db
|
|
65
|
+
.prepare(`SELECT metadata
|
|
66
|
+
FROM audit
|
|
67
|
+
WHERE task_id = ?
|
|
68
|
+
AND category = ?
|
|
69
|
+
ORDER BY created_at DESC, id DESC
|
|
70
|
+
LIMIT 1`)
|
|
71
|
+
.get(taskId, category);
|
|
72
|
+
if (!row?.metadata) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return (0, approval_effects_replay_js_1.parseApprovalEffectsReplayInput)(JSON.parse(row.metadata));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`Invalid approval effects replay metadata for task ${taskId} (${category}): ${error instanceof Error ? error.message : String(error)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function loadReplayInputFromMergePending(db, taskId) {
|
|
83
|
+
const row = db
|
|
84
|
+
.prepare(`SELECT metadata
|
|
85
|
+
FROM audit
|
|
86
|
+
WHERE task_id = ?
|
|
87
|
+
AND to_status = 'merge_pending'
|
|
88
|
+
ORDER BY created_at DESC, id DESC
|
|
89
|
+
LIMIT 1`)
|
|
90
|
+
.get(taskId);
|
|
91
|
+
if (!row?.metadata) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const parsed = JSON.parse(row.metadata);
|
|
96
|
+
if (!parsed.approval_effects_replay) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return (0, approval_effects_replay_js_1.parseApprovalEffectsReplayInput)(parsed.approval_effects_replay);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new Error(`Invalid merge_pending approval replay metadata for task ${taskId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function allProjectTasksCompleted(db) {
|
|
106
|
+
const allTasks = (0, queries_js_1.listTasks)(db, { status: 'all' });
|
|
107
|
+
return allTasks.length > 0 && allTasks.every((task) => task.status === 'completed');
|
|
108
|
+
}
|
|
109
|
+
async function maybeTriggerSectionCompletion(db, task, options, actor, appliedSteps) {
|
|
110
|
+
if (appliedSteps.has('section_completion') || !task.section_id) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const section = (0, queries_js_1.getSection)(db, task.section_id);
|
|
114
|
+
if (!section) {
|
|
115
|
+
markEffectStepApplied(db, task.id, actor, 'section_completion');
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const sectionTasks = (0, queries_js_1.listTasks)(db, { sectionId: task.section_id });
|
|
119
|
+
const state = (0, section_completion_js_1.getSectionCompletionState)(sectionTasks);
|
|
120
|
+
if (state.done && !appliedSteps.has('section_completed_hook')) {
|
|
121
|
+
if (options.hooksEnabled !== false) {
|
|
122
|
+
await (0, integration_js_1.triggerSectionCompleted)({
|
|
123
|
+
id: section.id,
|
|
124
|
+
name: section.name,
|
|
125
|
+
taskCount: sectionTasks.length,
|
|
126
|
+
}, sectionTasks.map((entry) => ({ id: entry.id, title: entry.title })), { verbose: options.verbose, projectPath: options.projectPath });
|
|
127
|
+
}
|
|
128
|
+
markEffectStepApplied(db, task.id, actor, 'section_completed_hook');
|
|
129
|
+
}
|
|
130
|
+
await (0, section_pr_js_1.checkSectionCompletionAndPR)(db, options.projectPath, task.section_id, options.config);
|
|
131
|
+
markEffectStepApplied(db, task.id, actor, 'section_completion');
|
|
132
|
+
}
|
|
133
|
+
async function maybeTriggerProjectCompletion(db, taskId, options, actor, appliedSteps) {
|
|
134
|
+
if (appliedSteps.has('project_completion')) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (allProjectTasksCompleted(db) && options.hooksEnabled !== false) {
|
|
138
|
+
const allTasks = (0, queries_js_1.listTasks)(db, { status: 'all' });
|
|
139
|
+
const sections = (0, queries_js_1.listSections)(db);
|
|
140
|
+
const files = Array.from(new Set(allTasks.map((task) => task.source_file).filter(Boolean)));
|
|
141
|
+
await (0, integration_js_1.triggerProjectCompleted)({
|
|
142
|
+
totalTasks: allTasks.length,
|
|
143
|
+
files,
|
|
144
|
+
sectionCount: sections.length,
|
|
145
|
+
}, { verbose: options.verbose, projectPath: options.projectPath });
|
|
146
|
+
}
|
|
147
|
+
markEffectStepApplied(db, taskId, actor, 'project_completion');
|
|
148
|
+
}
|
|
149
|
+
function noteMigrationAnomaly(db, taskId, actor, reason) {
|
|
150
|
+
const existing = db
|
|
151
|
+
.prepare(`SELECT 1
|
|
152
|
+
FROM audit
|
|
153
|
+
WHERE task_id = ?
|
|
154
|
+
AND category = ?
|
|
155
|
+
AND notes = ?
|
|
156
|
+
LIMIT 1`)
|
|
157
|
+
.get(taskId, CATEGORY_APPROVAL_EFFECTS_MIGRATION_ANOMALY, reason);
|
|
158
|
+
if (existing) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
(0, queries_js_1.addAuditEntry)(db, taskId, 'completed', 'completed', actor, {
|
|
162
|
+
actorType: 'orchestrator',
|
|
163
|
+
category: CATEGORY_APPROVAL_EFFECTS_MIGRATION_ANOMALY,
|
|
164
|
+
notes: reason,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function buildApprovalEffectsReplayInput(task, projectPath) {
|
|
168
|
+
const intakeReplay = (0, reviewer_approval_js_1.buildIntakeApprovalReplayInput)(task, projectPath);
|
|
169
|
+
return intakeReplay
|
|
170
|
+
? { version: 1, intake: intakeReplay }
|
|
171
|
+
: (0, approval_effects_replay_js_1.createEmptyApprovalEffectsReplayInput)();
|
|
172
|
+
}
|
|
173
|
+
function markApprovalEffectsPending(db, taskId, actor, replayInput) {
|
|
174
|
+
(0, queries_js_1.addAuditEntry)(db, taskId, 'completed', 'completed', actor, {
|
|
175
|
+
actorType: 'orchestrator',
|
|
176
|
+
category: CATEGORY_APPROVAL_EFFECTS_PENDING,
|
|
177
|
+
notes: '[approval_effects] Pending replay',
|
|
178
|
+
metadata: replayInput,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async function runPendingApprovalEffects(db, task, options, replayInput, actor = 'orchestrator') {
|
|
182
|
+
const appliedSteps = getAppliedEffectSteps(db, task.id);
|
|
183
|
+
const fullTask = (0, queries_js_1.getTask)(db, task.id);
|
|
184
|
+
if (!fullTask) {
|
|
185
|
+
throw new Error(`Task not found while applying approval effects: ${task.id}`);
|
|
186
|
+
}
|
|
187
|
+
if (!appliedSteps.has('task_completed_hook')) {
|
|
188
|
+
if (options.hooksEnabled !== false) {
|
|
189
|
+
await (0, integration_js_1.triggerTaskCompleted)(fullTask, {
|
|
190
|
+
verbose: options.verbose,
|
|
191
|
+
projectPath: options.projectPath,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
markEffectStepApplied(db, task.id, actor, 'task_completed_hook');
|
|
195
|
+
}
|
|
196
|
+
if (replayInput.intake && !appliedSteps.has('intake')) {
|
|
197
|
+
(0, reviewer_approval_js_1.handleIntakeTaskApproval)(db, task, replayInput.intake);
|
|
198
|
+
markEffectStepApplied(db, task.id, actor, 'intake');
|
|
199
|
+
}
|
|
200
|
+
else if (!replayInput.intake && (0, task_reference_js_1.parseIntakeTaskReference)(task)) {
|
|
201
|
+
noteMigrationAnomaly(db, task.id, actor, '[approval_effects] Intake replay input missing; intake follow-up was not replayed automatically.');
|
|
202
|
+
}
|
|
203
|
+
await maybeTriggerSectionCompletion(db, task, options, actor, appliedSteps);
|
|
204
|
+
await maybeTriggerProjectCompletion(db, task.id, options, actor, appliedSteps);
|
|
205
|
+
if (!hasAuditCategory(db, task.id, CATEGORY_APPROVAL_EFFECTS_APPLIED)) {
|
|
206
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'completed', 'completed', actor, {
|
|
207
|
+
actorType: 'orchestrator',
|
|
208
|
+
category: CATEGORY_APPROVAL_EFFECTS_APPLIED,
|
|
209
|
+
notes: '[approval_effects] Replay applied',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function completeTaskWithApprovalEffects(db, task, options) {
|
|
214
|
+
const currentTask = (0, queries_js_1.getTask)(db, task.id);
|
|
215
|
+
if (!currentTask) {
|
|
216
|
+
throw new Error(`Task not found: ${task.id}`);
|
|
217
|
+
}
|
|
218
|
+
const replayInput = options.replayInput ??
|
|
219
|
+
buildApprovalEffectsReplayInput(task, options.intakeProjectPath ?? options.projectPath);
|
|
220
|
+
db.transaction(() => {
|
|
221
|
+
if (currentTask.status !== 'completed') {
|
|
222
|
+
(0, queries_js_1.updateTaskStatus)(db, task.id, 'completed', options.actor, options.notes, options.commitSha);
|
|
223
|
+
}
|
|
224
|
+
if (!loadReplayInputFromCategory(db, task.id, CATEGORY_APPROVAL_EFFECTS_PENDING)) {
|
|
225
|
+
markApprovalEffectsPending(db, task.id, options.actor, replayInput);
|
|
226
|
+
}
|
|
227
|
+
})();
|
|
228
|
+
await runPendingApprovalEffects(db, task, options, replayInput, options.actor);
|
|
229
|
+
}
|
|
230
|
+
async function reconcilePendingApprovalEffects(db, options) {
|
|
231
|
+
const pendingTasks = db
|
|
232
|
+
.prepare(`WITH latest_pending AS (
|
|
233
|
+
SELECT task_id, MAX(id) AS pending_id
|
|
234
|
+
FROM audit
|
|
235
|
+
WHERE category = ?
|
|
236
|
+
GROUP BY task_id
|
|
237
|
+
),
|
|
238
|
+
latest_applied AS (
|
|
239
|
+
SELECT task_id, MAX(id) AS applied_id
|
|
240
|
+
FROM audit
|
|
241
|
+
WHERE category = ?
|
|
242
|
+
GROUP BY task_id
|
|
243
|
+
)
|
|
244
|
+
SELECT t.id, t.title, t.source_file, t.section_id
|
|
245
|
+
FROM tasks t
|
|
246
|
+
JOIN latest_pending lp ON lp.task_id = t.id
|
|
247
|
+
LEFT JOIN latest_applied la ON la.task_id = t.id
|
|
248
|
+
WHERE t.status = 'completed'
|
|
249
|
+
AND (la.applied_id IS NULL OR la.applied_id < lp.pending_id)`)
|
|
250
|
+
.all(CATEGORY_APPROVAL_EFFECTS_PENDING, CATEGORY_APPROVAL_EFFECTS_APPLIED);
|
|
251
|
+
let replayed = 0;
|
|
252
|
+
for (const task of pendingTasks) {
|
|
253
|
+
const replayInput = loadReplayInputFromCategory(db, task.id, CATEGORY_APPROVAL_EFFECTS_PENDING);
|
|
254
|
+
if (!replayInput) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
await runPendingApprovalEffects(db, task, options, replayInput);
|
|
258
|
+
replayed += 1;
|
|
259
|
+
}
|
|
260
|
+
const legacyCandidates = db
|
|
261
|
+
.prepare(`SELECT t.id, t.title, t.source_file, t.section_id
|
|
262
|
+
FROM tasks t
|
|
263
|
+
WHERE t.status = 'completed'
|
|
264
|
+
AND EXISTS (
|
|
265
|
+
SELECT 1
|
|
266
|
+
FROM audit a
|
|
267
|
+
WHERE a.task_id = t.id
|
|
268
|
+
AND a.to_status = 'completed'
|
|
269
|
+
)
|
|
270
|
+
AND NOT EXISTS (
|
|
271
|
+
SELECT 1
|
|
272
|
+
FROM audit a
|
|
273
|
+
WHERE a.task_id = t.id
|
|
274
|
+
AND a.category IN (?, ?, ?)
|
|
275
|
+
)
|
|
276
|
+
ORDER BY t.updated_at DESC
|
|
277
|
+
LIMIT 100`)
|
|
278
|
+
.all(CATEGORY_APPROVAL_EFFECTS_PENDING, CATEGORY_APPROVAL_EFFECTS_APPLIED, CATEGORY_APPROVAL_EFFECTS_MIGRATION_ANOMALY);
|
|
279
|
+
for (const task of legacyCandidates) {
|
|
280
|
+
if ((0, task_reference_js_1.parseIntakeTaskReference)(task)) {
|
|
281
|
+
noteMigrationAnomaly(db, task.id, 'orchestrator', '[approval_effects] Legacy completed intake task is missing immutable replay input; intake follow-up requires manual verification.');
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const replayInput = (0, approval_effects_replay_js_1.createEmptyApprovalEffectsReplayInput)();
|
|
285
|
+
markApprovalEffectsPending(db, task.id, 'orchestrator', replayInput);
|
|
286
|
+
await runPendingApprovalEffects(db, task, options, replayInput);
|
|
287
|
+
replayed += 1;
|
|
288
|
+
}
|
|
289
|
+
return replayed;
|
|
290
|
+
}
|
|
291
|
+
function loadQueuedApprovalEffectsReplayInput(db, taskId) {
|
|
292
|
+
return loadReplayInputFromMergePending(db, taskId);
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=automated-approval-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automated-approval-effects.js","sourceRoot":"","sources":["../../src/orchestrator/automated-approval-effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { SteroidsConfig } from '../config/loader.js';
|
|
3
|
+
import type { Task } from '../database/queries.js';
|
|
4
|
+
export interface MergeQueueCompletionOptions {
|
|
5
|
+
config: SteroidsConfig;
|
|
6
|
+
projectPath: string;
|
|
7
|
+
intakeProjectPath?: string;
|
|
8
|
+
mergedSha?: string;
|
|
9
|
+
notes: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function completeMergePendingTask(db: Database.Database, task: Pick<Task, 'id' | 'title' | 'source_file' | 'section_id'>, options: MergeQueueCompletionOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=merge-queue-completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-queue-completion.d.ts","sourceRoot":"","sources":["../../src/orchestrator/merge-queue-completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AASnD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC,EAC/D,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.completeMergePendingTask = completeMergePendingTask;
|
|
4
|
+
const queries_js_1 = require("../database/queries.js");
|
|
5
|
+
const automated_approval_effects_js_1 = require("./automated-approval-effects.js");
|
|
6
|
+
const approval_effects_replay_js_1 = require("./approval-effects-replay.js");
|
|
7
|
+
async function completeMergePendingTask(db, task, options) {
|
|
8
|
+
let replayInput = (0, automated_approval_effects_js_1.loadQueuedApprovalEffectsReplayInput)(db, task.id);
|
|
9
|
+
if (!replayInput) {
|
|
10
|
+
try {
|
|
11
|
+
replayInput = (0, automated_approval_effects_js_1.buildApprovalEffectsReplayInput)(task, options.intakeProjectPath ?? options.projectPath);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
replayInput = (0, approval_effects_replay_js_1.createEmptyApprovalEffectsReplayInput)();
|
|
15
|
+
(0, queries_js_1.addAuditEntry)(db, task.id, 'merge_pending', 'merge_pending', 'orchestrator', {
|
|
16
|
+
actorType: 'orchestrator',
|
|
17
|
+
category: 'approval_effects_migration_anomaly',
|
|
18
|
+
notes: '[approval_effects] Missing queued replay input at merge completion; continuing without intake replay: ' +
|
|
19
|
+
(error instanceof Error ? error.message : String(error)),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
await (0, automated_approval_effects_js_1.completeTaskWithApprovalEffects)(db, task, {
|
|
24
|
+
actor: 'orchestrator',
|
|
25
|
+
notes: options.notes,
|
|
26
|
+
commitSha: options.mergedSha,
|
|
27
|
+
config: options.config,
|
|
28
|
+
projectPath: options.projectPath,
|
|
29
|
+
intakeProjectPath: options.intakeProjectPath,
|
|
30
|
+
replayInput,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=merge-queue-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-queue-completion.js","sourceRoot":"","sources":["../../src/orchestrator/merge-queue-completion.ts"],"names":[],"mappings":";;AAmBA,4DA8BC;AA9CD,uDAAuD;AACvD,mFAIyC;AACzC,6EAAqF;AAU9E,KAAK,UAAU,wBAAwB,CAC5C,EAAqB,EACrB,IAA+D,EAC/D,OAAoC;IAEpC,IAAI,WAAW,GAAG,IAAA,oEAAoC,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,WAAW,GAAG,IAAA,+DAA+B,EAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;QACxG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,GAAG,IAAA,kEAAqC,GAAE,CAAC;YACtD,IAAA,0BAAa,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE;gBAC3E,SAAS,EAAE,cAAc;gBACzB,QAAQ,EAAE,oCAAoC;gBAC9C,KAAK,EACH,wGAAwG;oBACxG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAA,+DAA+B,EAAC,EAAE,EAAE,IAAI,EAAE;QAC9C,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -33,8 +33,15 @@ export declare function pushTargetBranch(slotPath: string, targetBranch: string)
|
|
|
33
33
|
error?: string;
|
|
34
34
|
}>;
|
|
35
35
|
export declare function cleanupTaskBranch(slotPath: string, taskBranch: string): void;
|
|
36
|
-
export declare function markCompleted(db: Database.Database,
|
|
36
|
+
export declare function markCompleted(db: Database.Database, task: Pick<Task, 'id' | 'title' | 'source_file' | 'section_id'>, options: {
|
|
37
|
+
config: SteroidsConfig;
|
|
38
|
+
projectPath: string;
|
|
39
|
+
intakeProjectPath?: string;
|
|
40
|
+
mergedSha?: string;
|
|
41
|
+
notes: string;
|
|
42
|
+
}): Promise<void>;
|
|
37
43
|
export declare function transitionToRebasing(db: Database.Database, taskId: string, reason: string): void;
|
|
38
44
|
export declare function handleMergeAttempt(db: Database.Database, task: Task, config: SteroidsConfig, sourceProjectPath: string, runnerId?: string): Promise<void>;
|
|
45
|
+
export declare function resolveRebaseRemoteUrl(globalDb: Database.Database, taskId: string, sourceProjectPath: string): string | null;
|
|
39
46
|
export declare function processMergeQueue(db: Database.Database, task: Task, config: SteroidsConfig, sourceProjectPath: string, runnerId?: string): Promise<void>;
|
|
40
47
|
//# sourceMappingURL=merge-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/merge-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAKnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/merge-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ exports.cleanupTaskBranch = cleanupTaskBranch;
|
|
|
17
17
|
exports.markCompleted = markCompleted;
|
|
18
18
|
exports.transitionToRebasing = transitionToRebasing;
|
|
19
19
|
exports.handleMergeAttempt = handleMergeAttempt;
|
|
20
|
+
exports.resolveRebaseRemoteUrl = resolveRebaseRemoteUrl;
|
|
20
21
|
exports.processMergeQueue = processMergeQueue;
|
|
21
22
|
const node_child_process_1 = require("node:child_process");
|
|
22
23
|
const queries_js_1 = require("../database/queries.js");
|
|
@@ -25,6 +26,7 @@ const pool_js_1 = require("../workspace/pool.js");
|
|
|
25
26
|
const clone_js_1 = require("../parallel/clone.js");
|
|
26
27
|
const git_helpers_js_1 = require("../workspace/git-helpers.js");
|
|
27
28
|
const global_db_js_1 = require("../runners/global-db.js");
|
|
29
|
+
const merge_queue_completion_js_1 = require("./merge-queue-completion.js");
|
|
28
30
|
function classifyPushError(error) {
|
|
29
31
|
const lower = error.toLowerCase();
|
|
30
32
|
if (lower.includes('non-fast-forward') || lower.includes('fetch first') || lower.includes('stale info')) {
|
|
@@ -168,13 +170,13 @@ function cleanupTaskBranch(slotPath, taskBranch) {
|
|
|
168
170
|
// Non-fatal — branch may already be deleted or remote unreachable
|
|
169
171
|
}
|
|
170
172
|
}
|
|
171
|
-
function markCompleted(db,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
173
|
+
async function markCompleted(db, task, options) {
|
|
174
|
+
await (0, merge_queue_completion_js_1.completeMergePendingTask)(db, task, {
|
|
175
|
+
config: options.config,
|
|
176
|
+
projectPath: options.projectPath,
|
|
177
|
+
intakeProjectPath: options.intakeProjectPath,
|
|
178
|
+
mergedSha: options.mergedSha,
|
|
179
|
+
notes: options.notes,
|
|
178
180
|
});
|
|
179
181
|
}
|
|
180
182
|
const MAX_REBASE_ATTEMPTS = 3;
|
|
@@ -210,7 +212,13 @@ async function handleMergeAttempt(db, task, config, sourceProjectPath, runnerId)
|
|
|
210
212
|
// Local-only guard: no remote configured → skip merge queue
|
|
211
213
|
const remoteUrl = (0, pool_js_1.resolveRemoteUrl)(sourceProjectPath);
|
|
212
214
|
if (!remoteUrl) {
|
|
213
|
-
markCompleted(db, task
|
|
215
|
+
await markCompleted(db, task, {
|
|
216
|
+
config,
|
|
217
|
+
projectPath: sourceProjectPath,
|
|
218
|
+
intakeProjectPath: sourceProjectPath,
|
|
219
|
+
mergedSha: approvedSha,
|
|
220
|
+
notes: '[merge_queue] Local-only task completed without remote merge',
|
|
221
|
+
});
|
|
214
222
|
return;
|
|
215
223
|
}
|
|
216
224
|
const projectId = (0, clone_js_1.getProjectHash)(sourceProjectPath);
|
|
@@ -233,7 +241,13 @@ async function handleMergeAttempt(db, task, config, sourceProjectPath, runnerId)
|
|
|
233
241
|
// Step 1: Fetch and prepare
|
|
234
242
|
const prepResult = fetchAndPrepare(slotPath, taskBranch, targetBranch, approvedSha);
|
|
235
243
|
if (prepResult.alreadyMerged) {
|
|
236
|
-
markCompleted(db, task
|
|
244
|
+
await markCompleted(db, task, {
|
|
245
|
+
config,
|
|
246
|
+
projectPath: sourceProjectPath,
|
|
247
|
+
intakeProjectPath: sourceProjectPath,
|
|
248
|
+
mergedSha: approvedSha,
|
|
249
|
+
notes: '[merge_queue] Task branch was already merged; marking completed',
|
|
250
|
+
});
|
|
237
251
|
cleanupTaskBranch(slotPath, taskBranch);
|
|
238
252
|
return;
|
|
239
253
|
}
|
|
@@ -273,7 +287,13 @@ async function handleMergeAttempt(db, task, config, sourceProjectPath, runnerId)
|
|
|
273
287
|
// Step 5: Cleanup task branch (non-fatal)
|
|
274
288
|
cleanupTaskBranch(slotPath, taskBranch);
|
|
275
289
|
// Step 6: Mark completed
|
|
276
|
-
markCompleted(db, task
|
|
290
|
+
await markCompleted(db, task, {
|
|
291
|
+
config,
|
|
292
|
+
projectPath: sourceProjectPath,
|
|
293
|
+
intakeProjectPath: sourceProjectPath,
|
|
294
|
+
mergedSha,
|
|
295
|
+
notes: '[merge_queue] Merge completed successfully',
|
|
296
|
+
});
|
|
277
297
|
}
|
|
278
298
|
finally {
|
|
279
299
|
if (lockAcquired) {
|
|
@@ -295,17 +315,32 @@ async function handleMergeAttempt(db, task, config, sourceProjectPath, runnerId)
|
|
|
295
315
|
}
|
|
296
316
|
}
|
|
297
317
|
// ─── Rebase phase wrapper ────────────────────────────────────────────────────
|
|
318
|
+
function resolveRebaseRemoteUrl(globalDb, taskId, sourceProjectPath) {
|
|
319
|
+
const existingSlot = globalDb
|
|
320
|
+
.prepare(`SELECT remote_url
|
|
321
|
+
FROM workspace_pool_slots
|
|
322
|
+
WHERE task_id = ? AND remote_url IS NOT NULL AND remote_url != ''
|
|
323
|
+
ORDER BY id DESC LIMIT 1`)
|
|
324
|
+
.get(taskId);
|
|
325
|
+
return existingSlot?.remote_url ?? (0, pool_js_1.resolveRemoteUrl)(sourceProjectPath);
|
|
326
|
+
}
|
|
298
327
|
async function handleRebasePhase(db, task, config, sourceProjectPath, phase, runnerId) {
|
|
299
328
|
const { handleRebaseCoder, handleRebaseReview } = await import('./merge-queue-rebase.js');
|
|
300
329
|
const targetBranch = config.git?.branch ?? 'main';
|
|
301
|
-
const
|
|
330
|
+
const gdb = (0, global_db_js_1.openGlobalDatabase)();
|
|
331
|
+
const remoteUrl = resolveRebaseRemoteUrl(gdb.db, task.id, sourceProjectPath);
|
|
302
332
|
if (!remoteUrl) {
|
|
303
333
|
// Local-only — no rebase needed, mark completed
|
|
304
|
-
markCompleted(db, task
|
|
334
|
+
await markCompleted(db, task, {
|
|
335
|
+
config,
|
|
336
|
+
projectPath: sourceProjectPath,
|
|
337
|
+
intakeProjectPath: sourceProjectPath,
|
|
338
|
+
mergedSha: task.approved_sha ?? undefined,
|
|
339
|
+
notes: '[merge_queue] Local-only rebase path completed without remote merge',
|
|
340
|
+
});
|
|
305
341
|
return;
|
|
306
342
|
}
|
|
307
343
|
const projectId = (0, clone_js_1.getProjectHash)(sourceProjectPath);
|
|
308
|
-
const gdb = (0, global_db_js_1.openGlobalDatabase)();
|
|
309
344
|
let slotId;
|
|
310
345
|
try {
|
|
311
346
|
const slot = (0, pool_js_1.claimSlot)(gdb.db, projectId, runnerId ?? `rebase:${process.pid}`, task.id);
|