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,333 @@
|
|
|
1
|
+
"""Validation for `agentcore add <kind>` flags (port of src/cli/commands/add/validate.ts).
|
|
2
|
+
|
|
3
|
+
Ported here: agent, memory, dataset, credential. Gateway, gateway-target and harness validation
|
|
4
|
+
belong to the areas that own those primitives.
|
|
5
|
+
|
|
6
|
+
``options`` is a dict keyed by the upstream option names; like upstream, validators normalize
|
|
7
|
+
some values in place (enum casing, lifecycle numbers).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Any, Final
|
|
11
|
+
|
|
12
|
+
from agentcore.cli.commands.add._common import ValidationResult, first_issue, js_url_ok, parse_json
|
|
13
|
+
from agentcore.cli.commands.add.auth_options import validate_jwt_authorizer_options
|
|
14
|
+
from agentcore.cli.commands.shared.arn_utils import ARN_VALIDATION_MESSAGE, is_valid_arn
|
|
15
|
+
from agentcore.cli.commands.shared.header_utils import validate_header_allowlist
|
|
16
|
+
from agentcore.cli.commands.shared.indexed_key_parser import MAX_INDEXED_KEYS, parse_indexed_key_arg
|
|
17
|
+
from agentcore.cli.commands.shared.lifecycle_utils import parse_and_validate_lifecycle_options
|
|
18
|
+
from agentcore.cli.commands.shared.vpc_utils import validate_vpc_options
|
|
19
|
+
from agentcore.schema import (
|
|
20
|
+
BUILD_TYPES,
|
|
21
|
+
DATASET_SCHEMA_TYPES,
|
|
22
|
+
MODEL_PROVIDERS,
|
|
23
|
+
PROTOCOL_MODES,
|
|
24
|
+
RUNTIME_AUTHORIZER_TYPES,
|
|
25
|
+
SDK_FRAMEWORKS,
|
|
26
|
+
TARGET_LANGUAGES,
|
|
27
|
+
AgentName,
|
|
28
|
+
DatasetName,
|
|
29
|
+
SessionStorage,
|
|
30
|
+
StreamDeliveryResources,
|
|
31
|
+
get_frameworks_for_language,
|
|
32
|
+
get_supported_frameworks_for_protocol,
|
|
33
|
+
get_supported_model_providers,
|
|
34
|
+
is_framework_supported_for_language,
|
|
35
|
+
is_valid_kms_key_arn,
|
|
36
|
+
match_enum_value,
|
|
37
|
+
match_sdk_framework,
|
|
38
|
+
)
|
|
39
|
+
from agentcore.templates import apply_template_option_defaults, validate_template_options
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
"DEFAULT_DELIVERY_TYPE",
|
|
43
|
+
"MEMORY_OPTIONS",
|
|
44
|
+
"ValidationResult",
|
|
45
|
+
"apply_lifecycle",
|
|
46
|
+
"session_storage_mount_path_issue",
|
|
47
|
+
"validate_add_agent_options",
|
|
48
|
+
"validate_add_credential_options",
|
|
49
|
+
"validate_add_dataset_options",
|
|
50
|
+
"validate_add_memory_options",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
MEMORY_OPTIONS: Final = ("none", "shortTerm", "longAndShortTerm")
|
|
54
|
+
VALID_STRATEGIES: Final = ("SEMANTIC", "SUMMARIZATION", "USER_PREFERENCE", "EPISODIC")
|
|
55
|
+
VALID_STREAM_CONTENT_LEVELS: Final = ("FULL_CONTENT", "METADATA_ONLY")
|
|
56
|
+
VALID_DELIVERY_TYPES: Final = ("kinesis",)
|
|
57
|
+
DEFAULT_DELIVERY_TYPE: Final = "kinesis"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _normalize(options: dict[str, Any], key: str, values: Any) -> None:
|
|
61
|
+
if options.get(key):
|
|
62
|
+
options[key] = match_enum_value(values, options[key]) or options[key]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def session_storage_mount_path_issue(path: str) -> str | None:
|
|
66
|
+
"""``SessionStorageSchema.shape.mountPath.safeParse`` first issue."""
|
|
67
|
+
issue = first_issue(SessionStorage, {"mountPath": path})
|
|
68
|
+
return issue
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def apply_lifecycle(options: dict[str, Any]) -> ValidationResult | None:
|
|
72
|
+
"""Parse/validate idleTimeout/maxLifetime in place; returns a failure result or None."""
|
|
73
|
+
result = parse_and_validate_lifecycle_options(options)
|
|
74
|
+
if not result.valid:
|
|
75
|
+
return ValidationResult(False, result.error)
|
|
76
|
+
if result.idle_timeout is not None:
|
|
77
|
+
options["idleTimeout"] = result.idle_timeout
|
|
78
|
+
if result.max_lifetime is not None:
|
|
79
|
+
options["maxLifetime"] = result.max_lifetime
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def validate_add_agent_options(options: dict[str, Any]) -> ValidationResult:
|
|
84
|
+
_normalize(options, "protocol", PROTOCOL_MODES)
|
|
85
|
+
if options.get("framework"):
|
|
86
|
+
options["framework"] = match_sdk_framework(options["framework"]) or options["framework"]
|
|
87
|
+
_normalize(options, "modelProvider", MODEL_PROVIDERS)
|
|
88
|
+
_normalize(options, "language", TARGET_LANGUAGES)
|
|
89
|
+
_normalize(options, "build", BUILD_TYPES)
|
|
90
|
+
|
|
91
|
+
apply_template_option_defaults(options.get("framework"), options)
|
|
92
|
+
template_error = validate_template_options(options.get("framework"), options)
|
|
93
|
+
if template_error:
|
|
94
|
+
return ValidationResult(False, template_error)
|
|
95
|
+
|
|
96
|
+
if options.get("sessionStorageMountPath") and options.get("language") == "TypeScript":
|
|
97
|
+
return ValidationResult(False, "--session-storage-mount-path is not supported for TypeScript agents")
|
|
98
|
+
|
|
99
|
+
if not options.get("name"):
|
|
100
|
+
return ValidationResult(False, "--name is required")
|
|
101
|
+
issue = first_issue(AgentName, options["name"])
|
|
102
|
+
if issue:
|
|
103
|
+
return ValidationResult(False, issue)
|
|
104
|
+
|
|
105
|
+
if options.get("build") and options["build"] not in BUILD_TYPES:
|
|
106
|
+
return ValidationResult(False, f"Invalid build type: {options['build']}. Use CodeZip or Container")
|
|
107
|
+
|
|
108
|
+
protocol = options.get("protocol") or "HTTP"
|
|
109
|
+
if protocol not in PROTOCOL_MODES:
|
|
110
|
+
return ValidationResult(False, f"Invalid protocol: {protocol}. Use HTTP, MCP, A2A, or AGUI")
|
|
111
|
+
options["protocol"] = protocol
|
|
112
|
+
|
|
113
|
+
if protocol != "HTTP" and options.get("language") == "TypeScript":
|
|
114
|
+
return ValidationResult(
|
|
115
|
+
False, f"{protocol} protocol is not yet supported for TypeScript. Use --protocol HTTP or --language Python."
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
is_byo = options.get("type") == "byo"
|
|
119
|
+
if options.get("type") == "import":
|
|
120
|
+
if not options.get("agentId"):
|
|
121
|
+
return ValidationResult(False, "--agent-id is required for import path")
|
|
122
|
+
if not options.get("agentAliasId"):
|
|
123
|
+
return ValidationResult(False, "--agent-alias-id is required for import path")
|
|
124
|
+
if not options.get("region"):
|
|
125
|
+
return ValidationResult(False, "--region is required for import path")
|
|
126
|
+
if not options.get("framework"):
|
|
127
|
+
return ValidationResult(False, "--framework is required for import path")
|
|
128
|
+
if options["framework"] not in ("Strands", "LangChain_LangGraph"):
|
|
129
|
+
return ValidationResult(False, "Import path only supports Strands or LangChain_LangGraph frameworks")
|
|
130
|
+
if not options.get("memory"):
|
|
131
|
+
return ValidationResult(False, "--memory is required for import path")
|
|
132
|
+
if options["memory"] not in MEMORY_OPTIONS:
|
|
133
|
+
return ValidationResult(
|
|
134
|
+
False, f"Invalid memory option: {options['memory']}. Use none, shortTerm, or longAndShortTerm"
|
|
135
|
+
)
|
|
136
|
+
if failure := apply_lifecycle(options):
|
|
137
|
+
return failure
|
|
138
|
+
options["modelProvider"] = "Bedrock"
|
|
139
|
+
options["language"] = "Python"
|
|
140
|
+
return ValidationResult(True)
|
|
141
|
+
|
|
142
|
+
if protocol == "MCP":
|
|
143
|
+
if options.get("framework"):
|
|
144
|
+
return ValidationResult(False, "--framework is not applicable for MCP protocol")
|
|
145
|
+
if options.get("modelProvider"):
|
|
146
|
+
return ValidationResult(False, "--model-provider is not applicable for MCP protocol")
|
|
147
|
+
if options.get("memory") and options["memory"] != "none":
|
|
148
|
+
return ValidationResult(False, "--memory is not applicable for MCP protocol")
|
|
149
|
+
if not options.get("language"):
|
|
150
|
+
return ValidationResult(False, "--language is required")
|
|
151
|
+
if options["language"] not in TARGET_LANGUAGES:
|
|
152
|
+
return ValidationResult(False, f"Invalid language: {options['language']}")
|
|
153
|
+
if is_byo and not options.get("codeLocation"):
|
|
154
|
+
return ValidationResult(False, "--code-location is required for BYO path")
|
|
155
|
+
if failure := apply_lifecycle(options):
|
|
156
|
+
return failure
|
|
157
|
+
return ValidationResult(True)
|
|
158
|
+
|
|
159
|
+
framework = options.get("framework")
|
|
160
|
+
if not framework:
|
|
161
|
+
return ValidationResult(False, "--framework is required")
|
|
162
|
+
if framework not in SDK_FRAMEWORKS:
|
|
163
|
+
return ValidationResult(False, f"Invalid framework: {framework}")
|
|
164
|
+
if protocol != "HTTP" and framework not in get_supported_frameworks_for_protocol(protocol): # type: ignore[arg-type]
|
|
165
|
+
return ValidationResult(False, f"{framework} does not support {protocol} protocol")
|
|
166
|
+
|
|
167
|
+
provider = options.get("modelProvider")
|
|
168
|
+
if not provider:
|
|
169
|
+
return ValidationResult(False, "--model-provider is required")
|
|
170
|
+
if provider not in MODEL_PROVIDERS:
|
|
171
|
+
return ValidationResult(False, f"Invalid model provider: {provider}")
|
|
172
|
+
if provider not in get_supported_model_providers(framework): # type: ignore[arg-type]
|
|
173
|
+
return ValidationResult(False, f"{framework} does not support {provider}")
|
|
174
|
+
|
|
175
|
+
language = options.get("language")
|
|
176
|
+
if not language:
|
|
177
|
+
return ValidationResult(False, "--language is required")
|
|
178
|
+
if language not in TARGET_LANGUAGES:
|
|
179
|
+
return ValidationResult(False, f"Invalid language: {language}")
|
|
180
|
+
|
|
181
|
+
if is_byo:
|
|
182
|
+
if not options.get("codeLocation"):
|
|
183
|
+
return ValidationResult(False, "--code-location is required for BYO path")
|
|
184
|
+
else:
|
|
185
|
+
if language == "Other":
|
|
186
|
+
return ValidationResult(False, "Create path only supports Python or TypeScript")
|
|
187
|
+
if language in ("Python", "TypeScript") and not is_framework_supported_for_language(language, framework): # type: ignore[arg-type]
|
|
188
|
+
supported = ", ".join(get_frameworks_for_language(language)) # type: ignore[arg-type]
|
|
189
|
+
return ValidationResult(
|
|
190
|
+
False, f"Framework {framework} is not yet available for {language}. Supported: {supported}."
|
|
191
|
+
)
|
|
192
|
+
if not options.get("memory"):
|
|
193
|
+
return ValidationResult(False, "--memory is required for create path")
|
|
194
|
+
if options["memory"] not in MEMORY_OPTIONS:
|
|
195
|
+
return ValidationResult(
|
|
196
|
+
False, f"Invalid memory option: {options['memory']}. Use none, shortTerm, or longAndShortTerm"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
if options.get("requestHeaderAllowlist"):
|
|
200
|
+
header_result = validate_header_allowlist(options["requestHeaderAllowlist"])
|
|
201
|
+
if not header_result.success:
|
|
202
|
+
return ValidationResult(False, header_result.error)
|
|
203
|
+
|
|
204
|
+
if failure := apply_lifecycle(options):
|
|
205
|
+
return failure
|
|
206
|
+
|
|
207
|
+
if options.get("sessionStorageMountPath"):
|
|
208
|
+
issue = session_storage_mount_path_issue(options["sessionStorageMountPath"])
|
|
209
|
+
if issue:
|
|
210
|
+
return ValidationResult(False, f"--session-storage-mount-path: {issue}")
|
|
211
|
+
|
|
212
|
+
vpc_result = validate_vpc_options(options, options.get("build"))
|
|
213
|
+
if not vpc_result.valid:
|
|
214
|
+
return ValidationResult(False, vpc_result.error)
|
|
215
|
+
|
|
216
|
+
if options.get("authorizerType"):
|
|
217
|
+
if options["authorizerType"] not in RUNTIME_AUTHORIZER_TYPES:
|
|
218
|
+
return ValidationResult(False, "Invalid authorizer type. Use AWS_IAM or CUSTOM_JWT")
|
|
219
|
+
if options["authorizerType"] == "CUSTOM_JWT":
|
|
220
|
+
jwt_result = validate_jwt_authorizer_options(options)
|
|
221
|
+
if not jwt_result.valid:
|
|
222
|
+
return jwt_result
|
|
223
|
+
|
|
224
|
+
if options.get("clientId") and options.get("authorizerType") != "CUSTOM_JWT":
|
|
225
|
+
return ValidationResult(False, "OAuth client credentials are only valid with CUSTOM_JWT authorizer")
|
|
226
|
+
|
|
227
|
+
return ValidationResult(True)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def validate_add_memory_options(options: dict[str, Any]) -> ValidationResult:
|
|
231
|
+
if not options.get("name"):
|
|
232
|
+
return ValidationResult(False, "--name is required")
|
|
233
|
+
|
|
234
|
+
strategies_raw = options.get("strategies")
|
|
235
|
+
if strategies_raw:
|
|
236
|
+
for strategy in (s.strip() for s in strategies_raw.split(",")):
|
|
237
|
+
if strategy and strategy not in VALID_STRATEGIES:
|
|
238
|
+
return ValidationResult(
|
|
239
|
+
False, f"Invalid strategy: {strategy}. Must be one of: {', '.join(VALID_STRATEGIES)}"
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
indexed = options.get("indexedKey")
|
|
243
|
+
if indexed:
|
|
244
|
+
ltm = [s.strip().upper() for s in (strategies_raw or "").split(",") if s.strip()]
|
|
245
|
+
if not ltm:
|
|
246
|
+
return ValidationResult(
|
|
247
|
+
False,
|
|
248
|
+
"--indexed-key requires at least one long-term memory strategy (--strategies). Indexed keys filter "
|
|
249
|
+
"long-term memory records on retrieval.",
|
|
250
|
+
)
|
|
251
|
+
if len(indexed) > MAX_INDEXED_KEYS:
|
|
252
|
+
return ValidationResult(False, f"Maximum {MAX_INDEXED_KEYS} indexed keys allowed")
|
|
253
|
+
seen: set[str] = set()
|
|
254
|
+
for raw in indexed:
|
|
255
|
+
parsed = parse_indexed_key_arg(raw)
|
|
256
|
+
if not parsed.ok:
|
|
257
|
+
return ValidationResult(False, parsed.error)
|
|
258
|
+
key = parsed.value["key"] # type: ignore[index]
|
|
259
|
+
if key in seen:
|
|
260
|
+
return ValidationResult(False, f'Duplicate indexed key: "{key}"')
|
|
261
|
+
seen.add(key)
|
|
262
|
+
|
|
263
|
+
data_stream_arn = options.get("dataStreamArn")
|
|
264
|
+
content_level = options.get("contentLevel")
|
|
265
|
+
delivery_type = options.get("deliveryType")
|
|
266
|
+
stream_resources = options.get("streamDeliveryResources")
|
|
267
|
+
|
|
268
|
+
if stream_resources and (data_stream_arn or content_level or delivery_type):
|
|
269
|
+
return ValidationResult(
|
|
270
|
+
False,
|
|
271
|
+
"--stream-delivery-resources cannot be combined with --data-stream-arn, --stream-content-level, or "
|
|
272
|
+
"--delivery-type",
|
|
273
|
+
)
|
|
274
|
+
if content_level and not data_stream_arn:
|
|
275
|
+
return ValidationResult(False, "--data-stream-arn is required when --stream-content-level is set")
|
|
276
|
+
if delivery_type and not data_stream_arn:
|
|
277
|
+
return ValidationResult(False, "--data-stream-arn is required when --delivery-type is set")
|
|
278
|
+
if data_stream_arn and not is_valid_arn(data_stream_arn):
|
|
279
|
+
return ValidationResult(False, f"--data-stream-arn: {ARN_VALIDATION_MESSAGE}")
|
|
280
|
+
if delivery_type and delivery_type not in VALID_DELIVERY_TYPES:
|
|
281
|
+
return ValidationResult(False, f"Invalid delivery type. Must be one of: {', '.join(VALID_DELIVERY_TYPES)}")
|
|
282
|
+
if content_level and content_level not in VALID_STREAM_CONTENT_LEVELS:
|
|
283
|
+
return ValidationResult(
|
|
284
|
+
False, f"Invalid content level. Must be one of: {', '.join(VALID_STREAM_CONTENT_LEVELS)}"
|
|
285
|
+
)
|
|
286
|
+
if stream_resources:
|
|
287
|
+
ok, parsed_json = parse_json(stream_resources)
|
|
288
|
+
if not ok:
|
|
289
|
+
return ValidationResult(False, "Invalid JSON in --stream-delivery-resources")
|
|
290
|
+
if first_issue(StreamDeliveryResources, parsed_json):
|
|
291
|
+
return ValidationResult(False, "Invalid --stream-delivery-resources: does not match the expected schema")
|
|
292
|
+
|
|
293
|
+
return ValidationResult(True)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def validate_add_dataset_options(options: dict[str, Any]) -> ValidationResult:
|
|
297
|
+
if not options.get("name"):
|
|
298
|
+
return ValidationResult(False, "--name is required")
|
|
299
|
+
issue = first_issue(DatasetName, options["name"])
|
|
300
|
+
if issue:
|
|
301
|
+
return ValidationResult(False, issue)
|
|
302
|
+
schema_type = options.get("schemaType")
|
|
303
|
+
if not schema_type:
|
|
304
|
+
return ValidationResult(False, "--schema-type is required")
|
|
305
|
+
if schema_type not in DATASET_SCHEMA_TYPES:
|
|
306
|
+
return ValidationResult(
|
|
307
|
+
False, f"Invalid schema type: {schema_type}. Valid options: {', '.join(DATASET_SCHEMA_TYPES)}"
|
|
308
|
+
)
|
|
309
|
+
if options.get("kmsKeyArn") and not is_valid_kms_key_arn(options["kmsKeyArn"]):
|
|
310
|
+
return ValidationResult(
|
|
311
|
+
False,
|
|
312
|
+
"--kms-key-arn must be a valid KMS key ARN (e.g. "
|
|
313
|
+
"arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012)",
|
|
314
|
+
)
|
|
315
|
+
return ValidationResult(True)
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def validate_add_credential_options(options: dict[str, Any]) -> ValidationResult:
|
|
319
|
+
if not options.get("name"):
|
|
320
|
+
return ValidationResult(False, "--name is required")
|
|
321
|
+
if (options.get("type") or "api-key") == "oauth":
|
|
322
|
+
if not options.get("discoveryUrl"):
|
|
323
|
+
return ValidationResult(False, "--discovery-url is required for OAuth credentials")
|
|
324
|
+
if not js_url_ok(options["discoveryUrl"]):
|
|
325
|
+
return ValidationResult(False, "--discovery-url must be a valid URL")
|
|
326
|
+
if not options.get("clientId"):
|
|
327
|
+
return ValidationResult(False, "--client-id is required for OAuth credentials")
|
|
328
|
+
if not options.get("clientSecret"):
|
|
329
|
+
return ValidationResult(False, "--client-secret is required for OAuth credentials")
|
|
330
|
+
return ValidationResult(True)
|
|
331
|
+
if not options.get("apiKey"):
|
|
332
|
+
return ValidationResult(False, "--api-key is required")
|
|
333
|
+
return ValidationResult(True)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""`agentcore capacity-provider delete-session` (port of src/cli/commands/capacity-provider)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from agentcore.cli.commands.capacity_provider.action import (
|
|
9
|
+
execute_delete_capacity_provider_session,
|
|
10
|
+
resolve_delete_target,
|
|
11
|
+
)
|
|
12
|
+
from agentcore.cli.commands.capacity_provider.constants import (
|
|
13
|
+
CAPACITY_PROVIDER_SESSION_ID_MAX_LENGTH,
|
|
14
|
+
is_valid_capacity_provider_session_id,
|
|
15
|
+
)
|
|
16
|
+
from agentcore.cli.errors import get_error_message
|
|
17
|
+
from agentcore.cli.groups import group
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def confirm_destructive_delete(display_name: str, session_id: str) -> bool:
|
|
21
|
+
"""y/N prompt; False on bare Enter or non-TTY stdin so the delete never proceeds implicitly."""
|
|
22
|
+
if not sys.stdin.isatty():
|
|
23
|
+
return False
|
|
24
|
+
sys.stdout.write(
|
|
25
|
+
f'\n⚠ Deleting session "{session_id}" on capacity provider "{display_name}" will deprovision its '
|
|
26
|
+
"EC2 instance and permanently delete any persistent EBS volumes on the session. This cannot be undone.\n"
|
|
27
|
+
)
|
|
28
|
+
sys.stdout.flush()
|
|
29
|
+
try:
|
|
30
|
+
answer = input("Continue? [y/N] ").strip().lower()
|
|
31
|
+
except EOFError:
|
|
32
|
+
return False
|
|
33
|
+
return answer in ("y", "yes")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def delete_session(
|
|
37
|
+
capacity_provider: str = typer.Option(
|
|
38
|
+
...,
|
|
39
|
+
"--capacity-provider",
|
|
40
|
+
metavar="NAME-ID-OR-ARN",
|
|
41
|
+
help="Capacity provider: an in-project name, a capacity provider id, or an ARN. The data-plane API is "
|
|
42
|
+
"keyed on the id; a name is resolved to its id via deployed state.",
|
|
43
|
+
),
|
|
44
|
+
session_id: str = typer.Option(..., "--session-id", metavar="ID", help="Session id to delete"),
|
|
45
|
+
region: str | None = typer.Option(
|
|
46
|
+
None, "--region", help="AWS region (auto-detected from the ARN / project otherwise)"
|
|
47
|
+
),
|
|
48
|
+
yes: bool = typer.Option(False, "--yes", help="Skip the destructive confirmation prompt"),
|
|
49
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
|
50
|
+
) -> None:
|
|
51
|
+
try:
|
|
52
|
+
if not is_valid_capacity_provider_session_id(session_id):
|
|
53
|
+
raise ValueError(
|
|
54
|
+
f'Invalid --session-id "{session_id}". Must be 1-{CAPACITY_PROVIDER_SESSION_ID_MAX_LENGTH} '
|
|
55
|
+
"characters, start with an alphanumeric, and contain only letters, digits, hyphens, and underscores."
|
|
56
|
+
)
|
|
57
|
+
target = resolve_delete_target(capacity_provider=capacity_provider, session_id=session_id, region=region)
|
|
58
|
+
if not yes and not confirm_destructive_delete(target.display_name, session_id):
|
|
59
|
+
raise RuntimeError(
|
|
60
|
+
"Aborted — session was not deleted."
|
|
61
|
+
if sys.stdin.isatty()
|
|
62
|
+
else "Refusing to delete a capacity provider session without confirmation. "
|
|
63
|
+
"Re-run with --yes to skip the prompt."
|
|
64
|
+
)
|
|
65
|
+
result = execute_delete_capacity_provider_session(target, session_id)
|
|
66
|
+
if as_json:
|
|
67
|
+
typer.echo(json.dumps({"success": True, **result}, separators=(",", ":")))
|
|
68
|
+
else:
|
|
69
|
+
typer.echo(f'Deprovisioning session "{result.get("sessionId") or session_id}" (asynchronous)…')
|
|
70
|
+
typer.echo(f" Status: {result.get('status') or 'Deprovisioning'}")
|
|
71
|
+
cp = result.get("capacityProviderArn") or target.capacity_provider_arn or target.display_name
|
|
72
|
+
typer.echo(f" Capacity provider: {cp}")
|
|
73
|
+
except Exception as exc: # noqa: BLE001 - runCliCommand boundary, as upstream
|
|
74
|
+
if as_json:
|
|
75
|
+
typer.echo(json.dumps({"success": False, "error": get_error_message(exc)}, separators=(",", ":")))
|
|
76
|
+
else:
|
|
77
|
+
typer.echo(get_error_message(exc), err=True)
|
|
78
|
+
raise typer.Exit(1) from None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def register(app: typer.Typer) -> None:
|
|
82
|
+
group("capacity-provider").command(
|
|
83
|
+
"delete-session",
|
|
84
|
+
help="Delete (deprovision) a live capacity provider session. Terminates its EC2 instance and deletes any "
|
|
85
|
+
"persistent EBS volumes.",
|
|
86
|
+
)(delete_session)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Port of src/cli/commands/capacity-provider/action.ts."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from agentcore.aws import agentcore as agentcore_api
|
|
6
|
+
from agentcore.aws import region as region_mod
|
|
7
|
+
from agentcore.aws.arn import region_from_arn
|
|
8
|
+
from agentcore.cli.commands.capacity_provider.constants import is_capacity_provider_id
|
|
9
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
10
|
+
from agentcore.lib.schemas.io.path_resolver import find_config_root
|
|
11
|
+
from agentcore.schema.schemas.primitives.capacity_provider import is_capacity_provider_arn
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class ResolvedDeleteTarget:
|
|
16
|
+
capacity_provider_id: str
|
|
17
|
+
region: str
|
|
18
|
+
target_by_arn: bool
|
|
19
|
+
"""True when targeted by raw ARN (no project needed)."""
|
|
20
|
+
display_name: str
|
|
21
|
+
capacity_provider_arn: str | None = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _capacity_provider_id_from_arn(arn: str) -> str:
|
|
25
|
+
return arn.split("/")[-1] or arn
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _detect_region() -> str:
|
|
29
|
+
return region_mod.detect_region().region
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def resolve_delete_target(
|
|
33
|
+
*, capacity_provider: str, session_id: str, region: str | None = None
|
|
34
|
+
) -> ResolvedDeleteTarget:
|
|
35
|
+
"""Resolve id + region from an ARN, a literal id, or an in-project name (via deployed state)."""
|
|
36
|
+
# (1) External CP by ARN.
|
|
37
|
+
if is_capacity_provider_arn(capacity_provider):
|
|
38
|
+
arn = capacity_provider
|
|
39
|
+
return ResolvedDeleteTarget(
|
|
40
|
+
capacity_provider_id=_capacity_provider_id_from_arn(arn),
|
|
41
|
+
capacity_provider_arn=arn,
|
|
42
|
+
region=region or region_from_arn(arn) or _detect_region(),
|
|
43
|
+
target_by_arn=True,
|
|
44
|
+
display_name=arn,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# (2) A literal capacity provider id.
|
|
48
|
+
if is_capacity_provider_id(capacity_provider):
|
|
49
|
+
return ResolvedDeleteTarget(
|
|
50
|
+
capacity_provider_id=capacity_provider,
|
|
51
|
+
region=region or _detect_region(),
|
|
52
|
+
target_by_arn=False,
|
|
53
|
+
display_name=capacity_provider,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# (3) An in-project name.
|
|
57
|
+
name = capacity_provider
|
|
58
|
+
config_root = find_config_root()
|
|
59
|
+
if not config_root:
|
|
60
|
+
raise RuntimeError(
|
|
61
|
+
f'No AgentCore project found. Run inside a project to reference "{name}" by name, '
|
|
62
|
+
"or pass the capacity provider id or ARN."
|
|
63
|
+
)
|
|
64
|
+
deployed = ConfigIO(base_dir=config_root).read_deployed_state()
|
|
65
|
+
|
|
66
|
+
matches = []
|
|
67
|
+
for target in (deployed.targets or {}).values():
|
|
68
|
+
resources = target.resources
|
|
69
|
+
record = ((resources.capacity_providers if resources else None) or {}).get(name)
|
|
70
|
+
if record:
|
|
71
|
+
matches.append((record, region_from_arn(record.capacity_provider_arn)))
|
|
72
|
+
|
|
73
|
+
if not matches:
|
|
74
|
+
raise RuntimeError(
|
|
75
|
+
f'Capacity provider "{name}" is not deployed in this project. Deploy it first, '
|
|
76
|
+
"or pass its id or ARN with --capacity-provider."
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
deployed_regions = ", ".join(dict.fromkeys(r for _, r in matches if r))
|
|
80
|
+
if region:
|
|
81
|
+
in_region = [m for m in matches if m[1] == region]
|
|
82
|
+
if not in_region:
|
|
83
|
+
found = f" (found in: {deployed_regions})" if deployed_regions else ""
|
|
84
|
+
raise RuntimeError(
|
|
85
|
+
f'Capacity provider "{name}" is not deployed in region {region}{found}. Pass a matching --region, '
|
|
86
|
+
"or the capacity provider id or ARN with --capacity-provider."
|
|
87
|
+
)
|
|
88
|
+
if len(in_region) > 1:
|
|
89
|
+
raise RuntimeError(
|
|
90
|
+
f'Capacity provider "{name}" resolves to multiple deployments in region {region}. '
|
|
91
|
+
"Pass the capacity provider id or ARN with --capacity-provider to disambiguate."
|
|
92
|
+
)
|
|
93
|
+
record, record_region = in_region[0]
|
|
94
|
+
elif len(matches) > 1:
|
|
95
|
+
raise RuntimeError(
|
|
96
|
+
f'Capacity provider "{name}" is deployed in multiple regions ({deployed_regions}). '
|
|
97
|
+
"Pass --region to select one, or the capacity provider id or ARN with --capacity-provider."
|
|
98
|
+
)
|
|
99
|
+
else:
|
|
100
|
+
record, record_region = matches[0]
|
|
101
|
+
|
|
102
|
+
return ResolvedDeleteTarget(
|
|
103
|
+
capacity_provider_id=record.capacity_provider_id,
|
|
104
|
+
capacity_provider_arn=record.capacity_provider_arn,
|
|
105
|
+
region=region or record_region or _detect_region(),
|
|
106
|
+
target_by_arn=False,
|
|
107
|
+
display_name=name,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def execute_delete_capacity_provider_session(target: ResolvedDeleteTarget, session_id: str):
|
|
112
|
+
return agentcore_api.delete_capacity_provider_session(
|
|
113
|
+
region=target.region, capacity_provider_id=target.capacity_provider_id, session_id=session_id
|
|
114
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Port of src/cli/commands/capacity-provider/constants.ts."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
# Matches the service `SessionId` shape: length 1-100, ^[a-zA-Z0-9][a-zA-Z0-9-_]*$.
|
|
6
|
+
CAPACITY_PROVIDER_SESSION_ID_PATTERN = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9\-_]*$")
|
|
7
|
+
CAPACITY_PROVIDER_SESSION_ID_MAX_LENGTH = 100
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_valid_capacity_provider_session_id(value: str) -> bool:
|
|
11
|
+
return (
|
|
12
|
+
1 <= len(value) <= CAPACITY_PROVIDER_SESSION_ID_MAX_LENGTH
|
|
13
|
+
and CAPACITY_PROVIDER_SESSION_ID_PATTERN.match(value) is not None
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Capacity provider id shape (`{name}-{10 alnum}`); distinguishes an id from a bare project name.
|
|
18
|
+
CAPACITY_PROVIDER_ID_PATTERN = re.compile(r"^[a-zA-Z][a-zA-Z0-9_]{0,47}-[a-zA-Z0-9]{10}$")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def is_capacity_provider_id(value: str) -> bool:
|
|
22
|
+
return CAPACITY_PROVIDER_ID_PATTERN.match(value) is not None
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""`agentcore config [key] [value]` (port of src/cli/commands/config)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from agentcore.lib.errors.types import ValidationError
|
|
9
|
+
from agentcore.lib.result import Err, Ok
|
|
10
|
+
from agentcore.lib.schemas.io.global_config import (
|
|
11
|
+
get_global_config_file,
|
|
12
|
+
read_global_config,
|
|
13
|
+
update_global_config,
|
|
14
|
+
validate_global_config,
|
|
15
|
+
)
|
|
16
|
+
from agentcore.lib.utils.json_format import to_json_string
|
|
17
|
+
|
|
18
|
+
DESCRIPTION = "Adjust global configuration settings such as telemetry opt-out status"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def handle_config_list() -> Ok[str] | Err[Exception]:
|
|
22
|
+
read = read_global_config()
|
|
23
|
+
if not read.success:
|
|
24
|
+
return Err(Exception(f"Error: Unable to parse config file at {get_global_config_file()}"))
|
|
25
|
+
return Ok(to_json_string(read.value, 2))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def handle_config_get(key: str) -> Ok[str] | Err[Exception]:
|
|
29
|
+
read = read_global_config()
|
|
30
|
+
if not read.success:
|
|
31
|
+
return Err(Exception(f"Error: Unable to parse config file at {get_global_config_file()}"))
|
|
32
|
+
value = _get_by_path(read.value, key)
|
|
33
|
+
if value is None:
|
|
34
|
+
return Err(Exception(f'Key "{key}" is not set.'))
|
|
35
|
+
return Ok(to_json_string(value, 2))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def handle_config_set(key: str, raw: str) -> Ok[str] | Err[Exception]:
|
|
39
|
+
partial = _build_nested_object(key, _parse_value(raw))
|
|
40
|
+
if not validate_global_config(partial).success:
|
|
41
|
+
return Err(ValidationError(f'Invalid value "{raw}" for key "{key}".'))
|
|
42
|
+
if not update_global_config(partial):
|
|
43
|
+
return Err(Exception(f"Error: Unable to write config file at {get_global_config_file()}"))
|
|
44
|
+
return Ok(f"Set {key} = {raw}")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _parse_value(raw: str) -> Any:
|
|
48
|
+
try:
|
|
49
|
+
return json.loads(raw)
|
|
50
|
+
except ValueError:
|
|
51
|
+
return raw
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _get_by_path(obj: Any, path: str) -> Any:
|
|
55
|
+
current = obj
|
|
56
|
+
for part in path.split("."):
|
|
57
|
+
if not isinstance(current, dict):
|
|
58
|
+
return None
|
|
59
|
+
current = current.get(part)
|
|
60
|
+
return current
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _build_nested_object(path: str, value: Any) -> dict[str, Any]:
|
|
64
|
+
*parents, leaf = path.split(".")
|
|
65
|
+
result: dict[str, Any] = {}
|
|
66
|
+
inner = result
|
|
67
|
+
for part in parents:
|
|
68
|
+
inner[part] = {}
|
|
69
|
+
inner = inner[part]
|
|
70
|
+
inner[leaf] = value
|
|
71
|
+
return result
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def register(app: typer.Typer) -> None:
|
|
75
|
+
@app.command("config", help=DESCRIPTION)
|
|
76
|
+
def config(
|
|
77
|
+
key: str | None = typer.Argument(None, help="Config key in dot notation (e.g. telemetry.enabled)"),
|
|
78
|
+
value: str | None = typer.Argument(None, help="Value to set"),
|
|
79
|
+
) -> None:
|
|
80
|
+
if key is None:
|
|
81
|
+
result = handle_config_list()
|
|
82
|
+
elif value is None:
|
|
83
|
+
result = handle_config_get(key)
|
|
84
|
+
else:
|
|
85
|
+
result = handle_config_set(key, value)
|
|
86
|
+
|
|
87
|
+
if result.success:
|
|
88
|
+
typer.echo(result.value)
|
|
89
|
+
else:
|
|
90
|
+
typer.echo(str(result.error), err=True)
|
|
91
|
+
raise typer.Exit(1)
|