@generacy-ai/orchestrator 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/config/loader.d.ts.map +1 -1
  2. package/dist/config/loader.js +32 -1
  3. package/dist/config/loader.js.map +1 -1
  4. package/dist/config/schema.d.ts +436 -7
  5. package/dist/config/schema.d.ts.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/launcher/agent-launcher.d.ts +15 -16
  11. package/dist/launcher/agent-launcher.d.ts.map +1 -1
  12. package/dist/launcher/agent-launcher.js +54 -23
  13. package/dist/launcher/agent-launcher.js.map +1 -1
  14. package/dist/launcher/constants.d.ts +5 -0
  15. package/dist/launcher/constants.d.ts.map +1 -0
  16. package/dist/launcher/constants.js +5 -0
  17. package/dist/launcher/constants.js.map +1 -0
  18. package/dist/launcher/errors.d.ts +15 -0
  19. package/dist/launcher/errors.d.ts.map +1 -0
  20. package/dist/launcher/errors.js +25 -0
  21. package/dist/launcher/errors.js.map +1 -0
  22. package/dist/launcher/generic-subprocess-plugin.d.ts +1 -0
  23. package/dist/launcher/generic-subprocess-plugin.d.ts.map +1 -1
  24. package/dist/launcher/generic-subprocess-plugin.js +2 -0
  25. package/dist/launcher/generic-subprocess-plugin.js.map +1 -1
  26. package/dist/launcher/index.d.ts +2 -1
  27. package/dist/launcher/index.d.ts.map +1 -1
  28. package/dist/launcher/index.js +1 -0
  29. package/dist/launcher/index.js.map +1 -1
  30. package/dist/launcher/types.d.ts +81 -4
  31. package/dist/launcher/types.d.ts.map +1 -1
  32. package/dist/routes/health.d.ts.map +1 -1
  33. package/dist/routes/health.js +5 -0
  34. package/dist/routes/health.js.map +1 -1
  35. package/dist/server.d.ts.map +1 -1
  36. package/dist/server.js +130 -26
  37. package/dist/server.js.map +1 -1
  38. package/dist/services/base-advance-monitor-service.d.ts +78 -0
  39. package/dist/services/base-advance-monitor-service.d.ts.map +1 -0
  40. package/dist/services/base-advance-monitor-service.js +233 -0
  41. package/dist/services/base-advance-monitor-service.js.map +1 -0
  42. package/dist/services/boot-resume-service.d.ts +19 -0
  43. package/dist/services/boot-resume-service.d.ts.map +1 -0
  44. package/dist/services/boot-resume-service.js +87 -0
  45. package/dist/services/boot-resume-service.js.map +1 -0
  46. package/dist/services/epic-completion-monitor-service.d.ts.map +1 -1
  47. package/dist/services/epic-completion-monitor-service.js +2 -0
  48. package/dist/services/epic-completion-monitor-service.js.map +1 -1
  49. package/dist/services/in-memory-queue-adapter.d.ts +4 -0
  50. package/dist/services/in-memory-queue-adapter.d.ts.map +1 -1
  51. package/dist/services/in-memory-queue-adapter.js +30 -3
  52. package/dist/services/in-memory-queue-adapter.js.map +1 -1
  53. package/dist/services/label-monitor-service.d.ts +3 -3
  54. package/dist/services/label-monitor-service.d.ts.map +1 -1
  55. package/dist/services/label-monitor-service.js +58 -41
  56. package/dist/services/label-monitor-service.js.map +1 -1
  57. package/dist/services/label-sync-service.d.ts.map +1 -1
  58. package/dist/services/label-sync-service.js +45 -10
  59. package/dist/services/label-sync-service.js.map +1 -1
  60. package/dist/services/merge-conflict-monitor-service.d.ts +73 -0
  61. package/dist/services/merge-conflict-monitor-service.d.ts.map +1 -0
  62. package/dist/services/merge-conflict-monitor-service.js +295 -0
  63. package/dist/services/merge-conflict-monitor-service.js.map +1 -0
  64. package/dist/services/orchestrator-version.d.ts +2 -0
  65. package/dist/services/orchestrator-version.d.ts.map +1 -0
  66. package/dist/services/orchestrator-version.js +23 -0
  67. package/dist/services/orchestrator-version.js.map +1 -0
  68. package/dist/services/phase-tracker-service.d.ts +10 -0
  69. package/dist/services/phase-tracker-service.d.ts.map +1 -1
  70. package/dist/services/phase-tracker-service.js +38 -0
  71. package/dist/services/phase-tracker-service.js.map +1 -1
  72. package/dist/services/post-activation-dispatch.d.ts +18 -0
  73. package/dist/services/post-activation-dispatch.d.ts.map +1 -0
  74. package/dist/services/post-activation-dispatch.js +30 -0
  75. package/dist/services/post-activation-dispatch.js.map +1 -0
  76. package/dist/services/post-activation-retry.d.ts +3 -0
  77. package/dist/services/post-activation-retry.d.ts.map +1 -1
  78. package/dist/services/post-activation-retry.js +34 -2
  79. package/dist/services/post-activation-retry.js.map +1 -1
  80. package/dist/services/pr-feedback-monitor-service.d.ts +13 -4
  81. package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -1
  82. package/dist/services/pr-feedback-monitor-service.js +212 -26
  83. package/dist/services/pr-feedback-monitor-service.js.map +1 -1
  84. package/dist/services/redis-queue-adapter.d.ts +4 -0
  85. package/dist/services/redis-queue-adapter.d.ts.map +1 -1
  86. package/dist/services/redis-queue-adapter.js +90 -10
  87. package/dist/services/redis-queue-adapter.js.map +1 -1
  88. package/dist/services/worker-dispatcher.d.ts +14 -2
  89. package/dist/services/worker-dispatcher.d.ts.map +1 -1
  90. package/dist/services/worker-dispatcher.js +55 -2
  91. package/dist/services/worker-dispatcher.js.map +1 -1
  92. package/dist/types/api.d.ts +3 -0
  93. package/dist/types/api.d.ts.map +1 -1
  94. package/dist/types/api.js +1 -0
  95. package/dist/types/api.js.map +1 -1
  96. package/dist/types/index.d.ts +1 -1
  97. package/dist/types/index.d.ts.map +1 -1
  98. package/dist/types/index.js.map +1 -1
  99. package/dist/types/monitor.d.ts +72 -4
  100. package/dist/types/monitor.d.ts.map +1 -1
  101. package/dist/worker/base-merge.d.ts +54 -0
  102. package/dist/worker/base-merge.d.ts.map +1 -0
  103. package/dist/worker/base-merge.js +99 -0
  104. package/dist/worker/base-merge.js.map +1 -0
  105. package/dist/worker/clarification-markers.d.ts +29 -0
  106. package/dist/worker/clarification-markers.d.ts.map +1 -0
  107. package/dist/worker/clarification-markers.js +44 -0
  108. package/dist/worker/clarification-markers.js.map +1 -0
  109. package/dist/worker/clarification-poster.d.ts.map +1 -1
  110. package/dist/worker/clarification-poster.js +266 -25
  111. package/dist/worker/clarification-poster.js.map +1 -1
  112. package/dist/worker/claude-cli-worker.d.ts +21 -2
  113. package/dist/worker/claude-cli-worker.d.ts.map +1 -1
  114. package/dist/worker/claude-cli-worker.js +150 -4
  115. package/dist/worker/claude-cli-worker.js.map +1 -1
  116. package/dist/worker/cli-spawner.d.ts +4 -0
  117. package/dist/worker/cli-spawner.d.ts.map +1 -1
  118. package/dist/worker/cli-spawner.js +53 -7
  119. package/dist/worker/cli-spawner.js.map +1 -1
  120. package/dist/worker/config.d.ts +420 -8
  121. package/dist/worker/config.d.ts.map +1 -1
  122. package/dist/worker/config.js +179 -2
  123. package/dist/worker/config.js.map +1 -1
  124. package/dist/worker/evidence-hash.d.ts +32 -0
  125. package/dist/worker/evidence-hash.d.ts.map +1 -0
  126. package/dist/worker/evidence-hash.js +139 -0
  127. package/dist/worker/evidence-hash.js.map +1 -0
  128. package/dist/worker/handler-outcome-assertion.d.ts +38 -0
  129. package/dist/worker/handler-outcome-assertion.d.ts.map +1 -0
  130. package/dist/worker/handler-outcome-assertion.js +58 -0
  131. package/dist/worker/handler-outcome-assertion.js.map +1 -0
  132. package/dist/worker/handler-outcome.d.ts +50 -0
  133. package/dist/worker/handler-outcome.d.ts.map +1 -0
  134. package/dist/worker/handler-outcome.js +2 -0
  135. package/dist/worker/handler-outcome.js.map +1 -0
  136. package/dist/worker/label-manager.d.ts +58 -2
  137. package/dist/worker/label-manager.d.ts.map +1 -1
  138. package/dist/worker/label-manager.js +225 -27
  139. package/dist/worker/label-manager.js.map +1 -1
  140. package/dist/worker/merge-conflict-handler.d.ts +141 -0
  141. package/dist/worker/merge-conflict-handler.d.ts.map +1 -0
  142. package/dist/worker/merge-conflict-handler.js +642 -0
  143. package/dist/worker/merge-conflict-handler.js.map +1 -0
  144. package/dist/worker/merge-conflict-prompt.d.ts +35 -0
  145. package/dist/worker/merge-conflict-prompt.d.ts.map +1 -0
  146. package/dist/worker/merge-conflict-prompt.js +71 -0
  147. package/dist/worker/merge-conflict-prompt.js.map +1 -0
  148. package/dist/worker/merge-conflict-remedy.d.ts +42 -0
  149. package/dist/worker/merge-conflict-remedy.d.ts.map +1 -0
  150. package/dist/worker/merge-conflict-remedy.js +28 -0
  151. package/dist/worker/merge-conflict-remedy.js.map +1 -0
  152. package/dist/worker/output-tail-synthesis.d.ts +15 -0
  153. package/dist/worker/output-tail-synthesis.d.ts.map +1 -0
  154. package/dist/worker/output-tail-synthesis.js +25 -0
  155. package/dist/worker/output-tail-synthesis.js.map +1 -0
  156. package/dist/worker/output-tail.d.ts +13 -0
  157. package/dist/worker/output-tail.d.ts.map +1 -0
  158. package/dist/worker/output-tail.js +31 -0
  159. package/dist/worker/output-tail.js.map +1 -0
  160. package/dist/worker/pause-context.d.ts +30 -0
  161. package/dist/worker/pause-context.d.ts.map +1 -0
  162. package/dist/worker/pause-context.js +98 -0
  163. package/dist/worker/pause-context.js.map +1 -0
  164. package/dist/worker/phase-loop.d.ts +66 -0
  165. package/dist/worker/phase-loop.d.ts.map +1 -1
  166. package/dist/worker/phase-loop.js +329 -30
  167. package/dist/worker/phase-loop.js.map +1 -1
  168. package/dist/worker/pr-feedback-handler.d.ts +46 -46
  169. package/dist/worker/pr-feedback-handler.d.ts.map +1 -1
  170. package/dist/worker/pr-feedback-handler.js +286 -108
  171. package/dist/worker/pr-feedback-handler.js.map +1 -1
  172. package/dist/worker/pr-manager.d.ts +5 -0
  173. package/dist/worker/pr-manager.d.ts.map +1 -1
  174. package/dist/worker/pr-manager.js +7 -0
  175. package/dist/worker/pr-manager.js.map +1 -1
  176. package/dist/worker/product-diff.d.ts +39 -0
  177. package/dist/worker/product-diff.d.ts.map +1 -0
  178. package/dist/worker/product-diff.js +43 -0
  179. package/dist/worker/product-diff.js.map +1 -0
  180. package/dist/worker/provisioning-failure.d.ts +14 -0
  181. package/dist/worker/provisioning-failure.d.ts.map +1 -0
  182. package/dist/worker/provisioning-failure.js +2 -0
  183. package/dist/worker/provisioning-failure.js.map +1 -0
  184. package/dist/worker/repo-checkout.d.ts +14 -0
  185. package/dist/worker/repo-checkout.d.ts.map +1 -1
  186. package/dist/worker/repo-checkout.js +19 -1
  187. package/dist/worker/repo-checkout.js.map +1 -1
  188. package/dist/worker/stage-comment-manager.d.ts +42 -1
  189. package/dist/worker/stage-comment-manager.d.ts.map +1 -1
  190. package/dist/worker/stage-comment-manager.js +205 -1
  191. package/dist/worker/stage-comment-manager.js.map +1 -1
  192. package/dist/worker/terminal-label-op-error.d.ts +23 -0
  193. package/dist/worker/terminal-label-op-error.d.ts.map +1 -0
  194. package/dist/worker/terminal-label-op-error.js +27 -0
  195. package/dist/worker/terminal-label-op-error.js.map +1 -0
  196. package/dist/worker/types.d.ts +181 -2
  197. package/dist/worker/types.d.ts.map +1 -1
  198. package/dist/worker/types.js +11 -0
  199. package/dist/worker/types.js.map +1 -1
  200. package/dist/worker/validate-fix-handler.d.ts +79 -0
  201. package/dist/worker/validate-fix-handler.d.ts.map +1 -0
  202. package/dist/worker/validate-fix-handler.js +320 -0
  203. package/dist/worker/validate-fix-handler.js.map +1 -0
  204. package/dist/worker/worker-result.d.ts +39 -0
  205. package/dist/worker/worker-result.d.ts.map +1 -0
  206. package/dist/worker/worker-result.js +10 -0
  207. package/dist/worker/worker-result.js.map +1 -0
  208. package/package.json +12 -7
@@ -0,0 +1,320 @@
1
+ import { executeCommand, wrapUntrustedData } from '@generacy-ai/workflow-engine';
2
+ import { buildLaunchCredentials } from './credentials-helper.js';
3
+ import { hashValidationEvidence } from './evidence-hash.js';
4
+ /** Label added when the fix cycle cannot advance (#883-style termination). */
5
+ const BLOCKED_STUCK_VALIDATE_FIX_LABEL = 'blocked:stuck-validate-fix';
6
+ const AGENT_ERROR_LABEL = 'agent:error';
7
+ const AGENT_IN_PROGRESS_LABEL = 'agent:in-progress';
8
+ const FAILED_VALIDATE_LABEL = 'failed:validate';
9
+ const PHASE_VALIDATE_LABEL = 'phase:validate';
10
+ /**
11
+ * Bounded validate-fix cycle (#892).
12
+ *
13
+ * Invoked ONLY from PhaseLoop's validate `catch` block, gated by
14
+ * `WorkerContext.resumeReason === 'base-advance'` (D7 ordering invariant).
15
+ * First-time reds still route through `LabelManager.onError('validate')`.
16
+ *
17
+ * Contract: exactly one autonomous attempt per distinct evidence hash. Same
18
+ * hash → escalation via `blocked:stuck-validate-fix`. No-diff after spawn →
19
+ * escalation. Sibling-owned file overlap post-commit → revert + escalation.
20
+ *
21
+ * See specs/892-found-during-cockpit-v1/contracts/validate-fix-handler.md.
22
+ */
23
+ export class ValidateFixHandler {
24
+ config;
25
+ agentLauncher;
26
+ phaseTracker;
27
+ logger;
28
+ emitEvent;
29
+ constructor(config, agentLauncher, phaseTracker, logger, emitEvent) {
30
+ this.config = config;
31
+ this.agentLauncher = agentLauncher;
32
+ this.phaseTracker = phaseTracker;
33
+ this.logger = logger;
34
+ this.emitEvent = emitEvent;
35
+ }
36
+ /**
37
+ * Run one bounded fix attempt against the given failing evidence.
38
+ * Never throws — all failures land as `emit` + label side effects.
39
+ */
40
+ async handle(item, checkoutPath, ctx, evidence, github) {
41
+ const { owner, repo, issueNumber } = item;
42
+ const { prNumber, baseBranch } = ctx;
43
+ // 1. Hash evidence.
44
+ let hash;
45
+ let extract;
46
+ try {
47
+ const result = hashValidationEvidence(evidence.stdout);
48
+ hash = result.hash;
49
+ extract = result.extract;
50
+ }
51
+ catch (err) {
52
+ this.logger.error({ err: String(err), owner, repo, issueNumber, prNumber }, 'ValidateFixHandler: hashValidationEvidence threw — escalating (safe default)');
53
+ await this.escalate(github, owner, repo, issueNumber, {
54
+ status: 'escalated', reason: 'hash-error',
55
+ evidenceHash: 'unknown', prNumber, owner, repo, issueNumber,
56
+ });
57
+ return;
58
+ }
59
+ const dupKey = `validate-fix:${hash}`;
60
+ this.logger.info({ owner, repo, issueNumber, prNumber, evidenceHash: hash, failureCount: extract.failures.length }, 'ValidateFixHandler: entering fix cycle');
61
+ // 2. Dedupe check.
62
+ if (await this.phaseTracker.isDuplicate(owner, repo, issueNumber, dupKey)) {
63
+ await this.escalate(github, owner, repo, issueNumber, {
64
+ status: 'escalated', reason: 'duplicate-evidence-hash',
65
+ evidenceHash: hash, prNumber, owner, repo, issueNumber,
66
+ });
67
+ return;
68
+ }
69
+ // 3. Mark processed BEFORE spawn. If the spawn crashes mid-flight, the
70
+ // key remaining prevents a duplicate attempt on cluster restart.
71
+ await this.phaseTracker.markProcessed(owner, repo, issueNumber, dupKey);
72
+ // 4. Sibling-owned file collection (best-effort).
73
+ const siblingFiles = await this.collectSiblingOwnedFiles(github, owner, repo, baseBranch, prNumber);
74
+ // 5. Build prompt.
75
+ const prompt = this.buildFixPrompt(evidence, extract, siblingFiles, hash, prNumber);
76
+ // 6. Spawn.
77
+ const intent = {
78
+ kind: 'validate-fix',
79
+ prNumber,
80
+ prompt,
81
+ evidenceHash: hash,
82
+ };
83
+ let exitCode;
84
+ try {
85
+ const handle = await this.agentLauncher.launch({
86
+ intent,
87
+ cwd: checkoutPath,
88
+ env: {},
89
+ credentials: buildLaunchCredentials(this.config.credentialRole),
90
+ });
91
+ // Drain streams so the child doesn't stall on back-pressure.
92
+ handle.process.stdout?.on('data', () => undefined);
93
+ handle.process.stderr?.on('data', () => undefined);
94
+ exitCode = await handle.process.exitPromise;
95
+ }
96
+ catch (err) {
97
+ this.logger.warn({ err: String(err), owner, repo, issueNumber, prNumber, evidenceHash: hash }, 'ValidateFixHandler: launcher.launch threw');
98
+ await this.applyStuckLabel(github, owner, repo, issueNumber);
99
+ this.safeEmit('cluster.validate-fix', {
100
+ status: 'blocked', reason: 'launch-error',
101
+ evidenceHash: hash, owner, repo, issueNumber, prNumber,
102
+ timestamp: new Date().toISOString(),
103
+ });
104
+ return;
105
+ }
106
+ this.logger.info({ owner, repo, issueNumber, prNumber, evidenceHash: hash, exitCode }, 'ValidateFixHandler: agent exit');
107
+ // 7. commit → sibling-overlap check → push.
108
+ const commitMessage = `validate-fix: ${hash.slice(0, 12)}`;
109
+ let committed;
110
+ try {
111
+ committed = await this.commitChanges(github, checkoutPath, commitMessage);
112
+ }
113
+ catch (err) {
114
+ this.logger.warn({ err: String(err), owner, repo, issueNumber, prNumber, evidenceHash: hash }, 'ValidateFixHandler: commit failed');
115
+ await this.applyStuckLabel(github, owner, repo, issueNumber);
116
+ this.safeEmit('cluster.validate-fix', {
117
+ status: 'blocked', reason: 'commit-error',
118
+ evidenceHash: hash, owner, repo, issueNumber, prNumber,
119
+ timestamp: new Date().toISOString(),
120
+ });
121
+ return;
122
+ }
123
+ if (!committed.hasChanges) {
124
+ // #883 termination discipline — no-diff.
125
+ await this.applyStuckLabel(github, owner, repo, issueNumber);
126
+ this.safeEmit('cluster.validate-fix', {
127
+ status: 'blocked', reason: 'no-diff',
128
+ evidenceHash: hash, owner, repo, issueNumber, prNumber,
129
+ timestamp: new Date().toISOString(),
130
+ });
131
+ return;
132
+ }
133
+ // Post-hoc sibling-overlap check on the just-committed change set.
134
+ if (siblingFiles.length > 0 && committed.committedFiles.length > 0) {
135
+ const overlap = committed.committedFiles.filter((f) => siblingFiles.includes(f));
136
+ if (overlap.length > 0) {
137
+ this.logger.warn({ owner, repo, issueNumber, prNumber, overlap, evidenceHash: hash }, 'ValidateFixHandler: sibling-file overlap — reverting commit and escalating');
138
+ try {
139
+ await this.revertLocalCommit(checkoutPath);
140
+ }
141
+ catch (err) {
142
+ this.logger.warn({ err: String(err), checkoutPath }, 'ValidateFixHandler: revertLocalCommit failed — continuing');
143
+ }
144
+ await this.applyStuckLabel(github, owner, repo, issueNumber);
145
+ this.safeEmit('cluster.validate-fix', {
146
+ status: 'blocked', reason: 'sibling-file-overlap',
147
+ evidenceHash: hash, overlappingFiles: overlap,
148
+ owner, repo, issueNumber, prNumber,
149
+ timestamp: new Date().toISOString(),
150
+ });
151
+ return;
152
+ }
153
+ }
154
+ // Push.
155
+ try {
156
+ await this.pushChanges(github);
157
+ }
158
+ catch (err) {
159
+ this.logger.warn({ err: String(err), owner, repo, issueNumber, prNumber, evidenceHash: hash }, 'ValidateFixHandler: push failed');
160
+ await this.applyStuckLabel(github, owner, repo, issueNumber);
161
+ this.safeEmit('cluster.validate-fix', {
162
+ status: 'blocked', reason: 'push-error',
163
+ evidenceHash: hash, owner, repo, issueNumber, prNumber,
164
+ timestamp: new Date().toISOString(),
165
+ });
166
+ return;
167
+ }
168
+ this.safeEmit('cluster.validate-fix', {
169
+ status: 'attempted',
170
+ evidenceHash: hash,
171
+ owner, repo, issueNumber, prNumber,
172
+ timestamp: new Date().toISOString(),
173
+ });
174
+ }
175
+ /**
176
+ * Escalation gate — same red already spent our one attempt (or hash errored).
177
+ * Adds `blocked:stuck-validate-fix` + `agent:error`, removes in-progress
178
+ * labels, emits event. Best-effort throughout.
179
+ */
180
+ async escalate(github, owner, repo, issueNumber, payload) {
181
+ try {
182
+ await github.addLabels(owner, repo, issueNumber, [
183
+ BLOCKED_STUCK_VALIDATE_FIX_LABEL,
184
+ AGENT_ERROR_LABEL,
185
+ ]);
186
+ }
187
+ catch (err) {
188
+ this.logger.warn({ err: String(err), owner, repo, issueNumber }, 'ValidateFixHandler: addLabels (escalation) failed — non-fatal');
189
+ }
190
+ try {
191
+ await github.removeLabels(owner, repo, issueNumber, [
192
+ PHASE_VALIDATE_LABEL,
193
+ AGENT_IN_PROGRESS_LABEL,
194
+ ]);
195
+ }
196
+ catch (err) {
197
+ this.logger.warn({ err: String(err), owner, repo, issueNumber }, 'ValidateFixHandler: removeLabels (escalation) failed — non-fatal');
198
+ }
199
+ this.safeEmit('cluster.validate-fix', {
200
+ ...payload,
201
+ timestamp: new Date().toISOString(),
202
+ });
203
+ }
204
+ async applyStuckLabel(github, owner, repo, issueNumber) {
205
+ try {
206
+ await github.addLabels(owner, repo, issueNumber, [BLOCKED_STUCK_VALIDATE_FIX_LABEL]);
207
+ }
208
+ catch (err) {
209
+ this.logger.warn({ err: String(err), owner, repo, issueNumber }, 'ValidateFixHandler: addLabels (stuck) failed — non-fatal');
210
+ }
211
+ // The failed:validate label re-applies via LabelManager.onError('validate')
212
+ // on the caller's path — we don't touch it here.
213
+ void FAILED_VALIDATE_LABEL;
214
+ }
215
+ /**
216
+ * Enumerate open PRs to the same base branch and union their diff file lists.
217
+ * Best-effort per sibling — one throw does not abort the whole collection.
218
+ */
219
+ async collectSiblingOwnedFiles(github, owner, repo, baseBranch, ownPrNumber) {
220
+ let openPRs;
221
+ try {
222
+ openPRs = await github.listOpenPullRequests(owner, repo);
223
+ }
224
+ catch (err) {
225
+ this.logger.warn({ err: String(err), owner, repo, baseBranch }, 'ValidateFixHandler: listOpenPullRequests failed — proceeding with empty sibling list');
226
+ return [];
227
+ }
228
+ const siblings = openPRs.filter((pr) => pr.base?.ref === baseBranch && pr.number !== ownPrNumber);
229
+ const files = [];
230
+ for (const pr of siblings) {
231
+ try {
232
+ const names = await github.prDiffNames(`${owner}/${repo}`, pr.number);
233
+ files.push(...names);
234
+ }
235
+ catch (err) {
236
+ this.logger.warn({ err: String(err), owner, repo, siblingPr: pr.number }, 'ValidateFixHandler: sibling prDiffNames failed — partial list');
237
+ }
238
+ }
239
+ return [...new Set(files)];
240
+ }
241
+ /**
242
+ * Build the fix prompt — includes full stdout evidence, structured extract,
243
+ * do-not-create file list, and the identity hash.
244
+ */
245
+ buildFixPrompt(evidence, extract, siblingFiles, hash, prNumber) {
246
+ const failureLines = extract.failures
247
+ .map((f, i) => `Failure ${i + 1}: ${f.id} — ${f.firstError}`)
248
+ .join('\n');
249
+ const siblingBlock = siblingFiles.length > 0
250
+ ? `\n\nDo not create these files — they belong to sibling PRs on the same base branch:\n${siblingFiles.map((f) => ` - ${f}`).join('\n')}\n`
251
+ : '\n\n(No sibling PRs to the same base branch had recorded diffs.)\n';
252
+ const fencedEvidence = wrapUntrustedData(evidence.stdout, `PR #${prNumber} validate stdout (exit ${evidence.exitCode})`);
253
+ return `You are running an autonomous fix attempt for a persistently-failing validate check on PR #${prNumber}.
254
+
255
+ The failing validate command produced the following output:
256
+
257
+ ${fencedEvidence}
258
+
259
+ Structured failure identity (SHA-256 hash: ${hash}):
260
+
261
+ ${failureLines}
262
+ ${siblingBlock}
263
+ **Instructions:**
264
+ 1. Read the validate output above and address every failure it reports.
265
+ 2. Do NOT create any file that appears in the "Do not create" list — those files belong to sibling PRs and will merge cleanly through their own branches.
266
+ 3. Focus on this PR's own scope — do not touch unrelated code.
267
+ 4. Your changes will be automatically committed and pushed on this branch. You have exactly one attempt.
268
+
269
+ Proceed with the fix.`;
270
+ }
271
+ /**
272
+ * Stage all changes, commit if any, and return whether anything was committed.
273
+ * If committed, also returns the list of files in the new commit for the
274
+ * sibling-overlap check.
275
+ */
276
+ async commitChanges(github, checkoutPath, message) {
277
+ const status = await github.getStatus();
278
+ if (!status.has_changes) {
279
+ return { hasChanges: false, committedFiles: [] };
280
+ }
281
+ await github.stageAll();
282
+ const commit = await github.commit(message);
283
+ // Prefer the commit result's files list; fall back to git diff HEAD~1..HEAD
284
+ // for backends that don't populate files_committed.
285
+ let committedFiles = commit.files_committed;
286
+ if (!committedFiles || committedFiles.length === 0) {
287
+ try {
288
+ const result = await executeCommand('git', ['diff', '--name-only', 'HEAD~1', 'HEAD'], { cwd: checkoutPath });
289
+ if (result.exitCode === 0) {
290
+ committedFiles = result.stdout.split('\n').map((l) => l.trim()).filter(Boolean);
291
+ }
292
+ }
293
+ catch {
294
+ committedFiles = [];
295
+ }
296
+ }
297
+ return { hasChanges: true, committedFiles: committedFiles ?? [] };
298
+ }
299
+ async pushChanges(github) {
300
+ const branch = await github.getCurrentBranch();
301
+ await github.push('origin', branch);
302
+ }
303
+ async revertLocalCommit(checkoutPath) {
304
+ const result = await executeCommand('git', ['reset', '--hard', 'HEAD~1'], { cwd: checkoutPath });
305
+ if (result.exitCode !== 0) {
306
+ throw new Error(`git reset --hard HEAD~1 failed: ${result.stderr.trim()}`);
307
+ }
308
+ }
309
+ safeEmit(channel, payload) {
310
+ if (!this.emitEvent)
311
+ return;
312
+ try {
313
+ this.emitEvent(channel, payload);
314
+ }
315
+ catch (err) {
316
+ this.logger.warn({ err: String(err), channel }, 'ValidateFixHandler: emitEvent threw — swallowed');
317
+ }
318
+ }
319
+ }
320
+ //# sourceMappingURL=validate-fix-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-fix-handler.js","sourceRoot":"","sources":["../../src/worker/validate-fix-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAOjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,8EAA8E;AAC9E,MAAM,gCAAgC,GAAG,4BAA4B,CAAC;AACtE,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AACpD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAChD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AA0B9C;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IACA;IACA;IALnB,YACmB,MAAoB,EACpB,aAA4B,EAC5B,YAA0B,EAC1B,MAAc,EACd,SAAmC;QAJnC,WAAM,GAAN,MAAM,CAAc;QACpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAA0B;IACnD,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,IAAe,EACf,YAAoB,EACpB,GAAuB,EACvB,QAAiC,EACjC,MAAoB;QAEpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC1C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;QAErC,oBAAoB;QACpB,IAAI,IAAY,CAAC;QACjB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EACxD,8EAA8E,CAC/E,CAAC;YACF,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;gBACpD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY;gBACzC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW;aAC5D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,IAAI,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EACjG,wCAAwC,CACzC,CAAC;QAEF,mBAAmB;QACnB,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;gBACpD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB;gBACtD,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW;aACvD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAExE,kDAAkD;QAClD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wBAAwB,CACtD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAC1C,CAAC;QAEF,mBAAmB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEpF,YAAY;QACZ,MAAM,MAAM,GAAsB;YAChC,IAAI,EAAE,cAAc;YACpB,QAAQ;YACR,MAAM;YACN,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,IAAI,QAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAC7C,MAAM;gBACN,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,EAAE;gBACP,WAAW,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;aAChE,CAAC,CAAC;YACH,6DAA6D;YAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnD,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAC5E,2CAA2C,CAC5C,CAAC;YACF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;gBACpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc;gBACzC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;gBACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,EACpE,gCAAgC,CACjC,CAAC;QAEF,4CAA4C;QAC5C,MAAM,aAAa,GAAG,iBAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3D,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAC5E,mCAAmC,CACpC,CAAC;YACF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;gBACpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc;gBACzC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;gBACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAC1B,yCAAyC;YACzC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;gBACpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;gBACpC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;gBACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,EACnE,4EAA4E,CAC7E,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,EAClC,2DAA2D,CAC5D,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC7D,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;oBACpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB;oBACjD,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO;oBAC7C,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;oBAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,QAAQ;QACR,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAC5E,iCAAiC,CAClC,CAAC;YACF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;gBACpC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY;gBACvC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;gBACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YACpC,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,QAAQ,CACpB,MAAoB,EACpB,KAAa,EACb,IAAY,EACZ,WAAmB,EACnB,OAAgC;QAEhC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC/C,gCAAgC;gBAChC,iBAAiB;aAClB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAC9C,+DAA+D,CAChE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;gBAClD,oBAAoB;gBACpB,uBAAuB;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAC9C,kEAAkE,CACnE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YACpC,GAAG,OAAO;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,MAAoB,EACpB,KAAa,EACb,IAAY,EACZ,WAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAC9C,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,4EAA4E;QAC5E,iDAAiD;QACjD,KAAK,qBAAqB,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CACpC,MAAoB,EACpB,KAAa,EACb,IAAY,EACZ,UAAkB,EAClB,WAAmB;QAEnB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAC7C,sFAAsF,CACvF,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,UAAU,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW,CACjE,CAAC;QACF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;gBACtE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,EACvD,+DAA+D,CAChE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,cAAc,CACpB,QAAiC,EACjC,OAAgE,EAChE,YAAsB,EACtB,IAAY,EACZ,QAAgB;QAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;aAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;YAC1C,CAAC,CAAC,wFAAwF,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC5I,CAAC,CAAC,oEAAoE,CAAC;QAEzE,MAAM,cAAc,GAAG,iBAAiB,CACtC,QAAQ,CAAC,MAAM,EACf,OAAO,QAAQ,0BAA0B,QAAQ,CAAC,QAAQ,GAAG,CAC9D,CAAC;QAEF,OAAO,8FAA8F,QAAQ;;;;EAI/G,cAAc;;6CAE6B,IAAI;;EAE/C,YAAY;EACZ,YAAY;;;;;;;sBAOQ,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,aAAa,CACzB,MAAoB,EACpB,YAAoB,EACpB,OAAe;QAEf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5C,4EAA4E;QAC5E,oDAAoD;QACpD,IAAI,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,KAAK,EACL,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,EACzC,EAAE,GAAG,EAAE,YAAY,EAAE,CACtB,CAAC;gBACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC1B,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAoB;QAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAClD,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAC7B,EAAE,GAAG,EAAE,YAAY,EAAE,CACtB,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,OAAe,EAAE,OAAgB;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAC7B,iDAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Discriminated result type returned by `WorkerHandler` (`ClaudeCliWorker.handle`).
3
+ * Consumed by `WorkerDispatcher.runWorker` to decide between `queue.complete()`
4
+ * (both variants) and `queue.release()` (never — release is the default behavior
5
+ * on unhandled throws).
6
+ *
7
+ * See specs/889-found-during-cockpit-v1/contracts/worker-result.md.
8
+ */
9
+ import type { QueueItem } from '../types/index.js';
10
+ import type { TerminalLabelOpSite } from './terminal-label-op-error.js';
11
+ export interface FailureMetadata {
12
+ readonly site: TerminalLabelOpSite;
13
+ readonly labelOp: string;
14
+ readonly ghStderr: string;
15
+ }
16
+ /**
17
+ * Optional post-complete side-effect the dispatcher runs AFTER `queue.complete()`.
18
+ * Used by `MergeConflictHandler`'s re-arm path (#902) to enqueue a `continue`
19
+ * item without colliding against the still-claimed source itemKey (self-
20
+ * deadlock guard per #902 Q1).
21
+ */
22
+ export type PostCompleteAction = {
23
+ readonly kind: 'rearm';
24
+ readonly rearmItem: QueueItem;
25
+ };
26
+ export interface CompletedResult {
27
+ readonly status: 'completed';
28
+ /**
29
+ * NEW in #902.
30
+ * Fired by `WorkerDispatcher.runWorker` immediately after
31
+ * `queue.complete(workerId, item)` releases the itemKey.
32
+ */
33
+ readonly postComplete?: PostCompleteAction;
34
+ }
35
+ export type WorkerResult = CompletedResult | {
36
+ readonly status: 'failed-terminal';
37
+ readonly failureMetadata: FailureMetadata;
38
+ };
39
+ //# sourceMappingURL=worker-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-result.d.ts","sourceRoot":"","sources":["../../src/worker/worker-result.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CAC5C;AAED,MAAM,MAAM,YAAY,GACpB,eAAe,GACf;IACE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Discriminated result type returned by `WorkerHandler` (`ClaudeCliWorker.handle`).
3
+ * Consumed by `WorkerDispatcher.runWorker` to decide between `queue.complete()`
4
+ * (both variants) and `queue.release()` (never — release is the default behavior
5
+ * on unhandled throws).
6
+ *
7
+ * See specs/889-found-during-cockpit-v1/contracts/worker-result.md.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=worker-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-result.js","sourceRoot":"","sources":["../../src/worker/worker-result.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@generacy-ai/orchestrator",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Orchestrator service - main API server for Generacy workflow orchestration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,6 +13,10 @@
13
13
  "./test-utils": {
14
14
  "import": "./dist/test-utils/index.js",
15
15
  "types": "./dist/test-utils/index.d.ts"
16
+ },
17
+ "./launcher/types": {
18
+ "import": "./dist/launcher/types.js",
19
+ "types": "./dist/launcher/types.d.ts"
16
20
  }
17
21
  },
18
22
  "dependencies": {
@@ -27,14 +31,14 @@
27
31
  "prom-client": "^15.0.0",
28
32
  "yaml": "^2.4.0",
29
33
  "zod": "^3.23.0",
30
- "@generacy-ai/activation-client": "^0.3.0",
31
34
  "@generacy-ai/cluster-relay": "^0.3.0",
32
- "@generacy-ai/control-plane": "^0.7.0",
33
- "@generacy-ai/config": "^0.2.0",
34
- "@generacy-ai/orchestrator-types": "^0.1.0",
35
+ "@generacy-ai/config": "^0.4.0",
36
+ "@generacy-ai/control-plane": "^0.7.2",
37
+ "@generacy-ai/orchestrator-types": "^0.2.0",
35
38
  "@generacy-ai/credhelper": "^0.1.1",
36
- "@generacy-ai/workflow-engine": "^0.2.1",
37
- "@generacy-ai/generacy-plugin-claude-code": "^0.1.1"
39
+ "@generacy-ai/generacy-plugin-claude-code": "^0.3.0",
40
+ "@generacy-ai/workflow-engine": "^0.3.0",
41
+ "@generacy-ai/activation-client": "^0.3.0"
38
42
  },
39
43
  "devDependencies": {
40
44
  "@types/node": "^20.0.0",
@@ -69,6 +73,7 @@
69
73
  "start": "node dist/server.js",
70
74
  "test": "vitest run",
71
75
  "test:watch": "vitest",
76
+ "test:integration": "vitest --config ../../vitest.integration.config.ts run",
72
77
  "lint": "eslint src tests --ext .ts",
73
78
  "typecheck": "tsc --noEmit"
74
79
  }