import { type ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { FairAgentScheduler, WorkflowAgentExecutor, type AgentProviderFailure, type AgentProviderRecovery } from "./agent-execution.js"; import { RunStore, type PersistedRun } from "./persistence.js"; import { WorkflowBudgetRuntime } from "./budget.js"; import { WorkflowError, type BudgetApprovalRequest, type JsonValue, type LaunchSnapshot, type ModelSpec, type RunState, type WorkflowMetadata, type WorkflowWorktreeReference } from "./types.js"; import { RunLifecycle, WorkflowEventPublisher, type WorkflowRunRecord, type WorkflowToolUpdate } from "./host-runtime.js"; import { type CompletionDeliveryContext, type CompletionDeliveryResult } from "./host-delivery.js"; export type WorkflowRecoveryContext = { model: { provider: string; id: string; } | undefined; modelRegistry: { getAll?: () => readonly import("@earendil-works/pi-ai").Model[]; getAvailable?: () => readonly import("@earendil-works/pi-ai").Model[]; find?: (provider: string, model: string) => import("@earendil-works/pi-ai").Model | undefined; refresh?: () => Promise; getError?: () => string | undefined; } | undefined; deliveryContext: CompletionDeliveryContext; signal?: AbortSignal; resolvedAliases?: Readonly>; blockedAliases?: ReadonlySet; blockedAliasTargets?: Readonly>; }; export type WorkflowRecoveryDependencies = { pi: Pick; home: string | undefined; runs: Map; scheduler: FairAgentScheduler; eventPublisher: WorkflowEventPublisher; persistRunState: (store: RunStore, metadata: WorkflowMetadata, update: (run: PersistedRun) => PersistedRun | Promise) => Promise; projectTrusted: (context: unknown) => boolean; resumeHostContext: (context: unknown) => WorkflowRecoveryContext; ensureSessionLease: (cwd: string, sessionId: string) => Promise; createAgentExecutor: (root: Omit) => WorkflowAgentExecutor; activeSnapshotTools: (tools: readonly string[], active: ReadonlySet | "session") => Set; frozenResourcePolicy: (policy: import("./types.js").AgentResourcePolicy) => () => import("./types.js").AgentResourcePolicy; resolveLaunchPrologue: (input: { snapshot: Readonly; cwd: string; trustedProject: boolean; rootModel: ModelSpec; modelRegistry?: WorkflowRecoveryContext["modelRegistry"]; signal: AbortSignal; resolvedAliases?: Readonly>; blockedAliases?: ReadonlySet; blockedAliasTargets?: Readonly>; withPreflight: boolean; }) => Promise<{ active: Set; settingsPath: string; currentPolicy: import("./types.js").AgentResourcePolicy; previousAliases: Readonly>; knownModels: ReadonlySet; availableModels: ReadonlySet; currentAliases: Readonly>; blockedAliases: ReadonlySet; blockedAliasTargets: Readonly>; snapshot: Readonly; script: string | undefined; }>; workflowAgentHandler: (store: RunStore, metadata: WorkflowMetadata, lifecycle: RunLifecycle, executor: WorkflowAgentExecutor, cwd: string, runId: string) => (prompt: string, options: Readonly>, signal: AbortSignal, identity: import("./types.js").AgentIdentity) => Promise; shellForRun: (store: RunStore, metadata: WorkflowMetadata, lifecycle: RunLifecycle, command: string, options: import("./types.js").ShellOptions, signal: AbortSignal, identity: import("./types.js").ShellIdentity) => Promise; resolveWorktree: (store: RunStore, metadata: WorkflowMetadata, owner: string) => Promise>; checkpointBridge: (runId: string, store: RunStore, metadata: WorkflowMetadata, foreground: boolean, ui?: { select?: (prompt: string, options: string[]) => Promise; }, headless?: boolean) => (raw: Readonly>, signal: AbortSignal) => Promise; phaseBridge: (store: RunStore, metadata: WorkflowMetadata, lifecycle: RunLifecycle) => (phase: string) => Promise; logBridge: (store: RunStore, lifecycle: RunLifecycle, workflowName: string) => (message: string) => Promise; lifecycleFor: (store: RunStore, state: RunState, budget: WorkflowBudgetRuntime, metadata: WorkflowMetadata) => RunLifecycle; createProviderErrorRecovery: (host: unknown, fallbackModels: ReadonlySet, abort: () => void) => ((failure: AgentProviderFailure) => Promise) | undefined; cleanupTerminalRun: (runId: string) => Promise; deliver: (content: string) => void; deliverTerminal: (store: RunStore, content: string | (() => string | Promise), failure?: boolean) => Promise; workflowToolUpdate: (run: PersistedRun) => WorkflowToolUpdate; registry: import("./registry.js").WorkflowRegistryApi; modelSpec: (value: string, fallback: ModelSpec) => ModelSpec; }; export declare function persistedFailure(run: PersistedRun, error: WorkflowError): PersistedRun; export declare function createWorkflowRecovery(deps: WorkflowRecoveryDependencies): { refreshPausedRunAliases: (run: WorkflowRunRecord, context?: { model: { provider: string; id: string; } | undefined; modelRegistry: WorkflowRecoveryContext["modelRegistry"]; projectTrusted?: boolean; }) => Promise; coldResumeRun: (run: WorkflowRunRecord, hasUI: boolean, ui: { select?: (prompt: string, options: string[]) => Promise; }, trustedProject: boolean, context?: { model: { provider: string; id: string; } | undefined; modelRegistry: WorkflowRecoveryContext["modelRegistry"]; deliveryContext: CompletionDeliveryContext; signal?: AbortSignal | undefined; resolvedAliases?: Readonly>; blockedAliases?: ReadonlySet; blockedAliasTargets?: Readonly>; }, modeOverride?: boolean, waitForCompletion?: boolean) => Promise<{ value: JsonValue; resultPath: string; resultBytes: number; completion: CompletionDeliveryResult; } | undefined>; applyBudgetDecision: (request: BudgetApprovalRequest, approved: boolean, context?: unknown, signal?: AbortSignal, waitForCompletion?: boolean) => Promise<{ state: "running" | "completed" | "budget_exhausted"; approved: boolean; value?: JsonValue; run?: PersistedRun; completion?: CompletionDeliveryResult; }>; answerBudgetDecision: (runId: string, proposalId: string, approved: boolean, silent?: boolean, context?: unknown, signal?: AbortSignal, waitForCompletion?: boolean) => Promise<{ state: "running" | "completed" | "budget_exhausted"; approved: boolean; value?: JsonValue; run?: PersistedRun; completion?: CompletionDeliveryResult; } | undefined>; budgetDecisionDelivery: (metadata: WorkflowMetadata, request: BudgetApprovalRequest) => string; resumeWorkflowRun: (runId: string, rawPatch?: unknown, context?: unknown, signal?: AbortSignal, modeOverride?: boolean, waitForCompletion?: boolean, expectedState?: string) => Promise>; retryWorkflowRun: (runId: string, context: unknown, signal?: AbortSignal, modeOverride?: boolean, expectedState?: string) => Promise<{ runId: string; parentRunId: string; state: "running" | "completed"; value?: JsonValue; run?: PersistedRun; completion?: CompletionDeliveryResult; }>; };