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,385 @@
1
+ """Deploy preflight: project validation, synth, bootstrap and stack checks (port of ``preflight.ts``)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+ import re
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from typing import Any
11
+
12
+ from agentcore.aws import account as _account
13
+ from agentcore.cdk.local_cdk_project import LocalCdkProject
14
+ from agentcore.cdk.toolkit import CdkToolkitWrapper, IoHost, create_cdk_toolkit_wrapper, silent_io_host
15
+ from agentcore.cli.constants import MAX_GATEWAY_NAME_LENGTH, MAX_RUNTIME_NAME_LENGTH
16
+ from agentcore.cloudformation.bootstrap import check_bootstrap_status, format_cdk_environment
17
+ from agentcore.cloudformation.stack_status import check_stacks_status
18
+ from agentcore.lib.constants import DOCKERFILE_NAME
19
+ from agentcore.lib.errors.types import ConfigValidationError, StaleCdkConstructError, ValidationError
20
+ from agentcore.lib.packaging.build_context import resolve_build_context
21
+ from agentcore.lib.packaging.build_context_dockerignore import ensure_build_context_dockerignore
22
+ from agentcore.lib.schemas.io.config_io import ConfigIO
23
+ from agentcore.lib.schemas.io.path_resolver import require_config_root
24
+ from agentcore.lib.utils.platform import is_windows
25
+ from agentcore.lib.utils.subprocess import run_subprocess_capture
26
+
27
+ MINIMUM_CDK_BOOTSTRAP_VERSION = 30
28
+
29
+
30
+ @dataclass
31
+ class PreflightContext:
32
+ project_spec: Any
33
+ aws_targets: list[Any]
34
+ cdk_project: LocalCdkProject
35
+ # True when no deployable resources remain but a deployed stack exists — deploy tears down.
36
+ is_teardown_deploy: bool
37
+ # True when deployed-state.json has no targets — never deployed.
38
+ is_first_deploy: bool
39
+
40
+
41
+ @dataclass
42
+ class SynthResult:
43
+ toolkit_wrapper: CdkToolkitWrapper
44
+ stack_names: list[str]
45
+
46
+
47
+ @dataclass
48
+ class BootstrapCheckResult:
49
+ needs_bootstrap: bool
50
+ target: Any | None
51
+
52
+
53
+ @dataclass
54
+ class StackStatusCheckResult:
55
+ can_deploy: bool
56
+ blocking_stack: str | None = None
57
+ message: str | None = None
58
+
59
+
60
+ def format_error(err: BaseException | object) -> str:
61
+ """Message plus cause chain; the Python traceback only with AGENTCORE_DEBUG set."""
62
+ if isinstance(err, BaseException):
63
+ lines = [str(err)]
64
+ if os.environ.get("AGENTCORE_DEBUG") and err.__traceback__ is not None:
65
+ import traceback
66
+
67
+ lines += ["", "Stack trace:", "".join(traceback.format_exception(err)).rstrip()]
68
+ # Upstream's ConfigValidationError carries no `cause` (the Python port chains the pydantic
69
+ # error via `raise ... from`), so it is not followed here.
70
+ cause = None if isinstance(err, ConfigValidationError) else err.__cause__
71
+ if isinstance(cause, BaseException) and cause is not err:
72
+ lines += ["", "Caused by:", format_error(cause)]
73
+ return "\n".join(lines)
74
+ return str(err)
75
+
76
+
77
+ # Spec lists whose presence means there's something to deploy (keep in sync with parse_*_outputs).
78
+ DEPLOYABLE_RESOURCE_KEYS = (
79
+ "runtimes",
80
+ "agent_core_gateways",
81
+ "memories",
82
+ "knowledge_bases",
83
+ "evaluators",
84
+ "online_eval_configs",
85
+ "policy_engines",
86
+ "config_bundles",
87
+ "datasets",
88
+ "capacity_providers",
89
+ "harnesses",
90
+ "payments",
91
+ )
92
+
93
+
94
+ def has_deployable_resources(spec: Any) -> bool:
95
+ return any(isinstance(getattr(spec, key, None), list) and getattr(spec, key) for key in DEPLOYABLE_RESOURCE_KEYS)
96
+
97
+
98
+ def validate_project(selected_target: Any = None) -> PreflightContext:
99
+ """Validate the CDK project and config; checks AWS credentials unless this is a teardown deploy."""
100
+ config_root = require_config_root()
101
+ project_root = os.path.dirname(config_root)
102
+
103
+ cdk_project = LocalCdkProject(project_root)
104
+ cdk_project.validate()
105
+
106
+ config_io = ConfigIO(base_dir=config_root)
107
+ project_spec = config_io.read_project_spec()
108
+ aws_targets = config_io.resolve_aws_deployment_targets()
109
+
110
+ # deployed-state.json is written after every successful deploy, so it tells whether a stack exists.
111
+ has_existing_stack = False
112
+ try:
113
+ has_existing_stack = len(config_io.read_deployed_state().targets) > 0
114
+ except Exception: # noqa: BLE001 - no deployed state, no stack
115
+ pass
116
+
117
+ is_teardown_deploy = False
118
+ if not has_deployable_resources(project_spec):
119
+ if not has_existing_stack:
120
+ raise ValidationError(
121
+ "No resources defined in project. Add at least one resource (agent, memory, knowledge base, "
122
+ "evaluator, or gateway) before deploying."
123
+ )
124
+ is_teardown_deploy = True
125
+
126
+ validate_runtime_names(project_spec)
127
+ validate_gateway_names(project_spec)
128
+ validate_container_agents(project_spec, config_root)
129
+
130
+ # Harness specs are validated up front for a precise message, except on teardown (the files are
131
+ # being discarded and must not block destroying the stack).
132
+ if not is_teardown_deploy:
133
+ validate_harness_specs(project_spec, config_root)
134
+
135
+ if not is_teardown_deploy:
136
+ _account.validate_aws_credentials(
137
+ selected_target if selected_target is not None else (aws_targets or [None])[0]
138
+ )
139
+
140
+ return PreflightContext(
141
+ project_spec=project_spec,
142
+ aws_targets=aws_targets,
143
+ cdk_project=cdk_project,
144
+ is_teardown_deploy=is_teardown_deploy,
145
+ is_first_deploy=not has_existing_stack,
146
+ )
147
+
148
+
149
+ def validate_runtime_names(project_spec: Any) -> None:
150
+ for agent in project_spec.runtimes or []:
151
+ if agent.name:
152
+ combined = f"{project_spec.name}_{agent.name}"
153
+ if len(combined) > MAX_RUNTIME_NAME_LENGTH:
154
+ raise ValidationError(
155
+ f'Runtime name too long: "{combined}" ({len(combined)} chars). '
156
+ f"AWS limits runtime names to {MAX_RUNTIME_NAME_LENGTH} characters. "
157
+ "Shorten the project name or agent name in agentcore.json."
158
+ )
159
+
160
+
161
+ def validate_gateway_names(project_spec: Any) -> None:
162
+ for gateway in project_spec.agent_core_gateways or []:
163
+ # Imported gateways carry an explicit resourceName AWS already accepted.
164
+ if getattr(gateway, "resource_name", None):
165
+ continue
166
+ combined = f"{project_spec.name}-{gateway.name}"
167
+ if len(combined) > MAX_GATEWAY_NAME_LENGTH:
168
+ raise ValidationError(
169
+ f'Gateway name too long: "{combined}" ({len(combined)} chars). '
170
+ f"AWS limits gateway names to {MAX_GATEWAY_NAME_LENGTH} characters. "
171
+ "Shorten the project name or gateway name in agentcore.json."
172
+ )
173
+
174
+
175
+ def validate_container_agents(project_spec: Any, config_root: str) -> None:
176
+ """Container agents need a Dockerfile; warns on deprecated base images; adds a context .dockerignore."""
177
+ errors: list[str] = []
178
+ for agent in project_spec.runtimes or []:
179
+ if agent.build != "Container":
180
+ continue
181
+ resolved = resolve_build_context(agent, config_root)
182
+ if not os.path.exists(resolved.dockerfile_path):
183
+ errors.append(
184
+ f'Agent "{agent.name}": {agent.dockerfile or DOCKERFILE_NAME} not found at '
185
+ f"{resolved.dockerfile_path}. Container agents require a Dockerfile."
186
+ )
187
+ warn_deprecated_base_image(resolved.dockerfile_path, agent.name)
188
+ if agent.build_context_path:
189
+ created = ensure_build_context_dockerignore(resolved.build_context)
190
+ if created:
191
+ print(
192
+ f'Agent "{agent.name}": created {created} with default secret exclusions because buildContextPath '
193
+ "is set (the entire context is sent to Docker/CodeBuild). Review and commit it; edit to include "
194
+ "any intentionally-bundled files.",
195
+ file=sys.stderr,
196
+ )
197
+ if errors:
198
+ raise RuntimeError("\n".join(errors))
199
+
200
+
201
+ def validate_harness_specs(project_spec: Any, config_root: str) -> None:
202
+ """Parse every harness.json so a bad spec fails preflight with the precise schema message."""
203
+ harnesses = project_spec.harnesses or []
204
+ if not harnesses:
205
+ return
206
+ config_io = ConfigIO(base_dir=config_root)
207
+ errors = []
208
+ for harness in harnesses:
209
+ try:
210
+ config_io.read_harness_spec(harness.name)
211
+ except Exception as exc: # noqa: BLE001 - aggregated into one message
212
+ errors.append(f'Harness "{harness.name}": {format_error(exc)}')
213
+ if errors:
214
+ raise ValidationError("Invalid harness configuration:\n" + "\n".join(errors))
215
+
216
+
217
+ DEPRECATED_BASE_IMAGES = {
218
+ "slim-bookworm": (
219
+ "Affected by CVE-2026-42010 (GnuTLS authentication bypass). Update the FROM line to use a Trixie-based variant."
220
+ ),
221
+ }
222
+
223
+ _FROM_RE = re.compile(r"^\s*FROM\s+", re.IGNORECASE)
224
+
225
+
226
+ def warn_deprecated_base_image(dockerfile_path: str, agent_name: str) -> None:
227
+ try:
228
+ with open(dockerfile_path, encoding="utf-8") as fh:
229
+ content = fh.read()
230
+ except OSError:
231
+ return
232
+ for line in content.split("\n"):
233
+ if not _FROM_RE.match(line):
234
+ continue
235
+ for image, message in DEPRECATED_BASE_IMAGES.items():
236
+ if image in line:
237
+ print(
238
+ f'Warning: Agent "{agent_name}" Dockerfile uses a base image containing "{image}". {message}',
239
+ file=sys.stderr,
240
+ )
241
+
242
+
243
+ def build_cdk_project(cdk_project: LocalCdkProject) -> None:
244
+ cdk_project.build()
245
+
246
+
247
+ # ---------------------------------------------------------------------------
248
+ # Stale CDK lock files (port of tui/utils/process.ts)
249
+ # ---------------------------------------------------------------------------
250
+
251
+
252
+ def is_process_running(pid: int) -> bool:
253
+ if is_windows:
254
+ result = run_subprocess_capture("tasklist", ["/FI", f"PID eq {pid}", "/NH"])
255
+ return "No tasks" not in result.stdout
256
+ try:
257
+ os.kill(pid, 0)
258
+ except ProcessLookupError:
259
+ return False
260
+ except PermissionError:
261
+ return True
262
+ except OSError:
263
+ return False
264
+ return True
265
+
266
+
267
+ _READ_LOCK_RE = re.compile(r"^read\.(\d+)\.\d+\.lock$")
268
+
269
+
270
+ def cleanup_stale_lock_files(cdk_out_dir: str) -> None:
271
+ """Remove ``read.<PID>.<n>.lock`` files whose process is gone (never touches synth.lock)."""
272
+ if not os.path.isdir(cdk_out_dir):
273
+ return
274
+ for name in os.listdir(cdk_out_dir):
275
+ match = _READ_LOCK_RE.match(name)
276
+ if not match:
277
+ continue
278
+ if not is_process_running(int(match.group(1))):
279
+ try:
280
+ os.unlink(os.path.join(cdk_out_dir, name))
281
+ except OSError:
282
+ pass
283
+
284
+
285
+ # ---------------------------------------------------------------------------
286
+ # Synth
287
+ # ---------------------------------------------------------------------------
288
+
289
+
290
+ def synthesize_cdk(
291
+ cdk_project: LocalCdkProject,
292
+ *,
293
+ io_host: IoHost | None = None,
294
+ previous_wrapper: CdkToolkitWrapper | None = None,
295
+ region: str | None = None,
296
+ ) -> SynthResult:
297
+ if previous_wrapper is not None:
298
+ previous_wrapper.dispose()
299
+ cleanup_stale_lock_files(os.path.join(str(cdk_project.project_dir), "cdk.out"))
300
+ wrapper = create_cdk_toolkit_wrapper(cdk_project.project_dir, io_host=io_host or silent_io_host, region=region)
301
+ try:
302
+ synth = wrapper.synth()
303
+ except Exception as exc:
304
+ raise rewrite_if_stale_cdk_construct(exc, str(cdk_project.project_dir)) from exc
305
+ return SynthResult(toolkit_wrapper=wrapper, stack_names=synth.stack_names)
306
+
307
+
308
+ _UNKNOWN_KEYS_RE = re.compile(r"unknown keys \(remove\): (.+?)(?:\n|$)")
309
+
310
+
311
+ def extract_unknown_keys(err: BaseException | object) -> list[str]:
312
+ match = _UNKNOWN_KEYS_RE.search(format_error(err))
313
+ if not match or not match.group(1):
314
+ return []
315
+ keys = [re.sub(r'^"|"$', "", k.strip()) for k in match.group(1).split(",")]
316
+ return [k for k in keys if k]
317
+
318
+
319
+ def read_installed_cdk_construct_version(cdk_project_dir: str) -> str | None:
320
+ try:
321
+ path = os.path.join(cdk_project_dir, "node_modules", "@aws", "agentcore-cdk", "package.json")
322
+ with open(path, encoding="utf-8") as fh:
323
+ return json.load(fh).get("version")
324
+ except (OSError, ValueError, AttributeError):
325
+ return None
326
+
327
+
328
+ def rewrite_if_stale_cdk_construct(err: BaseException, cdk_project_dir: str) -> BaseException:
329
+ """An "unknown keys" synth rejection means the project's @aws/agentcore-cdk is older than the CLI."""
330
+ keys = extract_unknown_keys(err)
331
+ if not keys:
332
+ return err
333
+ return StaleCdkConstructError(keys, read_installed_cdk_construct_version(cdk_project_dir), cause=err)
334
+
335
+
336
+ def check_stack_deployability(region: str, stack_names: list[str]) -> StackStatusCheckResult:
337
+ blocking = check_stacks_status(region, stack_names)
338
+ if blocking:
339
+ return StackStatusCheckResult(False, blocking.stack_name, blocking.result.message)
340
+ return StackStatusCheckResult(True)
341
+
342
+
343
+ def check_bootstrap_needed(aws_targets: list[Any]) -> BootstrapCheckResult:
344
+ """Bootstrap needed when CDKToolkit is missing/unusable or older than version 30."""
345
+ target = aws_targets[0] if aws_targets else None
346
+ if target is None:
347
+ return BootstrapCheckResult(False, None)
348
+ try:
349
+ status = check_bootstrap_status(target.region)
350
+ if not status.is_bootstrapped or (status.bootstrap_version or 0) < MINIMUM_CDK_BOOTSTRAP_VERSION:
351
+ return BootstrapCheckResult(True, target)
352
+ except Exception: # noqa: BLE001 - deploy will fail with a clearer error
353
+ pass
354
+ return BootstrapCheckResult(False, None)
355
+
356
+
357
+ def bootstrap_environment(toolkit_wrapper: CdkToolkitWrapper, target: Any) -> None:
358
+ toolkit_wrapper.bootstrap([format_cdk_environment(target.account, target.region)])
359
+
360
+
361
+ __all__ = [
362
+ "DEPLOYABLE_RESOURCE_KEYS",
363
+ "MINIMUM_CDK_BOOTSTRAP_VERSION",
364
+ "BootstrapCheckResult",
365
+ "PreflightContext",
366
+ "StackStatusCheckResult",
367
+ "SynthResult",
368
+ "bootstrap_environment",
369
+ "build_cdk_project",
370
+ "check_bootstrap_needed",
371
+ "check_stack_deployability",
372
+ "cleanup_stale_lock_files",
373
+ "extract_unknown_keys",
374
+ "format_error",
375
+ "has_deployable_resources",
376
+ "read_installed_cdk_construct_version",
377
+ "rewrite_if_stale_cdk_construct",
378
+ "synthesize_cdk",
379
+ "validate_container_agents",
380
+ "validate_gateway_names",
381
+ "validate_harness_specs",
382
+ "validate_project",
383
+ "validate_runtime_names",
384
+ "warn_deprecated_base_image",
385
+ ]
@@ -0,0 +1,45 @@
1
+ """`agentcore deploy --region` (Python-port addition; upstream reads the region from aws-targets.json).
2
+
3
+ The region is applied to the selected target before the normal deploy flow runs:
4
+ - no targets yet: AWS_REGION is set so the auto-created ``default`` target lands there;
5
+ - target exists, never deployed: its region is updated in aws-targets.json;
6
+ - target already deployed elsewhere: refused, since moving it would orphan the existing stack.
7
+ """
8
+
9
+ import os
10
+
11
+ from agentcore.lib.errors.types import ConfigNotFoundError, ValidationError
12
+ from agentcore.lib.schemas.io.config_io import ConfigIO
13
+ from agentcore.schema.schemas.aws_targets import AGENTCORE_REGIONS
14
+
15
+
16
+ def apply_region_override(region: str, target_name: str, config_io: ConfigIO | None = None) -> None:
17
+ if region not in AGENTCORE_REGIONS:
18
+ raise ValidationError(
19
+ f'Region "{region}" is not supported by AgentCore. Supported regions: {", ".join(AGENTCORE_REGIONS)}'
20
+ )
21
+ config_io = config_io or ConfigIO()
22
+ # Also drives region detection for anything that runs before or without a target.
23
+ os.environ["AWS_REGION"] = region
24
+
25
+ try:
26
+ targets = [t.to_json_dict() for t in config_io.read_aws_deployment_targets()]
27
+ except ConfigNotFoundError:
28
+ targets = []
29
+
30
+ target = next((t for t in targets if t["name"] == target_name), None)
31
+ if target is None or target["region"] == region:
32
+ return
33
+
34
+ try:
35
+ deployed = target_name in (config_io.read_deployed_state().targets or {})
36
+ except Exception: # noqa: BLE001 - no deployed state means nothing to orphan
37
+ deployed = False
38
+ if deployed:
39
+ raise ValidationError(
40
+ f'Target "{target_name}" is already deployed to {target["region"]}. To deploy to {region}, add a new '
41
+ f"target to agentcore/aws-targets.json and pass --target <name>."
42
+ )
43
+
44
+ target["region"] = region
45
+ config_io.write_aws_deployment_targets(targets)
@@ -0,0 +1,153 @@
1
+ """Stack teardown after `remove all` (port of ``operations/deploy/teardown.ts``)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import sys
7
+ from dataclasses import dataclass, field
8
+ from typing import Any
9
+
10
+ from agentcore.aws import agentcore_config_bundles, agentcore_harness
11
+ from agentcore.aws.target_region import target_region
12
+ from agentcore.cdk.toolkit import CdkToolkitWrapper, pattern_must_match, silent_io_host
13
+ from agentcore.cloudformation import stack_discovery
14
+ from agentcore.cloudformation.stack_discovery import DiscoveredStack
15
+ from agentcore.lib.constants import CONFIG_DIR
16
+ from agentcore.lib.result import Ok, ok
17
+ from agentcore.lib.schemas.io.config_io import ConfigIO
18
+ from agentcore.operations.harness.orphan import find_orphan_harnesses
19
+
20
+
21
+ @dataclass
22
+ class DeployedTarget:
23
+ target: Any
24
+ stack: DiscoveredStack
25
+
26
+
27
+ @dataclass
28
+ class DiscoverDeployedResult:
29
+ project_name: str
30
+ deployed_targets: list[DeployedTarget] = field(default_factory=list)
31
+
32
+
33
+ def discover_deployed_targets(config_base_dir: str | None = None) -> DiscoverDeployedResult:
34
+ """Targets that have a CloudFormation stack (per-target errors, e.g. no credentials, are ignored)."""
35
+ config_io = ConfigIO(base_dir=config_base_dir) if config_base_dir else ConfigIO()
36
+ project_spec = config_io.read_project_spec()
37
+ deployed: list[DeployedTarget] = []
38
+ for target in config_io.resolve_aws_deployment_targets():
39
+ try:
40
+ stack = stack_discovery.find_stack(target.region, project_spec.name, target.name)
41
+ if stack:
42
+ deployed.append(DeployedTarget(target, stack))
43
+ except Exception: # noqa: BLE001
44
+ pass
45
+ return DiscoverDeployedResult(project_spec.name, deployed)
46
+
47
+
48
+ def destroy_target(*, target: DeployedTarget, cdk_project_dir: str, toolkit: CdkToolkitWrapper | None = None) -> None:
49
+ """Destroy one target's stack and drop it from deployed-state.json."""
50
+ if not os.path.exists(cdk_project_dir):
51
+ raise RuntimeError("CDK project not found. Cannot destroy without CDK project.")
52
+ wrapper = toolkit or CdkToolkitWrapper(cdk_project_dir, io_host=silent_io_host, region=target.target.region)
53
+ try:
54
+ # aws-targets.json is authoritative for the destroy region (aws/agentcore-cli#924).
55
+ with target_region(target.target.region):
56
+ if toolkit is None:
57
+ wrapper.initialize()
58
+ wrapper.destroy(pattern_must_match(target.stack.stack_name))
59
+ finally:
60
+ if toolkit is None:
61
+ wrapper.dispose()
62
+
63
+ config_io = ConfigIO()
64
+ try:
65
+ state = config_io.read_deployed_state()
66
+ if target.target.name in state.targets:
67
+ del state.targets[target.target.name]
68
+ config_io.write_deployed_state(state)
69
+ except Exception: # noqa: BLE001
70
+ pass
71
+
72
+
73
+ def get_cdk_project_dir(cwd: str | None = None) -> str:
74
+ return os.path.join(cwd or os.getcwd(), CONFIG_DIR, "cdk")
75
+
76
+
77
+ def _is_not_found_message(msg: str) -> bool:
78
+ return "ENOENT" in msg or "not found" in msg or "does not exist" in msg
79
+
80
+
81
+ def perform_stack_teardown(target_name: str, toolkit: CdkToolkitWrapper | None = None) -> Ok[None]:
82
+ """Destroy the target's stack, then remove it from deployed-state.json and aws-targets.json."""
83
+ cdk_project_dir = get_cdk_project_dir()
84
+ config_io = ConfigIO()
85
+ discovered = discover_deployed_targets()
86
+ deployed_target = next((dt for dt in discovered.deployed_targets if dt.target.name == target_name), None)
87
+
88
+ # Clean up imperatively created resources the stack destroy won't touch.
89
+ try:
90
+ state = config_io.read_deployed_state()
91
+ target_state = state.targets.get(target_name)
92
+ resources = target_state.resources if target_state else None
93
+
94
+ for orphan in [o for o in find_orphan_harnesses(state) if o.target_name == target_name]:
95
+ try:
96
+ agentcore_harness.delete_harness(region=orphan.region, harness_id=orphan.harness_id)
97
+ print(f'Deleted preview-build harness "{orphan.name}"')
98
+ except Exception as exc: # noqa: BLE001
99
+ if not agentcore_harness.is_harness_not_found_error(exc):
100
+ print(
101
+ f'Warning: Could not delete preview-build harness "{orphan.name}" ({orphan.harness_id}) in '
102
+ f"{orphan.region}: {exc}. Delete it manually to stop incurring cost.",
103
+ file=sys.stderr,
104
+ )
105
+
106
+ if resources is not None and resources.config_bundles:
107
+ region = deployed_target.target.region if deployed_target else None
108
+ if not region:
109
+ try:
110
+ match = next((t for t in config_io.resolve_aws_deployment_targets() if t.name == target_name), None)
111
+ region = match.region if match else None
112
+ except Exception: # noqa: BLE001
113
+ pass
114
+ if not region:
115
+ print(
116
+ "Warning: Could not determine region for resource cleanup — resources may need manual deletion",
117
+ file=sys.stderr,
118
+ )
119
+ else:
120
+ for bundle_name, bundle in resources.config_bundles.items():
121
+ try:
122
+ agentcore_config_bundles.delete_configuration_bundle(region=region, bundle_id=bundle.bundle_id)
123
+ print(f'Deleted config bundle "{bundle_name}"')
124
+ except Exception as exc: # noqa: BLE001
125
+ print(f'Warning: Error during config bundle "{bundle_name}" cleanup: {exc}', file=sys.stderr)
126
+ except Exception as exc: # noqa: BLE001
127
+ if not _is_not_found_message(str(exc)):
128
+ print(f"Warning: Could not read deployed state for resource cleanup: {exc}", file=sys.stderr)
129
+
130
+ if deployed_target:
131
+ destroy_target(target=deployed_target, cdk_project_dir=cdk_project_dir, toolkit=toolkit)
132
+
133
+ # deployed-state.json first (it validates against aws-targets.json), then aws-targets.json.
134
+ try:
135
+ state = config_io.read_deployed_state()
136
+ state.targets.pop(target_name, None)
137
+ config_io.write_deployed_state(state)
138
+ except Exception as exc:
139
+ if not ("ENOENT" in str(exc) or "not found" in str(exc)):
140
+ raise
141
+ remaining = [t for t in config_io.resolve_aws_deployment_targets() if t.name != target_name]
142
+ config_io.write_aws_deployment_targets(remaining)
143
+ return ok()
144
+
145
+
146
+ __all__ = [
147
+ "DeployedTarget",
148
+ "DiscoverDeployedResult",
149
+ "destroy_target",
150
+ "discover_deployed_targets",
151
+ "get_cdk_project_dir",
152
+ "perform_stack_teardown",
153
+ ]
@@ -0,0 +1,61 @@
1
+ """Local development server (port of src/cli/operations/dev)."""
2
+
3
+ from agentcore.operations.dev.config import (
4
+ DevConfig,
5
+ get_agent_port,
6
+ get_dev_config,
7
+ get_dev_port,
8
+ get_dev_supported_agents,
9
+ load_project_config,
10
+ requires_exact_dev_port,
11
+ )
12
+ from agentcore.operations.dev.invoke import invoke_agent, invoke_agent_streaming, invoke_for_protocol
13
+ from agentcore.operations.dev.invoke_a2a import A2AAgentCard, fetch_a2a_agent_card, invoke_a2a_streaming
14
+ from agentcore.operations.dev.invoke_agui import invoke_agui_streaming
15
+ from agentcore.operations.dev.invoke_mcp import McpTool, McpToolsResult, call_mcp_tool, list_mcp_tools
16
+ from agentcore.operations.dev.load_dev_env import DevEnv, load_dev_env
17
+ from agentcore.operations.dev.server import (
18
+ DevServer,
19
+ DevServerCallbacks,
20
+ DevServerOptions,
21
+ LogLevel,
22
+ create_dev_server,
23
+ find_available_port,
24
+ wait_for_port,
25
+ wait_for_server_ready,
26
+ )
27
+ from agentcore.operations.dev.utils import format_mcp_tool_list, get_endpoint_url, on_shutdown_signal
28
+
29
+ __all__ = [
30
+ "A2AAgentCard",
31
+ "DevConfig",
32
+ "DevEnv",
33
+ "DevServer",
34
+ "DevServerCallbacks",
35
+ "DevServerOptions",
36
+ "LogLevel",
37
+ "McpTool",
38
+ "McpToolsResult",
39
+ "call_mcp_tool",
40
+ "create_dev_server",
41
+ "fetch_a2a_agent_card",
42
+ "find_available_port",
43
+ "format_mcp_tool_list",
44
+ "get_agent_port",
45
+ "get_dev_config",
46
+ "get_dev_port",
47
+ "get_dev_supported_agents",
48
+ "get_endpoint_url",
49
+ "invoke_a2a_streaming",
50
+ "invoke_agent",
51
+ "invoke_agent_streaming",
52
+ "invoke_agui_streaming",
53
+ "invoke_for_protocol",
54
+ "list_mcp_tools",
55
+ "load_dev_env",
56
+ "load_project_config",
57
+ "on_shutdown_signal",
58
+ "requires_exact_dev_port",
59
+ "wait_for_port",
60
+ "wait_for_server_ready",
61
+ ]