@cat-factory/orchestration 0.105.5 → 0.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +25 -0
- package/dist/container.js.map +1 -1
- package/dist/modules/execution/AgentContextBuilder.d.ts +9 -0
- package/dist/modules/execution/AgentContextBuilder.d.ts.map +1 -1
- package/dist/modules/execution/AgentContextBuilder.js +15 -0
- package/dist/modules/execution/AgentContextBuilder.js.map +1 -1
- package/dist/modules/execution/ExecutionService.d.ts +12 -2
- package/dist/modules/execution/ExecutionService.d.ts.map +1 -1
- package/dist/modules/execution/ExecutionService.js +16 -2
- package/dist/modules/execution/ExecutionService.js.map +1 -1
- package/dist/modules/execution/ForkChatService.d.ts +40 -0
- package/dist/modules/execution/ForkChatService.d.ts.map +1 -0
- package/dist/modules/execution/ForkChatService.js +74 -0
- package/dist/modules/execution/ForkChatService.js.map +1 -0
- package/dist/modules/execution/ForkDecisionController.d.ts +35 -1
- package/dist/modules/execution/ForkDecisionController.d.ts.map +1 -1
- package/dist/modules/execution/ForkDecisionController.js +107 -1
- package/dist/modules/execution/ForkDecisionController.js.map +1 -1
- package/dist/modules/execution/RunDispatcher.d.ts +3 -1
- package/dist/modules/execution/RunDispatcher.d.ts.map +1 -1
- package/dist/modules/execution/RunDispatcher.js +20 -14
- package/dist/modules/execution/RunDispatcher.js.map +1 -1
- package/dist/modules/execution/forkDecision.logic.d.ts +12 -3
- package/dist/modules/execution/forkDecision.logic.d.ts.map +1 -1
- package/dist/modules/execution/forkDecision.logic.js +17 -2
- package/dist/modules/execution/forkDecision.logic.js.map +1 -1
- package/dist/modules/execution/job.logic.d.ts +28 -0
- package/dist/modules/execution/job.logic.d.ts.map +1 -1
- package/dist/modules/execution/job.logic.js +33 -0
- package/dist/modules/execution/job.logic.js.map +1 -1
- package/package.json +11 -11
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { generateText } from 'ai';
|
|
2
|
+
import { inlineModelRef, resolveScopedModelProvider, ValidationError } from '@cat-factory/kernel';
|
|
3
|
+
import { catFactoryObservability, FORK_CHAT_AGENT_KIND, FORK_CHAT_SYSTEM_PROMPT, renderForkChatPrompt, } from '@cat-factory/agents';
|
|
4
|
+
import { scopeForBlockRun } from '../../inlineScope.js';
|
|
5
|
+
export class ForkChatService {
|
|
6
|
+
deps;
|
|
7
|
+
constructor(deps) {
|
|
8
|
+
this.deps = deps;
|
|
9
|
+
}
|
|
10
|
+
/** Whether the inline chat responder is available (a provider AND a routing default are wired). */
|
|
11
|
+
get enabled() {
|
|
12
|
+
return (!!this.deps.modelProviderResolver || !!this.deps.modelProvider) && !!this.deps.modelRef;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Answer one human turn about the surfaced forks. Runs the inline responder over the fixed
|
|
16
|
+
* proposal grounding + the thread and returns the assistant reply plus the model that produced
|
|
17
|
+
* it. Throws {@link ValidationError} on an unresolved model or an empty/failed generation, so
|
|
18
|
+
* the driver can record a graceful fallback instead of wedging the parked run.
|
|
19
|
+
*/
|
|
20
|
+
async respond(workspaceId, block, grounding) {
|
|
21
|
+
const { modelProvider, ref } = await this.resolveModel(workspaceId, block);
|
|
22
|
+
let text;
|
|
23
|
+
try {
|
|
24
|
+
const model = modelProvider.resolve(ref);
|
|
25
|
+
const result = await generateText({
|
|
26
|
+
model,
|
|
27
|
+
system: FORK_CHAT_SYSTEM_PROMPT,
|
|
28
|
+
prompt: renderForkChatPrompt(grounding),
|
|
29
|
+
temperature: 0.3,
|
|
30
|
+
maxOutputTokens: 1200,
|
|
31
|
+
providerOptions: catFactoryObservability({
|
|
32
|
+
agentKind: FORK_CHAT_AGENT_KIND,
|
|
33
|
+
workspaceId,
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
text = result.text;
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
throw new ValidationError(`The fork-decision chat responder (${ref.provider}:${ref.model}) failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
40
|
+
}
|
|
41
|
+
const reply = text.trim();
|
|
42
|
+
// An empty visible reply means the model answered only into its private reasoning channel
|
|
43
|
+
// (seen on some reasoning models) — fail loudly so the driver records the canned fallback
|
|
44
|
+
// rather than appending an empty assistant bubble.
|
|
45
|
+
if (!reply) {
|
|
46
|
+
throw new ValidationError(`The fork-decision chat responder (${ref.provider}:${ref.model}) returned an empty reply`);
|
|
47
|
+
}
|
|
48
|
+
return { text: reply, model: `${ref.provider}:${ref.model}` };
|
|
49
|
+
}
|
|
50
|
+
async resolveModel(workspaceId, block) {
|
|
51
|
+
const scope = await scopeForBlockRun(workspaceId, block, this.deps.resolveRunContext);
|
|
52
|
+
const modelProvider = await resolveScopedModelProvider(scope, this.deps);
|
|
53
|
+
const ref = await this.modelFor(workspaceId, block);
|
|
54
|
+
if (!modelProvider || !ref) {
|
|
55
|
+
throw new ValidationError('No model is configured for the fork-decision chat');
|
|
56
|
+
}
|
|
57
|
+
return { modelProvider, ref };
|
|
58
|
+
}
|
|
59
|
+
/** Block pin > workspace per-kind default > routing default (subscription refs degrade inline). */
|
|
60
|
+
async modelFor(workspaceId, block) {
|
|
61
|
+
const fallback = this.deps.modelRef;
|
|
62
|
+
const runsInline = this.deps.runsInline;
|
|
63
|
+
const resolve = (ref) => inlineModelRef(ref, fallback ?? ref, runsInline ? { runsInline } : {});
|
|
64
|
+
const fromBlock = this.deps.resolveBlockModel?.(block.modelId);
|
|
65
|
+
if (fromBlock)
|
|
66
|
+
return resolve(fromBlock);
|
|
67
|
+
const defaultId = await this.deps.resolveWorkspaceModelDefault?.(workspaceId, FORK_CHAT_AGENT_KIND, block.modelPresetId);
|
|
68
|
+
const fromDefault = this.deps.resolveBlockModel?.(defaultId);
|
|
69
|
+
if (fromDefault)
|
|
70
|
+
return resolve(fromDefault);
|
|
71
|
+
return fallback;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ForkChatService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForkChatService.js","sourceRoot":"","sources":["../../../src/modules/execution/ForkChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { BlockRepository, ChooseForkInput, Clock, ExecutionInstance, ExecutionRepository, ForkDecisionStepState, ForkProposal, IdGenerator, PipelineStep, WorkRunner } from '@cat-factory/kernel';
|
|
1
|
+
import type { Block, BlockRepository, ChooseForkInput, Clock, ExecutionInstance, ExecutionRepository, ForkChatRequestInput, ForkDecisionStepState, ForkProposal, IdGenerator, PipelineStep, WorkRunner } from '@cat-factory/kernel';
|
|
2
2
|
import type { NotificationService } from '../notifications/NotificationService.js';
|
|
3
3
|
import type { AdvanceResult } from './advance.js';
|
|
4
|
+
import type { ForkChatService } from './ForkChatService.js';
|
|
4
5
|
import type { RunStateMachine } from './RunStateMachine.js';
|
|
5
6
|
import type { StepGraph } from './StepGraph.js';
|
|
6
7
|
/** What the fork-decision controller needs beyond the shared run state-machine spine. */
|
|
@@ -16,6 +17,18 @@ export interface ForkDecisionControllerDeps {
|
|
|
16
17
|
clock: Clock;
|
|
17
18
|
/** Optional inbox channel; when unwired the `fork_decision_pending` card is skipped. */
|
|
18
19
|
notificationService?: NotificationService;
|
|
20
|
+
/**
|
|
21
|
+
* Inline grounded-chat responder. When unwired (no model) the chat degrades gracefully — a
|
|
22
|
+
* human chat turn is answered with a canned "chat unavailable" reply — so pick / custom still
|
|
23
|
+
* work. See {@link ForkDecisionController.answerChat}.
|
|
24
|
+
*/
|
|
25
|
+
forkChatService?: ForkChatService;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the EFFECTIVE task description an agent step runs against (reworked requirements →
|
|
28
|
+
* clarified report → raw description) so the chat grounds on the same brief every agent sees.
|
|
29
|
+
* Injected from {@link AgentContextBuilder.resolveEffectiveDescription}.
|
|
30
|
+
*/
|
|
31
|
+
resolveEffectiveDescription?: (workspaceId: string, block: Block) => Promise<string>;
|
|
19
32
|
}
|
|
20
33
|
/**
|
|
21
34
|
* Drives the human-facing half of the implementation-fork decision phase on the Coder step:
|
|
@@ -54,6 +67,27 @@ export declare class ForkDecisionController {
|
|
|
54
67
|
* the non-idempotent settle (clear card / progress / signal / emit) runs once after it wins.
|
|
55
68
|
*/
|
|
56
69
|
choose(workspaceId: string, executionId: string, input: ChooseForkInput): Promise<ForkDecisionStepState>;
|
|
70
|
+
/**
|
|
71
|
+
* Send a human chat message about the surfaced forks. Records the message on the parked coder
|
|
72
|
+
* step, flags the step `answering` + sets the `pendingForkChat` re-entry marker, and wakes the
|
|
73
|
+
* durable driver — which computes the grounded reply INLINE off the HTTP request (see
|
|
74
|
+
* {@link answerChat}) and re-parks. Returns immediately with the `answering` state; the
|
|
75
|
+
* assistant reply arrives via the `execution` event. Mirrors {@link ReviewGateController.incorporate}'s
|
|
76
|
+
* async offload: the CAS records the intent + re-arms the run, then the settle (emit + signal)
|
|
77
|
+
* runs once after it wins.
|
|
78
|
+
*/
|
|
79
|
+
chat(workspaceId: string, executionId: string, input: ForkChatRequestInput): Promise<ForkDecisionStepState>;
|
|
80
|
+
/**
|
|
81
|
+
* Compute the grounded reply to the pending chat turn INSIDE the durable driver (the LLM work
|
|
82
|
+
* that used to sit in the HTTP request the user is no longer waiting on), append it to the
|
|
83
|
+
* thread, and re-park the step `awaiting_choice` (a fresh approval id). Called from the fork
|
|
84
|
+
* step handler on re-entry when `step.pendingForkChat` is set. Degrades gracefully: with no
|
|
85
|
+
* chat responder wired, or on a responder failure, a canned "chat unavailable" assistant turn
|
|
86
|
+
* is appended and the run re-parks — pick / custom stay available.
|
|
87
|
+
*/
|
|
88
|
+
answerChat(workspaceId: string, instance: ExecutionInstance, step: PipelineStep, block: Block): Promise<AdvanceResult>;
|
|
89
|
+
/** Run the inline responder for one turn, or the canned fallback when it is unwired / fails. */
|
|
90
|
+
private computeChatReply;
|
|
57
91
|
/** The active fork-decision state for a run's GET, or null when no coder step carries one. */
|
|
58
92
|
getActive(workspaceId: string, executionId: string): Promise<ForkDecisionStepState | null>;
|
|
59
93
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForkDecisionController.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/ForkDecisionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,KAAK,EACL,iBAAiB,EACjB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ForkDecisionController.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/ForkDecisionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,eAAe,EACf,eAAe,EACf,KAAK,EACL,iBAAiB,EACjB,mBAAmB,EAEnB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACX,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAQ3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAU/C,yFAAyF;AACzF,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,eAAe,CAAA;IAChC,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,UAAU,EAAE,UAAU,CAAA;IACtB,2EAA2E;IAC3E,YAAY,EAAE,eAAe,CAAA;IAC7B,0DAA0D;IAC1D,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACrF;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,0BAA0B,EAAI;IAEjE;;;;;;;;;;;;OAYG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAAC,aAAa,CAAC,CA4CxB;IAED;;;;;;OAMG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,qBAAqB,CAAC,CAmDhC;IAED;;;;;;;;OAQG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA2ChC;IAED;;;;;;;OAOG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,aAAa,CAAC,CAaxB;IAED,gGAAgG;YAClF,gBAAgB;IAqC9B,8FAA8F;IACxF,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAI/F;IAED;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAUtB,mFAAmF;YACrE,wBAAwB;CAoBvC"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { ConflictError, ValidationError } from '@cat-factory/kernel';
|
|
2
|
-
import { DEFAULT_FORK_MAX_CHAT_TURNS, FORK_DECISION_PRODUCER_KIND, mintForks, usableForks, } from './forkDecision.logic.js';
|
|
2
|
+
import { DEFAULT_FORK_MAX_CHAT_TURNS, forkChatBudgetSpent, FORK_DECISION_PRODUCER_KIND, mintForks, usableForks, } from './forkDecision.logic.js';
|
|
3
|
+
/** Max chars stored per chat message (mirrors the `forkChatMessageSchema` `maxLength`). */
|
|
4
|
+
const FORK_CHAT_MESSAGE_MAX = 4000;
|
|
5
|
+
/** The canned assistant turn used when the inline chat responder is unwired or fails. */
|
|
6
|
+
const CHAT_UNAVAILABLE_REPLY = 'Chat is not available for this task right now. Pick one of the proposed approaches, or enter ' +
|
|
7
|
+
'your own approach, to continue.';
|
|
3
8
|
/**
|
|
4
9
|
* Drives the human-facing half of the implementation-fork decision phase on the Coder step:
|
|
5
10
|
* records the proposer's structured output onto `step.forkDecision` and parks the run (or
|
|
@@ -124,6 +129,107 @@ export class ForkDecisionController {
|
|
|
124
129
|
await this.deps.workRunner.signalDecision(workspaceId, instance.id, approvalId, 'approved');
|
|
125
130
|
return state;
|
|
126
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Send a human chat message about the surfaced forks. Records the message on the parked coder
|
|
134
|
+
* step, flags the step `answering` + sets the `pendingForkChat` re-entry marker, and wakes the
|
|
135
|
+
* durable driver — which computes the grounded reply INLINE off the HTTP request (see
|
|
136
|
+
* {@link answerChat}) and re-parks. Returns immediately with the `answering` state; the
|
|
137
|
+
* assistant reply arrives via the `execution` event. Mirrors {@link ReviewGateController.incorporate}'s
|
|
138
|
+
* async offload: the CAS records the intent + re-arms the run, then the settle (emit + signal)
|
|
139
|
+
* runs once after it wins.
|
|
140
|
+
*/
|
|
141
|
+
async chat(workspaceId, executionId, input) {
|
|
142
|
+
const text = input.text.trim();
|
|
143
|
+
if (!text)
|
|
144
|
+
throw new ValidationError('A chat message is required');
|
|
145
|
+
const messageId = this.deps.idGenerator.next('fchat');
|
|
146
|
+
let approvalId = '';
|
|
147
|
+
let state;
|
|
148
|
+
const instance = await this.deps.stateMachine.mutateInstance(workspaceId, executionId, (inst) => {
|
|
149
|
+
const step = inst.steps.find((s) => s.agentKind === FORK_DECISION_PRODUCER_KIND &&
|
|
150
|
+
s.state === 'waiting_decision' &&
|
|
151
|
+
s.approval?.status === 'pending' &&
|
|
152
|
+
s.forkDecision?.status === 'awaiting_choice');
|
|
153
|
+
if (!step?.approval || !step.forkDecision) {
|
|
154
|
+
throw new ConflictError('The run is no longer awaiting an implementation-fork choice');
|
|
155
|
+
}
|
|
156
|
+
if (forkChatBudgetSpent(step.forkDecision)) {
|
|
157
|
+
throw new ConflictError('This fork chat has reached its turn limit — pick an approach or enter your own');
|
|
158
|
+
}
|
|
159
|
+
approvalId = step.approval.id;
|
|
160
|
+
const chat = [
|
|
161
|
+
...(step.forkDecision.chat ?? []),
|
|
162
|
+
{ id: messageId, role: 'human', text, createdAt: this.deps.clock.now() },
|
|
163
|
+
];
|
|
164
|
+
step.forkDecision = { ...step.forkDecision, status: 'answering', chat };
|
|
165
|
+
// Re-arm BEFORE signalling: the park left the run `blocked`, and `advanceInstance`
|
|
166
|
+
// no-ops unless it is `running`/`paused`, so a woken driver would otherwise return
|
|
167
|
+
// without re-entering the fork handler to compute the reply.
|
|
168
|
+
step.pendingForkChat = { messageId };
|
|
169
|
+
if (inst.status === 'blocked')
|
|
170
|
+
inst.status = 'running';
|
|
171
|
+
state = step.forkDecision;
|
|
172
|
+
});
|
|
173
|
+
await this.deps.stateMachine.emitInstance(workspaceId, instance);
|
|
174
|
+
await this.deps.workRunner.signalDecision(workspaceId, instance.id, approvalId, 'fork-chat');
|
|
175
|
+
return state;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compute the grounded reply to the pending chat turn INSIDE the durable driver (the LLM work
|
|
179
|
+
* that used to sit in the HTTP request the user is no longer waiting on), append it to the
|
|
180
|
+
* thread, and re-park the step `awaiting_choice` (a fresh approval id). Called from the fork
|
|
181
|
+
* step handler on re-entry when `step.pendingForkChat` is set. Degrades gracefully: with no
|
|
182
|
+
* chat responder wired, or on a responder failure, a canned "chat unavailable" assistant turn
|
|
183
|
+
* is appended and the run re-parks — pick / custom stay available.
|
|
184
|
+
*/
|
|
185
|
+
async answerChat(workspaceId, instance, step, block) {
|
|
186
|
+
// Clear the re-entry marker up front so a replay/retry can't answer the same turn twice.
|
|
187
|
+
step.pendingForkChat = null;
|
|
188
|
+
const fd = step.forkDecision;
|
|
189
|
+
if (!fd)
|
|
190
|
+
return this.deps.stateMachine.parkStepOnDecision(workspaceId, instance, step);
|
|
191
|
+
const reply = await this.computeChatReply(workspaceId, block, fd);
|
|
192
|
+
step.forkDecision = {
|
|
193
|
+
...fd,
|
|
194
|
+
status: 'awaiting_choice',
|
|
195
|
+
chat: [...(fd.chat ?? []), reply],
|
|
196
|
+
};
|
|
197
|
+
return this.deps.stateMachine.parkStepOnDecision(workspaceId, instance, step);
|
|
198
|
+
}
|
|
199
|
+
/** Run the inline responder for one turn, or the canned fallback when it is unwired / fails. */
|
|
200
|
+
async computeChatReply(workspaceId, block, fd) {
|
|
201
|
+
const canned = () => ({
|
|
202
|
+
id: this.deps.idGenerator.next('fchat'),
|
|
203
|
+
role: 'assistant',
|
|
204
|
+
text: CHAT_UNAVAILABLE_REPLY,
|
|
205
|
+
createdAt: this.deps.clock.now(),
|
|
206
|
+
});
|
|
207
|
+
const svc = this.deps.forkChatService;
|
|
208
|
+
if (!svc?.enabled)
|
|
209
|
+
return canned();
|
|
210
|
+
try {
|
|
211
|
+
const description = (await this.deps.resolveEffectiveDescription?.(workspaceId, block)) ??
|
|
212
|
+
block.description ??
|
|
213
|
+
'';
|
|
214
|
+
const { text } = await svc.respond(workspaceId, block, {
|
|
215
|
+
description,
|
|
216
|
+
seamSummary: fd.seamSummary ?? null,
|
|
217
|
+
forks: fd.forks ?? [],
|
|
218
|
+
chat: fd.chat ?? [],
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
id: this.deps.idGenerator.next('fchat'),
|
|
222
|
+
role: 'assistant',
|
|
223
|
+
text: text.slice(0, FORK_CHAT_MESSAGE_MAX),
|
|
224
|
+
createdAt: this.deps.clock.now(),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// A model/resolution failure must never wedge the parked run: fall back to the canned turn
|
|
229
|
+
// so the human can still pick a fork or enter a custom approach.
|
|
230
|
+
return canned();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
127
233
|
/** The active fork-decision state for a run's GET, or null when no coder step carries one. */
|
|
128
234
|
async getActive(workspaceId, executionId) {
|
|
129
235
|
const instance = await this.deps.executionRepository.get(workspaceId, executionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ForkDecisionController.js","sourceRoot":"","sources":["../../../src/modules/execution/ForkDecisionController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ForkDecisionController.js","sourceRoot":"","sources":["../../../src/modules/execution/ForkDecisionController.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAIpE,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,2BAA2B,EAC3B,SAAS,EACT,WAAW,GACZ,MAAM,yBAAyB,CAAA;AAIhC,2FAA2F;AAC3F,MAAM,qBAAqB,GAAG,IAAI,CAAA;AAElC,yFAAyF;AACzF,MAAM,sBAAsB,GAC1B,+FAA+F;IAC/F,iCAAiC,CAAA;AA6BnC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,sBAAsB;IACJ,IAAI;IAAjC,YAA6B,IAAgC;oBAAhC,IAAI;IAA+B,CAAC;IAEjE;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,cAAc,CAClB,WAAmB,EACnB,QAA2B,EAC3B,IAAkB,EAClB,QAAkC,EAClC,KAAgC;QAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,IAAI,2BAA2B,CAAA;QACnF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,gFAAgF;YAChF,wFAAwF;YACxF,wFAAwF;YACxF,oFAAoF;YACpF,qFAAqF;YACrF,iFAAiF;YACjF,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACtF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAA;YAC7D,IAAI,CAAC,YAAY,GAAG;gBAClB,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI;gBAC1C,KAAK,EAAE,MAAM;gBACb,gBAAgB,EACd,QAAQ,EAAE,gBAAgB;oBAC1B,CAAC,QAAQ,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzE,IAAI,EAAE,EAAE;gBACR,YAAY;gBACZ,KAAK,EAAE,KAAK,IAAI,IAAI;gBACpB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChF,CAAA;YACD,mFAAmF;YACnF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACnC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAChE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;QAC7B,CAAC;QAED,IAAI,CAAC,YAAY,GAAG;YAClB,MAAM,EAAE,iBAAiB;YACzB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI;YACzC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClE,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,EAAE;YACR,YAAY;YACZ,KAAK,EAAE,KAAK,IAAI,IAAI;SACrB,CAAA;QACD,MAAM,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1F,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,WAAmB,EACnB,WAAmB,EACnB,KAAsB;QAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAA;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS,CAAA;QAC5C,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,eAAe,CAAC,oDAAoD,CAAC,CAAA;QACjF,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,KAAwC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAC1D,WAAW,EACX,WAAW,EACX,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,SAAS,KAAK,2BAA2B;gBAC3C,CAAC,CAAC,KAAK,KAAK,kBAAkB;gBAC9B,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS;gBAChC,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,iBAAiB,CAC/C,CAAA;YACD,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1C,MAAM,IAAI,aAAa,CAAC,6DAA6D,CAAC,CAAA;YACxF,CAAC;YACD,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC7E,MAAM,IAAI,eAAe,CAAC,iBAAiB,MAAM,GAAG,CAAC,CAAA;YACvD,CAAC;YACD,6EAA6E;YAC7E,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;YAC7B,IAAI,CAAC,YAAY,GAAG;gBAClB,GAAG,IAAI,CAAC,YAAY;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE;oBACN,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;oBAC7C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;iBAC1B;aACF,CAAA;YACD,wFAAwF;YACxF,6EAA6E;YAC7E,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;YACtD,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QAC3B,CAAC,CACF,CAAA;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAC5E,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;QACtF,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAChE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAC3F,OAAO,KAAM,CAAA;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CACR,WAAmB,EACnB,WAAmB,EACnB,KAA2B;QAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAA;QAElE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrD,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,KAAwC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAC1D,WAAW,EACX,WAAW,EACX,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,SAAS,KAAK,2BAA2B;gBAC3C,CAAC,CAAC,KAAK,KAAK,kBAAkB;gBAC9B,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS;gBAChC,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,iBAAiB,CAC/C,CAAA;YACD,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1C,MAAM,IAAI,aAAa,CAAC,6DAA6D,CAAC,CAAA;YACxF,CAAC;YACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,aAAa,CACrB,gFAAgF,CACjF,CAAA;YACH,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;YAC7B,MAAM,IAAI,GAAsB;gBAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;gBACjC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE;aACzE,CAAA;YACD,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;YACvE,mFAAmF;YACnF,mFAAmF;YACnF,6DAA6D;YAC7D,IAAI,CAAC,eAAe,GAAG,EAAE,SAAS,EAAE,CAAA;YACpC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;YACtD,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QAC3B,CAAC,CACF,CAAA;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAChE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;QAC5F,OAAO,KAAM,CAAA;IACf,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,QAA2B,EAC3B,IAAkB,EAClB,KAAY;QAEZ,yFAAyF;QACzF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;QAEtF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG,EAAE;YACL,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;SAClC,CAAA;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/E,CAAC;IAED,gGAAgG;IACxF,KAAK,CAAC,gBAAgB,CAC5B,WAAmB,EACnB,KAAY,EACZ,EAAyB;QAEzB,MAAM,MAAM,GAAG,GAAoB,EAAE,CAAC,CAAC;YACrC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;YACvC,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SACjC,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAA;QACrC,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE,OAAO,MAAM,EAAE,CAAA;QAClC,IAAI,CAAC;YACH,MAAM,WAAW,GACf,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBACnE,KAAK,CAAC,WAAW;gBACjB,EAAE,CAAA;YACJ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE;gBACrD,WAAW;gBACX,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;gBACnC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;gBACrB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;aACpB,CAAC,CAAA;YACF,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;gBACvC,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC;gBAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;aACjC,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2FAA2F;YAC3F,iEAAiE;YACjE,OAAO,MAAM,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,WAAmB;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QAClF,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,YAAY,IAAI,IAAI,CAAA;IAC5D,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,QAA2B;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,OAAO,EAAE,SAAS,KAAK,2BAA2B,IAAI,OAAO,CAAC,YAAY;YAAE,OAAO,OAAO,CAAA;QAC9F,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;YAC5B,IAAI,CAAC,CAAC,SAAS,KAAK,2BAA2B,IAAI,CAAC,CAAC,YAAY;gBAAE,OAAO,CAAC,CAAA;QAC7E,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,mFAAmF;IAC3E,KAAK,CAAC,wBAAwB,CACpC,WAAmB,EACnB,QAA2B,EAC3B,SAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAM;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAChF,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE;YACrD,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,SAAS,SAAS,2CAA2C;YACnF,IAAI,EACF,mFAAmF;gBACnF,sFAAsF;gBACtF,kBAAkB;YACpB,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE;SAC5D,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
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';
|
|
1
|
+
import type { AgentExecutor, AgentRunContext, AgentRunResult, Block, BlockRepository, BrainstormSession, ClarityReview, Clock, ExecutionEventPublisher, ExecutionInstance, ExecutionRepository, FollowUpsStepState, ForkDecisionStepState, ChooseForkInput, ForkChatRequestInput, 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';
|
|
@@ -682,6 +682,8 @@ export declare class RunDispatcher {
|
|
|
682
682
|
getForkDecision(workspaceId: string, executionId: string): Promise<ForkDecisionStepState | null>;
|
|
683
683
|
/** Resolve the human's implementation-fork choice, re-running the Coder with it folded in. */
|
|
684
684
|
chooseFork(workspaceId: string, executionId: string, input: ChooseForkInput): Promise<ForkDecisionStepState>;
|
|
685
|
+
/** Send a grounded chat message about the surfaced forks (the reply arrives via the stream). */
|
|
686
|
+
forkChat(workspaceId: string, executionId: string, input: ForkChatRequestInput): Promise<ForkDecisionStepState>;
|
|
685
687
|
/**
|
|
686
688
|
* Locate the run + the Coder step that OWNS the addressed item + the item, throwing 404
|
|
687
689
|
* 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,qBAAqB,EACrB,eAAe,
|
|
1
|
+
{"version":3,"file":"RunDispatcher.d.ts","sourceRoot":"","sources":["../../../src/modules/execution/RunDispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { renderReproDigest } from './reproTest.logic.js';
|
|
|
11
11
|
import { frameOf, validInvolvedServiceFrames } from './frame.logic.js';
|
|
12
12
|
import { ANALYSIS_AGENT_KIND, ARCHITECTURE_BRAINSTORM_AGENT_KIND, BLUEPRINTS_AGENT_KIND, BUG_INVESTIGATOR_AGENT_KIND, CLARITY_REVIEW_AGENT_KIND, CONFLICTS_AGENT_KIND, HUMAN_TEST_AGENT_KIND, isTesterKind, MERGER_AGENT_KIND, REPRO_TEST_AGENT_KIND, REQUIREMENTS_BRAINSTORM_AGENT_KIND, REQUIREMENTS_REVIEW_AGENT_KIND, SPEC_WRITER_AGENT_KIND, TESTER_AGENT_KIND, TRACKER_AGENT_KIND, UI_TESTER_AGENT_KIND, VISUAL_CONFIRM_AGENT_KIND, } from './ci.logic.js';
|
|
13
13
|
import { followUpsToSendBack, hasPendingFollowUps, renderFollowUpRework, shouldLoopCoder, } from './followUp.logic.js';
|
|
14
|
-
import { agentFailureKindFromCause, classifyAgentFailure, isContainerEvictionError, isTransientEviction, MAX_EVICTION_RECOVERIES, MAX_TRANSIENT_EVICTION_RECOVERIES, } from './job.logic.js';
|
|
14
|
+
import { agentFailureKindFromCause, classifyAgentFailure, classifyDispatchFailure, isContainerEvictionError, isTransientEviction, MAX_EVICTION_RECOVERIES, MAX_TRANSIENT_EVICTION_RECOVERIES, } from './job.logic.js';
|
|
15
15
|
import { AgentContextBuilder } from './AgentContextBuilder.js';
|
|
16
16
|
import { CompanionController } from './CompanionController.js';
|
|
17
17
|
import { HumanTestController } from './HumanTestController.js';
|
|
@@ -257,22 +257,17 @@ export class RunDispatcher {
|
|
|
257
257
|
handle = await executor.startJob(context);
|
|
258
258
|
}
|
|
259
259
|
catch (error) {
|
|
260
|
-
//
|
|
261
|
-
//
|
|
262
|
-
//
|
|
263
|
-
//
|
|
264
|
-
//
|
|
260
|
+
// Classify the throw (see {@link classifyDispatchFailure}). A genuine container
|
|
261
|
+
// accept failure (HTTP/network/capacity) is framed as `dispatch` ("container failed
|
|
262
|
+
// to start") with the EXACT provider response as detail; a dispatch-time eviction
|
|
263
|
+
// routes to `evicted`. But a job is BUILT before any container is contacted, so a
|
|
264
|
+
// precondition (e.g. `github_not_connected` — no connected repo) is a `preflight`
|
|
265
|
+
// rejection that surfaces its own actionable message + machine-readable reason
|
|
266
|
+
// instead of the misleading container framing.
|
|
265
267
|
step.container = { status: 'errored' };
|
|
266
268
|
await this.runStateMachine.casPersist(workspaceId, instance);
|
|
267
269
|
await this.runStateMachine.emitInstance(workspaceId, instance);
|
|
268
|
-
|
|
269
|
-
const evicted = isContainerEvictionError(message);
|
|
270
|
-
return {
|
|
271
|
-
kind: 'job_failed',
|
|
272
|
-
error: evicted ? message : 'The container failed to start.',
|
|
273
|
-
failureKind: evicted ? 'evicted' : 'dispatch',
|
|
274
|
-
detail: message,
|
|
275
|
-
};
|
|
270
|
+
return { kind: 'job_failed', ...classifyDispatchFailure(error) };
|
|
276
271
|
}
|
|
277
272
|
step.jobId = handle.jobId;
|
|
278
273
|
// Record the model at dispatch — the poll site can't resolve it later.
|
|
@@ -2837,6 +2832,13 @@ export class RunDispatcher {
|
|
|
2837
2832
|
*/
|
|
2838
2833
|
async handleForkDecisionPhase(ctx) {
|
|
2839
2834
|
const { workspaceId, instance, step, block } = ctx;
|
|
2835
|
+
// Re-entry: the human sent a chat turn about the surfaced forks (`pendingForkChat` set by
|
|
2836
|
+
// {@link ForkDecisionController.chat}). Compute the grounded reply INLINE in the durable driver
|
|
2837
|
+
// (off the HTTP request), append it, and re-park — never re-dispatch the proposer. This is the
|
|
2838
|
+
// resume path the `reentrantForkDecision` guard in `stepInstance` falls through for.
|
|
2839
|
+
if (step.pendingForkChat) {
|
|
2840
|
+
return this.forkDecisionController.answerChat(workspaceId, instance, step, block);
|
|
2841
|
+
}
|
|
2840
2842
|
if (!step.forkDecision) {
|
|
2841
2843
|
const tri = resolveForkTriState(block.agentConfig);
|
|
2842
2844
|
let propose = tri === 'always';
|
|
@@ -2873,6 +2875,10 @@ export class RunDispatcher {
|
|
|
2873
2875
|
chooseFork(workspaceId, executionId, input) {
|
|
2874
2876
|
return this.forkDecisionController.choose(workspaceId, executionId, input);
|
|
2875
2877
|
}
|
|
2878
|
+
/** Send a grounded chat message about the surfaced forks (the reply arrives via the stream). */
|
|
2879
|
+
forkChat(workspaceId, executionId, input) {
|
|
2880
|
+
return this.forkDecisionController.chat(workspaceId, executionId, input);
|
|
2881
|
+
}
|
|
2876
2882
|
/**
|
|
2877
2883
|
* Locate the run + the Coder step that OWNS the addressed item + the item, throwing 404
|
|
2878
2884
|
* when absent. Routes by item id (not "the first enabled step") so a pipeline carrying more
|