@urateam/core 0.1.31 → 0.1.32

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 (101) hide show
  1. package/dist/__tests__/agent-stream.test.js +35 -1
  2. package/dist/__tests__/agent-stream.test.js.map +1 -1
  3. package/dist/__tests__/control-signals.test.d.ts +2 -0
  4. package/dist/__tests__/control-signals.test.d.ts.map +1 -0
  5. package/dist/__tests__/control-signals.test.js +77 -0
  6. package/dist/__tests__/control-signals.test.js.map +1 -0
  7. package/dist/__tests__/pm-slack-interface.test.js +45 -0
  8. package/dist/__tests__/pm-slack-interface.test.js.map +1 -1
  9. package/dist/__tests__/pm-triage.test.js +101 -0
  10. package/dist/__tests__/pm-triage.test.js.map +1 -1
  11. package/dist/__tests__/util-linear.test.d.ts +10 -0
  12. package/dist/__tests__/util-linear.test.d.ts.map +1 -0
  13. package/dist/__tests__/util-linear.test.js +244 -0
  14. package/dist/__tests__/util-linear.test.js.map +1 -0
  15. package/dist/audit/events.d.ts +24 -0
  16. package/dist/audit/events.d.ts.map +1 -1
  17. package/dist/audit/events.js +32 -0
  18. package/dist/audit/events.js.map +1 -1
  19. package/dist/executor/agent-stream.d.ts +16 -0
  20. package/dist/executor/agent-stream.d.ts.map +1 -1
  21. package/dist/executor/agent-stream.js +43 -1
  22. package/dist/executor/agent-stream.js.map +1 -1
  23. package/dist/executor/executor.d.ts.map +1 -1
  24. package/dist/executor/executor.js +24 -5
  25. package/dist/executor/executor.js.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/notifier/linear.d.ts +0 -1
  31. package/dist/notifier/linear.d.ts.map +1 -1
  32. package/dist/notifier/linear.js +2 -5
  33. package/dist/notifier/linear.js.map +1 -1
  34. package/dist/pipeline/control-signals.d.ts +49 -0
  35. package/dist/pipeline/control-signals.d.ts.map +1 -0
  36. package/dist/pipeline/control-signals.js +93 -0
  37. package/dist/pipeline/control-signals.js.map +1 -0
  38. package/dist/pipeline/feedback-pipeline.d.ts +140 -0
  39. package/dist/pipeline/feedback-pipeline.d.ts.map +1 -0
  40. package/dist/pipeline/feedback-pipeline.js +427 -0
  41. package/dist/pipeline/feedback-pipeline.js.map +1 -0
  42. package/dist/pipeline/index.d.ts +1 -0
  43. package/dist/pipeline/index.d.ts.map +1 -1
  44. package/dist/pipeline/index.js +1 -0
  45. package/dist/pipeline/index.js.map +1 -1
  46. package/dist/pipeline/runner.d.ts +49 -33
  47. package/dist/pipeline/runner.d.ts.map +1 -1
  48. package/dist/pipeline/runner.js +136 -349
  49. package/dist/pipeline/runner.js.map +1 -1
  50. package/dist/pm/actions/promote.d.ts.map +1 -1
  51. package/dist/pm/actions/promote.js +15 -11
  52. package/dist/pm/actions/promote.js.map +1 -1
  53. package/dist/pm/actions/recover-stuck.d.ts.map +1 -1
  54. package/dist/pm/actions/recover-stuck.js +9 -5
  55. package/dist/pm/actions/recover-stuck.js.map +1 -1
  56. package/dist/pm/actions/triage.d.ts.map +1 -1
  57. package/dist/pm/actions/triage.js +67 -1
  58. package/dist/pm/actions/triage.js.map +1 -1
  59. package/dist/pm/linear-helpers.d.ts +10 -0
  60. package/dist/pm/linear-helpers.d.ts.map +1 -1
  61. package/dist/pm/linear-helpers.js +13 -21
  62. package/dist/pm/linear-helpers.js.map +1 -1
  63. package/dist/pm/pause-state.d.ts +29 -0
  64. package/dist/pm/pause-state.d.ts.map +1 -0
  65. package/dist/pm/pause-state.js +34 -0
  66. package/dist/pm/pause-state.js.map +1 -0
  67. package/dist/pm/slack-bulk.d.ts +34 -0
  68. package/dist/pm/slack-bulk.d.ts.map +1 -0
  69. package/dist/pm/slack-bulk.js +110 -0
  70. package/dist/pm/slack-bulk.js.map +1 -0
  71. package/dist/pm/slack-commands.d.ts +101 -0
  72. package/dist/pm/slack-commands.d.ts.map +1 -0
  73. package/dist/pm/slack-commands.js +309 -0
  74. package/dist/pm/slack-commands.js.map +1 -0
  75. package/dist/pm/slack-helpers.d.ts +10 -0
  76. package/dist/pm/slack-helpers.d.ts.map +1 -1
  77. package/dist/pm/slack-helpers.js +32 -0
  78. package/dist/pm/slack-helpers.js.map +1 -1
  79. package/dist/pm/slack-interface.d.ts +32 -58
  80. package/dist/pm/slack-interface.d.ts.map +1 -1
  81. package/dist/pm/slack-interface.js +150 -320
  82. package/dist/pm/slack-interface.js.map +1 -1
  83. package/dist/rbac/matrix.d.ts +2 -0
  84. package/dist/rbac/matrix.d.ts.map +1 -1
  85. package/dist/rbac/matrix.js +2 -0
  86. package/dist/rbac/matrix.js.map +1 -1
  87. package/dist/server.d.ts.map +1 -1
  88. package/dist/server.js +7 -0
  89. package/dist/server.js.map +1 -1
  90. package/dist/sync/gh-linear-sync.d.ts.map +1 -1
  91. package/dist/sync/gh-linear-sync.js +2 -2
  92. package/dist/sync/gh-linear-sync.js.map +1 -1
  93. package/dist/types.d.ts +13 -4
  94. package/dist/types.d.ts.map +1 -1
  95. package/dist/types.js +6 -0
  96. package/dist/types.js.map +1 -1
  97. package/dist/util/linear.d.ts +70 -0
  98. package/dist/util/linear.d.ts.map +1 -0
  99. package/dist/util/linear.js +108 -0
  100. package/dist/util/linear.js.map +1 -0
  101. package/package.json +1 -1
@@ -0,0 +1,427 @@
1
+ import { pipelineRuns } from "../db/schema.js";
2
+ import { executeStage } from "../executor/executor.js";
3
+ import { getStopSignal } from "./control-signals.js";
4
+ import { cloneRepo, createWorktreeFromRemote, deleteWorktree, pushBranch, pushBranchForce, choosePushStrategy, rebaseBranch, abortRebase, autoCommitChanges, } from "../repo/git.js";
5
+ import { createGitHubClient, rerequestPRReview, } from "../repo/github.js";
6
+ import { buildAuthenticatedUrl } from "../repo/gitlab.js";
7
+ import { parseRepoUrl } from "../repo/config.js";
8
+ import { detectTechStack } from "../repo/tech-stack.js";
9
+ import { shouldUseDevcontainer, devcontainerUp, devcontainerDown, } from "../repo/devcontainer.js";
10
+ import { withBranchLock, } from "./distributed-lock.js";
11
+ import { upsertActiveWork, removeActiveWork, getModifiedFiles, } from "../pm/coordination.js";
12
+ import { eq } from "drizzle-orm";
13
+ import { createLogger, runWithLogContext } from "../logger.js";
14
+ import { execFile as execFileCb } from "node:child_process";
15
+ import { promisify } from "node:util";
16
+ import { nanoid } from "nanoid";
17
+ const execFileAsync = promisify(execFileCb);
18
+ // ---------------------------------------------------------------------------
19
+ // Module-level constants
20
+ // ---------------------------------------------------------------------------
21
+ /** Run type identifier for review-feedback pipeline runs. */
22
+ const FEEDBACK_RUN_TYPE = "review-feedback";
23
+ /** Stage name for the implement step in feedback pipelines. */
24
+ const FEEDBACK_IMPL_STAGE = "implement";
25
+ /**
26
+ * Stages skipped by the feedback pipeline.
27
+ * Feedback runs operate on an existing PR branch, so setup stages are not needed.
28
+ */
29
+ const FEEDBACK_SKIP_STAGES = new Set(["triage", "reproduce", "await-approval"]);
30
+ // ---------------------------------------------------------------------------
31
+ // Module-level helpers
32
+ // ---------------------------------------------------------------------------
33
+ /**
34
+ * Commit any uncommitted agent changes and mark the run as auto-committed.
35
+ * No-op if the working tree is clean.
36
+ */
37
+ async function applyAutoCommit(worktreePath, issueId, branch, run) {
38
+ if (await autoCommitChanges(worktreePath, issueId, branch)) {
39
+ run.autoCommitted = true;
40
+ }
41
+ }
42
+ /**
43
+ * Map webhook-shaped `ReviewFeedbackComment[]` (the wire format we receive
44
+ * from GitHub) into the `ReviewFeedbackContext` that the implement template
45
+ * expects when handling PR review feedback.
46
+ *
47
+ * Routes the implement stage into the dedicated review-feedback prompt path
48
+ * (templates.ts:233-253) — "address review comments on existing branch, push
49
+ * to same branch, do NOT create a new PR" — instead of falling through to
50
+ * the standard "create branch and implement issue from scratch" prompt.
51
+ *
52
+ * `createdAt` is not captured by the GitHub webhook handler today, so the
53
+ * mapped comments use an empty string. The template only renders this for
54
+ * display; an empty value is harmless.
55
+ */
56
+ export function buildReviewFeedbackContext(prUrl, prBranch, comments) {
57
+ return {
58
+ prUrl,
59
+ prBranch,
60
+ comments: comments.map((c) => ({
61
+ author: c.author,
62
+ body: c.body,
63
+ file: c.filePath,
64
+ line: c.lineNumber,
65
+ createdAt: "",
66
+ })),
67
+ };
68
+ }
69
+ /**
70
+ * Execute a review-feedback pipeline run.
71
+ *
72
+ * Key differences from executePipeline():
73
+ * - Checks out the EXISTING PR branch (not a new one).
74
+ * - Skips triage, reproduce, await-approval stages.
75
+ * - Does NOT create a new PR — pushes to the same branch.
76
+ * - Optionally re-requests review via GitHub App after push.
77
+ * - Feedback comment context is injected into the implement stage prompt.
78
+ *
79
+ * @param ctx - All dependencies (db, notifier, queues, config, etc.)
80
+ * @param runId - Unique ID for this pipeline run
81
+ * @param run - In-memory PipelineRun state object
82
+ * @param config - Pipeline configuration (stages, maxTokens, etc.)
83
+ * @param repoConfig - Repository configuration (URL, provider, etc.)
84
+ * @param sanitizedIssue - Sanitized issue data for prompt construction
85
+ * @param branch - Existing PR branch to check out and push to
86
+ * @param prUrl - URL of the pull request being addressed
87
+ * @param prNumber - PR number (required for re-requesting review)
88
+ * @param feedbackComments - Raw feedback comments from the GitHub webhook
89
+ * @param rerequestReview - Whether to re-request review after pushing
90
+ */
91
+ export async function executeFeedbackPipeline(ctx, runId, run, config, repoConfig, sanitizedIssue, branch, prUrl, prNumber, feedbackComments, rerequestReview) {
92
+ const { db } = ctx;
93
+ const runLog = createLogger({
94
+ component: "FeedbackPipeline",
95
+ runId,
96
+ issueId: run.issueId,
97
+ });
98
+ let worktreePath;
99
+ let devcontainerSession;
100
+ // Track the current stage so the catch block can report a meaningful name
101
+ // rather than the fallback "unknown" string. Declared outside try/catch
102
+ // so it remains accessible in the catch block scope.
103
+ let currentStage = "unknown";
104
+ await db
105
+ .update(pipelineRuns)
106
+ .set({ status: "running" })
107
+ .where(eq(pipelineRuns.id, runId));
108
+ run.status = "running";
109
+ await upsertActiveWork(db, {
110
+ runId,
111
+ issueId: sanitizedIssue.id,
112
+ stage: "implement",
113
+ });
114
+ await ctx.notifier.onPipelineStart(run);
115
+ try {
116
+ // -----------------------------------------------------------------------
117
+ // Set up worktree from existing remote branch
118
+ // -----------------------------------------------------------------------
119
+ const repoDir = `${ctx.repoCloneDir}/${sanitizedIssue.slug}`;
120
+ const cloneUrl = repoConfig.provider === "gitlab" && ctx.gitlabConfig
121
+ ? buildAuthenticatedUrl(repoConfig.url, ctx.gitlabConfig)
122
+ : repoConfig.url;
123
+ const logUrl = cloneUrl.replace(/:\/\/[^@]+@/, "://[redacted]@");
124
+ runLog.info({ repoUrl: logUrl, repoDir }, "feedback: cloning/fetching repository");
125
+ await cloneRepo(cloneUrl, repoDir);
126
+ runLog.info({ branch }, "feedback: creating worktree from existing remote branch");
127
+ worktreePath = await createWorktreeFromRemote(repoDir, runId, branch, ctx.agentRunDir);
128
+ runLog.info({ worktreePath }, "feedback: worktree created");
129
+ // Devcontainer (if configured)
130
+ const useDevcontainer = await shouldUseDevcontainer(worktreePath, repoConfig.devcontainer);
131
+ if (useDevcontainer) {
132
+ runLog.info("feedback: starting devcontainer");
133
+ devcontainerSession = await devcontainerUp(worktreePath, repoConfig.devcontainer);
134
+ }
135
+ await ctx.injectAgentConfig(worktreePath);
136
+ if (repoConfig.setupCommands) {
137
+ for (const cmdArgs of repoConfig.setupCommands) {
138
+ const [command, ...args] = cmdArgs;
139
+ runLog.info({ command, args }, "feedback: running setup command");
140
+ try {
141
+ await execFileAsync(command, args, { cwd: worktreePath });
142
+ }
143
+ catch (err) {
144
+ const msg = err instanceof Error ? err.message : String(err);
145
+ runLog.error({ command, args, err }, "feedback: setup command failed");
146
+ throw new Error(`Setup command failed: ${command} ${args.join(" ")} — ${msg}`);
147
+ }
148
+ }
149
+ }
150
+ const techStack = await detectTechStack(worktreePath);
151
+ runLog.info({
152
+ languages: techStack.languages,
153
+ frameworks: techStack.frameworks,
154
+ buildSystems: techStack.buildSystems,
155
+ }, "feedback: tech stack detected");
156
+ // -----------------------------------------------------------------------
157
+ // Build review-feedback context for the implement stage. This routes the
158
+ // implement template into its dedicated review-feedback branch
159
+ // ("address comments on existing branch, push to same branch") instead
160
+ // of the standard "create new branch + implement from scratch" path,
161
+ // which is wrong for PR-comment triggered runs.
162
+ // -----------------------------------------------------------------------
163
+ const reviewFeedback = buildReviewFeedbackContext(prUrl, branch, feedbackComments);
164
+ // -----------------------------------------------------------------------
165
+ // Execute pipeline stages — skip triage, reproduce, await-approval
166
+ // -----------------------------------------------------------------------
167
+ const stagesToRun = config.stages.filter((s) => !FEEDBACK_SKIP_STAGES.has(s));
168
+ runLog.info({ stages: stagesToRun }, "feedback: starting pipeline stages");
169
+ let handoff;
170
+ let allModifiedFiles = [];
171
+ for (const stage of stagesToRun) {
172
+ const stageType = stage;
173
+ currentStage = stage;
174
+ runLog.info({ stage: stageType }, "feedback: executing stage");
175
+ // Operator stop check (graceful path) — mirrors the main pipeline at
176
+ // runner.ts ~L840. Mid-stream cancel surfaces as result.status below.
177
+ const preStageStopSignal = getStopSignal(runId);
178
+ if (preStageStopSignal) {
179
+ runLog.info({ stage: stageType, mode: preStageStopSignal }, "feedback: stop requested — aborting remaining stages");
180
+ await ctx.markRunCancelled(db, runId, run, preStageStopSignal, prUrl);
181
+ return;
182
+ }
183
+ await upsertActiveWork(db, {
184
+ runId,
185
+ issueId: sanitizedIssue.id,
186
+ stage: stageType,
187
+ filesModified: allModifiedFiles.length > 0 ? allModifiedFiles : undefined,
188
+ });
189
+ // Only the implement stage uses reviewFeedback; the test/review stages
190
+ // get their context from the implement stage's handoff.
191
+ const stageReviewFeedback = stageType === FEEDBACK_IMPL_STAGE ? reviewFeedback : undefined;
192
+ const result = await executeStage({
193
+ runId,
194
+ issueId: sanitizedIssue.id,
195
+ stage: stageType,
196
+ sanitizedIssue,
197
+ repoConfig,
198
+ handoff,
199
+ workdir: worktreePath,
200
+ db: ctx.db,
201
+ techStack,
202
+ devcontainerSession,
203
+ reviewFeedback: stageReviewFeedback,
204
+ stageModels: config.stageModels,
205
+ });
206
+ // Mid-stream cancel: AbortController inside consumeAgentStream fired
207
+ // and the executor returned status="cancelled". Without this branch
208
+ // the loop would fall through to `if (result.status === "failed")` —
209
+ // which doesn't match — and continue to the next stage with an
210
+ // undefined handoff, eventually pushing partial work.
211
+ if (result.status === "cancelled") {
212
+ const mode = getStopSignal(runId) ?? "cancel";
213
+ runLog.info({ stage: stageType, mode }, "feedback: stage cancelled by operator");
214
+ await ctx.markRunCancelled(db, runId, run, mode, prUrl);
215
+ return;
216
+ }
217
+ run.totalInputTokens += result.inputTokens;
218
+ run.totalOutputTokens += result.outputTokens;
219
+ if (await ctx.checkTokenBudget(db, runId, run, config, stage))
220
+ return;
221
+ await ctx.notifier.onStageComplete(run, stage, result);
222
+ if (result.status === "failed") {
223
+ const errorMsg = result.errorMessage ?? "Stage failed";
224
+ await ctx.failPipeline(db, runId, run, stage, errorMsg, false);
225
+ return;
226
+ }
227
+ handoff = result.handoffArtifact;
228
+ // worktreePath is guaranteed to be set at this point — createWorktreeFromRemote
229
+ // succeeded earlier in the try block; a failure there throws before we reach the loop.
230
+ await applyAutoCommit(worktreePath, sanitizedIssue.id, branch, run);
231
+ // Update the in-memory file list only; the next stage's pre-loop upsertActiveWork
232
+ // call will persist the accumulated list. This avoids a redundant intermediate write
233
+ // that would be immediately overwritten when the next stage begins.
234
+ if (worktreePath) {
235
+ const freshFiles = await getModifiedFiles(worktreePath);
236
+ if (freshFiles.length > 0) {
237
+ allModifiedFiles = freshFiles;
238
+ }
239
+ }
240
+ }
241
+ // -----------------------------------------------------------------------
242
+ // Push to existing branch — no new PR
243
+ // -----------------------------------------------------------------------
244
+ await ctx.pushQueue.enqueue(async () => {
245
+ await withBranchLock(ctx.lockAdapter, branch, ctx.prLockTimeoutMs, async () => {
246
+ const wtPath = worktreePath;
247
+ await applyAutoCommit(wtPath, sanitizedIssue.id, branch, run);
248
+ runLog.info({ defaultBranch: repoConfig.defaultBranch }, "feedback push: rebasing before push");
249
+ const rebaseResult = await rebaseBranch(wtPath, repoConfig.defaultBranch);
250
+ // rebaseBranch guarantees: success=false AND hasConflicts=true means
251
+ // merge conflicts exist; success=false AND hasConflicts=false means
252
+ // an unrelated git error — the outer catch block handles that.
253
+ const feedbackHasConflicts = !rebaseResult.success && rebaseResult.hasConflicts;
254
+ if (feedbackHasConflicts) {
255
+ runLog.warn("feedback push: rebase conflicts — force-pushing for human review");
256
+ await abortRebase(wtPath);
257
+ await pushBranchForce(wtPath, branch);
258
+ await ctx.notifier.onHumanReviewNeeded?.(run, prUrl, "Merge conflicts in feedback run — please resolve manually");
259
+ }
260
+ else {
261
+ const feedbackPushStrategy = choosePushStrategy(branch, false);
262
+ if (feedbackPushStrategy === "force-with-lease") {
263
+ runLog.info({ branch }, "feedback push: force-with-lease push for agent branch");
264
+ await pushBranchForce(wtPath, branch);
265
+ }
266
+ else {
267
+ await pushBranch(wtPath, branch);
268
+ }
269
+ }
270
+ runLog.info({ prUrl }, "feedback: pushed to existing PR branch");
271
+ // Re-request review via GitHub App if configured
272
+ if (rerequestReview && ctx.githubConfig && prNumber) {
273
+ try {
274
+ const { owner, repo } = parseRepoUrl(repoConfig.url);
275
+ const octokit = await createGitHubClient(ctx.githubConfig);
276
+ const reRequested = await rerequestPRReview(octokit, owner, repo, prNumber);
277
+ if (reRequested) {
278
+ runLog.info({ prUrl, prNumber }, "feedback: re-requested review");
279
+ }
280
+ else {
281
+ runLog.info({ prUrl, prNumber }, "feedback: no existing reviewers to re-request");
282
+ }
283
+ }
284
+ catch (reviewErr) {
285
+ runLog.error({ err: reviewErr }, "feedback: failed to re-request review");
286
+ }
287
+ }
288
+ });
289
+ });
290
+ await db
291
+ .update(pipelineRuns)
292
+ .set({
293
+ status: "completed",
294
+ completedAt: new Date(),
295
+ totalInputTokens: run.totalInputTokens,
296
+ totalOutputTokens: run.totalOutputTokens,
297
+ prUrl,
298
+ autoCommitted: run.autoCommitted ?? null,
299
+ })
300
+ .where(eq(pipelineRuns.id, runId));
301
+ run.status = "completed";
302
+ runLog.info({
303
+ prUrl,
304
+ totalInputTokens: run.totalInputTokens,
305
+ totalOutputTokens: run.totalOutputTokens,
306
+ autoCommitted: run.autoCommitted ?? false,
307
+ }, "feedback pipeline completed");
308
+ await ctx.notifier.onPipelineComplete(run, {
309
+ prUrl,
310
+ totalInputTokens: run.totalInputTokens,
311
+ totalOutputTokens: run.totalOutputTokens,
312
+ stagesCompleted: stagesToRun.length,
313
+ autoMerged: false,
314
+ });
315
+ }
316
+ catch (error) {
317
+ const errorMsg = error instanceof Error ? error.message : String(error);
318
+ runLog.error({ err: error }, "feedback pipeline failed with unexpected error");
319
+ await ctx.failPipeline(db, runId, run, currentStage, errorMsg, true);
320
+ }
321
+ finally {
322
+ ctx.budgetAlertedRuns.delete(runId);
323
+ await removeActiveWork(db, runId);
324
+ if (devcontainerSession) {
325
+ try {
326
+ await devcontainerDown(devcontainerSession);
327
+ }
328
+ catch {
329
+ // Ignore cleanup errors
330
+ }
331
+ }
332
+ // Feedback runs don't pause — always clean up worktree on completion or failure.
333
+ // Cast to string because failPipeline mutates run.status at runtime beyond the initial type.
334
+ const feedbackStatus = run.status;
335
+ if (worktreePath && (feedbackStatus === "completed" || feedbackStatus === "failed")) {
336
+ try {
337
+ await deleteWorktree(worktreePath);
338
+ }
339
+ catch {
340
+ // Ignore cleanup errors
341
+ }
342
+ }
343
+ }
344
+ }
345
+ const setupLog = createLogger({ component: "FeedbackPipeline" });
346
+ /**
347
+ * Orchestrate a review-feedback pipeline run.
348
+ *
349
+ * Handles the setup phase that wraps executeFeedbackPipeline:
350
+ * - Rate-limit check (one run per PR at a time).
351
+ * - DB record insertion (status = "queued").
352
+ * - In-memory PipelineRun construction.
353
+ * - Enqueue execution via the main work queue.
354
+ *
355
+ * PipelineRunner.startFeedback() is a thin wrapper that delegates here,
356
+ * passing its instance state through FeedbackStartContext.
357
+ *
358
+ * @param ctx - Runner-level dependencies (db, notifier, queues, locks, etc.)
359
+ * @param params - Issue / PR / feedback data for this run
360
+ */
361
+ export async function startFeedbackPipeline(ctx, params) {
362
+ const { issue, pipelineKey, pipelineConfig, repoConfig, sanitizedIssue, branch, prUrl, prNumber, parentRunId, feedbackComments, rerequestReview = false, } = params;
363
+ const { db } = ctx;
364
+ setupLog.info({ issueId: issue.identifier, pipeline: pipelineKey, prUrl }, "startFeedbackPipeline() called");
365
+ // Rate-limit: one feedback run per PR at a time
366
+ if (ctx.activeFeedbackRuns.has(prUrl)) {
367
+ setupLog.info({ prUrl }, "feedback run already active for this PR — skipping");
368
+ return;
369
+ }
370
+ const runId = nanoid();
371
+ const runLog = createLogger({
372
+ component: "FeedbackPipeline",
373
+ runId,
374
+ issueId: issue.identifier,
375
+ });
376
+ // Copy linearTeamId from the parent run (if any) for spend-cap accounting.
377
+ let linearTeamId = null;
378
+ if (parentRunId) {
379
+ const parentRows = await db
380
+ .select({ linearTeamId: pipelineRuns.linearTeamId })
381
+ .from(pipelineRuns)
382
+ .where(eq(pipelineRuns.id, parentRunId))
383
+ .limit(1);
384
+ linearTeamId = parentRows[0]?.linearTeamId ?? null;
385
+ }
386
+ runLog.info({ branch, prUrl }, "inserting feedback run into DB");
387
+ await db.insert(pipelineRuns).values({
388
+ id: runId,
389
+ issueId: issue.identifier,
390
+ issueTitle: issue.title,
391
+ pipelineKey,
392
+ repoUrl: repoConfig.url,
393
+ branch,
394
+ status: "queued",
395
+ prUrl,
396
+ runType: FEEDBACK_RUN_TYPE,
397
+ parentRunId: parentRunId ?? null,
398
+ feedbackContext: JSON.stringify(feedbackComments),
399
+ linearTeamId,
400
+ });
401
+ const run = ctx.buildPipelineRun(runId, issue, pipelineKey, repoConfig, branch);
402
+ run.prUrl = prUrl;
403
+ run.runType = FEEDBACK_RUN_TYPE;
404
+ run.feedbackContext = JSON.stringify(feedbackComments);
405
+ // Register in activeFeedbackRuns BEFORE enqueue so rate-limit check works immediately.
406
+ ctx.activeFeedbackRuns.set(prUrl, runId);
407
+ ctx.queue
408
+ .enqueue(async () => {
409
+ if (!ctx.activeFeedbackRuns.has(prUrl))
410
+ return; // was cancelled
411
+ runLog.info("executing feedback pipeline");
412
+ try {
413
+ await runWithLogContext({ runId, issueId: issue.identifier }, () => executeFeedbackPipeline(ctx, runId, run, pipelineConfig, repoConfig, sanitizedIssue, branch, prUrl, prNumber, feedbackComments, rerequestReview));
414
+ }
415
+ catch (err) {
416
+ runLog.error({ err }, "feedback pipeline execution failed");
417
+ }
418
+ finally {
419
+ ctx.activeFeedbackRuns.delete(prUrl);
420
+ }
421
+ })
422
+ .catch((err) => {
423
+ runLog.error({ err }, "feedback queue execution failed");
424
+ ctx.activeFeedbackRuns.delete(prUrl);
425
+ });
426
+ }
427
+ //# sourceMappingURL=feedback-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/feedback-pipeline.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export { defaultConfigs, validatePipelineConfigs, validateRepoConfigs, applyDeep
2
2
  export { resolvePipeline } from "./router.js";
3
3
  export { createQueue, type WorkQueue } from "./queue.js";
4
4
  export { PipelineRunner, type PipelineRunnerConfig, type LinearIssue } from "./runner.js";
5
+ export { requestStop as requestRunStop, getStopSignal, clearStopSignal, type StopMode, } from "./control-signals.js";
5
6
  export { withBranchLock, createBranchLockAdapter, createPgLockAdapter, createNoopLockAdapter, LockTimeoutError, type LockAdapter, } from "./distributed-lock.js";
6
7
  export { isTransientError } from "./error-classifier.js";
7
8
  export { generatePRDescription, type PRDescriptionOptions } from "./pr-description.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,WAAW,IAAI,cAAc,EAC7B,aAAa,EACb,eAAe,EACf,KAAK,QAAQ,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
@@ -2,6 +2,7 @@ export { defaultConfigs, validatePipelineConfigs, validateRepoConfigs, applyDeep
2
2
  export { resolvePipeline } from "./router.js";
3
3
  export { createQueue } from "./queue.js";
4
4
  export { PipelineRunner } from "./runner.js";
5
+ export { requestStop as requestRunStop, getStopSignal, clearStopSignal, } from "./control-signals.js";
5
6
  export { withBranchLock, createBranchLockAdapter, createPgLockAdapter, createNoopLockAdapter, LockTimeoutError, } from "./distributed-lock.js";
6
7
  export { isTransientError } from "./error-classifier.js";
7
8
  export { generatePRDescription } from "./pr-description.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAA+C,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAA+C,MAAM,aAAa,CAAC;AAC1F,OAAO,EACL,WAAW,IAAI,cAAc,EAC7B,aAAa,EACb,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC"}
@@ -1,23 +1,10 @@
1
- import type { PipelineConfig, RepoConfig, Notifier, SanitizedIssue, ReviewFeedbackContext } from "../types.js";
2
- import type { Db } from "../db/client.js";
1
+ import type { PipelineConfig, RepoConfig, Notifier, PipelineRun, SanitizedIssue } from "../types.js";
2
+ import type { Db, AnyDb } from "../db/client.js";
3
+ import { type StopMode } from "./control-signals.js";
3
4
  import { type GitHubConfig } from "../repo/github.js";
4
5
  import { type GitLabConfig } from "../repo/gitlab.js";
5
6
  import type { ReviewFeedbackComment } from "../webhook/github-handler.js";
6
- /**
7
- * Map webhook-shaped `ReviewFeedbackComment[]` (the wire format we receive
8
- * from GitHub) into the `ReviewFeedbackContext` that the implement template
9
- * expects when handling PR review feedback.
10
- *
11
- * Routes the implement stage into the dedicated review-feedback prompt path
12
- * (templates.ts:233-253) — "address review comments on existing branch, push
13
- * to same branch, do NOT create a new PR" — instead of falling through to
14
- * the standard "create branch and implement issue from scratch" prompt.
15
- *
16
- * `createdAt` is not captured by the GitHub webhook handler today, so the
17
- * mapped comments use an empty string. The template only renders this for
18
- * display; an empty value is harmless.
19
- */
20
- export declare function buildReviewFeedbackContext(prUrl: string, prBranch: string, comments: ReviewFeedbackComment[]): ReviewFeedbackContext;
7
+ export { buildReviewFeedbackContext } from "./feedback-pipeline.js";
21
8
  export interface PipelineRunnerConfig {
22
9
  db: Db;
23
10
  notifier: Notifier;
@@ -67,17 +54,57 @@ export declare class PipelineRunner {
67
54
  resume(issueId: string): Promise<void>;
68
55
  pause(issueId: string): Promise<void>;
69
56
  abort(issueId: string): Promise<void>;
57
+ /**
58
+ * Operator-initiated stop for a single run, addressed by runId.
59
+ *
60
+ * - `"cancel"` aborts the active Agent SDK stream immediately. The current
61
+ * stage exits with `status: "cancelled"`; the pipeline marks the run
62
+ * `cancelled` and returns without creating a PR.
63
+ * - `"graceful"` lets the current stage complete, then skips remaining
64
+ * stages. Slower than cancel but leaves the worktree consistent.
65
+ *
66
+ * Idempotent. Returns the issueId resolved from the active map (or null if
67
+ * the runId isn't currently active). The caller is responsible for emitting
68
+ * the audit event since it knows the actor.
69
+ */
70
+ requestStop(runId: string, mode: StopMode): {
71
+ issueId: string | null;
72
+ mode: StopMode;
73
+ };
74
+ /**
75
+ * Halt the whole container's autonomous work:
76
+ * 1. Pauses the PM Agent (BEC-170 mechanism) so no new runs get promoted.
77
+ * 2. Sends a `"cancel"` signal to every active pipeline + feedback run.
78
+ *
79
+ * Returns the set of run ids that were cancelled — the caller emits the
80
+ * audit event. Reversible: PM Agent can be unpaused via `/pm resume` and
81
+ * individual runs can be re-triggered via the retry button. Cancelled runs
82
+ * stay cancelled.
83
+ */
84
+ haltAll(): {
85
+ cancelledRunIds: string[];
86
+ };
87
+ /**
88
+ * Mark a run as cancelled in the DB and clean up bookkeeping. Shared by the
89
+ * pre-stage graceful path and the mid-stream cancel path.
90
+ *
91
+ * For feedback-pipeline runs, pass `feedbackPrUrl` so the per-PR rate-limit
92
+ * slot is freed immediately rather than waiting on the queue's `finally`
93
+ * block. The queue's `finally` still fires (idempotent — Map.delete on a
94
+ * missing key is a no-op), this just shortens the window during which a new
95
+ * feedback comment on the same PR is rejected as "already active".
96
+ */
97
+ markRunCancelled(db: AnyDb, runId: string, run: PipelineRun, mode: StopMode, feedbackPrUrl?: string): Promise<void>;
98
+ private markRunCancelledImpl;
70
99
  isActive(issueId: string): boolean;
71
100
  /** Returns true if a review-feedback run is already in progress for the given PR URL. */
72
101
  isActiveFeedback(prUrl: string): boolean;
73
102
  /**
74
103
  * Start a review-feedback pipeline run triggered by a PR review comment.
75
104
  *
76
- * Unlike start(), this method:
77
- * - Does NOT create a new branch — it checks out the existing PR branch.
78
- * - Skips triage and reproduce stages, entering directly at implement.
79
- * - Does NOT create a new PR — it pushes to the same branch.
80
- * - Optionally re-requests review after pushing.
105
+ * Thin wrapper — all orchestration logic (rate-limiting, DB insert, queue
106
+ * management) and execution are delegated to feedback-pipeline.ts.
107
+ * See startFeedbackPipeline() for full documentation.
81
108
  */
82
109
  startFeedback(params: {
83
110
  issue: LinearIssue;
@@ -135,17 +162,6 @@ export declare class PipelineRunner {
135
162
  * notification. Defaults to today (UTC).
136
163
  */
137
164
  sendDailyTokenSummary(date?: Date): Promise<void>;
138
- /**
139
- * Execute a review-feedback pipeline run.
140
- *
141
- * Key differences from executePipeline():
142
- * - Checks out the EXISTING PR branch (not a new one).
143
- * - Skips triage, reproduce, await-approval stages.
144
- * - Does NOT create a new PR — pushes to the same branch.
145
- * - Optionally re-requests review via GitHub App after push.
146
- * - Feedback comment context is injected into the implement stage prompt.
147
- */
148
- private executeFeedbackPipeline;
149
165
  private buildPipelineRun;
150
166
  }
151
167
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,QAAQ,EACR,WAAW,EAEX,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAajD,OAAO,EAA+C,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAmClG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAoC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAKpE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAY;IACzB;;2EAEuE;IACvE,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,4EAA4E;IAC5E,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,oBAAoB;IAalC,KAAK,CACT,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,OAAO,CAAC,IAAI,CAAC;IA4EV,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0MtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE;IAYtF;;;;;;;;;OASG;IACH,OAAO,IAAI;QAAE,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE;IAkBxC;;;;;;;;;OASG;IACH,gBAAgB,CACd,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;YAIF,oBAAoB;IAsBlC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlC,yFAAyF;IACzF,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,KAAK,EAAE,WAAW,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,cAAc,CAAC;QAC/B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,cAAc,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;QAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjB;;;;OAIG;YACW,iBAAiB;YAajB,eAAe;YAsvDf,YAAY;IAiF1B;;;OAGG;YACW,gBAAgB;IAoC9B;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyEvC;;;;OAIG;YACW,oBAAoB;IAIlC;;;OAGG;IACG,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCvD,OAAO,CAAC,gBAAgB;CAoBzB"}