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,107 @@
|
|
|
1
|
+
"""Poll CloudFormation stack events for deploy progress.
|
|
2
|
+
|
|
3
|
+
Upstream receives resource-level progress from ``@aws-cdk/toolkit-lib``'s stack activity monitor
|
|
4
|
+
(``CDK_TOOLKIT_I5502`` messages). The Python port drives the ``cdk`` CLI as a subprocess, so it
|
|
5
|
+
reproduces that stream by polling ``DescribeStackEvents`` while the deploy runs.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from datetime import UTC, datetime
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from agentcore.aws.account import create_aws_client
|
|
15
|
+
from agentcore.cloudformation.types import is_failure_event
|
|
16
|
+
|
|
17
|
+
# Clock skew allowance when deciding whether an event belongs to the current operation.
|
|
18
|
+
_SKEW_SECONDS = 5
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def format_event_time(ts: datetime) -> str:
|
|
22
|
+
"""``Date#toLocaleTimeString()`` in en-US form (``3:04:05 PM``)."""
|
|
23
|
+
local = ts.astimezone()
|
|
24
|
+
hour = local.hour % 12 or 12
|
|
25
|
+
return f"{hour}:{local.minute:02d}:{local.second:02d} {'AM' if local.hour < 12 else 'PM'}"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def format_stack_event(stack_name: str, event: dict[str, Any], completed: int, total: int) -> str:
|
|
29
|
+
"""One activity line shaped like CDK's: ``Stack | 3/12 | 3:04:05 PM | STATUS | Type | LogicalId``."""
|
|
30
|
+
ts = event.get("Timestamp")
|
|
31
|
+
time_text = format_event_time(ts) if isinstance(ts, datetime) else ""
|
|
32
|
+
status = event.get("ResourceStatus") or ""
|
|
33
|
+
line = (
|
|
34
|
+
f"{stack_name} | {completed}/{total} | {time_text} | {status:<20} | "
|
|
35
|
+
f"{event.get('ResourceType') or ''} | {event.get('LogicalResourceId') or ''}"
|
|
36
|
+
)
|
|
37
|
+
reason = event.get("ResourceStatusReason")
|
|
38
|
+
if reason and is_failure_event(event):
|
|
39
|
+
line += f" {reason}"
|
|
40
|
+
return line
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class StackEventPoller:
|
|
45
|
+
"""Incrementally fetch new events for one stack, oldest first, starting at ``since``."""
|
|
46
|
+
|
|
47
|
+
region: str
|
|
48
|
+
stack_name: str
|
|
49
|
+
since: datetime = field(default_factory=lambda: datetime.now(UTC))
|
|
50
|
+
seen: set[str] = field(default_factory=set)
|
|
51
|
+
failures: list[dict[str, Any]] = field(default_factory=list)
|
|
52
|
+
_client: Any = None
|
|
53
|
+
|
|
54
|
+
def _cfn(self) -> Any:
|
|
55
|
+
if self._client is None:
|
|
56
|
+
self._client = create_aws_client("cloudformation", self.region)
|
|
57
|
+
return self._client
|
|
58
|
+
|
|
59
|
+
def poll(self) -> list[dict[str, Any]]:
|
|
60
|
+
"""New events since the last poll (best effort: a missing stack or API error yields ``[]``)."""
|
|
61
|
+
fresh: list[dict[str, Any]] = []
|
|
62
|
+
token: str | None = None
|
|
63
|
+
try:
|
|
64
|
+
while True:
|
|
65
|
+
params: dict[str, Any] = {"StackName": self.stack_name}
|
|
66
|
+
if token:
|
|
67
|
+
params["NextToken"] = token
|
|
68
|
+
response = self._cfn().describe_stack_events(**params)
|
|
69
|
+
stop = False
|
|
70
|
+
for event in response.get("StackEvents") or []: # newest first
|
|
71
|
+
event_id = event.get("EventId")
|
|
72
|
+
ts = event.get("Timestamp")
|
|
73
|
+
if isinstance(ts, datetime):
|
|
74
|
+
aware = ts if ts.tzinfo else ts.replace(tzinfo=UTC)
|
|
75
|
+
if (self.since - aware).total_seconds() > _SKEW_SECONDS:
|
|
76
|
+
stop = True
|
|
77
|
+
break
|
|
78
|
+
if not event_id or event_id in self.seen:
|
|
79
|
+
stop = True
|
|
80
|
+
break
|
|
81
|
+
fresh.append(event)
|
|
82
|
+
token = response.get("NextToken")
|
|
83
|
+
if stop or not token:
|
|
84
|
+
break
|
|
85
|
+
except Exception: # noqa: BLE001 - progress is best-effort (ValidationError: stack not created yet)
|
|
86
|
+
return []
|
|
87
|
+
fresh.reverse()
|
|
88
|
+
for event in fresh:
|
|
89
|
+
self.seen.add(event["EventId"])
|
|
90
|
+
if is_failure_event(event):
|
|
91
|
+
self.failures.append(event)
|
|
92
|
+
return fresh
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def describe_failures(failures: list[dict[str, Any]]) -> str:
|
|
96
|
+
"""Human summary of failed resource events (empty string when none)."""
|
|
97
|
+
lines = []
|
|
98
|
+
for event in failures:
|
|
99
|
+
reason = event.get("ResourceStatusReason") or "(no reason given)"
|
|
100
|
+
lines.append(
|
|
101
|
+
f" {event.get('LogicalResourceId') or '?'} ({event.get('ResourceType') or '?'}) "
|
|
102
|
+
f"{event.get('ResourceStatus') or ''}: {reason}"
|
|
103
|
+
)
|
|
104
|
+
return "\n".join(lines)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
__all__ = ["StackEventPoller", "describe_failures", "format_event_time", "format_stack_event"]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""Stack deployability checks (port of ``cloudformation/stack-status.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from agentcore.aws._aws_errors import aws_error_name
|
|
8
|
+
from agentcore.aws.account import create_aws_client
|
|
9
|
+
|
|
10
|
+
# Transitional states: the stack can't be updated until the current operation completes.
|
|
11
|
+
IN_PROGRESS_STATUSES = frozenset(
|
|
12
|
+
{
|
|
13
|
+
"CREATE_IN_PROGRESS",
|
|
14
|
+
"UPDATE_IN_PROGRESS",
|
|
15
|
+
"DELETE_IN_PROGRESS",
|
|
16
|
+
"ROLLBACK_IN_PROGRESS",
|
|
17
|
+
"UPDATE_ROLLBACK_IN_PROGRESS",
|
|
18
|
+
"UPDATE_COMPLETE_CLEANUP_IN_PROGRESS",
|
|
19
|
+
"DELETE_COMPLETE_CLEANUP_IN_PROGRESS",
|
|
20
|
+
"REVIEW_IN_PROGRESS",
|
|
21
|
+
"IMPORT_IN_PROGRESS",
|
|
22
|
+
"IMPORT_ROLLBACK_IN_PROGRESS",
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
# Failed states that may require manual intervention.
|
|
27
|
+
FAILED_STATUSES = frozenset(
|
|
28
|
+
{"CREATE_FAILED", "ROLLBACK_FAILED", "DELETE_FAILED", "UPDATE_ROLLBACK_FAILED", "IMPORT_ROLLBACK_FAILED"}
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class StackStatusResult:
|
|
34
|
+
can_deploy: bool
|
|
35
|
+
exists: bool
|
|
36
|
+
status: str | None = None
|
|
37
|
+
message: str | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True)
|
|
41
|
+
class BlockingStack:
|
|
42
|
+
stack_name: str
|
|
43
|
+
result: StackStatusResult
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def check_stack_status(region: str, stack_name: str) -> StackStatusResult:
|
|
47
|
+
"""Whether ``stack_name`` can be deployed to (missing or stable stacks can)."""
|
|
48
|
+
cfn = create_aws_client("cloudformation", region)
|
|
49
|
+
try:
|
|
50
|
+
resp = cfn.describe_stacks(StackName=stack_name)
|
|
51
|
+
except Exception as exc:
|
|
52
|
+
# Stack doesn't exist - safe to deploy (will create new stack)
|
|
53
|
+
if aws_error_name(exc) == "ValidationError":
|
|
54
|
+
return StackStatusResult(can_deploy=True, exists=False)
|
|
55
|
+
raise
|
|
56
|
+
|
|
57
|
+
stacks = resp.get("Stacks") or []
|
|
58
|
+
status = stacks[0].get("StackStatus") if stacks else None
|
|
59
|
+
if not status:
|
|
60
|
+
return StackStatusResult(can_deploy=True, exists=True)
|
|
61
|
+
|
|
62
|
+
if status in IN_PROGRESS_STATUSES:
|
|
63
|
+
return StackStatusResult(
|
|
64
|
+
can_deploy=False,
|
|
65
|
+
exists=True,
|
|
66
|
+
status=status,
|
|
67
|
+
message=(
|
|
68
|
+
f'Stack "{stack_name}" is currently in {status} state. '
|
|
69
|
+
"Please wait for the operation to complete before deploying."
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
if status in FAILED_STATUSES:
|
|
73
|
+
return StackStatusResult(
|
|
74
|
+
can_deploy=False,
|
|
75
|
+
exists=True,
|
|
76
|
+
status=status,
|
|
77
|
+
message=f'Stack "{stack_name}" is in {status} state. Manual intervention may be required before deploying.',
|
|
78
|
+
)
|
|
79
|
+
return StackStatusResult(can_deploy=True, exists=True, status=status)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def check_stacks_status(region: str, stack_names: list[str]) -> BlockingStack | None:
|
|
83
|
+
"""The first stack that blocks deployment, or None when all are deployable."""
|
|
84
|
+
for stack_name in stack_names:
|
|
85
|
+
result = check_stack_status(region, stack_name)
|
|
86
|
+
if not result.can_deploy:
|
|
87
|
+
return BlockingStack(stack_name=stack_name, result=result)
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
__all__ = [
|
|
92
|
+
"FAILED_STATUSES",
|
|
93
|
+
"IN_PROGRESS_STATUSES",
|
|
94
|
+
"BlockingStack",
|
|
95
|
+
"StackStatusResult",
|
|
96
|
+
"check_stack_status",
|
|
97
|
+
"check_stacks_status",
|
|
98
|
+
]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Stack status helpers shared by progress rendering (port of ``cloudformation/types.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
TERMINAL_STACK_STATUSES = frozenset(
|
|
8
|
+
{
|
|
9
|
+
"CREATE_COMPLETE",
|
|
10
|
+
"UPDATE_COMPLETE",
|
|
11
|
+
"UPDATE_ROLLBACK_COMPLETE",
|
|
12
|
+
"ROLLBACK_COMPLETE",
|
|
13
|
+
"CREATE_FAILED",
|
|
14
|
+
"DELETE_FAILED",
|
|
15
|
+
"DELETE_COMPLETE",
|
|
16
|
+
"UPDATE_ROLLBACK_FAILED",
|
|
17
|
+
"ROLLBACK_FAILED",
|
|
18
|
+
"IMPORT_COMPLETE",
|
|
19
|
+
"IMPORT_ROLLBACK_COMPLETE",
|
|
20
|
+
"IMPORT_ROLLBACK_FAILED",
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def failure_like(status: str | None) -> bool:
|
|
26
|
+
"""Port of ``FAILURE_LIKE``."""
|
|
27
|
+
return bool(status) and (status.endswith("_FAILED") or "ROLLBACK" in status or status == "DELETE_FAILED")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_status_color(status: str) -> Literal["green", "red", "yellow", "white"]:
|
|
31
|
+
if "COMPLETE" in status and "ROLLBACK" not in status:
|
|
32
|
+
return "green"
|
|
33
|
+
if "FAILED" in status or "ROLLBACK" in status:
|
|
34
|
+
return "red"
|
|
35
|
+
if "PROGRESS" in status:
|
|
36
|
+
return "yellow"
|
|
37
|
+
return "white"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def is_failure_event(event: dict[str, Any]) -> bool:
|
|
41
|
+
return (event.get("ResourceStatus") or "").endswith("FAILED")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
__all__ = ["TERMINAL_STACK_STATUSES", "failure_like", "get_status_color", "is_failure_event"]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Shared library layer (port of upstream ``src/lib``).
|
|
2
|
+
|
|
3
|
+
Schema models are not re-exported here (upstream re-exports ``src/schema``); import them from
|
|
4
|
+
``agentcore.schema``.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from agentcore.lib.constants import (
|
|
8
|
+
APP_DIR,
|
|
9
|
+
CLI_LOGS_DIR,
|
|
10
|
+
CLI_SYSTEM_DIR,
|
|
11
|
+
CONFIG_DIR,
|
|
12
|
+
CONFIG_FILES,
|
|
13
|
+
CONTAINER_INTERNAL_PORT,
|
|
14
|
+
CONTAINER_RUNTIMES,
|
|
15
|
+
DEFAULT_PYTHON_PLATFORM,
|
|
16
|
+
DOCKERFILE_NAME,
|
|
17
|
+
ENV_FILE,
|
|
18
|
+
MCP_APP_SUBDIR,
|
|
19
|
+
ONE_GB,
|
|
20
|
+
UV_INSTALL_HINT,
|
|
21
|
+
ContainerRuntime,
|
|
22
|
+
get_artifact_zip_name,
|
|
23
|
+
get_dockerfile_path,
|
|
24
|
+
)
|
|
25
|
+
from agentcore.lib.errors import * # noqa: F403
|
|
26
|
+
from agentcore.lib.errors import __all__ as _errors_all
|
|
27
|
+
from agentcore.lib.packaging import * # noqa: F403
|
|
28
|
+
from agentcore.lib.packaging import __all__ as _packaging_all
|
|
29
|
+
from agentcore.lib.result import Err, Ok, Result, err, ok, serialize_result, unwrap_result
|
|
30
|
+
from agentcore.lib.schemas.io import * # noqa: F403
|
|
31
|
+
from agentcore.lib.schemas.io import __all__ as _io_all
|
|
32
|
+
from agentcore.lib.time_constants import ONE_DAY_MS, ONE_HOUR_MS, ONE_MINUTE_MS, ONE_SECOND_MS
|
|
33
|
+
from agentcore.lib.utils import * # noqa: F403
|
|
34
|
+
from agentcore.lib.utils import __all__ as _utils_all
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"APP_DIR",
|
|
38
|
+
"CLI_LOGS_DIR",
|
|
39
|
+
"CLI_SYSTEM_DIR",
|
|
40
|
+
"CONFIG_DIR",
|
|
41
|
+
"CONFIG_FILES",
|
|
42
|
+
"CONTAINER_INTERNAL_PORT",
|
|
43
|
+
"CONTAINER_RUNTIMES",
|
|
44
|
+
"DEFAULT_PYTHON_PLATFORM",
|
|
45
|
+
"DOCKERFILE_NAME",
|
|
46
|
+
"ENV_FILE",
|
|
47
|
+
"MCP_APP_SUBDIR",
|
|
48
|
+
"ONE_DAY_MS",
|
|
49
|
+
"ONE_GB",
|
|
50
|
+
"ONE_HOUR_MS",
|
|
51
|
+
"ONE_MINUTE_MS",
|
|
52
|
+
"ONE_SECOND_MS",
|
|
53
|
+
"UV_INSTALL_HINT",
|
|
54
|
+
"ContainerRuntime",
|
|
55
|
+
"Err",
|
|
56
|
+
"Ok",
|
|
57
|
+
"Result",
|
|
58
|
+
"err",
|
|
59
|
+
"get_artifact_zip_name",
|
|
60
|
+
"get_dockerfile_path",
|
|
61
|
+
"ok",
|
|
62
|
+
"serialize_result",
|
|
63
|
+
"unwrap_result",
|
|
64
|
+
*_errors_all,
|
|
65
|
+
*_packaging_all,
|
|
66
|
+
*_io_all,
|
|
67
|
+
*_utils_all,
|
|
68
|
+
]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Shared constants (port of ``src/lib/constants.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
from typing import Final, Literal
|
|
8
|
+
|
|
9
|
+
# Configuration directory and file names
|
|
10
|
+
CONFIG_DIR: Final = "agentcore"
|
|
11
|
+
|
|
12
|
+
# Application code directory (for generated agents and MCP tools)
|
|
13
|
+
APP_DIR: Final = "app"
|
|
14
|
+
MCP_APP_SUBDIR: Final = "mcp"
|
|
15
|
+
|
|
16
|
+
HARNESS_DIR: Final = "harnesses"
|
|
17
|
+
|
|
18
|
+
# CLI system subdirectory (inside CONFIG_DIR)
|
|
19
|
+
CLI_SYSTEM_DIR: Final = ".cli"
|
|
20
|
+
CLI_LOGS_DIR: Final = "logs"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CONFIG_FILES: # noqa: N801 - mirrors the upstream constant object
|
|
24
|
+
AGENT_ENV: Final = "agentcore.json"
|
|
25
|
+
AWS_TARGETS: Final = "aws-targets.json"
|
|
26
|
+
DEPLOYED_STATE: Final = "deployed-state.json"
|
|
27
|
+
MCP_DEFS: Final = "mcp-defs.json"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Environment file for secrets (API keys, etc.) - local only, not committed
|
|
31
|
+
ENV_FILE: Final = ".env.local"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_artifact_zip_name(name: str) -> str:
|
|
35
|
+
return f"{name}.zip"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
UV_INSTALL_HINT: Final = "Install uv from https://github.com/astral-sh/uv#installation and ensure it is on your PATH."
|
|
39
|
+
NPM_INSTALL_HINT: Final = "Install npm from https://nodejs.org/ and ensure it is on your PATH."
|
|
40
|
+
DEFAULT_PYTHON_PLATFORM: Final = "aarch64-manylinux2014"
|
|
41
|
+
|
|
42
|
+
# Container constants
|
|
43
|
+
ONE_GB: Final = 1024 * 1024 * 1024
|
|
44
|
+
DOCKERFILE_NAME: Final = "Dockerfile"
|
|
45
|
+
CONTAINER_INTERNAL_PORT: Final = 8080
|
|
46
|
+
|
|
47
|
+
ContainerRuntime = Literal["docker", "podman", "finch"]
|
|
48
|
+
# Supported container runtimes in order of preference.
|
|
49
|
+
CONTAINER_RUNTIMES: Final[tuple[ContainerRuntime, ...]] = ("docker", "podman", "finch")
|
|
50
|
+
|
|
51
|
+
_DOCKERFILE_PATH_ALLOWED_CHARS = re.compile(r"[A-Za-z0-9._/-]+")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_valid_dockerfile_path(p: str) -> bool:
|
|
55
|
+
"""Same rule as the schema's ``isValidDockerfilePath``: a safe relative path in the build context."""
|
|
56
|
+
try:
|
|
57
|
+
from agentcore.schema import is_valid_dockerfile_path as schema_check # type: ignore[attr-defined]
|
|
58
|
+
except Exception: # schema package absent or not importable
|
|
59
|
+
schema_check = None
|
|
60
|
+
if schema_check is not None:
|
|
61
|
+
return bool(schema_check(p))
|
|
62
|
+
if not _DOCKERFILE_PATH_ALLOWED_CHARS.fullmatch(p):
|
|
63
|
+
return False
|
|
64
|
+
if p.startswith("/"):
|
|
65
|
+
return False
|
|
66
|
+
return not any(segment in ("", "..") for segment in p.split("/"))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def get_dockerfile_path(build_context: str, dockerfile: str | None = None) -> str:
|
|
70
|
+
"""Resolve the Dockerfile path against the Docker build context, rejecting escapes."""
|
|
71
|
+
name = dockerfile if dockerfile is not None else DOCKERFILE_NAME
|
|
72
|
+
if not is_valid_dockerfile_path(name):
|
|
73
|
+
raise ValueError(
|
|
74
|
+
f'Invalid dockerfile path "{name}": must be a relative path within the build context (a filename or '
|
|
75
|
+
'forward-slash subpath; no leading slash, backslash, empty segments, or ".." traversal)'
|
|
76
|
+
)
|
|
77
|
+
return os.path.join(build_context, name)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from agentcore.lib.dependency_management.plan import SkewFinding, SyncPlan, compute_sync_plan
|
|
2
|
+
from agentcore.lib.dependency_management.sync import sync_managed_dependencies
|
|
3
|
+
from agentcore.lib.dependency_management.types import (
|
|
4
|
+
DependencyChange,
|
|
5
|
+
DependencySyncOutcome,
|
|
6
|
+
DependencySyncResult,
|
|
7
|
+
PackageManifest,
|
|
8
|
+
RestoredDependency,
|
|
9
|
+
SkippedDependency,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"DependencyChange",
|
|
14
|
+
"DependencySyncOutcome",
|
|
15
|
+
"DependencySyncResult",
|
|
16
|
+
"PackageManifest",
|
|
17
|
+
"RestoredDependency",
|
|
18
|
+
"SkewFinding",
|
|
19
|
+
"SkippedDependency",
|
|
20
|
+
"SyncPlan",
|
|
21
|
+
"compute_sync_plan",
|
|
22
|
+
"sync_managed_dependencies",
|
|
23
|
+
]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""User-facing wording for dependency management (port of ``messages.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
from agentcore.lib.dependency_management.plan import SkewFinding
|
|
8
|
+
from agentcore.lib.dependency_management.types import DependencyChange, RestoredDependency, SkippedDependency
|
|
9
|
+
|
|
10
|
+
# Fallback when the CLI layer doesn't pass its distro-aware install command.
|
|
11
|
+
DEFAULT_CLI_INSTALL_COMMAND = "npm install -g @aws/agentcore@latest"
|
|
12
|
+
|
|
13
|
+
OPT_OUT_HINT = "To manage these versions yourself: agentcore config disableDependencyManagement true"
|
|
14
|
+
|
|
15
|
+
_MIGRATION_PREAMBLE = (
|
|
16
|
+
"Your project was created before the AgentCore CLI managed dependency versions.\n"
|
|
17
|
+
"We've updated agentcore/cdk/package.json so the CLI keeps these dependencies\n"
|
|
18
|
+
"on versions it has been tested with (patch updates still apply automatically):"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Check-mode variant: nothing was written, so promise rather than claim.
|
|
22
|
+
_MIGRATION_PREAMBLE_PENDING = (
|
|
23
|
+
"Your project was created before the AgentCore CLI managed dependency versions.\n"
|
|
24
|
+
"agentcore/cdk/package.json will be updated on the next deploy so the CLI keeps these\n"
|
|
25
|
+
"dependencies on versions it has been tested with (patch updates still apply automatically):"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _format_skew_list(skew: Sequence[SkewFinding]) -> str:
|
|
30
|
+
return ", ".join(f"{s.name} ({s.declared}, CLI expects {s.expected})" for s in skew)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def format_cli_upgrade_error(skew: Sequence[SkewFinding], install_command: str) -> str:
|
|
34
|
+
plural = len(skew) > 1
|
|
35
|
+
return (
|
|
36
|
+
f"This project requires a newer version of the AgentCore CLI: {_format_skew_list(skew)} "
|
|
37
|
+
f"{'are' if plural else 'is'} newer than this CLI was tested with. "
|
|
38
|
+
f"Run `{install_command}` and retry.\n"
|
|
39
|
+
f"If you intentionally updated {'these dependencies' if plural else 'this dependency'} yourself, "
|
|
40
|
+
"you can disable managed dependency versions instead:\n" + OPT_OUT_HINT
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _format_change_table(changes: Sequence[DependencyChange], restored: Sequence[RestoredDependency]) -> str:
|
|
45
|
+
rows = [(c.name, c.from_, c.to) for c in changes] + [(r.name, "(removed)", r.to) for r in restored]
|
|
46
|
+
name_width = max(len(r[0]) for r in rows)
|
|
47
|
+
from_width = max(len(r[1]) for r in rows)
|
|
48
|
+
return "\n".join(f" {name.ljust(name_width)} {frm.ljust(from_width)} → {to}" for name, frm, to in rows)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def format_sync_notice(
|
|
52
|
+
*,
|
|
53
|
+
migrated_from_caret: bool,
|
|
54
|
+
changes: Sequence[DependencyChange],
|
|
55
|
+
restored: Sequence[RestoredDependency],
|
|
56
|
+
reinstalled: bool,
|
|
57
|
+
applied: bool,
|
|
58
|
+
) -> str | None:
|
|
59
|
+
"""Notice summarising managed-dependency updates; ``applied=False`` (check mode) uses future tense."""
|
|
60
|
+
if not changes and not restored:
|
|
61
|
+
return None
|
|
62
|
+
lines: list[str] = []
|
|
63
|
+
if migrated_from_caret:
|
|
64
|
+
lines.append(_MIGRATION_PREAMBLE if applied else _MIGRATION_PREAMBLE_PENDING)
|
|
65
|
+
else:
|
|
66
|
+
lines.append(
|
|
67
|
+
"Updated managed dependencies in agentcore/cdk/package.json:"
|
|
68
|
+
if applied
|
|
69
|
+
else "Managed dependencies in agentcore/cdk/package.json will be updated on the next deploy:"
|
|
70
|
+
)
|
|
71
|
+
lines += ["", _format_change_table(changes, restored), ""]
|
|
72
|
+
if reinstalled:
|
|
73
|
+
lines.append("Ran npm install in agentcore/cdk to apply the updates.")
|
|
74
|
+
lines.append(
|
|
75
|
+
"Dependencies you added yourself were not changed."
|
|
76
|
+
if applied
|
|
77
|
+
else "Dependencies you added yourself will not be changed."
|
|
78
|
+
)
|
|
79
|
+
if migrated_from_caret:
|
|
80
|
+
lines.append(OPT_OUT_HINT)
|
|
81
|
+
return "\n".join(lines)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def format_skew_warning(skew: Sequence[SkewFinding], install_command: str) -> str:
|
|
85
|
+
return (
|
|
86
|
+
f"{_format_skew_list(skew)} {'is' if len(skew) == 1 else 'are'} newer than this CLI was tested with; "
|
|
87
|
+
f"deploy may fail — upgrade the CLI with `{install_command}`. {OPT_OUT_HINT}"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def format_skipped_warning(skipped: SkippedDependency) -> str:
|
|
92
|
+
return f"{skipped.name} ({skipped.raw}) {skipped.reason}."
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""Pure managed-dependency sync policy (port of ``plan.ts``). No I/O.
|
|
2
|
+
|
|
3
|
+
A dependency is managed iff it is named in the vended manifest; its vended specifier is
|
|
4
|
+
authoritative and copied verbatim.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from agentcore.lib.dependency_management.semver import ParsedSpecifier, compare, parse_specifier
|
|
14
|
+
from agentcore.lib.dependency_management.types import (
|
|
15
|
+
DependencyChange,
|
|
16
|
+
DependencySection,
|
|
17
|
+
RestoredDependency,
|
|
18
|
+
SkippedDependency,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
_SECTIONS: tuple[DependencySection, ...] = ("dependencies", "devDependencies")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True, slots=True)
|
|
25
|
+
class SkewFinding:
|
|
26
|
+
name: str
|
|
27
|
+
declared: str
|
|
28
|
+
expected: str
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(slots=True)
|
|
32
|
+
class SyncPlan:
|
|
33
|
+
# Managed deps where the project declares a newer minor/major than the CLI expects.
|
|
34
|
+
skew: list[SkewFinding] = field(default_factory=list)
|
|
35
|
+
changes: list[DependencyChange] = field(default_factory=list)
|
|
36
|
+
restored: list[RestoredDependency] = field(default_factory=list)
|
|
37
|
+
skipped: list[SkippedDependency] = field(default_factory=list)
|
|
38
|
+
# Any managed dep had a caret range: the project predates pinning.
|
|
39
|
+
migrated_from_caret: bool = False
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _find_declared(manifest: Mapping[str, Any], name: str) -> tuple[DependencySection, str] | None:
|
|
43
|
+
for section in _SECTIONS:
|
|
44
|
+
deps = manifest.get(section) or {}
|
|
45
|
+
if name in deps and deps[name] is not None:
|
|
46
|
+
return section, deps[name]
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _is_skewed(declared: ParsedSpecifier, expected: ParsedSpecifier) -> bool:
|
|
51
|
+
"""Declared is ahead in a way patch-floating can't explain: higher major.minor for ranges, or
|
|
52
|
+
any prerelease-aware greater-than for exact pins (so alpha.20 never drops to alpha.19)."""
|
|
53
|
+
if declared.version is None or expected.version is None:
|
|
54
|
+
return False
|
|
55
|
+
d, e = declared.version, expected.version
|
|
56
|
+
if expected.kind == "exact":
|
|
57
|
+
return compare(d, e) > 0
|
|
58
|
+
if d.major != e.major:
|
|
59
|
+
return d.major > e.major
|
|
60
|
+
return d.minor > e.minor
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def compute_sync_plan(vended: Mapping[str, Any], project: Mapping[str, Any]) -> SyncPlan:
|
|
64
|
+
plan = SyncPlan()
|
|
65
|
+
for section in _SECTIONS:
|
|
66
|
+
for name, expected_raw in (vended.get(section) or {}).items():
|
|
67
|
+
expected = parse_specifier(expected_raw)
|
|
68
|
+
declared = _find_declared(project, name)
|
|
69
|
+
|
|
70
|
+
if declared is None:
|
|
71
|
+
# Deleted by the user; the vended CDK app can't build without it.
|
|
72
|
+
plan.restored.append(RestoredDependency(name=name, section=section, to=expected_raw))
|
|
73
|
+
continue
|
|
74
|
+
|
|
75
|
+
declared_section, declared_raw = declared
|
|
76
|
+
if declared_raw == expected_raw:
|
|
77
|
+
continue
|
|
78
|
+
|
|
79
|
+
declared_spec = parse_specifier(declared_raw)
|
|
80
|
+
if declared_spec.kind == "unsupported":
|
|
81
|
+
# file:/git:/tag/range specifiers are deliberate local overrides.
|
|
82
|
+
plan.skipped.append(
|
|
83
|
+
SkippedDependency(
|
|
84
|
+
name=name, raw=declared_raw, reason="uses a non-semver specifier and was left unmanaged"
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
if _is_skewed(declared_spec, expected):
|
|
90
|
+
plan.skew.append(SkewFinding(name=name, declared=declared_raw, expected=expected_raw))
|
|
91
|
+
continue
|
|
92
|
+
|
|
93
|
+
if declared_spec.kind == "caret":
|
|
94
|
+
plan.migrated_from_caret = True
|
|
95
|
+
plan.changes.append(
|
|
96
|
+
DependencyChange(name=name, section=declared_section, from_=declared_raw, to=expected_raw)
|
|
97
|
+
)
|
|
98
|
+
return plan
|