From ddd60195b3ac7e9637cede8b22b2485af841d0ea Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 17 Jun 2026 15:50:37 -0400 Subject: [PATCH] chore: ungate web-search commands (#1558) --- src/cli/primitives/GatewayTargetPrimitive.ts | 31 +++++-------------- src/cli/tui/screens/add/AddScreen.tsx | 2 +- .../screens/add/__tests__/AddScreen.test.tsx | 11 ------- .../screens/mcp/AddGatewayTargetScreen.tsx | 2 +- 4 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/cli/primitives/GatewayTargetPrimitive.ts b/src/cli/primitives/GatewayTargetPrimitive.ts index 71d363f77..f96d5d0f4 100644 --- a/src/cli/primitives/GatewayTargetPrimitive.ts +++ b/src/cli/primitives/GatewayTargetPrimitive.ts @@ -283,12 +283,9 @@ export class GatewayTargetPrimitive extends BasePrimitive(option: T): T => (isGatedFeaturesEnabled() ? option : option.hideHelp()); - const typeDescription = isGatedFeaturesEnabled() ? 'Target type (required): mcp-server, api-gateway, open-api-schema, smithy-model, lambda-function-arn, http-runtime, connector, passthrough, web-search [non-interactive]' - : 'Target type (required): mcp-server, api-gateway, open-api-schema, smithy-model, lambda-function-arn, http-runtime, connector [non-interactive]'; + : 'Target type (required): mcp-server, api-gateway, open-api-schema, smithy-model, lambda-function-arn, http-runtime, connector, web-search [non-interactive]'; // Reject repeated use of --exclude-domains. Domains must be passed as a // single comma-separated value. @@ -318,13 +315,10 @@ export class GatewayTargetPrimitive extends BasePrimitive [...acc, val], [] as string[] ) - .addOption( - gate( - new Option( - '--exclude-domains ', - 'Comma-separated domains to exclude from results (for --type web-search only) [non-interactive]' - ).argParser(excludeDomainsCoercer) - ) + .option( + '--exclude-domains ', + 'Comma-separated domains to exclude from results (for --type web-search only) [non-interactive]', + excludeDomainsCoercer ) .option('--endpoint ', 'Server endpoint URL (for mcp-server type) [non-interactive]') .option('--language ', 'Language of target code: Python, TypeScript, Other [non-interactive]') @@ -619,9 +613,6 @@ ${ // Handle Amazon Web Search targets (managed-service backed via gateway IAM role) if (cliOptions.type === 'webSearch') { - if (!isGatedFeaturesEnabled()) { - throw new ValidationError('Web search target type is not yet available.'); - } const excludeDomains = typeof cliOptions.excludeDomains === 'string' ? cliOptions.excludeDomains @@ -911,17 +902,13 @@ ${ // Top-level shortcuts: agentcore add web-search / remove web-search // ────────────────────────────────────────────────────────────────── addCmd - .command('web-search', { hidden: !isGatedFeaturesEnabled() }) + .command('web-search') .description('Wire the Amazon Web Search managed connector to a gateway as a target.') .option('--name ', 'Target name (default: web-search) [non-interactive]') .option('--gateway ', 'Gateway to attach this target to [non-interactive]') .option('--exclude-domains ', 'Comma-separated domains to exclude from results [non-interactive]') .option('--json', 'Output as JSON [non-interactive]') .action(async (cliOptions: { name?: string; gateway?: string; excludeDomains?: string; json?: boolean }) => { - if (!isGatedFeaturesEnabled()) { - console.error('Error: Web search target type is not yet available.'); - process.exit(1); - } if (!findConfigRoot()) { console.error('No agentcore project found. Run `agentcore create` first.'); process.exit(1); @@ -1009,17 +996,13 @@ ${ }); removeCmd - .command('web-search', { hidden: !isGatedFeaturesEnabled() }) + .command('web-search') .description('Remove an Amazon Web Search gateway target from the project') .option('--name ', 'Name of the web-search target to remove [non-interactive]') .option('-y, --yes', 'Skip confirmation prompt [non-interactive]') .option('--json', 'Output as JSON [non-interactive]') .action(async (cliOptions: { name?: string; yes?: boolean; json?: boolean }) => { try { - if (!isGatedFeaturesEnabled()) { - console.error('Web search target type is not yet available.'); - process.exit(1); - } if (!findConfigRoot()) { console.error('No agentcore project found. Run `agentcore create` first.'); process.exit(1); diff --git a/src/cli/tui/screens/add/AddScreen.tsx b/src/cli/tui/screens/add/AddScreen.tsx index aca3e59a8..45da63ff6 100644 --- a/src/cli/tui/screens/add/AddScreen.tsx +++ b/src/cli/tui/screens/add/AddScreen.tsx @@ -52,7 +52,7 @@ const ADD_RESOURCES: { id: AddResourceType; title: string; description: string } ]; const ADD_RESOURCE_ITEMS: SelectableItem[] = ADD_RESOURCES.map(r => { - const gated = (r.id === 'knowledge-base' || r.id === 'web-search') && !isGatedFeaturesEnabled(); + const gated = r.id === 'knowledge-base' && !isGatedFeaturesEnabled(); return { ...r, disabled: gated, diff --git a/src/cli/tui/screens/add/__tests__/AddScreen.test.tsx b/src/cli/tui/screens/add/__tests__/AddScreen.test.tsx index 7ca2a3cb7..82ae13de0 100644 --- a/src/cli/tui/screens/add/__tests__/AddScreen.test.tsx +++ b/src/cli/tui/screens/add/__tests__/AddScreen.test.tsx @@ -32,15 +32,4 @@ describe('AddScreen', () => { expect(lastFrame()).toContain('Payment Manager'); expect(lastFrame()).toContain('Payment Connector'); }); - - it('Web Search option shows Coming soon when ENABLE_GATED_FEATURES is unset', () => { - delete process.env.ENABLE_GATED_FEATURES; - const onSelect = vi.fn(); - const onExit = vi.fn(); - - const { lastFrame } = render(); - - expect(lastFrame()).toContain('Web Search'); - expect(lastFrame()).toContain('Coming soon'); - }); }); diff --git a/src/cli/tui/screens/mcp/AddGatewayTargetScreen.tsx b/src/cli/tui/screens/mcp/AddGatewayTargetScreen.tsx index 18802a581..b3e2aa835 100644 --- a/src/cli/tui/screens/mcp/AddGatewayTargetScreen.tsx +++ b/src/cli/tui/screens/mcp/AddGatewayTargetScreen.tsx @@ -155,7 +155,7 @@ export function AddGatewayTargetScreen({ const targetTypeItems: SelectableItem[] = useMemo( () => TARGET_TYPE_OPTIONS.map(o => { - const gated = (o.id === 'passthrough' || o.id === 'webSearch') && !isGatedFeaturesEnabled(); + const gated = o.id === 'passthrough' && !isGatedFeaturesEnabled(); return { id: o.id, title: o.title,