import type { ExtensionAPI, ExtensionContext, SessionBoundaryDraft } from "@earendil-works/pi-coding-agent"; type BudgetOwner = { automaticResetEnabled: (ctx: ExtensionContext) => boolean; hardReserveDue: (ctx: ExtensionContext) => boolean; consumeTurnEnd: (ctx: ExtensionContext) => SessionBoundaryDraft[]; clear: () => void; }; type ResetOptions = { isEnabled: () => boolean; budget: BudgetOwner; buildReset: (ctx: ExtensionContext, isCurrent: () => boolean) => SessionBoundaryDraft[] | Promise; getLifecycleGeneration?: () => number; onResetReady?: (ctx: ExtensionContext, drafts: readonly SessionBoundaryDraft[]) => void; }; export type ResetRequestSource = "manual" | "automatic"; type ToolResetRequestSource = ResetRequestSource | "tool"; export type ResetRequest = { readonly phase: "none"; } | { readonly phase: "close-out"; readonly windowId: string; readonly source: ResetRequestSource; } | { readonly phase: "tool-requested"; readonly windowId: string; readonly source: ToolResetRequestSource; }; export type ResetOverflowPhase = "idle" | "pending" | "pending-spent" | "spent"; export interface ResetControlState { readonly request: ResetRequest; readonly overflow: ResetOverflowPhase; } export declare function initialResetControl(): ResetControlState; /** Facts for a completed turn. Guard values stay lazy to preserve policy resolution order. */ export interface ResetTurnEndFacts { readonly windowId: string; readonly aborted: boolean; readonly overflow: boolean; readonly failed: boolean; readonly enabled: boolean; readonly queued: boolean; readonly automaticResetEnabled: boolean; readonly hardReserveDue: boolean; } /** Facts for the pre-settlement boundary; policy guards stay lazy for the same reason. */ export interface ResetBeforeSettleFacts { readonly windowId: string; readonly queued: boolean; readonly enabled: boolean; readonly automaticResetEnabled: boolean; readonly aborted: boolean; readonly failed: boolean; } export type ResetControlEvent = { readonly type: "close_out"; readonly windowId: string; readonly source: ResetRequestSource; } | { readonly type: "tool_request"; readonly windowId: string; readonly source?: "manual"; } | { readonly type: "turn_end"; readonly facts: ResetTurnEndFacts; } | { readonly type: "before_settle"; readonly facts: ResetBeforeSettleFacts; } | { readonly type: "settled"; } | { readonly type: "abort"; } | { readonly type: "clear"; }; export type ResetControlEffect = "none" | "close-out-armed" | "already-pending" | "commit-boundary" | "commit-boundary-stop" | "recover-overflow"; export interface ResetControlResult { readonly state: ResetControlState; readonly effect: ResetControlEffect; } /** Pure reset-control transitions: request phases own close-out, tool commit, and fallback. */ export declare function reduceResetControl(state: ResetControlState, event: ResetControlEvent): ResetControlResult; /** * Own close-out requests at Pi's public turn and pre-settlement boundaries. Tool-requested * resets commit at turn_end; manual and budget close-outs remain armed across note/tool turns * and fall back at a successful agent_before_settle. Overflow recovery remains bounded. */ export declare function registerResetLifecycle(pi: ExtensionAPI, options: ResetOptions): { closeOut(windowId: string, source: ResetRequestSource): ResetControlEffect; requestManualAtTurnEnd(windowId: string): ResetControlEffect; request(windowId: string): "rollover_already_pending" | "rollover_requested"; clear: () => void; }; export {};