import type { CompiledGraph } from "./graph.js"; export type NodeStatus = "pending" | "ready" | "running" | "waiting_human" | "blocked" | "executed" | "failed_retryable" | "failed" | "cancelled" | "skipped"; export interface ArtifactReference { planVersion: number; nodeId: string; contract: string; path: string; sha256: string; sizeBytes: number; } export interface GraphCheckpointRef { path: string; sha256: string; sizeBytes: number; } export interface StructuredNodeError { category: string; retryable: boolean; attempt: number; recordedAt: string; } export interface SideEffectExecutionState { visit: number; attempt: number; ordinal: number; idempotencyKey: string; class: "model" | "tool" | "write" | "external" | "irreversible"; status: "intent_recorded" | "succeeded" | "failed" | "unknown"; requestRef: string; routingDecisionId?: string; checkpointRef?: GraphCheckpointRef; outcome?: "succeeded" | "failed" | "unknown"; reconciled?: boolean; resultRef?: ArtifactReference; } export interface NodeExecutionState { nodeId: string; /** Artifact namespace assigned when this node visit became active. */ planVersion: number; status: NodeStatus; visits: number; attempts: number; retryAttempts: number; sideEffectOrdinal: number; succeededSideEffectKeys: string[]; startedAt?: string; completedAt?: string; outputRefs: ArtifactReference[]; idempotencyKey?: string; sideEffect?: SideEffectExecutionState; lastError?: StructuredNodeError; } export interface ExecutionGuardState { startedAt: string; steps: number; runningNodes: string[]; modelCallsInFlight: number; providerCallsInFlight: number; estimatedCostUsd: number | "unknown"; observedCostUsd: number | "unknown"; inputTokens: number | "unknown"; outputTokens: number | "unknown"; sideEffectAttempts: number; humanWaitStartedAt?: string; noProgressFingerprint?: string; noProgressRepeats: number; backEdgeRemaining: Record; } export interface GraphExecutionState { schemaVersion: 2; runId: string; graphId: string; graphVersion: string; graphDigest: string; planVersion: number; revision: number; lastAppliedEventSequence: number; lastAppliedEventId?: string; lastAppliedEventHash?: string; lastAppliedEventTimestamp?: string; eventChainHash: string; recentEventIds: string[]; nodeStates: Record; ready: string[]; schedulerMetadata: SchedulerMetadata; metadataFingerprint: string; effectiveLimits: ExecutionLimits; limitsFingerprint: string; guard: ExecutionGuardState; } export interface SchedulerMetadata { /** Higher numeric values run first; ties are ordered by node id. */ priorities?: Readonly>; } export declare function schedulerMetadataFingerprint(metadata: SchedulerMetadata): string; export interface ExecutionLimits { maxGraphSteps: number; maxNodeAttempts: number; maxPlanVersions: number; maxGraphNodes: number; maxGraphEdges: number; maxReadyWidth: number; maxConcurrency: number; maxModelConcurrency: number; maxProviderConcurrency: number; maxWallTimeMs: number; maxEstimatedCostUsd: number; maxObservedCostUsd: number; maxInputTokens: number; maxOutputTokens: number; maxSideEffectAttempts: number; humanWait: "allow" | "deny"; maxHumanWaitMs: number; maxNoProgressRepeats: number; backEdgeBudgets: Readonly>; } export declare const DEFAULT_EXECUTION_LIMITS: Readonly; export declare function graphDefinitionDigest(graph: CompiledGraph): string; export declare function executionLimitsFingerprint(limits: ExecutionLimits): string; export type GraphEventKind = "node-status" | "side-effect-intent" | "side-effect-result" | "progress" /** Advances the scheduler artifact namespace; it does not approve a business plan. */ | "plan-version-reserved"; export interface GraphEventEdge { from: string; to: string; event: string; guard?: string; boundedBy?: string; } export interface GraphEvent { schemaVersion: 1; kind: GraphEventKind; sequence: number; eventId: string; requestRef?: string; runId: string; graphId: string; graphVersion: string; graphDigest: string; planVersion: number; priorPlanVersion?: number; nextPlanVersion?: number; nodeId: string; priorStatus: NodeStatus; nextStatus: NodeStatus; chosenEdge?: GraphEventEdge; attempt: number; timestamp: string; errorCategory?: string; validatorResult?: { status: "passed" | "failed" | "not_run"; contracts: string[]; }; artifactRefs: ArtifactReference[]; /** Immutable business checkpoint for this WAL event; never a completion output. */ checkpointRef?: GraphCheckpointRef; /** Namespace-reservation evidence stored under the newly reserved plan version. */ activationRef?: ArtifactReference; routingDecisionId?: string; recoveryLevel?: "retry" | "repair" | "replan"; progressFingerprint?: string; sideEffect?: { phase: "intent" | "result"; ordinal: number; idempotencyKey: string; class: "model" | "tool" | "write" | "external" | "irreversible"; outcome?: "succeeded" | "failed" | "unknown"; reconciliation?: boolean; resultRef?: ArtifactReference; }; usage?: { estimatedCostUsd?: number | "unknown"; observedCostUsd?: number | "unknown"; inputTokens?: number | "unknown"; outputTokens?: number | "unknown"; }; reservation?: { modelCalls: -1 | 0 | 1; providerCalls: -1 | 0 | 1; }; } export type GuardAction = "node" | "model" | "side_effect" | "human_wait" | "transition" | "plan_version"; export interface ExecutionGuardProbe { action: GuardAction; nodeId?: string; nodeAttempts?: 0 | 1; now: string; unattended: boolean; additionalReady?: number; concurrency?: number; modelCalls?: number; providerCalls?: number; estimatedCostUsd?: number | "unknown"; observedCostUsd?: number | "unknown"; inputTokens?: number | "unknown"; outputTokens?: number | "unknown"; sideEffectAttempts?: number; sideEffectClass?: SideEffectExecutionState["class"]; edge?: GraphEventEdge; /** Narrow cleanup admission after ordinary execution ceilings have stopped the run. */ terminalStop?: "cancelled" | "failed"; } export interface ExecutionGuardDecision { allowed: boolean; code?: string; reason?: string; } export declare function createGraphExecutionState(graph: CompiledGraph, options: { runId: string; now: string; limits: ExecutionLimits; planVersion?: number; currentNodeId?: string; metadata?: SchedulerMetadata; }): GraphExecutionState; /** * Bounded in-memory migration for scheduler-v2 snapshots written before node * visits carried their artifact namespace. Callers must persist the migrated * value only through the normal lease/CAS checkpoint path. */ export declare function migrateLegacyNodePlanVersions(state: Readonly): GraphExecutionState; export declare function computeReadySet(graph: CompiledGraph, state: Readonly, metadata?: SchedulerMetadata): string[]; export declare function applySchedulerEvent(graph: CompiledGraph, state: Readonly, event: Readonly, metadata?: SchedulerMetadata): GraphExecutionState; export declare function evaluateExecutionGuard(graph: CompiledGraph, state: Readonly, limits: ExecutionLimits, probe: ExecutionGuardProbe): ExecutionGuardDecision; export declare function assertScheduleValid(graph: CompiledGraph, state: Readonly, metadata?: SchedulerMetadata): void; export declare function assertGraphEventValid(value: unknown): asserts value is GraphEvent; export declare function graphEventDigest(event: Readonly): string;