@cat-factory/orchestration 0.104.1 → 0.105.1
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/modules/execution/AgentContextBuilder.d.ts.map +1 -1
- package/dist/modules/execution/AgentContextBuilder.js +25 -2
- package/dist/modules/execution/AgentContextBuilder.js.map +1 -1
- package/dist/modules/execution/ExecutionService.d.ts +7 -1
- package/dist/modules/execution/ExecutionService.d.ts.map +1 -1
- package/dist/modules/execution/ExecutionService.js +22 -0
- package/dist/modules/execution/ExecutionService.js.map +1 -1
- package/dist/modules/execution/ForkDecisionController.d.ts +68 -0
- package/dist/modules/execution/ForkDecisionController.d.ts.map +1 -0
- package/dist/modules/execution/ForkDecisionController.js +169 -0
- package/dist/modules/execution/ForkDecisionController.js.map +1 -0
- package/dist/modules/execution/RunDispatcher.d.ts +18 -1
- package/dist/modules/execution/RunDispatcher.d.ts.map +1 -1
- package/dist/modules/execution/RunDispatcher.js +93 -3
- package/dist/modules/execution/RunDispatcher.js.map +1 -1
- package/dist/modules/execution/forkDecision.logic.d.ts +50 -0
- package/dist/modules/execution/forkDecision.logic.d.ts.map +1 -0
- package/dist/modules/execution/forkDecision.logic.js +108 -0
- package/dist/modules/execution/forkDecision.logic.js.map +1 -0
- package/dist/modules/merge/RiskPolicyService.d.ts.map +1 -1
- package/dist/modules/merge/RiskPolicyService.js +3 -0
- package/dist/modules/merge/RiskPolicyService.js.map +1 -1
- package/dist/modules/notifications/NotificationService.d.ts.map +1 -1
- package/dist/modules/notifications/NotificationService.js +5 -1
- package/dist/modules/notifications/NotificationService.js.map +1 -1
- package/package.json +11 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForkDecisionController.js","sourceRoot":"","sources":["../../../src/modules/execution/ForkDecisionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentExecutor, AgentRunContext, AgentRunResult, Block, BlockRepository, BrainstormSession, ClarityReview, Clock, ExecutionEventPublisher, ExecutionInstance, ExecutionRepository, FollowUpsStepState, GateDefinition, IdGenerator, IssueWritebackProvider, PipelineStep, ProviderCapabilities, ProvisionContext, RequirementConcernLevel, RequirementReview, ResolveRunRepoContext, RunInitiatorScope, TicketTrackerProvider, WorkRunner } from '@cat-factory/kernel';
|
|
1
|
+
import type { AgentExecutor, AgentRunContext, AgentRunResult, Block, BlockRepository, BrainstormSession, ClarityReview, Clock, ExecutionEventPublisher, ExecutionInstance, ExecutionRepository, FollowUpsStepState, ForkDecisionStepState, ChooseForkInput, GateDefinition, IdGenerator, IssueWritebackProvider, PipelineStep, ProviderCapabilities, ProvisionContext, RequirementConcernLevel, StepGating, RequirementReview, ResolveRunRepoContext, RunInitiatorScope, TicketTrackerProvider, WorkRunner } from '@cat-factory/kernel';
|
|
2
2
|
import type { AgentKindRegistry } from '@cat-factory/agents';
|
|
3
3
|
import type { BugIntakeService, EnvironmentProvisioningService } from '@cat-factory/integrations';
|
|
4
4
|
import { AgentContextBuilder } from './AgentContextBuilder.js';
|
|
@@ -6,6 +6,7 @@ import { CompanionController } from './CompanionController.js';
|
|
|
6
6
|
import { HumanTestController } from './HumanTestController.js';
|
|
7
7
|
import { MergeResolver } from './MergeResolver.js';
|
|
8
8
|
import { ReviewGateController, type ReviewKind } from './ReviewGateController.js';
|
|
9
|
+
import { ForkDecisionController } from './ForkDecisionController.js';
|
|
9
10
|
import type { InterviewGateController } from './InterviewGateController.js';
|
|
10
11
|
import { RunStateMachine } from './RunStateMachine.js';
|
|
11
12
|
import { StepGraph } from './StepGraph.js';
|
|
@@ -32,6 +33,7 @@ type ResolvedRiskPolicy = {
|
|
|
32
33
|
releaseWatchWindowMinutes: number;
|
|
33
34
|
releaseMaxAttempts: number;
|
|
34
35
|
humanReviewGraceMinutes: number;
|
|
36
|
+
forkDecision?: StepGating | null;
|
|
35
37
|
};
|
|
36
38
|
/** Collaborators + leaf dependencies the {@link RunDispatcher} needs. */
|
|
37
39
|
export interface RunDispatcherDeps {
|
|
@@ -54,6 +56,7 @@ export interface RunDispatcherDeps {
|
|
|
54
56
|
humanTestController: HumanTestController;
|
|
55
57
|
visualConfirmationController: VisualConfirmationController;
|
|
56
58
|
reviewGate: ReviewGateController;
|
|
59
|
+
forkDecisionController: ForkDecisionController;
|
|
57
60
|
requirementsKind: ReviewKind<RequirementReview>;
|
|
58
61
|
clarityKind: ReviewKind<ClarityReview>;
|
|
59
62
|
requirementsBrainstormKind: ReviewKind<BrainstormSession>;
|
|
@@ -116,6 +119,7 @@ export declare class RunDispatcher {
|
|
|
116
119
|
private readonly humanTestController;
|
|
117
120
|
private readonly visualConfirmationController;
|
|
118
121
|
private readonly reviewGate;
|
|
122
|
+
private readonly forkDecisionController;
|
|
119
123
|
private readonly requirementsKind;
|
|
120
124
|
private readonly clarityKind;
|
|
121
125
|
private readonly requirementsBrainstormKind;
|
|
@@ -665,6 +669,19 @@ export declare class RunDispatcher {
|
|
|
665
669
|
private activeFollowUpStep;
|
|
666
670
|
/** Read a run's live follow-up companion state (the active Coder step's items), or null. */
|
|
667
671
|
getFollowUps(workspaceId: string, executionId: string): Promise<FollowUpsStepState | null>;
|
|
672
|
+
/**
|
|
673
|
+
* Run the fork-decision phase for a coder step. On fresh entry resolve whether to propose
|
|
674
|
+
* (tri-state `off` → skip; `always` → propose; `auto` → the risk-policy fork gate against the
|
|
675
|
+
* block's estimate). Not proposing → record `skipped` and `continue` so the driver re-enters
|
|
676
|
+
* and dispatches the Coder. Proposing → dispatch the read-only `fork-proposer` explore job on
|
|
677
|
+
* this step (Phase A) via {@link handleAgentStep} with a dispatch-kind override; its
|
|
678
|
+
* completion is intercepted. A re-drive while `proposing` re-attaches to the running job.
|
|
679
|
+
*/
|
|
680
|
+
private handleForkDecisionPhase;
|
|
681
|
+
/** Read a run's active implementation-fork decision state, or null. */
|
|
682
|
+
getForkDecision(workspaceId: string, executionId: string): Promise<ForkDecisionStepState | null>;
|
|
683
|
+
/** Resolve the human's implementation-fork choice, re-running the Coder with it folded in. */
|
|
684
|
+
chooseFork(workspaceId: string, executionId: string, input: ChooseForkInput): Promise<ForkDecisionStepState>;
|
|
668
685
|
/**
|
|
669
686
|
* Locate the run + the Coder step that OWNS the addressed item + the item, throwing 404
|
|
670
687
|
* when absent. Routes by item id (not "the first enabled step") so a pipeline carrying more
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunDispatcher.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/RunDispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,eAAe,EACf,cAAc,EAEd,KAAK,EACL,eAAe,EAEf,iBAAiB,EACjB,aAAa,EACb,KAAK,EAEL,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EAEnB,kBAAkB,EAElB,cAAc,EAEd,WAAW,EACX,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAGhB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EAErB,iBAAiB,EAMjB,qBAAqB,EACrB,UAAU,EACX,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"RunDispatcher.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/RunDispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConflictError, DEFAULT_RISK_POLICY, getErrorMessage, getErrorReason, getProvider, INITIATIVE_ANALYST_AGENT_KIND, INITIATIVE_COMMITTER_AGENT_KIND, INITIATIVE_PLANNER_AGENT_KIND, isAsyncAgentExecutor, NotFoundError, parseLocalModelId, recordGateAttempt, registeredGateFactories, registeredStepResolverFactories, requireProvider, RunContendedError, sameSubtasks, } from '@cat-factory/kernel';
|
|
2
2
|
import { frontendOriginsForService, parseBlueprintService, parseSpecDoc, resolveAprioriWorkingBranch, } from '@cat-factory/contracts';
|
|
3
|
-
import { blueprintPostOp, commitInitiativeTracker, hasTrait, isCompanionKind, isContainerBackedCompanion, INTERVIEW_GATE_TRAIT, moduleSlug, runRepoOps, specPostOp, TASK_ESTIMATOR_AGENT_KIND, } from '@cat-factory/agents';
|
|
3
|
+
import { blueprintPostOp, commitInitiativeTracker, FORK_PROPOSER_KIND, hasTrait, isCompanionKind, isContainerBackedCompanion, INTERVIEW_GATE_TRAIT, moduleSlug, runRepoOps, specPostOp, TASK_ESTIMATOR_AGENT_KIND, } from '@cat-factory/agents';
|
|
4
4
|
import { DEPLOYER_AGENT_KIND, isDeployStep } from '@cat-factory/integrations';
|
|
5
5
|
import { BUG_INTAKE_AGENT_KIND } from '../pipelines/pipelineShape.js';
|
|
6
6
|
import { coerceTaskEstimate, summarizeEstimate } from '../estimation/estimate.logic.js';
|
|
@@ -17,6 +17,8 @@ import { CompanionController } from './CompanionController.js';
|
|
|
17
17
|
import { HumanTestController } from './HumanTestController.js';
|
|
18
18
|
import { MergeResolver } from './MergeResolver.js';
|
|
19
19
|
import { ReviewGateController } from './ReviewGateController.js';
|
|
20
|
+
import { ForkDecisionController } from './ForkDecisionController.js';
|
|
21
|
+
import { DEFAULT_FORK_MAX_CHAT_TURNS, forkPhasePending, resolveForkTriState, shouldProposeForkAuto, } from './forkDecision.logic.js';
|
|
20
22
|
import { RunStateMachine } from './RunStateMachine.js';
|
|
21
23
|
import { StepGraph } from './StepGraph.js';
|
|
22
24
|
import { TesterController } from './TesterController.js';
|
|
@@ -115,6 +117,7 @@ export class RunDispatcher {
|
|
|
115
117
|
humanTestController;
|
|
116
118
|
visualConfirmationController;
|
|
117
119
|
reviewGate;
|
|
120
|
+
forkDecisionController;
|
|
118
121
|
requirementsKind;
|
|
119
122
|
clarityKind;
|
|
120
123
|
requirementsBrainstormKind;
|
|
@@ -160,6 +163,7 @@ export class RunDispatcher {
|
|
|
160
163
|
this.humanTestController = deps.humanTestController;
|
|
161
164
|
this.visualConfirmationController = deps.visualConfirmationController;
|
|
162
165
|
this.reviewGate = deps.reviewGate;
|
|
166
|
+
this.forkDecisionController = deps.forkDecisionController;
|
|
163
167
|
this.requirementsKind = deps.requirementsKind;
|
|
164
168
|
this.clarityKind = deps.clarityKind;
|
|
165
169
|
this.requirementsBrainstormKind = deps.requirementsBrainstormKind;
|
|
@@ -208,14 +212,19 @@ export class RunDispatcher {
|
|
|
208
212
|
* what the dispatch chain falls through to; all the deterministic / gate / inline-review
|
|
209
213
|
* kinds are claimed earlier by their own handlers (see {@link buildStepHandlerRegistry}).
|
|
210
214
|
*/
|
|
211
|
-
async handleAgentStep(ctx) {
|
|
215
|
+
async handleAgentStep(ctx, dispatchKind) {
|
|
212
216
|
const { workspaceId, instance, step, block, isFinalStep, options } = ctx;
|
|
213
217
|
// Async (container) steps don't block: dispatch the job and park. The durable
|
|
214
218
|
// driver polls `pollAgentJob` between sleeps so the run can span far longer
|
|
215
219
|
// than a single durable step's timeout, while each step stays short. A set
|
|
216
220
|
// `jobId` means a prior (possibly replayed) dispatch already started the job,
|
|
217
221
|
// so we re-attach instead of starting a duplicate.
|
|
218
|
-
|
|
222
|
+
//
|
|
223
|
+
// `dispatchKind` overrides the dispatched agent kind WITHOUT changing `step.agentKind`
|
|
224
|
+
// — used by the fork-decision phase to dispatch the read-only `fork-proposer` explore
|
|
225
|
+
// job as a HELPER off the coder step (Phase A). The completion still records against the
|
|
226
|
+
// coder step, and the fork-proposal interceptor keys on `step.agentKind` + the fork state.
|
|
227
|
+
const context = await this.contextBuilder.buildContext(workspaceId, instance, step, isFinalStep, block, dispatchKind ? { agentKind: dispatchKind } : undefined);
|
|
219
228
|
// A registered custom kind's PRE-ops run deterministic backend repo work before the
|
|
220
229
|
// agent dispatches (e.g. read a baseline `spec/` shard into the prompt). Gated on the
|
|
221
230
|
// step not having dispatched yet so a Workflows replay (jobId already set) doesn't
|
|
@@ -2244,6 +2253,19 @@ export class RunDispatcher {
|
|
|
2244
2253
|
canHandle: ({ step }) => isCompanionKind(step.agentKind) && !isContainerBackedCompanion(step.agentKind),
|
|
2245
2254
|
handle: ({ workspaceId, instance, step, block, isFinalStep, options }) => this.companionController.evaluate(workspaceId, instance, step, block, isFinalStep, options),
|
|
2246
2255
|
},
|
|
2256
|
+
// The optional implementation-fork decision phase on a Coder step (Phase A): when the
|
|
2257
|
+
// per-task tri-state + the risk-policy gate call for it, dispatch the read-only
|
|
2258
|
+
// `fork-proposer` explore job as a helper off THIS coder step. Claims the step only
|
|
2259
|
+
// while the phase is pending (tri-state not `off`, not yet resolved); once resolved
|
|
2260
|
+
// (`chosen` / `single_path` / `skipped`) it falls through so the Coder dispatches
|
|
2261
|
+
// normally (Phase B). A parked `awaiting_choice` step is short-circuited by the
|
|
2262
|
+
// run-lifecycle re-entry guard before this handler runs. See {@link handleForkDecisionPhase}.
|
|
2263
|
+
{
|
|
2264
|
+
kind: 'fork-decision',
|
|
2265
|
+
order: 170,
|
|
2266
|
+
canHandle: ({ step, block }) => forkPhasePending(step, resolveForkTriState(block.agentConfig)),
|
|
2267
|
+
handle: (ctx) => this.handleForkDecisionPhase(ctx),
|
|
2268
|
+
},
|
|
2247
2269
|
// The generic container/inline-agent step — claims every step no more-specific handler
|
|
2248
2270
|
// did. Highest order so it always runs last. See {@link handleAgentStep}.
|
|
2249
2271
|
{
|
|
@@ -2298,6 +2320,22 @@ export class RunDispatcher {
|
|
|
2298
2320
|
return this.companionController.resolveContainerVerdict(workspaceId, instance, step, companionBlock, isFinalStep, result);
|
|
2299
2321
|
},
|
|
2300
2322
|
},
|
|
2323
|
+
// The `fork-proposer` explore job (Phase A of the fork decision) just finished on a
|
|
2324
|
+
// coder step. Its structured `result.custom` is the proposal; record it onto the step's
|
|
2325
|
+
// `forkDecision` and either park for the human to choose (≥2 usable forks) or auto-advance
|
|
2326
|
+
// a single path — never the normal output/PR/follow-up/approval completion (none applies
|
|
2327
|
+
// to the proposer). Keyed on the coder step carrying `forkDecision.status === 'proposing'`.
|
|
2328
|
+
{
|
|
2329
|
+
kind: 'fork-proposal',
|
|
2330
|
+
order: 105,
|
|
2331
|
+
canIntercept: ({ step }) => step.agentKind === 'coder' && step.forkDecision?.status === 'proposing',
|
|
2332
|
+
intercept: ({ workspaceId, instance, step, result }) => {
|
|
2333
|
+
const proposal = this.agentKindRegistry
|
|
2334
|
+
.structuredOutput(FORK_PROPOSER_KIND)
|
|
2335
|
+
?.safeParse(result.custom);
|
|
2336
|
+
return this.forkDecisionController.recordProposal(workspaceId, instance, step, proposal, step.model);
|
|
2337
|
+
},
|
|
2338
|
+
},
|
|
2301
2339
|
// A `tester` step returned a structured report. On a withheld greenlight we do NOT
|
|
2302
2340
|
// finish the step: loop the `fixer` (within the attempt budget) and re-test, mirroring
|
|
2303
2341
|
// the CI gate. A greenlight (or no provider) returns null and falls through to the
|
|
@@ -2783,6 +2821,58 @@ export class RunDispatcher {
|
|
|
2783
2821
|
throw new NotFoundError('Execution', executionId);
|
|
2784
2822
|
return this.activeFollowUpStep(instance)?.step.followUps ?? null;
|
|
2785
2823
|
}
|
|
2824
|
+
// ---- Implementation-fork decision phase (Phase A dispatch) --------------
|
|
2825
|
+
// The proposer explore job runs as a HELPER off the coder step; its completion is handled
|
|
2826
|
+
// by the `fork-proposal` interceptor + {@link ForkDecisionController.recordProposal}, and the
|
|
2827
|
+
// human's choice by {@link ForkDecisionController.choose}. This method only owns the FRESH
|
|
2828
|
+
// entry: resolve the tri-state + risk-policy gate, then either dispatch the proposer or fall
|
|
2829
|
+
// through by marking the phase skipped so the Coder dispatches on the next re-drive.
|
|
2830
|
+
/**
|
|
2831
|
+
* Run the fork-decision phase for a coder step. On fresh entry resolve whether to propose
|
|
2832
|
+
* (tri-state `off` → skip; `always` → propose; `auto` → the risk-policy fork gate against the
|
|
2833
|
+
* block's estimate). Not proposing → record `skipped` and `continue` so the driver re-enters
|
|
2834
|
+
* and dispatches the Coder. Proposing → dispatch the read-only `fork-proposer` explore job on
|
|
2835
|
+
* this step (Phase A) via {@link handleAgentStep} with a dispatch-kind override; its
|
|
2836
|
+
* completion is intercepted. A re-drive while `proposing` re-attaches to the running job.
|
|
2837
|
+
*/
|
|
2838
|
+
async handleForkDecisionPhase(ctx) {
|
|
2839
|
+
const { workspaceId, instance, step, block } = ctx;
|
|
2840
|
+
if (!step.forkDecision) {
|
|
2841
|
+
const tri = resolveForkTriState(block.agentConfig);
|
|
2842
|
+
let propose = tri === 'always';
|
|
2843
|
+
if (tri === 'auto') {
|
|
2844
|
+
const policy = await this.resolveRiskPolicy(workspaceId, block);
|
|
2845
|
+
propose = shouldProposeForkAuto(policy.forkDecision, block.estimate);
|
|
2846
|
+
}
|
|
2847
|
+
if (!propose) {
|
|
2848
|
+
step.forkDecision = {
|
|
2849
|
+
status: 'skipped',
|
|
2850
|
+
forks: [],
|
|
2851
|
+
chat: [],
|
|
2852
|
+
maxChatTurns: DEFAULT_FORK_MAX_CHAT_TURNS,
|
|
2853
|
+
};
|
|
2854
|
+
await this.runStateMachine.casPersist(workspaceId, instance);
|
|
2855
|
+
await this.runStateMachine.emitInstance(workspaceId, instance);
|
|
2856
|
+
return { kind: 'continue' };
|
|
2857
|
+
}
|
|
2858
|
+
step.forkDecision = {
|
|
2859
|
+
status: 'proposing',
|
|
2860
|
+
forks: [],
|
|
2861
|
+
chat: [],
|
|
2862
|
+
maxChatTurns: DEFAULT_FORK_MAX_CHAT_TURNS,
|
|
2863
|
+
};
|
|
2864
|
+
}
|
|
2865
|
+
// Dispatch (or re-attach to) the proposer as a helper off this coder step.
|
|
2866
|
+
return this.handleAgentStep(ctx, FORK_PROPOSER_KIND);
|
|
2867
|
+
}
|
|
2868
|
+
/** Read a run's active implementation-fork decision state, or null. */
|
|
2869
|
+
getForkDecision(workspaceId, executionId) {
|
|
2870
|
+
return this.forkDecisionController.getActive(workspaceId, executionId);
|
|
2871
|
+
}
|
|
2872
|
+
/** Resolve the human's implementation-fork choice, re-running the Coder with it folded in. */
|
|
2873
|
+
chooseFork(workspaceId, executionId, input) {
|
|
2874
|
+
return this.forkDecisionController.choose(workspaceId, executionId, input);
|
|
2875
|
+
}
|
|
2786
2876
|
/**
|
|
2787
2877
|
* Locate the run + the Coder step that OWNS the addressed item + the item, throwing 404
|
|
2788
2878
|
* when absent. Routes by item id (not "the first enabled step") so a pipeline carrying more
|