@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
@@ -0,0 +1,295 @@
1
+ /**
2
+ * #898 T014 — Poll-based monitor that enqueues `resolve-merge-conflicts`
3
+ * queue items for issues sitting at `waiting-for:merge-conflicts` + `agent:paused`.
4
+ *
5
+ * Shape template: `pr-feedback-monitor-service.ts`.
6
+ * Contract: `specs/898-found-during-cockpit-v1/contracts/monitor-contract.md`.
7
+ *
8
+ * Dedup mechanism: sole use of `QueueManager.enqueueIfAbsent(itemKey)` — no
9
+ * `phase-tracker:*:resume:*` key. In-flight collisions collapse silently.
10
+ * Blocked-label pre-enqueue skip mirrors the `#883` pattern.
11
+ */
12
+ import { GhAuthError, } from '@generacy-ai/workflow-engine';
13
+ import { JitTokenError } from '@generacy-ai/control-plane';
14
+ import { filterByAssignee } from './identity.js';
15
+ const WAITING_FOR_MERGE_CONFLICTS_LABEL = 'waiting-for:merge-conflicts';
16
+ const AGENT_PAUSED_LABEL = 'agent:paused';
17
+ const MIN_POLL_INTERVAL_MS = 10_000;
18
+ /**
19
+ * Adaptive polling divisor — halves poll interval when webhook stream goes
20
+ * quiet. Matches `PrFeedbackMonitorService` (Q divisor from #869).
21
+ */
22
+ const ADAPTIVE_DIVISOR = 2;
23
+ /**
24
+ * MergeConflictMonitorService — enqueues `resolve-merge-conflicts` work when
25
+ * the pause state (`waiting-for:merge-conflicts + agent:paused`) is detected
26
+ * on an assigned open issue.
27
+ */
28
+ export class MergeConflictMonitorService {
29
+ logger;
30
+ createClient;
31
+ tokenProvider;
32
+ queueManager;
33
+ options;
34
+ clusterGithubUsername;
35
+ authHealth;
36
+ githubAppCredentialId;
37
+ abortController = null;
38
+ state;
39
+ constructor(logger, createClient, queueManager, config, repositories, clusterGithubUsername, tokenProvider, authHealth, githubAppCredentialId) {
40
+ this.logger = logger;
41
+ this.createClient = createClient;
42
+ this.tokenProvider = tokenProvider;
43
+ this.queueManager = queueManager;
44
+ this.clusterGithubUsername = clusterGithubUsername;
45
+ this.authHealth = authHealth ?? { recordResult: () => undefined };
46
+ this.githubAppCredentialId = githubAppCredentialId;
47
+ this.options = {
48
+ repositories,
49
+ pollIntervalMs: config.pollIntervalMs,
50
+ adaptivePolling: config.adaptivePolling,
51
+ maxConcurrentPolls: config.maxConcurrentPolls,
52
+ };
53
+ this.state = {
54
+ isPolling: false,
55
+ webhookHealthy: true,
56
+ lastWebhookEvent: null,
57
+ currentPollIntervalMs: config.pollIntervalMs,
58
+ basePollIntervalMs: config.pollIntervalMs,
59
+ };
60
+ }
61
+ // ==========================================================================
62
+ // Event Processing
63
+ // ==========================================================================
64
+ /**
65
+ * Process a merge-conflict event: verify precondition, check blocked-label
66
+ * skip, resolve workflow name, enqueue via `enqueueIfAbsent`.
67
+ *
68
+ * Returns true if enqueued, false if skipped or duplicate.
69
+ */
70
+ async processMergeConflictEvent(event) {
71
+ const { owner, repo, issueNumber, issueLabels, source } = event;
72
+ // Precondition: both waiting-for:merge-conflicts AND agent:paused must be
73
+ // present. Missing agent:paused → drop (pause is not actually in place).
74
+ const hasWaitingFor = issueLabels.includes(WAITING_FOR_MERGE_CONFLICTS_LABEL);
75
+ const hasPaused = issueLabels.includes(AGENT_PAUSED_LABEL);
76
+ if (!hasWaitingFor || !hasPaused) {
77
+ this.logger.debug({
78
+ owner, repo, issueNumber, source,
79
+ hasWaitingFor, hasPaused,
80
+ }, 'Precondition failed for merge-conflict enqueue (need waiting-for + agent:paused)');
81
+ return false;
82
+ }
83
+ // Blocked-label skip: any `blocked:*` on the issue → do not enqueue.
84
+ // Operator removes the block label → next poll re-enables enqueue naturally.
85
+ const blockedLabel = issueLabels.find((l) => l.startsWith('blocked:'));
86
+ if (blockedLabel) {
87
+ this.logger.info({
88
+ owner, repo, issueNumber,
89
+ blockedLabel,
90
+ reason: 'blocked-label-present',
91
+ }, 'Skipping merge-conflict enqueue while blocked:* label is present');
92
+ return false;
93
+ }
94
+ // Resolve workflow name from labels; default speckit-feature.
95
+ const workflowLabel = issueLabels.find((l) => l.startsWith('workflow:'));
96
+ const workflowName = workflowLabel
97
+ ? workflowLabel.slice('workflow:'.length)
98
+ : 'speckit-feature';
99
+ // Build queue item.
100
+ const queueItem = {
101
+ owner,
102
+ repo,
103
+ issueNumber,
104
+ workflowName,
105
+ command: 'resolve-merge-conflicts',
106
+ priority: Date.now(),
107
+ enqueuedAt: new Date().toISOString(),
108
+ metadata: {},
109
+ queueReason: 'resume',
110
+ };
111
+ // Atomic enqueue via in-flight dedupe (#862/#879 pattern).
112
+ const itemKey = `${owner}/${repo}#${issueNumber}`;
113
+ const enqueued = await this.queueManager.enqueueIfAbsent(queueItem);
114
+ if (!enqueued) {
115
+ this.logger.info({ itemKey, reason: 'in-flight', owner, repo, issueNumber }, 'Dropping merge-conflict enqueue (item already in flight)');
116
+ return false;
117
+ }
118
+ this.logger.info({ owner, repo, issueNumber, command: queueItem.command, source }, 'Merge-conflict resolution enqueued');
119
+ return true;
120
+ }
121
+ // ==========================================================================
122
+ // Polling
123
+ // ==========================================================================
124
+ async startPolling() {
125
+ if (this.state.isPolling) {
126
+ this.logger.warn('Merge-conflict monitor polling already running');
127
+ return;
128
+ }
129
+ const ac = new AbortController();
130
+ this.abortController = ac;
131
+ this.state.isPolling = true;
132
+ this.logger.info({ intervalMs: this.state.currentPollIntervalMs, repos: this.options.repositories.length }, 'Starting merge-conflict monitor polling');
133
+ while (!ac.signal.aborted) {
134
+ try {
135
+ await this.poll();
136
+ }
137
+ catch (error) {
138
+ this.logger.error({ err: error }, 'Error during merge-conflict poll cycle');
139
+ }
140
+ if (this.options.adaptivePolling) {
141
+ this.updateAdaptivePolling();
142
+ }
143
+ await this.sleep(this.state.currentPollIntervalMs, ac.signal);
144
+ }
145
+ this.state.isPolling = false;
146
+ this.logger.info('Merge-conflict monitor polling loop stopped');
147
+ }
148
+ stopPolling() {
149
+ if (this.abortController) {
150
+ this.abortController.abort();
151
+ this.abortController = null;
152
+ this.logger.info('Merge-conflict monitor polling stop requested');
153
+ }
154
+ }
155
+ async poll() {
156
+ const repos = this.options.repositories;
157
+ if (repos.length === 0)
158
+ return;
159
+ const semaphore = new Semaphore(this.options.maxConcurrentPolls);
160
+ const pollTasks = repos.map(({ owner, repo }) => semaphore.acquire().then(async (release) => {
161
+ try {
162
+ await this.pollRepo(owner, repo);
163
+ }
164
+ finally {
165
+ release();
166
+ }
167
+ }));
168
+ await Promise.allSettled(pollTasks);
169
+ }
170
+ /**
171
+ * Poll a single repository for issues sitting at `waiting-for:merge-conflicts`.
172
+ * Filters by assignee, then processes each via `processMergeConflictEvent`.
173
+ */
174
+ async pollRepo(owner, repo) {
175
+ const client = this.createClient(undefined, this.tokenProvider);
176
+ let allIssues;
177
+ try {
178
+ allIssues = await client.listIssuesWithLabel(owner, repo, WAITING_FOR_MERGE_CONFLICTS_LABEL);
179
+ if (this.githubAppCredentialId) {
180
+ this.authHealth.recordResult(this.githubAppCredentialId, { ok: true });
181
+ }
182
+ }
183
+ catch (error) {
184
+ if (error instanceof JitTokenError) {
185
+ this.logger.warn({ code: error.code, message: error.message, owner, repo }, 'JIT GitHub token refresh failed — skipping merge-conflict monitor cycle');
186
+ return;
187
+ }
188
+ if (error instanceof GhAuthError) {
189
+ if (this.githubAppCredentialId) {
190
+ this.authHealth.recordResult(this.githubAppCredentialId, { ok: false, statusCode: error.statusCode });
191
+ }
192
+ this.logger.warn({ credentialId: this.githubAppCredentialId, statusCode: error.statusCode, owner, repo }, 'GitHub authentication failing on merge-conflict monitor — investigate credential refresh chain');
193
+ return;
194
+ }
195
+ this.logger.warn({ err: String(error), owner, repo }, 'Error polling repository for merge-conflict pauses');
196
+ return;
197
+ }
198
+ const issues = filterByAssignee(allIssues, this.clusterGithubUsername, this.logger);
199
+ if (issues.length === 0) {
200
+ this.logger.debug({ owner, repo }, 'No merge-conflict pauses found this cycle');
201
+ return;
202
+ }
203
+ this.logger.info({ owner, repo, count: issues.length }, 'Merge-conflict pauses found');
204
+ for (const issue of issues) {
205
+ const event = {
206
+ owner,
207
+ repo,
208
+ issueNumber: issue.number,
209
+ issueLabels: issue.labels.map((l) => l.name),
210
+ source: 'poll',
211
+ };
212
+ try {
213
+ await this.processMergeConflictEvent(event);
214
+ }
215
+ catch (err) {
216
+ this.logger.warn({ err: String(err), owner, repo, issueNumber: issue.number }, 'Error processing merge-conflict event — continuing to next issue');
217
+ }
218
+ }
219
+ }
220
+ // ==========================================================================
221
+ // Adaptive Polling
222
+ // ==========================================================================
223
+ recordWebhookEvent() {
224
+ this.state.lastWebhookEvent = Date.now();
225
+ const wasUnhealthy = !this.state.webhookHealthy;
226
+ this.state.webhookHealthy = true;
227
+ if (wasUnhealthy) {
228
+ this.state.currentPollIntervalMs = this.state.basePollIntervalMs;
229
+ this.logger.info({ intervalMs: this.state.currentPollIntervalMs }, 'Webhook reconnected, restoring merge-conflict monitor poll interval');
230
+ }
231
+ }
232
+ updateAdaptivePolling() {
233
+ if (this.state.lastWebhookEvent === null)
234
+ return;
235
+ const timeSinceLastWebhook = Date.now() - this.state.lastWebhookEvent;
236
+ const unhealthyThreshold = this.state.basePollIntervalMs * 2;
237
+ if (timeSinceLastWebhook > unhealthyThreshold && this.state.webhookHealthy) {
238
+ this.state.webhookHealthy = false;
239
+ this.state.currentPollIntervalMs = Math.max(MIN_POLL_INTERVAL_MS, Math.floor(this.state.basePollIntervalMs / ADAPTIVE_DIVISOR));
240
+ this.logger.info({ intervalMs: this.state.currentPollIntervalMs, timeSinceLastWebhook }, 'Webhooks appear unhealthy, increasing merge-conflict poll frequency');
241
+ }
242
+ }
243
+ // ==========================================================================
244
+ // State access
245
+ // ==========================================================================
246
+ getState() {
247
+ return { ...this.state };
248
+ }
249
+ // ==========================================================================
250
+ // Utilities
251
+ // ==========================================================================
252
+ sleep(ms, signal) {
253
+ return new Promise((resolve) => {
254
+ if (signal.aborted) {
255
+ resolve();
256
+ return;
257
+ }
258
+ const timer = setTimeout(resolve, ms);
259
+ const onAbort = () => {
260
+ clearTimeout(timer);
261
+ resolve();
262
+ };
263
+ signal.addEventListener('abort', onAbort, { once: true });
264
+ });
265
+ }
266
+ }
267
+ /**
268
+ * Simple semaphore for bounded concurrency.
269
+ */
270
+ class Semaphore {
271
+ count;
272
+ waiting = [];
273
+ constructor(max) {
274
+ this.count = max;
275
+ }
276
+ async acquire() {
277
+ if (this.count > 0) {
278
+ this.count--;
279
+ return () => this.release();
280
+ }
281
+ return new Promise((resolve) => {
282
+ this.waiting.push(() => {
283
+ this.count--;
284
+ resolve(() => this.release());
285
+ });
286
+ });
287
+ }
288
+ release() {
289
+ this.count++;
290
+ const next = this.waiting.shift();
291
+ if (next)
292
+ next();
293
+ }
294
+ }
295
+ //# sourceMappingURL=merge-conflict-monitor-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-conflict-monitor-service.js","sourceRoot":"","sources":["../../src/services/merge-conflict-monitor-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveOrchestratorVersion(): string;
2
+ //# sourceMappingURL=orchestrator-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-version.d.ts","sourceRoot":"","sources":["../../src/services/orchestrator-version.ts"],"names":[],"mappings":"AAMA,wBAAgB,0BAA0B,IAAI,MAAM,CAkBnD"}
@@ -0,0 +1,23 @@
1
+ import { readFileSync } from 'node:fs';
2
+ function isRealVersion(candidate) {
3
+ return candidate !== undefined && candidate !== '' && candidate !== '0.0.0';
4
+ }
5
+ export function resolveOrchestratorVersion() {
6
+ const envValue = process.env.ORCHESTRATOR_VERSION;
7
+ if (isRealVersion(envValue)) {
8
+ return envValue;
9
+ }
10
+ try {
11
+ const raw = readFileSync(new URL('../../package.json', import.meta.url), 'utf-8');
12
+ const parsed = JSON.parse(raw);
13
+ const pkgVersion = typeof parsed.version === 'string' ? parsed.version : undefined;
14
+ if (isRealVersion(pkgVersion)) {
15
+ return pkgVersion;
16
+ }
17
+ }
18
+ catch {
19
+ // fall through to sentinel
20
+ }
21
+ return 'unknown';
22
+ }
23
+ //# sourceMappingURL=orchestrator-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-version.js","sourceRoot":"","sources":["../../src/services/orchestrator-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,SAAS,aAAa,CAAC,SAA6B;IAClD,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,IAAI,SAAS,KAAK,OAAO,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAClD,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -27,6 +27,16 @@ export declare class PhaseTrackerService implements PhaseTracker {
27
27
  clear(owner: string, repo: string, issue: number, phase: string): Promise<void>;
28
28
  tryMarkProcessed(owner: string, repo: string, issue: number, phase: string): Promise<boolean>;
29
29
  markProcessed(owner: string, repo: string, issue: number, phase: string): Promise<void>;
30
+ /**
31
+ * Raw-key duplicate check (#892). Semantically identical to `isDuplicate`
32
+ * but with caller-owned key namespace. Enables `base-advance-tracker:` keys
33
+ * sitting alongside the phase-tracker namespace without an interface split.
34
+ */
35
+ isDuplicateRaw(key: string): Promise<boolean>;
36
+ /**
37
+ * Raw-key mark-processed (#892). Caller-owned key namespace.
38
+ */
39
+ markProcessedRaw(key: string): Promise<void>;
30
40
  }
31
41
  export {};
32
42
  //# sourceMappingURL=phase-tracker-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"phase-tracker-service.d.ts","sourceRoot":"","sources":["../../src/services/phase-tracker-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,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;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAM9E,OAAO,CAAC,QAAQ;IAIV,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/E,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB7F,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB9F"}
1
+ {"version":3,"file":"phase-tracker-service.d.ts","sourceRoot":"","sources":["../../src/services/phase-tracker-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,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;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAM9E,OAAO,CAAC,QAAQ;IAIV,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/E,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB7F,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7F;;;;OAIG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBnD;;OAEG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBnD"}
@@ -78,5 +78,43 @@ export class PhaseTrackerService {
78
78
  this.logger.warn({ err: error, key }, 'Redis error in markProcessed, deduplication may not work for this event');
79
79
  }
80
80
  }
81
+ /**
82
+ * Raw-key duplicate check (#892). Semantically identical to `isDuplicate`
83
+ * but with caller-owned key namespace. Enables `base-advance-tracker:` keys
84
+ * sitting alongside the phase-tracker namespace without an interface split.
85
+ */
86
+ async isDuplicateRaw(key) {
87
+ if (!this.redis) {
88
+ this.logger.warn('Redis unavailable for phase tracker, treating as not duplicate');
89
+ return false;
90
+ }
91
+ try {
92
+ const exists = await this.redis.exists(key);
93
+ if (exists) {
94
+ this.logger.info({ key }, 'Duplicate event detected (raw key)');
95
+ }
96
+ return exists === 1;
97
+ }
98
+ catch (error) {
99
+ this.logger.warn({ err: error, key }, 'Redis error in isDuplicateRaw, treating as not duplicate');
100
+ return false;
101
+ }
102
+ }
103
+ /**
104
+ * Raw-key mark-processed (#892). Caller-owned key namespace.
105
+ */
106
+ async markProcessedRaw(key) {
107
+ if (!this.redis) {
108
+ this.logger.warn('Redis unavailable for phase tracker, skipping markProcessedRaw');
109
+ return;
110
+ }
111
+ try {
112
+ await this.redis.set(key, '1', 'EX', this.ttlSeconds);
113
+ this.logger.info({ key, ttl: this.ttlSeconds }, 'Marked processed (raw key)');
114
+ }
115
+ catch (error) {
116
+ this.logger.warn({ err: error, key }, 'Redis error in markProcessedRaw, deduplication may not work for this event');
117
+ }
118
+ }
81
119
  }
82
120
  //# sourceMappingURL=phase-tracker-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"phase-tracker-service.js","sourceRoot":"","sources":["../../src/services/phase-tracker-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"phase-tracker-service.js","sourceRoot":"","sources":["../../src/services/phase-tracker-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { FastifyBaseLogger } from 'fastify';
2
+ import { PostActivationRetryService } from './post-activation-retry.js';
3
+ import { BootResumeService } from './boot-resume-service.js';
4
+ export type DispatchOutcome = 'retry' | 'resume' | 'noop';
5
+ export interface DispatchOptions {
6
+ logger: FastifyBaseLogger;
7
+ sendRelayEvent?: (channel: string, payload: unknown) => void;
8
+ retryServiceFactory?: (deps: {
9
+ logger: FastifyBaseLogger;
10
+ sendRelayEvent?: (channel: string, payload: unknown) => void;
11
+ }) => PostActivationRetryService;
12
+ resumeServiceFactory?: (deps: {
13
+ logger: FastifyBaseLogger;
14
+ sendRelayEvent?: (channel: string, payload: unknown) => void;
15
+ }) => BootResumeService;
16
+ }
17
+ export declare function runPostActivationBranch(opts: DispatchOptions): Promise<DispatchOutcome>;
18
+ //# sourceMappingURL=post-activation-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-activation-dispatch.d.ts","sourceRoot":"","sources":["../../src/services/post-activation-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE7D,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC3B,MAAM,EAAE,iBAAiB,CAAC;QAC1B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KAC9D,KAAK,0BAA0B,CAAC;IACjC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC5B,MAAM,EAAE,iBAAiB,CAAC;QAC1B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KAC9D,KAAK,iBAAiB,CAAC;CACzB;AAYD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B7F"}
@@ -0,0 +1,30 @@
1
+ import { PostActivationRetryService } from './post-activation-retry.js';
2
+ import { BootResumeService } from './boot-resume-service.js';
3
+ const defaultRetryFactory = (deps) => new PostActivationRetryService(deps);
4
+ const defaultResumeFactory = (deps) => new BootResumeService(deps);
5
+ export async function runPostActivationBranch(opts) {
6
+ const retryService = (opts.retryServiceFactory ?? defaultRetryFactory)({
7
+ logger: opts.logger,
8
+ sendRelayEvent: opts.sendRelayEvent,
9
+ });
10
+ const state = retryService.checkPostActivationState();
11
+ if (state.needsRetry) {
12
+ opts.logger.info('Post-activation incomplete on restart — triggering retry');
13
+ retryService.triggerPostActivationRetry().catch((err) => {
14
+ opts.logger.error({ err }, 'Post-activation retry failed');
15
+ });
16
+ return 'retry';
17
+ }
18
+ if (state.activated && state.postActivationComplete) {
19
+ const resumeService = (opts.resumeServiceFactory ?? defaultResumeFactory)({
20
+ logger: opts.logger,
21
+ sendRelayEvent: opts.sendRelayEvent,
22
+ });
23
+ resumeService.triggerBootResume().catch((err) => {
24
+ opts.logger.error({ err }, 'Boot resume failed');
25
+ });
26
+ return 'resume';
27
+ }
28
+ return 'noop';
29
+ }
30
+ //# sourceMappingURL=post-activation-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-activation-dispatch.js","sourceRoot":"","sources":["../../src/services/post-activation-dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAkB7D,MAAM,mBAAmB,GAAG,CAAC,IAG5B,EAA8B,EAAE,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;AAEvE,MAAM,oBAAoB,GAAG,CAAC,IAG7B,EAAqB,EAAE,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAqB;IACjE,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,CAAC;QACrE,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc,EAAE,IAAI,CAAC,cAAc;KACpC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,YAAY,CAAC,wBAAwB,EAAE,CAAC;IAEtD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC7E,YAAY,CAAC,0BAA0B,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,oBAAoB,CAAC,CAAC;YACxE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,aAAa,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type GitHubClientFactory } from '@generacy-ai/workflow-engine';
2
- import type { MonitorState, QueueAdapter, PhaseTracker, PrReviewEvent } from '../types/monitor.js';
2
+ import type { MonitorState, QueueManager, PrReviewEvent } from '../types/monitor.js';
3
3
  import type { RepositoryConfig, PrMonitorConfig } from '../config/schema.js';
4
4
  import type { Logger } from '../worker/types.js';
5
5
  import type { AuthHealthSink } from './label-monitor-service.js';
@@ -19,16 +19,17 @@ export declare class PrFeedbackMonitorService {
19
19
  private readonly logger;
20
20
  private readonly createClient;
21
21
  private readonly tokenProvider?;
22
- private readonly phaseTracker;
23
- private readonly queueAdapter;
22
+ private readonly queueManager;
24
23
  private readonly options;
25
24
  private readonly prLinker;
26
25
  private readonly clusterGithubUsername;
27
26
  private readonly authHealth;
28
27
  private readonly githubAppCredentialId;
29
28
  private abortController;
29
+ private lastUnresolvedThreadCount;
30
+ private lastZeroTrustedState;
30
31
  private state;
31
- constructor(logger: Logger, createClient: GitHubClientFactory, phaseTracker: PhaseTracker, queueAdapter: QueueAdapter, config: PrMonitorConfig, repositories: RepositoryConfig[], clusterGithubUsername?: string, tokenProvider?: () => Promise<string | undefined>, authHealth?: AuthHealthSink, githubAppCredentialId?: string);
32
+ constructor(logger: Logger, createClient: GitHubClientFactory, queueManager: QueueManager, config: PrMonitorConfig, repositories: RepositoryConfig[], clusterGithubUsername?: string, tokenProvider?: () => Promise<string | undefined>, authHealth?: AuthHealthSink, githubAppCredentialId?: string);
32
33
  /**
33
34
  * Process a PR review event: link PR to issue, check for unresolved threads,
34
35
  * deduplicate, and enqueue feedback-addressing work.
@@ -38,6 +39,14 @@ export declare class PrFeedbackMonitorService {
38
39
  * @returns true if feedback was enqueued, false if skipped or duplicate
39
40
  */
40
41
  processPrReviewEvent(event: PrReviewEvent): Promise<boolean>;
42
+ /**
43
+ * Post a single top-level PR comment notifying the operator that every
44
+ * unresolved review-thread comment is currently untrusted. Idempotent via
45
+ * the `UNTRUSTED_NOTICE_MARKER` grep against existing PR comments. Failures
46
+ * to list or post comments are non-fatal — logged and swallowed so they
47
+ * never break the poll cycle.
48
+ */
49
+ private maybePostUntrustedNotice;
41
50
  /**
42
51
  * Start the polling loop.
43
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pr-feedback-monitor-service.d.ts","sourceRoot":"","sources":["../../src/services/pr-feedback-monitor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAErF,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EAEZ,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAYD;;;;;GAKG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,KAAK,CAAe;gBAG1B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,gBAAgB,EAAE,EAChC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,EACjD,UAAU,CAAC,EAAE,cAAc,EAC3B,qBAAqB,CAAC,EAAE,MAAM;IA+BhC;;;;;;;OAOG;IACG,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IA2IlE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCnC;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;;OAGG;YACW,QAAQ;IAgGtB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAc1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC;IAQlC;;;;;OAKG;YACW,mBAAmB;IA0CjC,OAAO,CAAC,KAAK;CAkBd"}
1
+ {"version":3,"file":"pr-feedback-monitor-service.d.ts","sourceRoot":"","sources":["../../src/services/pr-feedback-monitor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAEZ,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AASjE,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAWD;;;;;GAKG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,OAAO,CAAC,eAAe,CAAgC;IAIvD,OAAO,CAAC,yBAAyB,CAAkC;IAKnE,OAAO,CAAC,oBAAoB,CAAmC;IAE/D,OAAO,CAAC,KAAK,CAAe;gBAG1B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,gBAAgB,EAAE,EAChC,qBAAqB,CAAC,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,EACjD,UAAU,CAAC,EAAE,cAAc,EAC3B,qBAAqB,CAAC,EAAE,MAAM;IA8BhC;;;;;;;OAOG;IACG,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAySlE;;;;;;OAMG;YACW,wBAAwB;IA2DtC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCnC;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;;OAGG;YACW,QAAQ;IAgGtB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAc1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC;IAQlC;;;;;OAKG;YACW,mBAAmB;IA0CjC,OAAO,CAAC,KAAK;CAkBd"}