diff --git a/src/cli/commands/add/__tests__/add-mcp-tool.test.ts b/src/cli/commands/add/__tests__/add-gateway-target.test.ts similarity index 92% rename from src/cli/commands/add/__tests__/add-mcp-tool.test.ts rename to src/cli/commands/add/__tests__/add-gateway-target.test.ts index 22c7b42b..c6d9846b 100644 --- a/src/cli/commands/add/__tests__/add-mcp-tool.test.ts +++ b/src/cli/commands/add/__tests__/add-gateway-target.test.ts @@ -6,18 +6,18 @@ import { join } from 'node:path'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; // MCP Tool feature is disabled (coming soon) - skip all tests -describe.skip('add mcp-tool command', () => { +describe.skip('add gateway-target command', () => { let testDir: string; let projectDir: string; const agentName = 'TestAgent'; const gatewayName = 'test-gateway'; // Used in skipped behind-gateway tests beforeAll(async () => { - testDir = join(tmpdir(), `agentcore-add-mcp-tool-${randomUUID()}`); + testDir = join(tmpdir(), `agentcore-add-gateway-target-${randomUUID()}`); await mkdir(testDir, { recursive: true }); // Create project with agent - const projectName = 'McpToolProj'; + const projectName = 'GatewayTargetProj'; let result = await runCLI(['create', '--name', projectName, '--no-agent'], testDir); if (result.exitCode !== 0) { throw new Error(`Failed to create project: ${result.stdout} ${result.stderr}`); @@ -54,7 +54,7 @@ describe.skip('add mcp-tool command', () => { describe('validation', () => { it('requires name flag', async () => { - const result = await runCLI(['add', 'mcp-tool', '--json'], projectDir); + const result = await runCLI(['add', 'gateway-target', '--json'], projectDir); expect(result.exitCode).toBe(1); const json = JSON.parse(result.stdout); expect(json.success).toBe(false); @@ -62,7 +62,10 @@ describe.skip('add mcp-tool command', () => { }); it('requires exposure flag', async () => { - const result = await runCLI(['add', 'mcp-tool', '--name', 'test', '--language', 'Python', '--json'], projectDir); + const result = await runCLI( + ['add', 'gateway-target', '--name', 'test', '--language', 'Python', '--json'], + projectDir + ); expect(result.exitCode).toBe(1); const json = JSON.parse(result.stdout); expect(json.success).toBe(false); @@ -73,7 +76,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'test', '--language', @@ -99,7 +102,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'container-tool', '--language', @@ -130,7 +133,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', toolName, '--language', @@ -163,7 +166,7 @@ describe.skip('add mcp-tool command', () => { it('requires agents for mcp-runtime', async () => { const result = await runCLI( - ['add', 'mcp-tool', '--name', 'no-agents', '--language', 'Python', '--exposure', 'mcp-runtime', '--json'], + ['add', 'gateway-target', '--name', 'no-agents', '--language', 'Python', '--exposure', 'mcp-runtime', '--json'], projectDir ); expect(result.exitCode).toBe(1); @@ -176,7 +179,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'runtime-container', '--language', @@ -204,7 +207,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', toolName, '--language', @@ -236,7 +239,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'no-gw', '--language', @@ -259,7 +262,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'no-host', '--language', @@ -282,7 +285,7 @@ describe.skip('add mcp-tool command', () => { const result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', 'gateway-container', '--language', diff --git a/src/cli/commands/add/__tests__/validate.test.ts b/src/cli/commands/add/__tests__/validate.test.ts index cefc1a73..08ba8de5 100644 --- a/src/cli/commands/add/__tests__/validate.test.ts +++ b/src/cli/commands/add/__tests__/validate.test.ts @@ -1,15 +1,15 @@ import type { AddAgentOptions, AddGatewayOptions, + AddGatewayTargetOptions, AddIdentityOptions, - AddMcpToolOptions, AddMemoryOptions, } from '../types.js'; import { validateAddAgentOptions, validateAddGatewayOptions, + validateAddGatewayTargetOptions, validateAddIdentityOptions, - validateAddMcpToolOptions, validateAddMemoryOptions, } from '../validate.js'; import { describe, expect, it } from 'vitest'; @@ -46,14 +46,14 @@ const validGatewayOptionsJwt: AddGatewayOptions = { allowedClients: 'client1,client2', }; -const validMcpToolOptionsMcpRuntime: AddMcpToolOptions = { +const validGatewayTargetOptionsMcpRuntime: AddGatewayTargetOptions = { name: 'test-tool', language: 'Python', exposure: 'mcp-runtime', agents: 'Agent1,Agent2', }; -const validMcpToolOptionsBehindGateway: AddMcpToolOptions = { +const validGatewayTargetOptionsBehindGateway: AddGatewayTargetOptions = { name: 'test-tool', language: 'Python', exposure: 'behind-gateway', @@ -235,18 +235,18 @@ describe('validate', () => { }); }); - describe('validateAddMcpToolOptions', () => { + describe('validateAddGatewayTargetOptions', () => { // AC15: Required fields validated it('returns error for missing required fields', () => { - const requiredFields: { field: keyof AddMcpToolOptions; error: string }[] = [ + const requiredFields: { field: keyof AddGatewayTargetOptions; error: string }[] = [ { field: 'name', error: '--name is required' }, { field: 'language', error: '--language is required' }, { field: 'exposure', error: '--exposure is required' }, ]; for (const { field, error } of requiredFields) { - const opts = { ...validMcpToolOptionsMcpRuntime, [field]: undefined }; - const result = validateAddMcpToolOptions(opts); + const opts = { ...validGatewayTargetOptionsMcpRuntime, [field]: undefined }; + const result = validateAddGatewayTargetOptions(opts); expect(result.valid, `Should fail for missing ${String(field)}`).toBe(false); expect(result.error).toBe(error); } @@ -254,36 +254,36 @@ describe('validate', () => { // AC16: Invalid values rejected it('returns error for invalid values', () => { - let result = validateAddMcpToolOptions({ ...validMcpToolOptionsMcpRuntime, language: 'Java' as any }); + let result = validateAddGatewayTargetOptions({ ...validGatewayTargetOptionsMcpRuntime, language: 'Java' as any }); expect(result.valid).toBe(false); expect(result.error?.includes('Invalid language')).toBeTruthy(); - result = validateAddMcpToolOptions({ ...validMcpToolOptionsMcpRuntime, exposure: 'invalid' as any }); + result = validateAddGatewayTargetOptions({ ...validGatewayTargetOptionsMcpRuntime, exposure: 'invalid' as any }); expect(result.valid).toBe(false); expect(result.error?.includes('Invalid exposure')).toBeTruthy(); }); // AC17: mcp-runtime exposure requires agents it('returns error for mcp-runtime without agents', () => { - let result = validateAddMcpToolOptions({ ...validMcpToolOptionsMcpRuntime, agents: undefined }); + let result = validateAddGatewayTargetOptions({ ...validGatewayTargetOptionsMcpRuntime, agents: undefined }); expect(result.valid).toBe(false); expect(result.error).toBe('--agents is required for mcp-runtime exposure'); - result = validateAddMcpToolOptions({ ...validMcpToolOptionsMcpRuntime, agents: ',,,' }); + result = validateAddGatewayTargetOptions({ ...validGatewayTargetOptionsMcpRuntime, agents: ',,,' }); expect(result.valid).toBe(false); expect(result.error).toBe('At least one agent is required'); }); // AC18: behind-gateway exposure is disabled (coming soon) it('returns coming soon error for behind-gateway exposure', () => { - const result = validateAddMcpToolOptions({ ...validMcpToolOptionsBehindGateway }); + const result = validateAddGatewayTargetOptions({ ...validGatewayTargetOptionsBehindGateway }); expect(result.valid).toBe(false); expect(result.error).toContain('coming soon'); }); // AC19: Valid options pass it('passes for valid mcp-runtime options', () => { - expect(validateAddMcpToolOptions(validMcpToolOptionsMcpRuntime)).toEqual({ valid: true }); + expect(validateAddGatewayTargetOptions(validGatewayTargetOptionsMcpRuntime)).toEqual({ valid: true }); }); }); diff --git a/src/cli/commands/add/actions.ts b/src/cli/commands/add/actions.ts index 1c94737e..c6df1ff1 100644 --- a/src/cli/commands/add/actions.ts +++ b/src/cli/commands/add/actions.ts @@ -27,9 +27,15 @@ import { createGatewayFromWizard, createToolFromWizard } from '../../operations/ import { createMemory } from '../../operations/memory/create-memory'; import { createRenderer } from '../../templates'; import type { MemoryOption } from '../../tui/screens/generate/types'; -import type { AddGatewayConfig, AddMcpToolConfig } from '../../tui/screens/mcp/types'; +import type { AddGatewayConfig, AddGatewayTargetConfig } from '../../tui/screens/mcp/types'; import { DEFAULT_EVENT_EXPIRY } from '../../tui/screens/memory/types'; -import type { AddAgentResult, AddGatewayResult, AddIdentityResult, AddMcpToolResult, AddMemoryResult } from './types'; +import type { + AddAgentResult, + AddGatewayResult, + AddGatewayTargetResult, + AddIdentityResult, + AddMemoryResult, +} from './types'; import { mkdirSync } from 'fs'; import { dirname, join } from 'path'; @@ -57,7 +63,7 @@ export interface ValidatedAddGatewayOptions { agents?: string; } -export interface ValidatedAddMcpToolOptions { +export interface ValidatedAddGatewayTargetOptions { name: string; description?: string; language: 'Python' | 'TypeScript' | 'Other'; @@ -276,7 +282,7 @@ export async function handleAddGateway(options: ValidatedAddGatewayOptions): Pro } // MCP Tool handler -function buildMcpToolConfig(options: ValidatedAddMcpToolOptions): AddMcpToolConfig { +function buildGatewayTargetConfig(options: ValidatedAddGatewayTargetOptions): AddGatewayTargetConfig { const sourcePath = `${APP_DIR}/${MCP_APP_SUBDIR}/${options.name}`; const description = options.description ?? `Tool for ${options.name}`; @@ -303,9 +309,11 @@ function buildMcpToolConfig(options: ValidatedAddMcpToolOptions): AddMcpToolConf }; } -export async function handleAddMcpTool(options: ValidatedAddMcpToolOptions): Promise { +export async function handleAddGatewayTarget( + options: ValidatedAddGatewayTargetOptions +): Promise { try { - const config = buildMcpToolConfig(options); + const config = buildGatewayTargetConfig(options); const result = await createToolFromWizard(config); return { success: true, toolName: result.toolName, sourcePath: result.projectPath }; } catch (err) { diff --git a/src/cli/commands/add/command.tsx b/src/cli/commands/add/command.tsx index 58a95503..0b1e8abe 100644 --- a/src/cli/commands/add/command.tsx +++ b/src/cli/commands/add/command.tsx @@ -1,19 +1,25 @@ import { COMMAND_DESCRIPTIONS } from '../../tui/copy'; import { requireProject } from '../../tui/guards'; import { AddFlow } from '../../tui/screens/add/AddFlow'; -import { handleAddAgent, handleAddGateway, handleAddIdentity, handleAddMcpTool, handleAddMemory } from './actions'; +import { + handleAddAgent, + handleAddGateway, + handleAddGatewayTarget, + handleAddIdentity, + handleAddMemory, +} from './actions'; import type { AddAgentOptions, AddGatewayOptions, + AddGatewayTargetOptions, AddIdentityOptions, - AddMcpToolOptions, AddMemoryOptions, } from './types'; import { validateAddAgentOptions, validateAddGatewayOptions, + validateAddGatewayTargetOptions, validateAddIdentityOptions, - validateAddMcpToolOptions, validateAddMemoryOptions, } from './validate'; import type { Command } from '@commander-js/extra-typings'; @@ -92,8 +98,8 @@ async function _handleAddGatewayCLI(options: AddGatewayOptions): Promise { } // MCP Tool disabled - prefix with underscore until feature is re-enabled -async function _handleAddMcpToolCLI(options: AddMcpToolOptions): Promise { - const validation = validateAddMcpToolOptions(options); +async function _handleAddGatewayTargetCLI(options: AddGatewayTargetOptions): Promise { + const validation = validateAddGatewayTargetOptions(options); if (!validation.valid) { if (options.json) { console.log(JSON.stringify({ success: false, error: validation.error })); @@ -103,7 +109,7 @@ async function _handleAddMcpToolCLI(options: AddMcpToolOptions): Promise { process.exit(1); } - const result = await handleAddMcpTool({ + const result = await handleAddGatewayTarget({ name: options.name!, description: options.description, language: options.language! as 'Python' | 'TypeScript', @@ -252,10 +258,10 @@ export function registerAdd(program: Command) { process.exit(1); }); - // Subcommand: add mcp-tool (disabled - coming soon) + // Subcommand: add gateway-target (disabled - coming soon) addCmd - .command('mcp-tool', { hidden: true }) - .description('Add an MCP tool to the project') + .command('gateway-target', { hidden: true }) + .description('Add a gateway target to the project') .option('--name ', 'Tool name') .option('--description ', 'Tool description') .option('--language ', 'Language: Python or TypeScript') diff --git a/src/cli/commands/add/types.ts b/src/cli/commands/add/types.ts index f20c3b01..ad002ff8 100644 --- a/src/cli/commands/add/types.ts +++ b/src/cli/commands/add/types.ts @@ -42,7 +42,7 @@ export interface AddGatewayResult { } // MCP Tool types -export interface AddMcpToolOptions { +export interface AddGatewayTargetOptions { name?: string; description?: string; language?: 'Python' | 'TypeScript' | 'Other'; @@ -53,7 +53,7 @@ export interface AddMcpToolOptions { json?: boolean; } -export interface AddMcpToolResult { +export interface AddGatewayTargetResult { success: boolean; toolName?: string; sourcePath?: string; diff --git a/src/cli/commands/add/validate.ts b/src/cli/commands/add/validate.ts index 7ad3de1c..037a6df1 100644 --- a/src/cli/commands/add/validate.ts +++ b/src/cli/commands/add/validate.ts @@ -10,8 +10,8 @@ import { import type { AddAgentOptions, AddGatewayOptions, + AddGatewayTargetOptions, AddIdentityOptions, - AddMcpToolOptions, AddMemoryOptions, } from './types'; @@ -154,7 +154,7 @@ export function validateAddGatewayOptions(options: AddGatewayOptions): Validatio } // MCP Tool validation -export function validateAddMcpToolOptions(options: AddMcpToolOptions): ValidationResult { +export function validateAddGatewayTargetOptions(options: AddGatewayTargetOptions): ValidationResult { if (!options.name) { return { valid: false, error: '--name is required' }; } diff --git a/src/cli/commands/remove/__tests__/remove-mcp-tool.test.ts b/src/cli/commands/remove/__tests__/remove-gateway-target.test.ts similarity index 88% rename from src/cli/commands/remove/__tests__/remove-mcp-tool.test.ts rename to src/cli/commands/remove/__tests__/remove-gateway-target.test.ts index 0e5e797e..00f01e9f 100644 --- a/src/cli/commands/remove/__tests__/remove-mcp-tool.test.ts +++ b/src/cli/commands/remove/__tests__/remove-gateway-target.test.ts @@ -6,18 +6,18 @@ import { join } from 'node:path'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; // MCP Tool feature is disabled (coming soon) - skip all tests -describe.skip('remove mcp-tool command', () => { +describe.skip('remove gateway-target command', () => { let testDir: string; let projectDir: string; const agentName = 'TestAgent'; const runtimeToolName = 'RuntimeTool'; beforeAll(async () => { - testDir = join(tmpdir(), `agentcore-remove-mcp-tool-${randomUUID()}`); + testDir = join(tmpdir(), `agentcore-remove-gateway-target-${randomUUID()}`); await mkdir(testDir, { recursive: true }); // Create project - const projectName = 'RemoveMcpToolProj'; + const projectName = 'RemoveGatewayTargetProj'; let result = await runCLI(['create', '--name', projectName, '--no-agent'], testDir); if (result.exitCode !== 0) { throw new Error(`Failed to create project: ${result.stdout} ${result.stderr}`); @@ -51,7 +51,7 @@ describe.skip('remove mcp-tool command', () => { result = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', runtimeToolName, '--language', @@ -75,7 +75,7 @@ describe.skip('remove mcp-tool command', () => { describe('validation', () => { it('requires name flag', async () => { - const result = await runCLI(['remove', 'mcp-tool', '--json'], projectDir); + const result = await runCLI(['remove', 'gateway-target', '--json'], projectDir); expect(result.exitCode).toBe(1); const json = JSON.parse(result.stdout); expect(json.success).toBe(false); @@ -83,7 +83,7 @@ describe.skip('remove mcp-tool command', () => { }); it('rejects non-existent tool', async () => { - const result = await runCLI(['remove', 'mcp-tool', '--name', 'nonexistent', '--json'], projectDir); + const result = await runCLI(['remove', 'gateway-target', '--name', 'nonexistent', '--json'], projectDir); expect(result.exitCode).toBe(1); const json = JSON.parse(result.stdout); expect(json.success).toBe(false); @@ -98,7 +98,7 @@ describe.skip('remove mcp-tool command', () => { await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', tempTool, '--language', @@ -112,7 +112,7 @@ describe.skip('remove mcp-tool command', () => { projectDir ); - const result = await runCLI(['remove', 'mcp-tool', '--name', tempTool, '--json'], projectDir); + const result = await runCLI(['remove', 'gateway-target', '--name', tempTool, '--json'], projectDir); expect(result.exitCode, `stdout: ${result.stdout}`).toBe(0); const json = JSON.parse(result.stdout); expect(json.success).toBe(true); @@ -143,7 +143,7 @@ describe.skip('remove mcp-tool command', () => { const addResult = await runCLI( [ 'add', - 'mcp-tool', + 'gateway-target', '--name', tempTool, '--language', @@ -160,7 +160,7 @@ describe.skip('remove mcp-tool command', () => { ); expect(addResult.exitCode, `add failed: ${addResult.stdout} ${addResult.stderr}`).toBe(0); - const result = await runCLI(['remove', 'mcp-tool', '--name', tempTool, '--json'], projectDir); + const result = await runCLI(['remove', 'gateway-target', '--name', tempTool, '--json'], projectDir); expect(result.exitCode, `stdout: ${result.stdout}`).toBe(0); const json = JSON.parse(result.stdout); expect(json.success).toBe(true); diff --git a/src/cli/commands/remove/actions.ts b/src/cli/commands/remove/actions.ts index 22518094..3a9ad9e8 100644 --- a/src/cli/commands/remove/actions.ts +++ b/src/cli/commands/remove/actions.ts @@ -1,11 +1,11 @@ import { ConfigIO } from '../../../lib'; import { getErrorMessage } from '../../errors'; import { - getRemovableMcpTools, + getRemovableGatewayTargets, removeAgent, removeGateway, + removeGatewayTarget, removeIdentity, - removeMcpTool, removeMemory, } from '../../operations/remove'; import type { RemoveAllOptions, RemoveResult, ResourceType } from './types'; @@ -46,11 +46,11 @@ export async function handleRemove(options: ValidatedRemoveOptions): Promise t.name === name); if (!tool) return { success: false, error: `MCP tool '${name}' not found` }; - const result = await removeMcpTool(tool); + const result = await removeGatewayTarget(tool); if (!result.ok) return { success: false, error: result.error }; return { success: true, diff --git a/src/cli/commands/remove/command.tsx b/src/cli/commands/remove/command.tsx index 576e204e..11f1dd8f 100644 --- a/src/cli/commands/remove/command.tsx +++ b/src/cli/commands/remove/command.tsx @@ -144,7 +144,7 @@ export const registerRemove = (program: Command) => { // MCP Tool disabled - replace with registerResourceRemove() call when enabling removeCommand - .command('mcp-tool', { hidden: true }) + .command('gateway-target', { hidden: true }) .description('Remove an MCP tool from the project') .option('--name ', 'Name of resource to remove') .option('--force', 'Skip confirmation prompt') diff --git a/src/cli/commands/remove/types.ts b/src/cli/commands/remove/types.ts index 3ad2cd20..d4dbe99b 100644 --- a/src/cli/commands/remove/types.ts +++ b/src/cli/commands/remove/types.ts @@ -1,4 +1,4 @@ -export type ResourceType = 'agent' | 'gateway' | 'mcp-tool' | 'memory' | 'identity'; +export type ResourceType = 'agent' | 'gateway' | 'gateway-target' | 'memory' | 'identity'; export interface RemoveOptions { resourceType: ResourceType; diff --git a/src/cli/logging/remove-logger.ts b/src/cli/logging/remove-logger.ts index ebf97c40..234f820f 100644 --- a/src/cli/logging/remove-logger.ts +++ b/src/cli/logging/remove-logger.ts @@ -7,7 +7,7 @@ const REMOVE_LOGS_SUBDIR = 'remove'; export interface RemoveLoggerOptions { /** Type of resource being removed */ - resourceType: 'agent' | 'memory' | 'identity' | 'gateway' | 'mcp-tool'; + resourceType: 'agent' | 'memory' | 'identity' | 'gateway' | 'gateway-target'; /** Name of the resource being removed */ resourceName: string; } diff --git a/src/cli/operations/mcp/create-mcp.ts b/src/cli/operations/mcp/create-mcp.ts index 5f4447e8..f246fc69 100644 --- a/src/cli/operations/mcp/create-mcp.ts +++ b/src/cli/operations/mcp/create-mcp.ts @@ -10,8 +10,8 @@ import type { FilePath, } from '../../../schema'; import { AgentCoreCliMcpDefsSchema, ToolDefinitionSchema } from '../../../schema'; -import { getTemplateToolDefinitions, renderMcpToolTemplate } from '../../templates/McpToolRenderer'; -import type { AddGatewayConfig, AddMcpToolConfig } from '../../tui/screens/mcp/types'; +import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../../templates/GatewayTargetRenderer'; +import type { AddGatewayConfig, AddGatewayTargetConfig } from '../../tui/screens/mcp/types'; import { DEFAULT_HANDLER, DEFAULT_NODE_VERSION, DEFAULT_PYTHON_VERSION } from '../../tui/screens/mcp/types'; import { existsSync } from 'fs'; import { mkdir, readFile, writeFile } from 'fs/promises'; @@ -171,7 +171,7 @@ export async function createGatewayFromWizard(config: AddGatewayConfig): Promise return { name: config.name }; } -function validateMcpToolLanguage(language: string): asserts language is 'Python' | 'TypeScript' | 'Other' { +function validateGatewayTargetLanguage(language: string): asserts language is 'Python' | 'TypeScript' | 'Other' { if (language !== 'Python' && language !== 'TypeScript' && language !== 'Other') { throw new Error(`MCP tools for language "${language}" are not yet supported.`); } @@ -180,8 +180,8 @@ function validateMcpToolLanguage(language: string): asserts language is 'Python' /** * Create an MCP tool (MCP runtime or behind gateway). */ -export async function createToolFromWizard(config: AddMcpToolConfig): Promise { - validateMcpToolLanguage(config.language); +export async function createToolFromWizard(config: AddGatewayTargetConfig): Promise { + validateGatewayTargetLanguage(config.language); const configIO = new ConfigIO(); const mcpSpec: AgentCoreMcpSpec = configIO.configExists('mcp') @@ -330,7 +330,7 @@ export async function createToolFromWizard(config: AddMcpToolConfig): Promise { +export async function getRemovableGatewayTargets(): Promise { try { const configIO = new ConfigIO(); if (!configIO.configExists('mcp')) { return []; } const mcpSpec = await configIO.readMcpSpec(); - const tools: RemovableMcpTool[] = []; + const tools: RemovableGatewayTarget[] = []; // MCP Runtime tools for (const tool of mcpSpec.mcpRuntimeTools ?? []) { @@ -51,7 +51,7 @@ export async function getRemovableMcpTools(): Promise { /** * Compute the preview of what will be removed when removing an MCP tool. */ -export async function previewRemoveMcpTool(tool: RemovableMcpTool): Promise { +export async function previewRemoveGatewayTarget(tool: RemovableGatewayTarget): Promise { const configIO = new ConfigIO(); const mcpSpec = await configIO.readMcpSpec(); const mcpDefs = configIO.configExists('mcpDefs') ? await configIO.readMcpDefs() : { tools: {} }; @@ -139,7 +139,7 @@ export async function previewRemoveMcpTool(tool: RemovableMcpTool): Promise { +export async function removeGatewayTarget(tool: RemovableGatewayTarget): Promise { try { const configIO = new ConfigIO(); const mcpSpec = await configIO.readMcpSpec(); diff --git a/src/cli/templates/McpToolRenderer.ts b/src/cli/templates/GatewayTargetRenderer.ts similarity index 98% rename from src/cli/templates/McpToolRenderer.ts rename to src/cli/templates/GatewayTargetRenderer.ts index ad15d08f..12e25f4d 100644 --- a/src/cli/templates/McpToolRenderer.ts +++ b/src/cli/templates/GatewayTargetRenderer.ts @@ -68,7 +68,7 @@ export function getTemplateToolDefinitions(toolName: string, host: ComputeHost): * @param language - Target language ('Python' or 'TypeScript') * @param host - Compute host ('Lambda' or 'AgentCoreRuntime') */ -export async function renderMcpToolTemplate( +export async function renderGatewayTargetTemplate( toolName: string, outputDir: string, language: TargetLanguage, diff --git a/src/cli/templates/index.ts b/src/cli/templates/index.ts index f766e05d..fc892ce5 100644 --- a/src/cli/templates/index.ts +++ b/src/cli/templates/index.ts @@ -8,7 +8,7 @@ import type { AgentRenderConfig } from './types'; export { BaseRenderer, type RendererContext } from './BaseRenderer'; export { CDKRenderer, type CDKRendererContext } from './CDKRenderer'; -export { renderMcpToolTemplate } from './McpToolRenderer'; +export { renderGatewayTargetTemplate } from './GatewayTargetRenderer'; export { CrewAIRenderer } from './CrewAIRenderer'; export { GoogleADKRenderer } from './GoogleADKRenderer'; export { LangGraphRenderer } from './LangGraphRenderer'; diff --git a/src/cli/tui/hooks/__tests__/useRemove.test.tsx b/src/cli/tui/hooks/__tests__/useRemove.test.tsx index 4cae4b2a..41783806 100644 --- a/src/cli/tui/hooks/__tests__/useRemove.test.tsx +++ b/src/cli/tui/hooks/__tests__/useRemove.test.tsx @@ -20,17 +20,17 @@ const mockRemoveAgent = vi.fn(); vi.mock('../../../operations/remove', () => ({ getRemovableAgents: (...args: unknown[]) => mockGetRemovableAgents(...args), getRemovableGateways: (...args: unknown[]) => mockGetRemovableGateways(...args), - getRemovableMcpTools: vi.fn().mockResolvedValue([]), + getRemovableGatewayTargets: vi.fn().mockResolvedValue([]), getRemovableMemories: (...args: unknown[]) => mockGetRemovableMemories(...args), getRemovableIdentities: (...args: unknown[]) => mockGetRemovableIdentities(...args), previewRemoveAgent: vi.fn(), previewRemoveGateway: vi.fn(), - previewRemoveMcpTool: vi.fn(), + previewRemoveGatewayTarget: vi.fn(), previewRemoveMemory: vi.fn(), previewRemoveIdentity: vi.fn(), removeAgent: (...args: unknown[]) => mockRemoveAgent(...args), removeGateway: vi.fn(), - removeMcpTool: vi.fn(), + removeGatewayTarget: vi.fn(), removeMemory: vi.fn(), removeIdentity: vi.fn(), })); diff --git a/src/cli/tui/hooks/index.ts b/src/cli/tui/hooks/index.ts index b7f832e9..6138430f 100644 --- a/src/cli/tui/hooks/index.ts +++ b/src/cli/tui/hooks/index.ts @@ -6,7 +6,7 @@ export { useExitHandler } from './useExitHandler'; export { useListNavigation } from './useListNavigation'; export { useMultiSelectNavigation } from './useMultiSelectNavigation'; export { useResponsive } from './useResponsive'; -export { useAvailableAgents, useCreateGateway, useCreateMcpTool, useExistingGateways } from './useCreateMcp'; +export { useAvailableAgents, useCreateGateway, useCreateGatewayTarget, useExistingGateways } from './useCreateMcp'; export { useDevServer } from './useDevServer'; export { useProject } from './useProject'; export type { UseProjectResult, ProjectContext } from './useProject'; diff --git a/src/cli/tui/hooks/useCreateMcp.ts b/src/cli/tui/hooks/useCreateMcp.ts index 7d61d8f2..7d0971eb 100644 --- a/src/cli/tui/hooks/useCreateMcp.ts +++ b/src/cli/tui/hooks/useCreateMcp.ts @@ -6,7 +6,7 @@ import { getExistingGateways, getExistingToolNames, } from '../../operations/mcp/create-mcp'; -import type { AddGatewayConfig, AddMcpToolConfig } from '../screens/mcp/types'; +import type { AddGatewayConfig, AddGatewayTargetConfig } from '../screens/mcp/types'; import { useCallback, useEffect, useState } from 'react'; interface CreateStatus { @@ -38,10 +38,10 @@ export function useCreateGateway() { return { status, createGateway, reset }; } -export function useCreateMcpTool() { +export function useCreateGatewayTarget() { const [status, setStatus] = useState>({ state: 'idle' }); - const createTool = useCallback(async (config: AddMcpToolConfig) => { + const createTool = useCallback(async (config: AddGatewayTargetConfig) => { setStatus({ state: 'loading' }); try { const result = await createToolFromWizard(config); diff --git a/src/cli/tui/hooks/useRemove.ts b/src/cli/tui/hooks/useRemove.ts index f934110c..dccdb79c 100644 --- a/src/cli/tui/hooks/useRemove.ts +++ b/src/cli/tui/hooks/useRemove.ts @@ -1,26 +1,26 @@ import { RemoveLogger } from '../../logging'; import type { + RemovableGatewayTarget, RemovableIdentity, - RemovableMcpTool, RemovableMemory, RemovalPreview, RemovalResult, } from '../../operations/remove'; import { getRemovableAgents, + getRemovableGatewayTargets, getRemovableGateways, getRemovableIdentities, - getRemovableMcpTools, getRemovableMemories, previewRemoveAgent, previewRemoveGateway, + previewRemoveGatewayTarget, previewRemoveIdentity, - previewRemoveMcpTool, previewRemoveMemory, removeAgent, removeGateway, + removeGatewayTarget, removeIdentity, - removeMcpTool, removeMemory, } from '../../operations/remove'; import { useCallback, useEffect, useState } from 'react'; @@ -67,19 +67,19 @@ export function useRemovableGateways() { return { gateways: gateways ?? [], isLoading: gateways === null, refresh }; } -export function useRemovableMcpTools() { - const [tools, setTools] = useState(null); +export function useRemovableGatewayTargets() { + const [tools, setTools] = useState(null); useEffect(() => { async function load() { - const result = await getRemovableMcpTools(); + const result = await getRemovableGatewayTargets(); setTools(result); } void load(); }, []); const refresh = useCallback(async () => { - const result = await getRemovableMcpTools(); + const result = await getRemovableGatewayTargets(); setTools(result); }, []); @@ -167,10 +167,10 @@ export function useRemovalPreview() { } }, []); - const loadMcpToolPreview = useCallback(async (tool: RemovableMcpTool) => { + const loadGatewayTargetPreview = useCallback(async (tool: RemovableGatewayTarget) => { setState({ isLoading: true, preview: null, error: null }); try { - const preview = await previewRemoveMcpTool(tool); + const preview = await previewRemoveGatewayTarget(tool); setState({ isLoading: false, preview, error: null }); return { ok: true as const, preview }; } catch (err) { @@ -214,7 +214,7 @@ export function useRemovalPreview() { ...state, loadAgentPreview, loadGatewayPreview, - loadMcpToolPreview, + loadGatewayTargetPreview, loadMemoryPreview, loadIdentityPreview, reset, @@ -289,18 +289,18 @@ export function useRemoveGateway() { return { ...state, logFilePath, remove, reset }; } -export function useRemoveMcpTool() { +export function useRemoveGatewayTarget() { const [state, setState] = useState({ isLoading: false, result: null }); const [logFilePath, setLogFilePath] = useState(null); - const remove = useCallback(async (tool: RemovableMcpTool, preview?: RemovalPreview): Promise => { + const remove = useCallback(async (tool: RemovableGatewayTarget, preview?: RemovalPreview): Promise => { setState({ isLoading: true, result: null }); - const result = await removeMcpTool(tool); + const result = await removeGatewayTarget(tool); setState({ isLoading: false, result }); let logPath: string | undefined; if (preview) { - const logger = new RemoveLogger({ resourceType: 'mcp-tool', resourceName: tool.name }); + const logger = new RemoveLogger({ resourceType: 'gateway-target', resourceName: tool.name }); logger.logRemoval(preview, result.ok, result.ok ? undefined : result.error); logPath = logger.getAbsoluteLogPath(); setLogFilePath(logPath); diff --git a/src/cli/tui/screens/add/AddFlow.tsx b/src/cli/tui/screens/add/AddFlow.tsx index 236976f3..921da218 100644 --- a/src/cli/tui/screens/add/AddFlow.tsx +++ b/src/cli/tui/screens/add/AddFlow.tsx @@ -7,7 +7,7 @@ import type { AddAgentConfig } from '../agent/types'; import { FRAMEWORK_OPTIONS } from '../agent/types'; import { useAddAgent } from '../agent/useAddAgent'; import { AddIdentityFlow } from '../identity'; -import { AddGatewayFlow, AddMcpToolFlow } from '../mcp'; +import { AddGatewayFlow, AddGatewayTargetFlow } from '../mcp'; import { AddMemoryFlow } from '../memory/AddMemoryFlow'; import type { AddResourceType } from './AddScreen'; import { AddScreen } from './AddScreen'; @@ -163,7 +163,7 @@ export function AddFlow(props: AddFlowProps) { case 'gateway': setFlow({ name: 'gateway-wizard' }); break; - case 'mcp-tool': + case 'gateway-target': setFlow({ name: 'tool-wizard' }); break; case 'memory': @@ -334,10 +334,10 @@ export function AddFlow(props: AddFlowProps) { ); } - // MCP Tool wizard - now uses AddMcpToolFlow with mode selection + // MCP Tool wizard - now uses AddGatewayTargetFlow with mode selection if (flow.name === 'tool-wizard') { return ( - ({ name: 'mode-select' }); @@ -106,7 +106,7 @@ export function AddMcpToolFlow({ }); const handleCreateComplete = useCallback( - (config: AddMcpToolConfig) => { + (config: AddGatewayTargetConfig) => { setFlow({ name: 'create-success', toolName: config.name, @@ -152,7 +152,7 @@ export function AddMcpToolFlow({ // If no MCP runtimes exist to bind, skip to create if (!hasRuntimesToBind) { return ( - void; + onComplete: (config: AddGatewayTargetConfig) => void; onExit: () => void; } -export function AddMcpToolScreen({ +export function AddGatewayTargetScreen({ existingGateways, existingAgents, existingToolNames, onComplete, onExit, -}: AddMcpToolScreenProps) { - const wizard = useAddMcpToolWizard(existingGateways, existingAgents); +}: AddGatewayTargetScreenProps) { + const wizard = useAddGatewayTargetWizard(existingGateways, existingAgents); const languageItems: SelectableItem[] = useMemo( () => TARGET_LANGUAGE_OPTIONS.map(o => ({ id: o.id, title: o.title, description: o.description })), diff --git a/src/cli/tui/screens/mcp/index.ts b/src/cli/tui/screens/mcp/index.ts index 06818162..c7e6956a 100644 --- a/src/cli/tui/screens/mcp/index.ts +++ b/src/cli/tui/screens/mcp/index.ts @@ -1,14 +1,14 @@ export { AddGatewayFlow } from './AddGatewayFlow'; export { AddGatewayScreen } from './AddGatewayScreen'; -export { AddMcpToolFlow } from './AddMcpToolFlow'; -export { AddMcpToolScreen } from './AddMcpToolScreen'; +export { AddGatewayTargetFlow } from './AddGatewayTargetFlow'; +export { AddGatewayTargetScreen } from './AddGatewayTargetScreen'; export { useAddGatewayWizard } from './useAddGatewayWizard'; -export { useAddMcpToolWizard } from './useAddMcpWizard'; +export { useAddGatewayTargetWizard } from './useAddGatewayTargetWizard'; export type { AddGatewayConfig, AddGatewayStep, - AddMcpToolConfig, - AddMcpToolStep, + AddGatewayTargetConfig, + AddGatewayTargetStep, ComputeHost, ExposureMode, } from './types'; diff --git a/src/cli/tui/screens/mcp/types.ts b/src/cli/tui/screens/mcp/types.ts index 46fe7600..89b74bc5 100644 --- a/src/cli/tui/screens/mcp/types.ts +++ b/src/cli/tui/screens/mcp/types.ts @@ -47,11 +47,11 @@ export type ComputeHost = 'Lambda' | 'AgentCoreRuntime'; * - host: Select compute host (only if behind-gateway) * - confirm: Review and confirm */ -export type AddMcpToolStep = 'name' | 'language' | 'exposure' | 'agents' | 'gateway' | 'host' | 'confirm'; +export type AddGatewayTargetStep = 'name' | 'language' | 'exposure' | 'agents' | 'gateway' | 'host' | 'confirm'; export type TargetLanguage = 'Python' | 'TypeScript' | 'Other'; -export interface AddMcpToolConfig { +export interface AddGatewayTargetConfig { name: string; description: string; sourcePath: string; @@ -67,7 +67,7 @@ export interface AddMcpToolConfig { selectedAgents: string[]; } -export const MCP_TOOL_STEP_LABELS: Record = { +export const MCP_TOOL_STEP_LABELS: Record = { name: 'Name', language: 'Language', exposure: 'Exposure', diff --git a/src/cli/tui/screens/mcp/useAddMcpWizard.ts b/src/cli/tui/screens/mcp/useAddGatewayTargetWizard.ts similarity index 86% rename from src/cli/tui/screens/mcp/useAddMcpWizard.ts rename to src/cli/tui/screens/mcp/useAddGatewayTargetWizard.ts index 4c32186d..2deda24e 100644 --- a/src/cli/tui/screens/mcp/useAddMcpWizard.ts +++ b/src/cli/tui/screens/mcp/useAddGatewayTargetWizard.ts @@ -1,6 +1,6 @@ import { APP_DIR, MCP_APP_SUBDIR } from '../../../../lib'; import type { ToolDefinition } from '../../../../schema'; -import type { AddMcpToolConfig, AddMcpToolStep, ComputeHost, ExposureMode, TargetLanguage } from './types'; +import type { AddGatewayTargetConfig, AddGatewayTargetStep, ComputeHost, ExposureMode, TargetLanguage } from './types'; import { useCallback, useMemo, useState } from 'react'; /** @@ -8,7 +8,7 @@ import { useCallback, useMemo, useState } from 'react'; * - MCP Runtime: name → language → exposure → agents → confirm * - Behind gateway: name → language → exposure → gateway → host → confirm */ -function getSteps(exposure: ExposureMode): AddMcpToolStep[] { +function getSteps(exposure: ExposureMode): AddGatewayTargetStep[] { if (exposure === 'mcp-runtime') { return ['name', 'language', 'exposure', 'agents', 'confirm']; } @@ -23,7 +23,7 @@ function deriveToolDefinition(name: string): ToolDefinition { }; } -function getDefaultConfig(): AddMcpToolConfig { +function getDefaultConfig(): AddGatewayTargetConfig { return { name: '', description: '', @@ -36,9 +36,9 @@ function getDefaultConfig(): AddMcpToolConfig { }; } -export function useAddMcpToolWizard(existingGateways: string[] = [], existingAgents: string[] = []) { - const [config, setConfig] = useState(getDefaultConfig); - const [step, setStep] = useState('name'); +export function useAddGatewayTargetWizard(existingGateways: string[] = [], existingAgents: string[] = []) { + const [config, setConfig] = useState(getDefaultConfig); + const [step, setStep] = useState('name'); const steps = useMemo(() => getSteps(config.exposure), [config.exposure]); const currentIndex = steps.indexOf(step); diff --git a/src/cli/tui/screens/remove/RemoveFlow.tsx b/src/cli/tui/screens/remove/RemoveFlow.tsx index e2aed558..5f299cb5 100644 --- a/src/cli/tui/screens/remove/RemoveFlow.tsx +++ b/src/cli/tui/screens/remove/RemoveFlow.tsx @@ -1,24 +1,24 @@ -import type { RemovableMcpTool, RemovalPreview } from '../../../operations/remove'; +import type { RemovableGatewayTarget, RemovalPreview } from '../../../operations/remove'; import { ErrorPrompt, Panel, Screen } from '../../components'; import { useRemovableAgents, + useRemovableGatewayTargets, useRemovableGateways, useRemovableIdentities, - useRemovableMcpTools, useRemovableMemories, useRemovalPreview, useRemoveAgent, useRemoveGateway, + useRemoveGatewayTarget, useRemoveIdentity, - useRemoveMcpTool, useRemoveMemory, } from '../../hooks/useRemove'; import { RemoveAgentScreen } from './RemoveAgentScreen'; import { RemoveAllScreen } from './RemoveAllScreen'; import { RemoveConfirmScreen } from './RemoveConfirmScreen'; import { RemoveGatewayScreen } from './RemoveGatewayScreen'; +import { RemoveGatewayTargetScreen } from './RemoveGatewayTargetScreen'; import { RemoveIdentityScreen } from './RemoveIdentityScreen'; -import { RemoveMcpToolScreen } from './RemoveMcpToolScreen'; import { RemoveMemoryScreen } from './RemoveMemoryScreen'; import type { RemoveResourceType } from './RemoveScreen'; import { RemoveScreen } from './RemoveScreen'; @@ -31,12 +31,12 @@ type FlowState = | { name: 'select' } | { name: 'select-agent' } | { name: 'select-gateway' } - | { name: 'select-mcp-tool' } + | { name: 'select-gateway-target' } | { name: 'select-memory' } | { name: 'select-identity' } | { name: 'confirm-agent'; agentName: string; preview: RemovalPreview } | { name: 'confirm-gateway'; gatewayName: string; preview: RemovalPreview } - | { name: 'confirm-mcp-tool'; tool: RemovableMcpTool; preview: RemovalPreview } + | { name: 'confirm-gateway-target'; tool: RemovableGatewayTarget; preview: RemovalPreview } | { name: 'confirm-memory'; memoryName: string; preview: RemovalPreview } | { name: 'confirm-identity'; identityName: string; preview: RemovalPreview } | { name: 'loading'; message: string } @@ -57,7 +57,7 @@ interface RemoveFlowProps { /** Force mode - skip confirmation */ force?: boolean; /** Initial resource type to start at (for CLI subcommands) */ - initialResourceType?: 'agent' | 'gateway' | 'mcp-tool' | 'memory' | 'identity'; + initialResourceType?: 'agent' | 'gateway' | 'gateway-target' | 'memory' | 'identity'; /** Initial resource name to auto-select (for CLI --name flag) */ initialResourceName?: string; } @@ -77,8 +77,8 @@ export function RemoveFlow({ return { name: 'select-agent' }; case 'gateway': return { name: 'select-gateway' }; - case 'mcp-tool': - return { name: 'select-mcp-tool' }; + case 'gateway-target': + return { name: 'select-gateway-target' }; case 'memory': return { name: 'select-memory' }; case 'identity': @@ -92,7 +92,7 @@ export function RemoveFlow({ // Data hooks - need isLoading to avoid showing screen before data loads const { agents, isLoading: isLoadingAgents, refresh: refreshAgents } = useRemovableAgents(); const { gateways, isLoading: isLoadingGateways, refresh: refreshGateways } = useRemovableGateways(); - const { tools: mcpTools, isLoading: isLoadingTools, refresh: refreshTools } = useRemovableMcpTools(); + const { tools: mcpTools, isLoading: isLoadingTools, refresh: refreshTools } = useRemovableGatewayTargets(); const { memories, isLoading: isLoadingMemories, refresh: refreshMemories } = useRemovableMemories(); const { identities, isLoading: isLoadingIdentities, refresh: refreshIdentities } = useRemovableIdentities(); @@ -103,7 +103,7 @@ export function RemoveFlow({ const { loadAgentPreview, loadGatewayPreview, - loadMcpToolPreview, + loadGatewayTargetPreview, loadMemoryPreview, loadIdentityPreview, reset: resetPreview, @@ -112,7 +112,7 @@ export function RemoveFlow({ // Removal hooks const { remove: removeAgentOp, reset: resetRemoveAgent } = useRemoveAgent(); const { remove: removeGatewayOp, reset: resetRemoveGateway } = useRemoveGateway(); - const { remove: removeMcpToolOp, reset: resetRemoveMcpTool } = useRemoveMcpTool(); + const { remove: removeGatewayTargetOp, reset: resetRemoveGatewayTarget } = useRemoveGatewayTarget(); const { remove: removeMemoryOp, reset: resetRemoveMemory } = useRemoveMemory(); const { remove: removeIdentityOp, reset: resetRemoveIdentity } = useRemoveIdentity(); @@ -153,8 +153,8 @@ export function RemoveFlow({ case 'gateway': setFlow({ name: 'select-gateway' }); break; - case 'mcp-tool': - setFlow({ name: 'select-mcp-tool' }); + case 'gateway-target': + setFlow({ name: 'select-gateway-target' }); break; case 'memory': setFlow({ name: 'select-memory' }); @@ -215,26 +215,26 @@ export function RemoveFlow({ [loadGatewayPreview, force, removeGatewayOp] ); - const handleSelectMcpTool = useCallback( - async (tool: RemovableMcpTool) => { - const result = await loadMcpToolPreview(tool); + const handleSelectGatewayTarget = useCallback( + async (tool: RemovableGatewayTarget) => { + const result = await loadGatewayTargetPreview(tool); if (result.ok) { if (force) { setFlow({ name: 'loading', message: `Removing MCP tool ${tool.name}...` }); - const removeResult = await removeMcpToolOp(tool, result.preview); + const removeResult = await removeGatewayTargetOp(tool, result.preview); if (removeResult.ok) { setFlow({ name: 'tool-success', toolName: tool.name }); } else { setFlow({ name: 'error', message: removeResult.error }); } } else { - setFlow({ name: 'confirm-mcp-tool', tool, preview: result.preview }); + setFlow({ name: 'confirm-gateway-target', tool, preview: result.preview }); } } else { setFlow({ name: 'error', message: result.error }); } }, - [loadMcpToolPreview, force, removeMcpToolOp] + [loadGatewayTargetPreview, force, removeGatewayTargetOp] ); const handleSelectMemory = useCallback( @@ -350,12 +350,12 @@ export function RemoveFlow({ [removeGatewayOp] ); - const handleConfirmMcpTool = useCallback( - async (tool: RemovableMcpTool, preview: RemovalPreview) => { + const handleConfirmGatewayTarget = useCallback( + async (tool: RemovableGatewayTarget, preview: RemovalPreview) => { pendingResultRef.current = null; setResultReady(false); setFlow({ name: 'loading', message: `Removing MCP tool ${tool.name}...` }); - const result = await removeMcpToolOp(tool, preview); + const result = await removeGatewayTargetOp(tool, preview); if (result.ok) { pendingResultRef.current = { name: 'tool-success', toolName: tool.name, logFilePath: result.logFilePath }; } else { @@ -363,7 +363,7 @@ export function RemoveFlow({ } setResultReady(true); }, - [removeMcpToolOp] + [removeGatewayTargetOp] ); const handleConfirmMemory = useCallback( @@ -402,10 +402,17 @@ export function RemoveFlow({ resetPreview(); resetRemoveAgent(); resetRemoveGateway(); - resetRemoveMcpTool(); + resetRemoveGatewayTarget(); resetRemoveMemory(); resetRemoveIdentity(); - }, [resetPreview, resetRemoveAgent, resetRemoveGateway, resetRemoveMcpTool, resetRemoveMemory, resetRemoveIdentity]); + }, [ + resetPreview, + resetRemoveAgent, + resetRemoveGateway, + resetRemoveGatewayTarget, + resetRemoveMemory, + resetRemoveIdentity, + ]); const refreshAll = useCallback(async () => { await Promise.all([refreshAgents(), refreshGateways(), refreshTools(), refreshMemories(), refreshIdentities()]); @@ -471,11 +478,11 @@ export function RemoveFlow({ ); } - if (flow.name === 'select-mcp-tool') { + if (flow.name === 'select-gateway-target') { return ( - void handleSelectMcpTool(tool)} + onSelect={(tool: RemovableGatewayTarget) => void handleSelectGatewayTarget(tool)} onExit={() => setFlow({ name: 'select' })} /> ); @@ -530,13 +537,13 @@ export function RemoveFlow({ ); } - if (flow.name === 'confirm-mcp-tool') { + if (flow.name === 'confirm-gateway-target') { return ( void handleConfirmMcpTool(flow.tool, flow.preview)} - onCancel={() => setFlow({ name: 'select-mcp-tool' })} + onConfirm={() => void handleConfirmGatewayTarget(flow.tool, flow.preview)} + onCancel={() => setFlow({ name: 'select-gateway-target' })} /> ); } diff --git a/src/cli/tui/screens/remove/RemoveMcpToolScreen.tsx b/src/cli/tui/screens/remove/RemoveGatewayTargetScreen.tsx similarity index 71% rename from src/cli/tui/screens/remove/RemoveMcpToolScreen.tsx rename to src/cli/tui/screens/remove/RemoveGatewayTargetScreen.tsx index eab5fc67..e0253ddb 100644 --- a/src/cli/tui/screens/remove/RemoveMcpToolScreen.tsx +++ b/src/cli/tui/screens/remove/RemoveGatewayTargetScreen.tsx @@ -1,17 +1,17 @@ -import type { RemovableMcpTool } from '../../../operations/remove'; +import type { RemovableGatewayTarget } from '../../../operations/remove'; import { SelectScreen } from '../../components'; import React from 'react'; -interface RemoveMcpToolScreenProps { +interface RemoveGatewayTargetScreenProps { /** List of MCP tools that can be removed */ - tools: RemovableMcpTool[]; + tools: RemovableGatewayTarget[]; /** Called when a tool is selected for removal */ - onSelect: (tool: RemovableMcpTool) => void; + onSelect: (tool: RemovableGatewayTarget) => void; /** Called when user cancels */ onExit: () => void; } -export function RemoveMcpToolScreen({ tools, onSelect, onExit }: RemoveMcpToolScreenProps) { +export function RemoveGatewayTargetScreen({ tools, onSelect, onExit }: RemoveGatewayTargetScreenProps) { const items = tools.map(tool => ({ id: tool.name, title: tool.name, diff --git a/src/cli/tui/screens/remove/RemoveScreen.tsx b/src/cli/tui/screens/remove/RemoveScreen.tsx index 92ff2356..fe140276 100644 --- a/src/cli/tui/screens/remove/RemoveScreen.tsx +++ b/src/cli/tui/screens/remove/RemoveScreen.tsx @@ -7,7 +7,7 @@ const REMOVE_RESOURCES = [ { id: 'memory', title: 'Memory', description: 'Remove a memory provider' }, { id: 'identity', title: 'Identity', description: 'Remove an identity provider' }, { id: 'gateway', title: 'Gateway (coming soon)', description: 'Remove an MCP gateway', disabled: true }, - { id: 'mcp-tool', title: 'MCP Tool (coming soon)', description: 'Remove an MCP tool', disabled: true }, + { id: 'gateway-target', title: 'MCP Tool (coming soon)', description: 'Remove an MCP tool', disabled: true }, { id: 'all', title: 'All', description: 'Reset entire agentcore project' }, ] as const; diff --git a/src/cli/tui/screens/remove/index.ts b/src/cli/tui/screens/remove/index.ts index d8c46d47..71d78c30 100644 --- a/src/cli/tui/screens/remove/index.ts +++ b/src/cli/tui/screens/remove/index.ts @@ -4,7 +4,7 @@ export { RemoveConfirmScreen } from './RemoveConfirmScreen'; export { RemoveFlow } from './RemoveFlow'; export { RemoveGatewayScreen } from './RemoveGatewayScreen'; export { RemoveIdentityScreen } from './RemoveIdentityScreen'; -export { RemoveMcpToolScreen } from './RemoveMcpToolScreen'; +export { RemoveGatewayTargetScreen } from './RemoveGatewayTargetScreen'; export { RemoveMemoryScreen } from './RemoveMemoryScreen'; export { RemoveScreen, type RemoveResourceType } from './RemoveScreen'; export { RemoveSuccessScreen } from './RemoveSuccessScreen'; diff --git a/src/cli/tui/screens/schema/McpGuidedEditor.tsx b/src/cli/tui/screens/schema/McpGuidedEditor.tsx index f87693e3..f8c0b74b 100644 --- a/src/cli/tui/screens/schema/McpGuidedEditor.tsx +++ b/src/cli/tui/screens/schema/McpGuidedEditor.tsx @@ -198,7 +198,7 @@ function McpEditorBody(props: { return; } if (key.return && targets.length > 0) { - setEditingTargetFieldId('toolName'); + setEditingTargetFieldId('targetName'); setScreenMode('edit-target-field'); return; } diff --git a/src/cli/tui/utils/__tests__/commands.test.ts b/src/cli/tui/utils/__tests__/commands.test.ts index d4753638..46ac7319 100644 --- a/src/cli/tui/utils/__tests__/commands.test.ts +++ b/src/cli/tui/utils/__tests__/commands.test.ts @@ -22,7 +22,7 @@ function makeProgram(cmds: Command[]) { describe('getCommandsForUI', () => { const program = makeProgram([ makeCmd('create', 'Create a new project'), - makeCmd('add', 'Add a resource', ['agent', 'memory', 'gateway', 'mcp-tool']), + makeCmd('add', 'Add a resource', ['agent', 'memory', 'gateway', 'gateway-target']), makeCmd('deploy', 'Deploy to AWS'), makeCmd('status', 'Check status'), makeCmd('help', 'Show help'), @@ -60,14 +60,14 @@ describe('getCommandsForUI', () => { expect(names).toContain('create'); }); - it('filters hidden subcommands (gateway, mcp-tool)', () => { + it('filters hidden subcommands (gateway, gateway-target)', () => { const cmds = getCommandsForUI(program); const addCmd = cmds.find(c => c.id === 'add'); expect(addCmd).toBeDefined(); expect(addCmd!.subcommands).toContain('agent'); expect(addCmd!.subcommands).toContain('memory'); expect(addCmd!.subcommands).not.toContain('gateway'); - expect(addCmd!.subcommands).not.toContain('mcp-tool'); + expect(addCmd!.subcommands).not.toContain('gateway-target'); }); it('returns command metadata shape', () => { diff --git a/src/cli/tui/utils/commands.ts b/src/cli/tui/utils/commands.ts index 13c4d820..874a08af 100644 --- a/src/cli/tui/utils/commands.ts +++ b/src/cli/tui/utils/commands.ts @@ -24,7 +24,7 @@ const HIDDEN_WHEN_IN_PROJECT = ['create'] as const; * These are registered with { hidden: true } in commander but we track them * here since commander doesn't expose a public API to check hidden status. */ -const HIDDEN_SUBCOMMANDS = ['gateway', 'mcp-tool'] as const; +const HIDDEN_SUBCOMMANDS = ['gateway', 'gateway-target'] as const; interface GetCommandsOptions { /** Whether user is currently inside an AgentCore project */