/** * Phase execution logic extracted from engine.ts. * * Exposes shared phase context plus Phase 2/3 entry points. */ import type { WorkflowStep, Language, WorkflowResumePointEntry } from '../models/types.js'; import type { ProviderUsageSnapshot } from '../models/response.js'; import type { StructuredCaller } from '../../agents/structured-caller.js'; import type { PhaseName, PhasePromptParts, JudgeStageEntry, StepProviderInfo } from './types.js'; import type { RunAgentOptions } from '../../agents/runner.js'; import type { TaskReviewScope } from './review-scope.js'; import type { InjectedReport } from './instruction/prepared-instruction.js'; export { generateReportPhase, runReportPhase, ReportPhaseGenerationError, type GeneratedReport, type GeneratedReportPhaseResult, type ReportContentValidationResult, type ReportContentValidator, type ReportPhaseGenerationOptions, type ReportPhaseRecoveryMetadata, type ReportPhaseBlockedResult, type ReportPhaseRateLimitedResult, type ReportRetryFailureReason, } from './report-phase-runner.js'; export { runStatusJudgmentPhase, type StatusJudgmentPhaseResult } from './status-judgment-phase.js'; export interface BasePhaseRunnerContext { /** Working directory (agent work dir, may be a clone) */ cwd: string; /** Original workflow task. Phase 2 needs this even after a new-session retry. */ task?: string; /** Engine-computed changed file set, so Phase 2 output contracts resolve {review_scope}. */ reviewScope?: TaskReviewScope; /** Report directory path */ reportDir: string; /** Language for instructions */ language?: Language; /** Whether interactive-only rules are enabled */ interactive?: boolean; /** Last response from Phase 1 */ lastResponse?: string; /** Phase 2-only non-finding diagnostic produced by the completion-retry controller. */ completionRetryDiagnostic?: string; /** Workflow name for observability spans */ workflowName: string; /** Run-local identifier for observability artifact routing */ observabilityRunId?: string; /** Whether OpenTelemetry shadow spans are enabled */ observabilityEnabled?: boolean; /** Optional text sanitizer for observability span attributes */ sanitizeObservabilityText?: (text: string) => string; /** Sanitizes report content before it crosses the report-file persistence boundary. */ reportContentSanitizer?: (content: string) => string; /** Current workflow stack for observability span parity (phase/judge records) */ getCurrentWorkflowStack?: () => WorkflowResumePointEntry[] | undefined; /** Run-local environment values passed to trusted child processes. */ childProcessEnv?: RunAgentOptions['childProcessEnv']; /** MCP server set resolved for the current step and phase execution. */ mcpServers?: RunAgentOptions['mcpServers']; /** Runtime MCP assignment section used to enforce runtime mode at the runner boundary. */ mcpAssignment?: RunAgentOptions['mcpAssignment']; /** Identity of the resolved MCP server set for session/pool isolation. */ mcpServerIdentity?: RunAgentOptions['mcpServerIdentity']; /** Interrupts active provider calls when the workflow is cancelled. */ abortSignal?: AbortSignal; /** Run-local private directory for oversized provider failure details. */ failureDir?: string; /** Stream callback for provider event logging */ onStream?: import('../../agents/types.js').StreamCallback; /** Records provider activity that does not produce a public stream event. */ onActivity?: RunAgentOptions['onActivity']; /** Parent workflow iteration for sub-step phase events */ iteration?: number; /** Callback for phase lifecycle logging */ onPhaseStart?: (step: WorkflowStep, phase: 1 | 2 | 3, phaseName: PhaseName, instruction: string, promptParts: PhasePromptParts, phaseExecutionId?: string, iteration?: number) => void; /** Callback for phase completion logging */ onPhaseComplete?: (step: WorkflowStep, phase: 1 | 2 | 3, phaseName: PhaseName, content: string, status: string, error?: string, phaseExecutionId?: string, iteration?: number) => void; onProviderAttempt?: (providerInfo: StepProviderInfo, success: boolean, usage: ProviderUsageSnapshot | undefined) => void; } export interface ReportPhaseRunnerContext extends BasePhaseRunnerContext { injectedReports?: readonly InjectedReport[]; /** Get persona session ID */ getSessionId: (persona: string) => string | undefined; /** Resolve the session key shared by Phase 1 and resume phases */ resolveSessionKey: (step: WorkflowStep) => string; /** Build resume options for a step */ buildResumeOptions: (step: WorkflowStep, sessionId: string, overrides: Pick) => RunAgentOptions; /** Build options for report phase retry in a new session */ buildNewSessionReportOptions: (step: WorkflowStep, overrides: Pick) => RunAgentOptions; buildFallbackReportOptions: (step: WorkflowStep, failedPrimaryOptions: RunAgentOptions, overrides: Pick) => RunAgentOptions | undefined; resolveReportFallbackProviderModel: () => StepProviderInfo | undefined; /** Update persona session after a phase run */ updatePersonaSession: (persona: string, sessionId: string | undefined) => void; resolveStepProviderModel: (step: WorkflowStep) => StepProviderInfo; } export interface StatusJudgmentPhaseContext extends BasePhaseRunnerContext { /** Structured caller for phase 3 status judgment */ structuredCaller: StructuredCaller; /** Run reports root used by the shared report resolver. */ reportsRootDir?: string; /** Exact resume snapshot consumer mapping used by the shared report resolver. */ resumeReportConsumerKey?: string; resolveStepProviderModel: (step: WorkflowStep) => StepProviderInfo; /** Callback for Phase 3 internal stage logging */ onJudgeStage?: (step: WorkflowStep, phase: 3, phaseName: 'judge', entry: JudgeStageEntry, phaseExecutionId?: string, iteration?: number) => void; } /** * Check if a step needs Phase 3 (status judgment). * Returns true when the step has multiple semantic label candidates. */ export declare function needsStatusJudgmentPhase(step: WorkflowStep, interactive: boolean): boolean; //# sourceMappingURL=phase-runner.d.ts.map