import type { AgentHooks, ToolApprovalRequest } from '../core/agent/agent-hooks.js'; import type { Tool, ToolSideEffectClass } from '../core/tools/tool-types.js'; import { type ConfigApprovalPolicy } from './config.js'; import { type ApprovalDetailContext } from './approval-detail.js'; import type { CliDetailMode } from './output.js'; export type CliSafetyMode = 'read-only' | 'workspace-write' | 'full-access'; export type AskUser = (question: string, abortSignal?: AbortSignal) => Promise; export type CliInteractionMode = 'plan' | 'default' | 'acceptEdits'; export declare function setCliInteractionMode(mode: CliInteractionMode): void; export declare function getCliInteractionMode(): CliInteractionMode; /** Subscribe to interaction-mode changes (plan / default / acceptEdits). */ export declare function subscribeCliInteractionMode(listener: (mode: CliInteractionMode) => void): () => void; export declare function formatCliInteractionModeLabel(mode: CliInteractionMode, zh?: boolean): string; export declare function parseCliInteractionMode(raw: string | undefined): CliInteractionMode | null; /** * Best-effort interaction mode recovery from session history (no extra storage). * Newest signal wins: * - "Left plan mode → default" / switched-to-default text → default * - user prompt prefixed with Moss plan-mode header → plan * - explicit /mode plan|default|accept-edits user text → that mode * Returns null when no signal is found. */ export declare function inferCliInteractionModeFromMessages(messages: ReadonlyArray<{ role?: string; content?: unknown; }>): CliInteractionMode | null; export interface CliToolApprovalOptions { approvalPolicy?: ConfigApprovalPolicy; trustedTools?: readonly string[]; deniedTools?: readonly string[]; workspaceDir?: string; device?: { host: string; user?: string; port?: number; } | null; boardMode?: () => boolean; safetyModeOverride?: () => CliSafetyMode | undefined; autoApprove?: () => boolean; /** Instance-scoped interaction mode for embedded or concurrent agents. */ interactionMode?: () => CliInteractionMode; detailMode?: CliDetailMode; } export interface CliToolApprovalPreview { toolName: string; sideEffect: ToolSideEffectClass; safetyMode: CliSafetyMode; inputPreview: string; decisionContext: string; requiresApproval: boolean; trusted: boolean; trustedPattern?: string; denied: boolean; deniedPattern?: string; autoApproved: boolean; boardAutoApproved: boolean; /** True only for sandbox-enforced workspace file mutation tools. */ workspaceFileMutation: boolean; /** True only when accept-edits may approve this exact operation class. */ acceptEditsEligible: boolean; /** Hard block reason that no trust or auto-approval mode may bypass. */ hardBlockReason?: string; } export declare function setCliApprovalAsker(asker: AskUser | null): void; /** Permission / tool-approval prompts only. */ export declare function getCliApprovalAsker(): AskUser | null; /** Structured agent questions (ask_user_question). Falls back to approval asker * only when a host has not registered a dedicated question UI. */ export declare function setCliUserQuestionAsker(asker: AskUser | null): void; export declare function getCliUserQuestionAsker(): AskUser | null; export declare function resolveCliSafetyMode(argv?: string[], env?: NodeJS.ProcessEnv): CliSafetyMode; /** * Plan-mode allowlist for tools that may run while interactionMode === 'plan'. * Contract: metadata.planMode === 'allow' is the explicit opt-in for non-readonly * planning helpers (todo_write, ask_user_question, plan/plan_step, …). * Default (missing planMode, or requires_user_confirmation / audit) still blocks * non-readonly side effects so accidental mutations stay out of plan mode. */ export declare function isAllowedDuringPlanMode(tool: Tool, sideEffect: ToolSideEffectClass): boolean; export declare function renderCliApprovalPrompt(preview: CliToolApprovalPreview, input: Record, detailCtx?: ApprovalDetailContext): string; export declare function describeCliToolApproval(request: ToolApprovalRequest, mode: CliSafetyMode, env?: NodeJS.ProcessEnv, options?: CliToolApprovalOptions): CliToolApprovalPreview; export declare function createCliToolApprovalHook(mode: CliSafetyMode, env?: NodeJS.ProcessEnv, options?: CliToolApprovalOptions): NonNullable; //# sourceMappingURL=approval.d.ts.map