diff --git a/src/core/piece/agent-usecases.ts b/src/core/piece/agent-usecases.ts index 4a373db..8f42623 100644 --- a/src/core/piece/agent-usecases.ts +++ b/src/core/piece/agent-usecases.ts @@ -1,5 +1,5 @@ import type { AgentResponse, PartDefinition, PieceRule, RuleMatchMethod, Language } from '../models/types.js'; -import { runAgent, type RunAgentOptions } from '../../agents/runner.js'; +import { runAgent, type RunAgentOptions, type StreamCallback } from '../../agents/runner.js'; import { detectJudgeIndex, buildJudgePrompt } from '../../agents/judge-utils.js'; import { parseParts } from './engine/task-decomposer.js'; import { loadJudgmentSchema, loadEvaluationSchema, loadDecompositionSchema, loadMorePartsSchema } from './schema-loader.js'; @@ -11,6 +11,7 @@ export interface JudgeStatusOptions { movementName: string; language?: Language; interactive?: boolean; + onStream?: StreamCallback; } export interface JudgeStatusResult { @@ -29,6 +30,7 @@ export interface DecomposeTaskOptions { language?: Language; model?: string; provider?: 'claude' | 'codex' | 'opencode' | 'cursor' | 'copilot' | 'mock'; + onStream?: StreamCallback; } export interface MorePartsResponse { @@ -231,6 +233,7 @@ export async function judgeStatus( maxTurns: 3, permissionMode: 'readonly' as const, language: options.language, + onStream: options.onStream, }; // Stage 1: Structured output @@ -293,6 +296,7 @@ export async function decomposeTask( permissionMode: 'readonly', maxTurns: 4, outputSchema: loadDecompositionSchema(maxParts), + onStream: options.onStream, }); if (response.status !== 'done') { @@ -333,6 +337,7 @@ export async function requestMoreParts( permissionMode: 'readonly', maxTurns: 4, outputSchema: loadMorePartsSchema(maxAdditionalParts), + onStream: options.onStream, }); if (response.status !== 'done') { diff --git a/src/core/piece/engine/OptionsBuilder.ts b/src/core/piece/engine/OptionsBuilder.ts index 78231bf..5096e4b 100644 --- a/src/core/piece/engine/OptionsBuilder.ts +++ b/src/core/piece/engine/OptionsBuilder.ts @@ -173,6 +173,7 @@ export class OptionsBuilder { language: this.getLanguage(), interactive: this.engineOptions.interactive, lastResponse, + onStream: this.engineOptions.onStream, getSessionId: (persona: string) => state.personaSessions.get(persona), buildResumeOptions: this.buildResumeOptions.bind(this), buildNewSessionReportOptions: this.buildNewSessionReportOptions.bind(this), diff --git a/src/core/piece/engine/TeamLeaderRunner.ts b/src/core/piece/engine/TeamLeaderRunner.ts index af51807..b6b4432 100644 --- a/src/core/piece/engine/TeamLeaderRunner.ts +++ b/src/core/piece/engine/TeamLeaderRunner.ts @@ -79,6 +79,7 @@ export class TeamLeaderRunner { personaPath: leaderStep.personaPath, model: leaderModel, provider: leaderProvider, + onStream: this.deps.engineOptions.onStream, }); const leaderResponse: AgentResponse = { persona: leaderStep.persona ?? leaderStep.name, @@ -172,6 +173,7 @@ export class TeamLeaderRunner { language: this.deps.engineOptions.language, model: leaderModel, provider: leaderProvider, + onStream: this.deps.engineOptions.onStream, }, ); }, diff --git a/src/core/piece/phase-runner.ts b/src/core/piece/phase-runner.ts index 0feaada..4a210cd 100644 --- a/src/core/piece/phase-runner.ts +++ b/src/core/piece/phase-runner.ts @@ -41,6 +41,8 @@ export interface PhaseRunnerContext { buildNewSessionReportOptions: (step: PieceMovement, overrides: Pick) => RunAgentOptions; /** Update persona session after a phase run */ updatePersonaSession: (persona: string, sessionId: string | undefined) => void; + /** Stream callback for provider event logging (passed to judgeStatus) */ + onStream?: import('../../agents/types.js').StreamCallback; /** Callback for phase lifecycle logging */ onPhaseStart?: (step: PieceMovement, phase: 1 | 2 | 3, phaseName: PhaseName, instruction: string) => void; /** Callback for phase completion logging */ diff --git a/src/core/piece/status-judgment-phase.ts b/src/core/piece/status-judgment-phase.ts index 2821166..7b1ed8b 100644 --- a/src/core/piece/status-judgment-phase.ts +++ b/src/core/piece/status-judgment-phase.ts @@ -93,6 +93,7 @@ export async function runStatusJudgmentPhase( movementName: step.name, language: ctx.language, interactive: ctx.interactive, + onStream: ctx.onStream, }); const tag = `[${step.name.toUpperCase()}:${result.ruleIndex + 1}]`; ctx.onPhaseComplete?.(step, 3, 'judge', tag, 'done');