/** * adapters/gemini-cli — Gemini CLI platform adapter. * * Implements HookAdapter for Gemini CLI's JSON stdin/stdout hook paradigm. * * Gemini CLI hook specifics: * - I/O: JSON on stdin, JSON on stdout (same paradigm as Claude Code) * - Hook names: BeforeTool, AfterTool, PreCompress, SessionStart * - Arg modification: `hookSpecificOutput.tool_input` (merged with original) * - Blocking: `decision: "deny"` in response (NOT permissionDecision) * - Output modification: `decision: "deny"` + reason replaces output, * `hookSpecificOutput.additionalContext` appends * - PreCompress: advisory only (async, cannot block) * - No `decision: "ask"` support * - Hooks don't fire for subagents yet * - Config: ~/.gemini/settings.json (user), .gemini/settings.json (project) * - Session ID: session_id field * - Project dir env: GEMINI_PROJECT_DIR (also CLAUDE_PROJECT_DIR alias) * - Session dir: ~/.gemini/context-mode/sessions/ */ import type { HookAdapter, HookParadigm, PlatformCapabilities, DiagnosticResult, PreToolUseEvent, PostToolUseEvent, PreCompactEvent, SessionStartEvent, PreToolUseResponse, PostToolUseResponse, PreCompactResponse, SessionStartResponse, HookRegistration } from "../types.js"; export declare class GeminiCLIAdapter implements HookAdapter { readonly name = "Gemini CLI"; readonly paradigm: HookParadigm; readonly capabilities: PlatformCapabilities; parsePreToolUseInput(raw: unknown): PreToolUseEvent; parsePostToolUseInput(raw: unknown): PostToolUseEvent; parsePreCompactInput(raw: unknown): PreCompactEvent; parseSessionStartInput(raw: unknown): SessionStartEvent; formatPreToolUseResponse(response: PreToolUseResponse): unknown; formatPostToolUseResponse(response: PostToolUseResponse): unknown; formatPreCompactResponse(response: PreCompactResponse): unknown; formatSessionStartResponse(response: SessionStartResponse): unknown; getSettingsPath(): string; getSessionDir(): string; getSessionDBPath(projectDir: string): string; getSessionEventsPath(projectDir: string): string; generateHookConfig(pluginRoot: string): HookRegistration; readSettings(): Record | null; writeSettings(settings: Record): void; validateHooks(pluginRoot: string): DiagnosticResult[]; checkPluginRegistration(): DiagnosticResult; getInstalledVersion(): string; configureAllHooks(pluginRoot: string): string[]; backupSettings(): string | null; setHookPermissions(pluginRoot: string): string[]; updatePluginRegistry(pluginRoot: string, version: string): void; /** Get the project directory from environment variables. */ private getProjectDir; /** * Extract session ID from Gemini CLI hook input. * Priority: session_id field > env fallback > ppid fallback. */ private extractSessionId; }