Skip to content
Draft
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
30 changes: 16 additions & 14 deletions src/handlers/project/add/config-bundle/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { KmsKeyArnSchema } from "../../../../projectSchemas/evaluator";
import { createHandler, flag, ProjectKey } from "../../../../router";
import { parseJsonFlagWithSchema } from "../../../utils";
import type { AddProjectResourceConfig } from "../types";
import { addProjectResource } from "../shared";

const ComponentsSchema = z
.record(z.string().min(1), ComponentConfigurationSchema.strict())
Expand Down Expand Up @@ -68,20 +69,21 @@ export const createAddConfigBundleHandler = (config: AddProjectResourceConfig) =
}

const project = ctx.require(ProjectKey);
for await (const event of config.projectManager.addResource(project, {
resourceType: "config-bundle",
resourceConfig: {
name: flags.name,
description: flags.description,
components,
branchName: flags["branch-name"],
commitMessage: flags["commit-message"],
kmsKeyArn: flags["kms-key-arn"],
await addProjectResource(
ctx,
config,
{
resourceType: "config-bundle",
resourceConfig: {
name: flags.name,
description: flags.description,
components,
branchName: flags["branch-name"],
commitMessage: flags["commit-message"],
kmsKeyArn: flags["kms-key-arn"],
},
},
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added configuration bundle '${flags.name}' to '${project.name}'\n`);
`added configuration bundle '${flags.name}' to '${project.name}'\n`,
);
},
});
18 changes: 10 additions & 8 deletions src/handlers/project/add/credentials/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
credentialEnvVarName,
credentialNameFieldSuffix,
} from "../../../../projectSchemas/credential";
import { addProjectResource } from "../shared";

export { credentialEnvVarName };

Expand Down Expand Up @@ -68,14 +69,15 @@ export async function addCredentialToProject(
);
}

for await (const event of config.projectManager.addResource(project, {
resourceType: "credential",
...input,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added credential '${input.resourceConfig.name}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "credential",
...input,
},
`added credential '${input.resourceConfig.name}' to '${project.name}'\n`,
);
for (const entry of (input.envEntries ?? []).filter((e) => e.value === undefined)) {
config.io.stderr.write(`Set ${entry.key} in agentcore/.env.local before you deploy.\n`);
}
Expand Down
36 changes: 20 additions & 16 deletions src/handlers/project/add/evaluator/code-based/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
} from "../../../types";
import { parseJsonFlagWithSchema } from "../../../../utils";
import type { AddProjectResourceConfig } from "../../types";
import { addProjectResource } from "../../shared";

export const createAddCodeBasedEvaluatorHandler = (config: AddProjectResourceConfig) =>
createHandler({
Expand Down Expand Up @@ -83,13 +84,15 @@ export const createAddCodeBasedEvaluatorHandler = (config: AddProjectResourceCon
config: { codeBased: { external: { lambdaArn: flags["lambda-arn"] } } },
});
if (!parsed.success) throw new InputValidationError(z.prettifyError(parsed.error));
for await (const event of config.projectManager.addResource(project, {
resourceType: "evaluator",
resourceConfig: parsed.data,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}
config.io.stderr.write(`added evaluator '${flags["name"]}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "evaluator",
resourceConfig: parsed.data,
},
`added evaluator '${flags["name"]}' to '${project.name}'\n`,
);
return;
}

Expand All @@ -102,15 +105,16 @@ export const createAddCodeBasedEvaluatorHandler = (config: AddProjectResourceCon
...(flags["timeout-seconds"] !== undefined && { timeoutSeconds: flags["timeout-seconds"] }),
};

for await (const event of config.projectManager.addResource(project, {
resourceType: "evaluator",
resourceConfig: { name: scaffold.name },
scaffold,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added evaluator '${flags["name"]}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "evaluator",
resourceConfig: { name: scaffold.name },
scaffold,
},
`added evaluator '${flags["name"]}' to '${project.name}'\n`,
);
if (!hasMetric)
config.io.stderr.write(
`note: this evaluator returns Pass for every session until you implement app/${flags["name"]}/lambda_function.py\n`,
Expand Down
18 changes: 10 additions & 8 deletions src/handlers/project/add/evaluator/llm-as-a-judge/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import { TagsSchema } from "../../../../../projectSchemas/tags";
import { parseJsonFlagWithSchema } from "../../../../utils";
import type { AddProjectResourceConfig } from "../../types";
import { addProjectResource } from "../../shared";
import {
isRatingScalePreset,
RATING_SCALE_PRESETS,
Expand Down Expand Up @@ -93,14 +94,15 @@ export const createAddLlmAsAJudgeEvaluatorHandler = (config: AddProjectResourceC
if (!parsed.success) throw new InputValidationError(z.prettifyError(parsed.error));

const project = ctx.require(ProjectKey);
for await (const event of config.projectManager.addResource(project, {
resourceType: "evaluator",
resourceConfig: parsed.data,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added evaluator '${flags["name"]}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "evaluator",
resourceConfig: parsed.data,
},
`added evaluator '${flags["name"]}' to '${project.name}'\n`,
);
},
});

Expand Down
28 changes: 28 additions & 0 deletions src/handlers/project/add/gateway-connector/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,34 @@ const { addGateway, cleanup, inProject, projectSpec, run } =
afterEach(cleanup);

describe("project add gateway-connector", () => {
test("--json preserves the command resource type and parent Gateway", async () => {
const projectRoot = await inProject();
await addGateway();

const io = await run([
"add",
"gateway-connector",
"--gateway",
"tools",
"--name",
"web",
"--connector",
"web-search",
"--json",
]);

expect(JSON.parse(io.stdout())).toEqual({
operation: "add",
project: { name: "TestProject", path: projectRoot },
resource: {
type: "gateway-connector",
name: "web",
parent: { type: "gateway", name: "tools" },
},
});
expect(io.stderr()).not.toContain("added Connector Target");
});

test("adds Web Search and external Knowledge Base connectors", async () => {
const projectRoot = await inProject();
await addGateway();
Expand Down
18 changes: 10 additions & 8 deletions src/handlers/project/add/gateway-connector/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
import { createHandler, flag, ProjectKey } from "../../../../router";
import { parseJsonFlagWithSchema } from "../../../utils";
import type { AddProjectResourceConfig } from "../types";
import { addProjectResource } from "../shared";

export const createAddGatewayConnectorHandler = (config: AddProjectResourceConfig) =>
createHandler({
Expand Down Expand Up @@ -85,15 +86,16 @@ export const createAddGatewayConnectorHandler = (config: AddProjectResourceConfi
);
}

for await (const event of config.projectManager.addResource(project, {
resourceType: "gateway-target",
gatewayName: flags.gateway,
resourceConfig: target,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}
config.io.stderr.write(
await addProjectResource(
ctx,
config,
{
resourceType: "gateway-target",
gatewayName: flags.gateway,
resourceConfig: target,
},
`added Connector Target '${target.name}' to Gateway '${flags.gateway}' in '${project.name}'\n`,
{ resourceType: "gateway-connector" },
);
},
});
Expand Down
17 changes: 9 additions & 8 deletions src/handlers/project/add/gateway-target/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { createHandler, flag, ProjectKey } from "../../../../router";
import { parseJsonFlagWithSchema } from "../../../utils";
import type { Project } from "../../types";
import type { AddProjectResourceConfig } from "../types";
import { addProjectResource } from "../shared";

export const createAddGatewayTargetHandler = (config: AddProjectResourceConfig) =>
createHandler({
Expand Down Expand Up @@ -120,14 +121,14 @@ Use project add gateway-connector for curated Connector shortcuts.`,
};
}

for await (const event of config.projectManager.addResource(project, {
resourceType: "gateway-target",
gatewayName: flags.gateway,
resourceConfig: target,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}
config.io.stderr.write(
await addProjectResource(
ctx,
config,
{
resourceType: "gateway-target",
gatewayName: flags.gateway,
resourceConfig: target,
},
`added Target '${target.name}' to Gateway '${flags.gateway}' in '${project.name}'\n`,
);
},
Expand Down
2 changes: 1 addition & 1 deletion src/handlers/project/add/gateway-test-support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function createGatewayProjectTestHarness(directoryPrefix: string) {
]);
const projectRoot = join(directory, name);
process.chdir(projectRoot);
return projectRoot;
return process.cwd();
}

async function addGateway(name = "tools"): Promise<void> {
Expand Down
17 changes: 10 additions & 7 deletions src/handlers/project/add/gateway/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type { AgentCoreGateway } from "../../../../projectSchemas/gateway";
import { createHandler, flag, ProjectKey } from "../../../../router";
import { parseJsonFlagWithSchema, parseTags } from "../../../utils";
import type { AddProjectResourceConfig } from "../types";
import { addProjectResource } from "../shared";

const GatewayAuthorizerConfigurationInputSchema = GatewayAuthorizerConfigSchema.strict();

Expand Down Expand Up @@ -125,12 +126,14 @@ export const createAddGatewayHandler = (config: AddProjectResourceConfig) =>
tags: parseTags(flags.tags),
};

for await (const event of config.projectManager.addResource(project, {
resourceType: "gateway",
resourceConfig: gateway,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}
config.io.stderr.write(`added Gateway '${flags.name}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "gateway",
resourceConfig: gateway,
},
`added Gateway '${flags.name}' to '${project.name}'\n`,
);
},
});
18 changes: 10 additions & 8 deletions src/handlers/project/add/harness/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import z from "zod";
import { createHandler, flag, ProjectKey } from "../../../../router";
import type { AddProjectResourceConfig } from "../types";
import { addProjectResource } from "../shared";
import { parseJsonFlag, parseTags } from "../../../utils";
import { InputValidationError } from "../../../../errors";
import { HarnessSpecSchema } from "../../../../projectSchemas/harness";
Expand Down Expand Up @@ -109,13 +110,14 @@ export const createAddHarnessHandler = (config: AddProjectResourceConfig) =>
throw new InputValidationError(z.prettifyError(result.error), { cause: result.error });

const project = ctx.require(ProjectKey);
for await (const event of config.projectManager.addResource(project, {
resourceType: "harness",
resourceConfig: result.data,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added harness '${flags["name"]}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "harness",
resourceConfig: result.data,
},
`added harness '${flags["name"]}' to '${project.name}'\n`,
);
},
});
12 changes: 12 additions & 0 deletions src/handlers/project/add/memory/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ async function inProject(name = "TestProject"): Promise<string> {
}

describe("project add memory", () => {
test("--json returns a structured project mutation result", async () => {
const projectRoot = await inProject();
const { io } = await run(["add", "memory", "--name", "customer_memory", "--json"]);

expect(JSON.parse(io.stdout())).toEqual({
operation: "add",
project: { name: "TestProject", path: projectRoot },
resource: { type: "memory", name: "customer_memory" },
});
expect(io.stderr()).not.toContain("added memory");
});

/** Verify the flag -> agentcore.json memories[] entry for each flag. */
test.each<[string, string[], Record<string, unknown>]>([
[
Expand Down
18 changes: 10 additions & 8 deletions src/handlers/project/add/memory/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
type MemoryStrategy,
} from "../../../../projectSchemas/memory";
import { TagsSchema } from "../../../../projectSchemas/tags";
import { addProjectResource } from "../shared";

// The service default for raw event retention
const DEFAULT_EVENT_EXPIRY_DURATION = 30;
Expand Down Expand Up @@ -172,14 +173,15 @@ export const createAddMemoryHandler = (config: AddProjectResourceConfig) =>
};

const project = ctx.require(ProjectKey);
for await (const event of config.projectManager.addResource(project, {
resourceType: "memory",
resourceConfig: memoryConfig,
})) {
if (event.type === "step") config.io.stderr.write(`${event.message}\n`);
}

config.io.stderr.write(`added memory '${flags["name"]}' to '${project.name}'\n`);
await addProjectResource(
ctx,
config,
{
resourceType: "memory",
resourceConfig: memoryConfig,
},
`added memory '${flags["name"]}' to '${project.name}'\n`,
);
},
});

Expand Down
Loading
Loading