Skip to content
Merged
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
2 changes: 1 addition & 1 deletion src/components/AbTestPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export function AbTestPicker({
getValue={(row) => row.abTestId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading A/B tests…"
loadingMessage="loading A/B tests…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No A/B tests found in this Region."
emptyPageMessage="No A/B tests on this page."
Expand Down
2 changes: 1 addition & 1 deletion src/components/BatchEvaluationPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export function BatchEvaluationPicker({
getValue={(row) => row.batchEvaluationId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading batch evaluations…"
loadingMessage="loading batch evaluations…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No batch evaluations found in this Region."
emptyPageMessage="No batch evaluations on this page."
Expand Down
2 changes: 1 addition & 1 deletion src/components/BatchInsightsPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export function BatchInsightsPicker({
getValue={(row) => row.batchEvaluationId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading batch insights…"
loadingMessage="loading batch insights…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No batch insights found in this Region."
emptyPageMessage="No batch insights on this page."
Expand Down
2 changes: 1 addition & 1 deletion src/components/ConfigBundlePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function ConfigBundlePicker({
getValue={(row) => row.bundleId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading configuration bundles…"
loadingMessage="loading configuration bundles…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No configuration bundles found in this Region."
emptyPageMessage="No configuration bundles on this page."
Expand Down
2 changes: 1 addition & 1 deletion src/components/ConfigBundleVersionPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export function ConfigBundleVersionPicker({
getValue={(row) => row.versionId}
onSelect={onSelect}
onBack={onBack}
loadingMessage="Loading configuration bundle versions…"
loadingMessage="loading configuration bundle versions…"
errorMessage={(error) =>
`Error loading versions for configuration bundle ${bundleId}: ${error.message}`
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/ConfirmAction.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ export function ConfirmAction({
return (
<Layout breadcrumb={breadcrumb} description={description} keyHints={hints}>
{isPending ? (
<Spinner label="Loading…" />
<Spinner label="loading…" />
) : error ? (
<ErrorBody message={error.message} onBack={cancel} />
) : (
Expand Down
2 changes: 1 addition & 1 deletion src/components/DatasetPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export function DatasetPicker({
getValue={(row) => row.datasetId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading datasets…"
loadingMessage="loading datasets…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No datasets found in this Region."
emptyPageMessage="No datasets on this page."
Expand Down
2 changes: 1 addition & 1 deletion src/components/EndpointWizard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ function hintsFor(
{ key: "ctl+c", label: "quit" },
];
if (stepKey === "version") {
return [{ key: "↑↓", label: "choose" }, { key: "enter", label: "continue" }, ...base];
return [{ key: "↑↓", label: "navigate" }, { key: "enter", label: "continue" }, ...base];
}
if (stepKey === "review") return [{ key: "enter", label: verb }, ...base];
return [{ key: "enter", label: "continue" }, ...base];
Expand Down
2 changes: 1 addition & 1 deletion src/components/EvaluatorPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export function EvaluatorPicker({
getValue={(row) => row.evaluatorId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading evaluators…"
loadingMessage="loading evaluators…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No evaluators found in this Region."
emptyPageMessage="No evaluators on this page."
Expand Down
4 changes: 2 additions & 2 deletions src/components/GatewayConnectorPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,11 @@ export function GatewayConnectorPicker({
getValue={(row) => row.targetId}
onSelect={onSelect}
onBack={() => navigate(-1)}
loadingMessage={`Loading Connectors for Gateway ${gatewayId}…`}
loadingMessage={`loading Connectors for Gateway ${gatewayId}…`}
errorMessage={(error) =>
`Error loading Connectors for Gateway ${gatewayId}: ${error.message}`
}
emptyMessage="This Gateway has no Connectors."
emptyMessage="This Gateway has no connectors."
emptyPageMessage="No Connectors on this page."
/>
);
Expand Down
2 changes: 1 addition & 1 deletion src/components/GatewayPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export function GatewayPicker({
getValue={(row) => row.gatewayId}
onSelect={onSelect}
onBack={onEscape ?? (() => navigate("/" + breadcrumb.slice(0, -1).join("/")))}
loadingMessage="Loading Gateways…"
loadingMessage="loading Gateways…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No Gateways found in this Region."
emptyPageMessage="No Gateways on this page."
Expand Down
4 changes: 2 additions & 2 deletions src/components/GatewayRulePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const gatewayRuleColumns = [
{ key: "description", header: "description", flex: true },
{
key: "ruleId",
header: "id suffix",
header: "ID suffix",
width: 10,
render: (value: unknown) => String(value ?? "").slice(-8),
},
Expand Down Expand Up @@ -68,7 +68,7 @@ export function GatewayRulePicker({
getValue={(row) => row.ruleId}
onSelect={onSelect}
onBack={() => navigate(-1)}
loadingMessage={`Loading Rules for Gateway ${gatewayId}…`}
loadingMessage={`loading Rules for Gateway ${gatewayId}…`}
errorMessage={(error) => `Error loading Rules for Gateway ${gatewayId}: ${error.message}`}
emptyMessage="This Gateway has no Rules."
emptyPageMessage={`No Rules on this page for Gateway ${gatewayId}.`}
Expand Down
2 changes: 1 addition & 1 deletion src/components/GatewayTargetPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function GatewayTargetPicker({
getValue={(row) => row.targetId}
onSelect={onSelect}
onBack={() => navigate(-1)}
loadingMessage={`Loading Targets for Gateway ${gatewayId}…`}
loadingMessage={`loading Targets for Gateway ${gatewayId}…`}
errorMessage={(error) => `Error loading Targets for Gateway ${gatewayId}: ${error.message}`}
emptyMessage="This Gateway has no Targets."
emptyPageMessage={`No Targets on this page for Gateway ${gatewayId}.`}
Expand Down
4 changes: 2 additions & 2 deletions src/components/HarnessEndpointPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@ export function HarnessEndpointPicker({
getValue={(row) => row.endpointName}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading endpoints…"
loadingMessage="loading endpoints…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="This harness has no endpoints yet."
emptyMessage="This harness has no endpoints."
emptyPageMessage={`No endpoints on this page for harness ${harnessId}.`}
/>
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/HarnessPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ export function HarnessPicker({
getValue={(row) => row.harnessId}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading harnesses…"
loadingMessage="loading harnesses…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No harnesses found."
emptyMessage="No harnesses found in this Region."
emptyPageMessage="No harnesses on this page."
/>
);
Expand Down
2 changes: 1 addition & 1 deletion src/components/HarnessVersionPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export function HarnessVersionPicker({
getValue={(row) => row.harnessVersion}
onSelect={onSelect}
onBack={goBack}
loadingMessage="Loading versions…"
loadingMessage="loading versions…"
errorMessage={(error) => `Error: ${error.message}`}
emptyMessage="No versions found."
emptyPageMessage={`No versions on this page for harness ${harnessId}.`}
Expand Down
87 changes: 45 additions & 42 deletions src/components/HarnessWizard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,8 @@ type WizardPhase =
export interface HarnessWizardProps extends ScreenProps {
mode: "create" | "update";
breadcrumb: string[];
// description is the optional subtitle shown after the breadcrumb.
description?: string;
// harnessId is the update target (update mode only).
harnessId?: string;
// initial seeds the form (update mode: the current configuration).
Expand All @@ -257,6 +259,7 @@ export function HarnessWizard({
core,
mode,
breadcrumb,
description,
harnessId,
initial,
onDone,
Expand Down Expand Up @@ -336,7 +339,7 @@ export function HarnessWizard({
const keyHints = hintsFor(stepKey, phase, verb);

return (
<Layout breadcrumb={breadcrumb} keyHints={keyHints}>
<Layout breadcrumb={breadcrumb} description={description} keyHints={keyHints}>
<Box flexDirection="column">
<Box paddingX={1}>
<Stepper
Expand Down Expand Up @@ -408,10 +411,10 @@ function hintsFor(
return [{ key: "enter", label: "continue" }, ...base];
case "model":
case "memory":
return [{ key: "↑↓", label: "choose" }, { key: "enter", label: "continue" }, ...base];
return [{ key: "↑↓", label: "navigate" }, { key: "enter", label: "continue" }, ...base];
case "tools":
return [
{ key: "↑↓", label: "move" },
{ key: "↑↓", label: "navigate" },
{ key: "space", label: "toggle" },
{ key: "enter", label: "continue" },
...base,
Expand Down Expand Up @@ -569,89 +572,89 @@ const MODEL_PROVIDERS: {
{
kind: "bedrock",
label: "bedrock",
description: "an amazon bedrock model",
description: "an Amazon Bedrock model or inference profile",
fields: [
{
key: "modelId",
name: "model id",
helpText: "a bedrock model or inference profile id",
name: "model ID",
helpText: "a Bedrock model or inference profile ID",
placeholder: "us.anthropic.claude-sonnet-4-6",
required: true,
requiredError: "enter a bedrock model or inference profile id",
requiredError: "enter a Bedrock model or inference profile ID",
},
],
},
{
kind: "gemini",
label: "gemini",
description: "a google gemini model",
description: "a Google Gemini model using an API-key credential ARN",
fields: [
{
key: "modelId",
name: "model id",
helpText: "the gemini model to use",
name: "model ID",
helpText: "the Gemini model to use",
placeholder: "gemini-2.5-pro",
required: true,
requiredError: "enter a gemini model id",
requiredError: "enter a Gemini model ID",
},
{
key: "apiKeyArn",
name: "api key arn",
helpText: "the arn of your gemini api key in agentcore identity",
name: "API key ARN",
helpText: "an AgentCore Identity API-key credential provider ARN",
placeholder: "arn:aws:bedrock-agentcore:…:token-vault/…",
required: true,
requiredError: "enter the arn of your gemini api key",
requiredError: "enter an API-key credential provider ARN",
},
],
},
{
kind: "openai",
label: "openai",
description: "an openai model",
description: "an OpenAI model using an API-key credential ARN",
fields: [
{
key: "modelId",
name: "model id",
helpText: "the openai model to use",
name: "model ID",
helpText: "the OpenAI model to use",
placeholder: "gpt-5",
required: true,
requiredError: "enter an openai model id",
requiredError: "enter an OpenAI model ID",
},
{
key: "apiKeyArn",
name: "api key arn",
helpText: "the arn of your openai api key in agentcore identity",
name: "API key ARN",
helpText: "an AgentCore Identity API-key credential provider ARN",
placeholder: "arn:aws:bedrock-agentcore:…:token-vault/…",
required: true,
requiredError: "enter the arn of your openai api key",
requiredError: "enter an API-key credential provider ARN",
},
],
},
{
kind: "litellm",
label: "litellm",
description: "any third-party provider via litellm",
description: "a third-party provider through LiteLLM",
fields: [
{
key: "modelId",
name: "model id",
helpText: "the litellm model identifier (provider/model)",
name: "model ID",
helpText: "the LiteLLM model identifier (provider/model)",
placeholder: "anthropic/claude-3-sonnet",
required: true,
requiredError: "enter a litellm model identifier",
requiredError: "enter a LiteLLM model identifier",
},
{
key: "apiKeyArn",
name: "api key arn",
helpText: "optional · the arn of the provider api key in agentcore identity",
name: "API key ARN",
helpText: "optional · an AgentCore Identity API-key credential provider ARN",
placeholder: "arn:aws:bedrock-agentcore:…:token-vault/…",
required: false,
requiredError: "",
},
{
key: "apiBase",
name: "api base url",
helpText: "optional · the base url of the provider's api endpoint",
name: "API base URL",
helpText: "optional · the provider API endpoint",
placeholder: "https://…",
required: false,
requiredError: "",
Expand Down Expand Up @@ -791,12 +794,12 @@ const MEMORY_OPTIONS: { kind: MemoryKind; label: string; description: string }[]
{
kind: "managed",
label: "managed",
description: "agentcore creates and manages memory for you (recommended)",
description: "AgentCore creates and manages memory for you (recommended)",
},
{
kind: "byo",
label: "bring your own",
description: "use an existing agentcore memory resource",
description: "use an existing AgentCore Memory",
},
{ kind: "disabled", label: "disabled", description: "no memory across sessions" },
];
Expand Down Expand Up @@ -850,7 +853,7 @@ function MemoryStep({
}
if (key.return) {
if (value.arn.trim() === "") {
setError("enter the arn of your agentcore memory resource");
setError("enter the ARN of an existing AgentCore Memory");
return;
}
onNext();
Expand All @@ -867,8 +870,8 @@ function MemoryStep({
/>
{value.kind === "byo" && (
<FormTextInput
name="memory arn"
helpText="the arn of an existing agentcore memory resource"
name="Memory ARN"
helpText="the ARN of an existing AgentCore Memory"
placeholder="arn:aws:bedrock-agentcore:…:memory/…"
errorText=""
value={value.arn}
Expand Down Expand Up @@ -901,26 +904,26 @@ const TOOL_ROWS: {
placeholder: string;
};
}[] = [
{ key: "browser", label: "browser", description: "browse the web with agentcore browser" },
{ key: "browser", label: "browser", description: "browse the web with AgentCore Browser" },
{
key: "gateway",
label: "gateway",
description: "call tools through an agentcore gateway",
description: "call tools through an AgentCore Gateway",
field: {
valueKey: "gatewayArn",
name: "gateway arn",
helpText: "the arn of the agentcore gateway to call tools through",
name: "Gateway ARN",
helpText: "the ARN of the AgentCore Gateway to call tools through",
placeholder: "arn:aws:bedrock-agentcore:…:gateway/…",
},
},
{
key: "mcp",
label: "mcp server",
description: "connect to a remote mcp server",
label: "MCP server",
description: "connect to a remote MCP server",
field: {
valueKey: "mcpUrl",
name: "server url",
helpText: "the url of the remote mcp server",
name: "server URL",
helpText: "the URL of the remote MCP server",
placeholder: "https://…",
},
},
Expand Down
Loading
Loading