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
agentcore/cli/groups.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Shared command groups (`run`, `pause`, `logs`, ...).
|
|
2
|
+
|
|
3
|
+
Groups whose subcommands come from several feature areas are created once here; any command
|
|
4
|
+
module attaches to them with ``group("run").command("eval")(...)``. `cli/main.py` mounts every
|
|
5
|
+
group created this way.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
from agentcore.cli.tree import GROUPS
|
|
11
|
+
|
|
12
|
+
_groups: dict[str, typer.Typer] = {}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def group(name: str) -> typer.Typer:
|
|
16
|
+
if name not in _groups:
|
|
17
|
+
help_text = GROUPS[name][0] if name in GROUPS else None
|
|
18
|
+
_groups[name] = typer.Typer(help=help_text, no_args_is_help=True)
|
|
19
|
+
return _groups[name]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def created_groups() -> dict[str, typer.Typer]:
|
|
23
|
+
return dict(_groups)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""Interactive prompts that replace upstream's Ink TUI screens.
|
|
2
|
+
|
|
3
|
+
Upstream runs a full-screen wizard when a command gets no flags. The Python port asks the
|
|
4
|
+
same questions as sequential prompts. Every prompt exits cleanly (code 130) on Ctrl-C/Esc.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from collections.abc import Callable, Sequence
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Any, TypeVar
|
|
11
|
+
|
|
12
|
+
import questionary
|
|
13
|
+
import typer
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def require_tty() -> None:
|
|
19
|
+
"""Port of tui/guards/tty.ts: interactive flows must not hang in CI or piped stdin."""
|
|
20
|
+
if not sys.stdin.isatty() or not sys.stdout.isatty():
|
|
21
|
+
typer.echo(
|
|
22
|
+
"Error: This command requires an interactive terminal. Use --help to see non-interactive flags.",
|
|
23
|
+
err=True,
|
|
24
|
+
)
|
|
25
|
+
raise typer.Exit(1)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _answer(question: questionary.Question) -> Any:
|
|
29
|
+
value = question.ask()
|
|
30
|
+
if value is None: # questionary returns None on Ctrl-C / Esc
|
|
31
|
+
raise typer.Exit(130)
|
|
32
|
+
return value
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class Choice:
|
|
37
|
+
title: str
|
|
38
|
+
value: Any
|
|
39
|
+
description: str | None = None
|
|
40
|
+
disabled: str | None = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def select(message: str, choices: Sequence[Choice | str], default: Any = None) -> Any:
|
|
44
|
+
qchoices = [
|
|
45
|
+
c
|
|
46
|
+
if isinstance(c, str)
|
|
47
|
+
else questionary.Choice(c.title, value=c.value, description=c.description, disabled=c.disabled)
|
|
48
|
+
for c in choices
|
|
49
|
+
]
|
|
50
|
+
return _answer(questionary.select(message, choices=qchoices, default=default))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def checkbox(message: str, choices: Sequence[Choice | str], checked: Sequence[Any] = ()) -> list[Any]:
|
|
54
|
+
qchoices = [
|
|
55
|
+
questionary.Choice(c, value=c, checked=c in checked)
|
|
56
|
+
if isinstance(c, str)
|
|
57
|
+
else questionary.Choice(c.title, value=c.value, description=c.description, checked=c.value in checked)
|
|
58
|
+
for c in choices
|
|
59
|
+
]
|
|
60
|
+
return _answer(questionary.checkbox(message, choices=qchoices))
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def text(
|
|
64
|
+
message: str,
|
|
65
|
+
default: str = "",
|
|
66
|
+
validate: Callable[[str], str | None] | None = None,
|
|
67
|
+
secret: bool = False,
|
|
68
|
+
) -> str:
|
|
69
|
+
"""``validate`` returns an error message, or None when the value is acceptable."""
|
|
70
|
+
|
|
71
|
+
def _validate(value: str) -> bool | str:
|
|
72
|
+
if validate is None:
|
|
73
|
+
return True
|
|
74
|
+
error = validate(value)
|
|
75
|
+
return True if error is None else error
|
|
76
|
+
|
|
77
|
+
prompt = questionary.password if secret else questionary.text
|
|
78
|
+
kwargs: dict[str, Any] = {"validate": _validate}
|
|
79
|
+
if not secret:
|
|
80
|
+
kwargs["default"] = default
|
|
81
|
+
return _answer(prompt(message, **kwargs))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def confirm(message: str, default: bool = False) -> bool:
|
|
85
|
+
return _answer(questionary.confirm(message, default=default))
|
agentcore/cli/main.py
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Entry point for the `agentcore` command (port of src/cli/cli.ts).
|
|
2
|
+
|
|
3
|
+
Commands are discovered: every module in ``agentcore.cli.commands`` that defines
|
|
4
|
+
``register(app)`` is registered, and add/remove subcommands come from the primitive registry.
|
|
5
|
+
Anything in ``agentcore.cli.tree`` still unregistered after that becomes a stub.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import importlib
|
|
9
|
+
import pkgutil
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
|
|
14
|
+
import agentcore.cli.commands as commands_package
|
|
15
|
+
from agentcore import __version__
|
|
16
|
+
from agentcore.cli.groups import created_groups
|
|
17
|
+
from agentcore.cli.tree import GROUPS, PROGRAM_DESCRIPTION, RESOURCE_KINDS, TOP_LEVEL
|
|
18
|
+
from agentcore.primitives.registry import all_primitives
|
|
19
|
+
|
|
20
|
+
err = Console(stderr=True)
|
|
21
|
+
|
|
22
|
+
# Unported stubs accept any arguments so `--help` and argument parsing never get in the way.
|
|
23
|
+
STUB_SETTINGS = {"allow_extra_args": True, "ignore_unknown_options": True}
|
|
24
|
+
|
|
25
|
+
app = typer.Typer(
|
|
26
|
+
name="agentcore",
|
|
27
|
+
help=PROGRAM_DESCRIPTION,
|
|
28
|
+
no_args_is_help=True,
|
|
29
|
+
context_settings={"help_option_names": ["-h", "--help"]},
|
|
30
|
+
# Upstream help text uses literal "[non-interactive]" tags, which Rich markup would swallow.
|
|
31
|
+
rich_markup_mode=None,
|
|
32
|
+
)
|
|
33
|
+
add_app = typer.Typer(help="Add resources to project config.", no_args_is_help=True)
|
|
34
|
+
remove_app = typer.Typer(help="Remove resources from project config.", no_args_is_help=True)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _stub(path: str):
|
|
38
|
+
def command(ctx: typer.Context) -> None:
|
|
39
|
+
err.print(f"[yellow]`agentcore {path}` is not ported to Python yet.[/yellow]")
|
|
40
|
+
raise typer.Exit(2)
|
|
41
|
+
|
|
42
|
+
return command
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _command_names(typer_app: typer.Typer) -> set[str]:
|
|
46
|
+
names = {c.name for c in typer_app.registered_commands if c.name}
|
|
47
|
+
return names | {g.name for g in typer_app.registered_groups if g.name}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _group(typer_app: typer.Typer, name: str) -> typer.Typer | None:
|
|
51
|
+
for info in typer_app.registered_groups:
|
|
52
|
+
if info.name == name:
|
|
53
|
+
return info.typer_instance
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _register_commands() -> None:
|
|
58
|
+
for info in sorted(pkgutil.iter_modules(commands_package.__path__), key=lambda m: m.name):
|
|
59
|
+
if info.name.startswith("_"):
|
|
60
|
+
continue
|
|
61
|
+
module = importlib.import_module(f"{commands_package.__name__}.{info.name}")
|
|
62
|
+
register = getattr(module, "register", None)
|
|
63
|
+
if callable(register):
|
|
64
|
+
register(app)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _register_primitives() -> None:
|
|
68
|
+
from agentcore.cli.commands.add import install_add_shell
|
|
69
|
+
from agentcore.cli.commands.remove import install_remove_shell
|
|
70
|
+
|
|
71
|
+
# Bare `agentcore add` / `agentcore remove` menus and `remove all`.
|
|
72
|
+
install_add_shell(add_app)
|
|
73
|
+
install_remove_shell(remove_app)
|
|
74
|
+
for primitive in all_primitives():
|
|
75
|
+
primitive.register_commands(add_app, remove_app)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _stub_missing(typer_app: typer.Typer, prefix: str, commands: dict[str, str]) -> None:
|
|
79
|
+
existing = _command_names(typer_app)
|
|
80
|
+
for name, help_text in commands.items():
|
|
81
|
+
if name not in existing:
|
|
82
|
+
path = f"{prefix} {name}".strip()
|
|
83
|
+
typer_app.command(name, help=help_text, context_settings=STUB_SETTINGS)(_stub(path))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _register_stubs() -> None:
|
|
87
|
+
_stub_missing(app, "", TOP_LEVEL)
|
|
88
|
+
|
|
89
|
+
taken = _command_names(app)
|
|
90
|
+
for group, (help_text, subcommands) in GROUPS.items():
|
|
91
|
+
if group in taken:
|
|
92
|
+
# A partly ported group gets stubs for just its missing subcommands.
|
|
93
|
+
if (sub := _group(app, group)) is not None:
|
|
94
|
+
_stub_missing(sub, group, subcommands)
|
|
95
|
+
continue
|
|
96
|
+
if not subcommands:
|
|
97
|
+
_stub_missing(app, "", {group: help_text})
|
|
98
|
+
continue
|
|
99
|
+
sub = typer.Typer(help=help_text, no_args_is_help=True)
|
|
100
|
+
_stub_missing(sub, group, subcommands)
|
|
101
|
+
app.add_typer(sub, name=group)
|
|
102
|
+
|
|
103
|
+
labels = {kind: ("an" if label[0] in "aeiou" else "a", label) for kind, label in RESOURCE_KINDS.items()}
|
|
104
|
+
_stub_missing(add_app, "add", {k: f"Add {a} {label} to the project" for k, (a, label) in labels.items()})
|
|
105
|
+
_stub_missing(
|
|
106
|
+
remove_app,
|
|
107
|
+
"remove",
|
|
108
|
+
{k: f"Remove {a} {label} from the project" for k, (a, label) in labels.items()}
|
|
109
|
+
| {"all": "Remove all resources from the project"},
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _version_callback(value: bool) -> None:
|
|
114
|
+
if value:
|
|
115
|
+
typer.echo(__version__)
|
|
116
|
+
raise typer.Exit()
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@app.callback()
|
|
120
|
+
def main(
|
|
121
|
+
version: bool = typer.Option(
|
|
122
|
+
False, "--version", "-V", callback=_version_callback, is_eager=True, help="Show version"
|
|
123
|
+
),
|
|
124
|
+
) -> None:
|
|
125
|
+
# Background update check, with its notice printed at exit (upstream checkForUpdate in cli.ts).
|
|
126
|
+
from agentcore.cli.notices import install_post_command_notices
|
|
127
|
+
|
|
128
|
+
install_post_command_notices()
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
_register_commands()
|
|
132
|
+
_register_primitives()
|
|
133
|
+
for _name, _group_app in created_groups().items():
|
|
134
|
+
app.add_typer(_group_app, name=_name)
|
|
135
|
+
app.add_typer(add_app, name="add")
|
|
136
|
+
app.add_typer(remove_app, name="remove")
|
|
137
|
+
_register_stubs()
|
agentcore/cli/naming.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Wizard naming helpers (port of src/cli/tui/utils/naming.ts)."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def generate_unique_name(base_name: str, existing_names: list[str], separator: str = "") -> str:
|
|
5
|
+
"""Append a numeric suffix when needed: MyAgent -> MyAgent1 -> MyAgent2."""
|
|
6
|
+
if base_name not in existing_names:
|
|
7
|
+
return base_name
|
|
8
|
+
counter = 1
|
|
9
|
+
while f"{base_name}{separator}{counter}" in existing_names:
|
|
10
|
+
counter += 1
|
|
11
|
+
return f"{base_name}{separator}{counter}"
|
agentcore/cli/notices.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Post-command notices (port of src/cli/notices.ts).
|
|
2
|
+
|
|
3
|
+
The telemetry notice is not ported (telemetry is out of scope for the Python port).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import atexit
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
from agentcore.cli.update_notifier import BackgroundUpdateCheck, print_update_notification, should_check_for_updates
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def print_post_command_notices(update_check: BackgroundUpdateCheck | None) -> None:
|
|
16
|
+
result = update_check.result() if update_check is not None else None
|
|
17
|
+
if result is not None and result.update_available:
|
|
18
|
+
print_update_notification(result)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
_installed = False
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def install_post_command_notices(argv: list[str] | None = None) -> BackgroundUpdateCheck | None:
|
|
25
|
+
"""Start the background update check now and print its notice when the process exits.
|
|
26
|
+
|
|
27
|
+
Only for a real ``agentcore`` invocation (the console script), never on import from tests or
|
|
28
|
+
other programs, and never when ``AGENTCORE_DISABLE_UPDATE_CHECK`` is set.
|
|
29
|
+
"""
|
|
30
|
+
global _installed
|
|
31
|
+
argv = list(sys.argv if argv is None else argv)
|
|
32
|
+
if _installed or not argv or os.path.basename(argv[0]) not in ("agentcore", "agentcore.exe"):
|
|
33
|
+
return None
|
|
34
|
+
if not should_check_for_updates(argv):
|
|
35
|
+
return None
|
|
36
|
+
_installed = True
|
|
37
|
+
check = BackgroundUpdateCheck().start()
|
|
38
|
+
atexit.register(print_post_command_notices, check)
|
|
39
|
+
return check
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
__all__ = ["install_post_command_notices", "print_post_command_notices"]
|
agentcore/cli/project.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Default project spec (port of ``src/cli/project.ts``)."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from agentcore.cli.constants import SCHEMA_VERSION
|
|
6
|
+
from agentcore.lib import get_schema_url_for_version
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_default_project_spec(project_name: str) -> dict[str, Any]:
|
|
10
|
+
"""Create a default AgentCore project spec (camelCase JSON dict) with standard defaults."""
|
|
11
|
+
return {
|
|
12
|
+
"$schema": get_schema_url_for_version(SCHEMA_VERSION),
|
|
13
|
+
"name": project_name,
|
|
14
|
+
"version": SCHEMA_VERSION,
|
|
15
|
+
"managedBy": "CDK",
|
|
16
|
+
"runtimes": [],
|
|
17
|
+
"memories": [],
|
|
18
|
+
"knowledgeBases": [],
|
|
19
|
+
"credentials": [],
|
|
20
|
+
"evaluators": [],
|
|
21
|
+
"onlineEvalConfigs": [],
|
|
22
|
+
"agentCoreGateways": [],
|
|
23
|
+
"policyEngines": [],
|
|
24
|
+
"harnesses": [],
|
|
25
|
+
"configBundles": [],
|
|
26
|
+
"abTests": [],
|
|
27
|
+
"datasets": [],
|
|
28
|
+
"payments": [],
|
|
29
|
+
"capacityProviders": [],
|
|
30
|
+
"tags": {
|
|
31
|
+
"agentcore:created-by": "agentcore-cli",
|
|
32
|
+
"agentcore:project-name": project_name,
|
|
33
|
+
},
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Port of ``runCliCommand`` (src/cli/telemetry/cli-command-run.ts) without telemetry.
|
|
2
|
+
|
|
3
|
+
Runs a non-interactive command body; on any exception prints ``{"success":false,"error":...}``
|
|
4
|
+
(with ``--json``) or the message on stderr, and exits 1. Exits 0 on success.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
from collections.abc import Callable
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
|
|
13
|
+
from agentcore.cli.errors import get_error_message
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def run_cli_command(as_json: bool, fn: Callable[[], Any]) -> None:
|
|
17
|
+
try:
|
|
18
|
+
fn()
|
|
19
|
+
except typer.Exit:
|
|
20
|
+
raise
|
|
21
|
+
except Exception as exc: # noqa: BLE001 - top-level command boundary, as upstream
|
|
22
|
+
if as_json:
|
|
23
|
+
typer.echo(json.dumps({"success": False, "error": get_error_message(exc)}, separators=(",", ":")))
|
|
24
|
+
else:
|
|
25
|
+
typer.echo(get_error_message(exc), err=True)
|
|
26
|
+
raise typer.Exit(1) from None
|
|
27
|
+
raise typer.Exit(0)
|
agentcore/cli/tree.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""Declarative map of the upstream command tree (src/cli/commands, src/cli/primitives).
|
|
2
|
+
|
|
3
|
+
Commands not yet ported are registered from this table as stubs so `--help` shows the full
|
|
4
|
+
surface. When a command is ported, register it in its own module under `cli/commands/`
|
|
5
|
+
and drop it from here.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# Mirrors COMMAND_DESCRIPTIONS in src/cli/constants.ts.
|
|
9
|
+
PROGRAM_DESCRIPTION = "Build and deploy Agentic AI applications on AgentCore"
|
|
10
|
+
|
|
11
|
+
TOP_LEVEL: dict[str, str] = {
|
|
12
|
+
"create": "Create a new AgentCore project",
|
|
13
|
+
"dev": "Launch local dev server, or invoke an agent locally.",
|
|
14
|
+
"deploy": "Deploy project infrastructure to AWS via CDK.",
|
|
15
|
+
"exec": "Open an interactive shell or run a one-shot command in a deployed agent container.",
|
|
16
|
+
"invoke": "Invoke a deployed agent endpoint.",
|
|
17
|
+
"package": "Package agent artifacts without deploying.",
|
|
18
|
+
"status": "Show deployed resource details and status.",
|
|
19
|
+
"feedback": "Send feedback about the AgentCore CLI to the team.",
|
|
20
|
+
"view": "View A/B test or insights jobs.",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
GROUPS: dict[str, tuple[str, dict[str, str]]] = {
|
|
24
|
+
"archive": (
|
|
25
|
+
"Archive (delete) a batch evaluation or recommendation on the service and clear local history.",
|
|
26
|
+
{
|
|
27
|
+
"batch-evaluation": "Archive a batch evaluation.",
|
|
28
|
+
"recommendation": "Archive a recommendation.",
|
|
29
|
+
"ab-test": "Delete an A/B test on the service and clear local history.",
|
|
30
|
+
"insights": "Delete an insights job on the service and clear local history.",
|
|
31
|
+
},
|
|
32
|
+
),
|
|
33
|
+
"batch-evaluations": ("View batch evaluation history.", {"history": "View past batch evaluation runs."}),
|
|
34
|
+
"capacity-provider": (
|
|
35
|
+
"Manage capacity provider sessions.",
|
|
36
|
+
{"delete-session": "Delete a capacity provider session."},
|
|
37
|
+
),
|
|
38
|
+
"config-bundle": (
|
|
39
|
+
"Manage configuration bundle versions and diffs.",
|
|
40
|
+
{
|
|
41
|
+
"versions": "List version history for a bundle.",
|
|
42
|
+
"diff": "Diff two versions of a bundle.",
|
|
43
|
+
"create-branch": "Create a new branch on an existing bundle.",
|
|
44
|
+
},
|
|
45
|
+
),
|
|
46
|
+
"dataset": (
|
|
47
|
+
"Manage dataset versions.",
|
|
48
|
+
{
|
|
49
|
+
"download": "Download a dataset version locally.",
|
|
50
|
+
"publish-version": "Publish a new dataset version.",
|
|
51
|
+
"remove-version": "Remove a dataset version.",
|
|
52
|
+
},
|
|
53
|
+
),
|
|
54
|
+
"evals": ("View saved eval and batch eval results from past runs.", {"history": "View past eval runs."}),
|
|
55
|
+
"export": ("Export a harness to a Strands runtime agent.", {"harness": "Export a harness config to app/."}),
|
|
56
|
+
"fetch": ("Fetch access info for deployed resources.", {"access": "Fetch access info for a deployed resource."}),
|
|
57
|
+
"help": ("Show help topics.", {"modes": "Explain interactive vs non-interactive modes."}),
|
|
58
|
+
"import": (
|
|
59
|
+
"Import a runtime, memory, or starter toolkit into this project. [experimental]",
|
|
60
|
+
{
|
|
61
|
+
"runtime": "Import an existing runtime.",
|
|
62
|
+
"memory": "Import an existing memory.",
|
|
63
|
+
"gateway": "Import an existing gateway.",
|
|
64
|
+
"evaluator": "Import an existing evaluator.",
|
|
65
|
+
"online-eval": "Import an existing online eval config.",
|
|
66
|
+
},
|
|
67
|
+
),
|
|
68
|
+
"logs": ("Stream or search agent runtime logs.", {"evals": "Stream or search online eval logs."}),
|
|
69
|
+
"pause": (
|
|
70
|
+
"Pause a deployed resource (online eval config, A/B test).",
|
|
71
|
+
{
|
|
72
|
+
"online-eval": "Pause a deployed online eval config.",
|
|
73
|
+
"ab-test": "Pause traffic splitting for a running A/B test.",
|
|
74
|
+
"online-insights": "Pause a deployed online insights config.",
|
|
75
|
+
},
|
|
76
|
+
),
|
|
77
|
+
"promote": ("Promote a winning variant.", {"ab-test": "Apply the winning A/B variant to agentcore.json."}),
|
|
78
|
+
"recommendations": (
|
|
79
|
+
"View recommendation history from past runs.",
|
|
80
|
+
{"history": "View past recommendation runs."},
|
|
81
|
+
),
|
|
82
|
+
"resume": (
|
|
83
|
+
"Resume a paused resource (online eval config, A/B test).",
|
|
84
|
+
{
|
|
85
|
+
"online-eval": "Resume a paused online eval config.",
|
|
86
|
+
"ab-test": "Resume a paused A/B test.",
|
|
87
|
+
"online-insights": "Resume a paused online insights config.",
|
|
88
|
+
},
|
|
89
|
+
),
|
|
90
|
+
"run": (
|
|
91
|
+
"Run evaluations, batch evaluations, or optimization recommendations.",
|
|
92
|
+
{
|
|
93
|
+
"eval": "Run on-demand evaluation against agent traces.",
|
|
94
|
+
"batch-evaluation": "Run evaluators across all sessions.",
|
|
95
|
+
"insights": "Run on-demand failure analysis across recent sessions.",
|
|
96
|
+
"recommendation": "Optimize prompts and tool descriptions.",
|
|
97
|
+
"ingest": "Ingest knowledge base data sources.",
|
|
98
|
+
"ab-test": "Start an A/B test on a gateway.",
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
"stop": (
|
|
102
|
+
"Stop a running batch evaluation or A/B test.",
|
|
103
|
+
{"ab-test": "Stop a running A/B test.", "batch-evaluation": "Stop a running batch evaluation."},
|
|
104
|
+
),
|
|
105
|
+
"traces": (
|
|
106
|
+
"View and download agent traces.",
|
|
107
|
+
{"list": "List recent traces for a deployed agent.", "get": "Download a trace to a JSON file."},
|
|
108
|
+
),
|
|
109
|
+
"update": ("Check for and install CLI updates", {"cli": "Update the CLI."}),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# Resource kinds registered by src/cli/primitives/registry.ts (ALL_PRIMITIVES), plus the
|
|
113
|
+
# standalone `add/remove tool|skill` commands.
|
|
114
|
+
RESOURCE_KINDS: dict[str, str] = {
|
|
115
|
+
"agent": "agent",
|
|
116
|
+
"harness": "harness",
|
|
117
|
+
"memory": "memory",
|
|
118
|
+
"dataset": "dataset",
|
|
119
|
+
"credential": "credential",
|
|
120
|
+
"evaluator": "evaluator",
|
|
121
|
+
"online-eval": "online eval config",
|
|
122
|
+
"online-insights": "online insights config",
|
|
123
|
+
"gateway": "gateway",
|
|
124
|
+
"gateway-target": "gateway target",
|
|
125
|
+
"knowledge-base": "knowledge base",
|
|
126
|
+
"policy-engine": "policy engine",
|
|
127
|
+
"policy": "policy",
|
|
128
|
+
"config-bundle": "config bundle",
|
|
129
|
+
"runtime-endpoint": "runtime endpoint",
|
|
130
|
+
"payment-manager": "payment manager",
|
|
131
|
+
"payment-connector": "payment connector",
|
|
132
|
+
"capacity-provider": "capacity provider",
|
|
133
|
+
"tool": "harness tool",
|
|
134
|
+
"skill": "harness skill",
|
|
135
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Background update check (port of src/cli/update-notifier.ts).
|
|
2
|
+
|
|
3
|
+
Deliberate deviation: this port is distributed on PyPI as ``agentcore-cli``, so the latest version
|
|
4
|
+
comes from ``https://pypi.org/pypi/agentcore-cli/json`` and the suggested install command is
|
|
5
|
+
pip / pipx / uv tool depending on how the CLI was installed. The cache file and its one-day check
|
|
6
|
+
interval match upstream. Set ``AGENTCORE_DISABLE_UPDATE_CHECK=1`` to skip the background check.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import sys
|
|
14
|
+
import threading
|
|
15
|
+
import time
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
|
|
18
|
+
from agentcore import __version__
|
|
19
|
+
from agentcore.lib.time_constants import ONE_DAY_MS
|
|
20
|
+
|
|
21
|
+
CHECK_INTERVAL_MS = ONE_DAY_MS
|
|
22
|
+
CACHE_FILE = "update-check.json"
|
|
23
|
+
DISABLE_ENV = "AGENTCORE_DISABLE_UPDATE_CHECK"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_config_dir() -> str:
|
|
27
|
+
return os.environ.get("AGENTCORE_CONFIG_DIR") or os.path.join(os.path.expanduser("~"), ".agentcore")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class UpdateCheckResult:
|
|
32
|
+
update_available: bool
|
|
33
|
+
latest_version: str
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _read_cache() -> dict | None:
|
|
37
|
+
try:
|
|
38
|
+
with open(os.path.join(get_config_dir(), CACHE_FILE), encoding="utf-8") as fh:
|
|
39
|
+
data = json.load(fh)
|
|
40
|
+
return data if isinstance(data, dict) else None
|
|
41
|
+
except (OSError, ValueError):
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _write_cache(data: dict) -> None:
|
|
46
|
+
try:
|
|
47
|
+
directory = get_config_dir()
|
|
48
|
+
os.makedirs(directory, exist_ok=True)
|
|
49
|
+
with open(os.path.join(directory, CACHE_FILE), "w", encoding="utf-8") as fh:
|
|
50
|
+
fh.write(json.dumps(data, separators=(",", ":")))
|
|
51
|
+
except OSError:
|
|
52
|
+
pass # silently ignore cache write failures
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _now_ms() -> int:
|
|
56
|
+
return int(time.time() * 1000)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def check_for_update() -> UpdateCheckResult | None:
|
|
60
|
+
"""Cached for a day; ``None`` on any failure."""
|
|
61
|
+
from agentcore.cli.commands.update.action import compare_versions, fetch_latest_version
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
cache = _read_cache()
|
|
65
|
+
now = _now_ms()
|
|
66
|
+
if cache and isinstance(cache.get("lastCheck"), (int, float)) and now - cache["lastCheck"] < CHECK_INTERVAL_MS:
|
|
67
|
+
latest = str(cache["latestVersion"])
|
|
68
|
+
return UpdateCheckResult(compare_versions(__version__, latest) > 0, latest)
|
|
69
|
+
latest = fetch_latest_version()
|
|
70
|
+
_write_cache({"lastCheck": now, "latestVersion": latest})
|
|
71
|
+
return UpdateCheckResult(compare_versions(__version__, latest) > 0, latest)
|
|
72
|
+
except Exception: # noqa: BLE001
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def print_update_notification(result: UpdateCheckResult) -> None:
|
|
77
|
+
from agentcore.cli.commands.update.action import get_install_command_display
|
|
78
|
+
from agentcore.cli.constants import ANSI
|
|
79
|
+
|
|
80
|
+
yellow, cyan, reset = ANSI.yellow, ANSI.cyan, ANSI.reset
|
|
81
|
+
sys.stderr.write(
|
|
82
|
+
f"\n{yellow}Update available:{reset} {__version__} → {cyan}{result.latest_version}{reset}\n"
|
|
83
|
+
f"Run {cyan}`{get_install_command_display()}`{reset} to update.\n"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class BackgroundUpdateCheck:
|
|
88
|
+
"""Non-blocking ``checkForUpdate()`` promise: started before the command, awaited after it."""
|
|
89
|
+
|
|
90
|
+
def __init__(self) -> None:
|
|
91
|
+
self._result: UpdateCheckResult | None = None
|
|
92
|
+
self._thread = threading.Thread(target=self._run, name="agentcore-update-check", daemon=True)
|
|
93
|
+
|
|
94
|
+
def _run(self) -> None:
|
|
95
|
+
self._result = check_for_update()
|
|
96
|
+
|
|
97
|
+
def start(self) -> BackgroundUpdateCheck:
|
|
98
|
+
self._thread.start()
|
|
99
|
+
return self
|
|
100
|
+
|
|
101
|
+
def result(self, timeout: float | None = 5.0) -> UpdateCheckResult | None:
|
|
102
|
+
self._thread.join(timeout)
|
|
103
|
+
return None if self._thread.is_alive() else self._result
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def should_check_for_updates(argv: list[str]) -> bool:
|
|
107
|
+
"""Upstream skips the check for `update` itself; --help/--version exit before notices print."""
|
|
108
|
+
if os.environ.get(DISABLE_ENV):
|
|
109
|
+
return False
|
|
110
|
+
args = argv[1:]
|
|
111
|
+
if args and args[0] == "update":
|
|
112
|
+
return False
|
|
113
|
+
return not any(a in ("-h", "--help", "-V", "--version") for a in args)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
__all__ = [
|
|
117
|
+
"CHECK_INTERVAL_MS",
|
|
118
|
+
"BackgroundUpdateCheck",
|
|
119
|
+
"UpdateCheckResult",
|
|
120
|
+
"check_for_update",
|
|
121
|
+
"print_update_notification",
|
|
122
|
+
"should_check_for_updates",
|
|
123
|
+
]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Commander-style variadic options (``-e a b c``) for Typer commands.
|
|
2
|
+
|
|
3
|
+
Commander's ``.option('-e, --evaluator <names...>')`` consumes every following argument up to the
|
|
4
|
+
next option-looking token. Click only supports repeating the flag (``-e a -e b``). ``variadic(...)``
|
|
5
|
+
returns a command class that rewrites ``-e a b c`` into ``-e a -e b -e c`` before Click parses, so
|
|
6
|
+
both spellings work.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Iterable
|
|
10
|
+
|
|
11
|
+
from typer.core import TyperCommand
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def expand_variadic(args: list[str], flags: frozenset[str]) -> list[str]:
|
|
15
|
+
out: list[str] = []
|
|
16
|
+
i = 0
|
|
17
|
+
while i < len(args):
|
|
18
|
+
arg = args[i]
|
|
19
|
+
if arg == "--":
|
|
20
|
+
out.extend(args[i:])
|
|
21
|
+
break
|
|
22
|
+
if arg in flags:
|
|
23
|
+
i += 1
|
|
24
|
+
values = []
|
|
25
|
+
while i < len(args) and not (args[i].startswith("-") and len(args[i]) > 1):
|
|
26
|
+
values.append(args[i])
|
|
27
|
+
i += 1
|
|
28
|
+
if not values:
|
|
29
|
+
out.append(arg) # let Click report the missing value
|
|
30
|
+
for value in values:
|
|
31
|
+
out += [arg, value]
|
|
32
|
+
continue
|
|
33
|
+
out.append(arg)
|
|
34
|
+
i += 1
|
|
35
|
+
return out
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def variadic(*flags: str) -> type[TyperCommand]:
|
|
39
|
+
"""A TyperCommand subclass treating ``flags`` as variadic options."""
|
|
40
|
+
flag_set = frozenset(flags)
|
|
41
|
+
|
|
42
|
+
class VariadicCommand(TyperCommand):
|
|
43
|
+
def parse_args(self, ctx, args: list[str]): # type: ignore[no-untyped-def]
|
|
44
|
+
return super().parse_args(ctx, expand_variadic(list(args), flag_set))
|
|
45
|
+
|
|
46
|
+
return VariadicCommand
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def flags_of(*groups: Iterable[str]) -> tuple[str, ...]:
|
|
50
|
+
return tuple(f for g in groups for f in g)
|