/** * Recovery-only conductor resume. Cannot mint provider sessions or launch workers. * Journals immutable recovery binding at goal start; resume is operation-aware * idempotent (intent → effect → completion) so crash/concurrency cannot double-resume. * Kernel compares observed snapshots field-by-field; never trusts a matches boolean. * * Model and MCP config are derived from the immutable recovery record + durable policy. * Callers cannot supply model/mcpConfigPath. */ import { type RolePolicyConfig } from "../domain/role-policy.js"; import type { Clock, ConductorRecoveryBinding, KernelPaths } from "./types.js"; /** Observed live authority snapshot — kernel compares fields to journaled binding. */ export interface ConductorObserveSnapshot { readonly alive: boolean; readonly workspace_root: string; readonly repository: string | null; readonly tmux_session: string; readonly tmux_pane: string; readonly conductor_generation: number; readonly claude_session_id: string; readonly policy_digest: string; readonly binary_path: string; readonly binary_version: string; readonly binary_hash: string; } export interface ConductorResumeAdapter { /** Observe live authority fields (no matches boolean). */ readonly observe: (binding: ConductorRecoveryBinding) => ConductorObserveSnapshot; /** * Operation-aware resume: inspect/adopt for operation_id; create at most once. * Must not launch workers. */ readonly ensureResume: (input: { readonly operation_id: string; readonly identity_digest: string; readonly plan: { readonly binary: string; readonly args: readonly string[]; readonly cwd: string; }; }) => { readonly ok: true; } | { readonly ok: false; readonly reason: string; }; } export declare function conductorRecoveryOpId(runId: string): string; export declare function conductorResumeIntentOpId(runId: string): string; export declare function conductorResumeEffectOpId(runId: string): string; export declare function conductorResumeCompleteOpId(runId: string): string; export declare function recoveryBindingDigest(binding: ConductorRecoveryBinding): string; /** * Journal immutable recovery binding. Second call with a different binding conflicts. * Same binding is idempotent reuse. */ export declare function journalConductorRecoveryBinding(input: { readonly paths: KernelPaths; readonly clock: Clock; readonly binding: ConductorRecoveryBinding; }): { readonly operation_id: string; readonly reused: boolean; }; export declare function loadConductorRecoveryBinding(paths: KernelPaths, runId: string): ConductorRecoveryBinding | null; /** * Recovery-only resume with intent → ensureResume → completion. * Loads and validates the immutable recovery binding before considering any * resume intent/effect/completion. Model/MCP come from binding + durable policy. */ export declare function resumeConductorExact(input: { readonly paths: KernelPaths; readonly clock: Clock; readonly adapter: ConductorResumeAdapter; /** Durable policy for model derivation; defaults to DEFAULT_ROLE_POLICY_CONFIG. */ readonly rolePolicy?: RolePolicyConfig; }): { readonly ok: boolean; readonly resumed: boolean; readonly needs_human: boolean; readonly reason?: string; readonly resume_calls: number; }; /** Kernel-side field comparison — never trusts adapter matches flag. */ export declare function snapshotsMatchBinding(snapshot: ConductorObserveSnapshot, binding: ConductorRecoveryBinding): boolean;