@generacy-ai/orchestrator 0.5.1 → 0.7.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 (182) hide show
  1. package/dist/config/loader.d.ts.map +1 -1
  2. package/dist/config/loader.js +25 -0
  3. package/dist/config/loader.js.map +1 -1
  4. package/dist/config/schema.d.ts +54 -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/routes/health.d.ts.map +1 -1
  11. package/dist/routes/health.js +5 -0
  12. package/dist/routes/health.js.map +1 -1
  13. package/dist/server.d.ts.map +1 -1
  14. package/dist/server.js +130 -26
  15. package/dist/server.js.map +1 -1
  16. package/dist/services/base-advance-monitor-service.d.ts +78 -0
  17. package/dist/services/base-advance-monitor-service.d.ts.map +1 -0
  18. package/dist/services/base-advance-monitor-service.js +233 -0
  19. package/dist/services/base-advance-monitor-service.js.map +1 -0
  20. package/dist/services/boot-resume-service.d.ts +19 -0
  21. package/dist/services/boot-resume-service.d.ts.map +1 -0
  22. package/dist/services/boot-resume-service.js +87 -0
  23. package/dist/services/boot-resume-service.js.map +1 -0
  24. package/dist/services/epic-completion-monitor-service.d.ts.map +1 -1
  25. package/dist/services/epic-completion-monitor-service.js +2 -0
  26. package/dist/services/epic-completion-monitor-service.js.map +1 -1
  27. package/dist/services/in-memory-queue-adapter.d.ts +4 -0
  28. package/dist/services/in-memory-queue-adapter.d.ts.map +1 -1
  29. package/dist/services/in-memory-queue-adapter.js +30 -3
  30. package/dist/services/in-memory-queue-adapter.js.map +1 -1
  31. package/dist/services/label-monitor-service.d.ts +3 -3
  32. package/dist/services/label-monitor-service.d.ts.map +1 -1
  33. package/dist/services/label-monitor-service.js +58 -41
  34. package/dist/services/label-monitor-service.js.map +1 -1
  35. package/dist/services/label-sync-service.d.ts.map +1 -1
  36. package/dist/services/label-sync-service.js +45 -10
  37. package/dist/services/label-sync-service.js.map +1 -1
  38. package/dist/services/merge-conflict-monitor-service.d.ts +73 -0
  39. package/dist/services/merge-conflict-monitor-service.d.ts.map +1 -0
  40. package/dist/services/merge-conflict-monitor-service.js +295 -0
  41. package/dist/services/merge-conflict-monitor-service.js.map +1 -0
  42. package/dist/services/orchestrator-version.d.ts +2 -0
  43. package/dist/services/orchestrator-version.d.ts.map +1 -0
  44. package/dist/services/orchestrator-version.js +23 -0
  45. package/dist/services/orchestrator-version.js.map +1 -0
  46. package/dist/services/phase-tracker-service.d.ts +10 -0
  47. package/dist/services/phase-tracker-service.d.ts.map +1 -1
  48. package/dist/services/phase-tracker-service.js +38 -0
  49. package/dist/services/phase-tracker-service.js.map +1 -1
  50. package/dist/services/post-activation-dispatch.d.ts +18 -0
  51. package/dist/services/post-activation-dispatch.d.ts.map +1 -0
  52. package/dist/services/post-activation-dispatch.js +30 -0
  53. package/dist/services/post-activation-dispatch.js.map +1 -0
  54. package/dist/services/pr-feedback-monitor-service.d.ts +13 -4
  55. package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -1
  56. package/dist/services/pr-feedback-monitor-service.js +212 -26
  57. package/dist/services/pr-feedback-monitor-service.js.map +1 -1
  58. package/dist/services/redis-queue-adapter.d.ts +4 -0
  59. package/dist/services/redis-queue-adapter.d.ts.map +1 -1
  60. package/dist/services/redis-queue-adapter.js +90 -10
  61. package/dist/services/redis-queue-adapter.js.map +1 -1
  62. package/dist/services/worker-dispatcher.d.ts +14 -2
  63. package/dist/services/worker-dispatcher.d.ts.map +1 -1
  64. package/dist/services/worker-dispatcher.js +55 -2
  65. package/dist/services/worker-dispatcher.js.map +1 -1
  66. package/dist/types/api.d.ts +3 -0
  67. package/dist/types/api.d.ts.map +1 -1
  68. package/dist/types/api.js +1 -0
  69. package/dist/types/api.js.map +1 -1
  70. package/dist/types/index.d.ts +1 -1
  71. package/dist/types/index.d.ts.map +1 -1
  72. package/dist/types/index.js.map +1 -1
  73. package/dist/types/monitor.d.ts +72 -4
  74. package/dist/types/monitor.d.ts.map +1 -1
  75. package/dist/worker/base-merge.d.ts +54 -0
  76. package/dist/worker/base-merge.d.ts.map +1 -0
  77. package/dist/worker/base-merge.js +99 -0
  78. package/dist/worker/base-merge.js.map +1 -0
  79. package/dist/worker/clarification-markers.d.ts +29 -0
  80. package/dist/worker/clarification-markers.d.ts.map +1 -0
  81. package/dist/worker/clarification-markers.js +44 -0
  82. package/dist/worker/clarification-markers.js.map +1 -0
  83. package/dist/worker/clarification-poster.d.ts.map +1 -1
  84. package/dist/worker/clarification-poster.js +266 -25
  85. package/dist/worker/clarification-poster.js.map +1 -1
  86. package/dist/worker/claude-cli-worker.d.ts +21 -2
  87. package/dist/worker/claude-cli-worker.d.ts.map +1 -1
  88. package/dist/worker/claude-cli-worker.js +149 -4
  89. package/dist/worker/claude-cli-worker.js.map +1 -1
  90. package/dist/worker/cli-spawner.d.ts +4 -0
  91. package/dist/worker/cli-spawner.d.ts.map +1 -1
  92. package/dist/worker/cli-spawner.js +51 -7
  93. package/dist/worker/cli-spawner.js.map +1 -1
  94. package/dist/worker/config.d.ts +101 -9
  95. package/dist/worker/config.d.ts.map +1 -1
  96. package/dist/worker/config.js +75 -4
  97. package/dist/worker/config.js.map +1 -1
  98. package/dist/worker/evidence-hash.d.ts +32 -0
  99. package/dist/worker/evidence-hash.d.ts.map +1 -0
  100. package/dist/worker/evidence-hash.js +139 -0
  101. package/dist/worker/evidence-hash.js.map +1 -0
  102. package/dist/worker/handler-outcome-assertion.d.ts +38 -0
  103. package/dist/worker/handler-outcome-assertion.d.ts.map +1 -0
  104. package/dist/worker/handler-outcome-assertion.js +58 -0
  105. package/dist/worker/handler-outcome-assertion.js.map +1 -0
  106. package/dist/worker/handler-outcome.d.ts +50 -0
  107. package/dist/worker/handler-outcome.d.ts.map +1 -0
  108. package/dist/worker/handler-outcome.js +2 -0
  109. package/dist/worker/handler-outcome.js.map +1 -0
  110. package/dist/worker/label-manager.d.ts +58 -2
  111. package/dist/worker/label-manager.d.ts.map +1 -1
  112. package/dist/worker/label-manager.js +225 -27
  113. package/dist/worker/label-manager.js.map +1 -1
  114. package/dist/worker/merge-conflict-handler.d.ts +141 -0
  115. package/dist/worker/merge-conflict-handler.d.ts.map +1 -0
  116. package/dist/worker/merge-conflict-handler.js +642 -0
  117. package/dist/worker/merge-conflict-handler.js.map +1 -0
  118. package/dist/worker/merge-conflict-prompt.d.ts +35 -0
  119. package/dist/worker/merge-conflict-prompt.d.ts.map +1 -0
  120. package/dist/worker/merge-conflict-prompt.js +71 -0
  121. package/dist/worker/merge-conflict-prompt.js.map +1 -0
  122. package/dist/worker/merge-conflict-remedy.d.ts +42 -0
  123. package/dist/worker/merge-conflict-remedy.d.ts.map +1 -0
  124. package/dist/worker/merge-conflict-remedy.js +28 -0
  125. package/dist/worker/merge-conflict-remedy.js.map +1 -0
  126. package/dist/worker/output-tail-synthesis.d.ts +15 -0
  127. package/dist/worker/output-tail-synthesis.d.ts.map +1 -0
  128. package/dist/worker/output-tail-synthesis.js +25 -0
  129. package/dist/worker/output-tail-synthesis.js.map +1 -0
  130. package/dist/worker/output-tail.d.ts +13 -0
  131. package/dist/worker/output-tail.d.ts.map +1 -0
  132. package/dist/worker/output-tail.js +31 -0
  133. package/dist/worker/output-tail.js.map +1 -0
  134. package/dist/worker/pause-context.d.ts +30 -0
  135. package/dist/worker/pause-context.d.ts.map +1 -0
  136. package/dist/worker/pause-context.js +98 -0
  137. package/dist/worker/pause-context.js.map +1 -0
  138. package/dist/worker/phase-loop.d.ts +66 -0
  139. package/dist/worker/phase-loop.d.ts.map +1 -1
  140. package/dist/worker/phase-loop.js +299 -31
  141. package/dist/worker/phase-loop.js.map +1 -1
  142. package/dist/worker/pr-feedback-handler.d.ts +46 -46
  143. package/dist/worker/pr-feedback-handler.d.ts.map +1 -1
  144. package/dist/worker/pr-feedback-handler.js +276 -105
  145. package/dist/worker/pr-feedback-handler.js.map +1 -1
  146. package/dist/worker/pr-manager.d.ts +5 -0
  147. package/dist/worker/pr-manager.d.ts.map +1 -1
  148. package/dist/worker/pr-manager.js +7 -0
  149. package/dist/worker/pr-manager.js.map +1 -1
  150. package/dist/worker/product-diff.d.ts +39 -0
  151. package/dist/worker/product-diff.d.ts.map +1 -0
  152. package/dist/worker/product-diff.js +43 -0
  153. package/dist/worker/product-diff.js.map +1 -0
  154. package/dist/worker/provisioning-failure.d.ts +14 -0
  155. package/dist/worker/provisioning-failure.d.ts.map +1 -0
  156. package/dist/worker/provisioning-failure.js +2 -0
  157. package/dist/worker/provisioning-failure.js.map +1 -0
  158. package/dist/worker/repo-checkout.d.ts +14 -0
  159. package/dist/worker/repo-checkout.d.ts.map +1 -1
  160. package/dist/worker/repo-checkout.js +19 -1
  161. package/dist/worker/repo-checkout.js.map +1 -1
  162. package/dist/worker/stage-comment-manager.d.ts +42 -1
  163. package/dist/worker/stage-comment-manager.d.ts.map +1 -1
  164. package/dist/worker/stage-comment-manager.js +205 -1
  165. package/dist/worker/stage-comment-manager.js.map +1 -1
  166. package/dist/worker/terminal-label-op-error.d.ts +23 -0
  167. package/dist/worker/terminal-label-op-error.d.ts.map +1 -0
  168. package/dist/worker/terminal-label-op-error.js +27 -0
  169. package/dist/worker/terminal-label-op-error.js.map +1 -0
  170. package/dist/worker/types.d.ts +161 -2
  171. package/dist/worker/types.d.ts.map +1 -1
  172. package/dist/worker/types.js +11 -0
  173. package/dist/worker/types.js.map +1 -1
  174. package/dist/worker/validate-fix-handler.d.ts +79 -0
  175. package/dist/worker/validate-fix-handler.d.ts.map +1 -0
  176. package/dist/worker/validate-fix-handler.js +320 -0
  177. package/dist/worker/validate-fix-handler.js.map +1 -0
  178. package/dist/worker/worker-result.d.ts +39 -0
  179. package/dist/worker/worker-result.d.ts.map +1 -0
  180. package/dist/worker/worker-result.js +10 -0
  181. package/dist/worker/worker-result.js.map +1 -0
  182. package/package.json +7 -6
@@ -1,8 +1,13 @@
1
- import { GhAuthError } from '@generacy-ai/workflow-engine';
1
+ import { GhAuthError, isTrustedCommentAuthor, } from '@generacy-ai/workflow-engine';
2
2
  import { JitTokenError } from '@generacy-ai/control-plane';
3
3
  import { PrLinker } from '../worker/pr-linker.js';
4
+ /**
5
+ * #869 / FR-004 idempotency marker embedded in bot-authored top-level PR
6
+ * comments. Grep-checked against `gh pr view --json comments` before posting
7
+ * to guarantee one notice per zero-trusted episode.
8
+ */
9
+ const UNTRUSTED_NOTICE_MARKER = '<!-- generacy:pr-feedback-untrusted-notice -->';
4
10
  const WAITING_FOR_PR_FEEDBACK_LABEL = 'waiting-for:address-pr-feedback';
5
- const DEDUP_PHASE = 'address-pr-feedback';
6
11
  const MIN_POLL_INTERVAL_MS = 10000;
7
12
  /**
8
13
  * Adaptive polling divisor for PR feedback monitor.
@@ -20,21 +25,26 @@ export class PrFeedbackMonitorService {
20
25
  logger;
21
26
  createClient;
22
27
  tokenProvider;
23
- phaseTracker;
24
- queueAdapter;
28
+ queueManager;
25
29
  options;
26
30
  prLinker;
27
31
  clusterGithubUsername;
28
32
  authHealth;
29
33
  githubAppCredentialId;
30
34
  abortController = null;
35
+ // #861: state-transition tracking for zero-unresolved skip logging. Key is
36
+ // `${owner}/${repo}#${prNumber}`. Never evicted (open PR set is bounded).
37
+ lastUnresolvedThreadCount = new Map();
38
+ // #869 / FR-004: transition-edge tracking for zero-trusted notice posting.
39
+ // Keyed as `${owner}/${repo}#${prNumber}`. Not persisted; monitor restart
40
+ // re-triggers the notice, which is idempotency-safe via the marker grep.
41
+ lastZeroTrustedState = new Map();
31
42
  state;
32
- constructor(logger, createClient, phaseTracker, queueAdapter, config, repositories, clusterGithubUsername, tokenProvider, authHealth, githubAppCredentialId) {
43
+ constructor(logger, createClient, queueManager, config, repositories, clusterGithubUsername, tokenProvider, authHealth, githubAppCredentialId) {
33
44
  this.logger = logger;
34
45
  this.createClient = createClient;
35
46
  this.tokenProvider = tokenProvider;
36
- this.phaseTracker = phaseTracker;
37
- this.queueAdapter = queueAdapter;
47
+ this.queueManager = queueManager;
38
48
  this.clusterGithubUsername = clusterGithubUsername;
39
49
  this.authHealth = authHealth ?? { recordResult: () => undefined };
40
50
  this.githubAppCredentialId = githubAppCredentialId;
@@ -95,32 +105,157 @@ export class PrFeedbackMonitorService {
95
105
  this.logger.warn({ owner, repo, issueNumber, assignees }, 'Issue has multiple assignees — may be processed by multiple clusters');
96
106
  }
97
107
  }
98
- // 3. Fetch review comments and filter for unresolved threads
108
+ // 3. Fetch review threads via GraphQL and filter for unresolved threads.
109
+ // #861: replaces the REST-comment-based path — REST never returned
110
+ // `.resolved`, so the previous filter always matched nothing.
111
+ // #869 / FR-005: trust-filter each unresolved thread's comments BEFORE
112
+ // enqueue. Zero-trusted PRs skip enqueue and emit the FR-003 warn +
113
+ // FR-004 top-level notice.
99
114
  let unresolvedThreadIds;
115
+ let totalUnresolvedThreads;
116
+ let untrustedCommentSkips;
117
+ let totalThreads;
100
118
  try {
101
- const comments = await client.getPRComments(owner, repo, prNumber);
102
- // Filter for root-level unresolved comments (not replies)
103
- const unresolvedComments = comments.filter((c) => c.resolved === false && !c.in_reply_to_id);
104
- unresolvedThreadIds = unresolvedComments.map((c) => c.id);
119
+ const threads = await client.getPRReviewThreads(owner, repo, prNumber);
120
+ totalThreads = threads.length;
121
+ const unresolvedThreads = threads.filter(t => !t.isResolved);
122
+ totalUnresolvedThreads = unresolvedThreads.length;
123
+ const botLogin = process.env['CLUSTER_GITHUB_USERNAME'] ?? process.env['GH_USERNAME'];
124
+ const trustedIds = [];
125
+ const skips = [];
126
+ for (const thread of unresolvedThreads) {
127
+ let threadHasTrusted = false;
128
+ for (const c of thread.comments) {
129
+ const decision = isTrustedCommentAuthor(c, 'pr-feedback', {
130
+ logger: this.logger,
131
+ ...(botLogin ? { botLogin } : {}),
132
+ });
133
+ if (decision.trusted) {
134
+ threadHasTrusted = true;
135
+ }
136
+ else {
137
+ skips.push({
138
+ commentId: c.id,
139
+ author: c.author,
140
+ authorAssociation: c.authorAssociation,
141
+ reason: decision.reason,
142
+ viewerDidAuthor: c.viewerDidAuthor,
143
+ });
144
+ }
145
+ }
146
+ if (threadHasTrusted) {
147
+ trustedIds.push(thread.rootCommentId);
148
+ }
149
+ }
150
+ unresolvedThreadIds = trustedIds;
151
+ untrustedCommentSkips = skips;
105
152
  }
106
153
  catch (error) {
107
- this.logger.error({ err: error, owner, repo, prNumber }, 'Failed to fetch PR comments');
154
+ if (error instanceof GhAuthError) {
155
+ if (this.githubAppCredentialId) {
156
+ this.authHealth.recordResult(this.githubAppCredentialId, { ok: false, statusCode: error.statusCode });
157
+ }
158
+ this.logger.error({ err: error, owner, repo, prNumber, statusCode: error.statusCode }, 'GraphQL review-threads call failed (auth)');
159
+ return false;
160
+ }
161
+ this.logger.warn({ error: error instanceof Error ? error.message : String(error), owner, repo, prNumber }, 'GraphQL review-threads call failed (transient)');
108
162
  return false;
109
163
  }
164
+ // Successful call — mark auth-health OK for this credential.
165
+ if (this.githubAppCredentialId) {
166
+ this.authHealth.recordResult(this.githubAppCredentialId, { ok: true });
167
+ }
168
+ const stateKey = `${owner}/${repo}#${prNumber}`;
169
+ // Case C: no unresolved threads at all — reset both state maps.
170
+ if (totalUnresolvedThreads === 0) {
171
+ // #861 state-transition logging: `info` on transition, `debug` on
172
+ // steady-state. Bootstrap (previous === undefined) counts as a transition.
173
+ const previous = this.lastUnresolvedThreadCount.get(stateKey);
174
+ const isTransition = previous === undefined || previous !== 0;
175
+ const logFn = isTransition ? this.logger.info : this.logger.debug;
176
+ logFn.call(this.logger, {
177
+ owner, repo, prNumber, issueNumber,
178
+ totalThreads,
179
+ unresolvedThreads: 0,
180
+ previousUnresolvedThreads: previous ?? null,
181
+ }, isTransition
182
+ ? 'No unresolved review threads (state change)'
183
+ : 'No unresolved review threads — skipping');
184
+ this.lastUnresolvedThreadCount.set(stateKey, 0);
185
+ this.lastZeroTrustedState.set(stateKey, false);
186
+ return false;
187
+ }
188
+ // Case B: unresolved threads exist, but zero of them are trust-live.
189
+ // #869 / FR-002, FR-003, FR-004: skip enqueue, emit warn log naming the
190
+ // untrusted skips, and post a top-level notice on the transition edge.
110
191
  if (unresolvedThreadIds.length === 0) {
111
- this.logger.debug({ owner, repo, prNumber, issueNumber }, 'No unresolved review threads — skipping');
192
+ // #878 skip-warn shape: per-comment viewerDidAuthor replaces the
193
+ // clusterIdentity / normalizedClusterIdentity / normalizedAuthor
194
+ // fields from the #874 login-comparison scheme.
195
+ this.logger.warn({
196
+ owner, repo, prNumber, issueNumber,
197
+ totalUnresolvedThreads,
198
+ untrustedCommentSkips: untrustedCommentSkips.map((s) => ({
199
+ commentId: s.commentId,
200
+ author: s.author,
201
+ authorAssociation: s.authorAssociation,
202
+ reason: s.reason,
203
+ viewerDidAuthor: s.viewerDidAuthor ?? null,
204
+ })),
205
+ }, 'PR has unresolved threads but every comment author is untrusted');
206
+ const previousZeroTrusted = this.lastZeroTrustedState.get(stateKey);
207
+ if (previousZeroTrusted !== true) {
208
+ await this.maybePostUntrustedNotice(client, owner, repo, prNumber);
209
+ }
210
+ this.lastZeroTrustedState.set(stateKey, true);
211
+ this.lastUnresolvedThreadCount.set(stateKey, totalUnresolvedThreads);
112
212
  return false;
113
213
  }
114
- this.logger.info({ owner, repo, prNumber, issueNumber, linkMethod, unresolvedCount: unresolvedThreadIds.length }, `Found ${unresolvedThreadIds.length} unresolved review thread(s)`);
115
- // 4. Atomic deduplication via tryMarkProcessed (SET NX)
116
- const isNew = await this.phaseTracker.tryMarkProcessed(owner, repo, issueNumber, DEDUP_PHASE);
117
- if (!isNew) {
118
- this.logger.info({ owner, repo, issueNumber, prNumber }, 'Skipping duplicate — PR feedback already enqueued for this issue');
214
+ // Case A: at least one thread is trust-live proceed to enqueue.
215
+ if (untrustedCommentSkips.length > 0) {
216
+ this.logger.debug({ owner, repo, prNumber, issueNumber, untrustedCommentSkips }, 'Some unresolved comments were skipped by trust filter (mixed-trust PR)');
217
+ }
218
+ this.lastZeroTrustedState.set(stateKey, false);
219
+ // Case A tail (#883): before enqueue, check for any `blocked:*` label on
220
+ // the linked issue. The handler adds `blocked:stuck-feedback-loop` when
221
+ // its fix cycle can't advance; the operator removes the label to permit
222
+ // another attempt. Any `blocked:*` prefix is the contract — no allow-list.
223
+ let issueLabels;
224
+ try {
225
+ issueLabels = await client.getIssueLabels(owner, repo, issueNumber);
226
+ }
227
+ catch (error) {
228
+ this.logger.warn({ err: error, owner, repo, issueNumber }, 'Failed to fetch issue labels for blocked:* skip check — proceeding without skip');
229
+ issueLabels = [];
230
+ }
231
+ const blockedLabel = issueLabels.find(l => l.startsWith('blocked:'));
232
+ if (blockedLabel) {
233
+ this.logger.info({
234
+ owner, repo, prNumber, issueNumber,
235
+ blockedLabel,
236
+ unresolvedThreads: unresolvedThreadIds.length,
237
+ reason: 'blocked-label-present',
238
+ }, 'Skipping PR-feedback enqueue while blocked:* label is present');
239
+ // Idempotent-state hygiene: keep the transition-log map fresh so the
240
+ // next non-blocked poll doesn't look like a fresh transition.
241
+ this.lastUnresolvedThreadCount.set(stateKey, unresolvedThreadIds.length);
119
242
  return false;
120
243
  }
244
+ this.logger.info({ owner, repo, prNumber, issueNumber, linkMethod, unresolvedCount: unresolvedThreadIds.length }, `Found ${unresolvedThreadIds.length} unresolved review thread(s)`);
245
+ this.lastUnresolvedThreadCount.set(stateKey, unresolvedThreadIds.length);
246
+ // 4. #879 / FR-010: add the waiting-for label idempotently BEFORE enqueue so
247
+ // it survives an `enqueueIfAbsent → false` in-flight-collision drop. Label
248
+ // presence = "feedback pending"; enqueue is work scheduling. Failure to
249
+ // add is non-fatal warn.
250
+ try {
251
+ await client.addLabels(owner, repo, issueNumber, [WAITING_FOR_PR_FEEDBACK_LABEL]);
252
+ }
253
+ catch (error) {
254
+ this.logger.warn({ err: error, owner, repo, issueNumber }, 'Failed to add waiting-for:address-pr-feedback label');
255
+ }
121
256
  // 5. Resolve workflow name from issue labels
122
257
  const workflowName = await this.resolveWorkflowName(owner, repo, issueNumber);
123
- // 6. Build and enqueue queue item
258
+ // 6. Build queue item
124
259
  const metadata = {
125
260
  prNumber,
126
261
  reviewThreadIds: unresolvedThreadIds,
@@ -136,16 +271,67 @@ export class PrFeedbackMonitorService {
136
271
  metadata: metadata,
137
272
  queueReason: 'resume',
138
273
  };
139
- await this.queueAdapter.enqueue(queueItem);
274
+ // 7. #879 / FR-001: atomic in-flight-checked enqueue. Replaces the pre-#879
275
+ // `phaseTracker.tryMarkProcessed` SET-NX dedupe. Self-clearing by
276
+ // construction: when the handler completes/fails/drops via
277
+ // `QueueManager.complete()` / `.release()`, the itemKey leaves the
278
+ // in-flight SET and the next trusted state re-enqueues on the following
279
+ // poll — no TTL wait, no per-surface bookkeeping.
280
+ const itemKey = `${owner}/${repo}#${issueNumber}`;
281
+ const enqueued = await this.queueManager.enqueueIfAbsent(queueItem);
282
+ if (!enqueued) {
283
+ // FR-009: monitor-side context log paired with the adapter-level line.
284
+ this.logger.info({ itemKey, reason: 'in-flight', prNumber, issueNumber, owner, repo }, 'Dropping PR-feedback enqueue (item already in flight)');
285
+ return false;
286
+ }
140
287
  this.logger.info({ owner, repo, issueNumber, prNumber, command: queueItem.command }, 'PR feedback work enqueued');
141
- // 7. Add waiting-for label to issue
288
+ return true;
289
+ }
290
+ // ==========================================================================
291
+ // Zero-trusted notice posting (#869 / FR-004)
292
+ // ==========================================================================
293
+ /**
294
+ * Post a single top-level PR comment notifying the operator that every
295
+ * unresolved review-thread comment is currently untrusted. Idempotent via
296
+ * the `UNTRUSTED_NOTICE_MARKER` grep against existing PR comments. Failures
297
+ * to list or post comments are non-fatal — logged and swallowed so they
298
+ * never break the poll cycle.
299
+ */
300
+ async maybePostUntrustedNotice(client, owner, repo, prNumber) {
301
+ let existingComments;
142
302
  try {
143
- await client.addLabels(owner, repo, issueNumber, [WAITING_FOR_PR_FEEDBACK_LABEL]);
303
+ existingComments = await client.listPrCommentBodies(owner, repo, prNumber);
144
304
  }
145
- catch (error) {
146
- this.logger.warn({ err: error, owner, repo, issueNumber }, 'Failed to add waiting-for:address-pr-feedback label');
305
+ catch (err) {
306
+ this.logger.warn({ err: String(err), owner, repo, prNumber }, 'Failed to list PR comments for untrusted-notice idempotency check — skipping notice this cycle');
307
+ return;
308
+ }
309
+ if (existingComments.some(body => body.includes(UNTRUSTED_NOTICE_MARKER))) {
310
+ this.logger.debug({ owner, repo, prNumber }, 'Untrusted-notice marker already present — skipping notice post');
311
+ return;
312
+ }
313
+ const body = [
314
+ UNTRUSTED_NOTICE_MARKER,
315
+ '',
316
+ '⚠️ **Feedback requires a trusted author**',
317
+ '',
318
+ 'This PR has unresolved review threads, but every comment author is currently',
319
+ 'classified as untrusted by the PR-feedback loop\'s trust filter (see #842).',
320
+ '',
321
+ 'The loop will not automatically address this feedback until either:',
322
+ '- A repository OWNER / MEMBER / COLLABORATOR replies to one of the threads, **or**',
323
+ '- The cluster identity is configured to match one of the comment authors',
324
+ ' (see the `CLUSTER_GITHUB_USERNAME` / `GH_USERNAME` chain).',
325
+ '',
326
+ 'This is an automated notice from the PR-feedback monitor.',
327
+ ].join('\n');
328
+ try {
329
+ await client.postPrComment(owner, repo, prNumber, body);
330
+ this.logger.info({ owner, repo, prNumber }, 'Posted untrusted-feedback notice on PR (FR-004)');
331
+ }
332
+ catch (err) {
333
+ this.logger.warn({ err: String(err), owner, repo, prNumber }, 'Failed to post untrusted-feedback notice — will retry on next transition');
147
334
  }
148
- return true;
149
335
  }
150
336
  // ==========================================================================
151
337
  // Polling
@@ -1 +1 @@
1
- {"version":3,"file":"pr-feedback-monitor-service.js","sourceRoot":"","sources":["../../src/services/pr-feedback-monitor-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-feedback-monitor-service.js","sourceRoot":"","sources":["../../src/services/pr-feedback-monitor-service.ts"],"names":[],"mappings":"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"}
@@ -21,8 +21,12 @@ export declare class RedisQueueAdapter implements QueueManager {
21
21
  private readonly logger;
22
22
  private readonly maxRetries;
23
23
  private claimCommandDefined;
24
+ private enqueueIfAbsentCommandDefined;
24
25
  constructor(redis: Redis, logger: Logger, config?: Pick<DispatchConfig, 'maxRetries'>);
25
26
  private ensureClaimCommand;
27
+ private ensureEnqueueIfAbsentCommand;
28
+ enqueueIfAbsent(item: QueueItem): Promise<boolean>;
29
+ hasInFlight(itemKey: string): Promise<boolean>;
26
30
  enqueue(item: QueueItem): Promise<void>;
27
31
  claim(workerId: string): Promise<QueueItem | null>;
28
32
  release(workerId: string, item: QueueItem): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"redis-queue-adapter.d.ts","sourceRoot":"","sources":["../../src/services/redis-queue-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAC1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA8BzD,UAAU,MAAM;IACd,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACxD;AAcD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,mBAAmB,CAAS;gBAExB,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC;IAMrF,OAAO,CAAC,kBAAkB;IASpB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA8ClD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1D,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAShC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAwC3E,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;CA2B9C"}
1
+ {"version":3,"file":"redis-queue-adapter.d.ts","sourceRoot":"","sources":["../../src/services/redis-queue-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAC1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAmDzD,UAAU,MAAM;IACd,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACxD;AAcD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,6BAA6B,CAAS;gBAElC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC;IAMrF,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,4BAA4B;IAS9B,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA2ClD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9C,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA8ClD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1D,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAShC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAwC3E,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;CA2B9C"}
@@ -3,6 +3,26 @@ const PENDING_KEY = 'orchestrator:queue:pending';
3
3
  const CLAIMED_KEY_PREFIX = 'orchestrator:queue:claimed:';
4
4
  const HEARTBEAT_KEY_PREFIX = 'orchestrator:worker:';
5
5
  const DEAD_LETTER_KEY = 'orchestrator:queue:dead-letter';
6
+ const IN_FLIGHT_KEY = 'orchestrator:queue:in-flight-items';
7
+ /**
8
+ * Lua script for atomic in-flight-checked enqueue.
9
+ * KEYS[1] = pending sorted set
10
+ * KEYS[2] = in-flight SET
11
+ * ARGV[1] = itemKey
12
+ * ARGV[2] = priority (numeric string)
13
+ * ARGV[3] = serialized item JSON
14
+ *
15
+ * Returns 1 if enqueued, 0 if already in flight.
16
+ */
17
+ const ENQUEUE_IF_ABSENT_SCRIPT = `
18
+ local exists = redis.call('SISMEMBER', KEYS[2], ARGV[1])
19
+ if exists == 1 then
20
+ return 0
21
+ end
22
+ redis.call('SADD', KEYS[2], ARGV[1])
23
+ redis.call('ZADD', KEYS[1], tonumber(ARGV[2]), ARGV[3])
24
+ return 1
25
+ `;
6
26
  /**
7
27
  * Lua script for atomic claim: ZPOPMIN + HSET claimed + SET heartbeat.
8
28
  * KEYS[1] = pending sorted set
@@ -43,6 +63,7 @@ export class RedisQueueAdapter {
43
63
  logger;
44
64
  maxRetries;
45
65
  claimCommandDefined = false;
66
+ enqueueIfAbsentCommandDefined = false;
46
67
  constructor(redis, logger, config) {
47
68
  this.redis = redis;
48
69
  this.logger = logger;
@@ -57,6 +78,53 @@ export class RedisQueueAdapter {
57
78
  });
58
79
  this.claimCommandDefined = true;
59
80
  }
81
+ ensureEnqueueIfAbsentCommand() {
82
+ if (this.enqueueIfAbsentCommandDefined)
83
+ return;
84
+ this.redis.defineCommand('enqueueIfAbsent', {
85
+ numberOfKeys: 2,
86
+ lua: ENQUEUE_IF_ABSENT_SCRIPT,
87
+ });
88
+ this.enqueueIfAbsentCommandDefined = true;
89
+ }
90
+ async enqueueIfAbsent(item) {
91
+ this.ensureEnqueueIfAbsentCommand();
92
+ const itemKey = buildItemKey(item);
93
+ const priority = getPriorityScore(item.queueReason);
94
+ const serialized = {
95
+ ...item,
96
+ priority,
97
+ attemptCount: 0,
98
+ itemKey,
99
+ };
100
+ try {
101
+ const result = await this.redis.enqueueIfAbsent(PENDING_KEY, IN_FLIGHT_KEY, itemKey, String(priority), JSON.stringify(serialized));
102
+ const enqueued = result === 1;
103
+ if (enqueued) {
104
+ this.logger.info({ owner: item.owner, repo: item.repo, issue: item.issueNumber, priority, itemKey }, 'Item enqueued to Redis sorted set (in-flight-checked)');
105
+ }
106
+ else {
107
+ // #879 / FR-009: structured drop signal for the in-flight-collision path.
108
+ // Distinct from the Redis-error warn path below.
109
+ this.logger.info({ itemKey, reason: 'in-flight' }, 'Dropping enqueue (item already in flight)');
110
+ }
111
+ return enqueued;
112
+ }
113
+ catch (error) {
114
+ this.logger.warn({ err: error, itemKey }, 'Redis error in enqueueIfAbsent, dropping (fail-safe)');
115
+ return false;
116
+ }
117
+ }
118
+ async hasInFlight(itemKey) {
119
+ try {
120
+ const result = await this.redis.sismember(IN_FLIGHT_KEY, itemKey);
121
+ return result === 1;
122
+ }
123
+ catch (error) {
124
+ this.logger.warn({ err: error, itemKey }, 'Redis error in hasInFlight');
125
+ return false;
126
+ }
127
+ }
60
128
  async enqueue(item) {
61
129
  const itemKey = buildItemKey(item);
62
130
  const priority = getPriorityScore(item.queueReason);
@@ -116,21 +184,24 @@ export class RedisQueueAdapter {
116
184
  const parsed = JSON.parse(claimedRaw);
117
185
  attemptCount = parsed.attemptCount + 1;
118
186
  }
119
- // Clean up claimed hash and heartbeat
120
- await this.redis.hdel(claimedKey, itemKey);
121
- await this.redis.del(heartbeatKey);
122
187
  if (attemptCount >= this.maxRetries) {
123
- // Dead-letter: too many retries
188
+ // Dead-letter: too many retries. Co-atomically remove from in-flight SET.
124
189
  const deadLetterItem = {
125
190
  ...item,
126
191
  attemptCount,
127
192
  itemKey,
128
193
  };
129
- await this.redis.zadd(DEAD_LETTER_KEY, Date.now(), JSON.stringify(deadLetterItem));
194
+ await this.redis
195
+ .multi()
196
+ .hdel(claimedKey, itemKey)
197
+ .del(heartbeatKey)
198
+ .zadd(DEAD_LETTER_KEY, Date.now(), JSON.stringify(deadLetterItem))
199
+ .srem(IN_FLIGHT_KEY, itemKey)
200
+ .exec();
130
201
  this.logger.warn({ workerId, itemKey, attemptCount, maxRetries: this.maxRetries }, 'Item dead-lettered after max retries');
131
202
  }
132
203
  else {
133
- // Re-queue with retry priority
204
+ // Re-queue with retry priority. Item stays in in-flight SET (still in flight).
134
205
  const retryPriority = getPriorityScore('retry');
135
206
  const requeueItem = {
136
207
  ...item,
@@ -139,7 +210,12 @@ export class RedisQueueAdapter {
139
210
  attemptCount,
140
211
  itemKey,
141
212
  };
142
- await this.redis.zadd(PENDING_KEY, retryPriority, JSON.stringify(requeueItem));
213
+ await this.redis
214
+ .multi()
215
+ .hdel(claimedKey, itemKey)
216
+ .del(heartbeatKey)
217
+ .zadd(PENDING_KEY, retryPriority, JSON.stringify(requeueItem))
218
+ .exec();
143
219
  this.logger.info({ workerId, itemKey, attemptCount }, 'Item released back to pending queue');
144
220
  }
145
221
  }
@@ -152,9 +228,13 @@ export class RedisQueueAdapter {
152
228
  const claimedKey = buildClaimedKey(workerId);
153
229
  const heartbeatKey = buildHeartbeatKey(workerId);
154
230
  try {
155
- await this.redis.hdel(claimedKey, itemKey);
156
- await this.redis.del(heartbeatKey);
157
- this.logger.info({ workerId, itemKey }, 'Item completed and removed from claimed set');
231
+ await this.redis
232
+ .multi()
233
+ .hdel(claimedKey, itemKey)
234
+ .del(heartbeatKey)
235
+ .srem(IN_FLIGHT_KEY, itemKey)
236
+ .exec();
237
+ this.logger.info({ workerId, itemKey }, 'Item completed and removed from claimed set + in-flight index');
158
238
  }
159
239
  catch (error) {
160
240
  this.logger.warn({ err: error, workerId, itemKey }, 'Redis error in complete');
@@ -1 +1 @@
1
- {"version":3,"file":"redis-queue-adapter.js","sourceRoot":"","sources":["../../src/services/redis-queue-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-queue-adapter.js","sourceRoot":"","sources":["../../src/services/redis-queue-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,19 @@
1
1
  import type { Redis } from 'ioredis';
2
- import type { QueueManager, WorkerHandler } from '../types/index.js';
2
+ import type { QueueManager, WorkerHandler, QueueItem } from '../types/index.js';
3
3
  import type { DispatchConfig } from '../config/index.js';
4
4
  import type { LeaseManager } from './lease-manager.js';
5
+ import type { FailureMetadata } from '../worker/worker-result.js';
5
6
  export type LabelCleanupFn = (owner: string, repo: string, issueNumber: number) => Promise<void>;
7
+ /**
8
+ * Callback invoked when `WorkerHandler` returns `{ status: 'failed-terminal' }` (#889).
9
+ * Ordinary handler failures still release; only handler-returned terminal
10
+ * failures trigger this path. Implementations MUST NOT throw — dispatcher
11
+ * wraps the call in try/catch and always proceeds to `queue.complete()`.
12
+ *
13
+ * Typical wiring (server.ts): (a) best-effort `agent:error` label add,
14
+ * (b) `StageCommentManager.postFailureAlert({ stage: 'label-op', ... })`.
15
+ */
16
+ export type TerminalFailureHandler = (item: QueueItem, failureMetadata: FailureMetadata) => Promise<void>;
6
17
  interface Logger {
7
18
  info(msg: string): void;
8
19
  info(obj: Record<string, unknown>, msg: string): void;
@@ -34,6 +45,7 @@ export declare class WorkerDispatcher {
34
45
  private readonly handler;
35
46
  private readonly activeWorkers;
36
47
  private readonly labelCleanup?;
48
+ private readonly terminalFailureHandler?;
37
49
  /** In-memory heartbeat timestamps (used when Redis is null) */
38
50
  private readonly heartbeatTimestamps;
39
51
  private abortController;
@@ -43,7 +55,7 @@ export declare class WorkerDispatcher {
43
55
  private readonly workerLeases;
44
56
  /** Whether polling is paused (e.g., after lease_denied, waiting for slot_available) */
45
57
  private pollingPaused;
46
- constructor(queue: QueueManager, redis: Redis | null, logger: Logger, config: DispatchConfig, handler: WorkerHandler, labelCleanup?: LabelCleanupFn);
58
+ constructor(queue: QueueManager, redis: Redis | null, logger: Logger, config: DispatchConfig, handler: WorkerHandler, labelCleanup?: LabelCleanupFn, terminalFailureHandler?: TerminalFailureHandler);
47
59
  /**
48
60
  * Start the poll loop and reaper loop.
49
61
  */