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,154 @@
|
|
|
1
|
+
"""JWT authorizer flag validation (port of src/cli/commands/add/auth-options.ts).
|
|
2
|
+
|
|
3
|
+
``options`` is a dict keyed by upstream option names (discoveryUrl, allowedAudience, ...).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Any
|
|
7
|
+
from urllib.parse import urlsplit
|
|
8
|
+
|
|
9
|
+
from agentcore.cli.commands.add._common import ValidationResult, first_issue, js_url_ok, parse_json
|
|
10
|
+
from agentcore.schema import CustomClaimValidation, PrivateEndpoint, PrivateEndpointOverride
|
|
11
|
+
|
|
12
|
+
OIDC_WELL_KNOWN_SUFFIX = "/.well-known/openid-configuration"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _s(options: dict[str, Any], key: str) -> str:
|
|
16
|
+
value = options.get(key)
|
|
17
|
+
return value.strip() if isinstance(value, str) else ""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def validate_jwt_authorizer_options(options: dict[str, Any]) -> ValidationResult:
|
|
21
|
+
discovery_url = options.get("discoveryUrl")
|
|
22
|
+
if not discovery_url:
|
|
23
|
+
return ValidationResult(False, "--discovery-url is required for CUSTOM_JWT authorizer")
|
|
24
|
+
if not js_url_ok(discovery_url):
|
|
25
|
+
return ValidationResult(False, "Discovery URL must be a valid URL")
|
|
26
|
+
if urlsplit(discovery_url).scheme.lower() != "https":
|
|
27
|
+
return ValidationResult(False, "Discovery URL must use HTTPS")
|
|
28
|
+
if not discovery_url.endswith(OIDC_WELL_KNOWN_SUFFIX):
|
|
29
|
+
return ValidationResult(False, f"Discovery URL must end with {OIDC_WELL_KNOWN_SUFFIX}")
|
|
30
|
+
|
|
31
|
+
custom_claims = options.get("customClaims")
|
|
32
|
+
if custom_claims:
|
|
33
|
+
ok, parsed = parse_json(custom_claims)
|
|
34
|
+
if not ok:
|
|
35
|
+
return ValidationResult(False, "--custom-claims must be valid JSON")
|
|
36
|
+
if not isinstance(parsed, list) or len(parsed) == 0:
|
|
37
|
+
return ValidationResult(False, "--custom-claims must be a non-empty JSON array")
|
|
38
|
+
for i, entry in enumerate(parsed):
|
|
39
|
+
issue = first_issue(CustomClaimValidation, entry)
|
|
40
|
+
if issue:
|
|
41
|
+
return ValidationResult(False, f"Invalid custom claim at index {i}: {issue}")
|
|
42
|
+
|
|
43
|
+
if not any(_s(options, k) for k in ("allowedAudience", "allowedClients", "allowedScopes", "customClaims")):
|
|
44
|
+
return ValidationResult(
|
|
45
|
+
False,
|
|
46
|
+
"At least one of --allowed-audience, --allowed-clients, --allowed-scopes, or --custom-claims must be "
|
|
47
|
+
"provided for CUSTOM_JWT authorizer",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if bool(options.get("clientId")) != bool(options.get("clientSecret")):
|
|
51
|
+
return ValidationResult(False, "Both --client-id and --client-secret must be provided together")
|
|
52
|
+
|
|
53
|
+
return _validate_private_endpoint_options(options)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _split(value: str) -> list[str]:
|
|
57
|
+
return [s.strip() for s in value.split(",")]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _validate_private_endpoint_options(options: dict[str, Any]) -> ValidationResult:
|
|
61
|
+
has_lattice = bool(_s(options, "privateEndpointLatticeArn"))
|
|
62
|
+
has_vpc = bool(_s(options, "privateEndpointVpcId"))
|
|
63
|
+
|
|
64
|
+
if has_lattice and has_vpc:
|
|
65
|
+
return ValidationResult(
|
|
66
|
+
False,
|
|
67
|
+
"--private-endpoint-lattice-arn and --private-endpoint-vpc-id are mutually exclusive (a private endpoint "
|
|
68
|
+
"is one of VPC Lattice or a managed VPC endpoint)",
|
|
69
|
+
)
|
|
70
|
+
vpc_sub_flags = (
|
|
71
|
+
"privateEndpointSubnets",
|
|
72
|
+
"privateEndpointIpType",
|
|
73
|
+
"privateEndpointSecurityGroups",
|
|
74
|
+
"privateEndpointRoutingDomain",
|
|
75
|
+
"privateEndpointTags",
|
|
76
|
+
)
|
|
77
|
+
if not has_vpc and any(_s(options, k) for k in vpc_sub_flags):
|
|
78
|
+
return ValidationResult(False, "--private-endpoint-* VPC flags require --private-endpoint-vpc-id")
|
|
79
|
+
|
|
80
|
+
if has_lattice:
|
|
81
|
+
issue = first_issue(
|
|
82
|
+
PrivateEndpoint,
|
|
83
|
+
{"selfManagedLatticeResource": {"resourceConfigurationIdentifier": options["privateEndpointLatticeArn"]}},
|
|
84
|
+
)
|
|
85
|
+
if issue:
|
|
86
|
+
return ValidationResult(False, f"Invalid --private-endpoint-lattice-arn: {issue}")
|
|
87
|
+
|
|
88
|
+
if has_vpc:
|
|
89
|
+
if not _s(options, "privateEndpointSubnets"):
|
|
90
|
+
return ValidationResult(False, "--private-endpoint-subnets is required with --private-endpoint-vpc-id")
|
|
91
|
+
if not _s(options, "privateEndpointIpType"):
|
|
92
|
+
return ValidationResult(
|
|
93
|
+
False, "--private-endpoint-ip-type (IPV4 or IPV6) is required with --private-endpoint-vpc-id"
|
|
94
|
+
)
|
|
95
|
+
tags: Any = None
|
|
96
|
+
has_tags = False
|
|
97
|
+
if options.get("privateEndpointTags"):
|
|
98
|
+
ok, tags = parse_json(options["privateEndpointTags"])
|
|
99
|
+
if not ok:
|
|
100
|
+
return ValidationResult(False, "--private-endpoint-tags must be valid JSON")
|
|
101
|
+
has_tags = True
|
|
102
|
+
resource: dict[str, Any] = {
|
|
103
|
+
"vpcIdentifier": options["privateEndpointVpcId"],
|
|
104
|
+
"subnetIds": _split(options["privateEndpointSubnets"]),
|
|
105
|
+
"endpointIpAddressType": options["privateEndpointIpType"],
|
|
106
|
+
}
|
|
107
|
+
if options.get("privateEndpointSecurityGroups"):
|
|
108
|
+
resource["securityGroupIds"] = _split(options["privateEndpointSecurityGroups"])
|
|
109
|
+
if options.get("privateEndpointRoutingDomain"):
|
|
110
|
+
resource["routingDomain"] = options["privateEndpointRoutingDomain"]
|
|
111
|
+
if has_tags:
|
|
112
|
+
resource["tags"] = tags
|
|
113
|
+
issue = first_issue(PrivateEndpoint, {"managedVpcResource": resource})
|
|
114
|
+
if issue:
|
|
115
|
+
return ValidationResult(False, f"Invalid managed-VPC private endpoint: {issue}")
|
|
116
|
+
|
|
117
|
+
overrides_raw = options.get("privateEndpointOverrides")
|
|
118
|
+
if overrides_raw:
|
|
119
|
+
ok, parsed = parse_json(overrides_raw)
|
|
120
|
+
if not ok:
|
|
121
|
+
return ValidationResult(False, "--private-endpoint-overrides must be valid JSON")
|
|
122
|
+
if not isinstance(parsed, list):
|
|
123
|
+
return ValidationResult(False, "--private-endpoint-overrides must be a JSON array")
|
|
124
|
+
if len(parsed) > 5:
|
|
125
|
+
return ValidationResult(False, "--private-endpoint-overrides allows at most 5 entries")
|
|
126
|
+
if not has_lattice and not has_vpc:
|
|
127
|
+
return ValidationResult(
|
|
128
|
+
False,
|
|
129
|
+
"--private-endpoint-overrides requires a base private endpoint (--private-endpoint-lattice-arn or "
|
|
130
|
+
"--private-endpoint-vpc-id)",
|
|
131
|
+
)
|
|
132
|
+
base_arm = "selfManagedLatticeResource" if has_lattice else "managedVpcResource"
|
|
133
|
+
seen: set[str] = set()
|
|
134
|
+
for i, entry in enumerate(parsed):
|
|
135
|
+
issue = first_issue(PrivateEndpointOverride, entry)
|
|
136
|
+
if issue:
|
|
137
|
+
return ValidationResult(False, f"Invalid private-endpoint override at index {i}: {issue}")
|
|
138
|
+
override = PrivateEndpointOverride.model_validate(entry)
|
|
139
|
+
arm = (
|
|
140
|
+
"selfManagedLatticeResource"
|
|
141
|
+
if override.private_endpoint.self_managed_lattice_resource
|
|
142
|
+
else "managedVpcResource"
|
|
143
|
+
)
|
|
144
|
+
if arm != base_arm:
|
|
145
|
+
kind = "VPC Lattice" if base_arm == "selfManagedLatticeResource" else "managed VPC"
|
|
146
|
+
return ValidationResult(
|
|
147
|
+
False,
|
|
148
|
+
f"Private-endpoint override at index {i} must be the same kind as the base endpoint (all {kind})",
|
|
149
|
+
)
|
|
150
|
+
if override.domain in seen:
|
|
151
|
+
return ValidationResult(False, f"Duplicate private-endpoint override domain: {override.domain}")
|
|
152
|
+
seen.add(override.domain)
|
|
153
|
+
|
|
154
|
+
return ValidationResult(True)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""`add skill` logic (port of src/cli/commands/add/skill-action.ts).
|
|
2
|
+
|
|
3
|
+
Upstream records the skill source in harness.json; nothing is fetched or cloned at add time.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agentcore.lib.errors.types import ValidationError
|
|
12
|
+
from agentcore.lib.result import Err, Ok
|
|
13
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO, to_jsonable
|
|
14
|
+
from agentcore.operations.harness.skill_utils import get_skill_key, validate_git_skill_credential
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class AddSkillOptions:
|
|
19
|
+
harness: str
|
|
20
|
+
path: str | None = None
|
|
21
|
+
s3: str | None = None
|
|
22
|
+
git: str | None = None
|
|
23
|
+
git_path: str | None = None
|
|
24
|
+
credential_name: str | None = None
|
|
25
|
+
username: str | None = None
|
|
26
|
+
aws_skills: str | bool | None = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def handle_add_skill(
|
|
30
|
+
options: AddSkillOptions, config_io: ConfigIO | None = None
|
|
31
|
+
) -> Ok[dict[str, Any]] | Err[Exception]:
|
|
32
|
+
harness = options.harness
|
|
33
|
+
git_only = [
|
|
34
|
+
flag
|
|
35
|
+
for flag, value in (
|
|
36
|
+
("--git-path", options.git_path),
|
|
37
|
+
("--credential", options.credential_name),
|
|
38
|
+
("--username", options.username),
|
|
39
|
+
)
|
|
40
|
+
if value
|
|
41
|
+
]
|
|
42
|
+
if git_only and not options.git:
|
|
43
|
+
return Err(ValidationError(f"{', '.join(git_only)} can only be used with --git"))
|
|
44
|
+
|
|
45
|
+
if sum(1 for s in (options.path, options.s3, options.git, options.aws_skills) if s) != 1:
|
|
46
|
+
return Err(ValidationError("Exactly one of --path, --s3, --git, or --aws-skills is required"))
|
|
47
|
+
if options.s3 and not options.s3.startswith("s3://"):
|
|
48
|
+
return Err(ValidationError("--s3 must be an S3 URI starting with s3://"))
|
|
49
|
+
if options.git and not options.git.startswith("https://"):
|
|
50
|
+
return Err(ValidationError("--git must be an HTTPS URL starting with https://"))
|
|
51
|
+
|
|
52
|
+
io = config_io or ConfigIO()
|
|
53
|
+
try:
|
|
54
|
+
spec = to_jsonable(io.read_harness_spec(harness))
|
|
55
|
+
except Exception: # noqa: BLE001
|
|
56
|
+
return Err(
|
|
57
|
+
ValidationError(f"Harness '{harness}' not found. Check the name or run 'agentcore add harness' first.")
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
if options.credential_name:
|
|
61
|
+
try:
|
|
62
|
+
project = io.read_project_spec()
|
|
63
|
+
except Exception: # noqa: BLE001
|
|
64
|
+
return Err(
|
|
65
|
+
ValidationError("Could not read project configuration. Ensure agentcore.json exists and is valid.")
|
|
66
|
+
)
|
|
67
|
+
validation = validate_git_skill_credential(project, options.credential_name)
|
|
68
|
+
if not validation.success:
|
|
69
|
+
return validation
|
|
70
|
+
|
|
71
|
+
entry: dict[str, Any]
|
|
72
|
+
if options.path:
|
|
73
|
+
entry, source = {"path": options.path}, options.path
|
|
74
|
+
elif options.s3:
|
|
75
|
+
entry, source = {"s3Uri": options.s3}, options.s3
|
|
76
|
+
elif options.git:
|
|
77
|
+
entry = {"gitUrl": options.git}
|
|
78
|
+
if options.git_path:
|
|
79
|
+
entry["path"] = options.git_path
|
|
80
|
+
if options.credential_name:
|
|
81
|
+
auth = {"credentialName": options.credential_name}
|
|
82
|
+
if options.username:
|
|
83
|
+
auth["username"] = options.username
|
|
84
|
+
entry["auth"] = auth
|
|
85
|
+
source = f"{options.git} (path: {options.git_path})" if options.git_path else options.git
|
|
86
|
+
else:
|
|
87
|
+
paths = (
|
|
88
|
+
None
|
|
89
|
+
if options.aws_skills is True
|
|
90
|
+
else sorted(s.strip() for s in str(options.aws_skills).split(",") if s.strip())
|
|
91
|
+
)
|
|
92
|
+
# JS truthiness: an empty (filtered) list is still truthy, so it is written as `paths: []`.
|
|
93
|
+
entry = {"awsSkills": {} if paths is None else {"paths": paths}}
|
|
94
|
+
source = "aws-skills (all)" if paths is None else f"aws-skills ({', '.join(paths)})"
|
|
95
|
+
|
|
96
|
+
new_key = get_skill_key(entry)
|
|
97
|
+
if any(get_skill_key(s) == new_key for s in spec.get("skills") or []):
|
|
98
|
+
return Err(ValidationError(f"Skill '{source}' already exists in harness '{harness}'"))
|
|
99
|
+
|
|
100
|
+
spec.setdefault("skills", []).append(entry)
|
|
101
|
+
io.write_harness_spec(harness, spec)
|
|
102
|
+
return Ok({"harnessName": harness, "skillSource": source})
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
__all__ = ["AddSkillOptions", "handle_add_skill"]
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""`agentcore add skill` (port of src/cli/commands/add/skill-command.ts)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from agentcore.cli.commands.add._commander import (
|
|
10
|
+
optional_value,
|
|
11
|
+
optional_value_command,
|
|
12
|
+
require_options,
|
|
13
|
+
require_project,
|
|
14
|
+
)
|
|
15
|
+
from agentcore.cli.commands.add.skill_action import AddSkillOptions, handle_add_skill
|
|
16
|
+
from agentcore.cli.errors import get_error_message
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _dump(payload: dict) -> str:
|
|
20
|
+
return json.dumps(payload, separators=(",", ":"))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def register_add_skill(add_app: typer.Typer) -> None:
|
|
24
|
+
@add_app.command("skill", help="Add a skill to a harness", cls=optional_value_command("--aws-skills"))
|
|
25
|
+
def add_skill(
|
|
26
|
+
harness: str | None = typer.Option(None, "--harness", help="Target harness name"),
|
|
27
|
+
path: str | None = typer.Option(None, "--path", help="Path to an installed skill in the environment"),
|
|
28
|
+
s3: str | None = typer.Option(None, "--s3", help="S3 URI (s3://bucket/path)"),
|
|
29
|
+
git: str | None = typer.Option(None, "--git", help="HTTPS git repository URL"),
|
|
30
|
+
git_path: str | None = typer.Option(None, "--git-path", help="Subdirectory within the git repo (for --git)"),
|
|
31
|
+
credential: str | None = typer.Option(
|
|
32
|
+
None, "--credential", help="Name of an API key credential in the project (for git auth)"
|
|
33
|
+
),
|
|
34
|
+
username: str | None = typer.Option(None, "--username", help="Username for git auth (for --git)"),
|
|
35
|
+
aws_skills: str | None = typer.Option(
|
|
36
|
+
None,
|
|
37
|
+
"--aws-skills",
|
|
38
|
+
metavar="[PATHS]",
|
|
39
|
+
help="Add built-in AWS skills (comma-separated paths, or omit for all)",
|
|
40
|
+
),
|
|
41
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
|
42
|
+
) -> None:
|
|
43
|
+
require_options(("--harness <name>", harness))
|
|
44
|
+
require_project()
|
|
45
|
+
try:
|
|
46
|
+
result = handle_add_skill(
|
|
47
|
+
AddSkillOptions(
|
|
48
|
+
harness=harness or "",
|
|
49
|
+
path=path,
|
|
50
|
+
s3=s3,
|
|
51
|
+
git=git,
|
|
52
|
+
git_path=git_path,
|
|
53
|
+
credential_name=credential,
|
|
54
|
+
username=username,
|
|
55
|
+
aws_skills=optional_value(aws_skills),
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
if not result.success:
|
|
59
|
+
if as_json:
|
|
60
|
+
typer.echo(_dump({"success": False, "error": get_error_message(result.error)}))
|
|
61
|
+
else:
|
|
62
|
+
typer.echo(get_error_message(result.error), err=True)
|
|
63
|
+
raise typer.Exit(1)
|
|
64
|
+
if as_json:
|
|
65
|
+
typer.echo(
|
|
66
|
+
_dump(
|
|
67
|
+
{
|
|
68
|
+
"success": True,
|
|
69
|
+
"harnessName": result.value["harnessName"],
|
|
70
|
+
"skillSource": result.value["skillSource"],
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
typer.echo(f"Added skill '{result.value['skillSource']}' to harness '{result.value['harnessName']}'.")
|
|
76
|
+
typer.echo("Run 'agentcore deploy' to apply changes.")
|
|
77
|
+
except typer.Exit:
|
|
78
|
+
raise
|
|
79
|
+
except Exception as exc: # noqa: BLE001
|
|
80
|
+
if as_json:
|
|
81
|
+
typer.echo(_dump({"success": False, "error": get_error_message(exc)}))
|
|
82
|
+
else:
|
|
83
|
+
typer.echo(get_error_message(exc), err=True)
|
|
84
|
+
raise typer.Exit(1) from None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
__all__ = ["register_add_skill"]
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""`add tool` logic (port of src/cli/commands/add/tool-action.ts).
|
|
2
|
+
|
|
3
|
+
Results are plain dicts shaped like upstream's ``AddToolResult`` (``success``, ``error``,
|
|
4
|
+
``harnessName``, ``toolName``).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import re
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO, to_jsonable
|
|
15
|
+
from agentcore.primitives.deployed_gateways import find_deployed_gateway
|
|
16
|
+
|
|
17
|
+
VALID_OUTBOUND_AUTH_TYPES = ("awsIam", "none", "oauth")
|
|
18
|
+
VALID_GRANT_TYPES = ("CLIENT_CREDENTIALS", "USER_FEDERATION")
|
|
19
|
+
ARN_PATTERN = re.compile(r"^arn:[^:]+:")
|
|
20
|
+
VALID_TOOL_TYPES = (
|
|
21
|
+
"agentcore_browser",
|
|
22
|
+
"agentcore_code_interpreter",
|
|
23
|
+
"remote_mcp",
|
|
24
|
+
"agentcore_gateway",
|
|
25
|
+
"inline_function",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class AddToolOptions:
|
|
31
|
+
harness: str
|
|
32
|
+
type: str
|
|
33
|
+
name: str
|
|
34
|
+
url: str | None = None
|
|
35
|
+
browser_arn: str | None = None
|
|
36
|
+
code_interpreter_arn: str | None = None
|
|
37
|
+
gateway_arn: str | None = None
|
|
38
|
+
gateway: str | None = None
|
|
39
|
+
outbound_auth: str | None = None
|
|
40
|
+
provider_arn: str | None = None
|
|
41
|
+
scopes: str | None = None
|
|
42
|
+
grant_type: str | None = None
|
|
43
|
+
description: str | None = None
|
|
44
|
+
input_schema: str | None = None
|
|
45
|
+
json: bool | None = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _fail(error: str) -> dict[str, Any]:
|
|
49
|
+
return {"success": False, "error": error}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def handle_add_tool(options: AddToolOptions, config_io: ConfigIO | None = None) -> dict[str, Any]:
|
|
53
|
+
harness, tool_type, name = options.harness, options.type, options.name
|
|
54
|
+
|
|
55
|
+
if tool_type not in VALID_TOOL_TYPES:
|
|
56
|
+
return _fail(f"Invalid tool type '{tool_type}'. Valid types: {', '.join(VALID_TOOL_TYPES)}")
|
|
57
|
+
if tool_type == "remote_mcp" and not options.url:
|
|
58
|
+
return _fail("--url is required for remote_mcp tools")
|
|
59
|
+
if tool_type == "agentcore_gateway" and not options.gateway_arn and not options.gateway:
|
|
60
|
+
return _fail("--gateway-arn or --gateway is required for agentcore_gateway tools")
|
|
61
|
+
|
|
62
|
+
if (options.description is not None or options.input_schema is not None) and tool_type != "inline_function":
|
|
63
|
+
return _fail("--description and --input-schema are only valid for inline_function tools")
|
|
64
|
+
inline_schema: dict[str, Any] | None = None
|
|
65
|
+
if tool_type == "inline_function":
|
|
66
|
+
if not options.description:
|
|
67
|
+
return _fail("--description is required for inline_function tools")
|
|
68
|
+
if not options.input_schema:
|
|
69
|
+
return _fail("--input-schema is required for inline_function tools")
|
|
70
|
+
raw = options.input_schema
|
|
71
|
+
if raw.startswith("@"):
|
|
72
|
+
path = raw[1:]
|
|
73
|
+
try:
|
|
74
|
+
with open(path, encoding="utf-8") as fh:
|
|
75
|
+
raw = fh.read()
|
|
76
|
+
except (OSError, UnicodeDecodeError):
|
|
77
|
+
return _fail(f"Could not read --input-schema file: {path}")
|
|
78
|
+
try:
|
|
79
|
+
parsed = json.loads(raw)
|
|
80
|
+
except ValueError:
|
|
81
|
+
return _fail("--input-schema is not valid JSON")
|
|
82
|
+
if not isinstance(parsed, dict):
|
|
83
|
+
return _fail("--input-schema must be a JSON object (a JSON Schema for the tool input)")
|
|
84
|
+
inline_schema = parsed
|
|
85
|
+
|
|
86
|
+
outbound: dict[str, Any] | None = None
|
|
87
|
+
if options.outbound_auth is not None:
|
|
88
|
+
if tool_type != "agentcore_gateway":
|
|
89
|
+
return _fail("--outbound-auth is only valid for agentcore_gateway tools")
|
|
90
|
+
if options.outbound_auth not in VALID_OUTBOUND_AUTH_TYPES:
|
|
91
|
+
return _fail(
|
|
92
|
+
f"Invalid --outbound-auth '{options.outbound_auth}'. Valid: {', '.join(VALID_OUTBOUND_AUTH_TYPES)}"
|
|
93
|
+
)
|
|
94
|
+
if options.outbound_auth in ("awsIam", "none"):
|
|
95
|
+
if options.provider_arn or options.scopes or options.grant_type:
|
|
96
|
+
return _fail("--provider-arn, --scopes, and --grant-type are only valid with --outbound-auth oauth")
|
|
97
|
+
outbound = {"awsIam": {}} if options.outbound_auth == "awsIam" else {"none": {}}
|
|
98
|
+
else:
|
|
99
|
+
if not options.provider_arn:
|
|
100
|
+
return _fail("--provider-arn is required when --outbound-auth oauth")
|
|
101
|
+
if not ARN_PATTERN.match(options.provider_arn):
|
|
102
|
+
return _fail(f"Invalid --provider-arn '{options.provider_arn}': must be a valid ARN")
|
|
103
|
+
if not options.scopes:
|
|
104
|
+
return _fail("--scopes is required when --outbound-auth oauth")
|
|
105
|
+
scopes = [s.strip() for s in options.scopes.split(",") if s.strip()]
|
|
106
|
+
if not scopes:
|
|
107
|
+
return _fail("--scopes must contain at least one scope")
|
|
108
|
+
if options.grant_type is not None and options.grant_type not in VALID_GRANT_TYPES:
|
|
109
|
+
return _fail(f"Invalid --grant-type '{options.grant_type}'. Valid: {', '.join(VALID_GRANT_TYPES)}")
|
|
110
|
+
oauth: dict[str, Any] = {"providerArn": options.provider_arn, "scopes": scopes}
|
|
111
|
+
if options.grant_type:
|
|
112
|
+
oauth["grantType"] = options.grant_type
|
|
113
|
+
outbound = {"oauth": oauth}
|
|
114
|
+
|
|
115
|
+
io = config_io or ConfigIO()
|
|
116
|
+
|
|
117
|
+
resolved_gateway_arn = options.gateway_arn
|
|
118
|
+
if tool_type == "agentcore_gateway" and options.gateway and not resolved_gateway_arn:
|
|
119
|
+
try:
|
|
120
|
+
state = io.read_deployed_state()
|
|
121
|
+
gateway_state = find_deployed_gateway(state, options.gateway)
|
|
122
|
+
except Exception: # noqa: BLE001
|
|
123
|
+
return _fail("Could not read deployed state. Deploy the gateway first or use --gateway-arn.")
|
|
124
|
+
if not gateway_state:
|
|
125
|
+
return _fail(
|
|
126
|
+
f"Gateway '{options.gateway}' not found in deployed state. Deploy it first or use --gateway-arn."
|
|
127
|
+
)
|
|
128
|
+
resolved_gateway_arn = (
|
|
129
|
+
gateway_state.get("gatewayArn") if isinstance(gateway_state, dict) else gateway_state.gateway_arn
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
spec = to_jsonable(io.read_harness_spec(harness))
|
|
134
|
+
except Exception: # noqa: BLE001
|
|
135
|
+
return _fail(f"Harness '{harness}' not found. Check the name or run 'agentcore add harness' first.")
|
|
136
|
+
|
|
137
|
+
if any(t.get("name") == name for t in spec.get("tools") or []):
|
|
138
|
+
return _fail(f"Tool '{name}' already exists in harness '{harness}'")
|
|
139
|
+
|
|
140
|
+
entry: dict[str, Any] = {"type": tool_type, "name": name}
|
|
141
|
+
if tool_type == "remote_mcp":
|
|
142
|
+
entry["config"] = {"remoteMcp": {"url": options.url}}
|
|
143
|
+
elif tool_type == "agentcore_browser" and options.browser_arn:
|
|
144
|
+
entry["config"] = {"agentCoreBrowser": {"browserArn": options.browser_arn}}
|
|
145
|
+
elif tool_type == "agentcore_code_interpreter" and options.code_interpreter_arn:
|
|
146
|
+
entry["config"] = {"agentCoreCodeInterpreter": {"codeInterpreterArn": options.code_interpreter_arn}}
|
|
147
|
+
elif tool_type == "agentcore_gateway":
|
|
148
|
+
gateway: dict[str, Any] = {"gatewayArn": resolved_gateway_arn}
|
|
149
|
+
if outbound:
|
|
150
|
+
gateway["outboundAuth"] = outbound
|
|
151
|
+
entry["config"] = {"agentCoreGateway": gateway}
|
|
152
|
+
elif tool_type == "inline_function":
|
|
153
|
+
entry["config"] = {"inlineFunction": {"description": options.description, "inputSchema": inline_schema}}
|
|
154
|
+
|
|
155
|
+
spec.setdefault("tools", []).append(entry)
|
|
156
|
+
io.write_harness_spec(harness, spec)
|
|
157
|
+
return {"success": True, "harnessName": harness, "toolName": name}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
__all__ = ["VALID_TOOL_TYPES", "AddToolOptions", "handle_add_tool"]
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""`agentcore add tool` (port of src/cli/commands/add/tool-command.ts)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from agentcore.cli.commands.add._commander import require_options, require_project
|
|
10
|
+
from agentcore.cli.commands.add.tool_action import AddToolOptions, handle_add_tool
|
|
11
|
+
from agentcore.cli.errors import get_error_message
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _dump(payload: dict) -> str:
|
|
15
|
+
return json.dumps({k: v for k, v in payload.items() if v is not None}, separators=(",", ":"))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_add_tool(add_app: typer.Typer) -> None:
|
|
19
|
+
@add_app.command("tool", help="Add a tool to a harness")
|
|
20
|
+
def add_tool(
|
|
21
|
+
harness: str | None = typer.Option(None, "--harness", help="Target harness name"),
|
|
22
|
+
type_: str | None = typer.Option(
|
|
23
|
+
None,
|
|
24
|
+
"--type",
|
|
25
|
+
help="Tool type: agentcore_browser, agentcore_code_interpreter, remote_mcp, agentcore_gateway, "
|
|
26
|
+
"inline_function",
|
|
27
|
+
),
|
|
28
|
+
name: str | None = typer.Option(None, "--name", help="Tool name"),
|
|
29
|
+
url: str | None = typer.Option(None, "--url", help="MCP server URL (required for remote_mcp)"),
|
|
30
|
+
browser_arn: str | None = typer.Option(
|
|
31
|
+
None, "--browser-arn", help="Custom browser ARN (optional for agentcore_browser)"
|
|
32
|
+
),
|
|
33
|
+
code_interpreter_arn: str | None = typer.Option(
|
|
34
|
+
None,
|
|
35
|
+
"--code-interpreter-arn",
|
|
36
|
+
help="Custom code interpreter ARN (optional for agentcore_code_interpreter)",
|
|
37
|
+
),
|
|
38
|
+
gateway_arn: str | None = typer.Option(None, "--gateway-arn", help="Gateway ARN (for agentcore_gateway)"),
|
|
39
|
+
gateway: str | None = typer.Option(
|
|
40
|
+
None,
|
|
41
|
+
"--gateway",
|
|
42
|
+
help="Project gateway name — resolves ARN from deployed state (for agentcore_gateway)",
|
|
43
|
+
),
|
|
44
|
+
outbound_auth: str | None = typer.Option(
|
|
45
|
+
None,
|
|
46
|
+
"--outbound-auth",
|
|
47
|
+
help="Gateway outbound auth: awsIam, none, or oauth (default: awsIam if omitted) [agentcore_gateway]",
|
|
48
|
+
),
|
|
49
|
+
provider_arn: str | None = typer.Option(
|
|
50
|
+
None, "--provider-arn", help="OAuth credential provider ARN (required when --outbound-auth oauth)"
|
|
51
|
+
),
|
|
52
|
+
scopes: str | None = typer.Option(
|
|
53
|
+
None,
|
|
54
|
+
"--scopes",
|
|
55
|
+
help='Comma-separated OAuth scopes (required when --outbound-auth oauth), e.g. "openid,profile" or '
|
|
56
|
+
'"https://api.example.com/read"',
|
|
57
|
+
),
|
|
58
|
+
grant_type: str | None = typer.Option(
|
|
59
|
+
None,
|
|
60
|
+
"--grant-type",
|
|
61
|
+
help="OAuth grant type: CLIENT_CREDENTIALS or USER_FEDERATION (for --outbound-auth oauth)",
|
|
62
|
+
),
|
|
63
|
+
description: str | None = typer.Option(
|
|
64
|
+
None, "--description", help="Tool description shown to the model (required for inline_function)"
|
|
65
|
+
),
|
|
66
|
+
input_schema: str | None = typer.Option(
|
|
67
|
+
None,
|
|
68
|
+
"--input-schema",
|
|
69
|
+
help="JSON Schema for the tool input, as a JSON string or @path/to/schema.json (required for "
|
|
70
|
+
"inline_function)",
|
|
71
|
+
),
|
|
72
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
|
73
|
+
) -> None:
|
|
74
|
+
require_options(("--harness <name>", harness), ("--type <type>", type_), ("--name <name>", name))
|
|
75
|
+
require_project()
|
|
76
|
+
try:
|
|
77
|
+
result = handle_add_tool(
|
|
78
|
+
AddToolOptions(
|
|
79
|
+
harness=harness or "",
|
|
80
|
+
type=type_ or "",
|
|
81
|
+
name=name or "",
|
|
82
|
+
url=url,
|
|
83
|
+
browser_arn=browser_arn,
|
|
84
|
+
code_interpreter_arn=code_interpreter_arn,
|
|
85
|
+
gateway_arn=gateway_arn,
|
|
86
|
+
gateway=gateway,
|
|
87
|
+
outbound_auth=outbound_auth,
|
|
88
|
+
provider_arn=provider_arn,
|
|
89
|
+
scopes=scopes,
|
|
90
|
+
grant_type=grant_type,
|
|
91
|
+
description=description,
|
|
92
|
+
input_schema=input_schema,
|
|
93
|
+
json=as_json,
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
if not result["success"]:
|
|
97
|
+
if as_json:
|
|
98
|
+
typer.echo(_dump(result))
|
|
99
|
+
else:
|
|
100
|
+
typer.echo(result["error"], err=True)
|
|
101
|
+
raise typer.Exit(1)
|
|
102
|
+
if as_json:
|
|
103
|
+
typer.echo(_dump(result))
|
|
104
|
+
else:
|
|
105
|
+
typer.echo(f"Added tool '{result['toolName']}' to harness '{result['harnessName']}'.")
|
|
106
|
+
typer.echo("Run 'agentcore deploy' to apply changes.")
|
|
107
|
+
except typer.Exit:
|
|
108
|
+
raise
|
|
109
|
+
except Exception as exc: # noqa: BLE001
|
|
110
|
+
if as_json:
|
|
111
|
+
typer.echo(_dump({"success": False, "error": get_error_message(exc)}))
|
|
112
|
+
else:
|
|
113
|
+
typer.echo(get_error_message(exc), err=True)
|
|
114
|
+
raise typer.Exit(1) from None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
__all__ = ["register_add_tool"]
|