Skip to content

Commit 07cab28

Browse files
committed
fix: stabilize diagnostics and supervisor ci
1 parent a2b331c commit 07cab28

3 files changed

Lines changed: 41 additions & 30 deletions

File tree

packages/server/src/__tests__/diagnostics-commands.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ function createContext(overrides: Partial<CommandContext> = {}): CommandContext
4444
get: () => undefined,
4545
getAll: () => ({}),
4646
},
47+
providerRuntimeDeps: {
48+
commandExists: async () => true,
49+
},
4750
...overrides,
4851
};
4952
}

packages/server/src/supervisor/evaluator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export interface SupervisorDecomposeResult {
3939

4040
export interface SupervisorContinueResult {
4141
mode: "evaluate";
42-
status: "continue" | "stop";
42+
status: "continue";
4343
reason: string;
4444
guidance?: string;
4545
activeItemId?: string;

packages/server/src/supervisor/manager.ts

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const NOOP_LOGGER: FastifyBaseLogger = {
4848
};
4949

5050
type SessionLifecycleEvent = Extract<DomainEvent, { type: "session.lifecycle" }>;
51+
type SupervisorEvaluateResult = Extract<SupervisorEvaluationResult, { mode: "evaluate" }>;
5152

5253
/**
5354
* Internal handoff between the synchronous `beginCycle` and the async
@@ -85,7 +86,7 @@ interface SupervisorCycleRuntimeSnapshot {
8586
}
8687

8788
interface CompletedCycleEvaluation {
88-
evaluation: SupervisorEvaluationResult;
89+
evaluation: SupervisorEvaluateResult;
8990
injected: boolean;
9091
injectedText?: string;
9192
targetMemory: SupervisorTargetMemory;
@@ -188,9 +189,9 @@ function isDecomposeResult(
188189
}
189190

190191
function isEvaluateStopResult(
191-
result: SupervisorEvaluationResult | { status?: string }
192-
): result is Extract<SupervisorEvaluationResult, { mode: "evaluate"; status: "stop" }> {
193-
return result.status === "stop";
192+
result: SupervisorEvaluateResult | { status?: string }
193+
): result is Extract<SupervisorEvaluateResult, { status: "stop" }> {
194+
return "status" in result && result.status === "stop";
194195
}
195196

196197
export class SupervisorManager {
@@ -1227,13 +1228,14 @@ export class SupervisorManager {
12271228
const currentSupervisor =
12281229
this.supervisors.get(activeCycle.supervisorId) ??
12291230
this.requireSupervisor(activeCycle.supervisorId);
1231+
const evaluation = result.evaluation;
12301232
const finalStatus: CycleStatus = result.injected ? "injected" : "completed";
1231-
const cycleReason = isEvaluateStopResult(result.evaluation)
1232-
? result.evaluation.reason
1233+
const cycleReason = isEvaluateStopResult(evaluation)
1234+
? evaluation.reason
12331235
: result.injected
12341236
? result.injectedText
1235-
: result.evaluation.guidance
1236-
? `Skipped duplicate: ${result.evaluation.guidance}`
1237+
: evaluation.guidance
1238+
? `Skipped duplicate: ${evaluation.guidance}`
12371239
: undefined;
12381240

12391241
const finishedCycle = this.deps.cycleRepo.update(activeCycle.id, {
@@ -1250,19 +1252,18 @@ export class SupervisorManager {
12501252
};
12511253
await this.deps.targetStore.saveTargetMemory(workspace.path, targetId, nextTargetMemory);
12521254

1253-
const cycleRecord: SupervisorCycleTargetRecord = isEvaluateStopResult(result.evaluation)
1255+
const cycleRecord: SupervisorCycleTargetRecord = isEvaluateStopResult(evaluation)
12541256
? {
12551257
cycleId: activeCycle.id,
12561258
targetId,
12571259
startedAt: activeCycle.createdAt,
12581260
completedAt: finishedCycle.completedAt ?? Date.now(),
12591261
result: "stop",
1260-
stopReason: result.evaluation.stopReason,
1261-
reason: result.evaluation.reason,
1262-
progressSummary: result.evaluation.progressSummary ?? nextTargetMemory.progressSummary,
1262+
stopReason: evaluation.stopReason,
1263+
reason: evaluation.reason,
1264+
progressSummary: nextTargetMemory.progressSummary,
12631265
decompositionMode: nextTargetMemory.decompositionMode,
1264-
activeItemId: result.evaluation.activeItemId ?? nextTargetMemory.activeItemId,
1265-
itemUpdates: result.evaluation.itemUpdates,
1266+
activeItemId: nextTargetMemory.activeItemId,
12661267
injected: false,
12671268
attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,
12681269
}
@@ -1272,20 +1273,20 @@ export class SupervisorManager {
12721273
startedAt: activeCycle.createdAt,
12731274
completedAt: finishedCycle.completedAt ?? Date.now(),
12741275
result: "continue",
1275-
reason: result.evaluation.reason,
1276-
guidance: result.injected ? result.injectedText : result.evaluation.guidance,
1276+
reason: evaluation.reason,
1277+
guidance: result.injected ? result.injectedText : evaluation.guidance,
12771278
progressSummary: nextTargetMemory.progressSummary,
12781279
decompositionMode: nextTargetMemory.decompositionMode,
12791280
activeItemId: nextTargetMemory.activeItemId,
1280-
itemUpdates: result.evaluation.itemUpdates,
1281+
itemUpdates: evaluation.itemUpdates,
12811282
injected: result.injected,
12821283
attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,
12831284
};
12841285
await this.deps.targetStore.appendTargetCycleRecord(workspace.path, targetId, cycleRecord);
12851286

1286-
if (isEvaluateStopResult(result.evaluation)) {
1287+
if (isEvaluateStopResult(evaluation)) {
12871288
await this.updateTargetMetaStatus(workspace.path, targetId, {
1288-
status: result.evaluation.stopReason === "objective_complete" ? "completed" : "cancelled",
1289+
status: evaluation.stopReason === "objective_complete" ? "completed" : "cancelled",
12891290
completedAt: finishedCycle.completedAt ?? Date.now(),
12901291
});
12911292
}
@@ -1307,7 +1308,7 @@ export class SupervisorManager {
13071308
state: isEvaluateStopResult(result.evaluation) ? "stopped" : "idle",
13081309
completedSupervisionCount:
13091310
(this.supervisors.get(activeCycle.supervisorId)?.completedSupervisionCount ?? 0) + 1,
1310-
stopReason: isEvaluateStopResult(result.evaluation) ? result.evaluation.stopReason : null,
1311+
stopReason: isEvaluateStopResult(evaluation) ? evaluation.stopReason : null,
13111312
lastCycleAt: finishedCycle.completedAt,
13121313
lastEvaluatedTurnId: context.lastTurnId ?? undefined,
13131314
errorReason: null,
@@ -1513,6 +1514,20 @@ export class SupervisorManager {
15131514
};
15141515
}
15151516

1517+
if (isEvaluateStopResult(evaluation)) {
1518+
return {
1519+
...memory,
1520+
decompositionGenerated: memory.decompositionGenerated,
1521+
decompositionMode: memory.decompositionMode,
1522+
items: memory.items,
1523+
activeItemId: memory.activeItemId,
1524+
progressSummary: memory.progressSummary,
1525+
lastGuidance: memory.lastGuidance,
1526+
stalledCount: 0,
1527+
updatedAt,
1528+
};
1529+
}
1530+
15161531
let items = memory.items;
15171532
if (evaluation.itemUpdates?.length) {
15181533
const updates = new Map(evaluation.itemUpdates.map((item) => [item.id, item.status]));
@@ -1522,16 +1537,9 @@ export class SupervisorManager {
15221537
}
15231538

15241539
const progressSummary = evaluation.progressSummary ?? memory.progressSummary;
1525-
const lastGuidance =
1526-
evaluation.status === "continue"
1527-
? (injectedText ?? evaluation.guidance ?? memory.lastGuidance)
1528-
: memory.lastGuidance;
1540+
const lastGuidance = injectedText ?? evaluation.guidance ?? memory.lastGuidance;
15291541
const stalledCount =
1530-
evaluation.status === "continue" &&
1531-
!evaluation.progressSummary &&
1532-
!evaluation.itemUpdates?.length
1533-
? memory.stalledCount + 1
1534-
: 0;
1542+
!evaluation.progressSummary && !evaluation.itemUpdates?.length ? memory.stalledCount + 1 : 0;
15351543

15361544
return {
15371545
...memory,

0 commit comments

Comments
 (0)