import type { CodexOpenRootRolloutInventory } from "./agent-session-provider.js"; import { listDeferredForegroundTransfers, type DeferredForegroundTransferSourceRolloutAuthority, type DeferredForegroundTransferSourceTurnAuthority } from "./deferred-foreground-transfer.js"; import type { ExecutorKind } from "./executors.js"; import { type HumanObservedHandoffTargetSnapshot, type ManagedSessionState } from "./managed-session.js"; import { type Conversation } from "./protocol.js"; import { type CodexSendAuthorityContext, type DeferredCodexForegroundDispatchSnapshot } from "./terminal-authority-policy.js"; import { type TerminalNativeIdentity } from "./terminal-binding-authority.js"; import { terminalScopedCodexApprovalPromptSnapshot, type TerminalScopedCodexApprovalBoundary } from "./terminal-scoped-approval-authority.js"; import { type TerminalDispatchLedgerDocument } from "./terminal-dispatch-ledger-codec.js"; import { type TerminalControlRef } from "./terminal-control-ref.js"; export interface DeferredCodexAuthorityObservation { sourceRolloutAuthority: DeferredForegroundTransferSourceRolloutAuthority; sourceTurnHistory?: DeferredForegroundTransferSourceTurnAuthority[]; dispatchSnapshot?: DeferredCodexForegroundDispatchSnapshot; sourceAbandonmentFingerprint?: string; exactSource: boolean; } export interface TerminalListOwnershipContext { storeDir: string; terminals: Record[]; managedSessions: ManagedSessionState[]; allConversations: Conversation[]; displayedConversations: Conversation[]; mutationsAllowed: boolean; nonterminalDeferredTransfers: ReturnType; conversationHasNonterminalDeferredTransfer: (conversation: Conversation) => boolean; } export interface TerminalListOwnershipServicePorts { activeTurnHandoffDecisionToken(request: { handoffToken: string; turn: Conversation; ledger?: TerminalDispatchLedgerDocument; }): string; assertManagedTerminalDispatchOwner(request: { storeDir: string; conversation: Conversation; terminalControl: TerminalControlRef; action: "approve" | "cancel"; }): void; codexLingeringBeforeIdentityMatchesSession(request: { storeDir: string; session: ManagedSessionState; identity: TerminalNativeIdentity; }): boolean; codexProcessIncarnationForPid(pid: number): { processUuid: string; processBirth: string; }; currentWorkingDirectory(): string; isDiscoverableTmuxConversation(conversation: Conversation): boolean; loadTerminalBridgeDispatchLedger(terminalControl: TerminalControlRef): TerminalDispatchLedgerDocument | undefined; loadTerminalDispatchLedgerOwner(ledger: TerminalDispatchLedgerDocument): Conversation | undefined; managedTurnsForSession(storeDir: string, sessionId: string): Conversation[]; matchesConfiguredWorkspace(configured: unknown, observed: unknown): boolean; observeDeferredCodexAuthority(request: { mode: "list"; storeDir: string; context: CodexSendAuthorityContext; sourceSession?: ManagedSessionState; candidateInventory?: CodexOpenRootRolloutInventory; abandonment: "never" | "missing_rollout"; requireUnclaimedCandidate: true; }): DeferredCodexAuthorityObservation | undefined; observedHandoffTargetResolution(request: { storeDir: string; agent: ExecutorKind; workspace: string; nativeThreadId: string; sourceSessionId: string; }): { status: "eligible"; session?: ManagedSessionState; snapshot: HumanObservedHandoffTargetSnapshot; } | { status: "blocked"; reason: string; }; orphanedTerminalDispatchForRecovery(terminalControl: TerminalControlRef): TerminalDispatchLedgerDocument | undefined; runtimeLog(level: "info" | "warn" | "error", event: string, details: Record): void; terminalControlFromTakeover(value: unknown): TerminalControlRef | undefined; terminalDispatchRecordMatchesControl(ledger: TerminalDispatchLedgerDocument | undefined, terminalControl: TerminalControlRef, options?: { requireProcessAnchor?: boolean; }): boolean; } interface TerminalScopedBoundaryRequest { storeDir: string; terminal: unknown; session: ManagedSessionState; ledger?: TerminalDispatchLedgerDocument; approval?: ReturnType; owner?: Conversation; } type TerminalDispatchOwnershipResult = { state: "none"; } | { state: "current"; conversation: Conversation; } | { state: "conflict"; conflict: Record; }; export interface TerminalListOwnershipService { assertTerminalIncarnationCanStartTurn(storeDir: string, terminalControl: TerminalControlRef): void; managedSessionHasAnyNativeTransition(storeDir: string, session: ManagedSessionState): boolean; managedSessionHasUnresolvedNativeTransition(storeDir: string, session: ManagedSessionState): boolean; managedSessionMatchesLiveTerminalEntry(session: ManagedSessionState, terminal: Record, storeDir: string): boolean; managedTurnMatchesLiveTerminal(conversation: Conversation, terminal: Record): boolean; managedTurnNeedsAttention(conversation: Conversation): boolean; observeActionAuthority(terminal: Record, context: TerminalListOwnershipContext, binding: Record): Record; observeBindingAuthority(terminal: Record, context: TerminalListOwnershipContext): Record; provisionalManagedBindingTurnCount(storeDir: string, session: ManagedSessionState): number | undefined; terminalControlForManagedConversation(conversation: Conversation): TerminalControlRef | undefined; terminalDispatchOwnership(terminalControl: TerminalControlRef): TerminalDispatchOwnershipResult; terminalIncarnationBlockingTurns(storeDir: string, terminalControl: TerminalControlRef, conversations?: Conversation[]): Conversation[]; terminalScopedCodexApprovalBoundary(request: TerminalScopedBoundaryRequest): TerminalScopedCodexApprovalBoundary; } export declare function createTerminalListOwnershipService(ports: TerminalListOwnershipServicePorts): TerminalListOwnershipService; export {};