@urateam/core 0.1.30 → 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 (113) 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__/bec-185-reproduce.test.d.ts +16 -0
  4. package/dist/__tests__/bec-185-reproduce.test.d.ts.map +1 -0
  5. package/dist/__tests__/bec-185-reproduce.test.js +16 -0
  6. package/dist/__tests__/bec-185-reproduce.test.js.map +1 -0
  7. package/dist/__tests__/control-signals.test.d.ts +2 -0
  8. package/dist/__tests__/control-signals.test.d.ts.map +1 -0
  9. package/dist/__tests__/control-signals.test.js +77 -0
  10. package/dist/__tests__/control-signals.test.js.map +1 -0
  11. package/dist/__tests__/gh-linear-sync.test.js +57 -2
  12. package/dist/__tests__/gh-linear-sync.test.js.map +1 -1
  13. package/dist/__tests__/openrouter-client.test.js +34 -0
  14. package/dist/__tests__/openrouter-client.test.js.map +1 -1
  15. package/dist/__tests__/pm-slack-interface.test.js +45 -0
  16. package/dist/__tests__/pm-slack-interface.test.js.map +1 -1
  17. package/dist/__tests__/pm-triage.test.js +101 -0
  18. package/dist/__tests__/pm-triage.test.js.map +1 -1
  19. package/dist/__tests__/util-linear.test.d.ts +10 -0
  20. package/dist/__tests__/util-linear.test.d.ts.map +1 -0
  21. package/dist/__tests__/util-linear.test.js +244 -0
  22. package/dist/__tests__/util-linear.test.js.map +1 -0
  23. package/dist/audit/events.d.ts +24 -0
  24. package/dist/audit/events.d.ts.map +1 -1
  25. package/dist/audit/events.js +32 -0
  26. package/dist/audit/events.js.map +1 -1
  27. package/dist/executor/agent-stream.d.ts +16 -0
  28. package/dist/executor/agent-stream.d.ts.map +1 -1
  29. package/dist/executor/agent-stream.js +43 -1
  30. package/dist/executor/agent-stream.js.map +1 -1
  31. package/dist/executor/executor.d.ts.map +1 -1
  32. package/dist/executor/executor.js +24 -5
  33. package/dist/executor/executor.js.map +1 -1
  34. package/dist/executor/review/openrouter-client.d.ts.map +1 -1
  35. package/dist/executor/review/openrouter-client.js +8 -0
  36. package/dist/executor/review/openrouter-client.js.map +1 -1
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/notifier/linear.d.ts +0 -1
  42. package/dist/notifier/linear.d.ts.map +1 -1
  43. package/dist/notifier/linear.js +2 -5
  44. package/dist/notifier/linear.js.map +1 -1
  45. package/dist/pipeline/control-signals.d.ts +49 -0
  46. package/dist/pipeline/control-signals.d.ts.map +1 -0
  47. package/dist/pipeline/control-signals.js +93 -0
  48. package/dist/pipeline/control-signals.js.map +1 -0
  49. package/dist/pipeline/feedback-pipeline.d.ts +140 -0
  50. package/dist/pipeline/feedback-pipeline.d.ts.map +1 -0
  51. package/dist/pipeline/feedback-pipeline.js +427 -0
  52. package/dist/pipeline/feedback-pipeline.js.map +1 -0
  53. package/dist/pipeline/index.d.ts +1 -0
  54. package/dist/pipeline/index.d.ts.map +1 -1
  55. package/dist/pipeline/index.js +1 -0
  56. package/dist/pipeline/index.js.map +1 -1
  57. package/dist/pipeline/runner.d.ts +49 -33
  58. package/dist/pipeline/runner.d.ts.map +1 -1
  59. package/dist/pipeline/runner.js +136 -349
  60. package/dist/pipeline/runner.js.map +1 -1
  61. package/dist/pm/actions/promote.d.ts.map +1 -1
  62. package/dist/pm/actions/promote.js +15 -11
  63. package/dist/pm/actions/promote.js.map +1 -1
  64. package/dist/pm/actions/recover-stuck.d.ts.map +1 -1
  65. package/dist/pm/actions/recover-stuck.js +9 -5
  66. package/dist/pm/actions/recover-stuck.js.map +1 -1
  67. package/dist/pm/actions/triage.d.ts.map +1 -1
  68. package/dist/pm/actions/triage.js +67 -1
  69. package/dist/pm/actions/triage.js.map +1 -1
  70. package/dist/pm/linear-helpers.d.ts +10 -0
  71. package/dist/pm/linear-helpers.d.ts.map +1 -1
  72. package/dist/pm/linear-helpers.js +13 -21
  73. package/dist/pm/linear-helpers.js.map +1 -1
  74. package/dist/pm/pause-state.d.ts +29 -0
  75. package/dist/pm/pause-state.d.ts.map +1 -0
  76. package/dist/pm/pause-state.js +34 -0
  77. package/dist/pm/pause-state.js.map +1 -0
  78. package/dist/pm/slack-bulk.d.ts +34 -0
  79. package/dist/pm/slack-bulk.d.ts.map +1 -0
  80. package/dist/pm/slack-bulk.js +110 -0
  81. package/dist/pm/slack-bulk.js.map +1 -0
  82. package/dist/pm/slack-commands.d.ts +101 -0
  83. package/dist/pm/slack-commands.d.ts.map +1 -0
  84. package/dist/pm/slack-commands.js +309 -0
  85. package/dist/pm/slack-commands.js.map +1 -0
  86. package/dist/pm/slack-helpers.d.ts +10 -0
  87. package/dist/pm/slack-helpers.d.ts.map +1 -1
  88. package/dist/pm/slack-helpers.js +32 -0
  89. package/dist/pm/slack-helpers.js.map +1 -1
  90. package/dist/pm/slack-interface.d.ts +32 -58
  91. package/dist/pm/slack-interface.d.ts.map +1 -1
  92. package/dist/pm/slack-interface.js +150 -320
  93. package/dist/pm/slack-interface.js.map +1 -1
  94. package/dist/rbac/matrix.d.ts +2 -0
  95. package/dist/rbac/matrix.d.ts.map +1 -1
  96. package/dist/rbac/matrix.js +2 -0
  97. package/dist/rbac/matrix.js.map +1 -1
  98. package/dist/server.d.ts.map +1 -1
  99. package/dist/server.js +7 -0
  100. package/dist/server.js.map +1 -1
  101. package/dist/sync/gh-linear-sync.d.ts +5 -1
  102. package/dist/sync/gh-linear-sync.d.ts.map +1 -1
  103. package/dist/sync/gh-linear-sync.js +104 -44
  104. package/dist/sync/gh-linear-sync.js.map +1 -1
  105. package/dist/types.d.ts +13 -4
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/types.js +6 -0
  108. package/dist/types.js.map +1 -1
  109. package/dist/util/linear.d.ts +70 -0
  110. package/dist/util/linear.d.ts.map +1 -0
  111. package/dist/util/linear.js +108 -0
  112. package/dist/util/linear.js.map +1 -0
  113. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ import type { PipelineConfig, RepoConfig, Notifier, PipelineRun, SanitizedIssue, ReviewFeedbackContext } from "../types.js";
2
+ import type { AnyDb } from "../db/client.js";
3
+ import { type GitHubConfig } from "../repo/github.js";
4
+ import { type GitLabConfig } from "../repo/gitlab.js";
5
+ import type { ReviewFeedbackComment } from "../webhook/github-handler.js";
6
+ import type { WorkQueue } from "./queue.js";
7
+ import { type LockAdapter } from "./distributed-lock.js";
8
+ /**
9
+ * Map webhook-shaped `ReviewFeedbackComment[]` (the wire format we receive
10
+ * from GitHub) into the `ReviewFeedbackContext` that the implement template
11
+ * expects when handling PR review feedback.
12
+ *
13
+ * Routes the implement stage into the dedicated review-feedback prompt path
14
+ * (templates.ts:233-253) — "address review comments on existing branch, push
15
+ * to same branch, do NOT create a new PR" — instead of falling through to
16
+ * the standard "create branch and implement issue from scratch" prompt.
17
+ *
18
+ * `createdAt` is not captured by the GitHub webhook handler today, so the
19
+ * mapped comments use an empty string. The template only renders this for
20
+ * display; an empty value is harmless.
21
+ */
22
+ export declare function buildReviewFeedbackContext(prUrl: string, prBranch: string, comments: ReviewFeedbackComment[]): ReviewFeedbackContext;
23
+ /**
24
+ * All dependencies required by executeFeedbackPipeline.
25
+ *
26
+ * PipelineRunner.startFeedback() constructs this context from its own
27
+ * instance fields and passes it through to the extracted function so the
28
+ * implementation can live outside the class while still accessing the same
29
+ * shared state (queues, locks, notifier, config).
30
+ *
31
+ * @param db - AnyDb instance (SQLite or Postgres)
32
+ * @param notifier - Composite notifier for Linear/Slack/Discord events
33
+ * @param repoCloneDir - Base directory for bare repository clones
34
+ * @param agentRunDir - Base directory for per-run agent worktrees
35
+ * @param githubConfig - Optional GitHub App credentials (re-request review)
36
+ * @param gitlabConfig - Optional GitLab credentials (authenticated clone URL)
37
+ * @param pushQueue - Concurrency-1 queue serialising push operations
38
+ * @param lockAdapter - Distributed branch lock adapter
39
+ * @param prLockTimeoutMs - Max wait time (ms) for the distributed branch lock
40
+ * @param budgetAlertedRuns - Mutable set of runIds that already fired 80% alert
41
+ * @param checkTokenBudget - Bound method: checks/enforces the token budget
42
+ * @param failPipeline - Bound method: marks run as failed and notifies
43
+ * @param injectAgentConfig - Bound method: writes CLAUDE.md into worktree
44
+ */
45
+ export interface FeedbackPipelineContext {
46
+ db: AnyDb;
47
+ notifier: Notifier;
48
+ repoCloneDir: string;
49
+ agentRunDir: string;
50
+ githubConfig?: GitHubConfig;
51
+ gitlabConfig?: GitLabConfig;
52
+ pushQueue: WorkQueue;
53
+ lockAdapter: LockAdapter;
54
+ prLockTimeoutMs: number;
55
+ budgetAlertedRuns: Set<string>;
56
+ checkTokenBudget(db: AnyDb, runId: string, run: PipelineRun, config: PipelineConfig, stage: string): Promise<boolean>;
57
+ failPipeline(db: AnyDb, runId: string, run: PipelineRun, stage: string, errorMsg: string, retriesExhausted: boolean): Promise<void>;
58
+ injectAgentConfig(worktreePath: string): Promise<void>;
59
+ /**
60
+ * Operator-initiated stop. Mirrors the main pipeline's path so feedback
61
+ * runs honour cancel/graceful signals. Passes the prUrl so the per-PR
62
+ * rate-limit slot is freed immediately rather than waiting on the queue's
63
+ * `finally` block.
64
+ */
65
+ markRunCancelled(db: AnyDb, runId: string, run: PipelineRun, mode: "cancel" | "graceful", feedbackPrUrl?: string): Promise<void>;
66
+ }
67
+ /**
68
+ * Execute a review-feedback pipeline run.
69
+ *
70
+ * Key differences from executePipeline():
71
+ * - Checks out the EXISTING PR branch (not a new one).
72
+ * - Skips triage, reproduce, await-approval stages.
73
+ * - Does NOT create a new PR — pushes to the same branch.
74
+ * - Optionally re-requests review via GitHub App after push.
75
+ * - Feedback comment context is injected into the implement stage prompt.
76
+ *
77
+ * @param ctx - All dependencies (db, notifier, queues, config, etc.)
78
+ * @param runId - Unique ID for this pipeline run
79
+ * @param run - In-memory PipelineRun state object
80
+ * @param config - Pipeline configuration (stages, maxTokens, etc.)
81
+ * @param repoConfig - Repository configuration (URL, provider, etc.)
82
+ * @param sanitizedIssue - Sanitized issue data for prompt construction
83
+ * @param branch - Existing PR branch to check out and push to
84
+ * @param prUrl - URL of the pull request being addressed
85
+ * @param prNumber - PR number (required for re-requesting review)
86
+ * @param feedbackComments - Raw feedback comments from the GitHub webhook
87
+ * @param rerequestReview - Whether to re-request review after pushing
88
+ */
89
+ export declare function executeFeedbackPipeline(ctx: FeedbackPipelineContext, runId: string, run: PipelineRun, config: PipelineConfig, repoConfig: RepoConfig, sanitizedIssue: SanitizedIssue, branch: string, prUrl: string, prNumber: number | undefined, feedbackComments: ReviewFeedbackComment[], rerequestReview: boolean): Promise<void>;
90
+ /**
91
+ * Minimal issue reference required by the feedback pipeline orchestration.
92
+ * Structural subset of LinearIssue; passing a full LinearIssue is valid.
93
+ */
94
+ export type FeedbackIssueRef = {
95
+ identifier: string;
96
+ title: string;
97
+ };
98
+ /**
99
+ * Extended context for orchestrating a feedback pipeline run.
100
+ * Adds the state-management dependencies that startFeedbackPipeline needs
101
+ * on top of the execution dependencies in FeedbackPipelineContext.
102
+ *
103
+ * @param activeFeedbackRuns - Mutable map of in-flight feedback runs (prUrl → runId) for rate-limiting
104
+ * @param queue - Main execution queue from PipelineRunner
105
+ * @param buildPipelineRun - Factory that constructs an in-memory PipelineRun from issue/config data
106
+ */
107
+ export interface FeedbackStartContext extends FeedbackPipelineContext {
108
+ activeFeedbackRuns: Map<string, string>;
109
+ queue: WorkQueue;
110
+ buildPipelineRun(runId: string, issue: FeedbackIssueRef, pipelineKey: string, repoConfig: RepoConfig, branch: string): PipelineRun;
111
+ }
112
+ /**
113
+ * Orchestrate a review-feedback pipeline run.
114
+ *
115
+ * Handles the setup phase that wraps executeFeedbackPipeline:
116
+ * - Rate-limit check (one run per PR at a time).
117
+ * - DB record insertion (status = "queued").
118
+ * - In-memory PipelineRun construction.
119
+ * - Enqueue execution via the main work queue.
120
+ *
121
+ * PipelineRunner.startFeedback() is a thin wrapper that delegates here,
122
+ * passing its instance state through FeedbackStartContext.
123
+ *
124
+ * @param ctx - Runner-level dependencies (db, notifier, queues, locks, etc.)
125
+ * @param params - Issue / PR / feedback data for this run
126
+ */
127
+ export declare function startFeedbackPipeline(ctx: FeedbackStartContext, params: {
128
+ issue: FeedbackIssueRef;
129
+ pipelineKey: string;
130
+ pipelineConfig: PipelineConfig;
131
+ repoConfig: RepoConfig;
132
+ sanitizedIssue: SanitizedIssue;
133
+ branch: string;
134
+ prUrl: string;
135
+ prNumber?: number;
136
+ parentRunId?: string;
137
+ feedbackComments: ReviewFeedbackComment[];
138
+ rerequestReview?: boolean;
139
+ }): Promise<void>;
140
+ //# sourceMappingURL=feedback-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/feedback-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,QAAQ,EACR,WAAW,EAEX,cAAc,EACd,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAe7C,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQ1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAiD/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,GAChC,qBAAqB,CAYvB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,gBAAgB,CACd,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,YAAY,CACV,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD;;;;;OAKG;IACH,gBAAgB,CACd,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,GAAG,UAAU,EAC3B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,uBAAuB,EAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,gBAAgB,EAAE,qBAAqB,EAAE,EACzC,eAAe,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC,CA4Uf;AAMD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACnE,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,WAAW,CAAC;CAChB;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE;IACN,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,OAAO,CAAC,IAAI,CAAC,CAqGf"}
@@ -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"}