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,121 @@
|
|
|
1
|
+
"""Human-readable formatting of schema validation issues (port of ``src/lib/errors/zod.ts``).
|
|
2
|
+
|
|
3
|
+
Upstream formats Zod issues; here the input is Pydantic's ``ValidationError.errors()`` (or
|
|
4
|
+
issue dicts of the same shape: ``type``, ``loc``, ``msg``, optional ``input`` / ``ctx``). The
|
|
5
|
+
output format (`` - path: message`` per line, bracket path notation) matches upstream.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
from collections.abc import Iterable, Mapping, Sequence
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
# Pydantic error type -> the JSON type name Zod would report as "expected".
|
|
16
|
+
_TYPE_NAMES = {
|
|
17
|
+
"string_type": "string",
|
|
18
|
+
"int_type": "number",
|
|
19
|
+
"int_parsing": "number",
|
|
20
|
+
"int_from_float": "int",
|
|
21
|
+
"float_type": "number",
|
|
22
|
+
"float_parsing": "number",
|
|
23
|
+
"bool_type": "boolean",
|
|
24
|
+
"bool_parsing": "boolean",
|
|
25
|
+
"dict_type": "object",
|
|
26
|
+
"model_type": "object",
|
|
27
|
+
"model_attributes_type": "object",
|
|
28
|
+
"list_type": "array",
|
|
29
|
+
"tuple_type": "array",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
_QUOTED = re.compile(r"'((?:[^'\\]|\\.)*)'")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def format_path(path: Sequence[Any]) -> str:
|
|
36
|
+
"""Format a location tuple in bracket notation: ``agents[0].name``."""
|
|
37
|
+
if not path:
|
|
38
|
+
return "root"
|
|
39
|
+
out = []
|
|
40
|
+
for i, segment in enumerate(path):
|
|
41
|
+
if isinstance(segment, int) and not isinstance(segment, bool):
|
|
42
|
+
out.append(f"[{segment}]")
|
|
43
|
+
else:
|
|
44
|
+
out.append(str(segment) if i == 0 else f".{segment}")
|
|
45
|
+
return "".join(out)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _expected_options(issue: Mapping[str, Any]) -> list[str] | None:
|
|
49
|
+
ctx = issue.get("ctx") or {}
|
|
50
|
+
expected = ctx.get("expected")
|
|
51
|
+
if isinstance(expected, (list, tuple)):
|
|
52
|
+
return [str(o) for o in expected]
|
|
53
|
+
if isinstance(expected, str):
|
|
54
|
+
found = _QUOTED.findall(expected)
|
|
55
|
+
if found:
|
|
56
|
+
return found
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _format_issue(issue: Mapping[str, Any]) -> str:
|
|
61
|
+
path = format_path(tuple(issue.get("loc") or ()))
|
|
62
|
+
kind = issue.get("type", "")
|
|
63
|
+
|
|
64
|
+
if kind in _TYPE_NAMES:
|
|
65
|
+
return f'{path}: expected "{_TYPE_NAMES[kind]}"'
|
|
66
|
+
|
|
67
|
+
if kind in ("literal_error", "enum"):
|
|
68
|
+
options = _expected_options(issue)
|
|
69
|
+
if options:
|
|
70
|
+
expected = " | ".join(f'"{o}"' for o in options)
|
|
71
|
+
if "input" in issue:
|
|
72
|
+
return f"{path}: got {_json(issue['input'])}, expected {expected}"
|
|
73
|
+
return f"{path}: expected {expected}"
|
|
74
|
+
|
|
75
|
+
if kind in ("union_tag_invalid", "union_tag_not_found"):
|
|
76
|
+
discriminator = str((issue.get("ctx") or {}).get("discriminator", "")).strip("'")
|
|
77
|
+
if discriminator:
|
|
78
|
+
return f'{path}: invalid "{discriminator}" value'
|
|
79
|
+
|
|
80
|
+
message = issue.get("msg") or kind or "invalid value"
|
|
81
|
+
return f"{path}: {message}"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _json(value: Any) -> str:
|
|
85
|
+
try:
|
|
86
|
+
return json.dumps(value, ensure_ascii=False, separators=(",", ":"))
|
|
87
|
+
except (TypeError, ValueError):
|
|
88
|
+
return json.dumps(str(value))
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def format_validation_errors(issues: Iterable[Mapping[str, Any]]) -> str:
|
|
92
|
+
"""Format all issues into a newline-separated `` - path: message`` list.
|
|
93
|
+
|
|
94
|
+
Pydantic reports each forbidden extra key separately; they are grouped per parent object
|
|
95
|
+
into Zod's single ``unknown keys (remove): "a", "b"`` line.
|
|
96
|
+
"""
|
|
97
|
+
lines: list[str] = []
|
|
98
|
+
unknown_by_parent: dict[tuple[Any, ...], list[str]] = {}
|
|
99
|
+
unknown_line_index: dict[tuple[Any, ...], int] = {}
|
|
100
|
+
|
|
101
|
+
for issue in issues:
|
|
102
|
+
if issue.get("type") == "extra_forbidden" and issue.get("loc"):
|
|
103
|
+
loc = tuple(issue["loc"])
|
|
104
|
+
parent, key = loc[:-1], str(loc[-1])
|
|
105
|
+
if parent not in unknown_by_parent:
|
|
106
|
+
unknown_by_parent[parent] = []
|
|
107
|
+
unknown_line_index[parent] = len(lines)
|
|
108
|
+
lines.append("")
|
|
109
|
+
unknown_by_parent[parent].append(key)
|
|
110
|
+
continue
|
|
111
|
+
lines.append(f" - {_format_issue(issue)}")
|
|
112
|
+
|
|
113
|
+
for parent, keys in unknown_by_parent.items():
|
|
114
|
+
joined = ", ".join(f'"{k}"' for k in keys)
|
|
115
|
+
lines[unknown_line_index[parent]] = f" - {format_path(parent)}: unknown keys (remove): {joined}"
|
|
116
|
+
|
|
117
|
+
return "\n".join(lines)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# Upstream name, kept for literal ports of call sites.
|
|
121
|
+
format_zod_errors = format_validation_errors
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Deployment artifact packaging (port of ``src/lib/packaging``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agentcore.lib.errors.types import PackagingError
|
|
8
|
+
from agentcore.lib.packaging.build_context import ResolvedBuildContext, resolve_build_context
|
|
9
|
+
from agentcore.lib.packaging.build_context_dockerignore import ensure_build_context_dockerignore
|
|
10
|
+
from agentcore.lib.packaging.container import ContainerPackager
|
|
11
|
+
from agentcore.lib.packaging.helpers import is_node_runtime, is_python_runtime, resolve_code_location
|
|
12
|
+
from agentcore.lib.packaging.node import NodeCodeZipPackager
|
|
13
|
+
from agentcore.lib.packaging.python import PythonCodeZipPackager, default_python_version
|
|
14
|
+
from agentcore.lib.packaging.types import (
|
|
15
|
+
ArtifactResult,
|
|
16
|
+
CodeBundleConfig,
|
|
17
|
+
CodeZipPackager,
|
|
18
|
+
PackageOptions,
|
|
19
|
+
RuntimePackager,
|
|
20
|
+
spec_field,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def validate_agent_exists(project: Any, agent_name: str) -> None:
|
|
25
|
+
"""Raise ``PackagingError`` unless ``project.runtimes`` contains ``agent_name``."""
|
|
26
|
+
runtimes = spec_field(project, "runtimes", []) or []
|
|
27
|
+
if not any(spec_field(a, "name") == agent_name for a in runtimes):
|
|
28
|
+
available = ", ".join(str(spec_field(a, "name")) for a in runtimes)
|
|
29
|
+
raise PackagingError(f"Agent '{agent_name}' not found. Available agents: {available}")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_runtime_packager(runtime_version: str) -> RuntimePackager:
|
|
33
|
+
if is_python_runtime(runtime_version):
|
|
34
|
+
return PythonCodeZipPackager()
|
|
35
|
+
if is_node_runtime(runtime_version):
|
|
36
|
+
return NodeCodeZipPackager()
|
|
37
|
+
raise PackagingError(f"Unsupported runtime version: {runtime_version}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def get_code_zip_packager(runtime_version: str) -> CodeZipPackager:
|
|
41
|
+
if is_python_runtime(runtime_version):
|
|
42
|
+
return PythonCodeZipPackager()
|
|
43
|
+
if is_node_runtime(runtime_version):
|
|
44
|
+
return NodeCodeZipPackager()
|
|
45
|
+
raise PackagingError(f"Unsupported runtime version: {runtime_version}")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_container_packager() -> RuntimePackager:
|
|
49
|
+
return ContainerPackager()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def pack_runtime(spec: Any, options: PackageOptions | None = None) -> ArtifactResult:
|
|
53
|
+
"""Package a runtime, choosing the packager from build type and runtime version."""
|
|
54
|
+
if spec_field(spec, "build") == "Container":
|
|
55
|
+
return get_container_packager().pack(spec, options)
|
|
56
|
+
return get_runtime_packager(spec_field(spec, "runtimeVersion")).pack(spec, options)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def pack_code_zip_sync(config: Any, options: PackageOptions | None = None) -> ArtifactResult:
|
|
60
|
+
"""Package a CodeZip bundle (defaults to Python when no runtime version is set)."""
|
|
61
|
+
runtime_version = spec_field(config, "runtimeVersion") or default_python_version()
|
|
62
|
+
return get_code_zip_packager(runtime_version).pack_code_zip(config, options)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
__all__ = [
|
|
66
|
+
"ArtifactResult",
|
|
67
|
+
"CodeBundleConfig",
|
|
68
|
+
"CodeZipPackager",
|
|
69
|
+
"PackageOptions",
|
|
70
|
+
"ResolvedBuildContext",
|
|
71
|
+
"RuntimePackager",
|
|
72
|
+
"ensure_build_context_dockerignore",
|
|
73
|
+
"get_code_zip_packager",
|
|
74
|
+
"get_container_packager",
|
|
75
|
+
"get_runtime_packager",
|
|
76
|
+
"pack_code_zip_sync",
|
|
77
|
+
"pack_runtime",
|
|
78
|
+
"resolve_build_context",
|
|
79
|
+
"resolve_code_location",
|
|
80
|
+
"validate_agent_exists",
|
|
81
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
|
|
5
|
+
from agentcore.lib.schemas.io.global_config import read_global_config_sync
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_uv_build_args() -> list[str]:
|
|
9
|
+
"""``--build-arg`` flags for UV index URLs configured in ``~/.agentcore/config.json``."""
|
|
10
|
+
config = read_global_config_sync()
|
|
11
|
+
args: list[str] = []
|
|
12
|
+
if config.get("uvDefaultIndex"):
|
|
13
|
+
args += ["--build-arg", f"UV_DEFAULT_INDEX={config['uvDefaultIndex']}"]
|
|
14
|
+
if config.get("uvIndex"):
|
|
15
|
+
args += ["--build-arg", f"UV_INDEX={config['uvIndex']}"]
|
|
16
|
+
return args
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_custom_build_args(custom_docker_build_args: Mapping[str, str] | None = None) -> list[str]:
|
|
20
|
+
"""``--build-arg KEY=VALUE`` flags for an agent's ``customDockerBuildArgs``."""
|
|
21
|
+
return [
|
|
22
|
+
part for key, value in (custom_docker_build_args or {}).items() for part in ("--build-arg", f"{key}={value}")
|
|
23
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from agentcore.lib.constants import get_dockerfile_path
|
|
7
|
+
from agentcore.lib.packaging.helpers import resolve_code_location
|
|
8
|
+
from agentcore.lib.packaging.types import spec_field
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass(frozen=True, slots=True)
|
|
12
|
+
class ResolvedBuildContext:
|
|
13
|
+
# Absolute Docker build context (buildContextPath when set, else codeLocation).
|
|
14
|
+
build_context: str
|
|
15
|
+
# Absolute Dockerfile path, resolved against the build context.
|
|
16
|
+
dockerfile_path: str
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def resolve_build_context(spec: Any, base_dir: str) -> ResolvedBuildContext:
|
|
20
|
+
"""Single resolver for a Container agent's build context + Dockerfile, shared by package/deploy/dev."""
|
|
21
|
+
location = spec_field(spec, "buildContextPath") or spec_field(spec, "codeLocation")
|
|
22
|
+
build_context = resolve_code_location(location, base_dir)
|
|
23
|
+
return ResolvedBuildContext(
|
|
24
|
+
build_context=build_context,
|
|
25
|
+
dockerfile_path=get_dockerfile_path(build_context, spec_field(spec, "dockerfile")),
|
|
26
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
# Written at a Container agent's build-context root when buildContextPath is set and none exists.
|
|
6
|
+
BUILD_CONTEXT_DOCKERIGNORE_TEMPLATE = """# Generated by agentcore because this agent sets buildContextPath — the whole of this directory is the
|
|
7
|
+
# Docker build context, so secrets/junk here would otherwise be baked into the image and uploaded to
|
|
8
|
+
# CodeBuild. Patterns are listed both bare and '**/'-prefixed so nested copies (e.g.
|
|
9
|
+
# app/agent-one/node_modules, app/agent-one/.env) are excluded too, not just the top level — Docker
|
|
10
|
+
# matches .dockerignore patterns root-relative. Both 'agentcore dev'/'package' and 'agentcore deploy'
|
|
11
|
+
# honor this file. Edit freely; to intentionally include a file listed here (e.g. a non-secret
|
|
12
|
+
# .env.production), add a '!'-prefixed line for it below.
|
|
13
|
+
.env
|
|
14
|
+
.env.*
|
|
15
|
+
**/.env
|
|
16
|
+
**/.env.*
|
|
17
|
+
.git
|
|
18
|
+
**/.git
|
|
19
|
+
.venv
|
|
20
|
+
**/.venv
|
|
21
|
+
node_modules
|
|
22
|
+
**/node_modules
|
|
23
|
+
__pycache__
|
|
24
|
+
**/__pycache__
|
|
25
|
+
.pytest_cache
|
|
26
|
+
**/.pytest_cache
|
|
27
|
+
.DS_Store
|
|
28
|
+
**/.DS_Store
|
|
29
|
+
agentcore/
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def ensure_build_context_dockerignore(resolved_build_context: str) -> str | None:
|
|
34
|
+
"""Create ``.dockerignore`` at the build-context root unless the dir is missing or one exists.
|
|
35
|
+
|
|
36
|
+
Returns the created path, else ``None``. A user's existing file is never overwritten.
|
|
37
|
+
"""
|
|
38
|
+
if not os.path.exists(resolved_build_context):
|
|
39
|
+
return None
|
|
40
|
+
path = os.path.join(resolved_build_context, ".dockerignore")
|
|
41
|
+
if os.path.exists(path):
|
|
42
|
+
return None
|
|
43
|
+
with open(path, "w", encoding="utf-8", newline="") as fh:
|
|
44
|
+
fh.write(BUILD_CONTEXT_DOCKERIGNORE_TEMPLATE)
|
|
45
|
+
return path
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Container packager (port of ``packaging/container.ts``): local image build + 1GB size check."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import subprocess
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agentcore.lib.constants import CONTAINER_RUNTIMES, DOCKERFILE_NAME, ONE_GB
|
|
10
|
+
from agentcore.lib.errors.types import PackagingError
|
|
11
|
+
from agentcore.lib.packaging.build_args import get_custom_build_args, get_uv_build_args
|
|
12
|
+
from agentcore.lib.packaging.build_context import resolve_build_context
|
|
13
|
+
from agentcore.lib.packaging.build_context_dockerignore import ensure_build_context_dockerignore
|
|
14
|
+
from agentcore.lib.packaging.helpers import resolve_code_location
|
|
15
|
+
from agentcore.lib.packaging.types import ArtifactResult, PackageOptions, spec_field
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _run(args: list[str]) -> subprocess.CompletedProcess[bytes] | None:
|
|
19
|
+
try:
|
|
20
|
+
return subprocess.run(args, stdin=subprocess.DEVNULL, capture_output=True)
|
|
21
|
+
except OSError:
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def detect_container_runtime() -> str | None:
|
|
26
|
+
"""First runtime in CONTAINER_RUNTIMES order that ``which`` finds and that answers ``--version``."""
|
|
27
|
+
for runtime in CONTAINER_RUNTIMES:
|
|
28
|
+
found = _run(["which", runtime])
|
|
29
|
+
if found is not None and found.returncode == 0:
|
|
30
|
+
version = _run([runtime, "--version"])
|
|
31
|
+
if version is not None and version.returncode == 0:
|
|
32
|
+
return runtime
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ContainerPackager:
|
|
37
|
+
def pack(self, spec: Any, options: PackageOptions | None = None) -> ArtifactResult:
|
|
38
|
+
options = options or PackageOptions()
|
|
39
|
+
if spec_field(spec, "build") != "Container":
|
|
40
|
+
raise PackagingError("ContainerPackager only supports Container build type.")
|
|
41
|
+
|
|
42
|
+
agent_name = options.agent_name or spec_field(spec, "name")
|
|
43
|
+
config_base_dir = options.artifact_dir or options.project_root or os.getcwd()
|
|
44
|
+
code_location = resolve_code_location(spec_field(spec, "codeLocation"), config_base_dir)
|
|
45
|
+
resolved = resolve_build_context(spec, config_base_dir)
|
|
46
|
+
|
|
47
|
+
if not os.path.exists(resolved.dockerfile_path):
|
|
48
|
+
raise PackagingError(
|
|
49
|
+
f"{spec_field(spec, 'dockerfile') or DOCKERFILE_NAME} not found at {resolved.dockerfile_path}. "
|
|
50
|
+
"Container agents require a Dockerfile."
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Dockerfile validated: when buildContextPath widens the context, keep secrets/junk out.
|
|
54
|
+
if spec_field(spec, "buildContextPath"):
|
|
55
|
+
ensure_build_context_dockerignore(resolved.build_context)
|
|
56
|
+
|
|
57
|
+
runtime = detect_container_runtime()
|
|
58
|
+
if not runtime:
|
|
59
|
+
# No local runtime: skip local build validation (deploy uses CodeBuild).
|
|
60
|
+
return ArtifactResult(artifact_path="", size_bytes=0, staging_path=code_location)
|
|
61
|
+
|
|
62
|
+
# Image tags must be lowercase; agent names may not be.
|
|
63
|
+
image_name = f"agentcore-package-{agent_name}".lower()
|
|
64
|
+
build = _run(
|
|
65
|
+
[
|
|
66
|
+
runtime,
|
|
67
|
+
"build",
|
|
68
|
+
"-t",
|
|
69
|
+
image_name,
|
|
70
|
+
"-f",
|
|
71
|
+
resolved.dockerfile_path,
|
|
72
|
+
*get_uv_build_args(),
|
|
73
|
+
*get_custom_build_args(spec_field(spec, "customDockerBuildArgs")),
|
|
74
|
+
resolved.build_context,
|
|
75
|
+
]
|
|
76
|
+
)
|
|
77
|
+
if build is None or build.returncode != 0:
|
|
78
|
+
stderr = build.stderr.decode("utf-8", errors="replace") if build is not None else ""
|
|
79
|
+
raise PackagingError(f"Container build failed:\n{stderr}")
|
|
80
|
+
|
|
81
|
+
inspect = _run([runtime, "image", "inspect", image_name, "--format", "{{.Size}}"])
|
|
82
|
+
try:
|
|
83
|
+
size_bytes = int((inspect.stdout.decode().strip() if inspect else "") or "0")
|
|
84
|
+
except ValueError:
|
|
85
|
+
size_bytes = 0
|
|
86
|
+
if size_bytes > ONE_GB:
|
|
87
|
+
size_mb = f"{size_bytes / (1024 * 1024):.2f}"
|
|
88
|
+
raise PackagingError(
|
|
89
|
+
f"Container image exceeds 1GB limit ({size_mb}MB). "
|
|
90
|
+
"Optimize your Dockerfile: use multi-stage builds, minimize dependencies, add .dockerignore."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
return ArtifactResult(
|
|
94
|
+
artifact_path=f"{runtime}://{image_name}", size_bytes=size_bytes, staging_path=code_location
|
|
95
|
+
)
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"""Shared packaging helpers (port of ``packaging/helpers.ts``)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
import shutil
|
|
8
|
+
import zipfile
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
|
|
11
|
+
from agentcore.lib.constants import CONFIG_DIR
|
|
12
|
+
from agentcore.lib.errors.types import ArtifactSizeError, MissingDependencyError, MissingProjectFileError
|
|
13
|
+
from agentcore.lib.packaging.types import PackageOptions
|
|
14
|
+
from agentcore.lib.utils.platform import is_windows
|
|
15
|
+
from agentcore.lib.utils.subprocess import check_subprocess, run_subprocess
|
|
16
|
+
|
|
17
|
+
MAX_ZIP_SIZE_BYTES = 250 * 1024 * 1024
|
|
18
|
+
|
|
19
|
+
_EXCLUDED_ENTRIES = frozenset({".git", ".venv", "__pycache__", ".pytest_cache", ".DS_Store", "node_modules"})
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def is_python_runtime(runtime_version: str) -> bool:
|
|
23
|
+
return runtime_version.startswith("PYTHON_")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def is_node_runtime(runtime_version: str) -> bool:
|
|
27
|
+
return runtime_version.startswith("NODE_")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True, slots=True)
|
|
31
|
+
class ResolvedPaths:
|
|
32
|
+
project_root: str
|
|
33
|
+
src_dir: str
|
|
34
|
+
# For Node projects this points at package.json.
|
|
35
|
+
pyproject_path: str
|
|
36
|
+
artifact_dir: str
|
|
37
|
+
build_dir: str
|
|
38
|
+
staging_dir: str
|
|
39
|
+
artifacts_dir: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _is_env_secret_entry(name: str) -> bool:
|
|
43
|
+
"""``.env`` / ``.env.local`` / ``.env.*``: per-environment secrets, excluded at every depth."""
|
|
44
|
+
return name in (".env", ".env.local") or name.startswith(".env.")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _should_exclude_entry(name: str, source: str, root_dir: str) -> bool:
|
|
48
|
+
"""Copy-stage filter. The project's ``agentcore/`` dir is skipped only at the source root, so
|
|
49
|
+
an in-tree dependency shipping its own ``agentcore/`` package is still packaged."""
|
|
50
|
+
if name in _EXCLUDED_ENTRIES:
|
|
51
|
+
return True
|
|
52
|
+
if name == CONFIG_DIR and os.path.abspath(source) == os.path.abspath(root_dir):
|
|
53
|
+
return True
|
|
54
|
+
return _is_env_secret_entry(name)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _is_zip_excluded_entry(name: str) -> bool:
|
|
58
|
+
"""Zip-stage filter. A top-level ``agentcore/`` in staging is a real package, so it's kept."""
|
|
59
|
+
return name in _EXCLUDED_ENTRIES or _is_env_secret_entry(name)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def resolve_code_location(code_location: str, config_base_dir: str) -> str:
|
|
63
|
+
"""Resolve a ``codeLocation`` relative to the repository root (parent of ``agentcore/``)."""
|
|
64
|
+
if os.path.isabs(code_location):
|
|
65
|
+
return code_location
|
|
66
|
+
return os.path.abspath(os.path.join(os.path.dirname(config_base_dir), code_location))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _find_up(file_name: str, start_dir: str) -> str | None:
|
|
70
|
+
current = os.path.abspath(start_dir)
|
|
71
|
+
while True:
|
|
72
|
+
candidate = os.path.join(current, file_name)
|
|
73
|
+
if os.path.exists(candidate):
|
|
74
|
+
return candidate
|
|
75
|
+
parent = os.path.dirname(current)
|
|
76
|
+
if parent == current:
|
|
77
|
+
return None
|
|
78
|
+
current = parent
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _derive_paths(project_root: str, manifest: str, options: PackageOptions, agent_name: str | None) -> ResolvedPaths:
|
|
82
|
+
src_dir = os.path.abspath(os.path.join(project_root, options.src_dir or "."))
|
|
83
|
+
artifact_dir = os.path.abspath(options.artifact_dir or os.path.join(project_root, CONFIG_DIR))
|
|
84
|
+
# Staging layout: <artifactDir>/<name>/staging
|
|
85
|
+
build_dir = os.path.join(artifact_dir, agent_name or "default")
|
|
86
|
+
return ResolvedPaths(
|
|
87
|
+
project_root=project_root,
|
|
88
|
+
src_dir=src_dir,
|
|
89
|
+
pyproject_path=manifest,
|
|
90
|
+
artifact_dir=artifact_dir,
|
|
91
|
+
build_dir=build_dir,
|
|
92
|
+
staging_dir=os.path.join(build_dir, "staging"),
|
|
93
|
+
artifacts_dir=artifact_dir,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def resolve_project_paths(options: PackageOptions | None = None, agent_name: str | None = None) -> ResolvedPaths:
|
|
98
|
+
"""Paths for a Python project, locating ``pyproject.toml`` (explicit or nearest ancestor)."""
|
|
99
|
+
options = options or PackageOptions()
|
|
100
|
+
start_dir = os.path.abspath(options.project_root) if options.project_root else os.getcwd()
|
|
101
|
+
candidate = (
|
|
102
|
+
os.path.abspath(options.pyproject_path) if options.pyproject_path else _find_up("pyproject.toml", start_dir)
|
|
103
|
+
)
|
|
104
|
+
if not candidate or not os.path.exists(candidate):
|
|
105
|
+
raise MissingProjectFileError(options.pyproject_path or os.path.join(start_dir, "pyproject.toml"))
|
|
106
|
+
project_root = os.path.abspath(options.project_root) if options.project_root else os.path.dirname(candidate)
|
|
107
|
+
return _derive_paths(project_root, candidate, options, agent_name)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def resolve_node_project_paths(options: PackageOptions | None = None, agent_name: str | None = None) -> ResolvedPaths:
|
|
111
|
+
"""Paths for a Node/TypeScript project, locating the nearest ``package.json``."""
|
|
112
|
+
options = options or PackageOptions()
|
|
113
|
+
start_dir = os.path.abspath(options.project_root) if options.project_root else os.getcwd()
|
|
114
|
+
candidate = _find_up("package.json", start_dir)
|
|
115
|
+
if not candidate or not os.path.exists(candidate):
|
|
116
|
+
raise MissingProjectFileError(os.path.join(start_dir, "package.json"))
|
|
117
|
+
project_root = os.path.abspath(options.project_root) if options.project_root else os.path.dirname(candidate)
|
|
118
|
+
return _derive_paths(project_root, candidate, options, agent_name)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def ensure_dir_clean(directory: str) -> None:
|
|
122
|
+
shutil.rmtree(directory, ignore_errors=True)
|
|
123
|
+
os.makedirs(directory, exist_ok=True)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _copy_entry(source: str, destination: str, root_dir: str) -> None:
|
|
127
|
+
if os.path.isdir(source):
|
|
128
|
+
os.makedirs(destination, exist_ok=True)
|
|
129
|
+
for entry in os.listdir(source):
|
|
130
|
+
if _should_exclude_entry(entry, source, root_dir):
|
|
131
|
+
continue
|
|
132
|
+
_copy_entry(os.path.join(source, entry), os.path.join(destination, entry), root_dir)
|
|
133
|
+
return
|
|
134
|
+
# Content only (like a stream copy), following symlinks.
|
|
135
|
+
shutil.copyfile(source, destination)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def copy_source_tree(src_dir: str, destination: str) -> None:
|
|
139
|
+
if not os.path.exists(src_dir):
|
|
140
|
+
raise MissingProjectFileError(src_dir)
|
|
141
|
+
_copy_entry(src_dir, destination, src_dir)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def ensure_binary_available(binary: str, install_hint: str | None = None) -> None:
|
|
145
|
+
checks = [
|
|
146
|
+
lambda: check_subprocess("where" if is_windows else "which", [binary]),
|
|
147
|
+
lambda: check_subprocess(binary, ["--version"]),
|
|
148
|
+
lambda: check_subprocess(binary, ["-v"]),
|
|
149
|
+
]
|
|
150
|
+
if any(check() for check in checks):
|
|
151
|
+
return
|
|
152
|
+
raise MissingDependencyError(binary, install_hint)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def run_command(command: str, args: list[str], cwd: str | None = None) -> None:
|
|
156
|
+
run_subprocess(command, args, cwd=cwd)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _collect_files(directory: str, base_path: str = "") -> list[tuple[str, str]]:
|
|
160
|
+
"""(absolute path, zip path) pairs. Like upstream, symlinks are neither files nor dirs here."""
|
|
161
|
+
result: list[tuple[str, str]] = []
|
|
162
|
+
with os.scandir(directory) as it:
|
|
163
|
+
entries = sorted(it, key=lambda e: e.name)
|
|
164
|
+
for entry in entries:
|
|
165
|
+
if _is_zip_excluded_entry(entry.name):
|
|
166
|
+
continue
|
|
167
|
+
zip_path = f"{base_path}/{entry.name}" if base_path else entry.name
|
|
168
|
+
if entry.is_dir(follow_symlinks=False):
|
|
169
|
+
result.extend(_collect_files(entry.path, zip_path))
|
|
170
|
+
elif entry.is_file(follow_symlinks=False):
|
|
171
|
+
result.append((entry.path, zip_path))
|
|
172
|
+
return result
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def create_zip_from_dir(source_dir: str, output_zip: str) -> None:
|
|
176
|
+
"""Zip regular files under ``source_dir`` (deflate level 6), preserving file modes."""
|
|
177
|
+
if os.path.exists(output_zip):
|
|
178
|
+
os.remove(output_zip)
|
|
179
|
+
os.makedirs(os.path.dirname(output_zip) or ".", exist_ok=True)
|
|
180
|
+
files = _collect_files(source_dir)
|
|
181
|
+
with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=6) as zf:
|
|
182
|
+
for full_path, zip_path in files:
|
|
183
|
+
info = zipfile.ZipInfo.from_file(full_path, zip_path, strict_timestamps=False)
|
|
184
|
+
info.compress_type = zipfile.ZIP_DEFLATED
|
|
185
|
+
with open(full_path, "rb") as fh:
|
|
186
|
+
zf.writestr(info, fh.read(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=6)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def enforce_zip_size_limit(zip_path: str) -> int:
|
|
190
|
+
size = os.stat(zip_path).st_size
|
|
191
|
+
if size > MAX_ZIP_SIZE_BYTES:
|
|
192
|
+
raise ArtifactSizeError(MAX_ZIP_SIZE_BYTES, size)
|
|
193
|
+
return size
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# --- Console script fix-ups ---------------------------------------------------------------------
|
|
197
|
+
|
|
198
|
+
_PORTABLE_SHEBANG = "#!/usr/bin/env python3"
|
|
199
|
+
|
|
200
|
+
# Console scripts whose Windows .exe launchers are replaced by Linux scripts when cross-packaging.
|
|
201
|
+
_KNOWN_CONSOLE_SCRIPTS: dict[str, tuple[str, str]] = {
|
|
202
|
+
"opentelemetry-instrument": ("opentelemetry.instrumentation.auto_instrumentation", "run"),
|
|
203
|
+
"opentelemetry-bootstrap": ("opentelemetry.instrumentation.bootstrap", "run"),
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
_HARDCODED_SHEBANG = re.compile(r"^#!/(?:Users|home|opt|var|tmp)/.*python")
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _generate_linux_console_script(module_path: str, func_name: str) -> str:
|
|
210
|
+
return (
|
|
211
|
+
"#!/usr/bin/env python3\n"
|
|
212
|
+
"# -*- coding: utf-8 -*-\n"
|
|
213
|
+
"import re\n"
|
|
214
|
+
"import sys\n"
|
|
215
|
+
f"from {module_path} import {func_name}\n"
|
|
216
|
+
"if __name__ == '__main__':\n"
|
|
217
|
+
" sys.argv[0] = re.sub(r'(-script\\.pyw|\\.exe)?$', '', sys.argv[0])\n"
|
|
218
|
+
f" sys.exit({func_name}())\n"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _write_executable(path: str, content: str) -> None:
|
|
223
|
+
with open(path, "w", encoding="utf-8", newline="") as fh:
|
|
224
|
+
fh.write(content)
|
|
225
|
+
os.chmod(path, 0o755)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _rewrite_unix_shebangs(staging_dir: str) -> None:
|
|
229
|
+
"""Replace hardcoded interpreter paths in ``bin/`` scripts with ``#!/usr/bin/env python3``."""
|
|
230
|
+
bin_dir = os.path.join(staging_dir, "bin")
|
|
231
|
+
if not os.path.exists(bin_dir):
|
|
232
|
+
return
|
|
233
|
+
for entry in os.listdir(bin_dir):
|
|
234
|
+
script_path = os.path.join(bin_dir, entry)
|
|
235
|
+
if not os.path.isfile(script_path):
|
|
236
|
+
continue
|
|
237
|
+
with open(script_path, "rb") as fh:
|
|
238
|
+
content = fh.read().decode("utf-8", errors="replace")
|
|
239
|
+
first_line = content.split("\n", 1)[0]
|
|
240
|
+
if first_line and _HARDCODED_SHEBANG.search(first_line):
|
|
241
|
+
# Rewrites in place; like upstream, the existing file mode is kept.
|
|
242
|
+
with open(script_path, "w", encoding="utf-8", newline="") as fh:
|
|
243
|
+
fh.write(content.replace(first_line, _PORTABLE_SHEBANG, 1))
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def convert_windows_scripts_to_linux(staging_dir: str) -> None:
|
|
247
|
+
"""Make console scripts runnable on Linux: rewrite .exe launchers (Windows) or shebangs (Unix)."""
|
|
248
|
+
if not is_windows:
|
|
249
|
+
_rewrite_unix_shebangs(staging_dir)
|
|
250
|
+
return
|
|
251
|
+
bin_dir = os.path.join(staging_dir, "bin")
|
|
252
|
+
if not os.path.exists(bin_dir):
|
|
253
|
+
return
|
|
254
|
+
for entry in os.listdir(bin_dir):
|
|
255
|
+
if not entry.endswith(".exe"):
|
|
256
|
+
continue
|
|
257
|
+
script_name = entry[:-4]
|
|
258
|
+
entry_point = _KNOWN_CONSOLE_SCRIPTS.get(script_name)
|
|
259
|
+
if entry_point:
|
|
260
|
+
os.unlink(os.path.join(bin_dir, entry))
|
|
261
|
+
_write_executable(os.path.join(bin_dir, script_name), _generate_linux_console_script(*entry_point))
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
# Upstream keeps *Sync twins for CDK bundling; Python is synchronous throughout.
|
|
265
|
+
resolve_project_paths_sync = resolve_project_paths
|
|
266
|
+
resolve_node_project_paths_sync = resolve_node_project_paths
|
|
267
|
+
ensure_dir_clean_sync = ensure_dir_clean
|
|
268
|
+
copy_source_tree_sync = copy_source_tree
|
|
269
|
+
ensure_binary_available_sync = ensure_binary_available
|
|
270
|
+
create_zip_from_dir_sync = create_zip_from_dir
|
|
271
|
+
enforce_zip_size_limit_sync = enforce_zip_size_limit
|
|
272
|
+
convert_windows_scripts_to_linux_sync = convert_windows_scripts_to_linux
|
|
273
|
+
|
|
274
|
+
__all__ = [
|
|
275
|
+
"MAX_ZIP_SIZE_BYTES",
|
|
276
|
+
"ResolvedPaths",
|
|
277
|
+
"convert_windows_scripts_to_linux",
|
|
278
|
+
"copy_source_tree",
|
|
279
|
+
"create_zip_from_dir",
|
|
280
|
+
"enforce_zip_size_limit",
|
|
281
|
+
"ensure_binary_available",
|
|
282
|
+
"ensure_dir_clean",
|
|
283
|
+
"is_node_runtime",
|
|
284
|
+
"is_python_runtime",
|
|
285
|
+
"resolve_code_location",
|
|
286
|
+
"resolve_node_project_paths",
|
|
287
|
+
"resolve_project_paths",
|
|
288
|
+
"run_command",
|
|
289
|
+
]
|