agentcore-cli 0.31.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentcore/__init__.py +1 -0
- agentcore/agent_inspector/NOTICE +9 -0
- agentcore/agent_inspector/favicon.svg +60 -0
- agentcore/agent_inspector/index.css +1 -0
- agentcore/agent_inspector/index.html +14 -0
- agentcore/agent_inspector/index.js +289 -0
- agentcore/assets/AGENTS.md +60 -0
- agentcore/assets/README.md +108 -0
- agentcore/assets/agents/AGENTS.md +218 -0
- agentcore/assets/cdk/.prettierrc +8 -0
- agentcore/assets/cdk/README.md +26 -0
- agentcore/assets/cdk/bin/cdk.ts +216 -0
- agentcore/assets/cdk/cdk.json +88 -0
- agentcore/assets/cdk/gitignore.template +9 -0
- agentcore/assets/cdk/jest.config.js +9 -0
- agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
- agentcore/assets/cdk/npmignore.template +6 -0
- agentcore/assets/cdk/package.json +30 -0
- agentcore/assets/cdk/test/cdk.test.ts +31 -0
- agentcore/assets/cdk/tsconfig.json +28 -0
- agentcore/assets/container/python/Dockerfile +47 -0
- agentcore/assets/container/python/dockerignore.template +27 -0
- agentcore/assets/container/typescript/Dockerfile +25 -0
- agentcore/assets/container/typescript/dockerignore.template +24 -0
- agentcore/assets/datasets/predefined-v1.jsonl +3 -0
- agentcore/assets/datasets/simulated-v1.jsonl +3 -0
- agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
- agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
- agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
- agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
- agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
- agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
- agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
- agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
- agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
- agentcore/assets/harness/invoke.py.template +74 -0
- agentcore/assets/mcp/python/README.md +27 -0
- agentcore/assets/mcp/python/pyproject.toml +22 -0
- agentcore/assets/mcp/python/server.py +117 -0
- agentcore/assets/mcp/python-lambda/README.md +22 -0
- agentcore/assets/mcp/python-lambda/handler.py +144 -0
- agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
- agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
- agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
- agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
- agentcore/assets/python/a2a/strands/base/README.md +22 -0
- agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
- agentcore/assets/python/a2a/strands/base/main.py +113 -0
- agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
- agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
- agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
- agentcore/assets/python/agui/googleadk/base/README.md +30 -0
- agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/agui/googleadk/base/main.py +91 -0
- agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
- agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
- agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
- agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
- agentcore/assets/python/agui/strands/base/README.md +22 -0
- agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
- agentcore/assets/python/agui/strands/base/main.py +105 -0
- agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/agui/strands/base/model/load.py +123 -0
- agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
- agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
- agentcore/assets/python/http/autogen/base/README.md +45 -0
- agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
- agentcore/assets/python/http/autogen/base/main.py +145 -0
- agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
- agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
- agentcore/assets/python/http/autogen/base/model/load.py +136 -0
- agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
- agentcore/assets/python/http/bma/base/Dockerfile +41 -0
- agentcore/assets/python/http/bma/base/README.md +178 -0
- agentcore/assets/python/http/bma/base/client.py +200 -0
- agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
- agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
- agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
- agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
- agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
- agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
- agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
- agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
- agentcore/assets/python/http/googleadk/base/README.md +45 -0
- agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
- agentcore/assets/python/http/googleadk/base/main.py +207 -0
- agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
- agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
- agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
- agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
- agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
- agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
- agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
- agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
- agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
- agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
- agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
- agentcore/assets/python/http/openaiagents/base/README.md +45 -0
- agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
- agentcore/assets/python/http/openaiagents/base/main.py +200 -0
- agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
- agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
- agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
- agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
- agentcore/assets/python/http/strands/base/README.md +46 -0
- agentcore/assets/python/http/strands/base/gitignore.template +41 -0
- agentcore/assets/python/http/strands/base/main.py +714 -0
- agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
- agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
- agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
- agentcore/assets/python/http/strands/base/model/load.py +239 -0
- agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
- agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
- agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
- agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
- agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
- agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
- agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
- agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
- agentcore/assets/python/mcp/standalone/base/README.md +36 -0
- agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
- agentcore/assets/python/mcp/standalone/base/main.py +83 -0
- agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
- agentcore/assets/typescript/.gitkeep +0 -0
- agentcore/assets/typescript/http/strands/base/README.md +42 -0
- agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
- agentcore/assets/typescript/http/strands/base/main.ts +149 -0
- agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
- agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
- agentcore/assets/typescript/http/strands/base/package.json +38 -0
- agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
- agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
- agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
- agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
- agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
- agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
- agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
- agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
- agentcore/aws/__init__.py +263 -0
- agentcore/aws/_aws_errors.py +72 -0
- agentcore/aws/_http.py +176 -0
- agentcore/aws/_util.py +37 -0
- agentcore/aws/account.py +165 -0
- agentcore/aws/agentcore.py +971 -0
- agentcore/aws/agentcore_ab_tests.py +230 -0
- agentcore/aws/agentcore_batch_evaluation.py +227 -0
- agentcore/aws/agentcore_config_bundles.py +220 -0
- agentcore/aws/agentcore_control.py +994 -0
- agentcore/aws/agentcore_datasets.py +222 -0
- agentcore/aws/agentcore_harness.py +330 -0
- agentcore/aws/agentcore_payments.py +430 -0
- agentcore/aws/agentcore_recommendation.py +140 -0
- agentcore/aws/agui_parser.py +131 -0
- agentcore/aws/agui_types.py +342 -0
- agentcore/aws/api_client.py +87 -0
- agentcore/aws/arn.py +18 -0
- agentcore/aws/aws_context.py +23 -0
- agentcore/aws/bedrock.py +44 -0
- agentcore/aws/bedrock_agent.py +129 -0
- agentcore/aws/bedrock_import.py +252 -0
- agentcore/aws/bedrock_import_types.py +111 -0
- agentcore/aws/cloudwatch.py +136 -0
- agentcore/aws/connect_shell.py +266 -0
- agentcore/aws/iam.py +41 -0
- agentcore/aws/partition.py +58 -0
- agentcore/aws/policy_generation.py +116 -0
- agentcore/aws/region.py +54 -0
- agentcore/aws/retry.py +27 -0
- agentcore/aws/shell_framer.py +136 -0
- agentcore/aws/stage_endpoint.py +39 -0
- agentcore/aws/target_region.py +54 -0
- agentcore/aws/transaction_search.py +97 -0
- agentcore/cdk/__init__.py +10 -0
- agentcore/cdk/constants.py +13 -0
- agentcore/cdk/local_cdk_project.py +48 -0
- agentcore/cdk/toolkit.py +706 -0
- agentcore/cli/__init__.py +0 -0
- agentcore/cli/commands/__init__.py +0 -0
- agentcore/cli/commands/_jobs_common.py +39 -0
- agentcore/cli/commands/_run_wizards.py +639 -0
- agentcore/cli/commands/add/__init__.py +37 -0
- agentcore/cli/commands/add/_commander.py +52 -0
- agentcore/cli/commands/add/_common.py +47 -0
- agentcore/cli/commands/add/agent_wizard.py +528 -0
- agentcore/cli/commands/add/auth_options.py +154 -0
- agentcore/cli/commands/add/skill_action.py +105 -0
- agentcore/cli/commands/add/skill_command.py +87 -0
- agentcore/cli/commands/add/tool_action.py +160 -0
- agentcore/cli/commands/add/tool_command.py +117 -0
- agentcore/cli/commands/add/validate.py +333 -0
- agentcore/cli/commands/capacity_provider/__init__.py +86 -0
- agentcore/cli/commands/capacity_provider/action.py +114 -0
- agentcore/cli/commands/capacity_provider/constants.py +22 -0
- agentcore/cli/commands/config.py +91 -0
- agentcore/cli/commands/config_bundle.py +251 -0
- agentcore/cli/commands/create/__init__.py +643 -0
- agentcore/cli/commands/create/action.py +406 -0
- agentcore/cli/commands/create/dependencies.py +91 -0
- agentcore/cli/commands/create/harness_validate.py +82 -0
- agentcore/cli/commands/create/validate.py +195 -0
- agentcore/cli/commands/create/wizard.py +127 -0
- agentcore/cli/commands/dataset.py +119 -0
- agentcore/cli/commands/deploy/__init__.py +31 -0
- agentcore/cli/commands/deploy/_guards.py +25 -0
- agentcore/cli/commands/deploy/actions.py +840 -0
- agentcore/cli/commands/deploy/command.py +349 -0
- agentcore/cli/commands/deploy/progress.py +115 -0
- agentcore/cli/commands/deploy/types.py +68 -0
- agentcore/cli/commands/deploy/utils.py +43 -0
- agentcore/cli/commands/deploy/validate.py +21 -0
- agentcore/cli/commands/dev/__init__.py +5 -0
- agentcore/cli/commands/dev/_deps.py +50 -0
- agentcore/cli/commands/dev/browser_mode.py +270 -0
- agentcore/cli/commands/dev/command.py +450 -0
- agentcore/cli/commands/dev/terminal_mode.py +379 -0
- agentcore/cli/commands/exec/__init__.py +29 -0
- agentcore/cli/commands/exec/action.py +442 -0
- agentcore/cli/commands/exec/command.py +206 -0
- agentcore/cli/commands/exec/types.py +35 -0
- agentcore/cli/commands/export/__init__.py +114 -0
- agentcore/cli/commands/export/constants.py +21 -0
- agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
- agentcore/cli/commands/export/harness_action.py +385 -0
- agentcore/cli/commands/export/harness_mapper.py +868 -0
- agentcore/cli/commands/export/harness_resolver.py +95 -0
- agentcore/cli/commands/export/types.py +90 -0
- agentcore/cli/commands/export/wizard.py +97 -0
- agentcore/cli/commands/feedback/__init__.py +69 -0
- agentcore/cli/commands/feedback/action.py +30 -0
- agentcore/cli/commands/feedback/consent_prompt.py +35 -0
- agentcore/cli/commands/feedback/wizard.py +49 -0
- agentcore/cli/commands/fetch/__init__.py +69 -0
- agentcore/cli/commands/fetch/action.py +62 -0
- agentcore/cli/commands/help.py +65 -0
- agentcore/cli/commands/import_/__init__.py +167 -0
- agentcore/cli/commands/import_/_js.py +72 -0
- agentcore/cli/commands/import_/actions.py +457 -0
- agentcore/cli/commands/import_/constants.py +45 -0
- agentcore/cli/commands/import_/import_evaluator.py +140 -0
- agentcore/cli/commands/import_/import_gateway.py +520 -0
- agentcore/cli/commands/import_/import_memory.py +128 -0
- agentcore/cli/commands/import_/import_online_eval.py +165 -0
- agentcore/cli/commands/import_/import_pipeline.py +145 -0
- agentcore/cli/commands/import_/import_runtime.py +214 -0
- agentcore/cli/commands/import_/import_utils.py +410 -0
- agentcore/cli/commands/import_/phase1_update.py +110 -0
- agentcore/cli/commands/import_/phase2_import.py +206 -0
- agentcore/cli/commands/import_/resource_import.py +228 -0
- agentcore/cli/commands/import_/template_utils.py +148 -0
- agentcore/cli/commands/import_/types.py +150 -0
- agentcore/cli/commands/import_/yaml_parser.py +265 -0
- agentcore/cli/commands/init.py +196 -0
- agentcore/cli/commands/invoke/__init__.py +32 -0
- agentcore/cli/commands/invoke/_deps.py +73 -0
- agentcore/cli/commands/invoke/action.py +840 -0
- agentcore/cli/commands/invoke/command.py +490 -0
- agentcore/cli/commands/invoke/constants.py +40 -0
- agentcore/cli/commands/invoke/guards.py +23 -0
- agentcore/cli/commands/invoke/interactive.py +604 -0
- agentcore/cli/commands/invoke/resolve.py +149 -0
- agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
- agentcore/cli/commands/invoke/types.py +61 -0
- agentcore/cli/commands/invoke/validate.py +33 -0
- agentcore/cli/commands/job_actions.py +239 -0
- agentcore/cli/commands/job_history.py +380 -0
- agentcore/cli/commands/logs/__init__.py +53 -0
- agentcore/cli/commands/logs/action.py +159 -0
- agentcore/cli/commands/logs/filter_pattern.py +17 -0
- agentcore/cli/commands/logs/guards.py +51 -0
- agentcore/cli/commands/logs_evals.py +42 -0
- agentcore/cli/commands/package.py +118 -0
- agentcore/cli/commands/remove/__init__.py +172 -0
- agentcore/cli/commands/remove/skill_command.py +131 -0
- agentcore/cli/commands/remove/tool_command.py +59 -0
- agentcore/cli/commands/run.py +808 -0
- agentcore/cli/commands/run_ingest.py +97 -0
- agentcore/cli/commands/shared/__init__.py +0 -0
- agentcore/cli/commands/shared/arn_utils.py +9 -0
- agentcore/cli/commands/shared/filesystem_utils.py +421 -0
- agentcore/cli/commands/shared/header_utils.py +87 -0
- agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
- agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
- agentcore/cli/commands/shared/region_utils.py +20 -0
- agentcore/cli/commands/shared/vpc_utils.py +99 -0
- agentcore/cli/commands/status/__init__.py +30 -0
- agentcore/cli/commands/status/_guards.py +25 -0
- agentcore/cli/commands/status/action.py +741 -0
- agentcore/cli/commands/status/command.py +321 -0
- agentcore/cli/commands/status/constants.py +36 -0
- agentcore/cli/commands/status/format_knowledge_base.py +111 -0
- agentcore/cli/commands/telemetry.py +79 -0
- agentcore/cli/commands/traces/__init__.py +155 -0
- agentcore/cli/commands/traces/action.py +123 -0
- agentcore/cli/commands/update/__init__.py +63 -0
- agentcore/cli/commands/update/action.py +164 -0
- agentcore/cli/commands/validate.py +165 -0
- agentcore/cli/constants.py +96 -0
- agentcore/cli/errors.py +118 -0
- agentcore/cli/external_requirements/__init__.py +67 -0
- agentcore/cli/external_requirements/checks.py +280 -0
- agentcore/cli/external_requirements/detect.py +55 -0
- agentcore/cli/external_requirements/versions.py +57 -0
- agentcore/cli/groups.py +23 -0
- agentcore/cli/interactive.py +85 -0
- agentcore/cli/main.py +137 -0
- agentcore/cli/naming.py +11 -0
- agentcore/cli/notices.py +42 -0
- agentcore/cli/project.py +34 -0
- agentcore/cli/run_command.py +27 -0
- agentcore/cli/tree.py +135 -0
- agentcore/cli/update_notifier.py +123 -0
- agentcore/cli/variadic.py +50 -0
- agentcore/cloudformation/__init__.py +84 -0
- agentcore/cloudformation/bootstrap.py +64 -0
- agentcore/cloudformation/logical_ids.py +37 -0
- agentcore/cloudformation/outputs.py +566 -0
- agentcore/cloudformation/stack_discovery.py +75 -0
- agentcore/cloudformation/stack_events.py +107 -0
- agentcore/cloudformation/stack_status.py +98 -0
- agentcore/cloudformation/types.py +44 -0
- agentcore/lib/__init__.py +68 -0
- agentcore/lib/constants.py +77 -0
- agentcore/lib/dependency_management/__init__.py +23 -0
- agentcore/lib/dependency_management/messages.py +92 -0
- agentcore/lib/dependency_management/plan.py +98 -0
- agentcore/lib/dependency_management/semver.py +137 -0
- agentcore/lib/dependency_management/sync.py +139 -0
- agentcore/lib/dependency_management/types.py +56 -0
- agentcore/lib/errors/__init__.py +5 -0
- agentcore/lib/errors/types.py +352 -0
- agentcore/lib/errors/validation.py +121 -0
- agentcore/lib/packaging/__init__.py +81 -0
- agentcore/lib/packaging/build_args.py +23 -0
- agentcore/lib/packaging/build_context.py +26 -0
- agentcore/lib/packaging/build_context_dockerignore.py +45 -0
- agentcore/lib/packaging/container.py +95 -0
- agentcore/lib/packaging/helpers.py +289 -0
- agentcore/lib/packaging/node.py +153 -0
- agentcore/lib/packaging/python.py +135 -0
- agentcore/lib/packaging/types.py +69 -0
- agentcore/lib/packaging/uv.py +45 -0
- agentcore/lib/result.py +104 -0
- agentcore/lib/schemas/__init__.py +1 -0
- agentcore/lib/schemas/io/__init__.py +27 -0
- agentcore/lib/schemas/io/config_io.py +458 -0
- agentcore/lib/schemas/io/global_config.py +239 -0
- agentcore/lib/schemas/io/path_resolver.py +132 -0
- agentcore/lib/secrets/__init__.py +18 -0
- agentcore/lib/secrets/cipher.py +70 -0
- agentcore/lib/secrets/key_provider.py +163 -0
- agentcore/lib/secrets/sensitive_keys.py +55 -0
- agentcore/lib/time_constants.py +4 -0
- agentcore/lib/utils/__init__.py +47 -0
- agentcore/lib/utils/aws_account.py +15 -0
- agentcore/lib/utils/credentials.py +68 -0
- agentcore/lib/utils/dotenv.py +32 -0
- agentcore/lib/utils/env.py +105 -0
- agentcore/lib/utils/json_format.py +29 -0
- agentcore/lib/utils/json_rpc.py +22 -0
- agentcore/lib/utils/platform.py +33 -0
- agentcore/lib/utils/polling.py +86 -0
- agentcore/lib/utils/subprocess.py +135 -0
- agentcore/lib/utils/time_parser.py +48 -0
- agentcore/lib/utils/validation.py +106 -0
- agentcore/logging/__init__.py +10 -0
- agentcore/logging/_common.py +77 -0
- agentcore/logging/cdk_io_host.py +36 -0
- agentcore/logging/create_logger.py +107 -0
- agentcore/logging/dev_logger.py +63 -0
- agentcore/logging/exec_logger.py +159 -0
- agentcore/logging/invoke_logger.py +154 -0
- agentcore/logging/remove_logger.py +95 -0
- agentcore/operations/__init__.py +0 -0
- agentcore/operations/agent/__init__.py +0 -0
- agentcore/operations/agent/config_bundle_defaults.py +31 -0
- agentcore/operations/agent/generate/__init__.py +28 -0
- agentcore/operations/agent/generate/schema_mapper.py +319 -0
- agentcore/operations/agent/generate/types.py +172 -0
- agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
- agentcore/operations/agent/import_/__init__.py +31 -0
- agentcore/operations/agent/import_/base_translator.py +449 -0
- agentcore/operations/agent/import_/constants.py +23 -0
- agentcore/operations/agent/import_/execute.py +127 -0
- agentcore/operations/agent/import_/langgraph_translator.py +294 -0
- agentcore/operations/agent/import_/pyproject_generator.py +73 -0
- agentcore/operations/agent/import_/strands_translator.py +289 -0
- agentcore/operations/config_bundle/__init__.py +1 -0
- agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
- agentcore/operations/config_bundle/diff_versions.py +52 -0
- agentcore/operations/config_bundle/resolve_bundle.py +65 -0
- agentcore/operations/connectors/__init__.py +3 -0
- agentcore/operations/connectors/translators.py +63 -0
- agentcore/operations/dataset/__init__.py +21 -0
- agentcore/operations/dataset/delete.py +7 -0
- agentcore/operations/dataset/publish.py +16 -0
- agentcore/operations/dataset/pull.py +21 -0
- agentcore/operations/dataset/push.py +201 -0
- agentcore/operations/dataset/resolve_dataset.py +65 -0
- agentcore/operations/dataset/status.py +18 -0
- agentcore/operations/dataset/wait.py +25 -0
- agentcore/operations/deploy/__init__.py +152 -0
- agentcore/operations/deploy/backfill_vpc_id.py +90 -0
- agentcore/operations/deploy/change_detection.py +84 -0
- agentcore/operations/deploy/constants.py +58 -0
- agentcore/operations/deploy/dependency_sync.py +105 -0
- agentcore/operations/deploy/ensure_target.py +30 -0
- agentcore/operations/deploy/gateway_status.py +44 -0
- agentcore/operations/deploy/managed_memory_notice.py +36 -0
- agentcore/operations/deploy/payment_connector_authorization.py +106 -0
- agentcore/operations/deploy/post_deploy_datasets.py +96 -0
- agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
- agentcore/operations/deploy/post_deploy_observability.py +28 -0
- agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
- agentcore/operations/deploy/pre_deploy_identity.py +505 -0
- agentcore/operations/deploy/preflight.py +385 -0
- agentcore/operations/deploy/region_override.py +45 -0
- agentcore/operations/deploy/teardown.py +153 -0
- agentcore/operations/dev/__init__.py +61 -0
- agentcore/operations/dev/_http.py +79 -0
- agentcore/operations/dev/_server.py +165 -0
- agentcore/operations/dev/codezip_dev_server.py +151 -0
- agentcore/operations/dev/config.py +128 -0
- agentcore/operations/dev/constants.py +9 -0
- agentcore/operations/dev/container_dev_server.py +237 -0
- agentcore/operations/dev/container_runtime.py +37 -0
- agentcore/operations/dev/dev_server.py +244 -0
- agentcore/operations/dev/gateway_env.py +25 -0
- agentcore/operations/dev/invoke.py +214 -0
- agentcore/operations/dev/invoke_a2a.py +204 -0
- agentcore/operations/dev/invoke_agui.py +88 -0
- agentcore/operations/dev/invoke_mcp.py +145 -0
- agentcore/operations/dev/invoke_types.py +30 -0
- agentcore/operations/dev/load_dev_env.py +26 -0
- agentcore/operations/dev/memory_env.py +19 -0
- agentcore/operations/dev/otel/__init__.py +5 -0
- agentcore/operations/dev/otel/collector.py +234 -0
- agentcore/operations/dev/otel/transforms.py +331 -0
- agentcore/operations/dev/payment_env.py +50 -0
- agentcore/operations/dev/server.py +28 -0
- agentcore/operations/dev/sse_transform.py +30 -0
- agentcore/operations/dev/utils.py +152 -0
- agentcore/operations/dev/web_ui/__init__.py +31 -0
- agentcore/operations/dev/web_ui/constants.py +25 -0
- agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
- agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
- agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
- agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
- agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
- agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
- agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
- agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
- agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
- agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
- agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
- agentcore/operations/dev/web_ui/handlers/start.py +182 -0
- agentcore/operations/dev/web_ui/handlers/status.py +25 -0
- agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
- agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
- agentcore/operations/dev/web_ui/web_server.py +297 -0
- agentcore/operations/eval/__init__.py +8 -0
- agentcore/operations/eval/list_eval_runs.py +18 -0
- agentcore/operations/eval/logs_eval.py +119 -0
- agentcore/operations/eval/pause_resume.py +90 -0
- agentcore/operations/eval/run_eval.py +354 -0
- agentcore/operations/eval/shared/__init__.py +0 -0
- agentcore/operations/eval/shared/dataset_loader.py +68 -0
- agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
- agentcore/operations/eval/shared/evaluator_runner.py +89 -0
- agentcore/operations/eval/shared/scenario_executor.py +71 -0
- agentcore/operations/eval/shared/span_collector.py +255 -0
- agentcore/operations/eval/storage.py +67 -0
- agentcore/operations/feedback/__init__.py +21 -0
- agentcore/operations/feedback/aperture_client.py +98 -0
- agentcore/operations/feedback/build_payload.py +97 -0
- agentcore/operations/feedback/constants.py +26 -0
- agentcore/operations/feedback/submit_feedback.py +150 -0
- agentcore/operations/fetch_access/__init__.py +36 -0
- agentcore/operations/fetch_access/_target.py +17 -0
- agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
- agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
- agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
- agentcore/operations/fetch_access/list_agents.py +18 -0
- agentcore/operations/fetch_access/list_gateways.py +26 -0
- agentcore/operations/fetch_access/list_harnesses.py +23 -0
- agentcore/operations/fetch_access/oauth_token.py +162 -0
- agentcore/operations/fetch_access/types.py +34 -0
- agentcore/operations/harness/__init__.py +1 -0
- agentcore/operations/harness/orphan.py +84 -0
- agentcore/operations/harness/skill_utils.py +56 -0
- agentcore/operations/identity/__init__.py +33 -0
- agentcore/operations/identity/api_key_credential_provider.py +68 -0
- agentcore/operations/identity/oauth2_credential_provider.py +95 -0
- agentcore/operations/ingest/__init__.py +184 -0
- agentcore/operations/init/__init__.py +3 -0
- agentcore/operations/init/files.py +59 -0
- agentcore/operations/insights/__init__.py +21 -0
- agentcore/operations/insights/insights_storage.py +67 -0
- agentcore/operations/insights/run_insights.py +148 -0
- agentcore/operations/invoke/__init__.py +5 -0
- agentcore/operations/invoke/resolve_agent_context.py +85 -0
- agentcore/operations/jobs/__init__.py +38 -0
- agentcore/operations/jobs/ab_test/__init__.py +0 -0
- agentcore/operations/jobs/ab_test/build_options.py +126 -0
- agentcore/operations/jobs/ab_test/format.py +121 -0
- agentcore/operations/jobs/ab_test/handler.py +412 -0
- agentcore/operations/jobs/ab_test/promote.py +142 -0
- agentcore/operations/jobs/ab_test/resolve.py +221 -0
- agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
- agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
- agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
- agentcore/operations/jobs/batch_evaluation/format.py +58 -0
- agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
- agentcore/operations/jobs/insights/__init__.py +0 -0
- agentcore/operations/jobs/insights/format.py +65 -0
- agentcore/operations/jobs/insights/handler.py +178 -0
- agentcore/operations/jobs/recommendation/__init__.py +0 -0
- agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
- agentcore/operations/jobs/recommendation/build_config.py +271 -0
- agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
- agentcore/operations/jobs/recommendation/format.py +77 -0
- agentcore/operations/jobs/recommendation/handler.py +331 -0
- agentcore/operations/jobs/shared/__init__.py +0 -0
- agentcore/operations/jobs/shared/constants.py +85 -0
- agentcore/operations/jobs/shared/engine.py +187 -0
- agentcore/operations/jobs/shared/format.py +104 -0
- agentcore/operations/jobs/shared/region.py +34 -0
- agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
- agentcore/operations/jobs/shared/storage.py +117 -0
- agentcore/operations/jobs/shared/wait.py +30 -0
- agentcore/operations/knowledge_base/__init__.py +33 -0
- agentcore/operations/knowledge_base/connector_config.py +105 -0
- agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
- agentcore/operations/mcp/__init__.py +4 -0
- agentcore/operations/memory/__init__.py +13 -0
- agentcore/operations/memory/_records.py +72 -0
- agentcore/operations/memory/list_memory_records.py +45 -0
- agentcore/operations/memory/retrieve_memory_records.py +52 -0
- agentcore/operations/node/__init__.py +15 -0
- agentcore/operations/node/setup.py +36 -0
- agentcore/operations/python/__init__.py +17 -0
- agentcore/operations/python/setup.py +47 -0
- agentcore/operations/resolve_agent.py +159 -0
- agentcore/operations/session/__init__.py +86 -0
- agentcore/operations/traces/__init__.py +29 -0
- agentcore/operations/traces/get_trace.py +202 -0
- agentcore/operations/traces/insights_query.py +74 -0
- agentcore/operations/traces/list_traces.py +46 -0
- agentcore/operations/traces/trace_url.py +25 -0
- agentcore/operations/traces/types.py +55 -0
- agentcore/primitives/__init__.py +0 -0
- agentcore/primitives/_gateway_target_wizard.py +293 -0
- agentcore/primitives/_gateway_validation.py +442 -0
- agentcore/primitives/_harness_cli.py +557 -0
- agentcore/primitives/_harness_validation.py +163 -0
- agentcore/primitives/_harness_wizard.py +726 -0
- agentcore/primitives/_knowledge_base_wizard.py +259 -0
- agentcore/primitives/_payment_wizard.py +331 -0
- agentcore/primitives/_policy_form.py +160 -0
- agentcore/primitives/agent.py +817 -0
- agentcore/primitives/auth_utils.py +77 -0
- agentcore/primitives/base.py +178 -0
- agentcore/primitives/capacity_provider.py +501 -0
- agentcore/primitives/config_bundle.py +329 -0
- agentcore/primitives/credential.py +387 -0
- agentcore/primitives/credential_utils.py +45 -0
- agentcore/primitives/dataset.py +211 -0
- agentcore/primitives/deployed_gateways.py +34 -0
- agentcore/primitives/evaluator.py +909 -0
- agentcore/primitives/gateway.py +496 -0
- agentcore/primitives/gateway_target.py +988 -0
- agentcore/primitives/harness.py +706 -0
- agentcore/primitives/knowledge_base.py +477 -0
- agentcore/primitives/memory.py +387 -0
- agentcore/primitives/online_eval_config.py +365 -0
- agentcore/primitives/online_insights.py +275 -0
- agentcore/primitives/payment_connector.py +427 -0
- agentcore/primitives/payment_eligible.py +20 -0
- agentcore/primitives/payment_manager.py +605 -0
- agentcore/primitives/payment_validation.py +68 -0
- agentcore/primitives/policy.py +622 -0
- agentcore/primitives/policy_engine.py +358 -0
- agentcore/primitives/registry.py +56 -0
- agentcore/primitives/runtime_endpoint.py +361 -0
- agentcore/primitives/secret_flag_warning.py +17 -0
- agentcore/schema/__init__.py +14 -0
- agentcore/schema/_zod.py +395 -0
- agentcore/schema/constants.py +306 -0
- agentcore/schema/schemas/__init__.py +40 -0
- agentcore/schema/schemas/agent_env.py +545 -0
- agentcore/schema/schemas/agentcore_project.py +530 -0
- agentcore/schema/schemas/auth.py +286 -0
- agentcore/schema/schemas/aws_targets.py +72 -0
- agentcore/schema/schemas/connections.py +187 -0
- agentcore/schema/schemas/deployed_state.py +322 -0
- agentcore/schema/schemas/mcp.py +650 -0
- agentcore/schema/schemas/mcp_defs.py +54 -0
- agentcore/schema/schemas/primitives/__init__.py +52 -0
- agentcore/schema/schemas/primitives/ab_test.py +162 -0
- agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
- agentcore/schema/schemas/primitives/config_bundle.py +48 -0
- agentcore/schema/schemas/primitives/dataset.py +55 -0
- agentcore/schema/schemas/primitives/evaluator.py +171 -0
- agentcore/schema/schemas/primitives/harness.py +710 -0
- agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
- agentcore/schema/schemas/primitives/memory.py +113 -0
- agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
- agentcore/schema/schemas/primitives/payment.py +114 -0
- agentcore/schema/schemas/primitives/policy.py +83 -0
- agentcore/schema/schemas/primitives/tags.py +50 -0
- agentcore/schema/schemas/zod_util.py +5 -0
- agentcore/schema/types/__init__.py +3 -0
- agentcore/schema/types/path.py +16 -0
- agentcore/templates/__init__.py +115 -0
- agentcore/templates/_handlebars.py +782 -0
- agentcore/templates/_js.py +164 -0
- agentcore/templates/base_renderer.py +107 -0
- agentcore/templates/cdk_renderer.py +129 -0
- agentcore/templates/evaluator_renderer.py +39 -0
- agentcore/templates/gateway_target_renderer.py +69 -0
- agentcore/templates/llm_context/README.md +16 -0
- agentcore/templates/llm_context/agentcore.ts +685 -0
- agentcore/templates/llm_context/aws-targets.ts +51 -0
- agentcore/templates/profiles.py +151 -0
- agentcore/templates/render.py +92 -0
- agentcore/templates/renderers.py +83 -0
- agentcore/templates/schema_assets.py +23 -0
- agentcore/templates/template_root.py +28 -0
- agentcore/templates/types.py +192 -0
- agentcore_cli-0.31.1.dist-info/METADATA +84 -0
- agentcore_cli-0.31.1.dist-info/RECORD +655 -0
- agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
- agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
- agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
- agentcore_cli-0.31.1.dist-info/licenses/NOTICE +88 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"""Credential add/remove (port of src/cli/primitives/CredentialPrimitive.tsx)."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from agentcore.cli import interactive
|
|
9
|
+
from agentcore.cli.commands.add._common import first_issue, js_url_ok
|
|
10
|
+
from agentcore.cli.commands.add.validate import validate_add_credential_options
|
|
11
|
+
from agentcore.cli.errors import get_error_message
|
|
12
|
+
from agentcore.cli.naming import generate_unique_name
|
|
13
|
+
from agentcore.cli.run_command import run_cli_command
|
|
14
|
+
from agentcore.lib import (
|
|
15
|
+
ConflictError,
|
|
16
|
+
ResourceNotFoundError,
|
|
17
|
+
ValidationError,
|
|
18
|
+
find_config_root,
|
|
19
|
+
get_env_var,
|
|
20
|
+
serialize_result,
|
|
21
|
+
set_env_var,
|
|
22
|
+
)
|
|
23
|
+
from agentcore.lib.errors.types import to_error
|
|
24
|
+
from agentcore.lib.result import Err, Ok
|
|
25
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
26
|
+
from agentcore.lib.secrets import validate_credential_name_encryptable
|
|
27
|
+
from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange, emit_json
|
|
28
|
+
from agentcore.primitives.credential_utils import compute_default_credential_env_var_name
|
|
29
|
+
from agentcore.primitives.secret_flag_warning import warn_on_literal_secret_flag
|
|
30
|
+
from agentcore.schema import CredentialName
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class AddApiKeyCredentialOptions:
|
|
35
|
+
name: str
|
|
36
|
+
api_key: str
|
|
37
|
+
authorizer_type: str = "ApiKeyCredentialProvider"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class AddOAuthCredentialOptions:
|
|
42
|
+
name: str
|
|
43
|
+
discovery_url: str
|
|
44
|
+
client_id: str
|
|
45
|
+
client_secret: str
|
|
46
|
+
scopes: list[str] | None = None
|
|
47
|
+
authorizer_type: str = "OAuthCredentialProvider"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
AddCredentialOptions = AddApiKeyCredentialOptions | AddOAuthCredentialOptions
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class CredentialStrategy:
|
|
55
|
+
"""Whether an agent reuses an existing model-provider credential or creates a new one."""
|
|
56
|
+
|
|
57
|
+
reuse: bool
|
|
58
|
+
credential_name: str
|
|
59
|
+
env_var_name: str
|
|
60
|
+
is_agent_scoped: bool
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _config_root(config_io: Any) -> str | None:
|
|
64
|
+
try:
|
|
65
|
+
return config_io.get_config_root()
|
|
66
|
+
except Exception: # noqa: BLE001
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class CredentialPrimitive(BasePrimitive):
|
|
71
|
+
kind = "credential"
|
|
72
|
+
label = "Credential"
|
|
73
|
+
article = "a"
|
|
74
|
+
|
|
75
|
+
compute_default_credential_env_var_name = staticmethod(compute_default_credential_env_var_name)
|
|
76
|
+
|
|
77
|
+
def _project(self) -> dict[str, Any]:
|
|
78
|
+
return to_jsonable(self.read_project_spec())
|
|
79
|
+
|
|
80
|
+
# --- add ----------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
def add(self, options: AddCredentialOptions) -> Ok[dict[str, Any]] | Err[Exception]:
|
|
83
|
+
try:
|
|
84
|
+
# An API-key secret lives in the bare AGENTCORE_CREDENTIAL_<NAME> var; refuse names that
|
|
85
|
+
# would normalize to a reserved suffix and leave it unencrypted.
|
|
86
|
+
if options.authorizer_type == "ApiKeyCredentialProvider":
|
|
87
|
+
check = validate_credential_name_encryptable(options.name)
|
|
88
|
+
if check is not True:
|
|
89
|
+
return Err(ValidationError(check))
|
|
90
|
+
credential = self._create_credential(options)
|
|
91
|
+
return Ok({"credentialName": credential["name"]})
|
|
92
|
+
except Exception as exc: # noqa: BLE001
|
|
93
|
+
return Err(to_error(exc))
|
|
94
|
+
|
|
95
|
+
def _create_credential(self, config: AddCredentialOptions) -> dict[str, Any]:
|
|
96
|
+
project = self._project()
|
|
97
|
+
existing = next((c for c in project["credentials"] if c["name"] == config.name), None)
|
|
98
|
+
if existing is not None:
|
|
99
|
+
credential = existing
|
|
100
|
+
elif isinstance(config, AddOAuthCredentialOptions):
|
|
101
|
+
credential = {
|
|
102
|
+
"authorizerType": "OAuthCredentialProvider",
|
|
103
|
+
"name": config.name,
|
|
104
|
+
"discoveryUrl": config.discovery_url,
|
|
105
|
+
"vendor": "CustomOauth2",
|
|
106
|
+
}
|
|
107
|
+
if config.scopes is not None:
|
|
108
|
+
credential["scopes"] = config.scopes
|
|
109
|
+
project["credentials"].append(credential)
|
|
110
|
+
self.write_project_spec(project)
|
|
111
|
+
else:
|
|
112
|
+
credential = {"authorizerType": "ApiKeyCredentialProvider", "name": config.name}
|
|
113
|
+
project["credentials"].append(credential)
|
|
114
|
+
self.write_project_spec(project)
|
|
115
|
+
|
|
116
|
+
root = _config_root(self.config_io)
|
|
117
|
+
prefix = compute_default_credential_env_var_name(config.name)
|
|
118
|
+
if isinstance(config, AddOAuthCredentialOptions):
|
|
119
|
+
set_env_var(f"{prefix}_CLIENT_ID", config.client_id, root)
|
|
120
|
+
set_env_var(f"{prefix}_CLIENT_SECRET", config.client_secret, root)
|
|
121
|
+
else:
|
|
122
|
+
set_env_var(prefix, config.api_key, root)
|
|
123
|
+
return credential
|
|
124
|
+
|
|
125
|
+
# --- remove -------------------------------------------------------------------------
|
|
126
|
+
|
|
127
|
+
def remove(self, name: str, force: bool = False) -> Ok[None] | Err[Exception]:
|
|
128
|
+
try:
|
|
129
|
+
project = self._project()
|
|
130
|
+
index = next((i for i, c in enumerate(project["credentials"]) if c["name"] == name), -1)
|
|
131
|
+
if index == -1:
|
|
132
|
+
return Err(ResourceNotFoundError(f'Credential "{name}" not found.'))
|
|
133
|
+
credential = project["credentials"][index]
|
|
134
|
+
if credential.get("managed") and not force:
|
|
135
|
+
return Err(
|
|
136
|
+
ConflictError(
|
|
137
|
+
f'Credential "{name}" is managed by the CLI and cannot be removed. Use force to override.'
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
targets = self._find_referencing_gateway_targets(name, project)
|
|
141
|
+
if targets and not force:
|
|
142
|
+
target_list = ", ".join(t["name"] for t in targets)
|
|
143
|
+
return Err(
|
|
144
|
+
ConflictError(
|
|
145
|
+
f'Credential "{name}" is referenced by gateway target(s): {target_list}. Use force to override.'
|
|
146
|
+
)
|
|
147
|
+
)
|
|
148
|
+
project["credentials"].pop(index)
|
|
149
|
+
self.write_project_spec(project)
|
|
150
|
+
return Ok(None)
|
|
151
|
+
except Exception as exc: # noqa: BLE001
|
|
152
|
+
return Err(to_error(exc))
|
|
153
|
+
|
|
154
|
+
def preview_remove(self, name: str) -> RemovalPreview:
|
|
155
|
+
project = self._project()
|
|
156
|
+
credential = next((c for c in project["credentials"] if c["name"] == name), None)
|
|
157
|
+
if credential is None:
|
|
158
|
+
raise Exception(f'Credential "{name}" not found.')
|
|
159
|
+
summary = [
|
|
160
|
+
f"Removing credential: {name}",
|
|
161
|
+
f"Type: {credential['authorizerType']}",
|
|
162
|
+
"Note: .env file will not be modified",
|
|
163
|
+
]
|
|
164
|
+
if credential.get("managed"):
|
|
165
|
+
summary.append(
|
|
166
|
+
"Warning: This credential is managed by the CLI. Removing it may break gateway authentication."
|
|
167
|
+
)
|
|
168
|
+
targets = self._find_referencing_gateway_targets(name, project)
|
|
169
|
+
if targets:
|
|
170
|
+
summary.append(f"Warning: Referenced by gateway target(s): {', '.join(t['name'] for t in targets)}")
|
|
171
|
+
after = {**project, "credentials": [c for c in project["credentials"] if c["name"] != name]}
|
|
172
|
+
return RemovalPreview(summary, [], [SchemaChange("agentcore/agentcore.json", project, after)])
|
|
173
|
+
|
|
174
|
+
def get_removable(self) -> list[RemovableResource]:
|
|
175
|
+
try:
|
|
176
|
+
return [
|
|
177
|
+
RemovableResource(c["name"], {"authorizerType": c["authorizerType"]})
|
|
178
|
+
for c in self._project()["credentials"]
|
|
179
|
+
]
|
|
180
|
+
except Exception: # noqa: BLE001
|
|
181
|
+
return []
|
|
182
|
+
|
|
183
|
+
def get_all_credentials(self) -> list[dict[str, Any]]:
|
|
184
|
+
try:
|
|
185
|
+
return self._project()["credentials"]
|
|
186
|
+
except Exception: # noqa: BLE001
|
|
187
|
+
return []
|
|
188
|
+
|
|
189
|
+
def get_all_names(self) -> list[str]:
|
|
190
|
+
return [c["name"] for c in self.get_all_credentials()]
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def _find_referencing_gateway_targets(name: str, project: dict[str, Any]) -> list[dict[str, Any]]:
|
|
194
|
+
return [
|
|
195
|
+
{"name": target["name"]}
|
|
196
|
+
for gateway in project.get("agentCoreGateways", [])
|
|
197
|
+
for target in gateway.get("targets", [])
|
|
198
|
+
if (target.get("outboundAuth") or {}).get("credentialName") == name
|
|
199
|
+
]
|
|
200
|
+
|
|
201
|
+
# --- credential strategy for agents ----------------------------------------------------
|
|
202
|
+
|
|
203
|
+
def resolve_credential_strategy(
|
|
204
|
+
self,
|
|
205
|
+
project_name: str,
|
|
206
|
+
agent_name: str,
|
|
207
|
+
model_provider: str,
|
|
208
|
+
new_api_key: str | None,
|
|
209
|
+
config_base_dir: str,
|
|
210
|
+
existing_credentials: list[Any],
|
|
211
|
+
) -> CredentialStrategy:
|
|
212
|
+
"""Reuse a credential holding the same key, else create project- or agent-scoped."""
|
|
213
|
+
if model_provider == "Bedrock" or not new_api_key:
|
|
214
|
+
return CredentialStrategy(True, "", "", False)
|
|
215
|
+
|
|
216
|
+
for cred in existing_credentials:
|
|
217
|
+
cred_name = cred["name"] if isinstance(cred, dict) else cred.name
|
|
218
|
+
env_var_name = compute_default_credential_env_var_name(cred_name)
|
|
219
|
+
if get_env_var(env_var_name, config_base_dir) == new_api_key:
|
|
220
|
+
return CredentialStrategy(True, cred_name, env_var_name, cred_name != f"{project_name}{model_provider}")
|
|
221
|
+
|
|
222
|
+
project_scoped = f"{project_name}{model_provider}"
|
|
223
|
+
names = [c["name"] if isinstance(c, dict) else c.name for c in existing_credentials]
|
|
224
|
+
if project_scoped not in names:
|
|
225
|
+
return CredentialStrategy(
|
|
226
|
+
False, project_scoped, compute_default_credential_env_var_name(project_scoped), False
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
agent_scoped = f"{project_name}{agent_name}{model_provider}"
|
|
230
|
+
return CredentialStrategy(False, agent_scoped, compute_default_credential_env_var_name(agent_scoped), True)
|
|
231
|
+
|
|
232
|
+
# --- CLI ----------------------------------------------------------------------------
|
|
233
|
+
|
|
234
|
+
def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
|
|
235
|
+
@add_app.command("credential", help="Add a credential to the project")
|
|
236
|
+
def add_credential(
|
|
237
|
+
name: str | None = typer.Option(None, "--name", help="Credential name [non-interactive]"),
|
|
238
|
+
api_key: str | None = typer.Option(None, "--api-key", help="The API key value [non-interactive]"),
|
|
239
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
240
|
+
cred_type: str | None = typer.Option(
|
|
241
|
+
None, "--type", help="Credential type: api-key (default) or oauth [non-interactive]"
|
|
242
|
+
),
|
|
243
|
+
discovery_url: str | None = typer.Option(
|
|
244
|
+
None, "--discovery-url", help="OAuth discovery URL [non-interactive]"
|
|
245
|
+
),
|
|
246
|
+
client_id: str | None = typer.Option(None, "--client-id", help="OAuth client ID [non-interactive]"),
|
|
247
|
+
client_secret: str | None = typer.Option(
|
|
248
|
+
None, "--client-secret", help="OAuth client secret [non-interactive]"
|
|
249
|
+
),
|
|
250
|
+
scopes: str | None = typer.Option(None, "--scopes", help="OAuth scopes, comma-separated [non-interactive]"),
|
|
251
|
+
) -> None:
|
|
252
|
+
if not find_config_root():
|
|
253
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
254
|
+
raise typer.Exit(1)
|
|
255
|
+
|
|
256
|
+
if not (name or api_key or as_json or cred_type or discovery_url or client_id or client_secret or scopes):
|
|
257
|
+
try:
|
|
258
|
+
interactive.require_tty()
|
|
259
|
+
self.add_interactive()
|
|
260
|
+
except typer.Exit:
|
|
261
|
+
raise
|
|
262
|
+
except Exception as exc: # noqa: BLE001
|
|
263
|
+
typer.echo(get_error_message(exc), err=True)
|
|
264
|
+
raise typer.Exit(1) from None
|
|
265
|
+
raise typer.Exit(0)
|
|
266
|
+
|
|
267
|
+
def run() -> None:
|
|
268
|
+
warn_on_literal_secret_flag([api_key, client_secret], as_json, "add credential")
|
|
269
|
+
validation = validate_add_credential_options(
|
|
270
|
+
{
|
|
271
|
+
"name": name,
|
|
272
|
+
"type": cred_type,
|
|
273
|
+
"apiKey": api_key,
|
|
274
|
+
"discoveryUrl": discovery_url,
|
|
275
|
+
"clientId": client_id,
|
|
276
|
+
"clientSecret": client_secret,
|
|
277
|
+
"scopes": scopes,
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
if not validation.valid:
|
|
281
|
+
raise ValidationError(validation.error or "")
|
|
282
|
+
options: AddCredentialOptions
|
|
283
|
+
if cred_type == "oauth":
|
|
284
|
+
options = AddOAuthCredentialOptions(
|
|
285
|
+
name=name or "",
|
|
286
|
+
discovery_url=discovery_url or "",
|
|
287
|
+
client_id=client_id or "",
|
|
288
|
+
client_secret=client_secret or "",
|
|
289
|
+
scopes=[s.strip() for s in scopes.split(",") if s.strip()] if scopes is not None else None,
|
|
290
|
+
)
|
|
291
|
+
else:
|
|
292
|
+
options = AddApiKeyCredentialOptions(name=name or "", api_key=api_key or "")
|
|
293
|
+
result = self.add(options)
|
|
294
|
+
if not result.success:
|
|
295
|
+
raise result.error
|
|
296
|
+
if as_json:
|
|
297
|
+
emit_json(serialize_result(result))
|
|
298
|
+
else:
|
|
299
|
+
typer.echo(f"Added credential '{result.value['credentialName']}'")
|
|
300
|
+
|
|
301
|
+
run_cli_command(as_json, run)
|
|
302
|
+
|
|
303
|
+
self.register_remove_subcommand(remove_app)
|
|
304
|
+
|
|
305
|
+
def add_interactive(self, identity_type: str | None = None) -> str | None:
|
|
306
|
+
"""Prompt flow mirroring tui/screens/identity/AddIdentityScreen (type, name, secrets, confirm).
|
|
307
|
+
|
|
308
|
+
``identity_type`` skips the type question (inline creation from other wizards, upstream
|
|
309
|
+
useCreateIdentity). Returns the new credential's name, or None if cancelled.
|
|
310
|
+
"""
|
|
311
|
+
existing = self.get_all_names()
|
|
312
|
+
identity_type = identity_type or interactive.select(
|
|
313
|
+
"Select credential type",
|
|
314
|
+
[
|
|
315
|
+
interactive.Choice("API Key", "ApiKeyCredentialProvider", "Store and manage API key credentials"),
|
|
316
|
+
interactive.Choice("OAuth", "OAuthCredentialProvider", "OAuth 2.0 client credentials"),
|
|
317
|
+
],
|
|
318
|
+
)
|
|
319
|
+
is_oauth = identity_type == "OAuthCredentialProvider"
|
|
320
|
+
|
|
321
|
+
def validate_name(value: str) -> str | None:
|
|
322
|
+
issue = first_issue(CredentialName, value)
|
|
323
|
+
if issue:
|
|
324
|
+
return issue
|
|
325
|
+
if value in existing:
|
|
326
|
+
return "Credential name already exists"
|
|
327
|
+
if not is_oauth:
|
|
328
|
+
check = validate_credential_name_encryptable(value)
|
|
329
|
+
if check is not True:
|
|
330
|
+
return check
|
|
331
|
+
return None
|
|
332
|
+
|
|
333
|
+
name = interactive.text(
|
|
334
|
+
"Credential name",
|
|
335
|
+
default=generate_unique_name("MyOAuth" if is_oauth else "MyApiKey", existing),
|
|
336
|
+
validate=validate_name,
|
|
337
|
+
)
|
|
338
|
+
options: AddCredentialOptions
|
|
339
|
+
if is_oauth:
|
|
340
|
+
|
|
341
|
+
def validate_url(value: str) -> str | None:
|
|
342
|
+
if not js_url_ok(value):
|
|
343
|
+
return "Must be a valid URL"
|
|
344
|
+
if not value.endswith("/.well-known/openid-configuration"):
|
|
345
|
+
return "URL must end with '/.well-known/openid-configuration'"
|
|
346
|
+
return None
|
|
347
|
+
|
|
348
|
+
discovery_url = interactive.text("Discovery URL (OIDC well-known endpoint)", validate=validate_url)
|
|
349
|
+
client_id = interactive.text(
|
|
350
|
+
"Client ID", secret=True, validate=lambda v: None if v.strip() else "Client ID is required"
|
|
351
|
+
)
|
|
352
|
+
client_secret = interactive.text(
|
|
353
|
+
"Client Secret", secret=True, validate=lambda v: None if v.strip() else "Client secret is required"
|
|
354
|
+
)
|
|
355
|
+
scopes = interactive.text("Scopes (comma-separated, optional)", default="")
|
|
356
|
+
summary = [("Type", "OAuth"), ("Name", name), ("Discovery URL", discovery_url)]
|
|
357
|
+
if scopes:
|
|
358
|
+
summary.append(("Scopes", scopes))
|
|
359
|
+
options = AddOAuthCredentialOptions(
|
|
360
|
+
name=name,
|
|
361
|
+
discovery_url=discovery_url,
|
|
362
|
+
client_id=client_id,
|
|
363
|
+
client_secret=client_secret,
|
|
364
|
+
scopes=[s.strip() for s in scopes.split(",") if s.strip()] if scopes else None,
|
|
365
|
+
)
|
|
366
|
+
else:
|
|
367
|
+
api_key = interactive.text(
|
|
368
|
+
"API Key", secret=True, validate=lambda v: None if v.strip() else "API key is required"
|
|
369
|
+
)
|
|
370
|
+
summary = [("Type", "API Key"), ("Name", name), ("API Key", "*" * min(len(api_key), 20))]
|
|
371
|
+
options = AddApiKeyCredentialOptions(name=name, api_key=api_key)
|
|
372
|
+
|
|
373
|
+
for label, value in summary:
|
|
374
|
+
typer.echo(f" {label}: {value}")
|
|
375
|
+
if not interactive.confirm("Add this credential?", default=True):
|
|
376
|
+
typer.echo("Cancelled.")
|
|
377
|
+
return None
|
|
378
|
+
result = self.add(options)
|
|
379
|
+
if not result.success:
|
|
380
|
+
typer.echo("Failed to add credential", err=True)
|
|
381
|
+
typer.echo(get_error_message(result.error), err=True)
|
|
382
|
+
raise typer.Exit(1)
|
|
383
|
+
typer.echo(f"Added credential: {result.value['credentialName']}")
|
|
384
|
+
return result.value["credentialName"]
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
PRIMITIVE = CredentialPrimitive()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Credential env-var naming (port of src/cli/primitives/credential-utils.ts)."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _prefix(credential_name: str) -> str:
|
|
7
|
+
return f"AGENTCORE_CREDENTIAL_{credential_name.replace('-', '_').upper()}"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def compute_default_credential_env_var_name(credential_name: str) -> str:
|
|
11
|
+
return _prefix(credential_name)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def compute_managed_oauth_credential_name(gateway_name: str) -> str:
|
|
15
|
+
return f"{gateway_name}-oauth"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class PaymentCredentialEnvVarNames:
|
|
20
|
+
api_key_id: str
|
|
21
|
+
api_key_secret: str
|
|
22
|
+
wallet_secret: str
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(frozen=True)
|
|
26
|
+
class StripePrivyCredentialEnvVarNames:
|
|
27
|
+
app_id: str
|
|
28
|
+
app_secret: str
|
|
29
|
+
authorization_private_key: str
|
|
30
|
+
authorization_id: str
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def compute_payment_credential_env_var_names(credential_name: str) -> PaymentCredentialEnvVarNames:
|
|
34
|
+
prefix = _prefix(credential_name)
|
|
35
|
+
return PaymentCredentialEnvVarNames(f"{prefix}_API_KEY_ID", f"{prefix}_API_KEY_SECRET", f"{prefix}_WALLET_SECRET")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def compute_stripe_privy_credential_env_var_names(credential_name: str) -> StripePrivyCredentialEnvVarNames:
|
|
39
|
+
prefix = _prefix(credential_name)
|
|
40
|
+
return StripePrivyCredentialEnvVarNames(
|
|
41
|
+
f"{prefix}_APP_ID",
|
|
42
|
+
f"{prefix}_APP_SECRET",
|
|
43
|
+
f"{prefix}_AUTHORIZATION_PRIVATE_KEY",
|
|
44
|
+
f"{prefix}_AUTHORIZATION_ID",
|
|
45
|
+
)
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""Dataset add/remove (port of src/cli/primitives/DatasetPrimitive.ts)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from importlib import resources
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import typer
|
|
10
|
+
|
|
11
|
+
from agentcore.cli import interactive
|
|
12
|
+
from agentcore.cli.commands.add._common import first_issue
|
|
13
|
+
from agentcore.cli.commands.add.validate import validate_add_dataset_options
|
|
14
|
+
from agentcore.cli.errors import get_error_message
|
|
15
|
+
from agentcore.cli.naming import generate_unique_name
|
|
16
|
+
from agentcore.cli.run_command import run_cli_command
|
|
17
|
+
from agentcore.lib import find_config_root
|
|
18
|
+
from agentcore.lib.result import Err, Ok
|
|
19
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
20
|
+
from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange
|
|
21
|
+
from agentcore.schema import DatasetName, is_valid_kms_key_arn
|
|
22
|
+
|
|
23
|
+
SCHEMA_TYPE_TO_ASSET = {
|
|
24
|
+
"AGENTCORE_EVALUATION_PREDEFINED_V1": "predefined-v1.jsonl",
|
|
25
|
+
"AGENTCORE_EVALUATION_SIMULATED_V1": "simulated-v1.jsonl",
|
|
26
|
+
}
|
|
27
|
+
SCHEMA_TYPE_OPTIONS = (
|
|
28
|
+
("AGENTCORE_EVALUATION_PREDEFINED_V1", "Predefined Turns", "Explicit inputs with expected responses"),
|
|
29
|
+
("AGENTCORE_EVALUATION_SIMULATED_V1", "Actor Simulator", "Actor profiles for synthetic conversations"),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class AddDatasetOptions:
|
|
35
|
+
name: str
|
|
36
|
+
schema_type: str
|
|
37
|
+
description: str | None = None
|
|
38
|
+
kms_key_arn: str | None = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def read_dataset_asset(asset_file: str) -> bytes:
|
|
42
|
+
"""Bundled starter dataset (``agentcore/assets/datasets/*.jsonl``)."""
|
|
43
|
+
return resources.files("agentcore.assets").joinpath("datasets", asset_file).read_bytes()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class DatasetPrimitive(BasePrimitive):
|
|
47
|
+
kind = "dataset"
|
|
48
|
+
label = "Dataset"
|
|
49
|
+
article = "a"
|
|
50
|
+
|
|
51
|
+
def _project(self) -> dict[str, Any]:
|
|
52
|
+
return to_jsonable(self.read_project_spec())
|
|
53
|
+
|
|
54
|
+
def add(self, options: AddDatasetOptions) -> Ok | Err:
|
|
55
|
+
try:
|
|
56
|
+
project = self._project()
|
|
57
|
+
datasets = project.get("datasets") or []
|
|
58
|
+
self.check_duplicate([RemovableResource(d["name"]) for d in datasets], options.name)
|
|
59
|
+
location = f"datasets/{options.name}.jsonl"
|
|
60
|
+
dataset: dict[str, Any] = {"name": options.name, "schemaType": options.schema_type}
|
|
61
|
+
if options.description:
|
|
62
|
+
dataset["description"] = options.description
|
|
63
|
+
if options.kms_key_arn:
|
|
64
|
+
dataset["kmsKeyArn"] = options.kms_key_arn
|
|
65
|
+
dataset["config"] = {"managed": {"location": location}}
|
|
66
|
+
datasets.append(dataset)
|
|
67
|
+
project["datasets"] = datasets
|
|
68
|
+
self.write_project_spec(project)
|
|
69
|
+
self._scaffold_dataset_file(options.schema_type, location)
|
|
70
|
+
return Ok({"datasetName": options.name, "location": f"agentcore/{location}"})
|
|
71
|
+
except Exception as exc: # noqa: BLE001
|
|
72
|
+
return Err(exc if isinstance(exc, Exception) else Exception(get_error_message(exc)))
|
|
73
|
+
|
|
74
|
+
def _scaffold_dataset_file(self, schema_type: str, location: str) -> None:
|
|
75
|
+
config_root = find_config_root()
|
|
76
|
+
if not config_root:
|
|
77
|
+
return
|
|
78
|
+
os.makedirs(os.path.join(config_root, "datasets"), exist_ok=True)
|
|
79
|
+
asset = SCHEMA_TYPE_TO_ASSET.get(schema_type)
|
|
80
|
+
if not asset:
|
|
81
|
+
return
|
|
82
|
+
with open(os.path.join(config_root, location), "wb") as fh:
|
|
83
|
+
fh.write(read_dataset_asset(asset))
|
|
84
|
+
|
|
85
|
+
def remove(self, name: str) -> Ok | Err:
|
|
86
|
+
try:
|
|
87
|
+
project = self._project()
|
|
88
|
+
datasets = project.get("datasets") or []
|
|
89
|
+
index = next((i for i, d in enumerate(datasets) if d["name"] == name), -1)
|
|
90
|
+
if index == -1:
|
|
91
|
+
return Err(Exception(f'Dataset "{name}" not found.'))
|
|
92
|
+
datasets.pop(index)
|
|
93
|
+
project["datasets"] = datasets
|
|
94
|
+
self.write_project_spec(project)
|
|
95
|
+
return Ok(None)
|
|
96
|
+
except Exception as exc: # noqa: BLE001
|
|
97
|
+
return Err(exc)
|
|
98
|
+
|
|
99
|
+
def preview_remove(self, name: str) -> RemovalPreview:
|
|
100
|
+
project = self._project()
|
|
101
|
+
datasets = project.get("datasets") or []
|
|
102
|
+
if not any(d["name"] == name for d in datasets):
|
|
103
|
+
raise Exception(f'Dataset "{name}" not found.')
|
|
104
|
+
after = {**project, "datasets": [d for d in datasets if d["name"] != name]}
|
|
105
|
+
return RemovalPreview(
|
|
106
|
+
[f"Removing dataset: {name}"], [], [SchemaChange("agentcore/agentcore.json", project, after)]
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def get_removable(self) -> list[RemovableResource]:
|
|
110
|
+
try:
|
|
111
|
+
return [RemovableResource(d["name"]) for d in self._project().get("datasets") or []]
|
|
112
|
+
except Exception: # noqa: BLE001
|
|
113
|
+
return []
|
|
114
|
+
|
|
115
|
+
def get_all_names(self) -> list[str]:
|
|
116
|
+
return [r.name for r in self.get_removable()]
|
|
117
|
+
|
|
118
|
+
def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
|
|
119
|
+
@add_app.command("dataset", help="Add a dataset to the project")
|
|
120
|
+
def add_dataset(
|
|
121
|
+
name: str | None = typer.Option(None, "--name", help="Dataset name [non-interactive]"),
|
|
122
|
+
schema_type: str | None = typer.Option(
|
|
123
|
+
None,
|
|
124
|
+
"--schema-type",
|
|
125
|
+
help="Dataset schema type: AGENTCORE_EVALUATION_PREDEFINED_V1 | AGENTCORE_EVALUATION_SIMULATED_V1 "
|
|
126
|
+
"[non-interactive]",
|
|
127
|
+
),
|
|
128
|
+
description: str | None = typer.Option(None, "--description", help="Dataset description [non-interactive]"),
|
|
129
|
+
kms_key_arn: str | None = typer.Option(
|
|
130
|
+
None, "--kms-key-arn", help="KMS key ARN for dataset encryption (optional) [non-interactive]"
|
|
131
|
+
),
|
|
132
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
133
|
+
) -> None:
|
|
134
|
+
if not find_config_root():
|
|
135
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
136
|
+
raise typer.Exit(1)
|
|
137
|
+
if not (name or as_json):
|
|
138
|
+
try:
|
|
139
|
+
interactive.require_tty()
|
|
140
|
+
self.add_interactive()
|
|
141
|
+
except typer.Exit:
|
|
142
|
+
raise
|
|
143
|
+
except Exception as exc: # noqa: BLE001
|
|
144
|
+
typer.echo(get_error_message(exc), err=True)
|
|
145
|
+
raise typer.Exit(1) from None
|
|
146
|
+
raise typer.Exit(0)
|
|
147
|
+
|
|
148
|
+
def run() -> None:
|
|
149
|
+
validation = validate_add_dataset_options(
|
|
150
|
+
{
|
|
151
|
+
"name": name or "",
|
|
152
|
+
"schemaType": schema_type or "",
|
|
153
|
+
"description": description,
|
|
154
|
+
"kmsKeyArn": kms_key_arn,
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
if not validation.valid:
|
|
158
|
+
raise Exception(validation.error)
|
|
159
|
+
result = self.add(AddDatasetOptions(name or "", schema_type or "", description, kms_key_arn))
|
|
160
|
+
if not result.success:
|
|
161
|
+
raise result.error
|
|
162
|
+
if as_json:
|
|
163
|
+
# Upstream prints the raw AddResult (`JSON.stringify(result)`).
|
|
164
|
+
typer.echo(json.dumps({"success": True, **result.value}, separators=(",", ":")))
|
|
165
|
+
else:
|
|
166
|
+
typer.echo(f"Added dataset '{result.value['datasetName']}'")
|
|
167
|
+
typer.echo(f" File: {result.value['location']}")
|
|
168
|
+
|
|
169
|
+
run_cli_command(as_json, run)
|
|
170
|
+
|
|
171
|
+
self.register_remove_subcommand(remove_app)
|
|
172
|
+
|
|
173
|
+
def add_interactive(self) -> None:
|
|
174
|
+
"""Prompt flow mirroring tui/screens/dataset/AddDatasetScreen."""
|
|
175
|
+
existing = self.get_all_names()
|
|
176
|
+
|
|
177
|
+
def validate_name(value: str) -> str | None:
|
|
178
|
+
issue = first_issue(DatasetName, value)
|
|
179
|
+
if issue:
|
|
180
|
+
return issue
|
|
181
|
+
return "Dataset name already exists" if value in existing else None
|
|
182
|
+
|
|
183
|
+
name = interactive.text(
|
|
184
|
+
"Dataset name", default=generate_unique_name("MyDataset", existing), validate=validate_name
|
|
185
|
+
)
|
|
186
|
+
schema_type = interactive.select(
|
|
187
|
+
"Schema type", [interactive.Choice(t, i, d) for i, t, d in SCHEMA_TYPE_OPTIONS]
|
|
188
|
+
)
|
|
189
|
+
description = interactive.text("Description (optional, press Enter to skip)")
|
|
190
|
+
kms = interactive.text(
|
|
191
|
+
"KMS Key ARN (optional, press Enter to skip)",
|
|
192
|
+
validate=lambda v: None if v == "" or is_valid_kms_key_arn(v) else "Must be a valid KMS key ARN",
|
|
193
|
+
)
|
|
194
|
+
typer.echo(f" Name: {name}")
|
|
195
|
+
typer.echo(f" Schema Type: {schema_type}")
|
|
196
|
+
if description:
|
|
197
|
+
typer.echo(f" Description: {description}")
|
|
198
|
+
if kms:
|
|
199
|
+
typer.echo(f" KMS Key: {kms}")
|
|
200
|
+
if not interactive.confirm("Add this dataset?", default=True):
|
|
201
|
+
typer.echo("Cancelled.")
|
|
202
|
+
return
|
|
203
|
+
result = self.add(AddDatasetOptions(name, schema_type, description or None, kms or None))
|
|
204
|
+
if not result.success:
|
|
205
|
+
typer.echo("Failed to add dataset", err=True)
|
|
206
|
+
typer.echo(get_error_message(result.error), err=True)
|
|
207
|
+
raise typer.Exit(1)
|
|
208
|
+
typer.echo(f"Added dataset: {name}")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
PRIMITIVE = DatasetPrimitive()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Resolve deployed gateways across both storage locations (port of primitives/deployed-gateways.ts).
|
|
2
|
+
|
|
3
|
+
Deployed state keeps MCP gateways under ``resources.mcp.gateways`` and HTTP gateways
|
|
4
|
+
(``protocolType: "None"``) under ``resources.gateways``. A project can populate both maps, so they
|
|
5
|
+
are merged rather than falling back from one to the other.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def merge_deployed_gateways(target: Any) -> dict[str, Any]:
|
|
12
|
+
resources = getattr(target, "resources", None)
|
|
13
|
+
mcp = getattr(resources, "mcp", None) if resources is not None else None
|
|
14
|
+
merged: dict[str, Any] = dict((getattr(mcp, "gateways", None) or {}) if mcp is not None else {})
|
|
15
|
+
merged.update((getattr(resources, "gateways", None) or {}) if resources is not None else {})
|
|
16
|
+
return merged
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def find_deployed_gateway(state: Any, name: str) -> Any | None:
|
|
20
|
+
"""Find a deployed gateway by name across all targets."""
|
|
21
|
+
for target in (state.targets or {}).values():
|
|
22
|
+
gateway = merge_deployed_gateways(target).get(name)
|
|
23
|
+
if gateway:
|
|
24
|
+
return gateway
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def first_deployed_gateway(state: Any) -> Any | None:
|
|
29
|
+
"""The first deployed gateway across all targets."""
|
|
30
|
+
for target in (state.targets or {}).values():
|
|
31
|
+
gateways = list(merge_deployed_gateways(target).values())
|
|
32
|
+
if gateways:
|
|
33
|
+
return gateways[0]
|
|
34
|
+
return None
|