2025-04-18 17:44:24 -07:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2025 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
2025-08-26 00:04:53 +02:00
|
|
|
import type React from 'react';
|
2026-01-23 20:32:35 -05:00
|
|
|
import { useMemo, useCallback } from 'react';
|
2025-08-12 14:05:49 -07:00
|
|
|
import { Box, Text } from 'ink';
|
2025-04-21 10:53:11 -04:00
|
|
|
import { DiffRenderer } from './DiffRenderer.js';
|
2025-08-18 13:26:34 +08:00
|
|
|
import { RenderInline } from '../../utils/InlineMarkdownRenderer.js';
|
2026-01-19 20:07:28 -08:00
|
|
|
import {
|
2026-01-21 16:16:30 -05:00
|
|
|
type SerializableConfirmationDetails,
|
|
|
|
|
type ToolCallConfirmationDetails,
|
|
|
|
|
type Config,
|
2026-01-19 20:07:28 -08:00
|
|
|
ToolConfirmationOutcome,
|
|
|
|
|
hasRedirection,
|
2026-01-21 16:16:30 -05:00
|
|
|
debugLogger,
|
2026-01-19 20:07:28 -08:00
|
|
|
} from '@google/gemini-cli-core';
|
2025-08-26 00:04:53 +02:00
|
|
|
import type { RadioSelectItem } from '../shared/RadioButtonSelect.js';
|
2026-01-21 16:16:30 -05:00
|
|
|
import { useToolActions } from '../../contexts/ToolActionsContext.js';
|
2025-08-26 00:04:53 +02:00
|
|
|
import { RadioButtonSelect } from '../shared/RadioButtonSelect.js';
|
2026-01-19 20:07:28 -08:00
|
|
|
import { MaxSizedBox, MINIMUM_MAX_HEIGHT } from '../shared/MaxSizedBox.js';
|
2026-01-27 08:56:01 -08:00
|
|
|
import { sanitizeForDisplay } from '../../utils/textUtils.js';
|
2025-08-12 14:05:49 -07:00
|
|
|
import { useKeypress } from '../../hooks/useKeypress.js';
|
2025-09-10 10:57:07 -07:00
|
|
|
import { theme } from '../../semantic-colors.js';
|
2025-12-19 09:25:23 -08:00
|
|
|
import { useSettings } from '../../contexts/SettingsContext.js';
|
2026-01-19 20:07:28 -08:00
|
|
|
import {
|
|
|
|
|
REDIRECTION_WARNING_NOTE_LABEL,
|
|
|
|
|
REDIRECTION_WARNING_NOTE_TEXT,
|
|
|
|
|
REDIRECTION_WARNING_TIP_LABEL,
|
|
|
|
|
REDIRECTION_WARNING_TIP_TEXT,
|
|
|
|
|
} from '../../textConstants.js';
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
|
|
|
|
export interface ToolConfirmationMessageProps {
|
2026-01-21 16:16:30 -05:00
|
|
|
callId: string;
|
|
|
|
|
confirmationDetails:
|
|
|
|
|
| ToolCallConfirmationDetails
|
|
|
|
|
| SerializableConfirmationDetails;
|
2025-08-26 10:02:22 -07:00
|
|
|
config: Config;
|
2025-06-12 02:21:54 +01:00
|
|
|
isFocused?: boolean;
|
2025-06-19 20:17:23 +00:00
|
|
|
availableTerminalHeight?: number;
|
|
|
|
|
terminalWidth: number;
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
}
|
|
|
|
|
|
2025-04-18 19:09:41 -04:00
|
|
|
export const ToolConfirmationMessage: React.FC<
|
|
|
|
|
ToolConfirmationMessageProps
|
2025-06-19 20:17:23 +00:00
|
|
|
> = ({
|
2026-01-21 16:16:30 -05:00
|
|
|
callId,
|
2025-06-19 20:17:23 +00:00
|
|
|
confirmationDetails,
|
2025-08-06 17:36:05 +00:00
|
|
|
config,
|
2025-06-19 20:17:23 +00:00
|
|
|
isFocused = true,
|
|
|
|
|
availableTerminalHeight,
|
|
|
|
|
terminalWidth,
|
|
|
|
|
}) => {
|
2026-01-26 21:24:25 -05:00
|
|
|
const { confirm, isDiffingEnabled } = useToolActions();
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
2025-12-19 09:25:23 -08:00
|
|
|
const settings = useSettings();
|
|
|
|
|
const allowPermanentApproval =
|
2026-01-15 09:26:10 -08:00
|
|
|
settings.merged.security.enablePermanentToolApproval;
|
2025-11-11 07:50:11 -08:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
const handleConfirm = useCallback(
|
|
|
|
|
(outcome: ToolConfirmationOutcome) => {
|
|
|
|
|
void confirm(callId, outcome).catch((error) => {
|
|
|
|
|
debugLogger.error(
|
|
|
|
|
`Failed to handle tool confirmation for ${callId}:`,
|
|
|
|
|
error,
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
[confirm, callId],
|
|
|
|
|
);
|
2025-08-06 17:36:05 +00:00
|
|
|
|
2025-08-28 19:41:33 -07:00
|
|
|
const isTrustedFolder = config.isTrustedFolder();
|
2025-08-25 19:57:57 -07:00
|
|
|
|
2025-08-12 14:05:49 -07:00
|
|
|
useKeypress(
|
|
|
|
|
(key) => {
|
|
|
|
|
if (!isFocused) return;
|
|
|
|
|
if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
|
|
|
|
|
handleConfirm(ToolConfirmationOutcome.Cancel);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{ isActive: isFocused },
|
|
|
|
|
);
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
const handleSelect = useCallback(
|
|
|
|
|
(item: ToolConfirmationOutcome) => handleConfirm(item),
|
|
|
|
|
[handleConfirm],
|
|
|
|
|
);
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
const getOptions = useCallback(() => {
|
2025-11-11 07:50:11 -08:00
|
|
|
const options: Array<RadioSelectItem<ToolConfirmationOutcome>> = [];
|
2025-04-22 18:25:03 -07:00
|
|
|
|
2025-11-11 07:50:11 -08:00
|
|
|
if (confirmationDetails.type === 'edit') {
|
|
|
|
|
if (!confirmationDetails.isModifying) {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedOnce,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
|
|
|
|
if (isTrustedFolder) {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedAlways,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
2025-12-19 09:25:23 -08:00
|
|
|
if (allowPermanentApproval) {
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'Allow for all future sessions',
|
|
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
|
|
|
key: 'Allow for all future sessions',
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-11-11 07:50:11 -08:00
|
|
|
}
|
2026-01-26 21:24:25 -05:00
|
|
|
// We hide "Modify with external editor" if IDE mode is active AND
|
|
|
|
|
// the IDE is actually capable of showing a diff (connected).
|
|
|
|
|
if (!config.getIdeMode() || !isDiffingEnabled) {
|
2025-11-11 07:50:11 -08:00
|
|
|
options.push({
|
|
|
|
|
label: 'Modify with external editor',
|
|
|
|
|
value: ToolConfirmationOutcome.ModifyWithEditor,
|
|
|
|
|
key: 'Modify with external editor',
|
|
|
|
|
});
|
|
|
|
|
}
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
2025-11-11 07:50:11 -08:00
|
|
|
options.push({
|
|
|
|
|
label: 'No, suggest changes (esc)',
|
|
|
|
|
value: ToolConfirmationOutcome.Cancel,
|
|
|
|
|
key: 'No, suggest changes (esc)',
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
} else if (confirmationDetails.type === 'exec') {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedOnce,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
|
|
|
|
if (isTrustedFolder) {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: `Allow for this session`,
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedAlways,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: `Allow for this session`,
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
2025-12-19 09:25:23 -08:00
|
|
|
if (allowPermanentApproval) {
|
|
|
|
|
options.push({
|
|
|
|
|
label: `Allow for all future sessions`,
|
|
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
|
|
|
key: `Allow for all future sessions`,
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-11-11 07:50:11 -08:00
|
|
|
}
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'No, suggest changes (esc)',
|
|
|
|
|
value: ToolConfirmationOutcome.Cancel,
|
|
|
|
|
key: 'No, suggest changes (esc)',
|
|
|
|
|
});
|
|
|
|
|
} else if (confirmationDetails.type === 'info') {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedOnce,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
|
|
|
|
if (isTrustedFolder) {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedAlways,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
2025-12-19 09:25:23 -08:00
|
|
|
if (allowPermanentApproval) {
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'Allow for all future sessions',
|
|
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
|
|
|
key: 'Allow for all future sessions',
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-11-11 07:50:11 -08:00
|
|
|
}
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'No, suggest changes (esc)',
|
|
|
|
|
value: ToolConfirmationOutcome.Cancel,
|
|
|
|
|
key: 'No, suggest changes (esc)',
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// mcp tool confirmation
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedOnce,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow once',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
|
|
|
|
if (isTrustedFolder) {
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow tool for this session',
|
|
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysTool,
|
|
|
|
|
key: 'Allow tool for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
|
|
|
|
options.push({
|
2025-12-18 16:38:53 -08:00
|
|
|
label: 'Allow all server tools for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysServer,
|
2025-12-18 16:38:53 -08:00
|
|
|
key: 'Allow all server tools for this session',
|
2025-11-11 07:50:11 -08:00
|
|
|
});
|
2025-12-19 09:25:23 -08:00
|
|
|
if (allowPermanentApproval) {
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'Allow tool for all future sessions',
|
|
|
|
|
value: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
|
|
|
key: 'Allow tool for all future sessions',
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-11-11 07:50:11 -08:00
|
|
|
}
|
|
|
|
|
options.push({
|
|
|
|
|
label: 'No, suggest changes (esc)',
|
|
|
|
|
value: ToolConfirmationOutcome.Cancel,
|
|
|
|
|
key: 'No, suggest changes (esc)',
|
|
|
|
|
});
|
2025-06-19 20:17:23 +00:00
|
|
|
}
|
2026-01-23 20:32:35 -05:00
|
|
|
return options;
|
2026-01-26 21:24:25 -05:00
|
|
|
}, [
|
|
|
|
|
confirmationDetails,
|
|
|
|
|
isTrustedFolder,
|
|
|
|
|
allowPermanentApproval,
|
|
|
|
|
config,
|
|
|
|
|
isDiffingEnabled,
|
|
|
|
|
]);
|
2025-06-19 20:17:23 +00:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
const availableBodyContentHeight = useCallback(() => {
|
|
|
|
|
if (availableTerminalHeight === undefined) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Calculate the vertical space (in lines) consumed by UI elements
|
|
|
|
|
// surrounding the main body content.
|
|
|
|
|
const PADDING_OUTER_Y = 2; // Main container has `padding={1}` (top & bottom).
|
|
|
|
|
const MARGIN_BODY_BOTTOM = 1; // margin on the body container.
|
|
|
|
|
const HEIGHT_QUESTION = 1; // The question text is one line.
|
|
|
|
|
const MARGIN_QUESTION_BOTTOM = 1; // Margin on the question container.
|
|
|
|
|
|
|
|
|
|
const optionsCount = getOptions().length;
|
2025-11-11 07:50:11 -08:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
const surroundingElementsHeight =
|
|
|
|
|
PADDING_OUTER_Y +
|
|
|
|
|
MARGIN_BODY_BOTTOM +
|
|
|
|
|
HEIGHT_QUESTION +
|
|
|
|
|
MARGIN_QUESTION_BOTTOM +
|
|
|
|
|
optionsCount;
|
|
|
|
|
|
|
|
|
|
return Math.max(availableTerminalHeight - surroundingElementsHeight, 1);
|
|
|
|
|
}, [availableTerminalHeight, getOptions]);
|
|
|
|
|
|
|
|
|
|
const { question, bodyContent, options } = useMemo(() => {
|
|
|
|
|
let bodyContent: React.ReactNode | null = null;
|
|
|
|
|
let question = '';
|
|
|
|
|
const options = getOptions();
|
|
|
|
|
|
|
|
|
|
if (confirmationDetails.type === 'edit') {
|
|
|
|
|
if (!confirmationDetails.isModifying) {
|
|
|
|
|
question = `Apply this change?`;
|
2025-11-11 07:50:11 -08:00
|
|
|
}
|
2026-01-23 20:32:35 -05:00
|
|
|
} else if (confirmationDetails.type === 'exec') {
|
|
|
|
|
const executionProps = confirmationDetails;
|
2025-11-11 07:50:11 -08:00
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
if (executionProps.commands && executionProps.commands.length > 1) {
|
|
|
|
|
question = `Allow execution of ${executionProps.commands.length} commands?`;
|
|
|
|
|
} else {
|
2026-01-27 08:56:01 -08:00
|
|
|
question = `Allow execution of: '${sanitizeForDisplay(executionProps.rootCommand)}'?`;
|
2026-01-23 20:32:35 -05:00
|
|
|
}
|
|
|
|
|
} else if (confirmationDetails.type === 'info') {
|
|
|
|
|
question = `Do you want to proceed?`;
|
|
|
|
|
} else {
|
|
|
|
|
// mcp tool confirmation
|
|
|
|
|
const mcpProps = confirmationDetails;
|
|
|
|
|
question = `Allow execution of MCP tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"?`;
|
2025-06-19 20:17:23 +00:00
|
|
|
}
|
|
|
|
|
|
2025-11-11 07:50:11 -08:00
|
|
|
if (confirmationDetails.type === 'edit') {
|
|
|
|
|
if (!confirmationDetails.isModifying) {
|
|
|
|
|
bodyContent = (
|
|
|
|
|
<DiffRenderer
|
|
|
|
|
diffContent={confirmationDetails.fileDiff}
|
|
|
|
|
filename={confirmationDetails.fileName}
|
|
|
|
|
availableTerminalHeight={availableBodyContentHeight()}
|
|
|
|
|
terminalWidth={terminalWidth}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} else if (confirmationDetails.type === 'exec') {
|
2025-12-12 17:43:43 -08:00
|
|
|
const executionProps = confirmationDetails;
|
2026-01-19 20:07:28 -08:00
|
|
|
|
|
|
|
|
const commandsToDisplay =
|
|
|
|
|
executionProps.commands && executionProps.commands.length > 1
|
|
|
|
|
? executionProps.commands
|
|
|
|
|
: [executionProps.command];
|
|
|
|
|
const containsRedirection = commandsToDisplay.some((cmd) =>
|
|
|
|
|
hasRedirection(cmd),
|
|
|
|
|
);
|
|
|
|
|
|
2025-11-11 07:50:11 -08:00
|
|
|
let bodyContentHeight = availableBodyContentHeight();
|
2026-01-19 20:07:28 -08:00
|
|
|
let warnings: React.ReactNode = null;
|
|
|
|
|
|
2025-11-11 07:50:11 -08:00
|
|
|
if (bodyContentHeight !== undefined) {
|
|
|
|
|
bodyContentHeight -= 2; // Account for padding;
|
|
|
|
|
}
|
2025-06-19 20:17:23 +00:00
|
|
|
|
2026-01-19 20:07:28 -08:00
|
|
|
if (containsRedirection) {
|
|
|
|
|
// Calculate lines needed for Note and Tip
|
|
|
|
|
const safeWidth = Math.max(terminalWidth, 1);
|
|
|
|
|
const noteLength =
|
|
|
|
|
REDIRECTION_WARNING_NOTE_LABEL.length +
|
|
|
|
|
REDIRECTION_WARNING_NOTE_TEXT.length;
|
|
|
|
|
const tipLength =
|
|
|
|
|
REDIRECTION_WARNING_TIP_LABEL.length +
|
|
|
|
|
REDIRECTION_WARNING_TIP_TEXT.length;
|
|
|
|
|
|
|
|
|
|
const noteLines = Math.ceil(noteLength / safeWidth);
|
|
|
|
|
const tipLines = Math.ceil(tipLength / safeWidth);
|
|
|
|
|
const spacerLines = 1;
|
|
|
|
|
const warningHeight = noteLines + tipLines + spacerLines;
|
|
|
|
|
|
|
|
|
|
if (bodyContentHeight !== undefined) {
|
|
|
|
|
bodyContentHeight = Math.max(
|
|
|
|
|
bodyContentHeight - warningHeight,
|
|
|
|
|
MINIMUM_MAX_HEIGHT,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
warnings = (
|
|
|
|
|
<>
|
|
|
|
|
<Box height={1} />
|
|
|
|
|
<Box>
|
|
|
|
|
<Text color={theme.text.primary}>
|
|
|
|
|
<Text bold>{REDIRECTION_WARNING_NOTE_LABEL}</Text>
|
|
|
|
|
{REDIRECTION_WARNING_NOTE_TEXT}
|
|
|
|
|
</Text>
|
|
|
|
|
</Box>
|
|
|
|
|
<Box>
|
|
|
|
|
<Text color={theme.border.default}>
|
|
|
|
|
<Text bold>{REDIRECTION_WARNING_TIP_LABEL}</Text>
|
|
|
|
|
{REDIRECTION_WARNING_TIP_TEXT}
|
|
|
|
|
</Text>
|
|
|
|
|
</Box>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-13 20:22:10 -08:00
|
|
|
bodyContent = (
|
2026-01-19 20:07:28 -08:00
|
|
|
<Box flexDirection="column">
|
|
|
|
|
<MaxSizedBox
|
|
|
|
|
maxHeight={bodyContentHeight}
|
|
|
|
|
maxWidth={Math.max(terminalWidth, 1)}
|
|
|
|
|
>
|
|
|
|
|
<Box flexDirection="column">
|
|
|
|
|
{commandsToDisplay.map((cmd, idx) => (
|
2026-01-16 15:06:52 -08:00
|
|
|
<Text key={idx} color={theme.text.link}>
|
2026-01-27 08:56:01 -08:00
|
|
|
{sanitizeForDisplay(cmd)}
|
2026-01-16 15:06:52 -08:00
|
|
|
</Text>
|
2026-01-19 20:07:28 -08:00
|
|
|
))}
|
|
|
|
|
</Box>
|
|
|
|
|
</MaxSizedBox>
|
|
|
|
|
{warnings}
|
|
|
|
|
</Box>
|
2025-11-11 07:50:11 -08:00
|
|
|
);
|
|
|
|
|
} else if (confirmationDetails.type === 'info') {
|
|
|
|
|
const infoProps = confirmationDetails;
|
|
|
|
|
const displayUrls =
|
|
|
|
|
infoProps.urls &&
|
|
|
|
|
!(
|
|
|
|
|
infoProps.urls.length === 1 && infoProps.urls[0] === infoProps.prompt
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
bodyContent = (
|
2025-11-12 17:01:16 -08:00
|
|
|
<Box flexDirection="column">
|
2025-11-11 07:50:11 -08:00
|
|
|
<Text color={theme.text.link}>
|
|
|
|
|
<RenderInline
|
|
|
|
|
text={infoProps.prompt}
|
|
|
|
|
defaultColor={theme.text.link}
|
|
|
|
|
/>
|
|
|
|
|
</Text>
|
|
|
|
|
{displayUrls && infoProps.urls && infoProps.urls.length > 0 && (
|
|
|
|
|
<Box flexDirection="column" marginTop={1}>
|
|
|
|
|
<Text color={theme.text.primary}>URLs to fetch:</Text>
|
|
|
|
|
{infoProps.urls.map((url) => (
|
|
|
|
|
<Text key={url}>
|
|
|
|
|
{' '}
|
|
|
|
|
- <RenderInline text={url} />
|
|
|
|
|
</Text>
|
|
|
|
|
))}
|
|
|
|
|
</Box>
|
|
|
|
|
)}
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
// mcp tool confirmation
|
2025-12-12 17:43:43 -08:00
|
|
|
const mcpProps = confirmationDetails;
|
2025-11-11 07:50:11 -08:00
|
|
|
|
|
|
|
|
bodyContent = (
|
2025-11-12 17:01:16 -08:00
|
|
|
<Box flexDirection="column">
|
2025-11-11 07:50:11 -08:00
|
|
|
<Text color={theme.text.link}>MCP Server: {mcpProps.serverName}</Text>
|
|
|
|
|
<Text color={theme.text.link}>Tool: {mcpProps.toolName}</Text>
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return { question, bodyContent, options };
|
|
|
|
|
}, [
|
|
|
|
|
confirmationDetails,
|
2026-01-23 20:32:35 -05:00
|
|
|
getOptions,
|
|
|
|
|
availableBodyContentHeight,
|
2025-11-11 07:50:11 -08:00
|
|
|
terminalWidth,
|
|
|
|
|
]);
|
2025-08-06 17:36:05 +00:00
|
|
|
|
2025-05-22 06:00:36 +00:00
|
|
|
if (confirmationDetails.type === 'edit') {
|
2025-06-08 18:56:58 +01:00
|
|
|
if (confirmationDetails.isModifying) {
|
|
|
|
|
return (
|
|
|
|
|
<Box
|
2025-10-09 19:27:20 -07:00
|
|
|
width={terminalWidth}
|
2025-06-08 18:56:58 +01:00
|
|
|
borderStyle="round"
|
2025-09-10 10:57:07 -07:00
|
|
|
borderColor={theme.border.default}
|
2025-06-08 18:56:58 +01:00
|
|
|
justifyContent="space-around"
|
2025-11-12 17:01:16 -08:00
|
|
|
paddingTop={1}
|
|
|
|
|
paddingBottom={1}
|
2025-06-08 18:56:58 +01:00
|
|
|
overflow="hidden"
|
|
|
|
|
>
|
2025-09-10 10:57:07 -07:00
|
|
|
<Text color={theme.text.primary}>Modify in progress: </Text>
|
|
|
|
|
<Text color={theme.status.success}>
|
2025-06-08 18:56:58 +01:00
|
|
|
Save and close external editor to continue
|
|
|
|
|
</Text>
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
2025-11-11 07:50:11 -08:00
|
|
|
<Box flexDirection="column" paddingTop={0} paddingBottom={1}>
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
{/* Body Content (Diff Renderer or Command Info) */}
|
|
|
|
|
{/* No separate context display here anymore for edits */}
|
2025-11-12 17:01:16 -08:00
|
|
|
<Box flexGrow={1} flexShrink={1} overflow="hidden" marginBottom={1}>
|
2026-01-23 20:32:35 -05:00
|
|
|
<MaxSizedBox
|
|
|
|
|
maxHeight={availableBodyContentHeight()}
|
|
|
|
|
maxWidth={terminalWidth}
|
|
|
|
|
overflowDirection="top"
|
|
|
|
|
>
|
|
|
|
|
{bodyContent}
|
|
|
|
|
</MaxSizedBox>
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
</Box>
|
|
|
|
|
|
|
|
|
|
{/* Confirmation Question */}
|
2025-11-12 17:01:16 -08:00
|
|
|
<Box marginBottom={1} flexShrink={0}>
|
2025-11-11 07:50:11 -08:00
|
|
|
<Text color={theme.text.primary}>{question}</Text>
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
</Box>
|
|
|
|
|
|
|
|
|
|
{/* Select Input for Options */}
|
2025-11-12 17:01:16 -08:00
|
|
|
<Box flexShrink={0}>
|
2025-06-12 02:21:54 +01:00
|
|
|
<RadioButtonSelect
|
|
|
|
|
items={options}
|
|
|
|
|
onSelect={handleSelect}
|
|
|
|
|
isFocused={isFocused}
|
|
|
|
|
/>
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
</Box>
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
};
|