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,79 @@
|
|
|
1
|
+
"""Minimal fetch()-like HTTP client for talking to local agent processes (localhost only).
|
|
2
|
+
|
|
3
|
+
Connection failures are raised as :class:`FetchFailedError` (message ``fetch failed``), matching
|
|
4
|
+
how upstream classifies Node fetch errors for retry decisions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import http.client
|
|
8
|
+
import json
|
|
9
|
+
from collections.abc import Iterator, Mapping
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import Any
|
|
12
|
+
from urllib.parse import urlsplit
|
|
13
|
+
|
|
14
|
+
from agentcore.operations.dev.utils import FetchFailedError
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class LocalResponse:
|
|
19
|
+
status: int
|
|
20
|
+
headers: http.client.HTTPMessage
|
|
21
|
+
_resp: http.client.HTTPResponse
|
|
22
|
+
_conn: http.client.HTTPConnection
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def ok(self) -> bool:
|
|
26
|
+
return 200 <= self.status < 300
|
|
27
|
+
|
|
28
|
+
def header(self, name: str) -> str | None:
|
|
29
|
+
return self.headers.get(name)
|
|
30
|
+
|
|
31
|
+
def iter_chunks(self, size: int = 8192) -> Iterator[bytes]:
|
|
32
|
+
try:
|
|
33
|
+
while True:
|
|
34
|
+
chunk = self._resp.read1(size)
|
|
35
|
+
if not chunk:
|
|
36
|
+
break
|
|
37
|
+
yield chunk
|
|
38
|
+
finally:
|
|
39
|
+
self.close()
|
|
40
|
+
|
|
41
|
+
def read(self) -> bytes:
|
|
42
|
+
try:
|
|
43
|
+
return self._resp.read()
|
|
44
|
+
finally:
|
|
45
|
+
self.close()
|
|
46
|
+
|
|
47
|
+
def text(self) -> str:
|
|
48
|
+
return self.read().decode("utf-8", errors="replace")
|
|
49
|
+
|
|
50
|
+
def json(self) -> Any:
|
|
51
|
+
return json.loads(self.text())
|
|
52
|
+
|
|
53
|
+
def close(self) -> None:
|
|
54
|
+
try:
|
|
55
|
+
self._resp.close()
|
|
56
|
+
finally:
|
|
57
|
+
self._conn.close()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def fetch(
|
|
61
|
+
url: str,
|
|
62
|
+
method: str = "GET",
|
|
63
|
+
headers: Mapping[str, str] | None = None,
|
|
64
|
+
body: str | bytes | None = None,
|
|
65
|
+
timeout: float | None = None,
|
|
66
|
+
) -> LocalResponse:
|
|
67
|
+
parts = urlsplit(url)
|
|
68
|
+
conn = http.client.HTTPConnection(parts.hostname or "localhost", parts.port or 80, timeout=timeout)
|
|
69
|
+
path = parts.path or "/"
|
|
70
|
+
if parts.query:
|
|
71
|
+
path += f"?{parts.query}"
|
|
72
|
+
data = body.encode("utf-8") if isinstance(body, str) else body
|
|
73
|
+
try:
|
|
74
|
+
conn.request(method, path, body=data, headers=dict(headers or {}))
|
|
75
|
+
resp = conn.getresponse()
|
|
76
|
+
except (ConnectionError, OSError) as exc:
|
|
77
|
+
conn.close()
|
|
78
|
+
raise FetchFailedError(exc) from exc
|
|
79
|
+
return LocalResponse(status=resp.status, headers=resp.headers, _resp=resp, _conn=conn)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""stdlib HTTP server plumbing with a Node ``ServerResponse``-like API.
|
|
2
|
+
|
|
3
|
+
Handlers are ported from Node's ``http`` module and written against :class:`Response`
|
|
4
|
+
(``set_header`` / ``write_head`` / ``write`` / ``end`` / ``headers_sent``). Responses without a
|
|
5
|
+
``Content-Length`` use chunked transfer encoding (as Node does), so SSE streams flush per write and
|
|
6
|
+
HTTP/1.1 keep-alive still works.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import threading
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def js_dumps(value: Any) -> str:
|
|
17
|
+
"""``JSON.stringify(value)``: compact, non-ASCII kept, ``None`` dict values dropped (undefined)."""
|
|
18
|
+
|
|
19
|
+
def clean(v: Any) -> Any:
|
|
20
|
+
if isinstance(v, dict):
|
|
21
|
+
return {k: clean(x) for k, x in v.items() if x is not None}
|
|
22
|
+
if isinstance(v, (list, tuple)):
|
|
23
|
+
return [clean(x) for x in v]
|
|
24
|
+
return v
|
|
25
|
+
|
|
26
|
+
return json.dumps(clean(value), ensure_ascii=False, separators=(",", ":"))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Request:
|
|
30
|
+
def __init__(self, handler: BaseHTTPRequestHandler):
|
|
31
|
+
self._handler = handler
|
|
32
|
+
self.method = handler.command
|
|
33
|
+
self.url = handler.path
|
|
34
|
+
self.headers = handler.headers
|
|
35
|
+
self._body: bytes | None = None
|
|
36
|
+
|
|
37
|
+
def header(self, name: str) -> str | None:
|
|
38
|
+
return self.headers.get(name)
|
|
39
|
+
|
|
40
|
+
def read_body(self) -> bytes:
|
|
41
|
+
if self._body is None:
|
|
42
|
+
length = int(self.headers.get("Content-Length") or 0)
|
|
43
|
+
if length:
|
|
44
|
+
self._body = self._handler.rfile.read(length)
|
|
45
|
+
elif "chunked" in (self.headers.get("Transfer-Encoding") or "").lower():
|
|
46
|
+
self._body = self._read_chunked()
|
|
47
|
+
else:
|
|
48
|
+
self._body = b""
|
|
49
|
+
return self._body
|
|
50
|
+
|
|
51
|
+
def _read_chunked(self) -> bytes:
|
|
52
|
+
rfile = self._handler.rfile
|
|
53
|
+
out = bytearray()
|
|
54
|
+
while True:
|
|
55
|
+
size_line = rfile.readline().strip().split(b";")[0]
|
|
56
|
+
size = int(size_line or b"0", 16)
|
|
57
|
+
if size == 0:
|
|
58
|
+
while rfile.readline() not in (b"\r\n", b"\n", b""):
|
|
59
|
+
pass
|
|
60
|
+
return bytes(out)
|
|
61
|
+
out += rfile.read(size)
|
|
62
|
+
rfile.readline()
|
|
63
|
+
|
|
64
|
+
def text(self) -> str:
|
|
65
|
+
return self.read_body().decode("utf-8", errors="replace")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class Response:
|
|
69
|
+
def __init__(self, handler: BaseHTTPRequestHandler):
|
|
70
|
+
self._handler = handler
|
|
71
|
+
self._headers: dict[str, str] = {}
|
|
72
|
+
self.headers_sent = False
|
|
73
|
+
self.finished = False
|
|
74
|
+
self._chunked = False
|
|
75
|
+
self._lock = threading.Lock()
|
|
76
|
+
|
|
77
|
+
def set_header(self, name: str, value: str) -> None:
|
|
78
|
+
self._headers[name] = value
|
|
79
|
+
|
|
80
|
+
def write_head(self, status: int, headers: dict[str, str] | None = None) -> None:
|
|
81
|
+
if self.headers_sent:
|
|
82
|
+
return
|
|
83
|
+
merged = {**self._headers, **(headers or {})}
|
|
84
|
+
h = self._handler
|
|
85
|
+
h.send_response_only(status)
|
|
86
|
+
h.send_header("Date", h.date_time_string())
|
|
87
|
+
for name, value in merged.items():
|
|
88
|
+
h.send_header(name, value)
|
|
89
|
+
if not any(k.lower() == "content-length" for k in merged):
|
|
90
|
+
if h.request_version == "HTTP/1.1" and h.command != "HEAD" and status not in (204, 304):
|
|
91
|
+
self._chunked = True
|
|
92
|
+
h.send_header("Transfer-Encoding", "chunked")
|
|
93
|
+
elif status not in (204, 304):
|
|
94
|
+
h.close_connection = True
|
|
95
|
+
h.end_headers()
|
|
96
|
+
self.headers_sent = True
|
|
97
|
+
|
|
98
|
+
def write(self, data: str | bytes) -> None:
|
|
99
|
+
if self.finished:
|
|
100
|
+
return
|
|
101
|
+
if not self.headers_sent:
|
|
102
|
+
self.write_head(200)
|
|
103
|
+
payload = data.encode("utf-8") if isinstance(data, str) else data
|
|
104
|
+
if not payload:
|
|
105
|
+
return
|
|
106
|
+
with self._lock:
|
|
107
|
+
try:
|
|
108
|
+
if self._chunked:
|
|
109
|
+
self._handler.wfile.write(f"{len(payload):X}\r\n".encode() + payload + b"\r\n")
|
|
110
|
+
else:
|
|
111
|
+
self._handler.wfile.write(payload)
|
|
112
|
+
self._handler.wfile.flush()
|
|
113
|
+
except OSError:
|
|
114
|
+
self._handler.close_connection = True
|
|
115
|
+
|
|
116
|
+
def end(self, data: str | bytes | None = None) -> None:
|
|
117
|
+
if self.finished:
|
|
118
|
+
return
|
|
119
|
+
if data:
|
|
120
|
+
self.write(data)
|
|
121
|
+
if not self.headers_sent:
|
|
122
|
+
self.write_head(200)
|
|
123
|
+
with self._lock:
|
|
124
|
+
try:
|
|
125
|
+
if self._chunked:
|
|
126
|
+
self._handler.wfile.write(b"0\r\n\r\n")
|
|
127
|
+
self._handler.wfile.flush()
|
|
128
|
+
except OSError:
|
|
129
|
+
self._handler.close_connection = True
|
|
130
|
+
self.finished = True
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
RouteFn = Callable[[Request, Response], None]
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def make_server(host: str, port: int, route: RouteFn) -> ThreadingHTTPServer:
|
|
137
|
+
"""Threaded server where every request (any method) is dispatched to ``route``."""
|
|
138
|
+
|
|
139
|
+
class Handler(BaseHTTPRequestHandler):
|
|
140
|
+
protocol_version = "HTTP/1.1"
|
|
141
|
+
|
|
142
|
+
def log_message(self, format: str, *args: Any) -> None:
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
def _dispatch(self) -> None:
|
|
146
|
+
req, res = Request(self), Response(self)
|
|
147
|
+
try:
|
|
148
|
+
route(req, res)
|
|
149
|
+
finally:
|
|
150
|
+
if not res.finished:
|
|
151
|
+
res.end()
|
|
152
|
+
# Drain an unread request body so the next keep-alive request parses cleanly.
|
|
153
|
+
if req._body is None and int(self.headers.get("Content-Length") or 0):
|
|
154
|
+
try:
|
|
155
|
+
req.read_body()
|
|
156
|
+
except OSError:
|
|
157
|
+
self.close_connection = True
|
|
158
|
+
|
|
159
|
+
do_GET = do_POST = do_PUT = do_DELETE = do_PATCH = do_OPTIONS = do_HEAD = _dispatch
|
|
160
|
+
|
|
161
|
+
class Server(ThreadingHTTPServer):
|
|
162
|
+
daemon_threads = True
|
|
163
|
+
allow_reuse_address = True
|
|
164
|
+
|
|
165
|
+
return Server((host, port), Handler)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Port of operations/dev/codezip-dev-server.ts: run uvicorn / python / `npx tsx watch` locally."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import subprocess
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
|
|
7
|
+
from agentcore.lib.utils.platform import get_shell_args, get_shell_command, get_venv_executable, is_windows
|
|
8
|
+
from agentcore.lib.utils.subprocess import run_subprocess_capture
|
|
9
|
+
from agentcore.operations.dev.constants import A2A_PORT_ENV
|
|
10
|
+
from agentcore.operations.dev.dev_server import DevServer, LogLevel, SpawnConfig
|
|
11
|
+
from agentcore.operations.dev.utils import convert_entrypoint_to_module
|
|
12
|
+
|
|
13
|
+
OnLog = Callable[[LogLevel, str], None]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _run_uv(args: list[str], cwd: str) -> subprocess.CompletedProcess[bytes] | None:
|
|
17
|
+
try:
|
|
18
|
+
return subprocess.run(["uv", *args], cwd=cwd, stdin=subprocess.DEVNULL, capture_output=True)
|
|
19
|
+
except OSError:
|
|
20
|
+
return None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _stderr(result: subprocess.CompletedProcess[bytes] | None) -> str:
|
|
24
|
+
text = result.stderr.decode("utf-8", errors="replace") if result is not None and result.stderr else ""
|
|
25
|
+
return text or "unknown error"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def ensure_python_venv(cwd: str, on_log: OnLog, protocol: str = "HTTP") -> bool:
|
|
29
|
+
"""Create .venv and `uv sync` unless the venv already has uvicorn (HTTP) or python (others)."""
|
|
30
|
+
venv_path = os.path.join(cwd, ".venv")
|
|
31
|
+
probe = get_venv_executable(venv_path, "uvicorn" if protocol == "HTTP" else "python")
|
|
32
|
+
if os.path.exists(probe):
|
|
33
|
+
return True
|
|
34
|
+
|
|
35
|
+
on_log("system", "Setting up Python environment...")
|
|
36
|
+
|
|
37
|
+
if not os.path.exists(venv_path):
|
|
38
|
+
on_log("info", "Creating virtual environment...")
|
|
39
|
+
result = _run_uv(["venv"], cwd)
|
|
40
|
+
if result is None or result.returncode != 0:
|
|
41
|
+
on_log("error", f"Failed to create venv: {_stderr(result)}")
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
on_log("info", "Installing dependencies...")
|
|
45
|
+
sync = _run_uv(["sync"], cwd)
|
|
46
|
+
if sync is None or sync.returncode != 0:
|
|
47
|
+
if protocol == "HTTP":
|
|
48
|
+
on_log("warn", "uv sync failed, trying direct uvicorn install...")
|
|
49
|
+
pip = _run_uv(["pip", "install", "uvicorn"], cwd)
|
|
50
|
+
if pip is None or pip.returncode != 0:
|
|
51
|
+
on_log("error", f"Failed to install dependencies: {_stderr(pip)}")
|
|
52
|
+
return False
|
|
53
|
+
else:
|
|
54
|
+
on_log("error", f"Failed to install dependencies: {_stderr(sync)}")
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
on_log("system", "Python environment ready")
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def ensure_node_deps(cwd: str, on_log: OnLog) -> bool:
|
|
62
|
+
"""Install Node deps (pnpm/yarn by lockfile, else npm) when node_modules is missing."""
|
|
63
|
+
if os.path.exists(os.path.join(cwd, "node_modules")):
|
|
64
|
+
return True
|
|
65
|
+
cmd = "npm"
|
|
66
|
+
if os.path.exists(os.path.join(cwd, "pnpm-lock.yaml")):
|
|
67
|
+
cmd = "pnpm"
|
|
68
|
+
elif os.path.exists(os.path.join(cwd, "yarn.lock")):
|
|
69
|
+
cmd = "yarn"
|
|
70
|
+
on_log("system", "Installing Node dependencies...")
|
|
71
|
+
result = run_subprocess_capture(cmd, ["install"], cwd=cwd)
|
|
72
|
+
if result.code != 0:
|
|
73
|
+
detail = result.stderr or result.stdout or f"{cmd} exited with code {result.code}"
|
|
74
|
+
on_log("error", f"Failed to install Node dependencies: {detail}")
|
|
75
|
+
return False
|
|
76
|
+
on_log("system", "Node dependencies ready")
|
|
77
|
+
return True
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def find_otel_sitecustomize_dir(venv_path: str) -> str | None:
|
|
81
|
+
"""Directory holding OpenTelemetry's auto-instrumentation sitecustomize.py, if installed."""
|
|
82
|
+
try:
|
|
83
|
+
result = subprocess.run(
|
|
84
|
+
[
|
|
85
|
+
get_venv_executable(venv_path, "python"),
|
|
86
|
+
"-c",
|
|
87
|
+
"import opentelemetry.instrumentation.auto_instrumentation as m; import os; "
|
|
88
|
+
"print(os.path.dirname(m.__file__))",
|
|
89
|
+
],
|
|
90
|
+
cwd=venv_path,
|
|
91
|
+
stdin=subprocess.DEVNULL,
|
|
92
|
+
capture_output=True,
|
|
93
|
+
)
|
|
94
|
+
except OSError:
|
|
95
|
+
return None
|
|
96
|
+
if result.returncode == 0:
|
|
97
|
+
directory = result.stdout.decode("utf-8", errors="replace").strip()
|
|
98
|
+
if directory and os.path.exists(os.path.join(directory, "sitecustomize.py")):
|
|
99
|
+
return directory
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class CodeZipDevServer(DevServer):
|
|
104
|
+
"""Runs uvicorn --reload (Python HTTP), `python main.py` (other Python), or `npx tsx watch`."""
|
|
105
|
+
|
|
106
|
+
def prepare(self) -> bool:
|
|
107
|
+
if self.config.is_python:
|
|
108
|
+
return ensure_python_venv(self.config.directory, self.options.callbacks.on_log, self.config.protocol)
|
|
109
|
+
return ensure_node_deps(self.config.directory, self.options.callbacks.on_log)
|
|
110
|
+
|
|
111
|
+
def get_spawn_config(self) -> SpawnConfig:
|
|
112
|
+
module, directory, protocol = self.config.module, self.config.directory, self.config.protocol
|
|
113
|
+
port = self.options.port
|
|
114
|
+
env_vars = self.options.env_vars or {}
|
|
115
|
+
env = {**os.environ, **env_vars, "PORT": str(port), "LOCAL_DEV": "1"}
|
|
116
|
+
|
|
117
|
+
# FastMCP currently ignores FASTMCP_PORT (always binds 8000); set it for forward compatibility.
|
|
118
|
+
if protocol == "MCP":
|
|
119
|
+
env["FASTMCP_PORT"] = str(port)
|
|
120
|
+
if protocol == "A2A":
|
|
121
|
+
env["AGENTCORE_RUNTIME_URL"] = f"http://localhost:{port}/"
|
|
122
|
+
env[A2A_PORT_ENV] = str(port)
|
|
123
|
+
|
|
124
|
+
if not self.config.is_python:
|
|
125
|
+
entry_file = module.split(":")[0] or module
|
|
126
|
+
if is_windows:
|
|
127
|
+
return SpawnConfig(
|
|
128
|
+
cmd=get_shell_command(), args=get_shell_args(f"npx tsx watch {entry_file}"), cwd=directory, env=env
|
|
129
|
+
)
|
|
130
|
+
return SpawnConfig(cmd="npx", args=["tsx", "watch", entry_file], cwd=directory, env=env)
|
|
131
|
+
|
|
132
|
+
venv_dir = os.path.join(directory, ".venv")
|
|
133
|
+
# Prepend OTEL's sitecustomize dir to PYTHONPATH so both the uvicorn reloader and every worker
|
|
134
|
+
# it spawns are auto-instrumented (opentelemetry-instrument would only wrap the reloader).
|
|
135
|
+
otel_dir = find_otel_sitecustomize_dir(venv_dir)
|
|
136
|
+
if env_vars.get("OTEL_EXPORTER_OTLP_ENDPOINT") and otel_dir:
|
|
137
|
+
existing = env.get("PYTHONPATH", "")
|
|
138
|
+
env["PYTHONPATH"] = f"{otel_dir}{os.pathsep}{existing}" if existing else otel_dir
|
|
139
|
+
|
|
140
|
+
if protocol != "HTTP":
|
|
141
|
+
python = get_venv_executable(venv_dir, "python")
|
|
142
|
+
entry_file = module.split(":")[0] or module
|
|
143
|
+
return SpawnConfig(cmd=python, args=[entry_file], cwd=directory, env=env)
|
|
144
|
+
|
|
145
|
+
uvicorn = get_venv_executable(venv_dir, "uvicorn")
|
|
146
|
+
return SpawnConfig(
|
|
147
|
+
cmd=uvicorn,
|
|
148
|
+
args=[convert_entrypoint_to_module(module), "--reload", "--host", "127.0.0.1", "--port", str(port)],
|
|
149
|
+
cwd=directory,
|
|
150
|
+
env=env,
|
|
151
|
+
)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""Port of operations/dev/config.ts: derive the dev server config for a runtime."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from agentcore.lib.schemas.io.config_io import ConfigIO
|
|
8
|
+
from agentcore.lib.schemas.io.path_resolver import find_config_root
|
|
9
|
+
from agentcore.operations.dev.constants import A2A_DEFAULT_PORT, MCP_DEFAULT_PORT
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class DevConfig:
|
|
14
|
+
agent_name: str
|
|
15
|
+
module: str
|
|
16
|
+
directory: str
|
|
17
|
+
has_config: bool
|
|
18
|
+
is_python: bool
|
|
19
|
+
build_type: str
|
|
20
|
+
protocol: str
|
|
21
|
+
dockerfile: str | None = None
|
|
22
|
+
build_context_path: str | None = None
|
|
23
|
+
"""Resolved absolute path to use as the Docker build context. Defaults to ``directory``."""
|
|
24
|
+
custom_docker_build_args: dict[str, str] | None = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _runtimes(project: Any) -> list[Any]:
|
|
28
|
+
return list(getattr(project, "runtimes", None) or [])
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _is_python_agent(agent: Any) -> bool:
|
|
32
|
+
entrypoint = agent.entrypoint or ""
|
|
33
|
+
return entrypoint.endswith(".py") or ".py:" in entrypoint
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _dev_support_reason(agent: Any) -> str | None:
|
|
37
|
+
if not getattr(agent, "entrypoint", None):
|
|
38
|
+
return f'Agent "{agent.name}" is missing entrypoint.'
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _resolve_code_directory(code_location: str, config_root: str) -> str:
|
|
43
|
+
clean = code_location.removesuffix("/")
|
|
44
|
+
if os.path.isabs(clean):
|
|
45
|
+
return clean
|
|
46
|
+
return os.path.normpath(os.path.join(os.path.dirname(config_root), clean))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_dev_supported_agents(project: Any | None) -> list[Any]:
|
|
50
|
+
if project is None:
|
|
51
|
+
return []
|
|
52
|
+
return [a for a in _runtimes(project) if _dev_support_reason(a) is None]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def requires_exact_dev_port(protocol: str) -> bool:
|
|
56
|
+
"""A2A derives its port from config and FastMCP ignores overrides: neither can move."""
|
|
57
|
+
return protocol in ("A2A", "MCP")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_agent_port(project: Any | None, agent_name: str, base_port: int, explicit: bool = False) -> int:
|
|
61
|
+
"""Explicit ports are used literally; default ports are offset by the runtime's index."""
|
|
62
|
+
if explicit or project is None:
|
|
63
|
+
return base_port
|
|
64
|
+
names = [a.name for a in _runtimes(project)]
|
|
65
|
+
return base_port + names.index(agent_name) if agent_name in names else base_port
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def get_dev_port(project: Any | None, agent_name: str, protocol: str, base_port: int, explicit: bool = False) -> int:
|
|
69
|
+
if protocol == "MCP":
|
|
70
|
+
return MCP_DEFAULT_PORT
|
|
71
|
+
if explicit:
|
|
72
|
+
return base_port
|
|
73
|
+
protocol_base = A2A_DEFAULT_PORT if protocol == "A2A" else base_port
|
|
74
|
+
return get_agent_port(project, agent_name, protocol_base)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_dev_config(
|
|
78
|
+
working_dir: str, project: Any | None, config_root: str | None = None, agent_name: str | None = None
|
|
79
|
+
) -> DevConfig | None:
|
|
80
|
+
if project is None:
|
|
81
|
+
raise ValueError("No project configuration found")
|
|
82
|
+
|
|
83
|
+
if agent_name:
|
|
84
|
+
target = next((a for a in _runtimes(project) if a.name == agent_name), None)
|
|
85
|
+
if target is None:
|
|
86
|
+
raise ValueError(f'Agent "{agent_name}" not found in project.')
|
|
87
|
+
else:
|
|
88
|
+
supported = get_dev_supported_agents(project)
|
|
89
|
+
target = supported[0] if supported else None
|
|
90
|
+
|
|
91
|
+
if target is None:
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
reason = _dev_support_reason(target)
|
|
95
|
+
if reason is not None:
|
|
96
|
+
raise ValueError(reason)
|
|
97
|
+
|
|
98
|
+
code_location = getattr(target, "code_location", None)
|
|
99
|
+
directory = _resolve_code_directory(code_location, config_root) if config_root and code_location else working_dir
|
|
100
|
+
build_context = getattr(target, "build_context_path", None)
|
|
101
|
+
return DevConfig(
|
|
102
|
+
agent_name=target.name,
|
|
103
|
+
module=target.entrypoint,
|
|
104
|
+
directory=directory,
|
|
105
|
+
has_config=True,
|
|
106
|
+
is_python=_is_python_agent(target),
|
|
107
|
+
build_type=target.build,
|
|
108
|
+
protocol=getattr(target, "protocol", None) or "HTTP",
|
|
109
|
+
dockerfile=getattr(target, "dockerfile", None),
|
|
110
|
+
build_context_path=_resolve_code_directory(build_context, config_root)
|
|
111
|
+
if config_root and build_context
|
|
112
|
+
else None,
|
|
113
|
+
custom_docker_build_args=getattr(target, "custom_docker_build_args", None),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def load_project_config(working_dir: str) -> Any | None:
|
|
118
|
+
"""Read agentcore.json from the project containing ``working_dir``; None if missing/invalid."""
|
|
119
|
+
config_root = find_config_root(working_dir)
|
|
120
|
+
if not config_root:
|
|
121
|
+
return None
|
|
122
|
+
config_io = ConfigIO(base_dir=config_root)
|
|
123
|
+
if not config_io.config_exists("project"):
|
|
124
|
+
return None
|
|
125
|
+
try:
|
|
126
|
+
return config_io.read_project_spec()
|
|
127
|
+
except Exception: # noqa: BLE001 - invalid config is treated as "no project", as upstream
|
|
128
|
+
return None
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Port of operations/dev/constants.ts."""
|
|
2
|
+
|
|
3
|
+
MCP_DEFAULT_PORT = 8000
|
|
4
|
+
A2A_DEFAULT_PORT = 9000
|
|
5
|
+
|
|
6
|
+
# Protocol-scoped port override read by the SDK's `serve_a2a()`. The generic `PORT` is not used
|
|
7
|
+
# for A2A: shared images set it to another protocol's port (8080 for HTTP, 8000 for MCP), which
|
|
8
|
+
# would bind the A2A server off-contract.
|
|
9
|
+
A2A_PORT_ENV = "A2A_PORT"
|