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,477 @@
|
|
|
1
|
+
"""Knowledge base add/remove (port of src/cli/primitives/KnowledgeBasePrimitive.ts).
|
|
2
|
+
|
|
3
|
+
`agentcore add knowledge-base` creates the KB and its data sources. The repeatable ``--source`` flag
|
|
4
|
+
maps to entries in the KB's ``dataSources`` array; re-invoking ``add`` with an existing ``--name``
|
|
5
|
+
appends new data sources (idempotent append). Non-S3 connector configs (``--data-source-type`` +
|
|
6
|
+
``--connector-config <file>``) are materialized under ``app/<kbName>/`` and referenced by
|
|
7
|
+
project-relative path. Binding a pre-existing KB is done via ``add gateway-target --type connector``.
|
|
8
|
+
|
|
9
|
+
The project spec is handled as its camelCase JSON form (as upstream's plain objects) and validated
|
|
10
|
+
on write by ``ConfigIO``.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import copy
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
import random
|
|
19
|
+
import re
|
|
20
|
+
import shutil
|
|
21
|
+
import string
|
|
22
|
+
import sys
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
import typer
|
|
27
|
+
from pydantic import ValidationError as PydanticValidationError
|
|
28
|
+
|
|
29
|
+
from agentcore.cli import interactive
|
|
30
|
+
from agentcore.cli.errors import get_error_message
|
|
31
|
+
from agentcore.cli.run_command import run_cli_command
|
|
32
|
+
from agentcore.lib.constants import APP_DIR
|
|
33
|
+
from agentcore.lib.errors.types import ValidationError
|
|
34
|
+
from agentcore.lib.result import Err, Ok, serialize_result
|
|
35
|
+
from agentcore.lib.schemas.io.config_io import to_jsonable
|
|
36
|
+
from agentcore.lib.schemas.io.path_resolver import find_config_root
|
|
37
|
+
from agentcore.operations.knowledge_base.connector_config import (
|
|
38
|
+
flag_to_wire_type,
|
|
39
|
+
is_connector_config_type,
|
|
40
|
+
read_connector_config,
|
|
41
|
+
)
|
|
42
|
+
from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange
|
|
43
|
+
from agentcore.schema import CONNECTOR_ID, KnowledgeBase
|
|
44
|
+
|
|
45
|
+
# Cheap shape check for early errors at the CLI boundary; S3DataSource in the schema is canonical.
|
|
46
|
+
_S3_URI_PATTERN = re.compile(r"^s3://[^/]+(/.*)?$", re.DOTALL)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _is_s3_uri(uri: str) -> bool:
|
|
50
|
+
return bool(_S3_URI_PATTERN.match(uri))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _data_source_key(ds: dict[str, Any]) -> str:
|
|
54
|
+
"""S3 sources are keyed by URI, connector sources by their config file path."""
|
|
55
|
+
return ds["uri"] if ds.get("type") == "S3" else ds["connectorConfigFile"]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _posix_rel(path: str, start: str) -> str:
|
|
59
|
+
return os.path.relpath(path, start).replace("\\", "/")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def zod_error_message(exc: PydanticValidationError) -> str:
|
|
63
|
+
"""Approximation of zod v4's ``ZodError.message`` (``JSON.stringify(issues, null, 2)``)."""
|
|
64
|
+
issues = [{"code": "custom", "path": list(e.get("loc") or ()), "message": e.get("msg", "")} for e in exc.errors()]
|
|
65
|
+
return json.dumps(issues, indent=2)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass
|
|
69
|
+
class AddKnowledgeBaseOptions:
|
|
70
|
+
name: str
|
|
71
|
+
description: str | None = None
|
|
72
|
+
source: list[str] = field(default_factory=list)
|
|
73
|
+
"""Repeatable ``--source`` values (S3 URIs). Required for S3 data sources."""
|
|
74
|
+
connector_config: list[str] = field(default_factory=list)
|
|
75
|
+
"""Repeatable ``--connector-config`` values. Required for non-S3 connectors."""
|
|
76
|
+
data_source_type: str | None = None
|
|
77
|
+
"""``--data-source-type`` flag (s3 default, or web-crawler/confluence/...)."""
|
|
78
|
+
json: bool = False
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class _PruneAction:
|
|
83
|
+
gateway_name: str
|
|
84
|
+
target_name: str
|
|
85
|
+
removed_target: bool
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class KnowledgeBasePrimitive(BasePrimitive):
|
|
89
|
+
kind = "knowledge-base"
|
|
90
|
+
label = "Knowledge Base"
|
|
91
|
+
|
|
92
|
+
# --- add ----------------------------------------------------------------------------
|
|
93
|
+
|
|
94
|
+
def add(self, options: AddKnowledgeBaseOptions) -> Ok[dict[str, Any]] | Err[Exception]:
|
|
95
|
+
try:
|
|
96
|
+
return Ok(self._add(options))
|
|
97
|
+
except Exception as exc: # noqa: BLE001 - surfaced as a failed Result, as upstream
|
|
98
|
+
return Err(exc)
|
|
99
|
+
|
|
100
|
+
def _add(self, options: AddKnowledgeBaseOptions) -> dict[str, Any]:
|
|
101
|
+
sources = list(options.source or [])
|
|
102
|
+
connector_configs = list(options.connector_config or [])
|
|
103
|
+
wire_type = flag_to_wire_type(options.data_source_type or "s3")
|
|
104
|
+
warnings: list[str] = []
|
|
105
|
+
|
|
106
|
+
# Phase 1: pure validation, no side effects. File copies are deferred so a later validation
|
|
107
|
+
# failure never leaves a stray file behind.
|
|
108
|
+
if is_connector_config_type(wire_type):
|
|
109
|
+
if sources:
|
|
110
|
+
raise ValueError(f"--source is only valid for S3. For {wire_type}, use --connector-config.")
|
|
111
|
+
if not connector_configs:
|
|
112
|
+
raise ValueError(f"--connector-config is required for --data-source-type {options.data_source_type}.")
|
|
113
|
+
seen_sources: set[str] = set()
|
|
114
|
+
basename_to_source: dict[str, str] = {}
|
|
115
|
+
for cfg_path in connector_configs:
|
|
116
|
+
warnings.extend(read_connector_config(cfg_path, wire_type).warnings)
|
|
117
|
+
resolved_src = os.path.abspath(cfg_path)
|
|
118
|
+
if resolved_src in seen_sources:
|
|
119
|
+
continue # exact duplicate: the batch-dedup loop below reports it
|
|
120
|
+
seen_sources.add(resolved_src)
|
|
121
|
+
base = os.path.basename(resolved_src)
|
|
122
|
+
prior = basename_to_source.get(base)
|
|
123
|
+
if prior:
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"Connector config files '{prior}' and '{cfg_path}' would both be stored as "
|
|
126
|
+
f"'app/{options.name}/{base}'. Rename one so their filenames differ."
|
|
127
|
+
)
|
|
128
|
+
basename_to_source[base] = cfg_path
|
|
129
|
+
|
|
130
|
+
def build_data_sources() -> list[dict[str, Any]]:
|
|
131
|
+
return [
|
|
132
|
+
{"type": wire_type, "connectorConfigFile": self._materialize_connector_config(options.name, p)}
|
|
133
|
+
for p in connector_configs
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
else:
|
|
137
|
+
if connector_configs:
|
|
138
|
+
raise ValueError("--connector-config is only valid for non-S3 data source types.")
|
|
139
|
+
if not sources:
|
|
140
|
+
raise ValueError("At least one --source is required for S3 data sources.")
|
|
141
|
+
for uri in sources:
|
|
142
|
+
if not _is_s3_uri(uri):
|
|
143
|
+
raise ValueError(f"Invalid S3 URI: {uri}. Expected s3://bucket[/prefix].")
|
|
144
|
+
|
|
145
|
+
def build_data_sources() -> list[dict[str, Any]]:
|
|
146
|
+
return [{"type": "S3", "uri": uri} for uri in sources]
|
|
147
|
+
|
|
148
|
+
# Reject duplicates inside this batch up front with an actionable message.
|
|
149
|
+
if is_connector_config_type(wire_type):
|
|
150
|
+
project_root = os.path.dirname(self.config_io.get_config_root())
|
|
151
|
+
batch_keys = [_posix_rel(os.path.abspath(p), project_root) for p in connector_configs]
|
|
152
|
+
else:
|
|
153
|
+
batch_keys = sources
|
|
154
|
+
seen_in_batch: set[str] = set()
|
|
155
|
+
for key in batch_keys:
|
|
156
|
+
if key in seen_in_batch:
|
|
157
|
+
raise ValueError(f"Duplicate data source in this invocation: {key}")
|
|
158
|
+
seen_in_batch.add(key)
|
|
159
|
+
|
|
160
|
+
project = to_jsonable(self.read_project_spec())
|
|
161
|
+
|
|
162
|
+
# All validation passed: materialize connector configs and build the data sources.
|
|
163
|
+
new_data_sources = build_data_sources()
|
|
164
|
+
|
|
165
|
+
existing = next((kb for kb in project.get("knowledgeBases", []) if kb["name"] == options.name), None)
|
|
166
|
+
if existing is not None:
|
|
167
|
+
return self._append_to_existing(existing, project, new_data_sources, options, warnings)
|
|
168
|
+
|
|
169
|
+
kb_input: dict[str, Any] = {"name": options.name}
|
|
170
|
+
if options.description:
|
|
171
|
+
kb_input["description"] = options.description
|
|
172
|
+
kb_input["dataSources"] = new_data_sources
|
|
173
|
+
try:
|
|
174
|
+
kb = KnowledgeBase.model_validate(kb_input)
|
|
175
|
+
except PydanticValidationError as exc:
|
|
176
|
+
raise ValueError(zod_error_message(exc)) from None
|
|
177
|
+
|
|
178
|
+
project.setdefault("knowledgeBases", []).append(to_jsonable(kb))
|
|
179
|
+
self.write_project_spec(project)
|
|
180
|
+
|
|
181
|
+
if not options.json:
|
|
182
|
+
for w in warnings:
|
|
183
|
+
print(w, file=sys.stderr)
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
"knowledgeBaseName": kb.name,
|
|
187
|
+
"appended": False,
|
|
188
|
+
"newDataSources": [_data_source_key(ds) for ds in new_data_sources],
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
def _append_to_existing(
|
|
192
|
+
self,
|
|
193
|
+
existing: dict[str, Any],
|
|
194
|
+
project: dict[str, Any],
|
|
195
|
+
new_data_sources: list[dict[str, Any]],
|
|
196
|
+
options: AddKnowledgeBaseOptions,
|
|
197
|
+
warnings: list[str],
|
|
198
|
+
) -> dict[str, Any]:
|
|
199
|
+
# '' and None both mean "no description provided".
|
|
200
|
+
desc_changed = options.description not in (None, "") and options.description != existing.get("description")
|
|
201
|
+
if desc_changed:
|
|
202
|
+
raise ValueError(
|
|
203
|
+
f'Knowledge base "{options.name}" already exists. Update operations are not supported in Wave 1; '
|
|
204
|
+
"edit agentcore.json directly to change the description."
|
|
205
|
+
)
|
|
206
|
+
existing_keys = {_data_source_key(ds) for ds in existing.get("dataSources", [])}
|
|
207
|
+
for ds in new_data_sources:
|
|
208
|
+
key = _data_source_key(ds)
|
|
209
|
+
if key in existing_keys:
|
|
210
|
+
raise ValueError(f'Data source "{key}" already exists on knowledge-base "{options.name}".')
|
|
211
|
+
|
|
212
|
+
existing.setdefault("dataSources", []).extend(new_data_sources)
|
|
213
|
+
self.write_project_spec(project)
|
|
214
|
+
|
|
215
|
+
if not options.json:
|
|
216
|
+
for w in warnings:
|
|
217
|
+
print(w, file=sys.stderr)
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
"knowledgeBaseName": existing["name"],
|
|
221
|
+
"appended": True,
|
|
222
|
+
"newDataSources": [_data_source_key(ds) for ds in new_data_sources],
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
def _materialize_connector_config(self, kb_name: str, cfg_path: str) -> str:
|
|
226
|
+
"""Ensure the config lives under ``app/<kbName>/``; return its project-relative path."""
|
|
227
|
+
project_root = os.path.dirname(self.config_io.get_config_root())
|
|
228
|
+
src = os.path.abspath(cfg_path)
|
|
229
|
+
if not os.path.exists(src):
|
|
230
|
+
raise ValueError(f"Connector config file not found: {cfg_path}")
|
|
231
|
+
dest_dir = os.path.join(project_root, APP_DIR, kb_name)
|
|
232
|
+
dest = os.path.join(dest_dir, os.path.basename(src))
|
|
233
|
+
|
|
234
|
+
if os.path.abspath(src) == os.path.abspath(dest):
|
|
235
|
+
return _posix_rel(dest, project_root)
|
|
236
|
+
# Never silently overwrite a different file already at the destination.
|
|
237
|
+
if os.path.exists(dest):
|
|
238
|
+
raise ValueError(
|
|
239
|
+
f"Connector config '{cfg_path}' would overwrite the existing file at "
|
|
240
|
+
f"'{_posix_rel(dest, project_root)}'. Rename it so its filename differs."
|
|
241
|
+
)
|
|
242
|
+
os.makedirs(dest_dir, exist_ok=True)
|
|
243
|
+
shutil.copyfile(src, dest)
|
|
244
|
+
print(f"Copied connector config to {_posix_rel(dest, project_root)}", file=sys.stderr)
|
|
245
|
+
return _posix_rel(dest, project_root)
|
|
246
|
+
|
|
247
|
+
# --- remove -------------------------------------------------------------------------
|
|
248
|
+
|
|
249
|
+
def remove(self, name: str) -> Ok[None] | Err[Exception]:
|
|
250
|
+
try:
|
|
251
|
+
project = to_jsonable(self.read_project_spec())
|
|
252
|
+
kbs = project.get("knowledgeBases", [])
|
|
253
|
+
idx = next((i for i, kb in enumerate(kbs) if kb["name"] == name), -1)
|
|
254
|
+
if idx == -1:
|
|
255
|
+
raise ValueError(f'Knowledge base "{name}" not found.')
|
|
256
|
+
kb = kbs.pop(idx)
|
|
257
|
+
if kb.get("gateway"):
|
|
258
|
+
self._remove_connector_target(project, kb["gateway"], kb["name"])
|
|
259
|
+
# Without this the spec would be unwriteable: the cross-spec validator rejects
|
|
260
|
+
# AgenticRetrieveStream entries that reference a KB name no longer in knowledgeBases[].
|
|
261
|
+
self._prune_agentic_retrieve_references(project, name)
|
|
262
|
+
self.write_project_spec(project)
|
|
263
|
+
return Ok(None)
|
|
264
|
+
except Exception as exc: # noqa: BLE001
|
|
265
|
+
return Err(exc)
|
|
266
|
+
|
|
267
|
+
def preview_remove(self, name: str) -> RemovalPreview:
|
|
268
|
+
project = to_jsonable(self.read_project_spec())
|
|
269
|
+
kb = next((k for k in project.get("knowledgeBases", []) if k["name"] == name), None)
|
|
270
|
+
if kb is None:
|
|
271
|
+
raise ValueError(f'Knowledge base "{name}" not found.')
|
|
272
|
+
summary = [
|
|
273
|
+
f"Removing knowledge base: {name}",
|
|
274
|
+
f" Data sources ({len(kb['dataSources'])}):",
|
|
275
|
+
*[f" - {_data_source_key(ds)}" for ds in kb["dataSources"]],
|
|
276
|
+
]
|
|
277
|
+
if kb.get("gateway"):
|
|
278
|
+
summary.append(f" Gateway target: '{name}' on '{kb['gateway']}' will be removed")
|
|
279
|
+
|
|
280
|
+
after = copy.deepcopy(project)
|
|
281
|
+
after["knowledgeBases"] = [k for k in after["knowledgeBases"] if k["name"] != name]
|
|
282
|
+
if kb.get("gateway"):
|
|
283
|
+
gw = next((g for g in after.get("agentCoreGateways", []) if g["name"] == kb["gateway"]), None)
|
|
284
|
+
if gw is not None:
|
|
285
|
+
gw["targets"] = [t for t in gw.get("targets", []) if t["name"] != name]
|
|
286
|
+
for action in self._prune_agentic_retrieve_references(after, name):
|
|
287
|
+
if action.removed_target:
|
|
288
|
+
summary.append(
|
|
289
|
+
f" Gateway \"{action.gateway_name}\" agentic-retrieve target '{action.target_name}' will be "
|
|
290
|
+
"removed (was the last KB)"
|
|
291
|
+
)
|
|
292
|
+
else:
|
|
293
|
+
summary.append(
|
|
294
|
+
f" Gateway \"{action.gateway_name}\" agentic-retrieve target '{action.target_name}' will lose "
|
|
295
|
+
f"KB '{name}'"
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
return RemovalPreview(
|
|
299
|
+
summary=summary,
|
|
300
|
+
directories_to_delete=[],
|
|
301
|
+
schema_changes=[SchemaChange(file="agentcore/agentcore.json", before=project, after=after)],
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
def _prune_agentic_retrieve_references(self, project: dict[str, Any], kb_reference: str) -> list[_PruneAction]:
|
|
305
|
+
"""Drop ``kb_reference`` from every bedrock-knowledge-bases connector target's configurations.
|
|
306
|
+
|
|
307
|
+
Removes the target entirely once no configurations remain.
|
|
308
|
+
"""
|
|
309
|
+
actions: list[_PruneAction] = []
|
|
310
|
+
for gw in project.get("agentCoreGateways", []):
|
|
311
|
+
targets = gw.get("targets", [])
|
|
312
|
+
for t_idx in range(len(targets) - 1, -1, -1):
|
|
313
|
+
target = targets[t_idx]
|
|
314
|
+
if (
|
|
315
|
+
target.get("targetType") != "connector"
|
|
316
|
+
or target.get("connectorId") != CONNECTOR_ID["BEDROCK_KNOWLEDGE_BASES"]
|
|
317
|
+
):
|
|
318
|
+
continue
|
|
319
|
+
configs = target.get("configurations")
|
|
320
|
+
if configs is None:
|
|
321
|
+
configs = []
|
|
322
|
+
|
|
323
|
+
agentic_idx = next((i for i, c in enumerate(configs) if c.get("name") == "AgenticRetrieveStream"), -1)
|
|
324
|
+
if agentic_idx != -1:
|
|
325
|
+
agentic_cfg = configs[agentic_idx]
|
|
326
|
+
pv = agentic_cfg.get("parameterValues")
|
|
327
|
+
retrievers = (pv or {}).get("retrievers") or []
|
|
328
|
+
ids = [r["configuration"]["knowledgeBase"]["knowledgeBaseId"] for r in retrievers]
|
|
329
|
+
if kb_reference in ids:
|
|
330
|
+
remaining = [i for i in ids if i != kb_reference]
|
|
331
|
+
if not remaining:
|
|
332
|
+
configs.pop(agentic_idx)
|
|
333
|
+
else:
|
|
334
|
+
agentic_cfg["parameterValues"]["retrievers"] = [
|
|
335
|
+
{"configuration": {"knowledgeBase": {"knowledgeBaseId": i}}} for i in remaining
|
|
336
|
+
]
|
|
337
|
+
|
|
338
|
+
retrieve_idx = next(
|
|
339
|
+
(
|
|
340
|
+
i
|
|
341
|
+
for i, c in enumerate(configs)
|
|
342
|
+
if c.get("name") == "Retrieve"
|
|
343
|
+
and (c.get("parameterValues") or {}).get("knowledgeBaseId") == kb_reference
|
|
344
|
+
),
|
|
345
|
+
-1,
|
|
346
|
+
)
|
|
347
|
+
if retrieve_idx != -1:
|
|
348
|
+
configs.pop(retrieve_idx)
|
|
349
|
+
|
|
350
|
+
if not configs:
|
|
351
|
+
targets.pop(t_idx)
|
|
352
|
+
actions.append(_PruneAction(gw["name"], target["name"], True))
|
|
353
|
+
elif agentic_idx != -1 or retrieve_idx != -1:
|
|
354
|
+
actions.append(_PruneAction(gw["name"], target["name"], False))
|
|
355
|
+
return actions
|
|
356
|
+
|
|
357
|
+
@staticmethod
|
|
358
|
+
def _remove_connector_target(project: dict[str, Any], gateway_name: str, target_name: str) -> None:
|
|
359
|
+
gateway = next((g for g in project.get("agentCoreGateways", []) if g["name"] == gateway_name), None)
|
|
360
|
+
if gateway is not None:
|
|
361
|
+
gateway["targets"] = [t for t in gateway.get("targets", []) if t["name"] != target_name]
|
|
362
|
+
|
|
363
|
+
def get_removable(self) -> list[RemovableResource]:
|
|
364
|
+
try:
|
|
365
|
+
return [RemovableResource(kb.name) for kb in self.read_project_spec().knowledge_bases or []]
|
|
366
|
+
except Exception: # noqa: BLE001
|
|
367
|
+
return []
|
|
368
|
+
|
|
369
|
+
# --- CLI ----------------------------------------------------------------------------
|
|
370
|
+
|
|
371
|
+
def _random_name(self) -> str:
|
|
372
|
+
existing = {kb.name for kb in self.read_project_spec().knowledge_bases or []}
|
|
373
|
+
alphabet = string.digits + string.ascii_lowercase
|
|
374
|
+
while True:
|
|
375
|
+
candidate = "kb-quick-start-" + "".join(random.choice(alphabet) for _ in range(5))
|
|
376
|
+
if candidate not in existing:
|
|
377
|
+
return candidate
|
|
378
|
+
|
|
379
|
+
def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
|
|
380
|
+
@add_app.command(
|
|
381
|
+
self.kind, help="Add a knowledge base (FMKB) to the project, optionally wiring it to a gateway."
|
|
382
|
+
)
|
|
383
|
+
def add_command(
|
|
384
|
+
name: str | None = typer.Option(None, "--name", help="Knowledge base name (default: kb-quick-start-xxxxx)"),
|
|
385
|
+
description: str | None = typer.Option(
|
|
386
|
+
None, "--description", help="Optional description (used for tool discovery)"
|
|
387
|
+
),
|
|
388
|
+
source: list[str] = typer.Option(
|
|
389
|
+
[],
|
|
390
|
+
"--source",
|
|
391
|
+
help="S3 URI for a data source (s3://bucket[/prefix]). Repeatable for multiple data sources.",
|
|
392
|
+
),
|
|
393
|
+
data_source_type: str = typer.Option(
|
|
394
|
+
"s3",
|
|
395
|
+
"--data-source-type",
|
|
396
|
+
help="Data source type: s3 (default), web-crawler, confluence, sharepoint, onedrive, google-drive",
|
|
397
|
+
),
|
|
398
|
+
connector_config: list[str] = typer.Option(
|
|
399
|
+
[],
|
|
400
|
+
"--connector-config",
|
|
401
|
+
help="Path to a JSON connector-config file (required for non-S3 types). Repeatable.",
|
|
402
|
+
),
|
|
403
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
404
|
+
) -> None:
|
|
405
|
+
if not find_config_root():
|
|
406
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
407
|
+
raise typer.Exit(1)
|
|
408
|
+
|
|
409
|
+
# --data-source-type always has a default, so only user-supplied flags count.
|
|
410
|
+
if not (name or description or source or connector_config or as_json):
|
|
411
|
+
try:
|
|
412
|
+
interactive.require_tty()
|
|
413
|
+
self.add_interactive()
|
|
414
|
+
except typer.Exit:
|
|
415
|
+
raise
|
|
416
|
+
except Exception as exc: # noqa: BLE001
|
|
417
|
+
typer.echo(get_error_message(exc), err=True)
|
|
418
|
+
raise typer.Exit(1) from None
|
|
419
|
+
raise typer.Exit(0)
|
|
420
|
+
|
|
421
|
+
def action() -> None:
|
|
422
|
+
result = self.add(
|
|
423
|
+
AddKnowledgeBaseOptions(
|
|
424
|
+
name=name or self._random_name(),
|
|
425
|
+
description=description,
|
|
426
|
+
source=list(source or []),
|
|
427
|
+
data_source_type=data_source_type,
|
|
428
|
+
connector_config=list(connector_config or []),
|
|
429
|
+
json=as_json,
|
|
430
|
+
)
|
|
431
|
+
)
|
|
432
|
+
if not result.success:
|
|
433
|
+
raise result.error
|
|
434
|
+
value = result.value
|
|
435
|
+
if as_json:
|
|
436
|
+
typer.echo(json.dumps(serialize_result(result), separators=(",", ":")))
|
|
437
|
+
elif value["appended"]:
|
|
438
|
+
for uri in value["newDataSources"]:
|
|
439
|
+
typer.echo(f"Added data source '{uri}' to knowledge-base '{value['knowledgeBaseName']}'")
|
|
440
|
+
else:
|
|
441
|
+
typer.echo(f"Added knowledge base '{value['knowledgeBaseName']}'")
|
|
442
|
+
for uri in value["newDataSources"]:
|
|
443
|
+
typer.echo(f" with data source '{uri}'")
|
|
444
|
+
|
|
445
|
+
run_cli_command(as_json, action)
|
|
446
|
+
|
|
447
|
+
@remove_app.command(self.kind, help="Remove a knowledge base from the project")
|
|
448
|
+
def remove_command(
|
|
449
|
+
name: str | None = typer.Option(None, "--name", help="Knowledge base name"),
|
|
450
|
+
as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
|
|
451
|
+
) -> None:
|
|
452
|
+
if not find_config_root():
|
|
453
|
+
typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
|
|
454
|
+
raise typer.Exit(1)
|
|
455
|
+
|
|
456
|
+
def action() -> None:
|
|
457
|
+
if not name:
|
|
458
|
+
raise ValidationError("A --name is required for `agentcore remove knowledge-base`.")
|
|
459
|
+
result = self.remove(name)
|
|
460
|
+
if not result.success:
|
|
461
|
+
raise result.error
|
|
462
|
+
if as_json:
|
|
463
|
+
typer.echo(json.dumps(serialize_result(result), separators=(",", ":")))
|
|
464
|
+
else:
|
|
465
|
+
typer.echo(f"Removed knowledge base '{name}'")
|
|
466
|
+
|
|
467
|
+
run_cli_command(as_json, action)
|
|
468
|
+
|
|
469
|
+
# --- interactive (port of tui/screens/knowledge-base AddKnowledgeBaseScreen + Flow) ----------
|
|
470
|
+
|
|
471
|
+
def add_interactive(self) -> None:
|
|
472
|
+
from agentcore.primitives._knowledge_base_wizard import run_add_knowledge_base_wizard
|
|
473
|
+
|
|
474
|
+
run_add_knowledge_base_wizard(self)
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
PRIMITIVE = KnowledgeBasePrimitive()
|