summaryrefslogtreecommitdiff
path: root/packages/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src')
-rw-r--r--packages/core/src/background/backgroundAgent.ts126
-rw-r--r--packages/core/src/background/backgroundManager.ts40
-rw-r--r--packages/core/src/background/types.ts107
-rw-r--r--packages/core/src/config/config.ts16
-rw-r--r--packages/core/src/index.ts3
-rw-r--r--packages/core/src/tools/mcp-tool.ts4
6 files changed, 3 insertions, 293 deletions
diff --git a/packages/core/src/background/backgroundAgent.ts b/packages/core/src/background/backgroundAgent.ts
deleted file mode 100644
index 008010cd..00000000
--- a/packages/core/src/background/backgroundAgent.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import { MCPServerConfig } from '../config/config.js';
-import { connectToMcpServer, discoverTools } from '../tools/mcp-client.js';
-import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
-import {
- BackgroundAgentTasksResponseSchema,
- BackgroundAgentTaskResponseSchema,
- BackgroundAgentTask,
-} from './types.js';
-
-export async function loadBackgroundAgent(
- name: string,
- config: MCPServerConfig,
- debugMode: boolean,
-): Promise<BackgroundAgent> {
- const server = await connectToMcpServer(name, config, debugMode);
- try {
- const tools = await discoverTools(name, config, server);
- return new BackgroundAgent(name, tools);
- } catch (error) {
- await server.close();
- throw error;
- }
-}
-
-export class BackgroundAgent {
- readonly startTaskTool: DiscoveredMCPTool;
- readonly getTaskTool: DiscoveredMCPTool;
- readonly listTasksTool: DiscoveredMCPTool;
- readonly messageTaskTool: DiscoveredMCPTool;
- readonly deleteTaskTool: DiscoveredMCPTool;
- readonly cancelTaskTool: DiscoveredMCPTool;
-
- constructor(
- readonly serverName: string,
- tools: DiscoveredMCPTool[],
- ) {
- const getToolOrFail = (name: string): DiscoveredMCPTool => {
- for (const tool of tools) {
- if (tool.serverToolName === name) {
- return tool;
- }
- }
- throw new Error(`missing expected tool: ${name}`);
- };
-
- this.startTaskTool = getToolOrFail('startTask');
- this.getTaskTool = getToolOrFail('getTask');
- this.listTasksTool = getToolOrFail('listTasks');
- this.messageTaskTool = getToolOrFail('messageTask');
- this.deleteTaskTool = getToolOrFail('deleteTask');
- this.cancelTaskTool = getToolOrFail('cancelTask');
- }
-
- async startTask(prompt: string): Promise<BackgroundAgentTask> {
- const resp = await this.callTool(this.startTaskTool, {
- prompt: {
- role: 'user',
- parts: [{ text: prompt }],
- },
- });
- const taskResp = await BackgroundAgentTaskResponseSchema.parseAsync(resp);
- return taskResp.structuredContent;
- }
-
- async getTask(
- id: string,
- historyLength?: number,
- ): Promise<BackgroundAgentTask> {
- const resp = await this.callTool(this.getTaskTool, {
- id,
- historyLength,
- });
- const taskResp = await BackgroundAgentTaskResponseSchema.parseAsync(resp);
- return taskResp.structuredContent;
- }
-
- async listTasks(): Promise<BackgroundAgentTask[]> {
- const resp = await this.callTool(this.listTasksTool, {});
- const tasksResp = await BackgroundAgentTasksResponseSchema.parseAsync(resp);
- return tasksResp.structuredContent;
- }
-
- async messageTask(id: string, message: string) {
- await this.callTool(this.messageTaskTool, {
- id,
- message: {
- role: 'user',
- parts: [{ text: message }],
- },
- });
- }
-
- async deleteTask(id: string) {
- await this.callTool(this.deleteTaskTool, { id });
- }
-
- async cancelTask(id: string) {
- await this.callTool(this.cancelTaskTool, { id });
- }
-
- private async callTool(
- tool: DiscoveredMCPTool,
- params: Record<string, unknown>,
- ): Promise<Record<string, unknown>> {
- const { llmContent: parts } = await tool.execute(params);
- if (
- !Array.isArray(parts) ||
- parts.length !== 1 ||
- typeof parts[0] !== 'object' ||
- parts[0]?.functionResponse?.response === undefined
- ) {
- throw new Error('Expected exactly one part with a functionResponse');
- }
- const resp = parts[0].functionResponse.response;
- if ('isError' in resp && resp.isError) {
- throw new Error(`Error calling ${tool.displayName}: ${resp}`);
- }
- return resp;
- }
-}
diff --git a/packages/core/src/background/backgroundManager.ts b/packages/core/src/background/backgroundManager.ts
deleted file mode 100644
index a3ec526c..00000000
--- a/packages/core/src/background/backgroundManager.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import { MCPServerConfig } from '../config/config.js';
-import { BackgroundAgent, loadBackgroundAgent } from './backgroundAgent.js';
-
-export async function loadBackgroundAgentManager(
- backgroundAgentConfigs: Record<string, MCPServerConfig> | undefined,
- debugMode: boolean,
-): Promise<BackgroundAgentManager> {
- const agents = await Promise.all(
- Object.entries(backgroundAgentConfigs ?? {}).map(([name, config]) =>
- loadBackgroundAgent(name, config, debugMode).catch((error) => {
- console.error(`Error loading background agent '${name}': ${error}`);
- return null;
- }),
- ),
- ).then((agents) => agents.filter((agent) => agent !== null));
- return new BackgroundAgentManager(agents);
-}
-
-export class BackgroundAgentManager {
- // The active agent. May be empty if none are confgured.
- activeAgent?: BackgroundAgent;
-
- constructor(readonly backgroundAgents: BackgroundAgent[]) {
- if (backgroundAgents.length !== 0) {
- this.activeAgent = backgroundAgents[0];
- }
- }
-
- setActiveAgentByName(name: string) {
- this.activeAgent = this.backgroundAgents.find(
- (agent) => agent.serverName === name,
- );
- }
-}
diff --git a/packages/core/src/background/types.ts b/packages/core/src/background/types.ts
deleted file mode 100644
index 60927af6..00000000
--- a/packages/core/src/background/types.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import { z } from 'zod';
-import { Outcome, Language, FunctionResponseScheduling } from '@google/genai';
-
-// Should conform to Part in @google/genai
-export const PartSchema = z.object({
- videoMetadata: z
- .object({
- fps: z.number().optional(),
- endOffset: z.string().optional(),
- startOffset: z.string().optional(),
- })
- .optional(),
- thought: z.boolean().optional(),
- inlineData: z
- .object({
- displayName: z.string().optional(),
- data: z.string(),
- mimeType: z.string(),
- })
- .optional(),
- fileData: z
- .object({
- displayName: z.string().optional(),
- fileUri: z.string(),
- mimeType: z.string(),
- })
- .optional(),
- thoughtSignature: z.string().optional(),
- codeExecutionResult: z
- .object({
- outcome: z.nativeEnum(Outcome).optional(),
- output: z.string().optional(),
- })
- .optional(),
- executableCode: z
- .object({
- code: z.string().optional(),
- language: z.nativeEnum(Language).optional(),
- })
- .optional(),
- functionCall: z
- .object({
- id: z.string().optional(),
- args: z.record(z.unknown()).optional(),
- name: z.string(),
- })
- .optional(),
- functionResponse: z
- .object({
- willContinue: z.boolean().optional(),
- scheduling: z.nativeEnum(FunctionResponseScheduling).optional(),
- id: z.string().optional(),
- name: z.string(),
- response: z.record(z.unknown()).optional(),
- })
- .optional(),
- text: z.string().optional(),
-});
-
-export const BackgroundAgentMessageSchema = z.object({
- role: z.enum(['user', 'agent']).describe('The role of the sender.'),
- parts: z.array(PartSchema).describe('The parts of the message.'),
-});
-
-export const BackgroundAgentTaskStatusSchema = z.object({
- state: z.enum([
- 'submitted',
- 'working',
- 'input-required',
- 'completed',
- 'failed',
- ]),
- message: BackgroundAgentMessageSchema.describe(
- 'Message describing the state of the task.',
- ).optional(),
-});
-
-export const BackgroundAgentTaskSchema = z.object({
- id: z.string().describe('The id of the task. Must match `[a-zA-Z0-9.-_]+`'),
- status: BackgroundAgentTaskStatusSchema.describe(
- 'The current status of the task.',
- ),
- history: z
- .array(BackgroundAgentMessageSchema)
- .describe('Recent history of messages associated with this task')
- .optional(),
-});
-
-export type BackgroundAgentMessage = z.infer<
- typeof BackgroundAgentMessageSchema
->;
-
-export type BackgroundAgentTask = z.infer<typeof BackgroundAgentTaskSchema>;
-
-export const BackgroundAgentTaskResponseSchema = z.object({
- structuredContent: BackgroundAgentTaskSchema,
-});
-
-export const BackgroundAgentTasksResponseSchema = z.object({
- structuredContent: z.array(BackgroundAgentTaskSchema),
-});
diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts
index 5d02f269..f81b3e32 100644
--- a/packages/core/src/config/config.ts
+++ b/packages/core/src/config/config.ts
@@ -45,10 +45,6 @@ import {
DEFAULT_GEMINI_FLASH_MODEL,
} from './models.js';
import { ClearcutLogger } from '../telemetry/clearcut-logger/clearcut-logger.js';
-import {
- BackgroundAgentManager,
- loadBackgroundAgentManager,
-} from '../background/backgroundManager.js';
export enum ApprovalMode {
DEFAULT = 'default',
@@ -131,7 +127,6 @@ export interface ConfigParameters {
toolCallCommand?: string;
mcpServerCommand?: string;
mcpServers?: Record<string, MCPServerConfig>;
- backgroundAgents?: Record<string, MCPServerConfig>;
userMemory?: string;
geminiMdFileCount?: number;
approvalMode?: ApprovalMode;
@@ -163,7 +158,6 @@ export interface ConfigParameters {
export class Config {
private toolRegistry!: ToolRegistry;
- private backgroundAgentManager?: BackgroundAgentManager;
private readonly sessionId: string;
private contentGeneratorConfig!: ContentGeneratorConfig;
private readonly embeddingModel: string;
@@ -178,7 +172,6 @@ export class Config {
private readonly toolCallCommand: string | undefined;
private readonly mcpServerCommand: string | undefined;
private readonly mcpServers: Record<string, MCPServerConfig> | undefined;
- private readonly backgroundAgents?: Record<string, MCPServerConfig>;
private userMemory: string;
private geminiMdFileCount: number;
private approvalMode: ApprovalMode;
@@ -231,7 +224,6 @@ export class Config {
this.toolCallCommand = params.toolCallCommand;
this.mcpServerCommand = params.mcpServerCommand;
this.mcpServers = params.mcpServers;
- this.backgroundAgents = params.backgroundAgents;
this.userMemory = params.userMemory ?? '';
this.geminiMdFileCount = params.geminiMdFileCount ?? 0;
this.approvalMode = params.approvalMode ?? ApprovalMode.DEFAULT;
@@ -289,10 +281,6 @@ export class Config {
if (this.getCheckpointingEnabled()) {
await this.getGitService();
}
- this.backgroundAgentManager = await loadBackgroundAgentManager(
- this.backgroundAgents,
- this.debugMode,
- );
this.toolRegistry = await this.createToolRegistry();
}
@@ -418,10 +406,6 @@ export class Config {
return this.mcpServers;
}
- getBackgroundAgentManager(): BackgroundAgentManager | undefined {
- return this.backgroundAgentManager;
- }
-
getUserMemory(): string {
return this.userMemory;
}
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index a3d77ddc..24d8bdb2 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -24,9 +24,6 @@ export * from './code_assist/oauth2.js';
export * from './code_assist/server.js';
export * from './code_assist/types.js';
-export * from './background/types.js';
-export * from './background/backgroundManager.js';
-
// Export utilities
export * from './utils/paths.js';
export * from './utils/schemaValidator.js';
diff --git a/packages/core/src/tools/mcp-tool.ts b/packages/core/src/tools/mcp-tool.ts
index 2cb124ed..9916d7f9 100644
--- a/packages/core/src/tools/mcp-tool.ts
+++ b/packages/core/src/tools/mcp-tool.ts
@@ -113,7 +113,9 @@ export class DiscoveredMCPTool extends BaseTool<ToolParams, ToolResult> {
args: params,
},
];
- const responseParts = await this.mcpTool.callTool(functionCalls);
+
+ const responseParts: Part[] = await this.mcpTool.callTool(functionCalls);
+
return {
llmContent: responseParts,
returnDisplay: getStringifiedResultForDisplay(responseParts),