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,155 @@
|
|
|
1
|
+
"""`agentcore traces list|get` (port of src/cli/commands/traces)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import math
|
|
5
|
+
from datetime import UTC, datetime
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
from agentcore.cli.commands.logs.guards import get_project_root_mismatch, project_exists, require_project
|
|
11
|
+
from agentcore.cli.commands.traces import action
|
|
12
|
+
from agentcore.cli.errors import get_error_message
|
|
13
|
+
from agentcore.cli.groups import group
|
|
14
|
+
from agentcore.lib.result import serialize_result
|
|
15
|
+
from agentcore.operations import resolve_agent as resolve_agent_ops
|
|
16
|
+
|
|
17
|
+
SINCE_HELP = "Start time — defaults to 12h ago (e.g. 5m, 1h, 2d, ISO 8601, epoch ms)"
|
|
18
|
+
UNTIL_HELP = "End time — defaults to now (e.g. now, 1h, ISO 8601, epoch ms)"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _dumps(payload: dict[str, Any]) -> str:
|
|
22
|
+
return json.dumps({k: v for k, v in payload.items() if v is not None}, separators=(",", ":"), ensure_ascii=False)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def format_timestamp(ts: str) -> str:
|
|
26
|
+
try:
|
|
27
|
+
num = float(ts)
|
|
28
|
+
except ValueError:
|
|
29
|
+
return ts
|
|
30
|
+
if math.isnan(num):
|
|
31
|
+
return ts
|
|
32
|
+
return datetime.fromtimestamp(num / 1000, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _require_traces_project(as_json: bool) -> None:
|
|
36
|
+
if not as_json:
|
|
37
|
+
require_project()
|
|
38
|
+
return
|
|
39
|
+
if not project_exists():
|
|
40
|
+
typer.echo(_dumps({"success": False, "error": "No agentcore project found. Run agentcore create first."}))
|
|
41
|
+
raise typer.Exit(1)
|
|
42
|
+
project_root = get_project_root_mismatch()
|
|
43
|
+
if project_root:
|
|
44
|
+
typer.echo(
|
|
45
|
+
_dumps(
|
|
46
|
+
{"success": False, "error": f"Please run this command from your project root directory: {project_root}"}
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
raise typer.Exit(1)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _print_failure(result: dict[str, Any], as_json: bool) -> None:
|
|
53
|
+
if as_json:
|
|
54
|
+
typer.echo(_dumps(serialize_result(result)))
|
|
55
|
+
else:
|
|
56
|
+
typer.secho(f"Error: {result['error']}", fg=typer.colors.RED)
|
|
57
|
+
if result.get("consoleUrl"):
|
|
58
|
+
typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
|
|
59
|
+
raise typer.Exit(1)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _handle_unexpected(exc: Exception, as_json: bool) -> None:
|
|
63
|
+
if as_json:
|
|
64
|
+
typer.echo(_dumps({"success": False, "error": get_error_message(exc)}))
|
|
65
|
+
else:
|
|
66
|
+
typer.secho(f"Error: {get_error_message(exc)}", fg=typer.colors.RED)
|
|
67
|
+
raise typer.Exit(1) from None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def traces_list(
|
|
71
|
+
runtime: str | None = typer.Option(None, "--runtime", help="Select specific runtime"),
|
|
72
|
+
limit: str = typer.Option("20", "--limit", help="Maximum number of traces to display"),
|
|
73
|
+
since: str | None = typer.Option(None, "--since", help=SINCE_HELP),
|
|
74
|
+
until: str | None = typer.Option(None, "--until", help=UNTIL_HELP),
|
|
75
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
|
76
|
+
) -> None:
|
|
77
|
+
"""List recent traces for a deployed runtime"""
|
|
78
|
+
try:
|
|
79
|
+
_require_traces_project(as_json)
|
|
80
|
+
context = resolve_agent_ops.load_deployed_project_config()
|
|
81
|
+
result = action.handle_traces_list(
|
|
82
|
+
context, action.TracesListOptions(runtime=runtime, limit=limit, since=since, until=until, json=as_json)
|
|
83
|
+
)
|
|
84
|
+
except typer.Exit:
|
|
85
|
+
raise
|
|
86
|
+
except Exception as exc: # noqa: BLE001 - top-level command boundary, as upstream
|
|
87
|
+
_handle_unexpected(exc, as_json)
|
|
88
|
+
return
|
|
89
|
+
if not result["success"]:
|
|
90
|
+
_print_failure(result, as_json)
|
|
91
|
+
if as_json:
|
|
92
|
+
typer.echo(_dumps(serialize_result(result)))
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
typer.secho(f"Traces for {result.get('agentName')} (target: {result.get('targetName')})", bold=True)
|
|
96
|
+
typer.echo(" ")
|
|
97
|
+
traces = result.get("traces") or []
|
|
98
|
+
if traces:
|
|
99
|
+
typer.echo(
|
|
100
|
+
typer.style(f"{'Trace ID':<34}", bold=True)
|
|
101
|
+
+ typer.style(f"{'Timestamp':<22}", bold=True)
|
|
102
|
+
+ typer.style(f"{'Session ID':<38}", bold=True)
|
|
103
|
+
)
|
|
104
|
+
for trace in traces:
|
|
105
|
+
typer.echo(
|
|
106
|
+
typer.style(f"{trace['traceId']:<34}", fg=typer.colors.CYAN)
|
|
107
|
+
+ f"{format_timestamp(trace['timestamp']):<22}"
|
|
108
|
+
+ typer.style(f"{trace.get('sessionId') or '-':<38}", fg=typer.colors.MAGENTA)
|
|
109
|
+
)
|
|
110
|
+
else:
|
|
111
|
+
typer.secho("No traces found in the specified time range.", fg=typer.colors.YELLOW)
|
|
112
|
+
typer.echo(" ")
|
|
113
|
+
if result.get("consoleUrl"):
|
|
114
|
+
typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
|
|
115
|
+
typer.secho("Note: Traces may take 2-3 minutes to appear in CloudWatch", dim=True)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def traces_get(
|
|
119
|
+
trace_id: str = typer.Argument(..., metavar="TRACEID"),
|
|
120
|
+
runtime: str | None = typer.Option(None, "--runtime", help="Select specific runtime"),
|
|
121
|
+
output: str | None = typer.Option(None, "--output", help="Output file path"),
|
|
122
|
+
since: str | None = typer.Option(None, "--since", help=SINCE_HELP),
|
|
123
|
+
until: str | None = typer.Option(None, "--until", help=UNTIL_HELP),
|
|
124
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
|
125
|
+
) -> None:
|
|
126
|
+
"""Download a trace to a JSON file"""
|
|
127
|
+
try:
|
|
128
|
+
_require_traces_project(as_json)
|
|
129
|
+
context = resolve_agent_ops.load_deployed_project_config()
|
|
130
|
+
result = action.handle_traces_get(
|
|
131
|
+
context,
|
|
132
|
+
trace_id,
|
|
133
|
+
action.TracesGetOptions(runtime=runtime, output=output, since=since, until=until, json=as_json),
|
|
134
|
+
)
|
|
135
|
+
except typer.Exit:
|
|
136
|
+
raise
|
|
137
|
+
except Exception as exc: # noqa: BLE001 - top-level command boundary, as upstream
|
|
138
|
+
_handle_unexpected(exc, as_json)
|
|
139
|
+
return
|
|
140
|
+
if not result["success"]:
|
|
141
|
+
_print_failure(result, as_json)
|
|
142
|
+
if as_json:
|
|
143
|
+
typer.echo(_dumps(serialize_result(result)))
|
|
144
|
+
return
|
|
145
|
+
typer.secho(f"Trace saved to: {result.get('filePath')}", fg=typer.colors.GREEN)
|
|
146
|
+
if result.get("consoleUrl"):
|
|
147
|
+
typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def register(app: typer.Typer) -> None:
|
|
151
|
+
traces = group("traces")
|
|
152
|
+
traces.command("list", help="List recent traces for a deployed runtime")(traces_list)
|
|
153
|
+
traces.command("get", help="Download a trace to a JSON file")(traces_get)
|
|
154
|
+
# Upstream alias `agentcore t`.
|
|
155
|
+
app.add_typer(traces, name="t", hidden=True)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Port of src/cli/commands/traces/action.ts.
|
|
2
|
+
|
|
3
|
+
Handlers return upstream's flat result dicts: ``{"success": True, "agentName", "targetName",
|
|
4
|
+
"consoleUrl", ...}`` or ``{"success": False, "error": <exception>, "consoleUrl"?}`` (serialize with
|
|
5
|
+
``agentcore.lib.result.serialize_result``).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agentcore.lib.errors.types import ResourceNotFoundError, ValidationError
|
|
12
|
+
from agentcore.lib.utils.time_parser import parse_time_string
|
|
13
|
+
from agentcore.operations import traces as traces_ops
|
|
14
|
+
from agentcore.operations.resolve_agent import DeployedProjectConfig, resolve_agent
|
|
15
|
+
|
|
16
|
+
PYTHON_ONLY_ERROR = (
|
|
17
|
+
"Traces are only supported for Python agents. TypeScript agents do not support observability traces."
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class TracesListOptions:
|
|
23
|
+
runtime: str | None = None
|
|
24
|
+
limit: str | None = None
|
|
25
|
+
since: str | None = None
|
|
26
|
+
until: str | None = None
|
|
27
|
+
json: bool = False
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class TracesGetOptions:
|
|
32
|
+
runtime: str | None = None
|
|
33
|
+
output: str | None = None
|
|
34
|
+
since: str | None = None
|
|
35
|
+
until: str | None = None
|
|
36
|
+
json: bool = False
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _parse_int(value: str) -> int | None:
|
|
40
|
+
text = value.strip()
|
|
41
|
+
end = 0
|
|
42
|
+
while end < len(text) and (text[end].isdigit() or (end == 0 and text[end] in "+-")):
|
|
43
|
+
end += 1
|
|
44
|
+
try:
|
|
45
|
+
return int(text[:end])
|
|
46
|
+
except ValueError:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _resolve(context: DeployedProjectConfig, runtime: str | None) -> tuple[Any, str] | dict[str, Any]:
|
|
51
|
+
resolved = resolve_agent(context, runtime)
|
|
52
|
+
if not resolved.success:
|
|
53
|
+
return {"success": False, "error": ResourceNotFoundError(resolved.error or "")}
|
|
54
|
+
agent = resolved.agent
|
|
55
|
+
spec = next((r for r in context.project.runtimes or [] if r.name == agent.agent_name), None)
|
|
56
|
+
entrypoint = str(spec.entrypoint) if spec is not None and spec.entrypoint else ""
|
|
57
|
+
if not (entrypoint.endswith(".py") or ".py:" in entrypoint):
|
|
58
|
+
return {"success": False, "error": ValidationError(PYTHON_ONLY_ERROR)}
|
|
59
|
+
console_url = traces_ops.build_trace_console_url(
|
|
60
|
+
region=agent.region, account_id=agent.account_id, runtime_id=agent.runtime_id, agent_name=agent.agent_name
|
|
61
|
+
)
|
|
62
|
+
return agent, console_url
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _times(since: str | None, until: str | None) -> tuple[int | None, int | None]:
|
|
66
|
+
return (parse_time_string(since) if since else None, parse_time_string(until) if until else None)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def handle_traces_list(context: DeployedProjectConfig, options: TracesListOptions) -> dict[str, Any]:
|
|
70
|
+
resolved = _resolve(context, options.runtime)
|
|
71
|
+
if isinstance(resolved, dict):
|
|
72
|
+
return resolved
|
|
73
|
+
agent, console_url = resolved
|
|
74
|
+
|
|
75
|
+
limit = _parse_int(options.limit) if options.limit else 20
|
|
76
|
+
if limit is None:
|
|
77
|
+
return {"success": False, "error": ValidationError("--limit must be a number")}
|
|
78
|
+
|
|
79
|
+
start_time, end_time = _times(options.since, options.until)
|
|
80
|
+
result = traces_ops.list_traces(
|
|
81
|
+
region=agent.region,
|
|
82
|
+
runtime_id=agent.runtime_id,
|
|
83
|
+
agent_name=agent.agent_name,
|
|
84
|
+
limit=limit,
|
|
85
|
+
start_time=start_time,
|
|
86
|
+
end_time=end_time,
|
|
87
|
+
)
|
|
88
|
+
if not result.success:
|
|
89
|
+
return {"success": False, "error": result.error, "consoleUrl": console_url}
|
|
90
|
+
return {
|
|
91
|
+
"success": True,
|
|
92
|
+
"agentName": agent.agent_name,
|
|
93
|
+
"targetName": agent.target_name,
|
|
94
|
+
"consoleUrl": console_url,
|
|
95
|
+
"traces": result.value["traces"],
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def handle_traces_get(context: DeployedProjectConfig, trace_id: str, options: TracesGetOptions) -> dict[str, Any]:
|
|
100
|
+
resolved = _resolve(context, options.runtime)
|
|
101
|
+
if isinstance(resolved, dict):
|
|
102
|
+
return resolved
|
|
103
|
+
agent, console_url = resolved
|
|
104
|
+
|
|
105
|
+
start_time, end_time = _times(options.since, options.until)
|
|
106
|
+
result = traces_ops.get_trace(
|
|
107
|
+
region=agent.region,
|
|
108
|
+
runtime_id=agent.runtime_id,
|
|
109
|
+
agent_name=agent.agent_name,
|
|
110
|
+
trace_id=trace_id,
|
|
111
|
+
output_path=options.output,
|
|
112
|
+
start_time=start_time,
|
|
113
|
+
end_time=end_time,
|
|
114
|
+
)
|
|
115
|
+
if not result.success:
|
|
116
|
+
return {"success": False, "error": result.error, "consoleUrl": console_url}
|
|
117
|
+
return {
|
|
118
|
+
"success": True,
|
|
119
|
+
"agentName": agent.agent_name,
|
|
120
|
+
"targetName": agent.target_name,
|
|
121
|
+
"consoleUrl": console_url,
|
|
122
|
+
"filePath": result.value["filePath"],
|
|
123
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""`agentcore update` / `agentcore update cli` (port of src/cli/commands/update/command.tsx)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from agentcore.cli.commands.update.action import get_install_command_display, handle_update
|
|
8
|
+
from agentcore.cli.constants import ANSI
|
|
9
|
+
from agentcore.cli.errors import get_error_message
|
|
10
|
+
from agentcore.cli.groups import group
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _run_update(check: bool, rerun_command: str) -> None:
|
|
14
|
+
green, yellow, red, reset = ANSI.green, ANSI.yellow, ANSI.red, ANSI.reset
|
|
15
|
+
try:
|
|
16
|
+
typer.echo("Checking for updates...")
|
|
17
|
+
result = handle_update(check)
|
|
18
|
+
except Exception as exc: # noqa: BLE001
|
|
19
|
+
typer.echo(f"{red}Error: {get_error_message(exc)}{reset}")
|
|
20
|
+
raise typer.Exit(1) from None
|
|
21
|
+
|
|
22
|
+
if result.status == "up-to-date":
|
|
23
|
+
typer.echo(f"{green}You are already on the latest version ({result.current_version}){reset}")
|
|
24
|
+
elif result.status == "newer-local":
|
|
25
|
+
typer.echo(
|
|
26
|
+
f"{yellow}Your version ({result.current_version}) is newer than the published version "
|
|
27
|
+
f"({result.latest_version}){reset}"
|
|
28
|
+
)
|
|
29
|
+
elif result.status == "update-available":
|
|
30
|
+
typer.echo(f"Update available: {result.current_version} → {green}{result.latest_version}{reset}")
|
|
31
|
+
typer.echo(f"Run `{rerun_command}` to install the update.")
|
|
32
|
+
elif result.status == "manual-install":
|
|
33
|
+
typer.echo(f"Update available: {result.current_version} → {green}{result.latest_version}{reset}")
|
|
34
|
+
typer.echo(f"Run `{result.install_command}` to install the update.")
|
|
35
|
+
elif result.status == "updated":
|
|
36
|
+
typer.echo(f"{green}Successfully updated to {result.latest_version}{reset}")
|
|
37
|
+
else:
|
|
38
|
+
typer.echo(f"{red}Failed to install update. Try running: {get_install_command_display()}{reset}")
|
|
39
|
+
raise typer.Exit(1)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def register(app: typer.Typer) -> None:
|
|
43
|
+
update = group("update")
|
|
44
|
+
update.info.no_args_is_help = False
|
|
45
|
+
|
|
46
|
+
@update.callback(invoke_without_command=True)
|
|
47
|
+
def update_root(
|
|
48
|
+
ctx: typer.Context,
|
|
49
|
+
check: bool = typer.Option(False, "-c", "--check", help="Check for updates without installing"),
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Check for and install CLI updates"""
|
|
52
|
+
if ctx.invoked_subcommand is not None:
|
|
53
|
+
return
|
|
54
|
+
_run_update(check, "agentcore update")
|
|
55
|
+
|
|
56
|
+
@update.command("cli", help="Update the AgentCore CLI to the latest version")
|
|
57
|
+
def update_cli(
|
|
58
|
+
check: bool = typer.Option(False, "-c", "--check", help="Check for updates without installing"),
|
|
59
|
+
) -> None:
|
|
60
|
+
_run_update(check, "agentcore update cli")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
__all__ = ["register"]
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""`agentcore update` logic (port of src/cli/commands/update/action.ts).
|
|
2
|
+
|
|
3
|
+
Deliberate deviation: the Python port is published on PyPI as ``agentcore-cli``. The latest version
|
|
4
|
+
comes from the PyPI JSON API; installs run ``python -m pip install -U agentcore-cli`` — unless the
|
|
5
|
+
CLI lives in a pipx or uv-tool environment, in which case the matching upgrade command is printed
|
|
6
|
+
instead of running pip.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
import urllib.request
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from typing import Literal
|
|
18
|
+
|
|
19
|
+
from agentcore import __version__
|
|
20
|
+
|
|
21
|
+
PACKAGE_NAME = "agentcore-cli"
|
|
22
|
+
PYPI_URL = f"https://pypi.org/pypi/{PACKAGE_NAME}/json"
|
|
23
|
+
PIP_INSTALL_ARGS = [sys.executable, "-m", "pip", "install", "-U", PACKAGE_NAME]
|
|
24
|
+
|
|
25
|
+
InstallMethod = Literal["pip", "pipx", "uv"]
|
|
26
|
+
UpdateStatus = Literal["up-to-date", "newer-local", "update-available", "updated", "update-failed", "manual-install"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _http_get_json(url: str) -> tuple[int, str, object]:
|
|
30
|
+
"""Network seam (tests replace it): returns (status, reason, parsed JSON or None)."""
|
|
31
|
+
request = urllib.request.Request(url, headers={"accept": "application/json"})
|
|
32
|
+
try:
|
|
33
|
+
with urllib.request.urlopen(request, timeout=10) as response: # noqa: S310 - fixed https URL
|
|
34
|
+
return response.status, response.reason or "", json.loads(response.read())
|
|
35
|
+
except urllib.error.HTTPError as exc:
|
|
36
|
+
return exc.code, exc.reason or "", None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def fetch_latest_version() -> str:
|
|
40
|
+
status, reason, data = _http_get_json(PYPI_URL)
|
|
41
|
+
if not 200 <= status < 300 or not isinstance(data, dict):
|
|
42
|
+
raise Exception(f"Failed to fetch latest version: {reason}")
|
|
43
|
+
return str(data["info"]["version"])
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _semver_compare(current: str, latest: str) -> int:
|
|
47
|
+
"""Upstream's semver-style comparison (1 when ``latest`` is newer)."""
|
|
48
|
+
|
|
49
|
+
def parse(v: str) -> tuple[list[float], str]:
|
|
50
|
+
core, _, prerelease = v.partition("-")
|
|
51
|
+
nums: list[float] = []
|
|
52
|
+
for part in core.split("."):
|
|
53
|
+
try:
|
|
54
|
+
nums.append(float(part))
|
|
55
|
+
except ValueError:
|
|
56
|
+
nums.append(float("nan"))
|
|
57
|
+
return nums, prerelease
|
|
58
|
+
|
|
59
|
+
curr, lat = parse(current), parse(latest)
|
|
60
|
+
for i in range(3):
|
|
61
|
+
c = curr[0][i] if i < len(curr[0]) else 0
|
|
62
|
+
n = lat[0][i] if i < len(lat[0]) else 0
|
|
63
|
+
if n > c:
|
|
64
|
+
return 1
|
|
65
|
+
if n < c:
|
|
66
|
+
return -1
|
|
67
|
+
if not curr[1] and not lat[1]:
|
|
68
|
+
return 0
|
|
69
|
+
if not curr[1]:
|
|
70
|
+
return -1
|
|
71
|
+
if not lat[1]:
|
|
72
|
+
return 1
|
|
73
|
+
cs, ls = curr[1].split("."), lat[1].split(".")
|
|
74
|
+
for i in range(max(len(cs), len(ls))):
|
|
75
|
+
if i >= len(cs):
|
|
76
|
+
return 1
|
|
77
|
+
if i >= len(ls):
|
|
78
|
+
return -1
|
|
79
|
+
a, b = cs[i], ls[i]
|
|
80
|
+
if a.isdigit() and b.isdigit():
|
|
81
|
+
if int(b) > int(a):
|
|
82
|
+
return 1
|
|
83
|
+
if int(b) < int(a):
|
|
84
|
+
return -1
|
|
85
|
+
else:
|
|
86
|
+
if b > a:
|
|
87
|
+
return 1
|
|
88
|
+
if b < a:
|
|
89
|
+
return -1
|
|
90
|
+
return 0
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def compare_versions(current: str, latest: str) -> int:
|
|
94
|
+
"""1 if ``latest`` is newer, -1 if older, 0 if equal. PEP 440 when both parse, else semver."""
|
|
95
|
+
from packaging.version import InvalidVersion, Version
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
c, n = Version(current), Version(latest)
|
|
99
|
+
except InvalidVersion:
|
|
100
|
+
return _semver_compare(current, latest)
|
|
101
|
+
return 1 if n > c else -1 if n < c else 0
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def detect_install_method(prefix: str | None = None) -> InstallMethod:
|
|
105
|
+
"""pipx and ``uv tool`` keep each tool in its own venv under a recognisable directory."""
|
|
106
|
+
parts = [p.lower() for p in os.path.normpath(prefix or sys.prefix).split(os.sep)]
|
|
107
|
+
for i, part in enumerate(parts[:-1]):
|
|
108
|
+
if part == "venvs" and i > 0 and "pipx" in parts[i - 1]:
|
|
109
|
+
return "pipx"
|
|
110
|
+
if part == "tools" and i > 0 and parts[i - 1] == "uv":
|
|
111
|
+
return "uv"
|
|
112
|
+
return "pip"
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_install_command_display(method: InstallMethod | None = None) -> str:
|
|
116
|
+
method = method or detect_install_method()
|
|
117
|
+
if method == "pipx":
|
|
118
|
+
return f"pipx upgrade {PACKAGE_NAME}"
|
|
119
|
+
if method == "uv":
|
|
120
|
+
return f"uv tool upgrade {PACKAGE_NAME}"
|
|
121
|
+
return f"pip install -U {PACKAGE_NAME}"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _run_pip_install() -> None:
|
|
125
|
+
subprocess.run(PIP_INSTALL_ARGS, check=True)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@dataclass
|
|
129
|
+
class UpdateResult:
|
|
130
|
+
status: UpdateStatus
|
|
131
|
+
current_version: str
|
|
132
|
+
latest_version: str
|
|
133
|
+
install_command: str | None = None
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def handle_update(check_only: bool) -> UpdateResult:
|
|
137
|
+
latest = fetch_latest_version()
|
|
138
|
+
comparison = compare_versions(__version__, latest)
|
|
139
|
+
if comparison == 0:
|
|
140
|
+
return UpdateResult("up-to-date", __version__, latest)
|
|
141
|
+
if comparison < 0:
|
|
142
|
+
return UpdateResult("newer-local", __version__, latest)
|
|
143
|
+
if check_only:
|
|
144
|
+
return UpdateResult("update-available", __version__, latest)
|
|
145
|
+
method = detect_install_method()
|
|
146
|
+
if method != "pip":
|
|
147
|
+
return UpdateResult("manual-install", __version__, latest, get_install_command_display(method))
|
|
148
|
+
try:
|
|
149
|
+
_run_pip_install()
|
|
150
|
+
return UpdateResult("updated", __version__, latest)
|
|
151
|
+
except (OSError, subprocess.CalledProcessError):
|
|
152
|
+
return UpdateResult("update-failed", __version__, latest)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
__all__ = [
|
|
156
|
+
"PIP_INSTALL_ARGS",
|
|
157
|
+
"PYPI_URL",
|
|
158
|
+
"UpdateResult",
|
|
159
|
+
"compare_versions",
|
|
160
|
+
"detect_install_method",
|
|
161
|
+
"fetch_latest_version",
|
|
162
|
+
"get_install_command_display",
|
|
163
|
+
"handle_update",
|
|
164
|
+
]
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""`agentcore validate` (port of src/cli/commands/validate)."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
from rich.console import Console
|
|
8
|
+
|
|
9
|
+
from agentcore.lib.errors.types import (
|
|
10
|
+
ConfigNotFoundError,
|
|
11
|
+
ConfigParseError,
|
|
12
|
+
ConfigReadError,
|
|
13
|
+
ConfigValidationError,
|
|
14
|
+
NoProjectError,
|
|
15
|
+
)
|
|
16
|
+
from agentcore.lib.result import Err, Ok
|
|
17
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
18
|
+
from agentcore.lib.schemas.io.path_resolver import find_config_root
|
|
19
|
+
from agentcore.lib.utils.credentials import SecureCredentials
|
|
20
|
+
from agentcore.lib.utils.env import read_env_file
|
|
21
|
+
from agentcore.operations.deploy.preflight import validate_harness_specs # noqa: E402
|
|
22
|
+
from agentcore.primitives.credential_utils import (
|
|
23
|
+
compute_payment_credential_env_var_names,
|
|
24
|
+
compute_stripe_privy_credential_env_var_names,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
DESCRIPTION = "Validate agentcore/ config files."
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _expected_vars(connector) -> list[str]:
|
|
31
|
+
"""Env vars a manual payment connector needs in .env.local."""
|
|
32
|
+
if (connector.provider or "CoinbaseCDP") == "StripePrivy":
|
|
33
|
+
v = compute_stripe_privy_credential_env_var_names(connector.credential_name)
|
|
34
|
+
return [v.app_id, v.app_secret, v.authorization_private_key, v.authorization_id]
|
|
35
|
+
v = compute_payment_credential_env_var_names(connector.credential_name)
|
|
36
|
+
return [v.api_key_id, v.api_key_secret, v.wallet_secret]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _validate_payments(project_spec, config_root: str) -> Exception | None:
|
|
40
|
+
payments = project_spec.payments or []
|
|
41
|
+
if not payments:
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
credentials = {c.name: c for c in reversed(project_spec.credentials or [])} # first match wins
|
|
45
|
+
for payment in payments:
|
|
46
|
+
if not payment.connectors:
|
|
47
|
+
return Exception(
|
|
48
|
+
f'Payment manager "{payment.name}" has no connectors. Add a connector with '
|
|
49
|
+
f"`agentcore add payment-connector --manager {payment.name}`"
|
|
50
|
+
)
|
|
51
|
+
for connector in payment.connectors:
|
|
52
|
+
if connector.provision_mode == "QUICK_CREATE":
|
|
53
|
+
continue
|
|
54
|
+
credential = credentials.get(connector.credential_name)
|
|
55
|
+
if credential is None:
|
|
56
|
+
return Exception(
|
|
57
|
+
f'Payment connector "{connector.name}" (manager "{payment.name}") references credential '
|
|
58
|
+
f'"{connector.credential_name}" which does not exist.'
|
|
59
|
+
)
|
|
60
|
+
if credential.authorizer_type != "PaymentCredentialProvider":
|
|
61
|
+
return Exception(
|
|
62
|
+
f'Payment connector "{connector.name}" references credential "{connector.credential_name}" '
|
|
63
|
+
f'with type "{credential.authorizer_type}" — expected "PaymentCredentialProvider".'
|
|
64
|
+
)
|
|
65
|
+
connector_provider = connector.provider or "CoinbaseCDP"
|
|
66
|
+
credential_provider = getattr(credential, "provider", None)
|
|
67
|
+
if credential_provider and credential_provider != connector_provider:
|
|
68
|
+
return Exception(
|
|
69
|
+
f'Payment connector "{connector.name}" uses provider "{connector_provider}" but credential '
|
|
70
|
+
f'"{connector.credential_name}" is configured for "{credential_provider}".'
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
manual = [c for p in payments for c in p.connectors if c.provision_mode != "QUICK_CREATE"]
|
|
74
|
+
env_path = os.path.join(config_root, ".env.local")
|
|
75
|
+
if manual and not os.path.exists(env_path):
|
|
76
|
+
expected = "\n".join(f" {name}" for c in manual for name in _expected_vars(c))
|
|
77
|
+
return Exception(
|
|
78
|
+
f"agentcore/.env.local not found. Payment credentials required:\n{expected}\n\n"
|
|
79
|
+
"Run 'agentcore add payment-connector --manager <name>' to set credentials interactively."
|
|
80
|
+
)
|
|
81
|
+
if os.path.exists(env_path):
|
|
82
|
+
try:
|
|
83
|
+
creds = SecureCredentials.from_env_vars(read_env_file(config_root))
|
|
84
|
+
except Exception as exc: # noqa: BLE001
|
|
85
|
+
return Exception(
|
|
86
|
+
f"Failed to read .env.local: {exc}. Fix the file or re-run 'agentcore add payment-connector' "
|
|
87
|
+
"to set credentials."
|
|
88
|
+
)
|
|
89
|
+
for payment in payments:
|
|
90
|
+
for connector in payment.connectors:
|
|
91
|
+
if connector.provision_mode == "QUICK_CREATE":
|
|
92
|
+
continue
|
|
93
|
+
missing = [name for name in _expected_vars(connector) if not (creds.get(name) or "").strip()]
|
|
94
|
+
if missing:
|
|
95
|
+
provider = connector.provider or "CoinbaseCDP"
|
|
96
|
+
return Exception(
|
|
97
|
+
f'Missing {provider} credentials for connector "{connector.name}" in .env.local: '
|
|
98
|
+
+ ", ".join(missing)
|
|
99
|
+
)
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _format_error(err: Exception, file_name: str) -> str:
|
|
104
|
+
if isinstance(err, ConfigValidationError):
|
|
105
|
+
return str(err)
|
|
106
|
+
cause = err.__cause__ if err.__cause__ is not None else err
|
|
107
|
+
if isinstance(err, ConfigParseError):
|
|
108
|
+
return f"Invalid JSON in {file_name}: {cause}"
|
|
109
|
+
if isinstance(err, ConfigReadError):
|
|
110
|
+
return f"Failed to read {file_name}: {cause}"
|
|
111
|
+
if isinstance(err, ConfigNotFoundError):
|
|
112
|
+
return f"Required file not found: {file_name}"
|
|
113
|
+
return str(err)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def handle_validate(directory: str | None = None) -> Ok[None] | Err[Exception]:
|
|
117
|
+
config_root = find_config_root(directory or os.getcwd())
|
|
118
|
+
if not config_root:
|
|
119
|
+
return Err(NoProjectError())
|
|
120
|
+
|
|
121
|
+
io = ConfigIO(base_dir=config_root)
|
|
122
|
+
try:
|
|
123
|
+
project_spec = io.read_project_spec()
|
|
124
|
+
except Exception as exc: # noqa: BLE001
|
|
125
|
+
return Err(Exception(_format_error(exc, "agentcore.json")))
|
|
126
|
+
|
|
127
|
+
if payment_error := _validate_payments(project_spec, config_root):
|
|
128
|
+
return Err(payment_error)
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
io.read_aws_deployment_targets()
|
|
132
|
+
except Exception as exc: # noqa: BLE001
|
|
133
|
+
return Err(Exception(_format_error(exc, "aws-targets.json")))
|
|
134
|
+
|
|
135
|
+
if io.config_exists("state"):
|
|
136
|
+
try:
|
|
137
|
+
io.read_deployed_state()
|
|
138
|
+
except Exception as exc: # noqa: BLE001
|
|
139
|
+
return Err(Exception(_format_error(exc, ".cli/state.json")))
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
validate_harness_specs(project_spec, config_root)
|
|
143
|
+
except Exception as exc: # noqa: BLE001
|
|
144
|
+
return Err(exc)
|
|
145
|
+
|
|
146
|
+
return Ok(None)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def register(app: typer.Typer) -> None:
|
|
150
|
+
@app.command("validate", help=DESCRIPTION)
|
|
151
|
+
def validate(
|
|
152
|
+
directory: str | None = typer.Option(
|
|
153
|
+
None, "-d", "--directory", help="Project directory containing agentcore config"
|
|
154
|
+
),
|
|
155
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
156
|
+
) -> None:
|
|
157
|
+
result = handle_validate(directory)
|
|
158
|
+
if as_json:
|
|
159
|
+
payload = {"success": True} if result.success else {"success": False, "error": str(result.error)}
|
|
160
|
+
typer.echo(json.dumps(payload, separators=(",", ":")))
|
|
161
|
+
elif result.success:
|
|
162
|
+
Console().print("[green]Valid[/green]")
|
|
163
|
+
else:
|
|
164
|
+
Console().print(str(result.error), style="red", markup=False, highlight=False, soft_wrap=True)
|
|
165
|
+
raise typer.Exit(0 if result.success else 1)
|