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,96 @@
|
|
|
1
|
+
"""CLI constants (port of the parts of ``src/cli/constants.ts`` used so far).
|
|
2
|
+
|
|
3
|
+
Keep this a flat module of constants; other areas append what they need.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from typing import Final
|
|
9
|
+
|
|
10
|
+
from agentcore.cdk.constants import CDK_APP_ENTRY, CDK_PROJECT_DIR
|
|
11
|
+
|
|
12
|
+
# Max length AWS BedrockAgentCore allows for a runtime name (combined projectName_agentName).
|
|
13
|
+
MAX_RUNTIME_NAME_LENGTH: Final = 48
|
|
14
|
+
|
|
15
|
+
# Max length of a gateway name (deployed as `${projectName}-${gatewayName}`).
|
|
16
|
+
MAX_GATEWAY_NAME_LENGTH: Final = 48
|
|
17
|
+
|
|
18
|
+
# Current schema version for AgentCore configuration files.
|
|
19
|
+
SCHEMA_VERSION: Final = 1
|
|
20
|
+
|
|
21
|
+
# Default runtime endpoint name used in log group paths and console URLs.
|
|
22
|
+
DEFAULT_ENDPOINT_NAME: Final = "DEFAULT"
|
|
23
|
+
|
|
24
|
+
TELEMETRY_ENDPOINT: Final = "https://telemetry.agentcore.aws.dev"
|
|
25
|
+
|
|
26
|
+
# Base image for generated Python Dockerfiles.
|
|
27
|
+
PYTHON_BASE_IMAGE: Final = "public.ecr.aws/docker/library/python:3.12-slim-trixie"
|
|
28
|
+
|
|
29
|
+
# Command descriptions used in CLI help.
|
|
30
|
+
COMMAND_DESCRIPTIONS: Final[dict[str, str]] = {
|
|
31
|
+
"program": "Build and deploy Agentic AI applications on AgentCore",
|
|
32
|
+
"add": "Add resources to project config.",
|
|
33
|
+
"create": "Create a new AgentCore project",
|
|
34
|
+
"deploy": "Deploy project infrastructure to AWS via CDK.",
|
|
35
|
+
"dev": "Launch local dev server, or invoke an agent locally.",
|
|
36
|
+
"exec": "Open an interactive shell or run a one-shot command in a deployed agent container.",
|
|
37
|
+
"invoke": "Invoke a deployed agent endpoint.",
|
|
38
|
+
"logs": "Stream or search agent runtime logs.",
|
|
39
|
+
"package": "Package agent artifacts without deploying.",
|
|
40
|
+
"remove": "Remove resources from project config.",
|
|
41
|
+
"status": "Show deployed resource details and status.",
|
|
42
|
+
"traces": "View and download agent traces.",
|
|
43
|
+
"evals": "View saved eval and batch eval results from past runs.",
|
|
44
|
+
"feedback": "Send feedback about the AgentCore CLI to the team.",
|
|
45
|
+
"fetch": "Fetch access info for deployed resources.",
|
|
46
|
+
"pause": "Pause a deployed resource (online eval config, A/B test).",
|
|
47
|
+
"resume": "Resume a paused resource (online eval config, A/B test).",
|
|
48
|
+
"recommend": "Run optimization recommendations for system prompts and tool descriptions.",
|
|
49
|
+
"recommendations": "View recommendation history from past runs.",
|
|
50
|
+
"run": "Run evaluations, batch evaluations, or optimization recommendations.",
|
|
51
|
+
"stop": "Stop a running batch evaluation or A/B test.",
|
|
52
|
+
"import": "Import a runtime, memory, or starter toolkit into this project. [experimental]",
|
|
53
|
+
"telemetry": "Manage anonymous usage analytics preferences.",
|
|
54
|
+
"update": "Check for and install CLI updates",
|
|
55
|
+
"validate": "Validate agentcore/ config files.",
|
|
56
|
+
"config-bundle": "Manage configuration bundle versions and diffs.",
|
|
57
|
+
"archive": "Archive (delete) a batch evaluation or recommendation on the service and clear local history.",
|
|
58
|
+
"config": "Adjust global configuration settings such as telemetry opt-out status",
|
|
59
|
+
"export": "Export a harness to a Strands runtime agent.",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Color gating: ANSI codes only when both streams are TTYs (FORCE_COLOR / NO_COLOR override).
|
|
63
|
+
_STYLING_ENABLED: Final = bool(os.environ.get("FORCE_COLOR")) or (
|
|
64
|
+
not os.environ.get("NO_COLOR") and sys.stdout.isatty() and sys.stderr.isatty()
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _style(code: str) -> str:
|
|
69
|
+
return code if _STYLING_ENABLED else ""
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ANSI:
|
|
73
|
+
red: Final = _style("\x1b[31m")
|
|
74
|
+
green: Final = _style("\x1b[32m")
|
|
75
|
+
yellow: Final = _style("\x1b[33m")
|
|
76
|
+
cyan: Final = _style("\x1b[36m")
|
|
77
|
+
dim: Final = _style("\x1b[2m")
|
|
78
|
+
reset: Final = _style("\x1b[0m")
|
|
79
|
+
clear_line: Final = "\x1b[K"
|
|
80
|
+
enter_alt_screen: Final = "\x1b[?1049h\x1b[H"
|
|
81
|
+
exit_alt_screen: Final = "\x1b[?1049l"
|
|
82
|
+
show_cursor: Final = "\x1b[?25h"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
__all__ = [
|
|
86
|
+
"ANSI",
|
|
87
|
+
"CDK_APP_ENTRY",
|
|
88
|
+
"CDK_PROJECT_DIR",
|
|
89
|
+
"COMMAND_DESCRIPTIONS",
|
|
90
|
+
"DEFAULT_ENDPOINT_NAME",
|
|
91
|
+
"MAX_GATEWAY_NAME_LENGTH",
|
|
92
|
+
"MAX_RUNTIME_NAME_LENGTH",
|
|
93
|
+
"PYTHON_BASE_IMAGE",
|
|
94
|
+
"SCHEMA_VERSION",
|
|
95
|
+
"TELEMETRY_ENDPOINT",
|
|
96
|
+
]
|
agentcore/cli/errors.py
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Error classification helpers (port of src/cli/errors.ts).
|
|
2
|
+
|
|
3
|
+
Upstream inspects AWS SDK v3 errors via ``err.name`` / ``err.Code``. For botocore the
|
|
4
|
+
equivalent is ``ClientError.response["Error"]["Code"]``; ``_error_code`` covers both.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
EXPIRED_TOKEN_ERROR_CODES = frozenset(
|
|
10
|
+
{
|
|
11
|
+
"ExpiredToken",
|
|
12
|
+
"ExpiredTokenException",
|
|
13
|
+
"TokenRefreshRequired",
|
|
14
|
+
"CredentialsExpired",
|
|
15
|
+
"InvalidIdentityToken",
|
|
16
|
+
"UnauthorizedAccess",
|
|
17
|
+
# AccessDenied / AccessDeniedException are authorization errors, not expired tokens.
|
|
18
|
+
"InvalidClientTokenId",
|
|
19
|
+
"SignatureDoesNotMatch",
|
|
20
|
+
"RequestExpired",
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_error_message(err: Any) -> str:
|
|
26
|
+
return str(err)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _error_code(err: Any) -> str | None:
|
|
30
|
+
response = getattr(err, "response", None)
|
|
31
|
+
if isinstance(response, dict):
|
|
32
|
+
code = (response.get("Error") or {}).get("Code")
|
|
33
|
+
if isinstance(code, str):
|
|
34
|
+
return code
|
|
35
|
+
for attr in ("name", "Code", "code"):
|
|
36
|
+
value = getattr(err, attr, None)
|
|
37
|
+
if isinstance(value, str):
|
|
38
|
+
return value
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def is_access_denied_error(err: Any) -> bool:
|
|
43
|
+
return err is not None and _error_code(err) in ("AccessDeniedException", "AccessDenied")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def is_no_credentials_error(err: Any) -> bool:
|
|
47
|
+
if err is None:
|
|
48
|
+
return False
|
|
49
|
+
if type(err).__name__ in ("AwsCredentialsError", "NoCredentialsError"):
|
|
50
|
+
return True
|
|
51
|
+
message = get_error_message(err).lower()
|
|
52
|
+
return any(
|
|
53
|
+
p in message
|
|
54
|
+
for p in (
|
|
55
|
+
"no aws credentials",
|
|
56
|
+
"could not load credentials",
|
|
57
|
+
"credentials not found",
|
|
58
|
+
"unable to locate credentials",
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def is_expired_token_error(err: Any) -> bool:
|
|
64
|
+
if err is None:
|
|
65
|
+
return False
|
|
66
|
+
if _error_code(err) in EXPIRED_TOKEN_ERROR_CODES:
|
|
67
|
+
return True
|
|
68
|
+
if type(err).__name__ == "TokenRetrievalError": # botocore: SSO token expired
|
|
69
|
+
return True
|
|
70
|
+
cause = getattr(err, "__cause__", None)
|
|
71
|
+
if cause is not None: # upstream checks a wrapped error instead of the outer message
|
|
72
|
+
return is_expired_token_error(cause)
|
|
73
|
+
message = get_error_message(err).lower()
|
|
74
|
+
return any(
|
|
75
|
+
p in message
|
|
76
|
+
for p in (
|
|
77
|
+
"expired token",
|
|
78
|
+
"token has expired",
|
|
79
|
+
"credentials have expired",
|
|
80
|
+
"security token included in the request is expired",
|
|
81
|
+
"the security token included in the request is invalid",
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def is_quota_exceeded_error(err: Any) -> bool:
|
|
87
|
+
if err is None:
|
|
88
|
+
return False
|
|
89
|
+
if _error_code(err) in ("ServiceQuotaExceededException", "LimitExceededException", "TooManyRequestsException"):
|
|
90
|
+
return True
|
|
91
|
+
message = get_error_message(err).lower()
|
|
92
|
+
return any(p in message for p in ("quota exceeded", "limit exceeded", "too many", "maximum number", "maxmanagers"))
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def is_stack_in_progress_error(err: Any) -> bool:
|
|
96
|
+
message = get_error_message(err).lower()
|
|
97
|
+
return ("is in" in message and "state and cannot be updated" in message) or any(
|
|
98
|
+
p in message
|
|
99
|
+
for p in (
|
|
100
|
+
"update_in_progress",
|
|
101
|
+
"create_in_progress",
|
|
102
|
+
"delete_in_progress",
|
|
103
|
+
"rollback_in_progress",
|
|
104
|
+
"stack is currently being updated",
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def is_changeset_in_progress_error(err: Any) -> bool:
|
|
110
|
+
message = get_error_message(err).lower()
|
|
111
|
+
return any(
|
|
112
|
+
p in message
|
|
113
|
+
for p in (
|
|
114
|
+
"invalidchangesetstatus",
|
|
115
|
+
"changeset is currently in progress",
|
|
116
|
+
"an operation on this changeset is currently in progress",
|
|
117
|
+
)
|
|
118
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""External tool requirements: Node, uv, AWS CLI, container runtimes (port of ``src/cli/external-requirements``)."""
|
|
2
|
+
|
|
3
|
+
from agentcore.cli.external_requirements.checks import (
|
|
4
|
+
CheckSeverity,
|
|
5
|
+
CliToolCheck,
|
|
6
|
+
CliToolsCheckResult,
|
|
7
|
+
DependencyCheckResult,
|
|
8
|
+
NpmCacheCheckResult,
|
|
9
|
+
VersionCheckResult,
|
|
10
|
+
check_aws_cli_version,
|
|
11
|
+
check_create_dependencies,
|
|
12
|
+
check_dependency_versions,
|
|
13
|
+
check_node_version,
|
|
14
|
+
check_npm_cache_ownership,
|
|
15
|
+
check_uv_version,
|
|
16
|
+
format_npm_cache_error,
|
|
17
|
+
format_version_error,
|
|
18
|
+
get_aws_login_guidance,
|
|
19
|
+
requires_container_runtime,
|
|
20
|
+
requires_uv,
|
|
21
|
+
)
|
|
22
|
+
from agentcore.cli.external_requirements.detect import (
|
|
23
|
+
ContainerRuntimeInfo,
|
|
24
|
+
DetectionResult,
|
|
25
|
+
detect_container_runtime,
|
|
26
|
+
require_container_runtime,
|
|
27
|
+
)
|
|
28
|
+
from agentcore.cli.external_requirements.versions import (
|
|
29
|
+
AWS_CLI_MIN_VERSION,
|
|
30
|
+
NODE_MIN_VERSION,
|
|
31
|
+
SemVer,
|
|
32
|
+
compare_sem_ver,
|
|
33
|
+
format_sem_ver,
|
|
34
|
+
parse_sem_ver,
|
|
35
|
+
sem_ver_gte,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
__all__ = [
|
|
39
|
+
"AWS_CLI_MIN_VERSION",
|
|
40
|
+
"NODE_MIN_VERSION",
|
|
41
|
+
"CheckSeverity",
|
|
42
|
+
"CliToolCheck",
|
|
43
|
+
"CliToolsCheckResult",
|
|
44
|
+
"ContainerRuntimeInfo",
|
|
45
|
+
"DependencyCheckResult",
|
|
46
|
+
"DetectionResult",
|
|
47
|
+
"NpmCacheCheckResult",
|
|
48
|
+
"SemVer",
|
|
49
|
+
"VersionCheckResult",
|
|
50
|
+
"check_aws_cli_version",
|
|
51
|
+
"check_create_dependencies",
|
|
52
|
+
"check_dependency_versions",
|
|
53
|
+
"check_node_version",
|
|
54
|
+
"check_npm_cache_ownership",
|
|
55
|
+
"check_uv_version",
|
|
56
|
+
"compare_sem_ver",
|
|
57
|
+
"detect_container_runtime",
|
|
58
|
+
"format_npm_cache_error",
|
|
59
|
+
"format_sem_ver",
|
|
60
|
+
"format_version_error",
|
|
61
|
+
"get_aws_login_guidance",
|
|
62
|
+
"parse_sem_ver",
|
|
63
|
+
"require_container_runtime",
|
|
64
|
+
"requires_container_runtime",
|
|
65
|
+
"requires_uv",
|
|
66
|
+
"sem_ver_gte",
|
|
67
|
+
]
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"""External dependency version checks (port of ``external-requirements/checks.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import Any, Literal
|
|
9
|
+
|
|
10
|
+
from agentcore.cli.external_requirements import detect as _detect
|
|
11
|
+
from agentcore.cli.external_requirements.versions import (
|
|
12
|
+
AWS_CLI_MIN_VERSION,
|
|
13
|
+
NODE_MIN_VERSION,
|
|
14
|
+
format_sem_ver,
|
|
15
|
+
parse_sem_ver,
|
|
16
|
+
sem_ver_gte,
|
|
17
|
+
)
|
|
18
|
+
from agentcore.lib.utils.platform import is_windows
|
|
19
|
+
from agentcore.lib.utils.subprocess import check_subprocess, run_subprocess_capture
|
|
20
|
+
|
|
21
|
+
AWS_CLI_INSTALL_URL = "https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True)
|
|
25
|
+
class VersionCheckResult:
|
|
26
|
+
satisfied: bool
|
|
27
|
+
current: str | None
|
|
28
|
+
required: str
|
|
29
|
+
binary: str
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _parse_node_version(output: str) -> str | None:
|
|
33
|
+
match = re.search(r"v?(\d+\.\d+\.\d+)", output.strip())
|
|
34
|
+
return match.group(1) if match else None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _check_min_version(binary: str, args: list[str], parse, minimum) -> VersionCheckResult: # type: ignore[no-untyped-def]
|
|
38
|
+
required = format_sem_ver(minimum)
|
|
39
|
+
result = run_subprocess_capture(binary, args)
|
|
40
|
+
if result.code != 0:
|
|
41
|
+
return VersionCheckResult(False, None, required, binary)
|
|
42
|
+
version_str = parse(result.stdout)
|
|
43
|
+
if not version_str:
|
|
44
|
+
return VersionCheckResult(False, None, required, binary)
|
|
45
|
+
current = parse_sem_ver(version_str)
|
|
46
|
+
if current is None:
|
|
47
|
+
return VersionCheckResult(False, version_str, required, binary)
|
|
48
|
+
return VersionCheckResult(sem_ver_gte(current, minimum), version_str, required, binary)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def check_node_version() -> VersionCheckResult:
|
|
52
|
+
"""Node.js >= 18 (required for CDK synth)."""
|
|
53
|
+
return _check_min_version("node", ["--version"], _parse_node_version, NODE_MIN_VERSION)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def check_uv_version() -> VersionCheckResult:
|
|
57
|
+
"""uv available in PATH (any version)."""
|
|
58
|
+
result = run_subprocess_capture("uv", ["--version"])
|
|
59
|
+
if result.code != 0:
|
|
60
|
+
return VersionCheckResult(False, None, "any", "uv")
|
|
61
|
+
match = re.search(r"uv\s+(\d+\.\d+\.\d+)", result.stdout.strip())
|
|
62
|
+
return VersionCheckResult(True, match.group(1) if match else "unknown", "any", "uv")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _parse_aws_cli_version(output: str) -> str | None:
|
|
66
|
+
match = re.search(r"aws-cli/(\d+\.\d+\.\d+)", output.strip())
|
|
67
|
+
return match.group(1) if match else None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def check_aws_cli_version() -> VersionCheckResult:
|
|
71
|
+
"""AWS CLI >= 2.32.0 (required for `aws login`)."""
|
|
72
|
+
return _check_min_version("aws", ["--version"], _parse_aws_cli_version, AWS_CLI_MIN_VERSION)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
_aws_login_guidance: str | None = None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def get_aws_login_guidance() -> str:
|
|
79
|
+
"""Version-aware guidance for authenticating with AWS (cached for the process lifetime)."""
|
|
80
|
+
global _aws_login_guidance
|
|
81
|
+
if _aws_login_guidance:
|
|
82
|
+
return _aws_login_guidance
|
|
83
|
+
check = check_aws_cli_version()
|
|
84
|
+
minimum = format_sem_ver(AWS_CLI_MIN_VERSION)
|
|
85
|
+
if check.current is None:
|
|
86
|
+
_aws_login_guidance = f"Install AWS CLI (v{minimum}+) from {AWS_CLI_INSTALL_URL} and run: aws login"
|
|
87
|
+
elif not check.satisfied:
|
|
88
|
+
_aws_login_guidance = (
|
|
89
|
+
f"Update AWS CLI from v{check.current} to v{minimum}+ ({AWS_CLI_INSTALL_URL}) and run: aws login"
|
|
90
|
+
)
|
|
91
|
+
else:
|
|
92
|
+
_aws_login_guidance = "Run: aws login"
|
|
93
|
+
return _aws_login_guidance
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def reset_aws_login_guidance_cache() -> None:
|
|
97
|
+
"""Testing hook (upstream resets module state between tests)."""
|
|
98
|
+
global _aws_login_guidance
|
|
99
|
+
_aws_login_guidance = None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def format_version_error(result: VersionCheckResult) -> str:
|
|
103
|
+
if result.current is None:
|
|
104
|
+
if result.binary == "uv":
|
|
105
|
+
return "'uv' not found. Install from https://github.com/astral-sh/uv#installation"
|
|
106
|
+
return f"'{result.binary}' not found. Install {result.binary} >= {result.required}"
|
|
107
|
+
return f"{result.binary} {result.current} is below minimum required version {result.required}"
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass(frozen=True)
|
|
111
|
+
class NpmCacheCheckResult:
|
|
112
|
+
satisfied: bool
|
|
113
|
+
owner: str | None
|
|
114
|
+
cache_dir: str
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def check_npm_cache_ownership() -> NpmCacheCheckResult:
|
|
118
|
+
"""``~/.npm`` must be owned by the current user (a past `sudo npm install` breaks npm)."""
|
|
119
|
+
cache_dir = os.path.join(os.path.expanduser("~"), ".npm")
|
|
120
|
+
if is_windows or not hasattr(os, "getuid"):
|
|
121
|
+
return NpmCacheCheckResult(True, None, cache_dir)
|
|
122
|
+
try:
|
|
123
|
+
stats = os.stat(cache_dir)
|
|
124
|
+
except OSError:
|
|
125
|
+
return NpmCacheCheckResult(True, None, cache_dir)
|
|
126
|
+
if stats.st_uid != os.getuid():
|
|
127
|
+
owner_result = run_subprocess_capture("id", ["-un", str(stats.st_uid)])
|
|
128
|
+
owner = owner_result.stdout.strip() if owner_result.code == 0 else f"uid={stats.st_uid}"
|
|
129
|
+
return NpmCacheCheckResult(False, owner, cache_dir)
|
|
130
|
+
return NpmCacheCheckResult(True, None, cache_dir)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def format_npm_cache_error(result: NpmCacheCheckResult) -> str:
|
|
134
|
+
return (
|
|
135
|
+
f"npm cache directory ({result.cache_dir}) is owned by '{result.owner}' instead of the current user. "
|
|
136
|
+
"This was likely caused by a previous 'sudo npm install'. "
|
|
137
|
+
f"Fix: sudo chown -R $(whoami) {result.cache_dir}"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _runtimes(project_spec: Any) -> list[Any]:
|
|
142
|
+
return list(getattr(project_spec, "runtimes", None) or [])
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def requires_uv(project_spec: Any) -> bool:
|
|
146
|
+
"""Any Python CodeZip agent needs uv."""
|
|
147
|
+
return any(agent.build == "CodeZip" for agent in _runtimes(project_spec))
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def requires_container_runtime(project_spec: Any) -> bool:
|
|
151
|
+
return any(agent.build == "Container" for agent in _runtimes(project_spec))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@dataclass
|
|
155
|
+
class DependencyCheckResult:
|
|
156
|
+
passed: bool
|
|
157
|
+
node_check: VersionCheckResult
|
|
158
|
+
uv_check: VersionCheckResult | None
|
|
159
|
+
npm_cache_check: NpmCacheCheckResult
|
|
160
|
+
container_runtime_available: bool
|
|
161
|
+
errors: list[str] = field(default_factory=list)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def check_dependency_versions(project_spec: Any) -> DependencyCheckResult:
|
|
165
|
+
"""Node >= 18 always; uv when there are CodeZip agents; npm cache ownership; container runtime (warn)."""
|
|
166
|
+
errors: list[str] = []
|
|
167
|
+
node_check = check_node_version()
|
|
168
|
+
if not node_check.satisfied:
|
|
169
|
+
errors.append(format_version_error(node_check))
|
|
170
|
+
|
|
171
|
+
uv_check = None
|
|
172
|
+
if requires_uv(project_spec):
|
|
173
|
+
uv_check = check_uv_version()
|
|
174
|
+
if not uv_check.satisfied:
|
|
175
|
+
errors.append(format_version_error(uv_check))
|
|
176
|
+
|
|
177
|
+
npm_cache_check = check_npm_cache_ownership()
|
|
178
|
+
if not npm_cache_check.satisfied:
|
|
179
|
+
errors.append(format_npm_cache_error(npm_cache_check))
|
|
180
|
+
|
|
181
|
+
container_runtime_available = True
|
|
182
|
+
if requires_container_runtime(project_spec):
|
|
183
|
+
# Warning only: deploy still works via CodeBuild.
|
|
184
|
+
container_runtime_available = _detect.detect_container_runtime().runtime is not None
|
|
185
|
+
|
|
186
|
+
return DependencyCheckResult(
|
|
187
|
+
passed=not errors,
|
|
188
|
+
node_check=node_check,
|
|
189
|
+
uv_check=uv_check,
|
|
190
|
+
npm_cache_check=npm_cache_check,
|
|
191
|
+
container_runtime_available=container_runtime_available,
|
|
192
|
+
errors=errors,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
CheckSeverity = Literal["error", "warn"]
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@dataclass(frozen=True)
|
|
200
|
+
class CliToolCheck:
|
|
201
|
+
binary: str
|
|
202
|
+
severity: CheckSeverity
|
|
203
|
+
available: bool
|
|
204
|
+
install_hint: str | None = None
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass
|
|
208
|
+
class CliToolsCheckResult:
|
|
209
|
+
passed: bool
|
|
210
|
+
checks: list[CliToolCheck]
|
|
211
|
+
errors: list[str]
|
|
212
|
+
warnings: list[str]
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _check_binary_available(binary: str) -> bool:
|
|
216
|
+
strategies = [
|
|
217
|
+
lambda: check_subprocess("where", [binary]) if is_windows else check_subprocess("which", [binary]),
|
|
218
|
+
lambda: check_subprocess(binary, ["--version"]),
|
|
219
|
+
lambda: check_subprocess(binary, ["-v"]),
|
|
220
|
+
]
|
|
221
|
+
return any(strategy() for strategy in strategies)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def check_create_dependencies(language: str | None = None) -> CliToolsCheckResult:
|
|
225
|
+
"""CLI tools for `create`: uv (Python only, error), npm (error), aws (warn)."""
|
|
226
|
+
checks: list[CliToolCheck] = []
|
|
227
|
+
errors: list[str] = []
|
|
228
|
+
warnings: list[str] = []
|
|
229
|
+
|
|
230
|
+
if language == "Python":
|
|
231
|
+
uv_available = _check_binary_available("uv")
|
|
232
|
+
checks.append(
|
|
233
|
+
CliToolCheck("uv", "error", uv_available, "Install from https://github.com/astral-sh/uv#installation")
|
|
234
|
+
)
|
|
235
|
+
if not uv_available:
|
|
236
|
+
errors.append(
|
|
237
|
+
"'uv' is required for Python projects. Install from https://github.com/astral-sh/uv#installation"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
npm_available = _check_binary_available("npm")
|
|
241
|
+
checks.append(CliToolCheck("npm", "error", npm_available, "Install Node.js from https://nodejs.org/"))
|
|
242
|
+
if not npm_available:
|
|
243
|
+
errors.append("'npm' is required. Install Node.js from https://nodejs.org/")
|
|
244
|
+
|
|
245
|
+
if npm_available:
|
|
246
|
+
npm_cache_check = check_npm_cache_ownership()
|
|
247
|
+
if not npm_cache_check.satisfied:
|
|
248
|
+
errors.append(format_npm_cache_error(npm_cache_check))
|
|
249
|
+
|
|
250
|
+
aws_available = _check_binary_available("aws")
|
|
251
|
+
checks.append(CliToolCheck("aws", "warn", aws_available, "Install from https://aws.amazon.com/cli/"))
|
|
252
|
+
if not aws_available:
|
|
253
|
+
warnings.append(
|
|
254
|
+
f"'aws' CLI not found. Required for 'aws login'. Install v{format_sem_ver(AWS_CLI_MIN_VERSION)}+ "
|
|
255
|
+
f"from {AWS_CLI_INSTALL_URL}"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
return CliToolsCheckResult(passed=not errors, checks=checks, errors=errors, warnings=warnings)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
__all__ = [
|
|
262
|
+
"AWS_CLI_INSTALL_URL",
|
|
263
|
+
"CheckSeverity",
|
|
264
|
+
"CliToolCheck",
|
|
265
|
+
"CliToolsCheckResult",
|
|
266
|
+
"DependencyCheckResult",
|
|
267
|
+
"NpmCacheCheckResult",
|
|
268
|
+
"VersionCheckResult",
|
|
269
|
+
"check_aws_cli_version",
|
|
270
|
+
"check_create_dependencies",
|
|
271
|
+
"check_dependency_versions",
|
|
272
|
+
"check_node_version",
|
|
273
|
+
"check_npm_cache_ownership",
|
|
274
|
+
"check_uv_version",
|
|
275
|
+
"format_npm_cache_error",
|
|
276
|
+
"format_version_error",
|
|
277
|
+
"get_aws_login_guidance",
|
|
278
|
+
"requires_container_runtime",
|
|
279
|
+
"requires_uv",
|
|
280
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Container runtime detection (port of ``external-requirements/detect.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
from agentcore.lib.constants import CONTAINER_RUNTIMES, ContainerRuntime
|
|
9
|
+
from agentcore.lib.utils.platform import is_windows
|
|
10
|
+
from agentcore.lib.utils.subprocess import check_subprocess, run_subprocess_capture
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class ContainerRuntimeInfo:
|
|
15
|
+
runtime: ContainerRuntime
|
|
16
|
+
binary: str
|
|
17
|
+
version: str
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class DetectionResult:
|
|
22
|
+
runtime: ContainerRuntimeInfo | None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def detect_container_runtime() -> DetectionResult:
|
|
26
|
+
"""First installed runtime (docker, podman, finch) that can actually build containers."""
|
|
27
|
+
for runtime in CONTAINER_RUNTIMES:
|
|
28
|
+
exists = check_subprocess("where", [runtime]) if is_windows else check_subprocess("which", [runtime])
|
|
29
|
+
if not exists:
|
|
30
|
+
continue
|
|
31
|
+
result = run_subprocess_capture(runtime, ["--version"])
|
|
32
|
+
if result.code != 0:
|
|
33
|
+
continue
|
|
34
|
+
# Some shims answer --version but can't build; they may exit 0 on failure, so check stderr too.
|
|
35
|
+
build_check = run_subprocess_capture(runtime, ["build", "--help"])
|
|
36
|
+
if build_check.code != 0:
|
|
37
|
+
continue
|
|
38
|
+
if build_check.stderr and re.search(r"unknown command|not found", build_check.stderr, re.IGNORECASE):
|
|
39
|
+
continue
|
|
40
|
+
version = (result.stdout.strip().split("\n") or ["unknown"])[0] or "unknown"
|
|
41
|
+
return DetectionResult(ContainerRuntimeInfo(runtime=runtime, binary=runtime, version=version))
|
|
42
|
+
return DetectionResult(None)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def require_container_runtime() -> ContainerRuntimeInfo:
|
|
46
|
+
runtime = detect_container_runtime().runtime
|
|
47
|
+
if runtime is None:
|
|
48
|
+
raise RuntimeError(
|
|
49
|
+
"No container runtime found. Install Docker (https://docker.com), "
|
|
50
|
+
"Podman (https://podman.io), or Finch (https://runfinch.com)."
|
|
51
|
+
)
|
|
52
|
+
return runtime
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
__all__ = ["ContainerRuntimeInfo", "DetectionResult", "detect_container_runtime", "require_container_runtime"]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Semantic version parsing and comparison (port of ``external-requirements/versions.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True, order=True)
|
|
10
|
+
class SemVer:
|
|
11
|
+
major: int
|
|
12
|
+
minor: int
|
|
13
|
+
patch: int
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
_SEMVER_RE = re.compile(r"^(\d+)\.(\d+)\.(\d+)")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def parse_sem_ver(version: str) -> SemVer | None:
|
|
20
|
+
"""Parse ``"v18.0.0"`` / ``"18.0.0"`` / ``"0.9.2-beta"``; None when not semver-like."""
|
|
21
|
+
match = _SEMVER_RE.match(re.sub(r"^v", "", version))
|
|
22
|
+
if not match:
|
|
23
|
+
return None
|
|
24
|
+
return SemVer(int(match.group(1)), int(match.group(2)), int(match.group(3)))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def compare_sem_ver(a: SemVer, b: SemVer) -> int:
|
|
28
|
+
if a.major != b.major:
|
|
29
|
+
return a.major - b.major
|
|
30
|
+
if a.minor != b.minor:
|
|
31
|
+
return a.minor - b.minor
|
|
32
|
+
return a.patch - b.patch
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def sem_ver_gte(a: SemVer, b: SemVer) -> bool:
|
|
36
|
+
return compare_sem_ver(a, b) >= 0
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def format_sem_ver(v: SemVer) -> str:
|
|
40
|
+
return f"{v.major}.{v.minor}.{v.patch}"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# Minimum Node.js version required for CDK synth (ES2022 target).
|
|
44
|
+
NODE_MIN_VERSION = SemVer(18, 0, 0)
|
|
45
|
+
|
|
46
|
+
# Minimum AWS CLI version required for `aws login`.
|
|
47
|
+
AWS_CLI_MIN_VERSION = SemVer(2, 32, 0)
|
|
48
|
+
|
|
49
|
+
__all__ = [
|
|
50
|
+
"AWS_CLI_MIN_VERSION",
|
|
51
|
+
"NODE_MIN_VERSION",
|
|
52
|
+
"SemVer",
|
|
53
|
+
"compare_sem_ver",
|
|
54
|
+
"format_sem_ver",
|
|
55
|
+
"parse_sem_ver",
|
|
56
|
+
"sem_ver_gte",
|
|
57
|
+
]
|