Skip to content

Commit dd42dba

Browse files
committed
fix: update primitives for gateway integration and resolve post-rebase issues
Absorb gateway integration changes from main into the primitive architecture: - Update GatewayPrimitive with unassigned targets, OAuth auto-credential, allowedScopes - Update GatewayTargetPrimitive with mcp-tool→gateway-target rename and external endpoints - Update CredentialPrimitive with OAuth2 discriminated union, managed credential protection, gateway target reference checking, and hyphen→underscore env var fix - Remove VPC-related code from AgentPrimitive (removed upstream) - Break circular dependency: validate.ts no longer imports from primitive registry - Delete obsolete test files for absorbed modules, fix test mocks and expectations
1 parent ca51763 commit dd42dba

20 files changed

Lines changed: 136 additions & 448 deletions

src/cli/commands/add/__tests__/actions.test.ts

Lines changed: 0 additions & 100 deletions
This file was deleted.

src/cli/commands/add/__tests__/validate.test.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,17 @@ import {
1515
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
1616

1717
const mockReadProjectSpec = vi.fn();
18-
const mockGetExistingGateways = vi.fn();
18+
const mockConfigExists = vi.fn().mockReturnValue(true);
19+
const mockReadMcpSpec = vi.fn();
1920

2021
vi.mock('../../../../lib/index.js', () => ({
2122
ConfigIO: class {
2223
readProjectSpec = mockReadProjectSpec;
24+
configExists = mockConfigExists;
25+
readMcpSpec = mockReadMcpSpec;
2326
},
2427
}));
2528

26-
vi.mock('../../../operations/mcp/create-mcp.js', () => ({
27-
getExistingGateways: (...args: unknown[]) => mockGetExistingGateways(...args),
28-
}));
29-
3029
// Helper: valid base options for each type
3130
const validAgentOptionsByo: AddAgentOptions = {
3231
name: 'TestAgent',
@@ -307,7 +306,7 @@ describe('validate', () => {
307306
describe('validateAddGatewayTargetOptions', () => {
308307
beforeEach(() => {
309308
// By default, mock that the gateway from validGatewayTargetOptions exists
310-
mockGetExistingGateways.mockResolvedValue(['my-gateway']);
309+
mockReadMcpSpec.mockResolvedValue({ agentCoreGateways: [{ name: 'my-gateway' }] });
311310
});
312311

313312
// AC15: Required fields validated
@@ -326,15 +325,15 @@ describe('validate', () => {
326325
});
327326

328327
it('returns error when no gateways exist', async () => {
329-
mockGetExistingGateways.mockResolvedValue([]);
328+
mockReadMcpSpec.mockResolvedValue({ agentCoreGateways: [] });
330329
const result = await validateAddGatewayTargetOptions(validGatewayTargetOptions);
331330
expect(result.valid).toBe(false);
332331
expect(result.error).toContain('No gateways found');
333332
expect(result.error).toContain('agentcore add gateway');
334333
});
335334

336335
it('returns error when specified gateway does not exist', async () => {
337-
mockGetExistingGateways.mockResolvedValue(['other-gateway']);
336+
mockReadMcpSpec.mockResolvedValue({ agentCoreGateways: [{ name: 'other-gateway' }] });
338337
const result = await validateAddGatewayTargetOptions(validGatewayTargetOptions);
339338
expect(result.valid).toBe(false);
340339
expect(result.error).toContain('Gateway "my-gateway" not found');

src/cli/commands/add/validate.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
getSupportedModelProviders,
1010
matchEnumValue,
1111
} from '../../../schema';
12-
import { getExistingGateways } from '../../operations/mcp/create-mcp';
1312
import type {
1413
AddAgentOptions,
1514
AddGatewayOptions,
@@ -238,7 +237,16 @@ export async function validateAddGatewayTargetOptions(options: AddGatewayTargetO
238237
}
239238

240239
// Validate the specified gateway exists
241-
const existingGateways = await getExistingGateways();
240+
const gatewayConfigIO = new ConfigIO();
241+
let existingGateways: string[] = [];
242+
try {
243+
if (gatewayConfigIO.configExists('mcp')) {
244+
const mcpSpec = await gatewayConfigIO.readMcpSpec();
245+
existingGateways = mcpSpec.agentCoreGateways.map(g => g.name);
246+
}
247+
} catch {
248+
// If we can't read the config, treat as no gateways
249+
}
242250
if (existingGateways.length === 0) {
243251
return {
244252
valid: false,

src/cli/operations/deploy/__tests__/pre-deploy-identity.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,15 @@ vi.mock('../../identity/index.js', () => ({
4949
createApiKeyProvider: vi.fn(),
5050
setTokenVaultKmsKey: mockSetTokenVaultKmsKey,
5151
updateApiKeyProvider: vi.fn(),
52-
}));
53-
54-
vi.mock('../../identity/oauth2-credential-provider.js', () => ({
5552
oAuth2ProviderExists: mockOAuth2ProviderExists,
5653
createOAuth2Provider: mockCreateOAuth2Provider,
5754
updateOAuth2Provider: mockUpdateOAuth2Provider,
5855
}));
5956

60-
vi.mock('../../identity/create-identity.js', () => ({
61-
computeDefaultCredentialEnvVarName: vi.fn((name: string) => `AGENTCORE_CREDENTIAL_${name.toUpperCase()}`),
57+
vi.mock('../../../primitives/credential-utils.js', () => ({
58+
computeDefaultCredentialEnvVarName: vi.fn(
59+
(name: string) => `AGENTCORE_CREDENTIAL_${name.replace(/-/g, '_').toUpperCase()}`
60+
),
6261
}));
6362

6463
vi.mock('../../../../lib/index.js', () => ({
@@ -230,7 +229,7 @@ describe('getAllCredentials', () => {
230229
credentials: [{ name: 'test-api', type: 'ApiKeyCredentialProvider' }],
231230
};
232231
const result = getAllCredentials(projectSpec as any);
233-
expect(result).toEqual([{ providerName: 'test-api', envVarName: 'AGENTCORE_CREDENTIAL_TEST-API' }]);
232+
expect(result).toEqual([{ providerName: 'test-api', envVarName: 'AGENTCORE_CREDENTIAL_TEST_API' }]);
234233
});
235234

236235
it('returns CLIENT_ID and CLIENT_SECRET vars for OAuthCredentialProvider', () => {
@@ -253,7 +252,7 @@ describe('getAllCredentials', () => {
253252
};
254253
const result = getAllCredentials(projectSpec as any);
255254
expect(result).toEqual([
256-
{ providerName: 'api-key', envVarName: 'AGENTCORE_CREDENTIAL_API-KEY' },
255+
{ providerName: 'api-key', envVarName: 'AGENTCORE_CREDENTIAL_API_KEY' },
257256
{ providerName: 'oauth-cred', envVarName: 'AGENTCORE_CREDENTIAL_OAUTH_CRED_CLIENT_ID' },
258257
{ providerName: 'oauth-cred', envVarName: 'AGENTCORE_CREDENTIAL_OAUTH_CRED_CLIENT_SECRET' },
259258
]);

src/cli/operations/identity/__tests__/credential-ops.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ describe('createCredential', () => {
4848
mockWriteProjectSpec.mockResolvedValue(undefined);
4949
mockSetEnvVar.mockResolvedValue(undefined);
5050

51-
const result = await primitive.add({ name: 'NewCred', apiKey: 'key123' });
51+
const result = await primitive.add({ type: 'ApiKeyCredentialProvider', name: 'NewCred', apiKey: 'key123' });
5252

5353
expect(result).toEqual(expect.objectContaining({ success: true, credentialName: 'NewCred' }));
5454
expect(mockWriteProjectSpec).toHaveBeenCalled();
@@ -60,7 +60,7 @@ describe('createCredential', () => {
6060
mockReadProjectSpec.mockResolvedValue({ credentials: [existing] });
6161
mockSetEnvVar.mockResolvedValue(undefined);
6262

63-
const result = await primitive.add({ name: 'ExistCred', apiKey: 'newkey' });
63+
const result = await primitive.add({ type: 'ApiKeyCredentialProvider', name: 'ExistCred', apiKey: 'newkey' });
6464

6565
expect(result).toEqual(expect.objectContaining({ success: true, credentialName: 'ExistCred' }));
6666
expect(mockWriteProjectSpec).not.toHaveBeenCalled();

src/cli/operations/mcp/__tests__/create-mcp-utils.test.ts

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ vi.mock('../../../../lib/index.js', () => ({
2020
}));
2121

2222
const computeDefaultGatewayEnvVarName = (name: string) => GatewayPrimitive.computeDefaultGatewayEnvVarName(name);
23-
const computeDefaultMcpRuntimeEnvVarName = (name: string) =>
24-
GatewayTargetPrimitive.computeDefaultMcpRuntimeEnvVarName(name);
2523

2624
describe('computeDefaultGatewayEnvVarName', () => {
2725
it('uppercases and wraps gateway name', () => {
@@ -37,20 +35,6 @@ describe('computeDefaultGatewayEnvVarName', () => {
3735
});
3836
});
3937

40-
describe('computeDefaultMcpRuntimeEnvVarName', () => {
41-
it('uppercases and wraps runtime name', () => {
42-
expect(computeDefaultMcpRuntimeEnvVarName('my-runtime')).toBe('AGENTCORE_MCPRUNTIME_MY_RUNTIME_URL');
43-
});
44-
45-
it('replaces hyphens with underscores', () => {
46-
expect(computeDefaultMcpRuntimeEnvVarName('a-b-c')).toBe('AGENTCORE_MCPRUNTIME_A_B_C_URL');
47-
});
48-
49-
it('handles name with no hyphens', () => {
50-
expect(computeDefaultMcpRuntimeEnvVarName('runtime')).toBe('AGENTCORE_MCPRUNTIME_RUNTIME_URL');
51-
});
52-
});
53-
5438
describe('getExistingGateways', () => {
5539
const gatewayPrimitive = new GatewayPrimitive();
5640

@@ -99,10 +83,9 @@ describe('getExistingToolNames', () => {
9983
expect(result).toEqual([]);
10084
});
10185

102-
it('returns tool names from runtime tools and gateway targets', async () => {
86+
it('returns tool names from gateway targets', async () => {
10387
mockConfigExists.mockReturnValue(true);
10488
mockReadMcpSpec.mockResolvedValue({
105-
mcpRuntimeTools: [{ name: 'rt-tool-1' }],
10689
agentCoreGateways: [
10790
{
10891
name: 'gw-1',
@@ -118,10 +101,10 @@ describe('getExistingToolNames', () => {
118101

119102
const result = await gatewayTargetPrimitive.getExistingToolNames();
120103

121-
expect(result).toEqual(['rt-tool-1', 'gw-tool-1', 'gw-tool-2']);
104+
expect(result).toEqual(['gw-tool-1', 'gw-tool-2']);
122105
});
123106

124-
it('returns empty array when no runtime tools defined', async () => {
107+
it('returns empty array when no gateway targets have tool definitions', async () => {
125108
mockConfigExists.mockReturnValue(true);
126109
mockReadMcpSpec.mockResolvedValue({
127110
agentCoreGateways: [{ name: 'gw', targets: [] }],
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { GatewayPrimitive } from '../../../primitives/GatewayPrimitive.js';
2-
import { GatewayTargetPrimitive } from '../../../primitives/GatewayTargetPrimitive.js';
32
import { describe, expect, it } from 'vitest';
43

54
const computeDefaultGatewayEnvVarName = (name: string) => GatewayPrimitive.computeDefaultGatewayEnvVarName(name);
6-
const computeDefaultMcpRuntimeEnvVarName = (name: string) =>
7-
GatewayTargetPrimitive.computeDefaultMcpRuntimeEnvVarName(name);
85

96
describe('computeDefaultGatewayEnvVarName', () => {
107
it('converts simple name to env var', () => {
@@ -15,13 +12,3 @@ describe('computeDefaultGatewayEnvVarName', () => {
1512
expect(computeDefaultGatewayEnvVarName('my-gateway')).toBe('AGENTCORE_GATEWAY_MY_GATEWAY_URL');
1613
});
1714
});
18-
19-
describe('computeDefaultMcpRuntimeEnvVarName', () => {
20-
it('converts simple name to env var', () => {
21-
expect(computeDefaultMcpRuntimeEnvVarName('myruntime')).toBe('AGENTCORE_MCPRUNTIME_MYRUNTIME_URL');
22-
});
23-
24-
it('replaces hyphens with underscores', () => {
25-
expect(computeDefaultMcpRuntimeEnvVarName('my-runtime')).toBe('AGENTCORE_MCPRUNTIME_MY_RUNTIME_URL');
26-
});
27-
});

src/cli/operations/remove/__tests__/remove-gateway-target.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ describe('removeGatewayTarget', () => {
196196
const target = { name: 'target-1', type: 'gateway-target' as const, gatewayName: 'test-gateway' };
197197
const result = await removeGatewayTarget(target);
198198

199-
expect(result.ok).toBe(true);
199+
expect(result.success).toBe(true);
200200
expect(mockWriteMcpSpec).toHaveBeenCalledWith({
201201
agentCoreGateways: [
202202
{
@@ -224,7 +224,7 @@ describe('removeGatewayTarget', () => {
224224
const target = { name: 'last-target', type: 'gateway-target' as const, gatewayName: 'test-gateway' };
225225
const result = await removeGatewayTarget(target);
226226

227-
expect(result.ok).toBe(true);
227+
expect(result.success).toBe(true);
228228
expect(mockWriteMcpSpec).toHaveBeenCalledWith({
229229
agentCoreGateways: [
230230
{

0 commit comments

Comments
 (0)