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.
Files changed (121) hide show
  1. package/README.md +8 -0
  2. package/dist/commands/loop-phases-coder-decision.d.ts.map +1 -1
  3. package/dist/commands/loop-phases-coder-decision.js +2 -1
  4. package/dist/commands/loop-phases-coder-decision.js.map +1 -1
  5. package/dist/commands/loop-phases-helpers.d.ts.map +1 -1
  6. package/dist/commands/loop-phases-helpers.js.map +1 -1
  7. package/dist/commands/loop-phases-reviewer.d.ts.map +1 -1
  8. package/dist/commands/loop-phases-reviewer.js +18 -39
  9. package/dist/commands/loop-phases-reviewer.js.map +1 -1
  10. package/dist/commands/monitor-respond.d.ts.map +1 -1
  11. package/dist/commands/monitor-respond.js +15 -2
  12. package/dist/commands/monitor-respond.js.map +1 -1
  13. package/dist/commands/monitor.d.ts +1 -1
  14. package/dist/commands/monitor.d.ts.map +1 -1
  15. package/dist/commands/monitor.js +41 -6
  16. package/dist/commands/monitor.js.map +1 -1
  17. package/dist/commands/reviewer-preflight.d.ts.map +1 -1
  18. package/dist/commands/reviewer-preflight.js +8 -64
  19. package/dist/commands/reviewer-preflight.js.map +1 -1
  20. package/dist/commands/sections-delete.d.ts.map +1 -1
  21. package/dist/commands/sections-delete.js +16 -1
  22. package/dist/commands/sections-delete.js.map +1 -1
  23. package/dist/commands/task-runtime-cleanup.d.ts +13 -0
  24. package/dist/commands/task-runtime-cleanup.d.ts.map +1 -0
  25. package/dist/commands/task-runtime-cleanup.js +134 -0
  26. package/dist/commands/task-runtime-cleanup.js.map +1 -0
  27. package/dist/commands/tasks-reset.d.ts.map +1 -1
  28. package/dist/commands/tasks-reset.js +20 -52
  29. package/dist/commands/tasks-reset.js.map +1 -1
  30. package/dist/commands/tasks.d.ts.map +1 -1
  31. package/dist/commands/tasks.js +10 -68
  32. package/dist/commands/tasks.js.map +1 -1
  33. package/dist/commands/web.d.ts +1 -0
  34. package/dist/commands/web.d.ts.map +1 -1
  35. package/dist/commands/web.js +6 -1
  36. package/dist/commands/web.js.map +1 -1
  37. package/dist/database/queries.d.ts.map +1 -1
  38. package/dist/database/queries.js +3 -0
  39. package/dist/database/queries.js.map +1 -1
  40. package/dist/git/section-pr.d.ts +4 -3
  41. package/dist/git/section-pr.d.ts.map +1 -1
  42. package/dist/git/section-pr.js +8 -15
  43. package/dist/git/section-pr.js.map +1 -1
  44. package/dist/intake/reviewer-approval.d.ts +5 -1
  45. package/dist/intake/reviewer-approval.d.ts.map +1 -1
  46. package/dist/intake/reviewer-approval.js +90 -15
  47. package/dist/intake/reviewer-approval.js.map +1 -1
  48. package/dist/monitor/investigator-agent.d.ts +2 -1
  49. package/dist/monitor/investigator-agent.d.ts.map +1 -1
  50. package/dist/monitor/investigator-agent.js +26 -6
  51. package/dist/monitor/investigator-agent.js.map +1 -1
  52. package/dist/monitor/investigator-prompt.d.ts +2 -1
  53. package/dist/monitor/investigator-prompt.d.ts.map +1 -1
  54. package/dist/monitor/investigator-prompt.js +110 -69
  55. package/dist/monitor/investigator-prompt.js.map +1 -1
  56. package/dist/monitor/loop.d.ts.map +1 -1
  57. package/dist/monitor/loop.js +63 -7
  58. package/dist/monitor/loop.js.map +1 -1
  59. package/dist/monitor/response-mode.d.ts +38 -0
  60. package/dist/monitor/response-mode.d.ts.map +1 -0
  61. package/dist/monitor/response-mode.js +189 -0
  62. package/dist/monitor/response-mode.js.map +1 -0
  63. package/dist/orchestrator/approval-effects-replay.d.ts +17 -0
  64. package/dist/orchestrator/approval-effects-replay.d.ts.map +1 -0
  65. package/dist/orchestrator/approval-effects-replay.js +55 -0
  66. package/dist/orchestrator/approval-effects-replay.js.map +1 -0
  67. package/dist/orchestrator/automated-approval-effects.d.ts +26 -0
  68. package/dist/orchestrator/automated-approval-effects.d.ts.map +1 -0
  69. package/dist/orchestrator/automated-approval-effects.js +294 -0
  70. package/dist/orchestrator/automated-approval-effects.js.map +1 -0
  71. package/dist/orchestrator/merge-queue-completion.d.ts +12 -0
  72. package/dist/orchestrator/merge-queue-completion.d.ts.map +1 -0
  73. package/dist/orchestrator/merge-queue-completion.js +33 -0
  74. package/dist/orchestrator/merge-queue-completion.js.map +1 -0
  75. package/dist/orchestrator/merge-queue.d.ts +8 -1
  76. package/dist/orchestrator/merge-queue.d.ts.map +1 -1
  77. package/dist/orchestrator/merge-queue.js +48 -13
  78. package/dist/orchestrator/merge-queue.js.map +1 -1
  79. package/dist/orchestrator/reviewer-approval-outcome.d.ts +26 -0
  80. package/dist/orchestrator/reviewer-approval-outcome.d.ts.map +1 -0
  81. package/dist/orchestrator/reviewer-approval-outcome.js +52 -0
  82. package/dist/orchestrator/reviewer-approval-outcome.js.map +1 -0
  83. package/dist/orchestrator/reviewer-policy.d.ts +12 -0
  84. package/dist/orchestrator/reviewer-policy.d.ts.map +1 -0
  85. package/dist/orchestrator/reviewer-policy.js +53 -0
  86. package/dist/orchestrator/reviewer-policy.js.map +1 -0
  87. package/dist/orchestrator/reviewer.d.ts +4 -19
  88. package/dist/orchestrator/reviewer.d.ts.map +1 -1
  89. package/dist/orchestrator/reviewer.js +14 -63
  90. package/dist/orchestrator/reviewer.js.map +1 -1
  91. package/dist/orchestrator/section-completion.d.ts +9 -0
  92. package/dist/orchestrator/section-completion.d.ts.map +1 -0
  93. package/dist/orchestrator/section-completion.js +22 -0
  94. package/dist/orchestrator/section-completion.js.map +1 -0
  95. package/dist/orchestrator/submission-context.d.ts +30 -0
  96. package/dist/orchestrator/submission-context.d.ts.map +1 -0
  97. package/dist/orchestrator/submission-context.js +124 -0
  98. package/dist/orchestrator/submission-context.js.map +1 -0
  99. package/dist/runners/global-db-connection.d.ts.map +1 -1
  100. package/dist/runners/global-db-connection.js +21 -0
  101. package/dist/runners/global-db-connection.js.map +1 -1
  102. package/dist/runners/global-db-schema-migrations-v21.d.ts +3 -2
  103. package/dist/runners/global-db-schema-migrations-v21.d.ts.map +1 -1
  104. package/dist/runners/global-db-schema-migrations-v21.js +8 -3
  105. package/dist/runners/global-db-schema-migrations-v21.js.map +1 -1
  106. package/dist/runners/global-db-schema.d.ts +2 -1
  107. package/dist/runners/global-db-schema.d.ts.map +1 -1
  108. package/dist/runners/global-db-schema.js +6 -1
  109. package/dist/runners/global-db-schema.js.map +1 -1
  110. package/dist/runners/wakeup-project.d.ts.map +1 -1
  111. package/dist/runners/wakeup-project.js +9 -1
  112. package/dist/runners/wakeup-project.js.map +1 -1
  113. package/dist/runners/wakeup-sanitise-recovery.d.ts +1 -1
  114. package/dist/runners/wakeup-sanitise-recovery.d.ts.map +1 -1
  115. package/dist/runners/wakeup-sanitise-recovery.js +26 -15
  116. package/dist/runners/wakeup-sanitise-recovery.js.map +1 -1
  117. package/dist/runners/wakeup-sanitise.d.ts +1 -1
  118. package/dist/runners/wakeup-sanitise.d.ts.map +1 -1
  119. package/dist/runners/wakeup-sanitise.js +5 -5
  120. package/dist/runners/wakeup-sanitise.js.map +1 -1
  121. package/package.json +28 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-mode.js","sourceRoot":"","sources":["../../src/monitor/response-mode.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyGH,sDAEC;AAED,sEAEC;AAED,sEAEC;AAED,gFAOC;AAED,4DAQC;AAED,kFAIC;AAED,wDAWC;AAED,8DAMC;AAED,4DAwEC;AAzOY,QAAA,sBAAsB,GAAG;IACpC,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,QAAQ;CACA,CAAC;AAEE,QAAA,+BAA+B,GAAG;IAC7C,eAAe;IACf,sBAAsB;CACd,CAAC;AAsCX,MAAM,WAAW,GAAG,IAAI,GAAG,CAA2B;IACpD,YAAY;IACZ,eAAe;IACf,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAA2B;IACvD,UAAU;IACV,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAA2B;IAC9D,kBAAkB;IAClB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAA2B;IACrE,UAAU;IACV,aAAa;IACb,kBAAkB;CACnB,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAqC;IACxE;QACE,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,mFAAmF;KACjG;IACD;QACE,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,kFAAkF;KAChG;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,wDAAwD;KACtE;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,4EAA4E;KAC1F;CACO,CAAC;AAEX,SAAgB,qBAAqB,CAAC,KAAgC;IACpE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,8BAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,SAAgB,6BAA6B,CAAC,KAAgC;IAC5E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,uCAAqD,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7G,CAAC;AAED,SAAgB,6BAA6B,CAAC,KAAgC;IAC5E,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,kCAAkC,CAChD,KAAgC;IAEhC,IAAI,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAgB,wBAAwB,CACtC,KAAgC;IAEhC,MAAM,MAAM,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,MAAM,KAAK,eAAe,IAAI,MAAM,KAAK,sBAAsB,EAAE,CAAC;QACpE,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,mCAAmC,CACjD,KAAgC;IAEhC,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC;AAC5D,CAAC;AAED,SAAgB,sBAAsB,CACpC,KAAgC,EAChC,YAAuC;IAEvC,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,4BAA4B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAChD,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,yBAAyB,CACvC,KAAgC;IAEhC,MAAM,MAAM,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACvE,CAAC;AAED,SAAgB,wBAAwB,CACtC,KAAgC;IAEhC,MAAM,MAAM,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACzD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,cAAc;YACjB,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,cAAc;gBACrB,WAAW,EAAE,2EAA2E;gBACxF,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,IAAI,GAAG,EAA4B;gBACnD,4BAA4B,EAAE,KAAK;gBACnC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,gFAAgF;gBAC7F,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,cAAc;gBAC9B,4BAA4B,EAAE,KAAK;gBACnC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,iBAAiB;gBACxB,WAAW,EAAE,gFAAgF;gBAC7F,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,WAAW;gBAC3B,4BAA4B,EAAE,IAAI;gBAClC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,8EAA8E;gBAC3F,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,WAAW;gBAC3B,4BAA4B,EAAE,KAAK;gBACnC,oBAAoB,EAAE,IAAI;gBAC1B,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,6EAA6E;gBAC1F,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,qBAAqB;gBACrC,4BAA4B,EAAE,KAAK;gBACnC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,KAAK,sBAAsB;YACzB,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,sBAAsB;gBAC7B,WAAW,EAAE,uEAAuE;gBACpF,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,4BAA4B;gBAC5C,4BAA4B,EAAE,KAAK;gBACnC,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,IAAI;aACjB,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -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, taskId: string, mergedSha?: string): void;
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;AAK1D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AACrE,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,WAAW,CAAC;AAExD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAe/D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAYjE;AAID,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,UAAU,CAsCZ;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,GAAG,iBAAiB,GAAG,iBAAiB,GAC5D,IAAI,CAqBN;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,kBAAkB,CAuCpB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAOvE;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,IAAI,CASN;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAUN;AAID,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CAyBN;AAID,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA6Gf;AAiDD,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,EACtB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
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, taskId, mergedSha) {
172
- db.prepare(`UPDATE tasks SET status = 'completed', merge_phase = NULL, approved_sha = NULL, rebase_attempts = 0, updated_at = datetime('now')
173
- WHERE id = ?`).run(taskId);
174
- (0, queries_js_1.addAuditEntry)(db, taskId, 'merge_pending', 'completed', 'orchestrator', {
175
- actorType: 'orchestrator',
176
- notes: '[merge_queue] Merge completed successfully',
177
- commitSha: mergedSha,
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.id, approvedSha);
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.id, approvedSha);
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.id, mergedSha);
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 remoteUrl = (0, pool_js_1.resolveRemoteUrl)(sourceProjectPath);
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.id, task.approved_sha ?? undefined);
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);