Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions src/core/identity.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,24 @@ import {
type ListApiKeyCredentialProvidersResponse,
type UpdateApiKeyCredentialProviderResponse,
} from "@aws-sdk/client-bedrock-agentcore-control";
import type { CoreIdentityClient } from "../handlers/identity/types";
import type {
CoreIdentityClient,
CreateApiKeyCredentialProviderInput,
UpdateApiKeyCredentialProviderInput,
} from "../handlers/identity/types";
import type { AwsClients, CoreOptions } from "./types";
import { toClientConfig } from "./utils";

export class IdentityClient implements CoreIdentityClient {
constructor(private readonly clients: AwsClients) {}

async createApiKeyCredentialProvider(
name: string,
apiKey: string,
input: CreateApiKeyCredentialProviderInput,
options: CoreOptions,
): Promise<CreateApiKeyCredentialProviderResponse> {
return this.clients
.control(toClientConfig(options))
.send(new CreateApiKeyCredentialProviderCommand({ name, apiKey }));
.send(new CreateApiKeyCredentialProviderCommand(input));
}

async getApiKeyCredentialProvider(
Expand All @@ -47,13 +50,12 @@ export class IdentityClient implements CoreIdentityClient {
}

async updateApiKeyCredentialProvider(
name: string,
apiKey: string,
input: UpdateApiKeyCredentialProviderInput,
options: CoreOptions,
): Promise<UpdateApiKeyCredentialProviderResponse> {
return this.clients
.control(toClientConfig(options))
.send(new UpdateApiKeyCredentialProviderCommand({ name, apiKey }));
.send(new UpdateApiKeyCredentialProviderCommand(input));
}

async deleteApiKeyCredentialProvider(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"apiKeySecretSource": "MANAGED"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-2-2a7aabf1-MsSy03"
},
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
"apiKeySecretSource": "MANAGED"
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-34b3f8a9-cHh41n"
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
},
"lastUpdatedTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
},
"apiKeySecretSource": "MANAGED"
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
},
"lastUpdatedTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
}
},
{
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
"createdTime": {
"$date": "2026-07-23T16:31:54.309Z"
"$date": "2026-07-24T17:00:22.404Z"
},
"lastUpdatedTime": {
"$date": "2026-07-23T16:31:54.309Z"
"$date": "2026-07-24T17:00:22.404Z"
}
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
"createdTime": {
"$date": "2026-07-23T16:31:54.309Z"
"$date": "2026-07-24T17:00:22.404Z"
},
"lastUpdatedTime": {
"$date": "2026-07-23T16:31:54.309Z"
"$date": "2026-07-24T17:00:22.404Z"
}
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
},
"lastUpdatedTime": {
"$date": "2026-07-23T16:31:54.009Z"
"$date": "2026-07-24T17:00:22.115Z"
}
}
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": {
"$date": "2026-07-24T17:00:22.115Z"
},
"lastUpdatedTime": {
"$date": "2026-07-24T17:00:22.115Z"
},
"apiKeySecretSource": "MANAGED"
}
2 changes: 1 addition & 1 deletion src/handlers/identity/__fixtures__/create-2.golden.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-2-29a3e5b6-qiRJxb"
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-2-2a7aabf1-MsSy03"
},
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
Expand Down
2 changes: 1 addition & 1 deletion src/handlers/identity/__fixtures__/create.golden.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-34b3f8a9-cHh41n"
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
Expand Down
6 changes: 3 additions & 3 deletions src/handlers/identity/__fixtures__/get.golden.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-34b3f8a9-cHh41n"
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": "2026-07-23T16:31:54.009Z",
"lastUpdatedTime": "2026-07-23T16:31:54.009Z",
"createdTime": "2026-07-24T17:00:22.115Z",
"lastUpdatedTime": "2026-07-24T17:00:22.115Z",
"apiKeySecretSource": "MANAGED"
}
4 changes: 2 additions & 2 deletions src/handlers/identity/__fixtures__/list-page-1.golden.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
{
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": "2026-07-23T16:31:54.009Z",
"lastUpdatedTime": "2026-07-23T16:31:54.009Z"
"createdTime": "2026-07-24T17:00:22.115Z",
"lastUpdatedTime": "2026-07-24T17:00:22.115Z"
}
],
"nextToken": "eyJBY2NvdW50QW5kVHlwZUdzaVBrIjp7InZhbHVlU3RyIjoiNjg1MTk3NzA4Njg3I0FQSV9LRVkiLCJhdHRyaWJ1dGVUeXBlIjoiUyJ9LCJTSyI6eyJ2YWx1ZVN0ciI6ImFnZW50Y29yZS1jbGktaWRlbnRpdHktZml4dHVyZSIsImF0dHJpYnV0ZVR5cGUiOiJTIn0sIlBLIjp7InZhbHVlU3RyIjoiQVBJX0tFWV9DUkVEX1BST1ZJREVSIzY4NTE5NzcwODY4NyNkZWZhdWx0I2FnZW50Y29yZS1jbGktaWRlbnRpdHktZml4dHVyZSIsImF0dHJpYnV0ZVR5cGUiOiJTIn19"
Expand Down
4 changes: 2 additions & 2 deletions src/handlers/identity/__fixtures__/list-page-2.golden.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
{
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
"createdTime": "2026-07-23T16:31:54.309Z",
"lastUpdatedTime": "2026-07-23T16:31:54.309Z"
"createdTime": "2026-07-24T17:00:22.404Z",
"lastUpdatedTime": "2026-07-24T17:00:22.404Z"
}
]
}
8 changes: 4 additions & 4 deletions src/handlers/identity/__fixtures__/list.golden.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
{
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": "2026-07-23T16:31:54.009Z",
"lastUpdatedTime": "2026-07-23T16:31:54.009Z"
"createdTime": "2026-07-24T17:00:22.115Z",
"lastUpdatedTime": "2026-07-24T17:00:22.115Z"
},
{
"name": "agentcore-cli-identity-fixture-2",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture-2",
"createdTime": "2026-07-23T16:31:54.309Z",
"lastUpdatedTime": "2026-07-23T16:31:54.309Z"
"createdTime": "2026-07-24T17:00:22.404Z",
"lastUpdatedTime": "2026-07-24T17:00:22.404Z"
}
]
}
6 changes: 3 additions & 3 deletions src/handlers/identity/__fixtures__/update.golden.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"apiKeySecretArn": {
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-34b3f8a9-cHh41n"
"secretArn": "arn:aws:secretsmanager:us-west-2:685197708687:secret:bedrock-agentcore-identity!default/apikey/agentcore-cli-identity-fixture-21072164-GDCjeF"
},
"name": "agentcore-cli-identity-fixture",
"credentialProviderArn": "arn:aws:bedrock-agentcore:us-west-2:685197708687:token-vault/default/apikeycredentialprovider/agentcore-cli-identity-fixture",
"createdTime": "2026-07-23T16:31:54.009Z",
"lastUpdatedTime": "2026-07-23T16:31:54.009Z",
"createdTime": "2026-07-24T17:00:22.115Z",
"lastUpdatedTime": "2026-07-24T17:00:22.115Z",
"apiKeySecretSource": "MANAGED"
}
57 changes: 42 additions & 15 deletions src/handlers/identity/api-key-credential-provider/create/index.tsx
Original file line number Diff line number Diff line change
@@ -1,33 +1,60 @@
import z from "zod";
import { createHandler, flag } from "../../../../router";
import { JsonRendererKey } from "../../../../tui";
import type { Core } from "../../../types";
import { coreOptsFromCtx } from "../../../utils";
import type { AppIO, Core } from "../../../types";
import { coreOptsFromCtx, parseTags } from "../../../utils";
import { readSourceText } from "../../../source";
import { parseSecretReference } from "../parser";

export const createCreateApiKeyCredentialProviderHandler = (core: Core) =>
export const createCreateApiKeyCredentialProviderHandler = (core: Core, io: AppIO) =>
createHandler({
name: "create",
description: "create an API key credential provider",
flags: [
flag("name", "the name of the API key credential provider", z.string().optional()),
flag("api-key", "the API key value", z.string().optional()),
flag("api-key", "the API key value (inline, file://path, or -)", z.string().optional(), {
sensitive: true,
}),
flag(
"api-key-secret-reference",
'external secret reference JSON: {"secretId":"<arn>","jsonKey":"<key>"}',
z.string().optional(),
),
flag("tags", "tags as key=value (repeatable) or JSON object", z.array(z.string()).optional()),
],
handle: async (ctx, flags) => {
if (!flags.name) {
throw new TypeError("required option '--name <name>' not specified");
}
if (!flags["api-key"]) {
throw new TypeError("required option '--api-key <api-key>' not specified");

const hasApiKey = flags["api-key"] !== undefined;
const hasSecretRef = flags["api-key-secret-reference"] !== undefined;

if (hasApiKey && hasSecretRef) {
throw new TypeError("--api-key and --api-key-secret-reference are mutually exclusive");
}
if (!hasApiKey && !hasSecretRef) {
throw new TypeError("either --api-key or --api-key-secret-reference is required");
}

const apiKey = hasApiKey ? await readSourceText(flags["api-key"]!, io.stdin) : undefined;
const apiKeySecretConfig = hasSecretRef
? parseSecretReference(flags["api-key-secret-reference"]!)
: undefined;
const apiKeySecretSource = hasApiKey ? "MANAGED" : "EXTERNAL";
const tags = parseTags(flags.tags);

ctx
.require(JsonRendererKey)
.renderJson(
await core.identity.createApiKeyCredentialProvider(
flags.name,
flags["api-key"],
coreOptsFromCtx(ctx),
),
);
ctx.require(JsonRendererKey).renderJson(
await core.identity.createApiKeyCredentialProvider(
{
name: flags.name,
apiKey,
apiKeySecretConfig,
apiKeySecretSource: apiKeySecretSource as any,
tags,
},
coreOptsFromCtx(ctx),
),
);
},
});
4 changes: 2 additions & 2 deletions src/handlers/identity/api-key-credential-provider/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import { createUpdateApiKeyCredentialProviderHandler } from "./update";
export function createApiKeyCredentialProviderHandler(core: Core, io: AppIO): Router {
return new Router("api-key-credential-provider", "manage API key credential providers")
.default(createHelpDefault(io))
.handler(createCreateApiKeyCredentialProviderHandler(core))
.handler(createCreateApiKeyCredentialProviderHandler(core, io))
.handler(createGetApiKeyCredentialProviderHandler(core))
.handler(createListApiKeyCredentialProvidersHandler(core))
.handler(createUpdateApiKeyCredentialProviderHandler(core))
.handler(createUpdateApiKeyCredentialProviderHandler(core, io))
.handler(createDeleteApiKeyCredentialProviderHandler(core));
}
Loading
Loading