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,259 @@
|
|
|
1
|
+
"""Prompt-based port of tui/screens/knowledge-base (AddKnowledgeBaseScreen + AddKnowledgeBaseFlow).
|
|
2
|
+
|
|
3
|
+
Question order: name -> description -> data-source type -> source (S3 URI, or connector config as a
|
|
4
|
+
file path / inline JSON) -> add another? (add / remove a captured source / done) -> confirm.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
import typer
|
|
15
|
+
|
|
16
|
+
from agentcore.cli import interactive
|
|
17
|
+
from agentcore.cli.commands.add._common import first_issue
|
|
18
|
+
from agentcore.cli.naming import generate_unique_name
|
|
19
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
20
|
+
from agentcore.operations.knowledge_base.connector_config import flag_to_wire_type
|
|
21
|
+
from agentcore.schema import KnowledgeBaseName, S3DataSource
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from agentcore.primitives.knowledge_base import KnowledgeBasePrimitive
|
|
25
|
+
|
|
26
|
+
# Sentinel prefix tagging a captured connector config whose value is inline JSON, not a path.
|
|
27
|
+
INLINE_JSON_PREFIX = "\u0000inline-json:"
|
|
28
|
+
|
|
29
|
+
DATA_SOURCE_TYPE_OPTIONS = [
|
|
30
|
+
("s3", "Amazon S3 — documents in an S3 bucket"),
|
|
31
|
+
("web-crawler", "Web Crawler — crawl and index web pages"),
|
|
32
|
+
("confluence", "Confluence — Atlassian Confluence wiki"),
|
|
33
|
+
("sharepoint", "SharePoint — Microsoft SharePoint documents"),
|
|
34
|
+
("onedrive", "OneDrive — Microsoft OneDrive files"),
|
|
35
|
+
("google-drive", "Google Drive — Google Drive files"),
|
|
36
|
+
]
|
|
37
|
+
DATA_SOURCE_TYPE_LABELS = {
|
|
38
|
+
"s3": "S3",
|
|
39
|
+
"web-crawler": "Web Crawler",
|
|
40
|
+
"confluence": "Confluence",
|
|
41
|
+
"sharepoint": "SharePoint",
|
|
42
|
+
"onedrive": "OneDrive",
|
|
43
|
+
"google-drive": "Google Drive",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
class CapturedDataSource:
|
|
49
|
+
data_source_type: str
|
|
50
|
+
value: str
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class DataSourceGroup:
|
|
55
|
+
data_source_type: str
|
|
56
|
+
values: list[str]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def is_inline_json_value(value: str) -> bool:
|
|
60
|
+
return value.startswith(INLINE_JSON_PREFIX)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def strip_inline_json_prefix(value: str) -> str:
|
|
64
|
+
return value[len(INLINE_JSON_PREFIX) :] if is_inline_json_value(value) else value
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def group_data_sources(data_sources: list[CapturedDataSource]) -> list[DataSourceGroup]:
|
|
68
|
+
"""Group by type, preserving first-seen-type order across groups and insertion order within."""
|
|
69
|
+
groups: list[DataSourceGroup] = []
|
|
70
|
+
index_by_type: dict[str, int] = {}
|
|
71
|
+
for ds in data_sources:
|
|
72
|
+
idx = index_by_type.get(ds.data_source_type)
|
|
73
|
+
if idx is None:
|
|
74
|
+
index_by_type[ds.data_source_type] = len(groups)
|
|
75
|
+
groups.append(DataSourceGroup(ds.data_source_type, [ds.value]))
|
|
76
|
+
else:
|
|
77
|
+
groups[idx].values.append(ds.value)
|
|
78
|
+
return groups
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def materialize_inline_connector_config(
|
|
82
|
+
kb_name: str, data_source_type: str, json_contents: str, config_io: ConfigIO | None = None
|
|
83
|
+
) -> str:
|
|
84
|
+
"""Write inline JSON to ``app/<kbName>/<type>-<n>.json`` (first free n); return the absolute path."""
|
|
85
|
+
parsed = json.loads(json_contents) # parse first: never touch the filesystem on bad input
|
|
86
|
+
pretty = json.dumps(parsed, indent=2, ensure_ascii=False) + "\n"
|
|
87
|
+
project_root = os.path.dirname((config_io or ConfigIO()).get_config_root())
|
|
88
|
+
dest_dir = os.path.join(project_root, "app", kb_name)
|
|
89
|
+
os.makedirs(dest_dir, exist_ok=True)
|
|
90
|
+
n = 1
|
|
91
|
+
while True:
|
|
92
|
+
dest = os.path.join(dest_dir, f"{data_source_type}-{n}.json")
|
|
93
|
+
n += 1
|
|
94
|
+
if not os.path.exists(dest):
|
|
95
|
+
break
|
|
96
|
+
with open(dest, "w", encoding="utf-8") as fh:
|
|
97
|
+
fh.write(pretty)
|
|
98
|
+
return dest
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def validate_connector_config_input(value: str, pending_type: str) -> str | None:
|
|
102
|
+
"""Port of makeConnectorConfigSchema: a file path, or inline JSON whose type matches."""
|
|
103
|
+
declared = flag_to_wire_type(pending_type)
|
|
104
|
+
if len(value) < 1:
|
|
105
|
+
return "Enter a connector config file path or paste the JSON contents"
|
|
106
|
+
trimmed = value.lstrip()
|
|
107
|
+
if not trimmed.startswith("{") and not trimmed.startswith("["):
|
|
108
|
+
return None
|
|
109
|
+
try:
|
|
110
|
+
parsed: Any = json.loads(trimmed)
|
|
111
|
+
except ValueError:
|
|
112
|
+
return "Looks like JSON but failed to parse. Check brackets and quoting."
|
|
113
|
+
if not parsed or not isinstance(parsed, dict):
|
|
114
|
+
return 'Connector config must be a JSON object (e.g. { "type": "WEB", ... }).'
|
|
115
|
+
if not isinstance(parsed.get("type"), str):
|
|
116
|
+
return 'Connector config is missing a string "type" field.'
|
|
117
|
+
if parsed["type"] != declared:
|
|
118
|
+
return f'Connector config "type" is "{parsed["type"]}" but you picked {pending_type} (expects "{declared}").'
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _validate_s3_uri(value: str) -> str | None:
|
|
123
|
+
if len(value) < 1 or first_issue(S3DataSource, {"type": "S3", "uri": value}):
|
|
124
|
+
return "Must be a valid s3://bucket[/prefix] URI"
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _display(ds: CapturedDataSource, kb_name: str | None = None) -> str:
|
|
129
|
+
if is_inline_json_value(ds.value):
|
|
130
|
+
return f"<inline JSON, will save under app/{kb_name or '<kb>'}/>" if kb_name is not None else "<inline JSON>"
|
|
131
|
+
return ds.value
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def run_add_knowledge_base_wizard(primitive: KnowledgeBasePrimitive) -> None:
|
|
135
|
+
from agentcore.primitives.knowledge_base import AddKnowledgeBaseOptions
|
|
136
|
+
|
|
137
|
+
existing = [r.name for r in primitive.get_removable()]
|
|
138
|
+
name = interactive.text(
|
|
139
|
+
"Knowledge base name",
|
|
140
|
+
default=generate_unique_name("MyKnowledgeBase", existing),
|
|
141
|
+
validate=lambda v: (
|
|
142
|
+
first_issue(KnowledgeBaseName, v) or ("Knowledge base name already exists" if v in existing else None)
|
|
143
|
+
),
|
|
144
|
+
)
|
|
145
|
+
description = interactive.text("Description (optional, press Enter to skip)")
|
|
146
|
+
|
|
147
|
+
data_sources: list[CapturedDataSource] = []
|
|
148
|
+
step = "data-source-type"
|
|
149
|
+
pending_type = "s3"
|
|
150
|
+
while True:
|
|
151
|
+
if step == "data-source-type":
|
|
152
|
+
pending_type = interactive.select(
|
|
153
|
+
"Data source type"
|
|
154
|
+
+ (
|
|
155
|
+
" (pick the type of the first data source; you can mix types in this run)"
|
|
156
|
+
if not data_sources
|
|
157
|
+
else f" (next data source; {len(data_sources)} already captured)"
|
|
158
|
+
),
|
|
159
|
+
[interactive.Choice(title, value) for value, title in DATA_SOURCE_TYPE_OPTIONS],
|
|
160
|
+
)
|
|
161
|
+
step = "sources"
|
|
162
|
+
elif step == "sources":
|
|
163
|
+
count = sum(1 for ds in data_sources if ds.data_source_type == pending_type)
|
|
164
|
+
if pending_type == "s3":
|
|
165
|
+
prompt = "S3 URI for data source (e.g. s3://my-bucket/docs/)" if count == 0 else f"S3 URI #{count + 1}"
|
|
166
|
+
value = interactive.text(prompt, validate=_validate_s3_uri)
|
|
167
|
+
data_sources.append(CapturedDataSource(pending_type, value))
|
|
168
|
+
else:
|
|
169
|
+
prompt = (
|
|
170
|
+
f"Connector config for {pending_type} — paste JSON or enter a file path"
|
|
171
|
+
if count == 0
|
|
172
|
+
else f"Connector config #{count + 1}"
|
|
173
|
+
)
|
|
174
|
+
value = interactive.text(
|
|
175
|
+
prompt, validate=lambda v, t=pending_type: validate_connector_config_input(v, t)
|
|
176
|
+
)
|
|
177
|
+
trimmed = value.lstrip()
|
|
178
|
+
is_inline = trimmed.startswith("{") or trimmed.startswith("[")
|
|
179
|
+
data_sources.append(
|
|
180
|
+
CapturedDataSource(pending_type, f"{INLINE_JSON_PREFIX}{trimmed}" if is_inline else value)
|
|
181
|
+
)
|
|
182
|
+
step = "add-another"
|
|
183
|
+
elif step == "add-another":
|
|
184
|
+
types = len({ds.data_source_type for ds in data_sources})
|
|
185
|
+
choices = [interactive.Choice("Add another data source", "add-another")]
|
|
186
|
+
if len(data_sources) > 1:
|
|
187
|
+
choices.append(interactive.Choice("Remove a captured data source", "remove-source"))
|
|
188
|
+
choices.append(interactive.Choice("Done — review and submit", "done"))
|
|
189
|
+
picked = interactive.select(
|
|
190
|
+
f"Add another data source? (currently captured: {len(data_sources)} source(s) across {types} type(s))",
|
|
191
|
+
choices,
|
|
192
|
+
)
|
|
193
|
+
step = {"add-another": "data-source-type", "remove-source": "remove-source", "done": "confirm"}[picked]
|
|
194
|
+
elif step == "remove-source":
|
|
195
|
+
idx = interactive.select(
|
|
196
|
+
"Remove a captured data source",
|
|
197
|
+
[
|
|
198
|
+
interactive.Choice(
|
|
199
|
+
f"{DATA_SOURCE_TYPE_LABELS.get(ds.data_source_type, ds.data_source_type)}: {_display(ds)}", i
|
|
200
|
+
)
|
|
201
|
+
for i, ds in enumerate(data_sources)
|
|
202
|
+
],
|
|
203
|
+
)
|
|
204
|
+
data_sources.pop(idx)
|
|
205
|
+
step = "add-another" if data_sources else "data-source-type"
|
|
206
|
+
else: # confirm
|
|
207
|
+
typer.echo(f" Name: {name}")
|
|
208
|
+
if description:
|
|
209
|
+
typer.echo(f" Description: {description}")
|
|
210
|
+
typer.echo(f" Data Sources ({len(data_sources)}):")
|
|
211
|
+
for ds in data_sources:
|
|
212
|
+
label = DATA_SOURCE_TYPE_LABELS.get(ds.data_source_type, ds.data_source_type)
|
|
213
|
+
typer.echo(f" {label}: {_display(ds, name)}")
|
|
214
|
+
if interactive.confirm("Confirm", default=True):
|
|
215
|
+
break
|
|
216
|
+
step = "add-another"
|
|
217
|
+
|
|
218
|
+
# Flow: materialize inline JSON, then one primitive.add() per type group (first creates, rest append).
|
|
219
|
+
try:
|
|
220
|
+
materialized = [
|
|
221
|
+
CapturedDataSource(
|
|
222
|
+
ds.data_source_type,
|
|
223
|
+
materialize_inline_connector_config(name, ds.data_source_type, strip_inline_json_prefix(ds.value)),
|
|
224
|
+
)
|
|
225
|
+
if is_inline_json_value(ds.value)
|
|
226
|
+
else ds
|
|
227
|
+
for ds in data_sources
|
|
228
|
+
]
|
|
229
|
+
except Exception as exc: # noqa: BLE001
|
|
230
|
+
typer.echo("Failed to add knowledge base", err=True)
|
|
231
|
+
typer.echo(f"Failed to save inline connector config: {exc}", err=True)
|
|
232
|
+
raise typer.Exit(1) from None
|
|
233
|
+
|
|
234
|
+
groups = group_data_sources(materialized)
|
|
235
|
+
if not groups:
|
|
236
|
+
typer.echo("Failed to add knowledge base", err=True)
|
|
237
|
+
typer.echo("No data sources captured.", err=True)
|
|
238
|
+
raise typer.Exit(1)
|
|
239
|
+
|
|
240
|
+
total: list[str] = []
|
|
241
|
+
for i, grp in enumerate(groups):
|
|
242
|
+
is_s3 = grp.data_source_type == "s3"
|
|
243
|
+
result = primitive.add(
|
|
244
|
+
AddKnowledgeBaseOptions(
|
|
245
|
+
name=name,
|
|
246
|
+
description=description if i == 0 and description else None,
|
|
247
|
+
data_source_type=grp.data_source_type,
|
|
248
|
+
source=grp.values if is_s3 else [],
|
|
249
|
+
connector_config=[] if is_s3 else grp.values,
|
|
250
|
+
)
|
|
251
|
+
)
|
|
252
|
+
if not result.success:
|
|
253
|
+
typer.echo("Failed to add knowledge base", err=True)
|
|
254
|
+
typer.echo(f"Failed on {grp.data_source_type} group: {result.error}", err=True)
|
|
255
|
+
raise typer.Exit(1)
|
|
256
|
+
total.extend(result.value["newDataSources"])
|
|
257
|
+
|
|
258
|
+
typer.echo(f'Knowledge base "{name}" added')
|
|
259
|
+
typer.echo(f"{len(total)} data source(s). Run 'agentcore deploy' to create the KB and start ingestion.")
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"""Interactive payment wizards: prompt-based port of tui/screens/payment (AddPaymentFlow,
|
|
2
|
+
AddPaymentManagerScreen, AddPaymentConnectorScreen).
|
|
3
|
+
|
|
4
|
+
Manager: auth type -> (CUSTOM_JWT: discovery URL, clients, audiences, scopes) -> name -> advanced
|
|
5
|
+
(auto payment / budget / tool allowlist / network preferences) -> add a connector? -> confirm.
|
|
6
|
+
Connector: manager (when several) -> setup -> credentials -> name -> confirm.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
12
|
+
|
|
13
|
+
import typer
|
|
14
|
+
|
|
15
|
+
from agentcore.cli import interactive
|
|
16
|
+
from agentcore.cli.commands.add._common import first_issue, js_url_ok
|
|
17
|
+
from agentcore.cli.errors import get_error_message
|
|
18
|
+
from agentcore.cli.naming import generate_unique_name
|
|
19
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
20
|
+
from agentcore.primitives.payment_validation import (
|
|
21
|
+
strip_wallet_auth_prefix,
|
|
22
|
+
validate_api_key_secret,
|
|
23
|
+
validate_authorization_private_key,
|
|
24
|
+
validate_wallet_secret,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from agentcore.primitives.payment_connector import PaymentConnectorPrimitive
|
|
29
|
+
from agentcore.primitives.payment_manager import PaymentManagerPrimitive
|
|
30
|
+
|
|
31
|
+
C = interactive.Choice
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _err(check: Any) -> str | None:
|
|
35
|
+
return None if check is True else check
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _csv(value: str) -> list[str] | None:
|
|
39
|
+
items = [s.strip() for s in value.split(",") if s.strip()]
|
|
40
|
+
return items or None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _mask(value: str) -> str:
|
|
44
|
+
return "****" + value[-4:] if len(value) > 8 else "••••••••"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _connector_names(primitive: Any, manager: str) -> list[str]:
|
|
48
|
+
try:
|
|
49
|
+
project = to_jsonable(primitive.read_project_spec())
|
|
50
|
+
m = next((p for p in project.get("payments") or [] if p["name"] == manager), None)
|
|
51
|
+
return [c["name"] for c in (m or {}).get("connectors") or []]
|
|
52
|
+
except Exception: # noqa: BLE001
|
|
53
|
+
return []
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _prompt_connector(manager: str, existing_connectors: list[str]) -> dict[str, Any]:
|
|
57
|
+
from agentcore.schema import PaymentConnectorName
|
|
58
|
+
|
|
59
|
+
setup = interactive.select(
|
|
60
|
+
"Choose connector setup (Select how the connector should obtain credentials)",
|
|
61
|
+
[
|
|
62
|
+
C("Quick Create with Coinbase", "quick-create", "Recommended - connect Coinbase after deployment"),
|
|
63
|
+
C("Coinbase CDP credentials", "coinbase-manual", "Use existing Coinbase Developer Platform credentials"),
|
|
64
|
+
C("Stripe + Privy credentials", "stripe-privy-manual", "Use existing Stripe and Privy credentials"),
|
|
65
|
+
],
|
|
66
|
+
)
|
|
67
|
+
config: dict[str, Any] = {
|
|
68
|
+
"managerName": manager,
|
|
69
|
+
"provisionMode": "QUICK_CREATE" if setup == "quick-create" else "MANUAL",
|
|
70
|
+
"provider": "StripePrivy" if setup == "stripe-privy-manual" else "CoinbaseCDP",
|
|
71
|
+
}
|
|
72
|
+
if setup == "coinbase-manual":
|
|
73
|
+
config["apiKeyId"] = interactive.text(
|
|
74
|
+
"CDP API Key ID", secret=True, validate=lambda v: None if v.strip() else "API Key ID is required"
|
|
75
|
+
).strip()
|
|
76
|
+
config["apiKeySecret"] = interactive.text(
|
|
77
|
+
"CDP API Key Secret", secret=True, validate=lambda v: _err(validate_api_key_secret(v))
|
|
78
|
+
).strip()
|
|
79
|
+
config["walletSecret"] = interactive.text(
|
|
80
|
+
"CDP Wallet Secret", secret=True, validate=lambda v: _err(validate_wallet_secret(v))
|
|
81
|
+
).strip()
|
|
82
|
+
elif setup == "stripe-privy-manual":
|
|
83
|
+
config["appId"] = interactive.text(
|
|
84
|
+
"Privy App ID", secret=True, validate=lambda v: None if v.strip() else "App ID is required"
|
|
85
|
+
).strip()
|
|
86
|
+
config["appSecret"] = interactive.text(
|
|
87
|
+
"Privy App Secret", secret=True, validate=lambda v: None if v.strip() else "App Secret is required"
|
|
88
|
+
).strip()
|
|
89
|
+
config["authorizationPrivateKey"] = strip_wallet_auth_prefix(
|
|
90
|
+
interactive.text(
|
|
91
|
+
"Authorization Private Key (ECDSA P-256)",
|
|
92
|
+
secret=True,
|
|
93
|
+
validate=lambda v: _err(validate_authorization_private_key(v)),
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
config["authorizationId"] = interactive.text(
|
|
97
|
+
"Authorization ID", secret=True, validate=lambda v: None if v.strip() else "Authorization ID is required"
|
|
98
|
+
).strip()
|
|
99
|
+
base = "MyStripePrivyConnector" if config["provider"] == "StripePrivy" else "MyCdpConnector"
|
|
100
|
+
config["connectorName"] = interactive.text(
|
|
101
|
+
"Connector name",
|
|
102
|
+
default=generate_unique_name(base, existing_connectors),
|
|
103
|
+
validate=lambda v: (
|
|
104
|
+
first_issue(PaymentConnectorName, v)
|
|
105
|
+
or ("Connector name already exists in this manager" if v in existing_connectors else None)
|
|
106
|
+
),
|
|
107
|
+
)
|
|
108
|
+
return config
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _connector_fields(config: dict[str, Any]) -> list[tuple[str, str]]:
|
|
112
|
+
fields = [
|
|
113
|
+
("Connector Name", config["connectorName"]),
|
|
114
|
+
("Provisioning", "Quick Create" if config["provisionMode"] == "QUICK_CREATE" else "Manual"),
|
|
115
|
+
("Provider", "Stripe + Privy" if config["provider"] == "StripePrivy" else "Coinbase CDP"),
|
|
116
|
+
]
|
|
117
|
+
if config["provisionMode"] == "QUICK_CREATE":
|
|
118
|
+
return fields
|
|
119
|
+
if config["provider"] == "StripePrivy":
|
|
120
|
+
keys = (
|
|
121
|
+
("App ID", "appId"),
|
|
122
|
+
("App Secret", "appSecret"),
|
|
123
|
+
("Auth Key", "authorizationPrivateKey"),
|
|
124
|
+
("Auth ID", "authorizationId"),
|
|
125
|
+
)
|
|
126
|
+
else:
|
|
127
|
+
keys = (("API Key ID", "apiKeyId"), ("API Key Secret", "apiKeySecret"), ("Wallet Secret", "walletSecret"))
|
|
128
|
+
return fields + [(label, _mask(config[key])) for label, key in keys]
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _connector_options(config: dict[str, Any]): # type: ignore[no-untyped-def]
|
|
132
|
+
from agentcore.primitives.payment_connector import AddPaymentConnectorOptions
|
|
133
|
+
|
|
134
|
+
base = {"manager": config["managerName"], "name": config["connectorName"]}
|
|
135
|
+
if config["provisionMode"] == "QUICK_CREATE":
|
|
136
|
+
return AddPaymentConnectorOptions(**base, provider="CoinbaseCDP", provision_mode="QUICK_CREATE")
|
|
137
|
+
if config["provider"] == "StripePrivy":
|
|
138
|
+
return AddPaymentConnectorOptions(
|
|
139
|
+
**base,
|
|
140
|
+
provider="StripePrivy",
|
|
141
|
+
app_id=config["appId"],
|
|
142
|
+
app_secret=config["appSecret"],
|
|
143
|
+
authorization_private_key=config["authorizationPrivateKey"],
|
|
144
|
+
authorization_id=config["authorizationId"],
|
|
145
|
+
)
|
|
146
|
+
return AddPaymentConnectorOptions(
|
|
147
|
+
**base,
|
|
148
|
+
provider="CoinbaseCDP",
|
|
149
|
+
api_key_id=config["apiKeyId"],
|
|
150
|
+
api_key_secret=config["apiKeySecret"],
|
|
151
|
+
wallet_secret=config["walletSecret"],
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def run_add_payment_manager_wizard(primitive: PaymentManagerPrimitive) -> None:
|
|
156
|
+
from agentcore.primitives.payment_manager import AddPaymentManagerOptions
|
|
157
|
+
from agentcore.schema import DEFAULT_SPEND_LIMIT, PaymentManagerName
|
|
158
|
+
|
|
159
|
+
existing = primitive.get_existing_managers()
|
|
160
|
+
auth = interactive.select(
|
|
161
|
+
"Select authorization type (How users authenticate to the payment manager)",
|
|
162
|
+
[
|
|
163
|
+
C("AWS IAM", "AWS_IAM", "Use AWS IAM for authorization (default)"),
|
|
164
|
+
C("Custom JWT", "CUSTOM_JWT", "Use a custom JWT authorizer via OIDC discovery"),
|
|
165
|
+
],
|
|
166
|
+
)
|
|
167
|
+
jwt: dict[str, Any] = {}
|
|
168
|
+
if auth == "CUSTOM_JWT":
|
|
169
|
+
|
|
170
|
+
def validate_url(value: str) -> str | None:
|
|
171
|
+
if not value.strip():
|
|
172
|
+
return "Discovery URL is required for Custom JWT"
|
|
173
|
+
return None if js_url_ok(value.strip()) else "Must be a valid URL"
|
|
174
|
+
|
|
175
|
+
jwt["discoveryUrl"] = interactive.text("OIDC Discovery URL", validate=validate_url).strip()
|
|
176
|
+
jwt["allowedClients"] = interactive.text("Allowed client IDs (comma-separated, leave empty to skip)")
|
|
177
|
+
jwt["allowedAudience"] = interactive.text("Allowed audiences (comma-separated, leave empty to skip)")
|
|
178
|
+
jwt["allowedScopes"] = interactive.text("Allowed scopes (comma-separated, leave empty to skip)")
|
|
179
|
+
|
|
180
|
+
name = interactive.text(
|
|
181
|
+
"Payment manager name",
|
|
182
|
+
default=generate_unique_name("MyPaymentManager", existing),
|
|
183
|
+
validate=lambda v: (
|
|
184
|
+
first_issue(PaymentManagerName, v) or ("Payment manager name already exists" if v in existing else None)
|
|
185
|
+
),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
spend_limit = DEFAULT_SPEND_LIMIT
|
|
189
|
+
advanced = interactive.checkbox(
|
|
190
|
+
"Advanced Configuration",
|
|
191
|
+
[
|
|
192
|
+
C("Auto Payment", "auto-payment"),
|
|
193
|
+
C(f"Edit Default Budget (Current: ${spend_limit})", "default-budget"),
|
|
194
|
+
C("Edit Tool Allowlist", "tool-allowlist"),
|
|
195
|
+
C("Edit Network Preferences", "network-preferences"),
|
|
196
|
+
],
|
|
197
|
+
checked=["auto-payment"],
|
|
198
|
+
)
|
|
199
|
+
auto_payment = "auto-payment" in advanced
|
|
200
|
+
tool_allowlist: str | None = None
|
|
201
|
+
network_preferences: str | None = None
|
|
202
|
+
if "default-budget" in advanced:
|
|
203
|
+
typer.echo(f"Auto Payment: {'✓ Enabled' if auto_payment else '✗ Disabled'}")
|
|
204
|
+
|
|
205
|
+
def validate_limit(value: str) -> str | None:
|
|
206
|
+
if not value.strip():
|
|
207
|
+
return None
|
|
208
|
+
try:
|
|
209
|
+
num = float(value.strip())
|
|
210
|
+
except ValueError:
|
|
211
|
+
return "Must be a valid positive number"
|
|
212
|
+
return "Must be a valid positive number" if num != num or num < 0 else None
|
|
213
|
+
|
|
214
|
+
spend_limit = (
|
|
215
|
+
interactive.text("Default Spend Limit (USD)", default=spend_limit, validate=validate_limit) or "10.00"
|
|
216
|
+
)
|
|
217
|
+
typer.echo(
|
|
218
|
+
"Used only for sessions created by `invoke --auto-session`. It is not a deployed-agent budget — sessions "
|
|
219
|
+
"your agent creates at runtime set their own limit."
|
|
220
|
+
)
|
|
221
|
+
if "tool-allowlist" in advanced:
|
|
222
|
+
tool_allowlist = interactive.text("Tool Allowlist (comma-separated, leave empty to allow all)").strip() or None
|
|
223
|
+
if "network-preferences" in advanced:
|
|
224
|
+
network_preferences = (
|
|
225
|
+
interactive.text("Network Preferences (comma-separated, e.g. eip155:84532)").strip() or None
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
connector: dict[str, Any] | None = None
|
|
229
|
+
choice = interactive.select(
|
|
230
|
+
"Add a payment connector?",
|
|
231
|
+
[
|
|
232
|
+
C("Add a payment connector", "add-connector", "Link CoinbaseCDP or StripePrivy credentials"),
|
|
233
|
+
C("Skip for now", "skip"),
|
|
234
|
+
],
|
|
235
|
+
)
|
|
236
|
+
if choice == "add-connector":
|
|
237
|
+
connector = _prompt_connector(name, [])
|
|
238
|
+
|
|
239
|
+
rows = [
|
|
240
|
+
("Auth Type", auth),
|
|
241
|
+
("Manager Name", name),
|
|
242
|
+
("Auto Payment", "Enabled" if auto_payment else "Disabled"),
|
|
243
|
+
("Default Spend Limit", f"${spend_limit}"),
|
|
244
|
+
]
|
|
245
|
+
if tool_allowlist:
|
|
246
|
+
rows.append(("Tool Allowlist", tool_allowlist))
|
|
247
|
+
if network_preferences:
|
|
248
|
+
rows.append(("Network Preferences", network_preferences))
|
|
249
|
+
if connector:
|
|
250
|
+
rows += _connector_fields(connector)
|
|
251
|
+
if auto_payment:
|
|
252
|
+
rows.append(
|
|
253
|
+
(
|
|
254
|
+
"⚠ Warning",
|
|
255
|
+
f"Auto-payment ENABLED — agent settles 402s automatically up to ${spend_limit}/session with no "
|
|
256
|
+
"human approval",
|
|
257
|
+
)
|
|
258
|
+
)
|
|
259
|
+
if not connector:
|
|
260
|
+
rows.append(("⚠ Warning", "No connector — deploy will fail until you add one"))
|
|
261
|
+
for label, value in rows:
|
|
262
|
+
typer.echo(f" {label}: {value}")
|
|
263
|
+
if not interactive.confirm("Create payment manager?", default=True):
|
|
264
|
+
typer.echo("Cancelled.")
|
|
265
|
+
return
|
|
266
|
+
|
|
267
|
+
custom = auth == "CUSTOM_JWT"
|
|
268
|
+
result = primitive.add(
|
|
269
|
+
AddPaymentManagerOptions(
|
|
270
|
+
name=name,
|
|
271
|
+
authorizer_type=auth,
|
|
272
|
+
discovery_url=jwt.get("discoveryUrl") if custom else None,
|
|
273
|
+
allowed_clients=_csv(jwt.get("allowedClients", "")) if custom else None,
|
|
274
|
+
allowed_audience=_csv(jwt.get("allowedAudience", "")) if custom else None,
|
|
275
|
+
allowed_scopes=_csv(jwt.get("allowedScopes", "")) if custom else None,
|
|
276
|
+
auto_payment=auto_payment,
|
|
277
|
+
default_spend_limit=spend_limit,
|
|
278
|
+
payment_tool_allowlist=_csv(tool_allowlist) if tool_allowlist else None,
|
|
279
|
+
network_preferences=_csv(network_preferences) if network_preferences else None,
|
|
280
|
+
)
|
|
281
|
+
)
|
|
282
|
+
if not result.success:
|
|
283
|
+
typer.echo(f"Error: {get_error_message(result.error)}", err=True)
|
|
284
|
+
raise typer.Exit(1)
|
|
285
|
+
if connector:
|
|
286
|
+
from agentcore.primitives.payment_connector import PRIMITIVE as connector_primitive
|
|
287
|
+
|
|
288
|
+
conn = connector_primitive.add(_connector_options(connector))
|
|
289
|
+
if not conn.success:
|
|
290
|
+
typer.echo(
|
|
291
|
+
f'Error: Manager "{name}" was created, but connector failed: {get_error_message(conn.error)}\n\n'
|
|
292
|
+
'Use "Add a payment connector" to retry adding the connector.',
|
|
293
|
+
err=True,
|
|
294
|
+
)
|
|
295
|
+
raise typer.Exit(1)
|
|
296
|
+
typer.echo(f'Payment manager "{name}" and connector "{connector["connectorName"]}" created')
|
|
297
|
+
else:
|
|
298
|
+
typer.echo(f'Payment manager "{name}" created')
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def run_add_payment_connector_wizard(primitive: PaymentConnectorPrimitive) -> None:
|
|
302
|
+
from agentcore.primitives.payment_manager import PRIMITIVE as manager_primitive
|
|
303
|
+
|
|
304
|
+
managers = manager_primitive.get_existing_managers()
|
|
305
|
+
if not managers:
|
|
306
|
+
typer.echo("Error: No payment managers exist. Create a manager first.", err=True)
|
|
307
|
+
raise typer.Exit(1)
|
|
308
|
+
manager = (
|
|
309
|
+
managers[0]
|
|
310
|
+
if len(managers) == 1
|
|
311
|
+
else interactive.select(
|
|
312
|
+
"Select payment manager (Which manager should this connector be added to?)",
|
|
313
|
+
[C(m, m) for m in managers],
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
config = _prompt_connector(manager, _connector_names(primitive, manager))
|
|
317
|
+
for label, value in [("Manager", manager), *_connector_fields(config)]:
|
|
318
|
+
typer.echo(f" {label}: {value}")
|
|
319
|
+
if not interactive.confirm("Create payment connector?", default=True):
|
|
320
|
+
typer.echo("Cancelled.")
|
|
321
|
+
return
|
|
322
|
+
result = primitive.add(_connector_options(config))
|
|
323
|
+
if not result.success:
|
|
324
|
+
typer.echo(f"Error: {get_error_message(result.error)}", err=True)
|
|
325
|
+
raise typer.Exit(1)
|
|
326
|
+
typer.echo(f"Added payment connector: {result.value['connectorName']}")
|
|
327
|
+
if config["provisionMode"] == "QUICK_CREATE":
|
|
328
|
+
typer.echo("Run `agentcore deploy` to create the connector and receive its authorization URL.")
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
__all__ = ["run_add_payment_connector_wizard", "run_add_payment_manager_wizard"]
|