import { type Conversation } from "./protocol.js"; import type { ExecutorKind } from "./executors.js"; import type { TerminalControlRef } from "./terminal-agent-adapter.js"; import { type TerminalControlEvidence } from "./terminal-control-ref.js"; export declare const MANAGED_SESSION_SCHEMA: "agent-knock-knock/session"; export declare const MANAGED_SESSION_VERSION: 1; export declare const NATIVE_THREAD_TRANSITION_SCHEMA: "agent-knock-knock/native-thread-transition"; export declare const NATIVE_THREAD_TRANSITION_VERSION: 1; export type ManagedSessionStatus = "bound" | "detached" | "transitioning" | "quarantined"; export interface NativeProcessIdentity { pid: number; process_uuid?: string; process_birth?: string; rollout?: { fd: string; device: string; inode: string; path: string; }; evidence: string; } export interface ManagedTerminalBinding { binding_id: string; generation: number; terminal_id: string; terminal_control: TerminalControlRef; /** Additive provider-neutral identity evidence for newer writers. */ terminal_endpoint?: TerminalControlEvidence; native_thread_id?: string; native_process: NativeProcessIdentity; bound_at: string; last_verified_at: string; } export interface ManagedSessionLineage { created_by: "attach" | "new_thread" | "resume_thread" | "human_observed" | "migration"; previous_session_id?: string; resumed_from_native_thread_id?: string; transition_id?: string; } export interface ManagedSessionState { schema: typeof MANAGED_SESSION_SCHEMA; version: typeof MANAGED_SESSION_VERSION; session_id: string; /** * Monotonic Store revision. Writers may omit it when creating a value, but * every persisted and loaded protocol-3 Session has one. */ revision?: number; agent: ExecutorKind; workspace: string; status: ManagedSessionStatus; binding?: ManagedTerminalBinding; lineage: ManagedSessionLineage; created_at: string; updated_at: string; detached_at?: string; quarantine_reason?: string; last_transition_id?: string; } export type NativeThreadTransitionStatus = "prepared" | "dispatching" | "submitted" | "uncertain" | "verified" | "committed" | "aborted"; export interface NativeThreadTransition { schema: typeof NATIVE_THREAD_TRANSITION_SCHEMA; version: typeof NATIVE_THREAD_TRANSITION_VERSION; transition_id: string; /** Monotonic Store revision used for transition state CAS. */ revision?: number; operation: "new_thread" | "resume_thread" | "adopt_external_thread"; /** An observed handoff is authority evidence, never a terminal command. */ origin?: "human_observed"; /** Explicitly fences recovery from ever replaying input for an observation. */ terminal_input_sent?: boolean; status: NativeThreadTransitionStatus; terminal_id: string; agent: ExecutorKind; workspace: string; source_session_id?: string; source_expected_revision?: number; source_previous_last_transition_id?: string; target_session_id: string; /** `null` means the target Session must not exist at prepare time. */ target_expected_revision: number | null; target_native_thread_id?: string; /** Immutable candidate rollout identity revalidated before a Codex resume. */ target_candidate_file_identity?: { path: string; device: string; inode: string; }; before_native_thread_id: string; before_process_uuid: string; before_process_started_at?: number; before_process_birth?: string; before_process_rollout?: NativeProcessIdentity["rollout"]; before_binding?: ManagedTerminalBinding; after_binding?: ManagedTerminalBinding; adapter_version: string; command_fingerprint: string; dispatcher_pid: number; prepared_at: string; dispatching_at?: string; submitted_at?: string; verified_at?: string; committed_at?: string; aborted_at?: string; uncertain_at?: string; reconciled_outcome?: "before" | "after"; reconciled_at?: string; error?: string; do_not_retry?: boolean; } export interface NativeThreadCandidate { native_thread_id: string; /** Opaque base64url-encoded TerminalThreadLifecycleCandidateToken. */ candidate_token?: string; agent: ExecutorKind; workspace: string; title?: string; preview?: string; updated_at?: string; updated_at_ms?: number; archived?: boolean; active_elsewhere?: boolean; managed_session_id?: string; resumable: boolean; unavailable_reason?: string; } export declare function createManagedSessionId(now?: Date): string; export declare function createTerminalBindingId(): string; export declare function createNativeThreadTransitionId(): string; export declare function managedSessionStorageKey(sessionId: string): string; export declare function managedSessionBindingToken(state: Pick): string; export declare function managedSessionRevision(state: ManagedSessionState): number; export declare function nativeThreadTransitionRevision(transition: NativeThreadTransition): number; export declare function legacyManagedSessionBindingToken(state: Pick): string; export declare function unmanagedTerminalBindingToken(value: { terminalId: string; terminalControl: TerminalControlRef; agent: ExecutorKind; pid: number; workspace: string; nativeThreadId?: string; processUuid?: string; processBirth?: string; rollout?: NativeProcessIdentity["rollout"]; }): string; export type HumanObservedHandoffTargetSnapshot = { state: "absent"; } | { state: "detached"; session_id: string; revision: number; status: "detached"; binding_token: string; }; /** * Snapshot authority for one advertised human-handoff send. * * The terminal token fences the provider endpoint, process incarnation, and * observed after-thread identity. Source and target snapshots are included * separately because neither a Session revision nor a newly appeared/removed * historical target is represented by that terminal-only token. */ export declare function humanObservedHandoffBindingToken(value: { terminal_token: string; source_session_id: string; source_revision: number; source_binding_token: string; target: HumanObservedHandoffTargetSnapshot; }): string; export declare function legacyUnmanagedTerminalBindingToken(value: { terminalId: string; terminalControl: TerminalControlRef; agent: ExecutorKind; pid: number; workspace: string; nativeThreadId?: string; processUuid?: string; processBirth?: string; rollout?: NativeProcessIdentity["rollout"]; }): string; export declare function terminalBindingFrom(value: { terminalId: string; terminalControl: TerminalControlRef; pid: number; nativeThreadId?: string; processUuid?: string; processBirth?: string; rollout?: NativeProcessIdentity["rollout"]; evidence: string; generation: number; now?: Date; }): ManagedTerminalBinding; export declare function nativeThreadCommandFingerprint(command: string): string; export declare function isExactNativeThreadId(value: unknown): value is string; export declare function assertManagedSessionId(value: unknown): asserts value is string; export declare function assertManagedSessionState(value: unknown, expectedSessionId?: string, options?: { allowMissingRevision?: boolean; }): asserts value is ManagedSessionState; export declare function assertNativeThreadTransition(value: unknown, expectedTransitionId?: string, options?: { allowMissingRevision?: boolean; }): asserts value is NativeThreadTransition; /** * Materialize protocol-3 Session records from predecessor Turn records. The * derivation never picks a Turn by mutable recency. A binding is accepted only * from one unambiguous binding generation; otherwise the Session is * quarantined and cannot become a routing authority. */ export declare function managedSessionStatesFromConversations(conversations: readonly Conversation[]): ManagedSessionState[];