diff --git a/packages/cli/src/nonInteractiveCli.test.ts b/packages/cli/src/nonInteractiveCli.test.ts index 70ede3ddfe..0b3a61e416 100644 --- a/packages/cli/src/nonInteractiveCli.test.ts +++ b/packages/cli/src/nonInteractiveCli.test.ts @@ -1519,6 +1519,9 @@ describe('runNonInteractive', () => { name: 'ShellTool', description: 'A shell tool', run: vi.fn(), + build: vi.fn().mockReturnValue({ + getDescription: () => 'A shell tool', + }), }), getFunctionDeclarations: vi.fn().mockReturnValue([{ name: 'ShellTool' }]), } as unknown as ToolRegistry); diff --git a/packages/cli/src/nonInteractiveCli.ts b/packages/cli/src/nonInteractiveCli.ts index bf1f4e4d6d..c7e5d1c828 100644 --- a/packages/cli/src/nonInteractiveCli.ts +++ b/packages/cli/src/nonInteractiveCli.ts @@ -417,7 +417,9 @@ export async function runNonInteractive({ return errToThrow; }; - const runTerminalExitHandler = (handler: () => never): never => { + const runTerminalExitHandler = ( + handler: () => void | never, + ): void | never => { terminalProcessExitHandled = true; return handler(); }; diff --git a/packages/core/src/agent/types.ts b/packages/core/src/agent/types.ts index 9bc3e81e0f..19837c138e 100644 --- a/packages/core/src/agent/types.ts +++ b/packages/core/src/agent/types.ts @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +import type { Kind } from '../tools/tools.js'; + export type WithMeta = { _meta?: Record }; export type Unsubscribe = () => void; @@ -180,6 +182,16 @@ export interface ToolRequest { name: string; /** The arguments for the tool. */ args: Record; + /** UI specific metadata */ + _meta?: { + legacyState?: { + displayName?: string; + isOutputMarkdown?: boolean; + description?: string; + kind?: Kind; + }; + [key: string]: unknown; + }; } /** @@ -192,6 +204,18 @@ export interface ToolUpdate { displayContent?: ContentPart[]; content?: ContentPart[]; data?: Record; + /** UI specific metadata */ + _meta?: { + legacyState?: { + status?: string; + progressMessage?: string; + progress?: number; + progressTotal?: number; + pid?: number; + description?: string; + }; + [key: string]: unknown; + }; } export interface ToolResponse { @@ -205,6 +229,13 @@ export interface ToolResponse { data?: Record; /** When true, the tool call encountered an error that will be sent to the model. */ isError?: boolean; + /** UI specific metadata */ + _meta?: { + legacyState?: { + outputFile?: string; + }; + [key: string]: unknown; + }; } export type ElicitationRequest = { diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 075c5439ad..4989308aa0 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -684,6 +684,7 @@ export interface ConfigParameters { adminSkillsEnabled?: boolean; experimentalJitContext?: boolean; experimentalMemoryManager?: boolean; + useAgentProtocol?: boolean; experimentalAgentHistoryTruncation?: boolean; experimentalAgentHistoryTruncationThreshold?: number; experimentalAgentHistoryRetainedMessages?: number; @@ -922,6 +923,7 @@ export class Config implements McpContext, AgentLoopContext { private readonly experimentalJitContext: boolean; private readonly experimentalMemoryManager: boolean; + private readonly useAgentProtocol: boolean; private readonly experimentalAgentHistoryTruncation: boolean; private readonly experimentalAgentHistoryTruncationThreshold: number; private readonly experimentalAgentHistoryRetainedMessages: number; @@ -1136,6 +1138,7 @@ export class Config implements McpContext, AgentLoopContext { this.experimentalJitContext = params.experimentalJitContext ?? true; this.experimentalMemoryManager = params.experimentalMemoryManager ?? false; + this.useAgentProtocol = params.useAgentProtocol ?? false; this.experimentalAgentHistoryTruncation = params.experimentalAgentHistoryTruncation ?? false; this.experimentalAgentHistoryTruncationThreshold = @@ -2338,6 +2341,12 @@ export class Config implements McpContext, AgentLoopContext { return this.experimentalMemoryManager; } + getExperimentalUseAgentProtocol(): boolean { + return ( + this.useAgentProtocol || + process.env['GEMINI_CLI_USE_AGENT_PROTOCOL'] === 'true' + ); + } isExperimentalAgentHistoryTruncationEnabled(): boolean { return this.experimentalAgentHistoryTruncation; }