export declare const TERMINAL_INTERACTION_SCHEMA: "agent-knock-knock/terminal-interaction"; export declare const TERMINAL_INTERACTION_VERSION: 1; /** * Version 2 makes the interaction owner explicit. Version 1 remains readable * for durable managed-Turn records written by releases before Watch response * authority existed. */ export declare const TERMINAL_INTERACTION_SUBJECT_VERSION: 2; export declare const TERMINAL_INTERACTION_KINDS: readonly ["questionnaire", "async_question"]; export declare const TERMINAL_INTERACTION_STATES: readonly ["pending", "manual_required", "response_uncertain"]; export declare const TERMINAL_INTERACTION_RESPONSE_KINDS: readonly ["single_select", "multi_select", "free_text", "confirm"]; export declare const TERMINAL_INTERACTION_AGENTS: readonly ["codex", "claude"]; export declare const TERMINAL_INTERACTION_SUBJECT_KINDS: readonly ["managed_turn", "terminal_watch"]; export declare const TERMINAL_INTERACTION_RESPONSE_AUTHORITIES: readonly ["executable", "notify_only"]; export declare const TERMINAL_INTERACTION_DELIVERY_MODES: readonly ["steer_current_turn", "queue_next_turn"]; export declare const TERMINAL_INTERACTION_LIMITS: Readonly<{ maxProjectionBytes: number; /** A projection is deliberately one native step, never a batch of keys. */ maxQuestions: 1; /** Claude may render four declared options plus its automatic Other row. */ maxOptionsPerQuestion: 5; maxSteps: 16; maxIdentifierLength: 128; maxPromptLength: 4096; maxHeaderLength: 12; maxOptionLabelLength: 64; maxOptionDescriptionLength: 1024; maxPlaceholderLength: 256; maxTextAnswerLength: 4096; maxExpiresAtLength: 64; }>; export type TerminalInteractionKind = typeof TERMINAL_INTERACTION_KINDS[number]; export type TerminalInteractionState = typeof TERMINAL_INTERACTION_STATES[number]; export type TerminalInteractionResponseKind = typeof TERMINAL_INTERACTION_RESPONSE_KINDS[number]; export type TerminalInteractionAgent = typeof TERMINAL_INTERACTION_AGENTS[number]; export type TerminalInteractionSubjectKind = typeof TERMINAL_INTERACTION_SUBJECT_KINDS[number]; export type TerminalInteractionResponseAuthority = typeof TERMINAL_INTERACTION_RESPONSE_AUTHORITIES[number]; export type TerminalInteractionDeliveryMode = typeof TERMINAL_INTERACTION_DELIVERY_MODES[number]; export interface TerminalInteractionManagedTurnSubject { readonly kind: "managed_turn"; readonly turn_id: string; /** The exact controller message that established managed ownership. */ readonly message_id: string; } export interface TerminalInteractionTerminalWatchSubject { readonly kind: "terminal_watch"; readonly watch_id: string; /** Hash of the exact task/acceptance anchor; never raw terminal content. */ readonly anchor_fingerprint: string; } export type TerminalInteractionSubject = TerminalInteractionManagedTurnSubject | TerminalInteractionTerminalWatchSubject; export interface TerminalInteractionOption { readonly option_id: string; readonly label: string; readonly description?: string; } interface TerminalInteractionQuestionBase { readonly question_id: string; readonly header?: string; readonly prompt: string; readonly required: boolean; } export interface TerminalInteractionSingleSelectQuestion extends TerminalInteractionQuestionBase { readonly response_kind: "single_select"; readonly options: readonly TerminalInteractionOption[]; } export interface TerminalInteractionMultiSelectQuestion extends TerminalInteractionQuestionBase { readonly response_kind: "multi_select"; readonly options: readonly TerminalInteractionOption[]; } export interface TerminalInteractionFreeTextQuestion extends TerminalInteractionQuestionBase { readonly response_kind: "free_text"; readonly placeholder?: string; } export interface TerminalInteractionConfirmQuestion extends TerminalInteractionQuestionBase { readonly response_kind: "confirm"; } export type TerminalInteractionQuestion = TerminalInteractionSingleSelectQuestion | TerminalInteractionMultiSelectQuestion | TerminalInteractionFreeTextQuestion | TerminalInteractionConfirmQuestion; export interface TerminalInteractionProjection { readonly schema: typeof TERMINAL_INTERACTION_SCHEMA; readonly version: typeof TERMINAL_INTERACTION_VERSION; readonly interaction_id: string; readonly turn_id: string; readonly agent: TerminalInteractionAgent; readonly kind: TerminalInteractionKind; readonly state: TerminalInteractionState; readonly step: { readonly index: number; readonly total: number; }; readonly questions: readonly TerminalInteractionQuestion[]; /** Present only for non-blocking async_question offers. */ readonly delivery_modes?: readonly TerminalInteractionDeliveryMode[]; /** Pending interaction offers always expire and cannot be replayed. */ readonly expires_at: string; readonly capabilities: { readonly respond: boolean; readonly batch_response: boolean; readonly free_text: boolean; readonly multi_select: boolean; }; } /** * Subject-aware public projection. `subject` is authoritative. `turn_id` is a * deprecated managed-Turn compatibility alias and is forbidden for Watch * subjects, so Watch integrations never invent a fake Turn. */ export type TerminalInteractionSubjectProjection = { readonly schema: typeof TERMINAL_INTERACTION_SCHEMA; readonly version: typeof TERMINAL_INTERACTION_SUBJECT_VERSION; readonly interaction_id: string; readonly subject: TerminalInteractionSubject; readonly agent: TerminalInteractionAgent; readonly kind: TerminalInteractionKind; readonly state: TerminalInteractionState; readonly step: { readonly index: number; readonly total: number; }; readonly questions: readonly TerminalInteractionQuestion[]; /** Present only for non-blocking async_question offers. */ readonly delivery_modes?: readonly TerminalInteractionDeliveryMode[]; readonly expires_at: string; /** Stable across monitor/Watch observation of the same native surface. */ readonly surface_id: string; /** SHA-256 of the normalized native prompt, never raw terminal content. */ readonly prompt_fingerprint: string; readonly response_authority: TerminalInteractionResponseAuthority; readonly capabilities: { readonly respond: boolean; readonly batch_response: boolean; readonly free_text: boolean; readonly multi_select: boolean; }; } & ({ readonly subject: TerminalInteractionManagedTurnSubject; /** @deprecated Read `subject.turn_id`; retained for managed v1 clients. */ readonly turn_id?: string; } | { readonly subject: TerminalInteractionTerminalWatchSubject; readonly turn_id?: never; }); export type TerminalInteractionAnyProjection = TerminalInteractionProjection | TerminalInteractionSubjectProjection; interface TerminalInteractionAnswerBase { readonly question_id: string; } export interface TerminalInteractionSingleSelectAnswer extends TerminalInteractionAnswerBase { readonly response_kind: "single_select"; readonly selected_option_ids: readonly [string]; } export interface TerminalInteractionMultiSelectAnswer extends TerminalInteractionAnswerBase { readonly response_kind: "multi_select"; readonly selected_option_ids: readonly string[]; } export interface TerminalInteractionFreeTextAnswer extends TerminalInteractionAnswerBase { readonly response_kind: "free_text"; readonly text: string; } export interface TerminalInteractionConfirmAnswer extends TerminalInteractionAnswerBase { readonly response_kind: "confirm"; readonly confirm: boolean; } export type TerminalInteractionAnswer = TerminalInteractionSingleSelectAnswer | TerminalInteractionMultiSelectAnswer | TerminalInteractionFreeTextAnswer | TerminalInteractionConfirmAnswer; export interface TerminalInteractionResponse { readonly interaction_id: string; readonly turn_id: string; readonly answers: readonly TerminalInteractionAnswer[]; readonly delivery_mode?: TerminalInteractionDeliveryMode; } export type TerminalInteractionSubjectResponse = { readonly interaction_id: string; readonly subject: TerminalInteractionSubject; readonly answers: readonly TerminalInteractionAnswer[]; readonly delivery_mode?: TerminalInteractionDeliveryMode; } & ({ readonly subject: TerminalInteractionManagedTurnSubject; /** @deprecated Optional compatibility assertion for managed clients. */ readonly turn_id?: string; } | { readonly subject: TerminalInteractionTerminalWatchSubject; readonly turn_id?: never; }); export type TerminalInteractionAnyResponse = TerminalInteractionResponse | TerminalInteractionSubjectResponse; export type TerminalInteractionValidationCode = "invalid_type" | "invalid_value" | "unknown_field" | "limit_exceeded" | "duplicate_id" | "secret_not_allowed" | "control_character" | "interaction_mismatch" | "response_not_allowed" | "answer_kind_mismatch" | "unknown_question" | "unknown_option" | "missing_answer" | "expired"; export declare class TerminalInteractionValidationError extends Error { readonly code: TerminalInteractionValidationCode; readonly path: string; constructor(code: TerminalInteractionValidationCode, path: string, message: string); } export declare function validateTerminalInteractionSubject(value: unknown, path?: string): TerminalInteractionSubject; export declare function terminalInteractionSubjectId(subject: TerminalInteractionSubject): string; export declare function terminalInteractionSubjectKey(subject: TerminalInteractionSubject): string; export declare function sameTerminalInteractionSubject(left: TerminalInteractionSubject, right: TerminalInteractionSubject): boolean; export declare function validateTerminalInteractionProjection(value: unknown): TerminalInteractionProjection; export declare function validateTerminalInteractionSubjectProjection(value: unknown): TerminalInteractionSubjectProjection; export declare function validateAnyTerminalInteractionProjection(value: unknown): TerminalInteractionAnyProjection; export interface TerminalInteractionV1NormalizationContext { readonly subject: TerminalInteractionManagedTurnSubject; readonly surfaceId: string; readonly promptFingerprint: string; readonly responseAuthority: TerminalInteractionResponseAuthority; } /** * Decode either public/durable v1 or subject-aware v2 into the sole runtime * representation. Legacy aliases are deliberately removed after validation. */ export declare function normalizeTerminalInteractionProjectionV2(value: unknown, legacy?: TerminalInteractionV1NormalizationContext): TerminalInteractionSubjectProjection; /** Explicit public/Store v1 encoder; Watch subjects remain subject-aware v2. */ export declare function terminalInteractionPublicCompatibilityProjection(value: TerminalInteractionSubjectProjection): TerminalInteractionAnyProjection; export declare function validateTerminalInteractionResponse(value: unknown, authoritativeStoredProjection: unknown, options?: { now?: Date; /** * Internal dispatch paths may validate a displayed answer shape against an * expired projection only because they subsequently recapture and prove * the exact live terminal questionnaire before sending any input. */ allowExpiredForLiveRecapture?: boolean; }): TerminalInteractionResponse; export declare function validateTerminalInteractionSubjectResponse(value: unknown, authoritativeStoredProjection: unknown, options?: { now?: Date; allowExpiredForLiveRecapture?: boolean; }): TerminalInteractionSubjectResponse; export declare function validateAnyTerminalInteractionResponse(value: unknown, authoritativeStoredProjection: unknown, options?: { now?: Date; allowExpiredForLiveRecapture?: boolean; }): TerminalInteractionAnyResponse; /** * Decode a legacy managed response or a v2 subject response into v2 before * any authorization, reservation, or terminal dispatch logic observes it. */ export declare function normalizeTerminalInteractionResponseV2(value: unknown, authoritativeProjection: TerminalInteractionSubjectProjection, options?: { now?: Date; allowExpiredForLiveRecapture?: boolean; }): TerminalInteractionSubjectResponse; export {};