@ketd/gemini-cli-sdk 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +44 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -13
- package/dist/index.d.ts +46 -13
- package/dist/index.js +44 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -603,21 +603,32 @@ var GeminiStreamClient = class extends events.EventEmitter {
|
|
|
603
603
|
*
|
|
604
604
|
* Used for edit/retry functionality where subsequent messages need to be discarded.
|
|
605
605
|
*
|
|
606
|
-
* @param
|
|
606
|
+
* @param options - Truncation options: either keepUserTurns (preferred) or fromIndex (legacy)
|
|
607
607
|
*/
|
|
608
|
-
async truncateHistory(
|
|
608
|
+
async truncateHistory(options) {
|
|
609
609
|
if (!this.isReady()) {
|
|
610
610
|
throw new GeminiSDKError("Client not ready. Call start() first.");
|
|
611
611
|
}
|
|
612
|
-
|
|
613
|
-
|
|
612
|
+
let control;
|
|
613
|
+
if (typeof options === "number") {
|
|
614
|
+
if (options < 0) {
|
|
615
|
+
throw new GeminiSDKError("fromIndex must be non-negative");
|
|
616
|
+
}
|
|
617
|
+
control = { subtype: "truncate_history", fromIndex: options };
|
|
618
|
+
} else if ("keepUserTurns" in options) {
|
|
619
|
+
if (options.keepUserTurns < 0) {
|
|
620
|
+
throw new GeminiSDKError("keepUserTurns must be non-negative");
|
|
621
|
+
}
|
|
622
|
+
control = { subtype: "truncate_history", keepUserTurns: options.keepUserTurns };
|
|
623
|
+
} else {
|
|
624
|
+
if (options.fromIndex < 0) {
|
|
625
|
+
throw new GeminiSDKError("fromIndex must be non-negative");
|
|
626
|
+
}
|
|
627
|
+
control = { subtype: "truncate_history", fromIndex: options.fromIndex };
|
|
614
628
|
}
|
|
615
629
|
const message = {
|
|
616
630
|
type: "control" /* CONTROL */,
|
|
617
|
-
control
|
|
618
|
-
subtype: "truncate_history",
|
|
619
|
-
fromIndex
|
|
620
|
-
},
|
|
631
|
+
control,
|
|
621
632
|
session_id: this.options.sessionId
|
|
622
633
|
};
|
|
623
634
|
this.writeMessage(message);
|
|
@@ -650,6 +661,31 @@ var GeminiStreamClient = class extends events.EventEmitter {
|
|
|
650
661
|
};
|
|
651
662
|
this.writeMessage(message);
|
|
652
663
|
}
|
|
664
|
+
/**
|
|
665
|
+
* Replace CLI in-memory history with provided contents
|
|
666
|
+
*
|
|
667
|
+
* This sends a control message to the CLI to:
|
|
668
|
+
* 1. Replace the entire in-memory history with the provided contents
|
|
669
|
+
* 2. Clear session.json (DB is the source of truth)
|
|
670
|
+
*
|
|
671
|
+
* Used when messages are deleted from DB and CLI history needs to be rebuilt.
|
|
672
|
+
*
|
|
673
|
+
* @param contents - Full replacement history in Gemini Content[] format
|
|
674
|
+
*/
|
|
675
|
+
async replaceHistory(contents) {
|
|
676
|
+
if (!this.isReady()) {
|
|
677
|
+
throw new GeminiSDKError("Client not ready. Call start() first.");
|
|
678
|
+
}
|
|
679
|
+
const message = {
|
|
680
|
+
type: "control" /* CONTROL */,
|
|
681
|
+
control: {
|
|
682
|
+
subtype: "replace_history",
|
|
683
|
+
contents
|
|
684
|
+
},
|
|
685
|
+
session_id: this.options.sessionId
|
|
686
|
+
};
|
|
687
|
+
this.writeMessage(message);
|
|
688
|
+
}
|
|
653
689
|
/**
|
|
654
690
|
* Stop the CLI process
|
|
655
691
|
*/
|
|
@@ -792,10 +828,6 @@ var GeminiStreamClient = class extends events.EventEmitter {
|
|
|
792
828
|
"--output-format",
|
|
793
829
|
"stream-json"
|
|
794
830
|
];
|
|
795
|
-
if (this.options.resumeSessionFilePath) {
|
|
796
|
-
args.push("--resume-from-file", this.options.resumeSessionFilePath);
|
|
797
|
-
this.logger.debug("Resuming from session file:", this.options.resumeSessionFilePath);
|
|
798
|
-
}
|
|
799
831
|
if (this.options.model) {
|
|
800
832
|
args.push("--model", this.options.model);
|
|
801
833
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/logger.ts","../src/query.ts","../src/client.ts","../src/streamClient.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus","JsonInputMessageType","LogLevel","spawn","readline","EventEmitter","readline2","fs","path","fs2","path2"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\nimport type { Logger } from './logger.js';\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Path to Node.js executable (optional)\n * If not specified, uses 'node' from PATH\n * Useful for packaged Electron apps with bundled Node.js\n * @example '/Applications/MyApp.app/Contents/Resources/nodejs/node'\n * @default 'node'\n */\n pathToNode?: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n\n /**\n * Permission callback for tool execution\n * Called when a tool requires approval (when approvalMode is 'default')\n * Return true to approve, false to deny\n * If not provided, falls back to Gemini CLI's built-in approval mechanism\n */\n onPermissionRequest?: (request: ToolPermissionRequest) => Promise<ToolPermissionDecision>;\n\n /**\n * Custom logger implementation\n * If not provided, uses console with [GeminiSDK] prefix\n * Set to silentLogger to disable all logging\n *\n * @example\n * ```typescript\n * import { silentLogger } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello', {\n * logger: silentLogger, // Disable all logging\n * });\n * ```\n */\n logger?: Logger;\n}\n\n/**\n * Tool permission request\n */\nexport interface ToolPermissionRequest {\n /** Unique tool call ID */\n toolId: string;\n\n /** Tool name (e.g., 'write_file', 'run_shell_command') */\n toolName: string;\n\n /** Tool parameters */\n parameters: Record<string, unknown>;\n\n /** Timestamp of the request */\n timestamp: string;\n}\n\n/**\n * Tool permission decision from host application\n */\nexport interface ToolPermissionDecision {\n /** Whether to approve the tool execution */\n approved: boolean;\n\n /** Optional reason for the decision (for logging) */\n reason?: string;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n * Plus additional event types actually sent by CLI\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request (legacy) */\n TOOL_USE = 'tool_use',\n\n /** Tool call request (new format) */\n TOOL_CALL_REQUEST = 'tool_call_request',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Thought/reasoning process */\n THOUGHT = 'thought',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n\n // Additional event types actually sent by Gemini CLI\n /** Message content chunk (streaming) */\n CONTENT = 'content',\n\n /** Message completion with metadata */\n FINISHED = 'finished',\n\n /** Model information */\n MODEL_INFO = 'model_info',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n conversation_file_path?: string; // Added for AoE Desktop integration\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event (legacy format)\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool call request event (new format)\n */\nexport interface ToolCallRequestEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_CALL_REQUEST;\n value: {\n callId: string;\n name: string;\n args: Record<string, unknown>;\n isClientInitiated: boolean;\n prompt_id: string;\n };\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Thought summary containing subject and description\n */\nexport interface ThoughtSummary {\n subject: string;\n description?: string;\n}\n\n/**\n * Thought/reasoning event\n * Emitted by Gemini CLI when the model is thinking\n */\nexport interface ThoughtEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.THOUGHT;\n subject: string;\n description?: string;\n traceId?: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Content event (streaming message chunk)\n * This is the actual event type sent by Gemini CLI for message content\n */\nexport interface ContentEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.CONTENT;\n value: string;\n traceId?: string;\n}\n\n/**\n * Finished event (message completion with metadata)\n */\nexport interface FinishedEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.FINISHED;\n value: {\n reason: string;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n trafficType?: string;\n promptTokensDetails?: Array<{\n modality: string;\n tokenCount: number;\n }>;\n candidatesTokensDetails?: Array<{\n modality: string;\n tokenCount: number;\n }>;\n thoughtsTokenCount?: number;\n };\n };\n}\n\n/**\n * Model information event\n */\nexport interface ModelInfoEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MODEL_INFO;\n value: string;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolCallRequestEvent\n | ToolResultEvent\n | ThoughtEvent\n | ErrorEvent\n | ResultEvent\n | ContentEvent\n | FinishedEvent\n | ModelInfoEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n // captureStackTrace is available in V8 (Node.js) but not in all environments\n if (typeof (Error as any).captureStackTrace === 'function') {\n (Error as any).captureStackTrace(this, GeminiSDKError);\n }\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Input message types for Stream Client (SDK → CLI via stdin)\n */\nexport enum JsonInputMessageType {\n /** User message */\n USER = 'user',\n\n /** Control command */\n CONTROL = 'control',\n}\n\n/**\n * User message sent to CLI\n */\nexport interface UserInputMessage {\n type: JsonInputMessageType.USER;\n content: string;\n session_id?: string;\n /** Optional temporary system instruction to append for this request only */\n temporary_system_instruction?: string;\n}\n\n/**\n * Control subtypes for control messages\n */\nexport type ControlSubtype = 'interrupt' | 'cancel' | 'shutdown' | 'truncate_history' | 'resume_session';\n\n/**\n * Interrupt control - stop current processing\n */\nexport interface InterruptControl {\n subtype: 'interrupt' | 'cancel' | 'shutdown';\n}\n\n/**\n * Truncate history control - remove messages from a specific index\n * Used for edit/retry functionality\n */\nexport interface TruncateHistoryControl {\n subtype: 'truncate_history';\n /** Index from which to truncate (0-based, inclusive) */\n fromIndex: number;\n}\n\n/**\n * Resume session control - load history from a session file\n * Used when warm pool adapter is assigned to a real session\n */\nexport interface ResumeSessionControl {\n subtype: 'resume_session';\n /** Path to the session file to resume from */\n sessionFilePath: string;\n}\n\n/**\n * Control message sent to CLI\n */\nexport interface ControlInputMessage {\n type: JsonInputMessageType.CONTROL;\n control: InterruptControl | TruncateHistoryControl | ResumeSessionControl;\n session_id?: string;\n}\n\n/**\n * Union type for input messages\n */\nexport type JsonInputMessage = UserInputMessage | ControlInputMessage;\n\n/**\n * Hook configuration types (from Gemini CLI)\n */\nexport interface HookConfig {\n type: 'command';\n command: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n matcher?: string;\n sequential?: boolean;\n hooks: HookConfig[];\n}\n\nexport interface HooksConfiguration {\n BeforeTool?: HookDefinition[];\n AfterTool?: HookDefinition[];\n BeforeAgent?: HookDefinition[];\n AfterAgent?: HookDefinition[];\n BeforeModel?: HookDefinition[];\n AfterModel?: HookDefinition[];\n BeforeToolSelection?: HookDefinition[];\n Notification?: HookDefinition[];\n SessionStart?: HookDefinition[];\n SessionEnd?: HookDefinition[];\n PreCompress?: HookDefinition[];\n disabled?: string[];\n}\n\n/**\n * MCP Server configuration\n * Used to configure external MCP servers in Gemini CLI\n */\nexport interface MCPServerConfig {\n /** Command to start the MCP server (for stdio transport) */\n command?: string;\n\n /** Arguments for the command */\n args?: string[];\n\n /** Working directory */\n cwd?: string;\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /**\n * Transport type for URL-based connections\n * - 'http': Streamable HTTP transport (recommended for mcp-chrome)\n * - 'sse': Server-Sent Events transport\n * When not specified with url, defaults to 'http'\n */\n type?: 'http' | 'sse';\n\n /** URL for the MCP server (used with type field) */\n url?: string;\n\n /** URL for HTTP streaming transport (deprecated, use url with type: 'http') */\n httpUrl?: string;\n\n /** Custom headers for HTTP transports */\n headers?: Record<string, string>;\n\n /** Request timeout in milliseconds (default: 600000 = 10 minutes) */\n timeout?: number;\n\n /** When true, bypass all tool call confirmations for this server */\n trust?: boolean;\n\n /** List of tool names to include (allowlist) */\n includeTools?: string[];\n\n /** List of tool names to exclude */\n excludeTools?: string[];\n}\n\n/**\n * MCP Servers configuration map\n */\nexport type MCPServersConfig = Record<string, MCPServerConfig>;\n\n/**\n * Tools configuration for Gemini CLI settings.json\n * Used to configure custom tool discovery and execution commands\n */\nexport interface ToolsConfig {\n /**\n * Command to discover available tools\n * @example '\"node\" \"/path/to/discover-tools.cjs\"'\n */\n discoveryCommand?: string;\n\n /**\n * Command to call/execute a tool\n * @example '\"node\" \"/path/to/call-tool.cjs\"'\n */\n callCommand?: string;\n\n /**\n * Enable hooks for tool execution\n * Set to true when using hooks configuration\n */\n enableHooks?: boolean;\n}\n\n/**\n * Context configuration for Gemini CLI settings.json\n * Used to configure context file settings\n */\nexport interface ContextConfig {\n /**\n * Name of the context file (e.g., 'AOE.md')\n * Gemini CLI will look for this file in the working directory\n */\n fileName?: string;\n}\n\n/**\n * Options for GeminiStreamClient\n */\nexport interface GeminiStreamOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Path to Node.js executable (optional)\n * If not specified, uses 'node' from PATH\n * Useful for packaged Electron apps with bundled Node.js\n * @example '/Applications/MyApp.app/Contents/Resources/nodejs/node'\n * @default 'node'\n */\n pathToNode?: string;\n\n /**\n * Session ID for this client instance\n * Each client manages one session\n */\n sessionId: string;\n\n /**\n * Workspace ID (optional, for tracking)\n */\n workspaceId?: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * Approval mode for tool execution\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that are allowed to execute\n * If not specified, all tools are allowed\n * @example ['read_file', 'write_file', 'run_shell_command']\n */\n allowedTools?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Timeout for process initialization (ms)\n * @default 30000\n */\n initTimeout?: number;\n\n /**\n * Hooks configuration\n * Passed to Gemini CLI via temporary settings.json\n */\n hooks?: HooksConfiguration;\n\n /**\n * MCP Servers configuration\n * Configures external MCP servers for the CLI to connect to\n * Passed to Gemini CLI via settings.json mcpServers field\n *\n * @example\n * ```typescript\n * mcpServers: {\n * 'skill-sandbox': {\n * command: 'python',\n * args: ['-m', 'skill_mcp_server'],\n * env: {\n * SKILL_PATH: '/path/to/skill',\n * CONTENT_KEY: 'base64-encoded-key'\n * },\n * trust: true\n * }\n * }\n * ```\n */\n mcpServers?: MCPServersConfig;\n\n /**\n * Resume from a previous session file path\n * If provided, Gemini CLI will load the session history using --resume flag\n * @example '/path/to/session-2025-01-01T12-00-abc123.json'\n */\n resumeSessionFilePath?: string;\n\n /**\n * Custom logger implementation\n * If not provided, uses console with [GeminiStreamClient] prefix\n * Set to silentLogger to disable all logging\n *\n * @example\n * ```typescript\n * import { silentLogger, GeminiStreamClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiStreamClient({\n * logger: silentLogger, // Disable all logging\n * });\n * ```\n */\n logger?: Logger;\n\n /**\n * Tools configuration for Gemini CLI\n * Configures custom tool discovery and execution commands\n * Written to settings.json tools field\n *\n * @example\n * ```typescript\n * tools: {\n * discoveryCommand: '\"node\" \"/path/to/discover-tools.cjs\"',\n * callCommand: '\"node\" \"/path/to/call-tool.cjs\"',\n * enableHooks: true,\n * }\n * ```\n */\n tools?: ToolsConfig;\n\n /**\n * Context configuration for Gemini CLI\n * Configures context file settings\n * Written to settings.json context field\n *\n * @example\n * ```typescript\n * context: {\n * fileName: 'AOE.md',\n * }\n * ```\n */\n context?: ContextConfig;\n}\n","/**\n * Logger utility for Gemini CLI SDK\n *\n * Provides a configurable logging interface that can be customized by SDK consumers.\n * By default, logs go to console. Users can provide their own logger implementation.\n */\n\n/**\n * Log level enumeration\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4,\n}\n\n/**\n * Logger interface that SDK consumers can implement\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerOptions {\n /** Custom logger implementation */\n logger?: Logger;\n /** Minimum log level to output (default: INFO, or DEBUG if debug=true) */\n level?: LogLevel;\n /** Prefix for all log messages (e.g., '[GeminiSDK]') */\n prefix?: string;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (message: string, ...args: unknown[]) => console.log(message, ...args),\n info: (message: string, ...args: unknown[]) => console.log(message, ...args),\n warn: (message: string, ...args: unknown[]) => console.warn(message, ...args),\n error: (message: string, ...args: unknown[]) => console.error(message, ...args),\n};\n\n/**\n * Silent logger that outputs nothing\n */\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * SDK Logger class\n *\n * Wraps a logger implementation with level filtering and prefix support.\n *\n * @example\n * ```typescript\n * // Use default console logger\n * const logger = new SDKLogger({ level: LogLevel.DEBUG });\n *\n * // Use custom logger\n * const logger = new SDKLogger({\n * logger: myCustomLogger,\n * prefix: '[MyApp]',\n * });\n *\n * logger.debug('Debug message');\n * logger.error('Error occurred', { details: '...' });\n * ```\n */\nexport class SDKLogger implements Logger {\n private logger: Logger;\n private level: LogLevel;\n private prefix: string;\n\n constructor(options: LoggerOptions = {}) {\n this.logger = options.logger || consoleLogger;\n this.level = options.level ?? LogLevel.INFO;\n this.prefix = options.prefix || '';\n }\n\n /**\n * Update logger configuration\n */\n configure(options: Partial<LoggerOptions>): void {\n if (options.logger !== undefined) {\n this.logger = options.logger;\n }\n if (options.level !== undefined) {\n this.level = options.level;\n }\n if (options.prefix !== undefined) {\n this.prefix = options.prefix;\n }\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Set custom logger implementation\n */\n setLogger(logger: Logger): void {\n this.logger = logger;\n }\n\n private formatMessage(message: string): string {\n return this.prefix ? `${this.prefix} ${message}` : message;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n this.logger.debug(this.formatMessage(message), ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n this.logger.info(this.formatMessage(message), ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n this.logger.warn(this.formatMessage(message), ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n this.logger.error(this.formatMessage(message), ...args);\n }\n }\n}\n\n/**\n * Global SDK logger instance\n *\n * Used internally by SDK components. Can be configured by SDK consumers.\n *\n * @example\n * ```typescript\n * import { sdkLogger, LogLevel } from '@google/gemini-cli-sdk';\n *\n * // Configure global logger\n * sdkLogger.setLevel(LogLevel.DEBUG);\n * sdkLogger.setLogger(myCustomLogger);\n * ```\n */\nexport const sdkLogger = new SDKLogger({\n prefix: '[GeminiSDK]',\n level: LogLevel.INFO,\n});\n\n/**\n * Create a component-specific logger\n *\n * @param component - Component name for the prefix (e.g., 'GeminiStreamClient')\n * @param options - Logger options\n */\nexport function createLogger(component: string, options: LoggerOptions = {}): SDKLogger {\n return new SDKLogger({\n ...options,\n prefix: options.prefix || `[${component}]`,\n });\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\nimport { createLogger, LogLevel, type SDKLogger } from './logger.js';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt (no -- needed)\n args.push(prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions, logger: SDKLogger): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // Auto-detect Vertex AI mode by API key prefix\n // Vertex AI keys start with \"AQ.\" (e.g., AQ.Ab8RN6K...)\n // Standard Gemini API keys start with \"AI...\" (e.g., AIzaSy...)\n const isVertexAIKey = options.apiKey?.startsWith('AQ.');\n const useVertexAI = isVertexAIKey || env.GOOGLE_GENAI_USE_VERTEXAI === 'true';\n\n // API Key - Gemini CLI requires GEMINI_API_KEY (or GOOGLE_API_KEY for Vertex AI)\n if (options.apiKey) {\n if (useVertexAI) {\n // Vertex AI mode: use GOOGLE_API_KEY\n env.GOOGLE_API_KEY = options.apiKey;\n env.GOOGLE_GENAI_USE_VERTEXAI = 'true';\n logger.debug('Vertex AI mode: Setting GOOGLE_API_KEY:', options.apiKey.substring(0, 10) + '...');\n } else {\n // Standard mode: use GEMINI_API_KEY\n env.GEMINI_API_KEY = options.apiKey;\n logger.debug('Standard mode: Setting GEMINI_API_KEY:', options.apiKey.substring(0, 10) + '...');\n }\n }\n\n // Unset GOOGLE_API_KEY to prevent Gemini CLI from using it (unless using Vertex AI)\n // (Gemini CLI prefers GOOGLE_API_KEY over GEMINI_API_KEY when both are set)\n if (!useVertexAI && env.GOOGLE_API_KEY) {\n delete env.GOOGLE_API_KEY;\n logger.debug('Removed GOOGLE_API_KEY from environment (not using Vertex AI)');\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n logger.debug('Environment variables set:', {\n GEMINI_API_KEY: env.GEMINI_API_KEY ? '***' : undefined,\n GOOGLE_API_KEY: env.GOOGLE_API_KEY ? '***' : undefined,\n GOOGLE_GENAI_USE_VERTEXAI: env.GOOGLE_GENAI_USE_VERTEXAI,\n GEMINI_CONFIG_DIR: env.GEMINI_CONFIG_DIR,\n });\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Initialize logger\n const logger = createLogger('GeminiSDK', {\n logger: options.logger,\n level: options.debug ? LogLevel.DEBUG : LogLevel.INFO,\n });\n\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GEMINI_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GEMINI_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options, logger);\n const cwd = options.cwd || process.cwd();\n\n // Use custom Node.js path if provided, otherwise default to 'node'\n const nodeExecutable = options.pathToNode || 'node';\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn(nodeExecutable, [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n logger.error('stderr:', data.toString());\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n logger.debug('Failed to parse JSON line:', line);\n logger.debug('Parse error:', parseError);\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Handle permission request for tool execution\n if (event.type === JsonStreamEventType.TOOL_USE && this.options.onPermissionRequest) {\n const permissionRequest = {\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n timestamp: event.timestamp,\n };\n\n try {\n const decision = await this.options.onPermissionRequest(permissionRequest);\n\n // Emit permission decision event\n this.emit('permission', {\n request: permissionRequest,\n decision,\n });\n\n // Note: Since Gemini CLI has already executed the tool (approvalMode handling),\n // we can only log the decision here. To actually prevent execution,\n // use approvalMode='default' and handle stdin/stdout interaction.\n if (!decision.approved) {\n this.emit('warning', {\n type: JsonStreamEventType.ERROR,\n severity: 'warning',\n message: `Tool ${event.tool_name} was denied by permission callback but may have already executed`,\n timestamp: new Date().toISOString(),\n });\n }\n } catch (error) {\n this.emit('error', {\n message: `Permission callback error for tool ${event.tool_name}`,\n error,\n });\n // Continue processing even if permission callback fails\n }\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * GeminiStreamClient - Persistent stream-based client for Gemini CLI\n *\n * Architecture:\n * - 1 Client = 1 Node.js Process = 1 Session\n * - Communication via stdin/stdout JSONL\n * - Process stays alive for multiple message exchanges\n * - Similar to Claude Agent SDK's SubprocessCLITransport\n */\n\nimport { EventEmitter } from 'node:events';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport * as readline from 'node:readline';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Writable } from 'node:stream';\nimport {\n GeminiStreamOptions,\n JsonStreamEvent,\n JsonStreamEventType,\n JsonInputMessage,\n JsonInputMessageType,\n InitEvent,\n GeminiSDKError,\n ProcessStatus,\n} from './types.js';\nimport { createLogger, LogLevel, type SDKLogger } from './logger.js';\n\n/**\n * Events emitted by GeminiStreamClient\n */\nexport interface StreamClientEvents {\n /** JSON stream event from CLI */\n event: (event: JsonStreamEvent) => void;\n\n /** Process started */\n started: () => void;\n\n /** Process ready (INIT event received) */\n ready: (initEvent: InitEvent) => void;\n\n /** Process stopped */\n stopped: (code: number | null) => void;\n\n /** Error occurred */\n error: (error: Error) => void;\n}\n\nexport declare interface GeminiStreamClient {\n on<K extends keyof StreamClientEvents>(event: K, listener: StreamClientEvents[K]): this;\n emit<K extends keyof StreamClientEvents>(event: K, ...args: Parameters<StreamClientEvents[K]>): boolean;\n}\n\n/**\n * GeminiStreamClient\n *\n * Manages a persistent Gemini CLI process for stream-based communication.\n *\n * @example\n * ```typescript\n * const client = new GeminiStreamClient({\n * pathToGeminiCLI: './gemini.js',\n * sessionId: 'session-123',\n * apiKey: process.env.GEMINI_API_KEY,\n * });\n *\n * client.on('event', (event) => {\n * console.log('Event:', event);\n * });\n *\n * await client.start();\n * await client.sendMessage('Hello, Gemini!');\n * await client.stop();\n * ```\n */\nexport class GeminiStreamClient extends EventEmitter {\n private process: ChildProcess | null = null;\n private stdinStream: Writable | null = null;\n private readlineInterface: readline.Interface | null = null;\n private status: ProcessStatus = ProcessStatus.IDLE;\n private initEvent: InitEvent | null = null;\n private initTimeout: NodeJS.Timeout | null = null;\n private tempSettingsPath: string | null = null;\n private logger: SDKLogger;\n\n constructor(private options: GeminiStreamOptions) {\n super();\n\n // Initialize logger\n this.logger = createLogger('GeminiStreamClient', {\n logger: options.logger,\n level: options.debug ? LogLevel.DEBUG : LogLevel.INFO,\n });\n\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n if (!options.sessionId) {\n throw new GeminiSDKError('sessionId is required');\n }\n }\n\n /**\n * Start the Gemini CLI process\n */\n async start(): Promise<void> {\n if (this.process) {\n throw new GeminiSDKError('Process already started');\n }\n\n this.status = ProcessStatus.RUNNING;\n\n // Create settings.json if any settings options are configured\n if (this.options.hooks || this.options.mcpServers || this.options.tools || this.options.context) {\n await this.createTempSettings();\n }\n\n // Build command arguments\n const args = this.buildCommand();\n\n // Build environment variables\n const env = this.buildEnv();\n\n // Use custom Node.js path if provided, otherwise default to 'node'\n const nodeExecutable = this.options.pathToNode || 'node';\n\n // Spawn process\n this.process = spawn(nodeExecutable, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: this.options.cwd || process.cwd(),\n env,\n });\n\n // Handle process events\n this.process.on('exit', (code, signal) => {\n this.handleProcessExit(code, signal);\n });\n\n this.process.on('error', (error) => {\n this.handleProcessError(error);\n });\n\n // Setup stdin stream\n if (this.process.stdin) {\n this.stdinStream = this.process.stdin;\n // CRITICAL: Set encoding to prevent stdin from auto-closing\n this.stdinStream.setDefaultEncoding('utf-8');\n // IMPORTANT: Don't end stdin prematurely - keep it alive\n // The readline loop in CLI will wait for messages\n } else {\n throw new GeminiSDKError('Failed to get stdin stream');\n }\n\n // Setup stdout readline interface\n if (this.process.stdout) {\n this.readlineInterface = readline.createInterface({\n input: this.process.stdout,\n terminal: false, // CRITICAL: Non-terminal mode for JSONL\n });\n\n // Start reading events\n this.startReadLoop();\n } else {\n throw new GeminiSDKError('Failed to get stdout stream');\n }\n\n // Handle stderr (always process to prevent mixing with stdout)\n if (this.process.stderr) {\n this.process.stderr.on('data', (chunk) => {\n const message = chunk.toString().trim();\n // Skip informational messages that are not real errors\n if (!message || message.includes('Flushing log events')) {\n return;\n }\n // Log actual errors/warnings\n this.logger.error('stderr:', message);\n });\n }\n\n this.emit('started');\n\n // Wait for INIT event\n await this.waitForInit();\n }\n\n /**\n * Send a user message to the CLI\n * @param content - User message content\n * @param temporarySystemInstruction - Optional temporary system instruction to append for this request only\n */\n async sendMessage(content: string, temporarySystemInstruction?: string): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.USER,\n content,\n session_id: this.options.sessionId,\n temporary_system_instruction: temporarySystemInstruction,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Send an interrupt control command\n */\n async interrupt(): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'interrupt',\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Truncate chat history from a specific index\n *\n * This sends a control message to the CLI to:\n * 1. Truncate in-memory history (via GeminiChat.setHistory())\n * 2. Sync to session.json file (via ChatRecordingService)\n *\n * Used for edit/retry functionality where subsequent messages need to be discarded.\n *\n * @param fromIndex - Index from which to truncate (0-based, inclusive)\n */\n async truncateHistory(fromIndex: number): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n if (fromIndex < 0) {\n throw new GeminiSDKError('fromIndex must be non-negative');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'truncate_history',\n fromIndex,\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Resume session from a session file\n *\n * This sends a control message to the CLI to:\n * 1. Load history from the specified session file\n * 2. Update the ChatRecordingService to use the session file\n *\n * Used when a warm pool adapter is assigned to a real session that has history.\n *\n * @param sessionFilePath - Path to the session file to resume from\n */\n async resumeSession(sessionFilePath: string): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n if (!sessionFilePath) {\n throw new GeminiSDKError('sessionFilePath is required');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'resume_session',\n sessionFilePath,\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Stop the CLI process\n */\n async stop(timeout: number = 5000): Promise<void> {\n if (!this.process) {\n return;\n }\n\n // Clear init timeout if exists\n if (this.initTimeout) {\n clearTimeout(this.initTimeout);\n this.initTimeout = null;\n }\n\n // Close stdin to signal graceful shutdown\n if (this.stdinStream) {\n this.stdinStream.end();\n this.stdinStream = null;\n }\n\n // Close readline interface\n if (this.readlineInterface) {\n this.readlineInterface.close();\n this.readlineInterface = null;\n }\n\n // Wait for process to exit (with timeout)\n await Promise.race([\n new Promise<void>((resolve) => {\n if (this.process) {\n this.process.once('exit', () => resolve());\n } else {\n resolve();\n }\n }),\n new Promise<void>((resolve) => setTimeout(resolve, timeout)),\n ]);\n\n // Force kill if still running\n if (this.process && !this.process.killed) {\n this.process.kill('SIGTERM');\n\n // Wait a bit more\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // SIGKILL if still not dead\n if (this.process && !this.process.killed) {\n this.process.kill('SIGKILL');\n }\n }\n\n this.process = null;\n this.status = ProcessStatus.COMPLETED;\n\n // Clean up temporary settings file\n if (this.tempSettingsPath) {\n try {\n fs.unlinkSync(this.tempSettingsPath);\n this.logger.debug('Cleaned up temp settings:', this.tempSettingsPath);\n } catch (error) {\n this.logger.error('Failed to clean up temp settings:', error);\n }\n this.tempSettingsPath = null;\n }\n }\n\n /**\n * Check if client is ready to send messages\n */\n isReady(): boolean {\n return this.status === ProcessStatus.RUNNING && this.initEvent !== null;\n }\n\n /**\n * Get current status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get init event (contains session_id, model, etc.)\n */\n getInitEvent(): InitEvent | null {\n return this.initEvent;\n }\n\n /**\n * Get process PID\n */\n getPid(): number | undefined {\n return this.process?.pid;\n }\n\n /**\n * Create settings.json in GEMINI_CONFIG_DIR for hooks and MCP servers configuration\n *\n * Note: Gemini CLI does not support --settings-file parameter.\n * Instead, it loads settings from GEMINI_CONFIG_DIR/settings.json\n * where GEMINI_CONFIG_DIR is set via environment variable.\n *\n * This method merges with existing settings.json if present, preserving\n * any configuration written by the host application (e.g., tools.discoveryCommand).\n */\n private async createTempSettings(): Promise<void> {\n // Get GEMINI_CONFIG_DIR from options.env\n const geminiConfigDir = this.options.env?.GEMINI_CONFIG_DIR;\n\n if (!geminiConfigDir) {\n throw new GeminiSDKError(\n 'GEMINI_CONFIG_DIR is required in options.env when using hooks, mcpServers, tools, or context. ' +\n 'Please set options.env.GEMINI_CONFIG_DIR to a directory path.'\n );\n }\n\n // Ensure the directory exists\n if (!fs.existsSync(geminiConfigDir)) {\n fs.mkdirSync(geminiConfigDir, { recursive: true });\n this.logger.debug('Created config directory:', geminiConfigDir);\n }\n\n // Write settings.json to GEMINI_CONFIG_DIR\n this.tempSettingsPath = path.join(geminiConfigDir, 'settings.json');\n\n // Read existing settings if present (to merge with)\n let existingSettings: Record<string, unknown> = {};\n if (fs.existsSync(this.tempSettingsPath)) {\n try {\n const content = fs.readFileSync(this.tempSettingsPath, 'utf-8');\n existingSettings = JSON.parse(content);\n this.logger.debug('Read existing settings:', JSON.stringify(existingSettings, null, 2));\n } catch (error) {\n this.logger.warn('Failed to read existing settings.json, will overwrite:', error);\n }\n }\n\n // Merge with existing settings\n const settings: Record<string, unknown> = { ...existingSettings };\n\n // Add tools configuration if provided\n if (this.options.tools || this.options.hooks) {\n const existingTools = (settings.tools as Record<string, unknown>) || {};\n settings.tools = {\n ...existingTools,\n ...this.options.tools,\n // enableHooks is set to true if hooks are configured\n ...(this.options.hooks ? { enableHooks: true } : {}),\n };\n }\n\n // Add hooks configuration if provided\n if (this.options.hooks) {\n settings.hooks = this.options.hooks;\n }\n\n // Add context configuration if provided\n if (this.options.context) {\n settings.context = this.options.context;\n }\n\n // Add MCP servers configuration if provided\n if (this.options.mcpServers) {\n settings.mcpServers = this.options.mcpServers;\n }\n\n try {\n fs.writeFileSync(this.tempSettingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n this.logger.debug('Wrote settings to:', this.tempSettingsPath);\n this.logger.debug('Settings content:', JSON.stringify(settings, null, 2));\n } catch (error) {\n throw new GeminiSDKError(`Failed to write settings file: ${error}`);\n }\n }\n\n /**\n * Build CLI command arguments\n */\n private buildCommand(): string[] {\n const args = [\n this.options.pathToGeminiCLI,\n '--stream-json-input', // ← New flag we'll add to CLI\n '--output-format',\n 'stream-json',\n ];\n\n // Note: Do NOT use --settings-file as it's not supported by Gemini CLI\n // Settings are loaded from GEMINI_CONFIG_DIR/settings.json instead\n\n // Resume from previous session file\n if (this.options.resumeSessionFilePath) {\n args.push('--resume-from-file', this.options.resumeSessionFilePath);\n this.logger.debug('Resuming from session file:', this.options.resumeSessionFilePath);\n }\n\n // Model\n if (this.options.model) {\n args.push('--model', this.options.model);\n }\n\n // Approval mode\n if (this.options.approvalMode) {\n args.push('--approval-mode', this.options.approvalMode);\n }\n\n // Debug mode\n if (this.options.debug) {\n args.push('--debug');\n }\n\n return args;\n }\n\n /**\n * Build environment variables\n */\n private buildEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...this.options.env,\n };\n\n // Set API key if provided\n if (this.options.apiKey) {\n // For Vertex AI mode, use GOOGLE_API_KEY\n // For Google AI Studio, use GEMINI_API_KEY\n const useVertexAI = this.options.env?.GOOGLE_GENAI_USE_VERTEXAI === 'true';\n\n this.logger.debug('buildEnv() - API Key prefix:', this.options.apiKey.substring(0, 3));\n this.logger.debug('buildEnv() - GOOGLE_GENAI_USE_VERTEXAI:', this.options.env?.GOOGLE_GENAI_USE_VERTEXAI);\n this.logger.debug('buildEnv() - useVertexAI:', useVertexAI);\n\n if (useVertexAI) {\n env.GOOGLE_API_KEY = this.options.apiKey;\n this.logger.debug('buildEnv() - Setting GOOGLE_API_KEY for Vertex AI');\n } else {\n env.GEMINI_API_KEY = this.options.apiKey;\n this.logger.debug('buildEnv() - Setting GEMINI_API_KEY for AI Studio');\n }\n }\n\n this.logger.debug('buildEnv() - Final env has GOOGLE_API_KEY:', !!env.GOOGLE_API_KEY);\n this.logger.debug('buildEnv() - Final env has GEMINI_API_KEY:', !!env.GEMINI_API_KEY);\n this.logger.debug('buildEnv() - Final env GOOGLE_GENAI_USE_VERTEXAI:', env.GOOGLE_GENAI_USE_VERTEXAI);\n\n return env;\n }\n\n /**\n * Write a JSON message to stdin\n */\n private writeMessage(message: JsonInputMessage): void {\n if (!this.stdinStream) {\n throw new GeminiSDKError('stdin stream not available');\n }\n\n const json = JSON.stringify(message);\n this.logger.debug('Writing message to stdin:', json.substring(0, 100));\n\n const success = this.stdinStream.write(json + '\\n', (error) => {\n if (error) {\n this.logger.error('Write error:', error);\n } else {\n this.logger.debug('Write callback: message flushed to stdin');\n }\n });\n\n this.logger.debug('Write success:', success, 'Stream writable:', this.stdinStream.writable);\n }\n\n /**\n * Start reading JSONL events from stdout\n */\n private startReadLoop(): void {\n if (!this.readlineInterface) {\n return;\n }\n\n this.readlineInterface.on('line', (line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n return;\n }\n\n // Skip debug output lines (e.g., [MESSAGE_BUS], [PolicyEngine], etc.)\n if (trimmed.startsWith('[')) {\n return;\n }\n\n try {\n const event = JSON.parse(trimmed) as JsonStreamEvent;\n this.handleEvent(event);\n } catch (error) {\n this.logger.error('Failed to parse JSON:', trimmed);\n this.logger.error('Error:', error);\n }\n });\n\n this.readlineInterface.on('close', () => {\n // stdout closed - no need to log\n });\n }\n\n /**\n * Handle a JSON stream event\n */\n private handleEvent(event: JsonStreamEvent): void {\n // Capture INIT event\n if (event.type === JsonStreamEventType.INIT) {\n this.initEvent = event as InitEvent;\n\n // Clear init timeout\n if (this.initTimeout) {\n clearTimeout(this.initTimeout);\n this.initTimeout = null;\n }\n\n this.emit('ready', this.initEvent);\n }\n\n // Emit event to listeners\n this.emit('event', event);\n }\n\n /**\n * Wait for INIT event\n */\n private async waitForInit(): Promise<void> {\n const timeout = this.options.initTimeout || 30000;\n\n return new Promise((resolve, reject) => {\n // Already initialized?\n if (this.initEvent) {\n resolve();\n return;\n }\n\n // Set timeout\n this.initTimeout = setTimeout(() => {\n reject(new GeminiSDKError('Initialization timeout', undefined, { timeout }));\n }, timeout);\n\n // Wait for ready event\n this.once('ready', () => {\n resolve();\n });\n\n // Or error\n this.once('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Handle process exit\n */\n private handleProcessExit(code: number | null, signal: NodeJS.Signals | null): void {\n this.logger.debug('Process exited:', { code, signal });\n\n if (code !== 0 && code !== null) {\n this.status = ProcessStatus.ERROR;\n this.emit('error', new GeminiSDKError(`Process exited with code ${code}`, code));\n } else {\n this.status = ProcessStatus.COMPLETED;\n }\n\n this.emit('stopped', code);\n\n // Cleanup\n this.process = null;\n this.stdinStream = null;\n if (this.readlineInterface) {\n this.readlineInterface.close();\n this.readlineInterface = null;\n }\n }\n\n /**\n * Handle process error\n */\n private handleProcessError(error: Error): void {\n this.logger.error('Process error:', error);\n this.status = ProcessStatus.ERROR;\n this.emit('error', error);\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { sdkLogger } from './logger.js';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n sdkLogger.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/logger.ts","../src/query.ts","../src/client.ts","../src/streamClient.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus","JsonInputMessageType","LogLevel","spawn","readline","EventEmitter","readline2","fs","path","fs2","path2"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKO,IAAK,mBAAA,qBAAAA,oBAAAA,KAAL;AAEL,EAAAA,qBAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,qBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,qBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,qBAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,qBAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,qBAAA,QAAA,CAAA,GAAS,QAAA;AAIT,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,qBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,qBAAA,YAAA,CAAA,GAAa,YAAA;AAjCH,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAwNL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AAEL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,sBAAmB,GAAA,CAAA,GAAnB,kBAAA;AAXU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAiBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AAGZ,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AAGZ,EAAAA,eAAA,OAAA,CAAA,GAAQ,OAAA;AAdE,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAoBL,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,KAAA,CAAM;AAAA,EACxC,WAAA,CACE,OAAA,EACO,IAAA,EACA,OAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAEZ,IAAA,IAAI,OAAQ,KAAA,CAAc,iBAAA,KAAsB,UAAA,EAAY;AAC1D,MAAC,KAAA,CAAc,iBAAA,CAAkB,IAAA,EAAM,eAAc,CAAA;AAAA,IACvD;AAAA,EACF;AACF;AA2CO,IAAK,oBAAA,qBAAAC,qBAAAA,KAAL;AAEL,EAAAA,sBAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,sBAAA,SAAA,CAAA,GAAU,SAAA;AALA,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;;;AC/cL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AALU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAiCZ,IAAM,aAAA,GAAwB;AAAA,EAC5B,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,QAAQ,GAAA,CAAI,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,QAAQ,GAAA,CAAI,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,QAAQ,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC5E,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,QAAQ,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI;AAChF,CAAA;AAKO,IAAM,YAAA,GAAuB;AAAA,EAClC,OAAO,MAAM;AAAA,EAAC,CAAA;AAAA,EACd,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,OAAO,MAAM;AAAA,EAAC;AAChB;AAsBO,IAAM,YAAN,MAAkC;AAAA,EAC/B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,aAAA;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,EAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAuC;AAC/C,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACvB;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEQ,cAAc,OAAA,EAAyB;AAC7C,IAAA,OAAO,KAAK,MAAA,GAAS,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,OAAA;AAAA,EACrD;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,cAAgB;AAChC,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA,CAAK,cAAc,OAAO,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,aAAe;AAC/B,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,cAAc,OAAO,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,aAAe;AAC/B,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,cAAc,OAAO,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,cAAgB;AAChC,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA,CAAK,cAAc,OAAO,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,IACxD;AAAA,EACF;AACF;AAgBO,IAAM,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,EACrC,MAAA,EAAQ,aAAA;AAAA,EACR,KAAA,EAAO,CAAA;AACT,CAAC;AAQM,SAAS,YAAA,CAAa,SAAA,EAAmB,OAAA,GAAyB,EAAC,EAAc;AACtF,EAAA,OAAO,IAAI,SAAA,CAAU;AAAA,IACnB,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,GACxC,CAAA;AACH;;;ACpKA,SAAS,YAAA,CAAa,SAAwB,MAAA,EAA0B;AACtE,EAAA,MAAM,OAAiB,EAAC;AAGxB,EAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,aAAa,CAAA;AAG1C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,OAAA,CAAQ,YAAY,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,OAAA,CAAQ,qBAAA,IAAyB,OAAA,CAAQ,qBAAA,CAAsB,SAAS,CAAA,EAAG;AAC7E,IAAA,IAAA,CAAK,KAAK,4BAAA,EAA8B,OAAA,CAAQ,qBAAA,CAAsB,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,eAAe,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,OAAA,CAAQ,kBAAA,IAAsB,OAAA,CAAQ,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,KAAK,uBAAA,EAAyB,OAAA,CAAQ,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACzE;AAGA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAGA,EAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAEhB,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,QAAA,CAAS,SAAwB,MAAA,EAAsC;AAC9E,EAAA,MAAM,GAAA,GAAyB;AAAA,IAC7B,GAAG,OAAA,CAAQ,GAAA;AAAA,IACX,GAAG,OAAA,CAAQ;AAAA,GACb;AAKA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,EAAQ,UAAA,CAAW,KAAK,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,aAAA,IAAiB,GAAA,CAAI,yBAAA,KAA8B,MAAA;AAGvE,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,GAAA,CAAI,iBAAiB,OAAA,CAAQ,MAAA;AAC7B,MAAA,GAAA,CAAI,yBAAA,GAA4B,MAAA;AAChC,MAAA,MAAA,CAAO,KAAA,CAAM,2CAA2C,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG,EAAE,IAAI,KAAK,CAAA;AAAA,IACjG,CAAA,MAAO;AAEL,MAAA,GAAA,CAAI,iBAAiB,OAAA,CAAQ,MAAA;AAC7B,MAAA,MAAA,CAAO,KAAA,CAAM,0CAA0C,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG,EAAE,IAAI,KAAK,CAAA;AAAA,IAChG;AAAA,EACF;AAIA,EAAA,IAAI,CAAC,WAAA,IAAe,GAAA,CAAI,cAAA,EAAgB;AACtC,IAAA,OAAO,GAAA,CAAI,cAAA;AACX,IAAA,MAAA,CAAO,MAAM,+DAA+D,CAAA;AAAA,EAC9E;AAGA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AACZ,IAAA,MAAA,CAAO,MAAM,4BAAA,EAA8B;AAAA,MACzC,cAAA,EAAgB,GAAA,CAAI,cAAA,GAAiB,KAAA,GAAQ,MAAA;AAAA,MAC7C,cAAA,EAAgB,GAAA,CAAI,cAAA,GAAiB,KAAA,GAAQ,MAAA;AAAA,MAC7C,2BAA2B,GAAA,CAAI,yBAAA;AAAA,MAC/B,mBAAmB,GAAA,CAAI;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,GAAA;AACT;AA0BA,gBAAuB,KAAA,CACrB,QACA,OAAA,EACiC;AAEjC,EAAA,MAAM,MAAA,GAAS,aAAa,WAAA,EAAa;AAAA,IACvC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA,GAAA,CAAA,eAAA,CAAA;AAAA,GAChB,CAAA;AAGD,EAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,IAAA,MAAM,IAAI,eAAe,6BAA6B,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAClD,IAAA,MAAM,IAAI,cAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAGvC,EAAA,MAAM,cAAA,GAAiB,QAAQ,UAAA,IAAc,MAAA;AAG7C,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgBC,oBAAM,cAAA,EAAgB,CAAC,QAAQ,eAAA,EAAiB,GAAG,IAAI,CAAA,EAAG;AAAA,MACxE,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9B,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,oCAAA,EAAsC,MAAA,EAAW,KAAK,CAAA;AAAA,EACjF;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,aAAA,CAAc,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACjD,IAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,IAAA,MAAA,CAAO,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,EACzC,CAAC,CAAA;AAGD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,IAC9B,CAAA,EAAG,QAAQ,OAAO,CAAA;AAAA,EACpB;AAGA,EAAA,MAAM,KAAcC,mBAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,OAAO,aAAA,CAAc,MAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI;AAEF,IAAA,WAAA,MAAiB,QAAQ,EAAA,EAAI;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,MAAM,KAAA;AAAA,MACR,SAAS,UAAA,EAAY;AAEnB,QAAA,MAAA,CAAO,KAAA,CAAM,8BAA8B,IAAI,CAAA;AAC/C,QAAA,MAAA,CAAO,KAAA,CAAM,gBAAgB,UAAU,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,uCAAA,EAAyC,MAAA,EAAW,KAAK,CAAA;AAAA,EACpF,CAAA,SAAE;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,MAAM,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AAC9D,IAAA,aAAA,CAAc,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA;AAAA,UACE,IAAI,cAAA;AAAA,YACF,6CAA6C,MAAM,CAAA,CAAA;AAAA,YAAA,GAAA;AAAA;AAErD,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,IAAA,CAAA,qBAA8B;AAAA,MACxC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,aAAA,CAAc,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACnC,MAAA,MAAA,CAAO,IAAI,cAAA,CAAe,0BAAA,EAA4B,MAAA,EAAW,KAAK,CAAC,CAAA;AAAA,IACzE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,IAAI,QAAA,KAAA,CAAA,gBAA+B;AACjC,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AAC1D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,4BAAA,EAA+B,QAAQ,CAAA,EAAG,YAAA,GAAe;AAAA,EAAK,YAAY,KAAK,EAAE,CAAA,CAAA;AAAA,MACjF,QAAA;AAAA,MACA,EAAE,QAAQ,YAAA;AAAa,KACzB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AAC1D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,oCAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,QAAQ,YAAA;AAAa,KACzB;AAAA,EACF;AACF;AChOO,IAAM,YAAA,GAAN,cAA2BC,mBAAA,CAAa;AAAA,EAI7C,YAAoB,OAAA,EAAwB;AAC1C,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAEpB;AAAA,EALQ,MAAA,GAAA,MAAA;AAAA,EACA,gBAAA,GAAkC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY1C,OAAO,OAAO,MAAA,EAAiD;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAA,SAAA;AACL,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAErD,QAAA,IAAI,MAAM,IAAA,KAAA,MAAA,aAAmC;AAC3C,UAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,UAAA;AAC9B,UAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,QACvC;AAGA,QAAA,IAAI,KAAA,CAAM,IAAA,KAAA,UAAA,mBAAyC,IAAA,CAAK,OAAA,CAAQ,mBAAA,EAAqB;AACnF,UAAA,MAAM,iBAAA,GAAoB;AAAA,YACxB,QAAQ,KAAA,CAAM,OAAA;AAAA,YACd,UAAU,KAAA,CAAM,SAAA;AAAA,YAChB,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,WAAW,KAAA,CAAM;AAAA,WACnB;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAoB,iBAAiB,CAAA;AAGzE,YAAA,IAAA,CAAK,KAAK,YAAA,EAAc;AAAA,cACtB,OAAA,EAAS,iBAAA;AAAA,cACT;AAAA,aACD,CAAA;AAKD,YAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,cAAA,IAAA,CAAK,KAAK,SAAA,EAAW;AAAA,gBACnB,IAAA,EAAA,OAAA;AAAA,gBACA,QAAA,EAAU,SAAA;AAAA,gBACV,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,gEAAA,CAAA;AAAA,gBAChC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,eACnC,CAAA;AAAA,YACH;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,KAAK,OAAA,EAAS;AAAA,cACjB,OAAA,EAAS,CAAA,mCAAA,EAAsC,KAAA,CAAM,SAAS,CAAA,CAAA;AAAA,cAC9D;AAAA,aACD,CAAA;AAAA,UAEH;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAGxB,QAAA,MAAM,KAAA;AAGN,QAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAAqC;AAC7C,UAAA,IAAA,CAAK,MAAA,GACH,MAAM,MAAA,KAAW,SAAA,GAAA,WAAA,mBAAA,OAAA;AACnB,UAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,GAAA,OAAA;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,MAAA,EAAsC;AAChD,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,SAAA,EAAW,EAAA;AAAA,MACX,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAQvB;AAEF,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7C,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAA,MAAA;AACE,UAAA,MAAA,CAAO,YAAY,KAAA,CAAM,UAAA;AACzB,UAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACrB,UAAA;AAAA,QAEF,KAAA,SAAA;AACE,UAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,YAAA,MAAA,CAAO,YAAY,KAAA,CAAM,OAAA;AAAA,UAC3B;AACA,UAAA;AAAA,QAEF,KAAA,UAAA;AACE,UAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAA,EAAS;AAAA,YAC9B,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,YAAY,KAAA,CAAM;AAAA,WACnB,CAAA;AACD,UAAA;AAAA,QAEF,KAAA,aAAA;AACE,UAAA;AACE,YAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/C,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,QAAA,CAAS,MAAA,GAAS,KAAA;AAClB,cAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,gBACpB,WAAW,QAAA,CAAS,SAAA;AAAA,gBACpB,SAAS,QAAA,CAAS,OAAA;AAAA,gBAClB,YAAY,QAAA,CAAS,UAAA;AAAA,gBACrB,MAAA,EAAQ;AAAA,kBACN,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,OAAO,KAAA,CAAM;AAAA;AACf,eACD,CAAA;AAAA,YACH;AAAA,UACF;AACA,UAAA;AAAA,QAEF,KAAA,QAAA;AACE,UAAA,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AACtB,UAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACrB,UAAA,IAAI,MAAM,KAAA,EAAO;AACf,YAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AAAA,UACvB;AACA,UAAA;AAAA,QAEF,KAAA,OAAA;AAEE,UAAA,IAAA,CAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAC1B,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAuC;AAChD,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAsC;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC3B;AACF;ACnKO,IAAM,kBAAA,GAAN,cAAiCA,mBAAAA,CAAa;AAAA,EAUnD,YAAoB,OAAA,EAA8B;AAChD,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAIlB,IAAA,IAAA,CAAK,MAAA,GAAS,aAAa,oBAAA,EAAsB;AAAA,MAC/C,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA,GAAA,CAAA,eAAA,CAAA;AAAA,KAChB,CAAA;AAGD,IAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAI,eAAe,6BAA6B,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,eAAe,uBAAuB,CAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAzBQ,OAAA,GAA+B,IAAA;AAAA,EAC/B,WAAA,GAA+B,IAAA;AAAA,EAC/B,iBAAA,GAA+C,IAAA;AAAA,EAC/C,MAAA,GAAA,MAAA;AAAA,EACA,SAAA,GAA8B,IAAA;AAAA,EAC9B,WAAA,GAAqC,IAAA;AAAA,EACrC,gBAAA,GAAkC,IAAA;AAAA,EAClC,MAAA;AAAA;AAAA;AAAA;AAAA,EAuBR,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,eAAe,yBAAyB,CAAA;AAAA,IACpD;AAEA,IAAA,IAAA,CAAK,MAAA,GAAA,SAAA;AAGL,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AAC/F,MAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,IAChC;AAGA,IAAA,MAAM,IAAA,GAAO,KAAK,YAAA,EAAa;AAG/B,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAG1B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,MAAA;AAGlD,IAAA,IAAA,CAAK,OAAA,GAAUF,mBAAAA,CAAM,cAAA,EAAgB,IAAA,EAAM;AAAA,MACzC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9B,GAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAAA,MACrC;AAAA,KACD,CAAA;AAGD,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,MAAM,MAAA,KAAW;AACxC,MAAA,IAAA,CAAK,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAClC,MAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,IAC/B,CAAC,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,WAAA,GAAc,KAAK,OAAA,CAAQ,KAAA;AAEhC,MAAA,IAAA,CAAK,WAAA,CAAY,mBAAmB,OAAO,CAAA;AAAA,IAG7C,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,eAAe,4BAA4B,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,oBAA6BG,mBAAA,CAAA,eAAA,CAAgB;AAAA,QAChD,KAAA,EAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,QACpB,QAAA,EAAU;AAAA;AAAA,OACX,CAAA;AAGD,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,eAAe,6BAA6B,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACxC,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAS,CAAE,IAAA,EAAK;AAEtC,QAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAA,EAAW,OAAO,CAAA;AAAA,MACtC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAGnB,IAAA,MAAM,KAAK,WAAA,EAAY;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,CAAY,OAAA,EAAiB,0BAAA,EAAoD;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,MAAA,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA,EAAA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAY,KAAK,OAAA,CAAQ,SAAA;AAAA,MACzB,4BAAA,EAA8B;AAAA,KAChC;AAEA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA2B;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,MAAA,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA,EAAA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAA,EAAY,KAAK,OAAA,CAAQ;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,gBAAgB,OAAA,EAAoF;AACxG,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,MAAA,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAE/B,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,IAAI,eAAe,gCAAgC,CAAA;AAAA,MAC3D;AACA,MAAA,OAAA,GAAU,EAAE,OAAA,EAAS,kBAAA,EAAoB,SAAA,EAAW,OAAA,EAAQ;AAAA,IAC9D,CAAA,MAAA,IAAW,mBAAmB,OAAA,EAAS;AACrC,MAAA,IAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,eAAe,oCAAoC,CAAA;AAAA,MAC/D;AACA,MAAA,OAAA,GAAU,EAAE,OAAA,EAAS,kBAAA,EAAoB,aAAA,EAAe,QAAQ,aAAA,EAAc;AAAA,IAChF,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzB,QAAA,MAAM,IAAI,eAAe,gCAAgC,CAAA;AAAA,MAC3D;AACA,MAAA,OAAA,GAAU,EAAE,OAAA,EAAS,kBAAA,EAAoB,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IACxE;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA,EAAA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAY,KAAK,OAAA,CAAQ;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAc,eAAA,EAAwC;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,MAAA,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,eAAe,6BAA6B,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA,EAAA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,gBAAA;AAAA,QACT;AAAA,OACF;AAAA,MACA,UAAA,EAAY,KAAK,OAAA,CAAQ;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,eAAe,QAAA,EAAoE;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACnB,MAAA,MAAM,IAAI,eAAe,uCAAuC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,IAAA,EAAA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,iBAAA;AAAA,QACT;AAAA,OACF;AAAA,MACA,UAAA,EAAY,KAAK,OAAA,CAAQ;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,OAAA,GAAkB,GAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAGA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAGA,IAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,MACjB,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7B,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,MAAM,SAAS,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,MACD,IAAI,OAAA,CAAc,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,OAAO,CAAC;AAAA,KAC5D,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACxC,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AAG3B,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAGxD,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACxC,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAA,WAAA;AAGL,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAI;AACF,QAAGC,aAAA,CAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,IAAA,CAAK,gBAAgB,CAAA;AAAA,MACtE,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,KAAK,CAAA;AAAA,MAC9D;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAA,KAAA,SAAA,kBAAoC,IAAA,CAAK,SAAA,KAAc,IAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,OAAA,EAAS,GAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,kBAAA,GAAoC;AAEhD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,iBAAA;AAE1C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,IAAI,CAAIA,aAAA,CAAA,UAAA,CAAW,eAAe,CAAA,EAAG;AACnC,MAAGA,aAAA,CAAA,SAAA,CAAU,eAAA,EAAiB,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,eAAe,CAAA;AAAA,IAChE;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAwBC,gBAAA,CAAA,IAAA,CAAK,eAAA,EAAiB,eAAe,CAAA;AAGlE,IAAA,IAAI,mBAA4C,EAAC;AACjD,IAAA,IAAOD,aAAA,CAAA,UAAA,CAAW,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAaA,aAAA,CAAA,YAAA,CAAa,IAAA,CAAK,gBAAA,EAAkB,OAAO,CAAA;AAC9D,QAAA,gBAAA,GAAmB,IAAA,CAAK,MAAM,OAAO,CAAA;AACrC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAA,EAA2B,IAAA,CAAK,UAAU,gBAAA,EAAkB,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MACxF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,wDAAA,EAA0D,KAAK,CAAA;AAAA,MAClF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAoC,EAAE,GAAG,gBAAA,EAAiB;AAGhE,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,QAAQ,KAAA,EAAO;AAC5C,MAAA,MAAM,aAAA,GAAiB,QAAA,CAAS,KAAA,IAAqC,EAAC;AACtE,MAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,QACf,GAAG,aAAA;AAAA,QACH,GAAG,KAAK,OAAA,CAAQ,KAAA;AAAA;AAAA,QAEhB,GAAI,KAAK,OAAA,CAAQ,KAAA,GAAQ,EAAE,WAAA,EAAa,IAAA,KAAS;AAAC,OACpD;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,QAAA,CAAS,KAAA,GAAQ,KAAK,OAAA,CAAQ,KAAA;AAAA,IAChC;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,QAAA,CAAS,OAAA,GAAU,KAAK,OAAA,CAAQ,OAAA;AAAA,IAClC;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAC3B,MAAA,QAAA,CAAS,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAAA,IACrC;AAEA,IAAA,IAAI;AACF,MAAGA,aAAA,CAAA,aAAA,CAAc,KAAK,gBAAA,EAAkB,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAClF,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,IAAA,CAAK,gBAAgB,CAAA;AAC7D,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mBAAA,EAAqB,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,KAAK,OAAA,CAAQ,eAAA;AAAA,MACb,qBAAA;AAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAMA,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,YAAA,EAAc;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAA8B;AACpC,IAAA,MAAM,GAAA,GAAyB;AAAA,MAC7B,GAAG,OAAA,CAAQ,GAAA;AAAA,MACX,GAAG,KAAK,OAAA,CAAQ;AAAA,KAClB;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AAGvB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,yBAAA,KAA8B,MAAA;AAEpE,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,8BAAA,EAAgC,IAAA,CAAK,QAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AACrF,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,yCAAA,EAA2C,IAAA,CAAK,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACxG,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,WAAW,CAAA;AAE1D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,GAAA,CAAI,cAAA,GAAiB,KAAK,OAAA,CAAQ,MAAA;AAClC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mDAAmD,CAAA;AAAA,MACvE,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,cAAA,GAAiB,KAAK,OAAA,CAAQ,MAAA;AAClC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mDAAmD,CAAA;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,4CAAA,EAA8C,CAAC,CAAC,IAAI,cAAc,CAAA;AACpF,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,4CAAA,EAA8C,CAAC,CAAC,IAAI,cAAc,CAAA;AACpF,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mDAAA,EAAqD,GAAA,CAAI,yBAAyB,CAAA;AAEpG,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAA,EAAiC;AACpD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,eAAe,4BAA4B,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,2BAAA,EAA6B,KAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA;AAErE,IAAA,MAAM,UAAU,IAAA,CAAK,WAAA,CAAY,MAAM,IAAA,GAAO,IAAA,EAAM,CAAC,KAAA,KAAU;AAC7D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,KAAK,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0CAA0C,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,SAAS,kBAAA,EAAoB,IAAA,CAAK,YAAY,QAAQ,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAC1C,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,OAAO,CAAA;AAClD,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,KAAK,CAAA;AAAA,MACnC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAA,CAAG,OAAA,EAAS,MAAM;AAAA,IAEzC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAA8B;AAEhD,IAAA,IAAI,MAAM,IAAA,KAAA,MAAA,aAAmC;AAC3C,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAGjB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,MACrB;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,IACnC;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAA6B;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,WAAA,IAAe,GAAA;AAE5C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,WAAA,GAAc,WAAW,MAAM;AAClC,QAAA,MAAA,CAAO,IAAI,cAAA,CAAe,wBAAA,EAA0B,QAAW,EAAE,OAAA,EAAS,CAAC,CAAA;AAAA,MAC7E,GAAG,OAAO,CAAA;AAGV,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM;AACvB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAGD,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAC,KAAA,KAAU;AAC5B,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,MAAqB,MAAA,EAAqC;AAClF,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAErD,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,IAAA,EAAM;AAC/B,MAAA,IAAA,CAAK,MAAA,GAAA,OAAA;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,cAAA,CAAe,4BAA4B,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACjF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAAA,WAAA;AAAA,IACP;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAGzB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,KAAA,EAAoB;AAC7C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAkB,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,GAAA,OAAA;AACL,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC1B;AACF;ACjrBO,SAAS,aAAA,CAAc,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAW;AAEjE,EAAA,IAAI,OAAA,CAAQ,IAAI,eAAA,EAAiB;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,eAAA;AAC5B,IAAA,IAAOE,aAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,YAAiBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,SAAA,EAAW,YAAA,EAAc,UAAU,WAAW,CAAA;AAC/F,EAAA,IAAOD,aAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,GAAa,GAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,UAAA,GAAkBC,gBAAA,CAAA,IAAA;AAAA,MACtB,UAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAOD,aAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAiBC,yBAAQ,UAAU,CAAA;AACzC,IAAA,IAAI,cAAc,UAAA,EAAY;AAC9B,IAAA,UAAA,GAAa,SAAA;AAAA,EACf;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAQO,SAAS,eAAe,MAAA,EAA0B;AACvD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,cAAA;AAC3B,IAAA,OAAO,CAAC,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AACzB;AASO,SAAS,UAAU,MAAA,EAAyB;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,MAAM,YAAA,GAAe,sBAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAChC,IAAA,SAAA,CAAU,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,GAAG,EAAE,CAAA,EAAA,CAAA;AAAA,EACd;AACA,EAAA,IAAI,KAAK,GAAA,EAAO;AACd,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAK,CAAA;AACrC,EAAA,MAAM,OAAA,GAAA,CAAY,EAAA,GAAK,GAAA,GAAS,GAAA,EAAM,QAAQ,CAAC,CAAA;AAC/C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAC/B;AAQO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,OAAO,OAAO,cAAA,EAAe;AAC/B","file":"index.cjs","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\nimport type { Logger } from './logger.js';\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Path to Node.js executable (optional)\n * If not specified, uses 'node' from PATH\n * Useful for packaged Electron apps with bundled Node.js\n * @example '/Applications/MyApp.app/Contents/Resources/nodejs/node'\n * @default 'node'\n */\n pathToNode?: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n\n /**\n * Permission callback for tool execution\n * Called when a tool requires approval (when approvalMode is 'default')\n * Return true to approve, false to deny\n * If not provided, falls back to Gemini CLI's built-in approval mechanism\n */\n onPermissionRequest?: (request: ToolPermissionRequest) => Promise<ToolPermissionDecision>;\n\n /**\n * Custom logger implementation\n * If not provided, uses console with [GeminiSDK] prefix\n * Set to silentLogger to disable all logging\n *\n * @example\n * ```typescript\n * import { silentLogger } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello', {\n * logger: silentLogger, // Disable all logging\n * });\n * ```\n */\n logger?: Logger;\n}\n\n/**\n * Tool permission request\n */\nexport interface ToolPermissionRequest {\n /** Unique tool call ID */\n toolId: string;\n\n /** Tool name (e.g., 'write_file', 'run_shell_command') */\n toolName: string;\n\n /** Tool parameters */\n parameters: Record<string, unknown>;\n\n /** Timestamp of the request */\n timestamp: string;\n}\n\n/**\n * Tool permission decision from host application\n */\nexport interface ToolPermissionDecision {\n /** Whether to approve the tool execution */\n approved: boolean;\n\n /** Optional reason for the decision (for logging) */\n reason?: string;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n * Plus additional event types actually sent by CLI\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request (legacy) */\n TOOL_USE = 'tool_use',\n\n /** Tool call request (new format) */\n TOOL_CALL_REQUEST = 'tool_call_request',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Thought/reasoning process */\n THOUGHT = 'thought',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n\n // Additional event types actually sent by Gemini CLI\n /** Message content chunk (streaming) */\n CONTENT = 'content',\n\n /** Message completion with metadata */\n FINISHED = 'finished',\n\n /** Model information */\n MODEL_INFO = 'model_info',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n conversation_file_path?: string; // Added for AoE Desktop integration\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event (legacy format)\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool call request event (new format)\n */\nexport interface ToolCallRequestEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_CALL_REQUEST;\n value: {\n callId: string;\n name: string;\n args: Record<string, unknown>;\n isClientInitiated: boolean;\n prompt_id: string;\n };\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Thought summary containing subject and description\n */\nexport interface ThoughtSummary {\n subject: string;\n description?: string;\n}\n\n/**\n * Thought/reasoning event\n * Emitted by Gemini CLI when the model is thinking\n */\nexport interface ThoughtEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.THOUGHT;\n subject: string;\n description?: string;\n traceId?: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Content event (streaming message chunk)\n * This is the actual event type sent by Gemini CLI for message content\n */\nexport interface ContentEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.CONTENT;\n value: string;\n traceId?: string;\n}\n\n/**\n * Finished event (message completion with metadata)\n */\nexport interface FinishedEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.FINISHED;\n value: {\n reason: string;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n trafficType?: string;\n promptTokensDetails?: Array<{\n modality: string;\n tokenCount: number;\n }>;\n candidatesTokensDetails?: Array<{\n modality: string;\n tokenCount: number;\n }>;\n thoughtsTokenCount?: number;\n };\n };\n}\n\n/**\n * Model information event\n */\nexport interface ModelInfoEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MODEL_INFO;\n value: string;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolCallRequestEvent\n | ToolResultEvent\n | ThoughtEvent\n | ErrorEvent\n | ResultEvent\n | ContentEvent\n | FinishedEvent\n | ModelInfoEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n // captureStackTrace is available in V8 (Node.js) but not in all environments\n if (typeof (Error as any).captureStackTrace === 'function') {\n (Error as any).captureStackTrace(this, GeminiSDKError);\n }\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Input message types for Stream Client (SDK → CLI via stdin)\n */\nexport enum JsonInputMessageType {\n /** User message */\n USER = 'user',\n\n /** Control command */\n CONTROL = 'control',\n}\n\n/**\n * User message sent to CLI\n */\nexport interface UserInputMessage {\n type: JsonInputMessageType.USER;\n content: string;\n session_id?: string;\n /** Optional temporary system instruction to append for this request only */\n temporary_system_instruction?: string;\n}\n\n/**\n * Control subtypes for control messages\n */\nexport type ControlSubtype = 'interrupt' | 'cancel' | 'shutdown' | 'truncate_history' | 'resume_session' | 'replace_history';\n\n/**\n * Interrupt control - stop current processing\n */\nexport interface InterruptControl {\n subtype: 'interrupt' | 'cancel' | 'shutdown';\n}\n\n/**\n * Truncate history control - remove messages from a specific index or by user turn count\n * Used for edit/retry functionality\n *\n * Two modes:\n * - keepUserTurns: Semantic mode — keep N complete user turns (handles tool call Content items correctly)\n * - fromIndex: Raw mode — truncate from a specific Content[] index (legacy, doesn't account for tool calls)\n *\n * When both are provided, keepUserTurns takes precedence.\n */\nexport interface TruncateHistoryControl {\n subtype: 'truncate_history';\n /** Index from which to truncate (0-based, inclusive). Used when keepUserTurns is not set. */\n fromIndex?: number;\n /** Number of complete user turns to keep. The CLI scans its history to find the correct Content[] split point. */\n keepUserTurns?: number;\n}\n\n/**\n * Resume session control - load history from a session file\n * Used when warm pool adapter is assigned to a real session\n */\nexport interface ResumeSessionControl {\n subtype: 'resume_session';\n /** Path to the session file to resume from */\n sessionFilePath: string;\n}\n\n/**\n * Replace history control - fully replace CLI in-memory history\n * Used when messages are deleted from DB and CLI history needs to be rebuilt\n */\nexport interface ReplaceHistoryControl {\n subtype: 'replace_history';\n /** Full replacement history as Gemini Content[] format */\n contents: Array<{ role: string; parts: unknown[] }>;\n}\n\n/**\n * Control message sent to CLI\n */\nexport interface ControlInputMessage {\n type: JsonInputMessageType.CONTROL;\n control: InterruptControl | TruncateHistoryControl | ResumeSessionControl | ReplaceHistoryControl;\n session_id?: string;\n}\n\n/**\n * Union type for input messages\n */\nexport type JsonInputMessage = UserInputMessage | ControlInputMessage;\n\n/**\n * Hook configuration types (from Gemini CLI)\n */\nexport interface HookConfig {\n type: 'command';\n command: string;\n timeout?: number;\n}\n\nexport interface HookDefinition {\n matcher?: string;\n sequential?: boolean;\n hooks: HookConfig[];\n}\n\nexport interface HooksConfiguration {\n BeforeTool?: HookDefinition[];\n AfterTool?: HookDefinition[];\n BeforeAgent?: HookDefinition[];\n AfterAgent?: HookDefinition[];\n BeforeModel?: HookDefinition[];\n AfterModel?: HookDefinition[];\n BeforeToolSelection?: HookDefinition[];\n Notification?: HookDefinition[];\n SessionStart?: HookDefinition[];\n SessionEnd?: HookDefinition[];\n PreCompress?: HookDefinition[];\n disabled?: string[];\n}\n\n/**\n * MCP Server configuration\n * Used to configure external MCP servers in Gemini CLI\n */\nexport interface MCPServerConfig {\n /** Command to start the MCP server (for stdio transport) */\n command?: string;\n\n /** Arguments for the command */\n args?: string[];\n\n /** Working directory */\n cwd?: string;\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /**\n * Transport type for URL-based connections\n * - 'http': Streamable HTTP transport (recommended for mcp-chrome)\n * - 'sse': Server-Sent Events transport\n * When not specified with url, defaults to 'http'\n */\n type?: 'http' | 'sse';\n\n /** URL for the MCP server (used with type field) */\n url?: string;\n\n /** URL for HTTP streaming transport (deprecated, use url with type: 'http') */\n httpUrl?: string;\n\n /** Custom headers for HTTP transports */\n headers?: Record<string, string>;\n\n /** Request timeout in milliseconds (default: 600000 = 10 minutes) */\n timeout?: number;\n\n /** When true, bypass all tool call confirmations for this server */\n trust?: boolean;\n\n /** List of tool names to include (allowlist) */\n includeTools?: string[];\n\n /** List of tool names to exclude */\n excludeTools?: string[];\n}\n\n/**\n * MCP Servers configuration map\n */\nexport type MCPServersConfig = Record<string, MCPServerConfig>;\n\n/**\n * Tools configuration for Gemini CLI settings.json\n * Used to configure custom tool discovery and execution commands\n */\nexport interface ToolsConfig {\n /**\n * Command to discover available tools\n * @example '\"node\" \"/path/to/discover-tools.cjs\"'\n */\n discoveryCommand?: string;\n\n /**\n * Command to call/execute a tool\n * @example '\"node\" \"/path/to/call-tool.cjs\"'\n */\n callCommand?: string;\n\n /**\n * Enable hooks for tool execution\n * Set to true when using hooks configuration\n */\n enableHooks?: boolean;\n}\n\n/**\n * Context configuration for Gemini CLI settings.json\n * Used to configure context file settings\n */\nexport interface ContextConfig {\n /**\n * Name of the context file (e.g., 'AOE.md')\n * Gemini CLI will look for this file in the working directory\n */\n fileName?: string;\n}\n\n/**\n * Options for GeminiStreamClient\n */\nexport interface GeminiStreamOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Path to Node.js executable (optional)\n * If not specified, uses 'node' from PATH\n * Useful for packaged Electron apps with bundled Node.js\n * @example '/Applications/MyApp.app/Contents/Resources/nodejs/node'\n * @default 'node'\n */\n pathToNode?: string;\n\n /**\n * Session ID for this client instance\n * Each client manages one session\n */\n sessionId: string;\n\n /**\n * Workspace ID (optional, for tracking)\n */\n workspaceId?: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * Approval mode for tool execution\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that are allowed to execute\n * If not specified, all tools are allowed\n * @example ['read_file', 'write_file', 'run_shell_command']\n */\n allowedTools?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Timeout for process initialization (ms)\n * @default 30000\n */\n initTimeout?: number;\n\n /**\n * Hooks configuration\n * Passed to Gemini CLI via temporary settings.json\n */\n hooks?: HooksConfiguration;\n\n /**\n * MCP Servers configuration\n * Configures external MCP servers for the CLI to connect to\n * Passed to Gemini CLI via settings.json mcpServers field\n *\n * @example\n * ```typescript\n * mcpServers: {\n * 'skill-sandbox': {\n * command: 'python',\n * args: ['-m', 'skill_mcp_server'],\n * env: {\n * SKILL_PATH: '/path/to/skill',\n * CONTENT_KEY: 'base64-encoded-key'\n * },\n * trust: true\n * }\n * }\n * ```\n */\n mcpServers?: MCPServersConfig;\n\n /**\n * Custom logger implementation\n * If not provided, uses console with [GeminiStreamClient] prefix\n * Set to silentLogger to disable all logging\n *\n * @example\n * ```typescript\n * import { silentLogger, GeminiStreamClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiStreamClient({\n * logger: silentLogger, // Disable all logging\n * });\n * ```\n */\n logger?: Logger;\n\n /**\n * Tools configuration for Gemini CLI\n * Configures custom tool discovery and execution commands\n * Written to settings.json tools field\n *\n * @example\n * ```typescript\n * tools: {\n * discoveryCommand: '\"node\" \"/path/to/discover-tools.cjs\"',\n * callCommand: '\"node\" \"/path/to/call-tool.cjs\"',\n * enableHooks: true,\n * }\n * ```\n */\n tools?: ToolsConfig;\n\n /**\n * Context configuration for Gemini CLI\n * Configures context file settings\n * Written to settings.json context field\n *\n * @example\n * ```typescript\n * context: {\n * fileName: 'AOE.md',\n * }\n * ```\n */\n context?: ContextConfig;\n}\n","/**\n * Logger utility for Gemini CLI SDK\n *\n * Provides a configurable logging interface that can be customized by SDK consumers.\n * By default, logs go to console. Users can provide their own logger implementation.\n */\n\n/**\n * Log level enumeration\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4,\n}\n\n/**\n * Logger interface that SDK consumers can implement\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\n/**\n * Logger configuration options\n */\nexport interface LoggerOptions {\n /** Custom logger implementation */\n logger?: Logger;\n /** Minimum log level to output (default: INFO, or DEBUG if debug=true) */\n level?: LogLevel;\n /** Prefix for all log messages (e.g., '[GeminiSDK]') */\n prefix?: string;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (message: string, ...args: unknown[]) => console.log(message, ...args),\n info: (message: string, ...args: unknown[]) => console.log(message, ...args),\n warn: (message: string, ...args: unknown[]) => console.warn(message, ...args),\n error: (message: string, ...args: unknown[]) => console.error(message, ...args),\n};\n\n/**\n * Silent logger that outputs nothing\n */\nexport const silentLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * SDK Logger class\n *\n * Wraps a logger implementation with level filtering and prefix support.\n *\n * @example\n * ```typescript\n * // Use default console logger\n * const logger = new SDKLogger({ level: LogLevel.DEBUG });\n *\n * // Use custom logger\n * const logger = new SDKLogger({\n * logger: myCustomLogger,\n * prefix: '[MyApp]',\n * });\n *\n * logger.debug('Debug message');\n * logger.error('Error occurred', { details: '...' });\n * ```\n */\nexport class SDKLogger implements Logger {\n private logger: Logger;\n private level: LogLevel;\n private prefix: string;\n\n constructor(options: LoggerOptions = {}) {\n this.logger = options.logger || consoleLogger;\n this.level = options.level ?? LogLevel.INFO;\n this.prefix = options.prefix || '';\n }\n\n /**\n * Update logger configuration\n */\n configure(options: Partial<LoggerOptions>): void {\n if (options.logger !== undefined) {\n this.logger = options.logger;\n }\n if (options.level !== undefined) {\n this.level = options.level;\n }\n if (options.prefix !== undefined) {\n this.prefix = options.prefix;\n }\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Set custom logger implementation\n */\n setLogger(logger: Logger): void {\n this.logger = logger;\n }\n\n private formatMessage(message: string): string {\n return this.prefix ? `${this.prefix} ${message}` : message;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n this.logger.debug(this.formatMessage(message), ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n this.logger.info(this.formatMessage(message), ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n this.logger.warn(this.formatMessage(message), ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n this.logger.error(this.formatMessage(message), ...args);\n }\n }\n}\n\n/**\n * Global SDK logger instance\n *\n * Used internally by SDK components. Can be configured by SDK consumers.\n *\n * @example\n * ```typescript\n * import { sdkLogger, LogLevel } from '@google/gemini-cli-sdk';\n *\n * // Configure global logger\n * sdkLogger.setLevel(LogLevel.DEBUG);\n * sdkLogger.setLogger(myCustomLogger);\n * ```\n */\nexport const sdkLogger = new SDKLogger({\n prefix: '[GeminiSDK]',\n level: LogLevel.INFO,\n});\n\n/**\n * Create a component-specific logger\n *\n * @param component - Component name for the prefix (e.g., 'GeminiStreamClient')\n * @param options - Logger options\n */\nexport function createLogger(component: string, options: LoggerOptions = {}): SDKLogger {\n return new SDKLogger({\n ...options,\n prefix: options.prefix || `[${component}]`,\n });\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\nimport { createLogger, LogLevel, type SDKLogger } from './logger.js';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt (no -- needed)\n args.push(prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions, logger: SDKLogger): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // Auto-detect Vertex AI mode by API key prefix\n // Vertex AI keys start with \"AQ.\" (e.g., AQ.Ab8RN6K...)\n // Standard Gemini API keys start with \"AI...\" (e.g., AIzaSy...)\n const isVertexAIKey = options.apiKey?.startsWith('AQ.');\n const useVertexAI = isVertexAIKey || env.GOOGLE_GENAI_USE_VERTEXAI === 'true';\n\n // API Key - Gemini CLI requires GEMINI_API_KEY (or GOOGLE_API_KEY for Vertex AI)\n if (options.apiKey) {\n if (useVertexAI) {\n // Vertex AI mode: use GOOGLE_API_KEY\n env.GOOGLE_API_KEY = options.apiKey;\n env.GOOGLE_GENAI_USE_VERTEXAI = 'true';\n logger.debug('Vertex AI mode: Setting GOOGLE_API_KEY:', options.apiKey.substring(0, 10) + '...');\n } else {\n // Standard mode: use GEMINI_API_KEY\n env.GEMINI_API_KEY = options.apiKey;\n logger.debug('Standard mode: Setting GEMINI_API_KEY:', options.apiKey.substring(0, 10) + '...');\n }\n }\n\n // Unset GOOGLE_API_KEY to prevent Gemini CLI from using it (unless using Vertex AI)\n // (Gemini CLI prefers GOOGLE_API_KEY over GEMINI_API_KEY when both are set)\n if (!useVertexAI && env.GOOGLE_API_KEY) {\n delete env.GOOGLE_API_KEY;\n logger.debug('Removed GOOGLE_API_KEY from environment (not using Vertex AI)');\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n logger.debug('Environment variables set:', {\n GEMINI_API_KEY: env.GEMINI_API_KEY ? '***' : undefined,\n GOOGLE_API_KEY: env.GOOGLE_API_KEY ? '***' : undefined,\n GOOGLE_GENAI_USE_VERTEXAI: env.GOOGLE_GENAI_USE_VERTEXAI,\n GEMINI_CONFIG_DIR: env.GEMINI_CONFIG_DIR,\n });\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Initialize logger\n const logger = createLogger('GeminiSDK', {\n logger: options.logger,\n level: options.debug ? LogLevel.DEBUG : LogLevel.INFO,\n });\n\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GEMINI_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GEMINI_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options, logger);\n const cwd = options.cwd || process.cwd();\n\n // Use custom Node.js path if provided, otherwise default to 'node'\n const nodeExecutable = options.pathToNode || 'node';\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn(nodeExecutable, [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n logger.error('stderr:', data.toString());\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n logger.debug('Failed to parse JSON line:', line);\n logger.debug('Parse error:', parseError);\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Handle permission request for tool execution\n if (event.type === JsonStreamEventType.TOOL_USE && this.options.onPermissionRequest) {\n const permissionRequest = {\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n timestamp: event.timestamp,\n };\n\n try {\n const decision = await this.options.onPermissionRequest(permissionRequest);\n\n // Emit permission decision event\n this.emit('permission', {\n request: permissionRequest,\n decision,\n });\n\n // Note: Since Gemini CLI has already executed the tool (approvalMode handling),\n // we can only log the decision here. To actually prevent execution,\n // use approvalMode='default' and handle stdin/stdout interaction.\n if (!decision.approved) {\n this.emit('warning', {\n type: JsonStreamEventType.ERROR,\n severity: 'warning',\n message: `Tool ${event.tool_name} was denied by permission callback but may have already executed`,\n timestamp: new Date().toISOString(),\n });\n }\n } catch (error) {\n this.emit('error', {\n message: `Permission callback error for tool ${event.tool_name}`,\n error,\n });\n // Continue processing even if permission callback fails\n }\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * GeminiStreamClient - Persistent stream-based client for Gemini CLI\n *\n * Architecture:\n * - 1 Client = 1 Node.js Process = 1 Session\n * - Communication via stdin/stdout JSONL\n * - Process stays alive for multiple message exchanges\n * - Similar to Claude Agent SDK's SubprocessCLITransport\n */\n\nimport { EventEmitter } from 'node:events';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport * as readline from 'node:readline';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Writable } from 'node:stream';\nimport {\n GeminiStreamOptions,\n JsonStreamEvent,\n JsonStreamEventType,\n JsonInputMessage,\n JsonInputMessageType,\n InitEvent,\n GeminiSDKError,\n ProcessStatus,\n} from './types.js';\nimport { createLogger, LogLevel, type SDKLogger } from './logger.js';\n\n/**\n * Events emitted by GeminiStreamClient\n */\nexport interface StreamClientEvents {\n /** JSON stream event from CLI */\n event: (event: JsonStreamEvent) => void;\n\n /** Process started */\n started: () => void;\n\n /** Process ready (INIT event received) */\n ready: (initEvent: InitEvent) => void;\n\n /** Process stopped */\n stopped: (code: number | null) => void;\n\n /** Error occurred */\n error: (error: Error) => void;\n}\n\nexport declare interface GeminiStreamClient {\n on<K extends keyof StreamClientEvents>(event: K, listener: StreamClientEvents[K]): this;\n emit<K extends keyof StreamClientEvents>(event: K, ...args: Parameters<StreamClientEvents[K]>): boolean;\n}\n\n/**\n * GeminiStreamClient\n *\n * Manages a persistent Gemini CLI process for stream-based communication.\n *\n * @example\n * ```typescript\n * const client = new GeminiStreamClient({\n * pathToGeminiCLI: './gemini.js',\n * sessionId: 'session-123',\n * apiKey: process.env.GEMINI_API_KEY,\n * });\n *\n * client.on('event', (event) => {\n * console.log('Event:', event);\n * });\n *\n * await client.start();\n * await client.sendMessage('Hello, Gemini!');\n * await client.stop();\n * ```\n */\nexport class GeminiStreamClient extends EventEmitter {\n private process: ChildProcess | null = null;\n private stdinStream: Writable | null = null;\n private readlineInterface: readline.Interface | null = null;\n private status: ProcessStatus = ProcessStatus.IDLE;\n private initEvent: InitEvent | null = null;\n private initTimeout: NodeJS.Timeout | null = null;\n private tempSettingsPath: string | null = null;\n private logger: SDKLogger;\n\n constructor(private options: GeminiStreamOptions) {\n super();\n\n // Initialize logger\n this.logger = createLogger('GeminiStreamClient', {\n logger: options.logger,\n level: options.debug ? LogLevel.DEBUG : LogLevel.INFO,\n });\n\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n if (!options.sessionId) {\n throw new GeminiSDKError('sessionId is required');\n }\n }\n\n /**\n * Start the Gemini CLI process\n */\n async start(): Promise<void> {\n if (this.process) {\n throw new GeminiSDKError('Process already started');\n }\n\n this.status = ProcessStatus.RUNNING;\n\n // Create settings.json if any settings options are configured\n if (this.options.hooks || this.options.mcpServers || this.options.tools || this.options.context) {\n await this.createTempSettings();\n }\n\n // Build command arguments\n const args = this.buildCommand();\n\n // Build environment variables\n const env = this.buildEnv();\n\n // Use custom Node.js path if provided, otherwise default to 'node'\n const nodeExecutable = this.options.pathToNode || 'node';\n\n // Spawn process\n this.process = spawn(nodeExecutable, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: this.options.cwd || process.cwd(),\n env,\n });\n\n // Handle process events\n this.process.on('exit', (code, signal) => {\n this.handleProcessExit(code, signal);\n });\n\n this.process.on('error', (error) => {\n this.handleProcessError(error);\n });\n\n // Setup stdin stream\n if (this.process.stdin) {\n this.stdinStream = this.process.stdin;\n // CRITICAL: Set encoding to prevent stdin from auto-closing\n this.stdinStream.setDefaultEncoding('utf-8');\n // IMPORTANT: Don't end stdin prematurely - keep it alive\n // The readline loop in CLI will wait for messages\n } else {\n throw new GeminiSDKError('Failed to get stdin stream');\n }\n\n // Setup stdout readline interface\n if (this.process.stdout) {\n this.readlineInterface = readline.createInterface({\n input: this.process.stdout,\n terminal: false, // CRITICAL: Non-terminal mode for JSONL\n });\n\n // Start reading events\n this.startReadLoop();\n } else {\n throw new GeminiSDKError('Failed to get stdout stream');\n }\n\n // Handle stderr (always process to prevent mixing with stdout)\n if (this.process.stderr) {\n this.process.stderr.on('data', (chunk) => {\n const message = chunk.toString().trim();\n // Skip informational messages that are not real errors\n if (!message || message.includes('Flushing log events')) {\n return;\n }\n // Log actual errors/warnings\n this.logger.error('stderr:', message);\n });\n }\n\n this.emit('started');\n\n // Wait for INIT event\n await this.waitForInit();\n }\n\n /**\n * Send a user message to the CLI\n * @param content - User message content\n * @param temporarySystemInstruction - Optional temporary system instruction to append for this request only\n */\n async sendMessage(content: string, temporarySystemInstruction?: string): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.USER,\n content,\n session_id: this.options.sessionId,\n temporary_system_instruction: temporarySystemInstruction,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Send an interrupt control command\n */\n async interrupt(): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'interrupt',\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Truncate chat history from a specific index\n *\n * This sends a control message to the CLI to:\n * 1. Truncate in-memory history (via GeminiChat.setHistory())\n * 2. Sync to session.json file (via ChatRecordingService)\n *\n * Used for edit/retry functionality where subsequent messages need to be discarded.\n *\n * @param options - Truncation options: either keepUserTurns (preferred) or fromIndex (legacy)\n */\n async truncateHistory(options: number | { keepUserTurns: number } | { fromIndex: number }): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n let control: { subtype: 'truncate_history'; fromIndex?: number; keepUserTurns?: number };\n\n if (typeof options === 'number') {\n // Legacy: raw fromIndex\n if (options < 0) {\n throw new GeminiSDKError('fromIndex must be non-negative');\n }\n control = { subtype: 'truncate_history', fromIndex: options };\n } else if ('keepUserTurns' in options) {\n if (options.keepUserTurns < 0) {\n throw new GeminiSDKError('keepUserTurns must be non-negative');\n }\n control = { subtype: 'truncate_history', keepUserTurns: options.keepUserTurns };\n } else {\n if (options.fromIndex < 0) {\n throw new GeminiSDKError('fromIndex must be non-negative');\n }\n control = { subtype: 'truncate_history', fromIndex: options.fromIndex };\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control,\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Resume session from a session file\n *\n * This sends a control message to the CLI to:\n * 1. Load history from the specified session file\n * 2. Update the ChatRecordingService to use the session file\n *\n * Used when a warm pool adapter is assigned to a real session that has history.\n *\n * @param sessionFilePath - Path to the session file to resume from\n */\n async resumeSession(sessionFilePath: string): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n if (!sessionFilePath) {\n throw new GeminiSDKError('sessionFilePath is required');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'resume_session',\n sessionFilePath,\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Replace CLI in-memory history with provided contents\n *\n * This sends a control message to the CLI to:\n * 1. Replace the entire in-memory history with the provided contents\n * 2. Clear session.json (DB is the source of truth)\n *\n * Used when messages are deleted from DB and CLI history needs to be rebuilt.\n *\n * @param contents - Full replacement history in Gemini Content[] format\n */\n async replaceHistory(contents: Array<{ role: string; parts: unknown[] }>): Promise<void> {\n if (!this.isReady()) {\n throw new GeminiSDKError('Client not ready. Call start() first.');\n }\n\n const message: JsonInputMessage = {\n type: JsonInputMessageType.CONTROL,\n control: {\n subtype: 'replace_history',\n contents,\n },\n session_id: this.options.sessionId,\n };\n\n this.writeMessage(message);\n }\n\n /**\n * Stop the CLI process\n */\n async stop(timeout: number = 5000): Promise<void> {\n if (!this.process) {\n return;\n }\n\n // Clear init timeout if exists\n if (this.initTimeout) {\n clearTimeout(this.initTimeout);\n this.initTimeout = null;\n }\n\n // Close stdin to signal graceful shutdown\n if (this.stdinStream) {\n this.stdinStream.end();\n this.stdinStream = null;\n }\n\n // Close readline interface\n if (this.readlineInterface) {\n this.readlineInterface.close();\n this.readlineInterface = null;\n }\n\n // Wait for process to exit (with timeout)\n await Promise.race([\n new Promise<void>((resolve) => {\n if (this.process) {\n this.process.once('exit', () => resolve());\n } else {\n resolve();\n }\n }),\n new Promise<void>((resolve) => setTimeout(resolve, timeout)),\n ]);\n\n // Force kill if still running\n if (this.process && !this.process.killed) {\n this.process.kill('SIGTERM');\n\n // Wait a bit more\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // SIGKILL if still not dead\n if (this.process && !this.process.killed) {\n this.process.kill('SIGKILL');\n }\n }\n\n this.process = null;\n this.status = ProcessStatus.COMPLETED;\n\n // Clean up temporary settings file\n if (this.tempSettingsPath) {\n try {\n fs.unlinkSync(this.tempSettingsPath);\n this.logger.debug('Cleaned up temp settings:', this.tempSettingsPath);\n } catch (error) {\n this.logger.error('Failed to clean up temp settings:', error);\n }\n this.tempSettingsPath = null;\n }\n }\n\n /**\n * Check if client is ready to send messages\n */\n isReady(): boolean {\n return this.status === ProcessStatus.RUNNING && this.initEvent !== null;\n }\n\n /**\n * Get current status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get init event (contains session_id, model, etc.)\n */\n getInitEvent(): InitEvent | null {\n return this.initEvent;\n }\n\n /**\n * Get process PID\n */\n getPid(): number | undefined {\n return this.process?.pid;\n }\n\n /**\n * Create settings.json in GEMINI_CONFIG_DIR for hooks and MCP servers configuration\n *\n * Note: Gemini CLI does not support --settings-file parameter.\n * Instead, it loads settings from GEMINI_CONFIG_DIR/settings.json\n * where GEMINI_CONFIG_DIR is set via environment variable.\n *\n * This method merges with existing settings.json if present, preserving\n * any configuration written by the host application (e.g., tools.discoveryCommand).\n */\n private async createTempSettings(): Promise<void> {\n // Get GEMINI_CONFIG_DIR from options.env\n const geminiConfigDir = this.options.env?.GEMINI_CONFIG_DIR;\n\n if (!geminiConfigDir) {\n throw new GeminiSDKError(\n 'GEMINI_CONFIG_DIR is required in options.env when using hooks, mcpServers, tools, or context. ' +\n 'Please set options.env.GEMINI_CONFIG_DIR to a directory path.'\n );\n }\n\n // Ensure the directory exists\n if (!fs.existsSync(geminiConfigDir)) {\n fs.mkdirSync(geminiConfigDir, { recursive: true });\n this.logger.debug('Created config directory:', geminiConfigDir);\n }\n\n // Write settings.json to GEMINI_CONFIG_DIR\n this.tempSettingsPath = path.join(geminiConfigDir, 'settings.json');\n\n // Read existing settings if present (to merge with)\n let existingSettings: Record<string, unknown> = {};\n if (fs.existsSync(this.tempSettingsPath)) {\n try {\n const content = fs.readFileSync(this.tempSettingsPath, 'utf-8');\n existingSettings = JSON.parse(content);\n this.logger.debug('Read existing settings:', JSON.stringify(existingSettings, null, 2));\n } catch (error) {\n this.logger.warn('Failed to read existing settings.json, will overwrite:', error);\n }\n }\n\n // Merge with existing settings\n const settings: Record<string, unknown> = { ...existingSettings };\n\n // Add tools configuration if provided\n if (this.options.tools || this.options.hooks) {\n const existingTools = (settings.tools as Record<string, unknown>) || {};\n settings.tools = {\n ...existingTools,\n ...this.options.tools,\n // enableHooks is set to true if hooks are configured\n ...(this.options.hooks ? { enableHooks: true } : {}),\n };\n }\n\n // Add hooks configuration if provided\n if (this.options.hooks) {\n settings.hooks = this.options.hooks;\n }\n\n // Add context configuration if provided\n if (this.options.context) {\n settings.context = this.options.context;\n }\n\n // Add MCP servers configuration if provided\n if (this.options.mcpServers) {\n settings.mcpServers = this.options.mcpServers;\n }\n\n try {\n fs.writeFileSync(this.tempSettingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n this.logger.debug('Wrote settings to:', this.tempSettingsPath);\n this.logger.debug('Settings content:', JSON.stringify(settings, null, 2));\n } catch (error) {\n throw new GeminiSDKError(`Failed to write settings file: ${error}`);\n }\n }\n\n /**\n * Build CLI command arguments\n */\n private buildCommand(): string[] {\n const args = [\n this.options.pathToGeminiCLI,\n '--stream-json-input', // ← New flag we'll add to CLI\n '--output-format',\n 'stream-json',\n ];\n\n // Note: Do NOT use --settings-file as it's not supported by Gemini CLI\n // Settings are loaded from GEMINI_CONFIG_DIR/settings.json instead\n\n // Model\n if (this.options.model) {\n args.push('--model', this.options.model);\n }\n\n // Approval mode\n if (this.options.approvalMode) {\n args.push('--approval-mode', this.options.approvalMode);\n }\n\n // Debug mode\n if (this.options.debug) {\n args.push('--debug');\n }\n\n return args;\n }\n\n /**\n * Build environment variables\n */\n private buildEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...this.options.env,\n };\n\n // Set API key if provided\n if (this.options.apiKey) {\n // For Vertex AI mode, use GOOGLE_API_KEY\n // For Google AI Studio, use GEMINI_API_KEY\n const useVertexAI = this.options.env?.GOOGLE_GENAI_USE_VERTEXAI === 'true';\n\n this.logger.debug('buildEnv() - API Key prefix:', this.options.apiKey.substring(0, 3));\n this.logger.debug('buildEnv() - GOOGLE_GENAI_USE_VERTEXAI:', this.options.env?.GOOGLE_GENAI_USE_VERTEXAI);\n this.logger.debug('buildEnv() - useVertexAI:', useVertexAI);\n\n if (useVertexAI) {\n env.GOOGLE_API_KEY = this.options.apiKey;\n this.logger.debug('buildEnv() - Setting GOOGLE_API_KEY for Vertex AI');\n } else {\n env.GEMINI_API_KEY = this.options.apiKey;\n this.logger.debug('buildEnv() - Setting GEMINI_API_KEY for AI Studio');\n }\n }\n\n this.logger.debug('buildEnv() - Final env has GOOGLE_API_KEY:', !!env.GOOGLE_API_KEY);\n this.logger.debug('buildEnv() - Final env has GEMINI_API_KEY:', !!env.GEMINI_API_KEY);\n this.logger.debug('buildEnv() - Final env GOOGLE_GENAI_USE_VERTEXAI:', env.GOOGLE_GENAI_USE_VERTEXAI);\n\n return env;\n }\n\n /**\n * Write a JSON message to stdin\n */\n private writeMessage(message: JsonInputMessage): void {\n if (!this.stdinStream) {\n throw new GeminiSDKError('stdin stream not available');\n }\n\n const json = JSON.stringify(message);\n this.logger.debug('Writing message to stdin:', json.substring(0, 100));\n\n const success = this.stdinStream.write(json + '\\n', (error) => {\n if (error) {\n this.logger.error('Write error:', error);\n } else {\n this.logger.debug('Write callback: message flushed to stdin');\n }\n });\n\n this.logger.debug('Write success:', success, 'Stream writable:', this.stdinStream.writable);\n }\n\n /**\n * Start reading JSONL events from stdout\n */\n private startReadLoop(): void {\n if (!this.readlineInterface) {\n return;\n }\n\n this.readlineInterface.on('line', (line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n return;\n }\n\n // Skip debug output lines (e.g., [MESSAGE_BUS], [PolicyEngine], etc.)\n if (trimmed.startsWith('[')) {\n return;\n }\n\n try {\n const event = JSON.parse(trimmed) as JsonStreamEvent;\n this.handleEvent(event);\n } catch (error) {\n this.logger.error('Failed to parse JSON:', trimmed);\n this.logger.error('Error:', error);\n }\n });\n\n this.readlineInterface.on('close', () => {\n // stdout closed - no need to log\n });\n }\n\n /**\n * Handle a JSON stream event\n */\n private handleEvent(event: JsonStreamEvent): void {\n // Capture INIT event\n if (event.type === JsonStreamEventType.INIT) {\n this.initEvent = event as InitEvent;\n\n // Clear init timeout\n if (this.initTimeout) {\n clearTimeout(this.initTimeout);\n this.initTimeout = null;\n }\n\n this.emit('ready', this.initEvent);\n }\n\n // Emit event to listeners\n this.emit('event', event);\n }\n\n /**\n * Wait for INIT event\n */\n private async waitForInit(): Promise<void> {\n const timeout = this.options.initTimeout || 30000;\n\n return new Promise((resolve, reject) => {\n // Already initialized?\n if (this.initEvent) {\n resolve();\n return;\n }\n\n // Set timeout\n this.initTimeout = setTimeout(() => {\n reject(new GeminiSDKError('Initialization timeout', undefined, { timeout }));\n }, timeout);\n\n // Wait for ready event\n this.once('ready', () => {\n resolve();\n });\n\n // Or error\n this.once('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Handle process exit\n */\n private handleProcessExit(code: number | null, signal: NodeJS.Signals | null): void {\n this.logger.debug('Process exited:', { code, signal });\n\n if (code !== 0 && code !== null) {\n this.status = ProcessStatus.ERROR;\n this.emit('error', new GeminiSDKError(`Process exited with code ${code}`, code));\n } else {\n this.status = ProcessStatus.COMPLETED;\n }\n\n this.emit('stopped', code);\n\n // Cleanup\n this.process = null;\n this.stdinStream = null;\n if (this.readlineInterface) {\n this.readlineInterface.close();\n this.readlineInterface = null;\n }\n }\n\n /**\n * Handle process error\n */\n private handleProcessError(error: Error): void {\n this.logger.error('Process error:', error);\n this.status = ProcessStatus.ERROR;\n this.emit('error', error);\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { sdkLogger } from './logger.js';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n sdkLogger.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|