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,206 @@
1
+ """Phase 2 of a CloudFormation import: IMPORT change set (port of commands/import/phase2-import.ts).
2
+
3
+ Uses ``create_change_set(ChangeSetType="IMPORT")`` to bring pre-existing resources under stack
4
+ management. An IMPORT change set cannot create other resources, update existing ones, or change Outputs.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import io
10
+ import json
11
+ import os
12
+ import re
13
+ import time
14
+ import zipfile
15
+ from collections.abc import Callable
16
+ from dataclasses import dataclass
17
+ from typing import Any
18
+
19
+ from agentcore.aws._aws_errors import get_error_message
20
+ from agentcore.aws.account import create_aws_client
21
+ from agentcore.lib.errors.types import PollExhaustedError, PollTimeoutError
22
+ from agentcore.lib.utils.polling import PollResult, is_throttling_error, poll
23
+
24
+ from .template_utils import CfnTemplate, build_import_template
25
+ from .types import ResourceToImport
26
+
27
+ # Overridable in tests.
28
+ POLL_DELAY_MS = 5000
29
+
30
+
31
+ @dataclass
32
+ class Phase2Result:
33
+ success: bool
34
+ error: str | None = None
35
+
36
+
37
+ def execute_phase2(
38
+ region: str,
39
+ stack_name: str,
40
+ deployed_template: CfnTemplate,
41
+ synth_template: CfnTemplate,
42
+ resources_to_import: list[ResourceToImport],
43
+ assembly_directory: str,
44
+ on_progress: Callable[[str], None] | None = None,
45
+ ) -> Phase2Result:
46
+ progress = on_progress or (lambda _m: None)
47
+ if not resources_to_import:
48
+ progress("No resources to import")
49
+ return Phase2Result(True)
50
+
51
+ cfn = create_aws_client("cloudformation", region)
52
+
53
+ progress("Publishing CDK assets to S3...")
54
+ publish_cdk_assets(assembly_directory, region, on_progress)
55
+
56
+ import_template = build_import_template(
57
+ deployed_template, synth_template, [r.logical_resource_id for r in resources_to_import]
58
+ )
59
+ change_set_name = f"import-{int(time.time() * 1000)}"
60
+ progress(f"Creating IMPORT change set: {change_set_name}")
61
+
62
+ try:
63
+ cfn.create_change_set(
64
+ StackName=stack_name,
65
+ ChangeSetName=change_set_name,
66
+ ChangeSetType="IMPORT",
67
+ TemplateBody=json.dumps(import_template),
68
+ ResourcesToImport=[
69
+ {
70
+ "ResourceType": r.resource_type,
71
+ "LogicalResourceId": r.logical_resource_id,
72
+ "ResourceIdentifier": r.resource_identifier,
73
+ }
74
+ for r in resources_to_import
75
+ ],
76
+ Capabilities=["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"],
77
+ )
78
+ progress("Waiting for change set to be created...")
79
+ _wait_for_change_set_ready(cfn, stack_name, change_set_name)
80
+
81
+ description = cfn.describe_change_set(StackName=stack_name, ChangeSetName=change_set_name)
82
+ progress(f"Change set has {len(description.get('Changes') or [])} changes. Executing...")
83
+ cfn.execute_change_set(StackName=stack_name, ChangeSetName=change_set_name)
84
+
85
+ progress("Waiting for IMPORT to complete...")
86
+ _wait_for_stack_import_complete(cfn, stack_name)
87
+ progress("Phase 2 IMPORT complete")
88
+ return Phase2Result(True)
89
+ except Exception as exc: # noqa: BLE001
90
+ message = get_error_message(exc)
91
+ match = re.search(r"(.+) already exists in stack (.+)", message)
92
+ if match:
93
+ return Phase2Result(
94
+ False,
95
+ f'Resource "{match.group(1)}" is already managed by CloudFormation stack "{match.group(2)}". It must '
96
+ "be removed from that stack before importing into this project.",
97
+ )
98
+ return Phase2Result(False, f"Import change set failed: {message}")
99
+
100
+
101
+ def _on_error(err: BaseException) -> str:
102
+ return "retry" if is_throttling_error(err) else "abort"
103
+
104
+
105
+ def _wait_for_change_set_ready(cfn: Any, stack_name: str, change_set_name: str) -> None:
106
+ def check() -> PollResult[None]:
107
+ response = cfn.describe_change_set(StackName=stack_name, ChangeSetName=change_set_name)
108
+ status = response.get("Status")
109
+ if status == "CREATE_COMPLETE":
110
+ return PollResult(True)
111
+ if status == "FAILED":
112
+ raise RuntimeError(f"Change set creation failed: {response.get('StatusReason') or 'Unknown reason'}")
113
+ return PollResult(False)
114
+
115
+ try:
116
+ poll(check, max_attempts=60, delay_ms=POLL_DELAY_MS, on_error=_on_error)
117
+ except (PollExhaustedError, PollTimeoutError) as exc:
118
+ raise RuntimeError("Timed out waiting for change set creation") from exc
119
+
120
+
121
+ def _wait_for_stack_import_complete(cfn: Any, stack_name: str) -> None:
122
+ def check() -> PollResult[None]:
123
+ stacks = cfn.describe_stacks(StackName=stack_name).get("Stacks") or []
124
+ if not stacks:
125
+ raise RuntimeError(f"Stack {stack_name} not found during import wait")
126
+ status = stacks[0].get("StackStatus") or ""
127
+ if status == "IMPORT_COMPLETE":
128
+ return PollResult(True)
129
+ if "FAILED" in status or "ROLLBACK" in status:
130
+ raise RuntimeError(
131
+ f"Import failed with status: {status}. Reason: {stacks[0].get('StackStatusReason') or 'Unknown'}"
132
+ )
133
+ return PollResult(False)
134
+
135
+ try:
136
+ poll(check, max_attempts=120, delay_ms=POLL_DELAY_MS, on_error=_on_error)
137
+ except (PollExhaustedError, PollTimeoutError) as exc:
138
+ raise RuntimeError("Timed out waiting for import to complete") from exc
139
+
140
+
141
+ def _zip_directory(path: str) -> bytes:
142
+ """Equivalent of ``cd <path> && zip -rq out.zip .``."""
143
+ buffer = io.BytesIO()
144
+ with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zf:
145
+ for root, _dirs, files in os.walk(path):
146
+ for name in files:
147
+ full = os.path.join(root, name)
148
+ zf.write(full, os.path.relpath(full, path))
149
+ return buffer.getvalue()
150
+
151
+
152
+ def publish_cdk_assets(assembly_directory: str, region: str, on_progress: Callable[[str], None] | None = None) -> None:
153
+ """Upload CDK file assets (code zips, templates) listed in ``*.assets.json`` to the bootstrap bucket."""
154
+ progress = on_progress or (lambda _m: None)
155
+ manifests = [f for f in os.listdir(assembly_directory) if f.endswith(".assets.json")]
156
+ if not manifests:
157
+ progress("No assets manifest found, skipping asset publishing")
158
+ return
159
+
160
+ for manifest_file in manifests:
161
+ with open(os.path.join(assembly_directory, manifest_file), encoding="utf-8") as fh:
162
+ manifest = json.load(fh)
163
+ for asset in (manifest.get("files") or {}).values():
164
+ source = asset["source"]
165
+ source_path = os.path.join(assembly_directory, source["path"])
166
+ if not os.path.exists(source_path):
167
+ progress(f"Asset file not found: {source['path']}, skipping")
168
+ continue
169
+ if os.path.isdir(source_path):
170
+ if source.get("packaging") == "zip":
171
+ body = _zip_directory(source_path)
172
+ else:
173
+ progress(f"Skipping directory asset: {source['path']} (packaging: {source.get('packaging')})")
174
+ continue
175
+ else:
176
+ with open(source_path, "rb") as fh:
177
+ body = fh.read()
178
+
179
+ for dest in asset["destinations"].values():
180
+ dest_region = dest.get("region") or region
181
+ s3 = _s3_client(dest_region, dest.get("assumeRoleArn"))
182
+ progress(f"Uploading {source['path']} → s3://{dest['bucketName']}/{dest['objectKey']}")
183
+ s3.put_object(Bucket=dest["bucketName"], Key=dest["objectKey"], Body=body)
184
+
185
+
186
+ def _s3_client(region: str, assume_role_arn: str | None) -> Any:
187
+ """S3 client, using the asset publishing role when one is given (falling back to default credentials)."""
188
+ if assume_role_arn and "${" not in assume_role_arn:
189
+ try:
190
+ creds = (
191
+ create_aws_client("sts", region)
192
+ .assume_role(RoleArn=assume_role_arn, RoleSessionName="agentcore-import-publish")
193
+ .get("Credentials")
194
+ )
195
+ if creds:
196
+ import boto3
197
+
198
+ return boto3.session.Session(
199
+ aws_access_key_id=creds["AccessKeyId"],
200
+ aws_secret_access_key=creds["SecretAccessKey"],
201
+ aws_session_token=creds.get("SessionToken"),
202
+ region_name=region,
203
+ ).client("s3")
204
+ except Exception: # noqa: BLE001 - fall back to default credentials
205
+ pass
206
+ return create_aws_client("s3", region)
@@ -0,0 +1,228 @@
1
+ """Generic single-resource import orchestrator (port of commands/import/resource-import.ts).
2
+
3
+ Owns the sequence shared by ``import runtime|memory|evaluator|online-eval``; each resource type
4
+ supplies a :class:`ResourceImportDescriptor`.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import copy
10
+ import sys
11
+ from typing import Any
12
+
13
+ from agentcore.lib.errors.types import to_error
14
+ from agentcore.lib.schemas.io.config_io import to_jsonable
15
+
16
+ from . import import_pipeline
17
+ from .constants import NAME_REGEX
18
+ from .import_utils import (
19
+ ImportContext,
20
+ fail_result,
21
+ find_resource_in_deployed_state,
22
+ resolve_import_context,
23
+ to_stack_name,
24
+ )
25
+ from .template_utils import find_logical_id_by_property, find_logical_ids_by_type
26
+ from .types import (
27
+ BeforeWriteContext,
28
+ ImportResourceOptions,
29
+ ImportResourceResult,
30
+ ResourceImportDescriptor,
31
+ ResourceToImport,
32
+ )
33
+
34
+
35
+ def execute_resource_import(
36
+ descriptor: ResourceImportDescriptor[Any, Any], options: ImportResourceOptions
37
+ ) -> ImportResourceResult: # noqa: C901, PLR0911, PLR0915
38
+ config_snapshot: dict[str, Any] | None = None
39
+ config_written = False
40
+ import_ctx: ImportContext | None = None
41
+
42
+ def rollback() -> None:
43
+ if config_written and config_snapshot is not None and import_ctx is not None:
44
+ try:
45
+ import_ctx.ctx.config_io.write_project_spec(config_snapshot)
46
+ except Exception as exc: # noqa: BLE001
47
+ print(f"Warning: Could not restore agentcore.json: {exc}", file=sys.stderr)
48
+ if descriptor.rollback_extra:
49
+ descriptor.rollback_extra()
50
+
51
+ try:
52
+ import_ctx = resolve_import_context(options, descriptor.log_command)
53
+ ctx, target, logger, on_progress = import_ctx.ctx, import_ctx.target, import_ctx.logger, import_ctx.on_progress
54
+ name = descriptor.display_name
55
+
56
+ logger.start_step(f"Fetch {name} from AWS")
57
+ if options.arn:
58
+ resource_id = descriptor.parse_resource_id(options.arn, target)
59
+ else:
60
+ on_progress(f"Listing {name}s in your account...")
61
+ summaries = descriptor.list_resources(target["region"])
62
+ if not summaries:
63
+ return fail_result(logger, f"No {name}s found in your account.", descriptor.resource_type, "")
64
+ if len(summaries) == 1:
65
+ resource_id = descriptor.extract_summary_id(summaries[0])
66
+ on_progress(descriptor.format_auto_select_message(summaries[0]))
67
+ else:
68
+ print(f"\nFound {len(summaries)} {name}(s):\n")
69
+ for i, summary in enumerate(summaries):
70
+ print(descriptor.format_list_item(summary, i))
71
+ print("")
72
+ return fail_result(
73
+ logger,
74
+ f"Multiple {name}s found. Use --arn <arn> to specify which {name} to import.",
75
+ descriptor.resource_type,
76
+ "",
77
+ )
78
+
79
+ on_progress(f"Fetching {name} details for {resource_id}...")
80
+ detail = descriptor.get_detail(target["region"], resource_id)
81
+ status = descriptor.extract_detail_status(detail)
82
+ if status != descriptor.ready_status:
83
+ on_progress(f"Warning: {name} status is {status}, not {descriptor.ready_status}")
84
+
85
+ local_name = options.name if options.name is not None else descriptor.extract_detail_name(detail)
86
+ if not NAME_REGEX.match(local_name or ""):
87
+ return fail_result(
88
+ logger,
89
+ f'Invalid name "{local_name}". Name must start with a letter and contain only letters, numbers, and '
90
+ "underscores (max 48 chars).",
91
+ descriptor.resource_type,
92
+ local_name,
93
+ )
94
+ on_progress(f"{name}: {descriptor.extract_detail_name(detail)} → local name: {local_name}")
95
+ logger.end_step("success")
96
+
97
+ logger.start_step("Check for duplicates")
98
+ project_spec = to_jsonable(ctx.config_io.read_project_spec())
99
+ if local_name in set(descriptor.get_existing_names(project_spec)):
100
+ return fail_result(
101
+ logger,
102
+ f'{name} "{local_name}" already exists in the project. Use --name to specify a different local name.',
103
+ descriptor.resource_type,
104
+ local_name,
105
+ )
106
+ target_name = target.get("name") or "default"
107
+ existing = find_resource_in_deployed_state(ctx.config_io, target_name, descriptor.resource_type, resource_id)
108
+ is_reimport = bool(existing)
109
+ if existing:
110
+ if not options.name:
111
+ local_name = existing
112
+ on_progress(f"{name} already managed by CloudFormation — re-adding to project config")
113
+ logger.end_step("success")
114
+
115
+ if descriptor.before_config_write:
116
+ hook = descriptor.before_config_write(
117
+ BeforeWriteContext(detail, local_name, project_spec, ctx, target, options, on_progress, logger)
118
+ )
119
+ if hook is not None:
120
+ return hook
121
+
122
+ logger.start_step("Update project config")
123
+ config_snapshot = copy.deepcopy(project_spec)
124
+ add_result = descriptor.add_to_project_spec(detail, local_name, project_spec)
125
+ if not add_result.success:
126
+ logger.end_step("error", str(add_result.error))
127
+ logger.finalize(False)
128
+ add_result.log_path = logger.get_relative_log_path()
129
+ return add_result
130
+ ctx.config_io.write_project_spec(project_spec)
131
+ config_written = True
132
+ on_progress(f'Added {name} "{local_name}" to agentcore.json')
133
+ logger.end_step("success")
134
+
135
+ logger.start_step("Build and synth CDK")
136
+ stack_name = to_stack_name(ctx.project_name, target_name)
137
+
138
+ def build_resources(
139
+ synth_template: dict[str, Any], deployed_template: dict[str, Any]
140
+ ) -> list[ResourceToImport]:
141
+ deployed_ids = set(deployed_template.get("Resources", {}).keys())
142
+ logical_id = find_logical_id_by_property(
143
+ synth_template,
144
+ descriptor.cfn_resource_type,
145
+ descriptor.cfn_name_property,
146
+ local_name,
147
+ exclude_logical_ids=deployed_ids,
148
+ )
149
+ if not logical_id:
150
+ logical_id = find_logical_id_by_property(
151
+ synth_template,
152
+ descriptor.cfn_resource_type,
153
+ descriptor.cfn_name_property,
154
+ f"{ctx.project_name}_{local_name}",
155
+ exclude_logical_ids=deployed_ids,
156
+ )
157
+ if not logical_id:
158
+ candidates = [
159
+ i
160
+ for i in find_logical_ids_by_type(synth_template, descriptor.cfn_resource_type)
161
+ if i not in deployed_ids
162
+ ]
163
+ if len(candidates) == 1:
164
+ logical_id = candidates[0]
165
+ if not logical_id:
166
+ return []
167
+ return [
168
+ ResourceToImport(descriptor.cfn_resource_type, logical_id, {descriptor.cfn_identifier_key: resource_id})
169
+ ]
170
+
171
+ pipeline = import_pipeline.execute_cdk_import_pipeline(
172
+ project_root=ctx.project_root,
173
+ stack_name=stack_name,
174
+ target=target,
175
+ config_io=ctx.config_io,
176
+ target_name=target_name,
177
+ on_progress=on_progress,
178
+ build_resources_to_import=build_resources,
179
+ deployed_state_entries=[descriptor.build_deployed_state_entry(local_name, resource_id, detail)],
180
+ )
181
+
182
+ if pipeline.no_resources:
183
+ if is_reimport:
184
+ logger.end_step("success")
185
+ logger.finalize(True)
186
+ return ImportResourceResult(
187
+ success=True,
188
+ resource_type=descriptor.resource_type,
189
+ resource_name=local_name,
190
+ resource_id=resource_id,
191
+ log_path=logger.get_relative_log_path(),
192
+ )
193
+ error = f'Could not find logical ID for {name} "{local_name}" in CloudFormation template'
194
+ rollback()
195
+ return fail_result(logger, error, descriptor.resource_type, local_name)
196
+
197
+ if not pipeline.success:
198
+ rollback()
199
+ logger.end_step("error", pipeline.error)
200
+ logger.finalize(False)
201
+ return ImportResourceResult(
202
+ success=False,
203
+ error=Exception(pipeline.error or "Pipeline failed"),
204
+ resource_type=descriptor.resource_type,
205
+ resource_name=local_name,
206
+ log_path=logger.get_relative_log_path(),
207
+ )
208
+ logger.end_step("success")
209
+ logger.finalize(True)
210
+ return ImportResourceResult(
211
+ success=True,
212
+ resource_type=descriptor.resource_type,
213
+ resource_name=local_name,
214
+ resource_id=resource_id,
215
+ log_path=logger.get_relative_log_path(),
216
+ )
217
+ except Exception as exc: # noqa: BLE001 - every failure becomes a failed result, as upstream
218
+ rollback()
219
+ if import_ctx is not None:
220
+ import_ctx.logger.log(str(exc), "error")
221
+ import_ctx.logger.finalize(False)
222
+ return ImportResourceResult(
223
+ success=False,
224
+ error=to_error(exc),
225
+ resource_type=descriptor.resource_type,
226
+ resource_name=options.name or "",
227
+ log_path=import_ctx.logger.get_relative_log_path() if import_ctx else None,
228
+ )
@@ -0,0 +1,148 @@
1
+ """CloudFormation template helpers for import (port of commands/import/template-utils.ts).
2
+
3
+ Templates are plain JSON dicts (``{"Resources": {...}, "Outputs": {...}}``).
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import copy
9
+ import json
10
+ import re
11
+ from collections.abc import Collection
12
+ from typing import Any
13
+
14
+ from agentcore.cli.commands.import_.constants import PRIMARY_RESOURCE_TYPES
15
+
16
+ CfnTemplate = dict[str, Any]
17
+
18
+
19
+ def _js_json(value: Any) -> str:
20
+ """``JSON.stringify`` (compact, non-ASCII kept)."""
21
+ return json.dumps(value, separators=(",", ":"), ensure_ascii=False)
22
+
23
+
24
+ def _is_primary_resource_type(type_: str) -> bool:
25
+ return any(type_.startswith(t) for t in PRIMARY_RESOURCE_TYPES)
26
+
27
+
28
+ def _replace_dangling_refs(value: Any, removed_ids: set[str]) -> Any:
29
+ """Replace Ref / Fn::GetAtt / Fn::Sub references to removed logical IDs with ``"*"``.
30
+
31
+ "*" because these references usually land in IAM policy Resource fields; Phase 3
32
+ (``agentcore deploy``) replaces the whole template with the real synthesized values.
33
+ """
34
+ if value is None or not isinstance(value, (dict, list)):
35
+ return value
36
+ if isinstance(value, list):
37
+ return [_replace_dangling_refs(item, removed_ids) for item in value]
38
+
39
+ ref = value.get("Ref")
40
+ if isinstance(ref, str) and ref in removed_ids:
41
+ return "*"
42
+
43
+ if "Fn::GetAtt" in value:
44
+ get_att = value["Fn::GetAtt"]
45
+ if isinstance(get_att, list) and len(get_att) >= 1 and get_att[0] in removed_ids:
46
+ return "*"
47
+
48
+ if "Fn::Sub" in value:
49
+ sub = value["Fn::Sub"]
50
+ if isinstance(sub, str):
51
+ replaced = sub
52
+ for logical_id in removed_ids:
53
+ replaced = re.sub(r"\$\{" + logical_id + r"[^}]*\}", "*", replaced)
54
+ if replaced != sub:
55
+ return {"Fn::Sub": replaced}
56
+
57
+ return {key: _replace_dangling_refs(val, removed_ids) for key, val in value.items()}
58
+
59
+
60
+ def filter_companion_only_template(synth_template: CfnTemplate) -> CfnTemplate:
61
+ """Keep only companion resources (no ``AWS::BedrockAgentCore::*``) for the Phase 1 UPDATE."""
62
+ filtered: CfnTemplate = {**synth_template, "Resources": {}, "Outputs": {}}
63
+ removed: set[str] = set()
64
+
65
+ for logical_id, resource in synth_template["Resources"].items():
66
+ if _is_primary_resource_type(resource["Type"]):
67
+ removed.add(logical_id)
68
+ else:
69
+ filtered["Resources"][logical_id] = copy.deepcopy(resource)
70
+
71
+ for logical_id, resource in list(filtered["Resources"].items()):
72
+ filtered["Resources"][logical_id] = _replace_dangling_refs(resource, removed)
73
+
74
+ for output_key, output_value in (synth_template.get("Outputs") or {}).items():
75
+ output_json = _js_json(output_value)
76
+ if not any(rid in output_json for rid in removed):
77
+ filtered["Outputs"][output_key] = output_value
78
+
79
+ for resource in filtered["Resources"].values():
80
+ depends_on = resource.get("DependsOn")
81
+ if depends_on:
82
+ if isinstance(depends_on, str):
83
+ if depends_on in removed:
84
+ del resource["DependsOn"]
85
+ elif isinstance(depends_on, list):
86
+ kept = [d for d in depends_on if d not in removed]
87
+ if kept:
88
+ resource["DependsOn"] = kept
89
+ else:
90
+ del resource["DependsOn"]
91
+
92
+ return filtered
93
+
94
+
95
+ def build_import_template(
96
+ deployed_template: CfnTemplate, synth_template: CfnTemplate, logical_ids_to_import: list[str]
97
+ ) -> CfnTemplate:
98
+ """Deployed template + the primary resources to import (``DeletionPolicy: Retain``, no DependsOn)."""
99
+ import_template = copy.deepcopy(deployed_template)
100
+ for logical_id in logical_ids_to_import:
101
+ resource = synth_template["Resources"].get(logical_id)
102
+ if not resource:
103
+ raise RuntimeError(f"Logical ID {logical_id} not found in synthesized template")
104
+ imported = copy.deepcopy(resource)
105
+ imported["DeletionPolicy"] = "Retain"
106
+ imported["UpdateReplacePolicy"] = "Retain"
107
+ imported.pop("DependsOn", None)
108
+ import_template["Resources"][logical_id] = imported
109
+ return import_template
110
+
111
+
112
+ def find_logical_id_by_property(
113
+ template: CfnTemplate,
114
+ resource_type: str,
115
+ property_name: str,
116
+ property_value: str,
117
+ *,
118
+ exclude_logical_ids: Collection[str] | None = None,
119
+ ) -> str | None:
120
+ """Logical ID of a resource of ``resource_type`` whose ``property_name`` matches ``property_value``."""
121
+ exclude = exclude_logical_ids or ()
122
+ resources: dict[str, Any] = template["Resources"]
123
+
124
+ # First pass: exact string match (highest confidence).
125
+ for logical_id, resource in resources.items():
126
+ if logical_id in exclude:
127
+ continue
128
+ props = resource.get("Properties")
129
+ if resource.get("Type") == resource_type and props:
130
+ if props.get(property_name) == property_value:
131
+ return logical_id
132
+
133
+ # Second pass: intrinsic functions (Fn::Join, Fn::Sub, ...) with a boundary check so that
134
+ # "agent1" does not match "agent1_v2".
135
+ pattern = re.compile(re.escape(property_value) + r"(?=[^a-zA-Z0-9_]|$)")
136
+ for logical_id, resource in resources.items():
137
+ if logical_id in exclude:
138
+ continue
139
+ props = resource.get("Properties")
140
+ if resource.get("Type") == resource_type and props:
141
+ prop_val = props.get(property_name)
142
+ if isinstance(prop_val, (dict, list)) and pattern.search(_js_json(prop_val)):
143
+ return logical_id
144
+ return None
145
+
146
+
147
+ def find_logical_ids_by_type(template: CfnTemplate, resource_type: str) -> list[str]:
148
+ return [lid for lid, resource in template["Resources"].items() if resource.get("Type") == resource_type]