@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.
- package/dist/__tests__/agent-stream.test.js +35 -1
- package/dist/__tests__/agent-stream.test.js.map +1 -1
- package/dist/__tests__/bec-185-reproduce.test.d.ts +16 -0
- package/dist/__tests__/bec-185-reproduce.test.d.ts.map +1 -0
- package/dist/__tests__/bec-185-reproduce.test.js +16 -0
- package/dist/__tests__/bec-185-reproduce.test.js.map +1 -0
- package/dist/__tests__/control-signals.test.d.ts +2 -0
- package/dist/__tests__/control-signals.test.d.ts.map +1 -0
- package/dist/__tests__/control-signals.test.js +77 -0
- package/dist/__tests__/control-signals.test.js.map +1 -0
- package/dist/__tests__/gh-linear-sync.test.js +57 -2
- package/dist/__tests__/gh-linear-sync.test.js.map +1 -1
- package/dist/__tests__/openrouter-client.test.js +34 -0
- package/dist/__tests__/openrouter-client.test.js.map +1 -1
- package/dist/__tests__/pm-slack-interface.test.js +45 -0
- package/dist/__tests__/pm-slack-interface.test.js.map +1 -1
- package/dist/__tests__/pm-triage.test.js +101 -0
- package/dist/__tests__/pm-triage.test.js.map +1 -1
- package/dist/__tests__/util-linear.test.d.ts +10 -0
- package/dist/__tests__/util-linear.test.d.ts.map +1 -0
- package/dist/__tests__/util-linear.test.js +244 -0
- package/dist/__tests__/util-linear.test.js.map +1 -0
- package/dist/audit/events.d.ts +24 -0
- package/dist/audit/events.d.ts.map +1 -1
- package/dist/audit/events.js +32 -0
- package/dist/audit/events.js.map +1 -1
- package/dist/executor/agent-stream.d.ts +16 -0
- package/dist/executor/agent-stream.d.ts.map +1 -1
- package/dist/executor/agent-stream.js +43 -1
- package/dist/executor/agent-stream.js.map +1 -1
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +24 -5
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/review/openrouter-client.d.ts.map +1 -1
- package/dist/executor/review/openrouter-client.js +8 -0
- package/dist/executor/review/openrouter-client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/notifier/linear.d.ts +0 -1
- package/dist/notifier/linear.d.ts.map +1 -1
- package/dist/notifier/linear.js +2 -5
- package/dist/notifier/linear.js.map +1 -1
- package/dist/pipeline/control-signals.d.ts +49 -0
- package/dist/pipeline/control-signals.d.ts.map +1 -0
- package/dist/pipeline/control-signals.js +93 -0
- package/dist/pipeline/control-signals.js.map +1 -0
- package/dist/pipeline/feedback-pipeline.d.ts +140 -0
- package/dist/pipeline/feedback-pipeline.d.ts.map +1 -0
- package/dist/pipeline/feedback-pipeline.js +427 -0
- package/dist/pipeline/feedback-pipeline.js.map +1 -0
- package/dist/pipeline/index.d.ts +1 -0
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +1 -0
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/runner.d.ts +49 -33
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +136 -349
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pm/actions/promote.d.ts.map +1 -1
- package/dist/pm/actions/promote.js +15 -11
- package/dist/pm/actions/promote.js.map +1 -1
- package/dist/pm/actions/recover-stuck.d.ts.map +1 -1
- package/dist/pm/actions/recover-stuck.js +9 -5
- package/dist/pm/actions/recover-stuck.js.map +1 -1
- package/dist/pm/actions/triage.d.ts.map +1 -1
- package/dist/pm/actions/triage.js +67 -1
- package/dist/pm/actions/triage.js.map +1 -1
- package/dist/pm/linear-helpers.d.ts +10 -0
- package/dist/pm/linear-helpers.d.ts.map +1 -1
- package/dist/pm/linear-helpers.js +13 -21
- package/dist/pm/linear-helpers.js.map +1 -1
- package/dist/pm/pause-state.d.ts +29 -0
- package/dist/pm/pause-state.d.ts.map +1 -0
- package/dist/pm/pause-state.js +34 -0
- package/dist/pm/pause-state.js.map +1 -0
- package/dist/pm/slack-bulk.d.ts +34 -0
- package/dist/pm/slack-bulk.d.ts.map +1 -0
- package/dist/pm/slack-bulk.js +110 -0
- package/dist/pm/slack-bulk.js.map +1 -0
- package/dist/pm/slack-commands.d.ts +101 -0
- package/dist/pm/slack-commands.d.ts.map +1 -0
- package/dist/pm/slack-commands.js +309 -0
- package/dist/pm/slack-commands.js.map +1 -0
- package/dist/pm/slack-helpers.d.ts +10 -0
- package/dist/pm/slack-helpers.d.ts.map +1 -1
- package/dist/pm/slack-helpers.js +32 -0
- package/dist/pm/slack-helpers.js.map +1 -1
- package/dist/pm/slack-interface.d.ts +32 -58
- package/dist/pm/slack-interface.d.ts.map +1 -1
- package/dist/pm/slack-interface.js +150 -320
- package/dist/pm/slack-interface.js.map +1 -1
- package/dist/rbac/matrix.d.ts +2 -0
- package/dist/rbac/matrix.d.ts.map +1 -1
- package/dist/rbac/matrix.js +2 -0
- package/dist/rbac/matrix.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -1
- package/dist/sync/gh-linear-sync.d.ts +5 -1
- package/dist/sync/gh-linear-sync.d.ts.map +1 -1
- package/dist/sync/gh-linear-sync.js +104 -44
- package/dist/sync/gh-linear-sync.js.map +1 -1
- package/dist/types.d.ts +13 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/util/linear.d.ts +70 -0
- package/dist/util/linear.d.ts.map +1 -0
- package/dist/util/linear.js +108 -0
- package/dist/util/linear.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|
package/dist/pipeline/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/pipeline/index.js
CHANGED
|
@@ -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"}
|