import type { AgentInteractiveSessionControlClaim, AgentInteractiveTerminalSession, AgentTerminalSession, TerminalAttachRequest, TerminalAttachResult } from "@tangle-network/agent-interface"; import type { SandboxInstanceLike, SandboxTerminalReadyLike, SandboxTerminalStreamLike, SandboxTerminalsLike } from "./tangle-types.js"; import { TerminalFrameLog } from "./tangle-terminal-frames.js"; /** Terminal handles this environment holds, keyed by terminal session id. */ export interface TangleTerminalRegistry { attach(request: TerminalAttachRequest, options?: { signal?: AbortSignal; }): Promise; get(terminalSessionId: string): AgentTerminalSession; } /** True when this sandbox backs the interactive terminal surface. */ export declare function sandboxBacksInteractiveTerminal(box: SandboxInstanceLike): boolean; /** Stream state captured from handlers that are installed before attach. */ export interface TangleTerminalStreamCapture { readonly handlers: { onReady(info: SandboxTerminalReadyLike): void; onData(data: Uint8Array): void; onExit(info: { exitCode?: number; exitSignal?: string; }): void; onError(error: Error): void; onClose(): void; }; readonly log: TerminalFrameLog; readonly activity: { localMs: number; }; readonly exit: { exitCode?: number; exitSignal?: string; seen: boolean; }; readonly ready: SandboxTerminalReadyLike | undefined; } /** A live stream after its exact identity and runtime metadata are checked. */ export type PreparedTangleTerminal = { status: "ready"; session: AgentTerminalSession; stream: SandboxTerminalStreamLike; acknowledgement: SandboxTerminalReadyLike; } | { status: "unknown"; message: string; retryable: boolean; }; /** * Install one ordered capture before a terminal socket opens. * * Both generic shells and exact coding-agent sessions use this capture. This * keeps replay, resize, exit, and transport ordering identical on both paths. */ export declare function createTangleTerminalStreamCapture(geometry?: { cols?: number; rows?: number; }): TangleTerminalStreamCapture; /** * Validate one attached socket and adapt it to the shared terminal contract. * * The runtime acknowledgement and metadata are authoritative. A missing or * different session id closes the socket and returns no usable handle. */ export declare function prepareTangleTerminalAttachment(input: { stream: SandboxTerminalStreamLike; capture: TangleTerminalStreamCapture; terminals: SandboxTerminalsLike; parentExecutionId: string; expectedSessionId?: string; signal?: AbortSignal; beforeMutation?: (operation: "input" | "resize" | "detach" | "close") => Promise; attachCount?: (terminalSessionId: string) => number; release?: (terminalSessionId: string, stream: SandboxTerminalStreamLike) => void; }): Promise; export declare function createTangleTerminalRegistry(box: SandboxInstanceLike): TangleTerminalRegistry; /** Close a stream that has not been handed to a caller. */ export declare function closeTangleStreamQuietly(stream: SandboxTerminalStreamLike): Promise; /** Add the exact claim identity without replacing the terminal implementation. */ export declare function bindTangleInteractiveControl(session: AgentTerminalSession, control: AgentInteractiveSessionControlClaim): AgentInteractiveTerminalSession;