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.
Files changed (655) hide show
  1. agentcore/__init__.py +1 -0
  2. agentcore/agent_inspector/NOTICE +9 -0
  3. agentcore/agent_inspector/favicon.svg +60 -0
  4. agentcore/agent_inspector/index.css +1 -0
  5. agentcore/agent_inspector/index.html +14 -0
  6. agentcore/agent_inspector/index.js +289 -0
  7. agentcore/assets/AGENTS.md +60 -0
  8. agentcore/assets/README.md +108 -0
  9. agentcore/assets/agents/AGENTS.md +218 -0
  10. agentcore/assets/cdk/.prettierrc +8 -0
  11. agentcore/assets/cdk/README.md +26 -0
  12. agentcore/assets/cdk/bin/cdk.ts +216 -0
  13. agentcore/assets/cdk/cdk.json +88 -0
  14. agentcore/assets/cdk/gitignore.template +9 -0
  15. agentcore/assets/cdk/jest.config.js +9 -0
  16. agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
  17. agentcore/assets/cdk/npmignore.template +6 -0
  18. agentcore/assets/cdk/package.json +30 -0
  19. agentcore/assets/cdk/test/cdk.test.ts +31 -0
  20. agentcore/assets/cdk/tsconfig.json +28 -0
  21. agentcore/assets/container/python/Dockerfile +47 -0
  22. agentcore/assets/container/python/dockerignore.template +27 -0
  23. agentcore/assets/container/typescript/Dockerfile +25 -0
  24. agentcore/assets/container/typescript/dockerignore.template +24 -0
  25. agentcore/assets/datasets/predefined-v1.jsonl +3 -0
  26. agentcore/assets/datasets/simulated-v1.jsonl +3 -0
  27. agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
  28. agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
  29. agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
  30. agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
  31. agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
  32. agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
  33. agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
  34. agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
  35. agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
  36. agentcore/assets/harness/invoke.py.template +74 -0
  37. agentcore/assets/mcp/python/README.md +27 -0
  38. agentcore/assets/mcp/python/pyproject.toml +22 -0
  39. agentcore/assets/mcp/python/server.py +117 -0
  40. agentcore/assets/mcp/python-lambda/README.md +22 -0
  41. agentcore/assets/mcp/python-lambda/handler.py +144 -0
  42. agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
  43. agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
  44. agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
  45. agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
  46. agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
  47. agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
  48. agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
  49. agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
  50. agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
  51. agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
  52. agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
  53. agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
  54. agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
  55. agentcore/assets/python/a2a/strands/base/README.md +22 -0
  56. agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
  57. agentcore/assets/python/a2a/strands/base/main.py +113 -0
  58. agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
  59. agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
  60. agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
  61. agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
  62. agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
  63. agentcore/assets/python/agui/googleadk/base/README.md +30 -0
  64. agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
  65. agentcore/assets/python/agui/googleadk/base/main.py +91 -0
  66. agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
  67. agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
  68. agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
  69. agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
  70. agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
  71. agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
  72. agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
  73. agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
  74. agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
  75. agentcore/assets/python/agui/strands/base/README.md +22 -0
  76. agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
  77. agentcore/assets/python/agui/strands/base/main.py +105 -0
  78. agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
  79. agentcore/assets/python/agui/strands/base/model/load.py +123 -0
  80. agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
  81. agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
  82. agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
  83. agentcore/assets/python/http/autogen/base/README.md +45 -0
  84. agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
  85. agentcore/assets/python/http/autogen/base/main.py +145 -0
  86. agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
  87. agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
  88. agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
  89. agentcore/assets/python/http/autogen/base/model/load.py +136 -0
  90. agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
  91. agentcore/assets/python/http/bma/base/Dockerfile +41 -0
  92. agentcore/assets/python/http/bma/base/README.md +178 -0
  93. agentcore/assets/python/http/bma/base/client.py +200 -0
  94. agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
  95. agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
  96. agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
  97. agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
  98. agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
  99. agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
  100. agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
  101. agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
  102. agentcore/assets/python/http/googleadk/base/README.md +45 -0
  103. agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
  104. agentcore/assets/python/http/googleadk/base/main.py +207 -0
  105. agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
  106. agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
  107. agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
  108. agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
  109. agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
  110. agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
  111. agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
  112. agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
  113. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
  114. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
  115. agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
  116. agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
  117. agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
  118. agentcore/assets/python/http/openaiagents/base/README.md +45 -0
  119. agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
  120. agentcore/assets/python/http/openaiagents/base/main.py +200 -0
  121. agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
  122. agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
  123. agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
  124. agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
  125. agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
  126. agentcore/assets/python/http/strands/base/README.md +46 -0
  127. agentcore/assets/python/http/strands/base/gitignore.template +41 -0
  128. agentcore/assets/python/http/strands/base/main.py +714 -0
  129. agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
  130. agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
  131. agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
  132. agentcore/assets/python/http/strands/base/model/load.py +239 -0
  133. agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
  134. agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
  135. agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
  136. agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
  137. agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
  138. agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
  139. agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
  140. agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
  141. agentcore/assets/python/mcp/standalone/base/README.md +36 -0
  142. agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
  143. agentcore/assets/python/mcp/standalone/base/main.py +83 -0
  144. agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
  145. agentcore/assets/typescript/.gitkeep +0 -0
  146. agentcore/assets/typescript/http/strands/base/README.md +42 -0
  147. agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
  148. agentcore/assets/typescript/http/strands/base/main.ts +149 -0
  149. agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
  150. agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
  151. agentcore/assets/typescript/http/strands/base/package.json +38 -0
  152. agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
  153. agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
  154. agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
  155. agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
  156. agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
  157. agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
  158. agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
  159. agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
  160. agentcore/aws/__init__.py +263 -0
  161. agentcore/aws/_aws_errors.py +72 -0
  162. agentcore/aws/_http.py +176 -0
  163. agentcore/aws/_util.py +37 -0
  164. agentcore/aws/account.py +165 -0
  165. agentcore/aws/agentcore.py +971 -0
  166. agentcore/aws/agentcore_ab_tests.py +230 -0
  167. agentcore/aws/agentcore_batch_evaluation.py +227 -0
  168. agentcore/aws/agentcore_config_bundles.py +220 -0
  169. agentcore/aws/agentcore_control.py +994 -0
  170. agentcore/aws/agentcore_datasets.py +222 -0
  171. agentcore/aws/agentcore_harness.py +330 -0
  172. agentcore/aws/agentcore_payments.py +430 -0
  173. agentcore/aws/agentcore_recommendation.py +140 -0
  174. agentcore/aws/agui_parser.py +131 -0
  175. agentcore/aws/agui_types.py +342 -0
  176. agentcore/aws/api_client.py +87 -0
  177. agentcore/aws/arn.py +18 -0
  178. agentcore/aws/aws_context.py +23 -0
  179. agentcore/aws/bedrock.py +44 -0
  180. agentcore/aws/bedrock_agent.py +129 -0
  181. agentcore/aws/bedrock_import.py +252 -0
  182. agentcore/aws/bedrock_import_types.py +111 -0
  183. agentcore/aws/cloudwatch.py +136 -0
  184. agentcore/aws/connect_shell.py +266 -0
  185. agentcore/aws/iam.py +41 -0
  186. agentcore/aws/partition.py +58 -0
  187. agentcore/aws/policy_generation.py +116 -0
  188. agentcore/aws/region.py +54 -0
  189. agentcore/aws/retry.py +27 -0
  190. agentcore/aws/shell_framer.py +136 -0
  191. agentcore/aws/stage_endpoint.py +39 -0
  192. agentcore/aws/target_region.py +54 -0
  193. agentcore/aws/transaction_search.py +97 -0
  194. agentcore/cdk/__init__.py +10 -0
  195. agentcore/cdk/constants.py +13 -0
  196. agentcore/cdk/local_cdk_project.py +48 -0
  197. agentcore/cdk/toolkit.py +706 -0
  198. agentcore/cli/__init__.py +0 -0
  199. agentcore/cli/commands/__init__.py +0 -0
  200. agentcore/cli/commands/_jobs_common.py +39 -0
  201. agentcore/cli/commands/_run_wizards.py +639 -0
  202. agentcore/cli/commands/add/__init__.py +37 -0
  203. agentcore/cli/commands/add/_commander.py +52 -0
  204. agentcore/cli/commands/add/_common.py +47 -0
  205. agentcore/cli/commands/add/agent_wizard.py +528 -0
  206. agentcore/cli/commands/add/auth_options.py +154 -0
  207. agentcore/cli/commands/add/skill_action.py +105 -0
  208. agentcore/cli/commands/add/skill_command.py +87 -0
  209. agentcore/cli/commands/add/tool_action.py +160 -0
  210. agentcore/cli/commands/add/tool_command.py +117 -0
  211. agentcore/cli/commands/add/validate.py +333 -0
  212. agentcore/cli/commands/capacity_provider/__init__.py +86 -0
  213. agentcore/cli/commands/capacity_provider/action.py +114 -0
  214. agentcore/cli/commands/capacity_provider/constants.py +22 -0
  215. agentcore/cli/commands/config.py +91 -0
  216. agentcore/cli/commands/config_bundle.py +251 -0
  217. agentcore/cli/commands/create/__init__.py +643 -0
  218. agentcore/cli/commands/create/action.py +406 -0
  219. agentcore/cli/commands/create/dependencies.py +91 -0
  220. agentcore/cli/commands/create/harness_validate.py +82 -0
  221. agentcore/cli/commands/create/validate.py +195 -0
  222. agentcore/cli/commands/create/wizard.py +127 -0
  223. agentcore/cli/commands/dataset.py +119 -0
  224. agentcore/cli/commands/deploy/__init__.py +31 -0
  225. agentcore/cli/commands/deploy/_guards.py +25 -0
  226. agentcore/cli/commands/deploy/actions.py +840 -0
  227. agentcore/cli/commands/deploy/command.py +349 -0
  228. agentcore/cli/commands/deploy/progress.py +115 -0
  229. agentcore/cli/commands/deploy/types.py +68 -0
  230. agentcore/cli/commands/deploy/utils.py +43 -0
  231. agentcore/cli/commands/deploy/validate.py +21 -0
  232. agentcore/cli/commands/dev/__init__.py +5 -0
  233. agentcore/cli/commands/dev/_deps.py +50 -0
  234. agentcore/cli/commands/dev/browser_mode.py +270 -0
  235. agentcore/cli/commands/dev/command.py +450 -0
  236. agentcore/cli/commands/dev/terminal_mode.py +379 -0
  237. agentcore/cli/commands/exec/__init__.py +29 -0
  238. agentcore/cli/commands/exec/action.py +442 -0
  239. agentcore/cli/commands/exec/command.py +206 -0
  240. agentcore/cli/commands/exec/types.py +35 -0
  241. agentcore/cli/commands/export/__init__.py +114 -0
  242. agentcore/cli/commands/export/constants.py +21 -0
  243. agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
  244. agentcore/cli/commands/export/harness_action.py +385 -0
  245. agentcore/cli/commands/export/harness_mapper.py +868 -0
  246. agentcore/cli/commands/export/harness_resolver.py +95 -0
  247. agentcore/cli/commands/export/types.py +90 -0
  248. agentcore/cli/commands/export/wizard.py +97 -0
  249. agentcore/cli/commands/feedback/__init__.py +69 -0
  250. agentcore/cli/commands/feedback/action.py +30 -0
  251. agentcore/cli/commands/feedback/consent_prompt.py +35 -0
  252. agentcore/cli/commands/feedback/wizard.py +49 -0
  253. agentcore/cli/commands/fetch/__init__.py +69 -0
  254. agentcore/cli/commands/fetch/action.py +62 -0
  255. agentcore/cli/commands/help.py +65 -0
  256. agentcore/cli/commands/import_/__init__.py +167 -0
  257. agentcore/cli/commands/import_/_js.py +72 -0
  258. agentcore/cli/commands/import_/actions.py +457 -0
  259. agentcore/cli/commands/import_/constants.py +45 -0
  260. agentcore/cli/commands/import_/import_evaluator.py +140 -0
  261. agentcore/cli/commands/import_/import_gateway.py +520 -0
  262. agentcore/cli/commands/import_/import_memory.py +128 -0
  263. agentcore/cli/commands/import_/import_online_eval.py +165 -0
  264. agentcore/cli/commands/import_/import_pipeline.py +145 -0
  265. agentcore/cli/commands/import_/import_runtime.py +214 -0
  266. agentcore/cli/commands/import_/import_utils.py +410 -0
  267. agentcore/cli/commands/import_/phase1_update.py +110 -0
  268. agentcore/cli/commands/import_/phase2_import.py +206 -0
  269. agentcore/cli/commands/import_/resource_import.py +228 -0
  270. agentcore/cli/commands/import_/template_utils.py +148 -0
  271. agentcore/cli/commands/import_/types.py +150 -0
  272. agentcore/cli/commands/import_/yaml_parser.py +265 -0
  273. agentcore/cli/commands/init.py +196 -0
  274. agentcore/cli/commands/invoke/__init__.py +32 -0
  275. agentcore/cli/commands/invoke/_deps.py +73 -0
  276. agentcore/cli/commands/invoke/action.py +840 -0
  277. agentcore/cli/commands/invoke/command.py +490 -0
  278. agentcore/cli/commands/invoke/constants.py +40 -0
  279. agentcore/cli/commands/invoke/guards.py +23 -0
  280. agentcore/cli/commands/invoke/interactive.py +604 -0
  281. agentcore/cli/commands/invoke/resolve.py +149 -0
  282. agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
  283. agentcore/cli/commands/invoke/types.py +61 -0
  284. agentcore/cli/commands/invoke/validate.py +33 -0
  285. agentcore/cli/commands/job_actions.py +239 -0
  286. agentcore/cli/commands/job_history.py +380 -0
  287. agentcore/cli/commands/logs/__init__.py +53 -0
  288. agentcore/cli/commands/logs/action.py +159 -0
  289. agentcore/cli/commands/logs/filter_pattern.py +17 -0
  290. agentcore/cli/commands/logs/guards.py +51 -0
  291. agentcore/cli/commands/logs_evals.py +42 -0
  292. agentcore/cli/commands/package.py +118 -0
  293. agentcore/cli/commands/remove/__init__.py +172 -0
  294. agentcore/cli/commands/remove/skill_command.py +131 -0
  295. agentcore/cli/commands/remove/tool_command.py +59 -0
  296. agentcore/cli/commands/run.py +808 -0
  297. agentcore/cli/commands/run_ingest.py +97 -0
  298. agentcore/cli/commands/shared/__init__.py +0 -0
  299. agentcore/cli/commands/shared/arn_utils.py +9 -0
  300. agentcore/cli/commands/shared/filesystem_utils.py +421 -0
  301. agentcore/cli/commands/shared/header_utils.py +87 -0
  302. agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
  303. agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
  304. agentcore/cli/commands/shared/region_utils.py +20 -0
  305. agentcore/cli/commands/shared/vpc_utils.py +99 -0
  306. agentcore/cli/commands/status/__init__.py +30 -0
  307. agentcore/cli/commands/status/_guards.py +25 -0
  308. agentcore/cli/commands/status/action.py +741 -0
  309. agentcore/cli/commands/status/command.py +321 -0
  310. agentcore/cli/commands/status/constants.py +36 -0
  311. agentcore/cli/commands/status/format_knowledge_base.py +111 -0
  312. agentcore/cli/commands/telemetry.py +79 -0
  313. agentcore/cli/commands/traces/__init__.py +155 -0
  314. agentcore/cli/commands/traces/action.py +123 -0
  315. agentcore/cli/commands/update/__init__.py +63 -0
  316. agentcore/cli/commands/update/action.py +164 -0
  317. agentcore/cli/commands/validate.py +165 -0
  318. agentcore/cli/constants.py +96 -0
  319. agentcore/cli/errors.py +118 -0
  320. agentcore/cli/external_requirements/__init__.py +67 -0
  321. agentcore/cli/external_requirements/checks.py +280 -0
  322. agentcore/cli/external_requirements/detect.py +55 -0
  323. agentcore/cli/external_requirements/versions.py +57 -0
  324. agentcore/cli/groups.py +23 -0
  325. agentcore/cli/interactive.py +85 -0
  326. agentcore/cli/main.py +137 -0
  327. agentcore/cli/naming.py +11 -0
  328. agentcore/cli/notices.py +42 -0
  329. agentcore/cli/project.py +34 -0
  330. agentcore/cli/run_command.py +27 -0
  331. agentcore/cli/tree.py +135 -0
  332. agentcore/cli/update_notifier.py +123 -0
  333. agentcore/cli/variadic.py +50 -0
  334. agentcore/cloudformation/__init__.py +84 -0
  335. agentcore/cloudformation/bootstrap.py +64 -0
  336. agentcore/cloudformation/logical_ids.py +37 -0
  337. agentcore/cloudformation/outputs.py +566 -0
  338. agentcore/cloudformation/stack_discovery.py +75 -0
  339. agentcore/cloudformation/stack_events.py +107 -0
  340. agentcore/cloudformation/stack_status.py +98 -0
  341. agentcore/cloudformation/types.py +44 -0
  342. agentcore/lib/__init__.py +68 -0
  343. agentcore/lib/constants.py +77 -0
  344. agentcore/lib/dependency_management/__init__.py +23 -0
  345. agentcore/lib/dependency_management/messages.py +92 -0
  346. agentcore/lib/dependency_management/plan.py +98 -0
  347. agentcore/lib/dependency_management/semver.py +137 -0
  348. agentcore/lib/dependency_management/sync.py +139 -0
  349. agentcore/lib/dependency_management/types.py +56 -0
  350. agentcore/lib/errors/__init__.py +5 -0
  351. agentcore/lib/errors/types.py +352 -0
  352. agentcore/lib/errors/validation.py +121 -0
  353. agentcore/lib/packaging/__init__.py +81 -0
  354. agentcore/lib/packaging/build_args.py +23 -0
  355. agentcore/lib/packaging/build_context.py +26 -0
  356. agentcore/lib/packaging/build_context_dockerignore.py +45 -0
  357. agentcore/lib/packaging/container.py +95 -0
  358. agentcore/lib/packaging/helpers.py +289 -0
  359. agentcore/lib/packaging/node.py +153 -0
  360. agentcore/lib/packaging/python.py +135 -0
  361. agentcore/lib/packaging/types.py +69 -0
  362. agentcore/lib/packaging/uv.py +45 -0
  363. agentcore/lib/result.py +104 -0
  364. agentcore/lib/schemas/__init__.py +1 -0
  365. agentcore/lib/schemas/io/__init__.py +27 -0
  366. agentcore/lib/schemas/io/config_io.py +458 -0
  367. agentcore/lib/schemas/io/global_config.py +239 -0
  368. agentcore/lib/schemas/io/path_resolver.py +132 -0
  369. agentcore/lib/secrets/__init__.py +18 -0
  370. agentcore/lib/secrets/cipher.py +70 -0
  371. agentcore/lib/secrets/key_provider.py +163 -0
  372. agentcore/lib/secrets/sensitive_keys.py +55 -0
  373. agentcore/lib/time_constants.py +4 -0
  374. agentcore/lib/utils/__init__.py +47 -0
  375. agentcore/lib/utils/aws_account.py +15 -0
  376. agentcore/lib/utils/credentials.py +68 -0
  377. agentcore/lib/utils/dotenv.py +32 -0
  378. agentcore/lib/utils/env.py +105 -0
  379. agentcore/lib/utils/json_format.py +29 -0
  380. agentcore/lib/utils/json_rpc.py +22 -0
  381. agentcore/lib/utils/platform.py +33 -0
  382. agentcore/lib/utils/polling.py +86 -0
  383. agentcore/lib/utils/subprocess.py +135 -0
  384. agentcore/lib/utils/time_parser.py +48 -0
  385. agentcore/lib/utils/validation.py +106 -0
  386. agentcore/logging/__init__.py +10 -0
  387. agentcore/logging/_common.py +77 -0
  388. agentcore/logging/cdk_io_host.py +36 -0
  389. agentcore/logging/create_logger.py +107 -0
  390. agentcore/logging/dev_logger.py +63 -0
  391. agentcore/logging/exec_logger.py +159 -0
  392. agentcore/logging/invoke_logger.py +154 -0
  393. agentcore/logging/remove_logger.py +95 -0
  394. agentcore/operations/__init__.py +0 -0
  395. agentcore/operations/agent/__init__.py +0 -0
  396. agentcore/operations/agent/config_bundle_defaults.py +31 -0
  397. agentcore/operations/agent/generate/__init__.py +28 -0
  398. agentcore/operations/agent/generate/schema_mapper.py +319 -0
  399. agentcore/operations/agent/generate/types.py +172 -0
  400. agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
  401. agentcore/operations/agent/import_/__init__.py +31 -0
  402. agentcore/operations/agent/import_/base_translator.py +449 -0
  403. agentcore/operations/agent/import_/constants.py +23 -0
  404. agentcore/operations/agent/import_/execute.py +127 -0
  405. agentcore/operations/agent/import_/langgraph_translator.py +294 -0
  406. agentcore/operations/agent/import_/pyproject_generator.py +73 -0
  407. agentcore/operations/agent/import_/strands_translator.py +289 -0
  408. agentcore/operations/config_bundle/__init__.py +1 -0
  409. agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
  410. agentcore/operations/config_bundle/diff_versions.py +52 -0
  411. agentcore/operations/config_bundle/resolve_bundle.py +65 -0
  412. agentcore/operations/connectors/__init__.py +3 -0
  413. agentcore/operations/connectors/translators.py +63 -0
  414. agentcore/operations/dataset/__init__.py +21 -0
  415. agentcore/operations/dataset/delete.py +7 -0
  416. agentcore/operations/dataset/publish.py +16 -0
  417. agentcore/operations/dataset/pull.py +21 -0
  418. agentcore/operations/dataset/push.py +201 -0
  419. agentcore/operations/dataset/resolve_dataset.py +65 -0
  420. agentcore/operations/dataset/status.py +18 -0
  421. agentcore/operations/dataset/wait.py +25 -0
  422. agentcore/operations/deploy/__init__.py +152 -0
  423. agentcore/operations/deploy/backfill_vpc_id.py +90 -0
  424. agentcore/operations/deploy/change_detection.py +84 -0
  425. agentcore/operations/deploy/constants.py +58 -0
  426. agentcore/operations/deploy/dependency_sync.py +105 -0
  427. agentcore/operations/deploy/ensure_target.py +30 -0
  428. agentcore/operations/deploy/gateway_status.py +44 -0
  429. agentcore/operations/deploy/managed_memory_notice.py +36 -0
  430. agentcore/operations/deploy/payment_connector_authorization.py +106 -0
  431. agentcore/operations/deploy/post_deploy_datasets.py +96 -0
  432. agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
  433. agentcore/operations/deploy/post_deploy_observability.py +28 -0
  434. agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
  435. agentcore/operations/deploy/pre_deploy_identity.py +505 -0
  436. agentcore/operations/deploy/preflight.py +385 -0
  437. agentcore/operations/deploy/region_override.py +45 -0
  438. agentcore/operations/deploy/teardown.py +153 -0
  439. agentcore/operations/dev/__init__.py +61 -0
  440. agentcore/operations/dev/_http.py +79 -0
  441. agentcore/operations/dev/_server.py +165 -0
  442. agentcore/operations/dev/codezip_dev_server.py +151 -0
  443. agentcore/operations/dev/config.py +128 -0
  444. agentcore/operations/dev/constants.py +9 -0
  445. agentcore/operations/dev/container_dev_server.py +237 -0
  446. agentcore/operations/dev/container_runtime.py +37 -0
  447. agentcore/operations/dev/dev_server.py +244 -0
  448. agentcore/operations/dev/gateway_env.py +25 -0
  449. agentcore/operations/dev/invoke.py +214 -0
  450. agentcore/operations/dev/invoke_a2a.py +204 -0
  451. agentcore/operations/dev/invoke_agui.py +88 -0
  452. agentcore/operations/dev/invoke_mcp.py +145 -0
  453. agentcore/operations/dev/invoke_types.py +30 -0
  454. agentcore/operations/dev/load_dev_env.py +26 -0
  455. agentcore/operations/dev/memory_env.py +19 -0
  456. agentcore/operations/dev/otel/__init__.py +5 -0
  457. agentcore/operations/dev/otel/collector.py +234 -0
  458. agentcore/operations/dev/otel/transforms.py +331 -0
  459. agentcore/operations/dev/payment_env.py +50 -0
  460. agentcore/operations/dev/server.py +28 -0
  461. agentcore/operations/dev/sse_transform.py +30 -0
  462. agentcore/operations/dev/utils.py +152 -0
  463. agentcore/operations/dev/web_ui/__init__.py +31 -0
  464. agentcore/operations/dev/web_ui/constants.py +25 -0
  465. agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
  466. agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
  467. agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
  468. agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
  469. agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
  470. agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
  471. agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
  472. agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
  473. agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
  474. agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
  475. agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
  476. agentcore/operations/dev/web_ui/handlers/start.py +182 -0
  477. agentcore/operations/dev/web_ui/handlers/status.py +25 -0
  478. agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
  479. agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
  480. agentcore/operations/dev/web_ui/web_server.py +297 -0
  481. agentcore/operations/eval/__init__.py +8 -0
  482. agentcore/operations/eval/list_eval_runs.py +18 -0
  483. agentcore/operations/eval/logs_eval.py +119 -0
  484. agentcore/operations/eval/pause_resume.py +90 -0
  485. agentcore/operations/eval/run_eval.py +354 -0
  486. agentcore/operations/eval/shared/__init__.py +0 -0
  487. agentcore/operations/eval/shared/dataset_loader.py +68 -0
  488. agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
  489. agentcore/operations/eval/shared/evaluator_runner.py +89 -0
  490. agentcore/operations/eval/shared/scenario_executor.py +71 -0
  491. agentcore/operations/eval/shared/span_collector.py +255 -0
  492. agentcore/operations/eval/storage.py +67 -0
  493. agentcore/operations/feedback/__init__.py +21 -0
  494. agentcore/operations/feedback/aperture_client.py +98 -0
  495. agentcore/operations/feedback/build_payload.py +97 -0
  496. agentcore/operations/feedback/constants.py +26 -0
  497. agentcore/operations/feedback/submit_feedback.py +150 -0
  498. agentcore/operations/fetch_access/__init__.py +36 -0
  499. agentcore/operations/fetch_access/_target.py +17 -0
  500. agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
  501. agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
  502. agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
  503. agentcore/operations/fetch_access/list_agents.py +18 -0
  504. agentcore/operations/fetch_access/list_gateways.py +26 -0
  505. agentcore/operations/fetch_access/list_harnesses.py +23 -0
  506. agentcore/operations/fetch_access/oauth_token.py +162 -0
  507. agentcore/operations/fetch_access/types.py +34 -0
  508. agentcore/operations/harness/__init__.py +1 -0
  509. agentcore/operations/harness/orphan.py +84 -0
  510. agentcore/operations/harness/skill_utils.py +56 -0
  511. agentcore/operations/identity/__init__.py +33 -0
  512. agentcore/operations/identity/api_key_credential_provider.py +68 -0
  513. agentcore/operations/identity/oauth2_credential_provider.py +95 -0
  514. agentcore/operations/ingest/__init__.py +184 -0
  515. agentcore/operations/init/__init__.py +3 -0
  516. agentcore/operations/init/files.py +59 -0
  517. agentcore/operations/insights/__init__.py +21 -0
  518. agentcore/operations/insights/insights_storage.py +67 -0
  519. agentcore/operations/insights/run_insights.py +148 -0
  520. agentcore/operations/invoke/__init__.py +5 -0
  521. agentcore/operations/invoke/resolve_agent_context.py +85 -0
  522. agentcore/operations/jobs/__init__.py +38 -0
  523. agentcore/operations/jobs/ab_test/__init__.py +0 -0
  524. agentcore/operations/jobs/ab_test/build_options.py +126 -0
  525. agentcore/operations/jobs/ab_test/format.py +121 -0
  526. agentcore/operations/jobs/ab_test/handler.py +412 -0
  527. agentcore/operations/jobs/ab_test/promote.py +142 -0
  528. agentcore/operations/jobs/ab_test/resolve.py +221 -0
  529. agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
  530. agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
  531. agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
  532. agentcore/operations/jobs/batch_evaluation/format.py +58 -0
  533. agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
  534. agentcore/operations/jobs/insights/__init__.py +0 -0
  535. agentcore/operations/jobs/insights/format.py +65 -0
  536. agentcore/operations/jobs/insights/handler.py +178 -0
  537. agentcore/operations/jobs/recommendation/__init__.py +0 -0
  538. agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
  539. agentcore/operations/jobs/recommendation/build_config.py +271 -0
  540. agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
  541. agentcore/operations/jobs/recommendation/format.py +77 -0
  542. agentcore/operations/jobs/recommendation/handler.py +331 -0
  543. agentcore/operations/jobs/shared/__init__.py +0 -0
  544. agentcore/operations/jobs/shared/constants.py +85 -0
  545. agentcore/operations/jobs/shared/engine.py +187 -0
  546. agentcore/operations/jobs/shared/format.py +104 -0
  547. agentcore/operations/jobs/shared/region.py +34 -0
  548. agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
  549. agentcore/operations/jobs/shared/storage.py +117 -0
  550. agentcore/operations/jobs/shared/wait.py +30 -0
  551. agentcore/operations/knowledge_base/__init__.py +33 -0
  552. agentcore/operations/knowledge_base/connector_config.py +105 -0
  553. agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
  554. agentcore/operations/mcp/__init__.py +4 -0
  555. agentcore/operations/memory/__init__.py +13 -0
  556. agentcore/operations/memory/_records.py +72 -0
  557. agentcore/operations/memory/list_memory_records.py +45 -0
  558. agentcore/operations/memory/retrieve_memory_records.py +52 -0
  559. agentcore/operations/node/__init__.py +15 -0
  560. agentcore/operations/node/setup.py +36 -0
  561. agentcore/operations/python/__init__.py +17 -0
  562. agentcore/operations/python/setup.py +47 -0
  563. agentcore/operations/resolve_agent.py +159 -0
  564. agentcore/operations/session/__init__.py +86 -0
  565. agentcore/operations/traces/__init__.py +29 -0
  566. agentcore/operations/traces/get_trace.py +202 -0
  567. agentcore/operations/traces/insights_query.py +74 -0
  568. agentcore/operations/traces/list_traces.py +46 -0
  569. agentcore/operations/traces/trace_url.py +25 -0
  570. agentcore/operations/traces/types.py +55 -0
  571. agentcore/primitives/__init__.py +0 -0
  572. agentcore/primitives/_gateway_target_wizard.py +293 -0
  573. agentcore/primitives/_gateway_validation.py +442 -0
  574. agentcore/primitives/_harness_cli.py +557 -0
  575. agentcore/primitives/_harness_validation.py +163 -0
  576. agentcore/primitives/_harness_wizard.py +726 -0
  577. agentcore/primitives/_knowledge_base_wizard.py +259 -0
  578. agentcore/primitives/_payment_wizard.py +331 -0
  579. agentcore/primitives/_policy_form.py +160 -0
  580. agentcore/primitives/agent.py +817 -0
  581. agentcore/primitives/auth_utils.py +77 -0
  582. agentcore/primitives/base.py +178 -0
  583. agentcore/primitives/capacity_provider.py +501 -0
  584. agentcore/primitives/config_bundle.py +329 -0
  585. agentcore/primitives/credential.py +387 -0
  586. agentcore/primitives/credential_utils.py +45 -0
  587. agentcore/primitives/dataset.py +211 -0
  588. agentcore/primitives/deployed_gateways.py +34 -0
  589. agentcore/primitives/evaluator.py +909 -0
  590. agentcore/primitives/gateway.py +496 -0
  591. agentcore/primitives/gateway_target.py +988 -0
  592. agentcore/primitives/harness.py +706 -0
  593. agentcore/primitives/knowledge_base.py +477 -0
  594. agentcore/primitives/memory.py +387 -0
  595. agentcore/primitives/online_eval_config.py +365 -0
  596. agentcore/primitives/online_insights.py +275 -0
  597. agentcore/primitives/payment_connector.py +427 -0
  598. agentcore/primitives/payment_eligible.py +20 -0
  599. agentcore/primitives/payment_manager.py +605 -0
  600. agentcore/primitives/payment_validation.py +68 -0
  601. agentcore/primitives/policy.py +622 -0
  602. agentcore/primitives/policy_engine.py +358 -0
  603. agentcore/primitives/registry.py +56 -0
  604. agentcore/primitives/runtime_endpoint.py +361 -0
  605. agentcore/primitives/secret_flag_warning.py +17 -0
  606. agentcore/schema/__init__.py +14 -0
  607. agentcore/schema/_zod.py +395 -0
  608. agentcore/schema/constants.py +306 -0
  609. agentcore/schema/schemas/__init__.py +40 -0
  610. agentcore/schema/schemas/agent_env.py +545 -0
  611. agentcore/schema/schemas/agentcore_project.py +530 -0
  612. agentcore/schema/schemas/auth.py +286 -0
  613. agentcore/schema/schemas/aws_targets.py +72 -0
  614. agentcore/schema/schemas/connections.py +187 -0
  615. agentcore/schema/schemas/deployed_state.py +322 -0
  616. agentcore/schema/schemas/mcp.py +650 -0
  617. agentcore/schema/schemas/mcp_defs.py +54 -0
  618. agentcore/schema/schemas/primitives/__init__.py +52 -0
  619. agentcore/schema/schemas/primitives/ab_test.py +162 -0
  620. agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
  621. agentcore/schema/schemas/primitives/config_bundle.py +48 -0
  622. agentcore/schema/schemas/primitives/dataset.py +55 -0
  623. agentcore/schema/schemas/primitives/evaluator.py +171 -0
  624. agentcore/schema/schemas/primitives/harness.py +710 -0
  625. agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
  626. agentcore/schema/schemas/primitives/memory.py +113 -0
  627. agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
  628. agentcore/schema/schemas/primitives/payment.py +114 -0
  629. agentcore/schema/schemas/primitives/policy.py +83 -0
  630. agentcore/schema/schemas/primitives/tags.py +50 -0
  631. agentcore/schema/schemas/zod_util.py +5 -0
  632. agentcore/schema/types/__init__.py +3 -0
  633. agentcore/schema/types/path.py +16 -0
  634. agentcore/templates/__init__.py +115 -0
  635. agentcore/templates/_handlebars.py +782 -0
  636. agentcore/templates/_js.py +164 -0
  637. agentcore/templates/base_renderer.py +107 -0
  638. agentcore/templates/cdk_renderer.py +129 -0
  639. agentcore/templates/evaluator_renderer.py +39 -0
  640. agentcore/templates/gateway_target_renderer.py +69 -0
  641. agentcore/templates/llm_context/README.md +16 -0
  642. agentcore/templates/llm_context/agentcore.ts +685 -0
  643. agentcore/templates/llm_context/aws-targets.ts +51 -0
  644. agentcore/templates/profiles.py +151 -0
  645. agentcore/templates/render.py +92 -0
  646. agentcore/templates/renderers.py +83 -0
  647. agentcore/templates/schema_assets.py +23 -0
  648. agentcore/templates/template_root.py +28 -0
  649. agentcore/templates/types.py +192 -0
  650. agentcore_cli-0.31.1.dist-info/METADATA +84 -0
  651. agentcore_cli-0.31.1.dist-info/RECORD +655 -0
  652. agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
  653. agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
  654. agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
  655. 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"