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,387 @@
1
+ """Credential add/remove (port of src/cli/primitives/CredentialPrimitive.tsx)."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+
6
+ import typer
7
+
8
+ from agentcore.cli import interactive
9
+ from agentcore.cli.commands.add._common import first_issue, js_url_ok
10
+ from agentcore.cli.commands.add.validate import validate_add_credential_options
11
+ from agentcore.cli.errors import get_error_message
12
+ from agentcore.cli.naming import generate_unique_name
13
+ from agentcore.cli.run_command import run_cli_command
14
+ from agentcore.lib import (
15
+ ConflictError,
16
+ ResourceNotFoundError,
17
+ ValidationError,
18
+ find_config_root,
19
+ get_env_var,
20
+ serialize_result,
21
+ set_env_var,
22
+ )
23
+ from agentcore.lib.errors.types import to_error
24
+ from agentcore.lib.result import Err, Ok
25
+ from agentcore.lib.schemas.io.config_io import to_jsonable
26
+ from agentcore.lib.secrets import validate_credential_name_encryptable
27
+ from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange, emit_json
28
+ from agentcore.primitives.credential_utils import compute_default_credential_env_var_name
29
+ from agentcore.primitives.secret_flag_warning import warn_on_literal_secret_flag
30
+ from agentcore.schema import CredentialName
31
+
32
+
33
+ @dataclass
34
+ class AddApiKeyCredentialOptions:
35
+ name: str
36
+ api_key: str
37
+ authorizer_type: str = "ApiKeyCredentialProvider"
38
+
39
+
40
+ @dataclass
41
+ class AddOAuthCredentialOptions:
42
+ name: str
43
+ discovery_url: str
44
+ client_id: str
45
+ client_secret: str
46
+ scopes: list[str] | None = None
47
+ authorizer_type: str = "OAuthCredentialProvider"
48
+
49
+
50
+ AddCredentialOptions = AddApiKeyCredentialOptions | AddOAuthCredentialOptions
51
+
52
+
53
+ @dataclass
54
+ class CredentialStrategy:
55
+ """Whether an agent reuses an existing model-provider credential or creates a new one."""
56
+
57
+ reuse: bool
58
+ credential_name: str
59
+ env_var_name: str
60
+ is_agent_scoped: bool
61
+
62
+
63
+ def _config_root(config_io: Any) -> str | None:
64
+ try:
65
+ return config_io.get_config_root()
66
+ except Exception: # noqa: BLE001
67
+ return None
68
+
69
+
70
+ class CredentialPrimitive(BasePrimitive):
71
+ kind = "credential"
72
+ label = "Credential"
73
+ article = "a"
74
+
75
+ compute_default_credential_env_var_name = staticmethod(compute_default_credential_env_var_name)
76
+
77
+ def _project(self) -> dict[str, Any]:
78
+ return to_jsonable(self.read_project_spec())
79
+
80
+ # --- add ----------------------------------------------------------------------------
81
+
82
+ def add(self, options: AddCredentialOptions) -> Ok[dict[str, Any]] | Err[Exception]:
83
+ try:
84
+ # An API-key secret lives in the bare AGENTCORE_CREDENTIAL_<NAME> var; refuse names that
85
+ # would normalize to a reserved suffix and leave it unencrypted.
86
+ if options.authorizer_type == "ApiKeyCredentialProvider":
87
+ check = validate_credential_name_encryptable(options.name)
88
+ if check is not True:
89
+ return Err(ValidationError(check))
90
+ credential = self._create_credential(options)
91
+ return Ok({"credentialName": credential["name"]})
92
+ except Exception as exc: # noqa: BLE001
93
+ return Err(to_error(exc))
94
+
95
+ def _create_credential(self, config: AddCredentialOptions) -> dict[str, Any]:
96
+ project = self._project()
97
+ existing = next((c for c in project["credentials"] if c["name"] == config.name), None)
98
+ if existing is not None:
99
+ credential = existing
100
+ elif isinstance(config, AddOAuthCredentialOptions):
101
+ credential = {
102
+ "authorizerType": "OAuthCredentialProvider",
103
+ "name": config.name,
104
+ "discoveryUrl": config.discovery_url,
105
+ "vendor": "CustomOauth2",
106
+ }
107
+ if config.scopes is not None:
108
+ credential["scopes"] = config.scopes
109
+ project["credentials"].append(credential)
110
+ self.write_project_spec(project)
111
+ else:
112
+ credential = {"authorizerType": "ApiKeyCredentialProvider", "name": config.name}
113
+ project["credentials"].append(credential)
114
+ self.write_project_spec(project)
115
+
116
+ root = _config_root(self.config_io)
117
+ prefix = compute_default_credential_env_var_name(config.name)
118
+ if isinstance(config, AddOAuthCredentialOptions):
119
+ set_env_var(f"{prefix}_CLIENT_ID", config.client_id, root)
120
+ set_env_var(f"{prefix}_CLIENT_SECRET", config.client_secret, root)
121
+ else:
122
+ set_env_var(prefix, config.api_key, root)
123
+ return credential
124
+
125
+ # --- remove -------------------------------------------------------------------------
126
+
127
+ def remove(self, name: str, force: bool = False) -> Ok[None] | Err[Exception]:
128
+ try:
129
+ project = self._project()
130
+ index = next((i for i, c in enumerate(project["credentials"]) if c["name"] == name), -1)
131
+ if index == -1:
132
+ return Err(ResourceNotFoundError(f'Credential "{name}" not found.'))
133
+ credential = project["credentials"][index]
134
+ if credential.get("managed") and not force:
135
+ return Err(
136
+ ConflictError(
137
+ f'Credential "{name}" is managed by the CLI and cannot be removed. Use force to override.'
138
+ )
139
+ )
140
+ targets = self._find_referencing_gateway_targets(name, project)
141
+ if targets and not force:
142
+ target_list = ", ".join(t["name"] for t in targets)
143
+ return Err(
144
+ ConflictError(
145
+ f'Credential "{name}" is referenced by gateway target(s): {target_list}. Use force to override.'
146
+ )
147
+ )
148
+ project["credentials"].pop(index)
149
+ self.write_project_spec(project)
150
+ return Ok(None)
151
+ except Exception as exc: # noqa: BLE001
152
+ return Err(to_error(exc))
153
+
154
+ def preview_remove(self, name: str) -> RemovalPreview:
155
+ project = self._project()
156
+ credential = next((c for c in project["credentials"] if c["name"] == name), None)
157
+ if credential is None:
158
+ raise Exception(f'Credential "{name}" not found.')
159
+ summary = [
160
+ f"Removing credential: {name}",
161
+ f"Type: {credential['authorizerType']}",
162
+ "Note: .env file will not be modified",
163
+ ]
164
+ if credential.get("managed"):
165
+ summary.append(
166
+ "Warning: This credential is managed by the CLI. Removing it may break gateway authentication."
167
+ )
168
+ targets = self._find_referencing_gateway_targets(name, project)
169
+ if targets:
170
+ summary.append(f"Warning: Referenced by gateway target(s): {', '.join(t['name'] for t in targets)}")
171
+ after = {**project, "credentials": [c for c in project["credentials"] if c["name"] != name]}
172
+ return RemovalPreview(summary, [], [SchemaChange("agentcore/agentcore.json", project, after)])
173
+
174
+ def get_removable(self) -> list[RemovableResource]:
175
+ try:
176
+ return [
177
+ RemovableResource(c["name"], {"authorizerType": c["authorizerType"]})
178
+ for c in self._project()["credentials"]
179
+ ]
180
+ except Exception: # noqa: BLE001
181
+ return []
182
+
183
+ def get_all_credentials(self) -> list[dict[str, Any]]:
184
+ try:
185
+ return self._project()["credentials"]
186
+ except Exception: # noqa: BLE001
187
+ return []
188
+
189
+ def get_all_names(self) -> list[str]:
190
+ return [c["name"] for c in self.get_all_credentials()]
191
+
192
+ @staticmethod
193
+ def _find_referencing_gateway_targets(name: str, project: dict[str, Any]) -> list[dict[str, Any]]:
194
+ return [
195
+ {"name": target["name"]}
196
+ for gateway in project.get("agentCoreGateways", [])
197
+ for target in gateway.get("targets", [])
198
+ if (target.get("outboundAuth") or {}).get("credentialName") == name
199
+ ]
200
+
201
+ # --- credential strategy for agents ----------------------------------------------------
202
+
203
+ def resolve_credential_strategy(
204
+ self,
205
+ project_name: str,
206
+ agent_name: str,
207
+ model_provider: str,
208
+ new_api_key: str | None,
209
+ config_base_dir: str,
210
+ existing_credentials: list[Any],
211
+ ) -> CredentialStrategy:
212
+ """Reuse a credential holding the same key, else create project- or agent-scoped."""
213
+ if model_provider == "Bedrock" or not new_api_key:
214
+ return CredentialStrategy(True, "", "", False)
215
+
216
+ for cred in existing_credentials:
217
+ cred_name = cred["name"] if isinstance(cred, dict) else cred.name
218
+ env_var_name = compute_default_credential_env_var_name(cred_name)
219
+ if get_env_var(env_var_name, config_base_dir) == new_api_key:
220
+ return CredentialStrategy(True, cred_name, env_var_name, cred_name != f"{project_name}{model_provider}")
221
+
222
+ project_scoped = f"{project_name}{model_provider}"
223
+ names = [c["name"] if isinstance(c, dict) else c.name for c in existing_credentials]
224
+ if project_scoped not in names:
225
+ return CredentialStrategy(
226
+ False, project_scoped, compute_default_credential_env_var_name(project_scoped), False
227
+ )
228
+
229
+ agent_scoped = f"{project_name}{agent_name}{model_provider}"
230
+ return CredentialStrategy(False, agent_scoped, compute_default_credential_env_var_name(agent_scoped), True)
231
+
232
+ # --- CLI ----------------------------------------------------------------------------
233
+
234
+ def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
235
+ @add_app.command("credential", help="Add a credential to the project")
236
+ def add_credential(
237
+ name: str | None = typer.Option(None, "--name", help="Credential name [non-interactive]"),
238
+ api_key: str | None = typer.Option(None, "--api-key", help="The API key value [non-interactive]"),
239
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
240
+ cred_type: str | None = typer.Option(
241
+ None, "--type", help="Credential type: api-key (default) or oauth [non-interactive]"
242
+ ),
243
+ discovery_url: str | None = typer.Option(
244
+ None, "--discovery-url", help="OAuth discovery URL [non-interactive]"
245
+ ),
246
+ client_id: str | None = typer.Option(None, "--client-id", help="OAuth client ID [non-interactive]"),
247
+ client_secret: str | None = typer.Option(
248
+ None, "--client-secret", help="OAuth client secret [non-interactive]"
249
+ ),
250
+ scopes: str | None = typer.Option(None, "--scopes", help="OAuth scopes, comma-separated [non-interactive]"),
251
+ ) -> None:
252
+ if not find_config_root():
253
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
254
+ raise typer.Exit(1)
255
+
256
+ if not (name or api_key or as_json or cred_type or discovery_url or client_id or client_secret or scopes):
257
+ try:
258
+ interactive.require_tty()
259
+ self.add_interactive()
260
+ except typer.Exit:
261
+ raise
262
+ except Exception as exc: # noqa: BLE001
263
+ typer.echo(get_error_message(exc), err=True)
264
+ raise typer.Exit(1) from None
265
+ raise typer.Exit(0)
266
+
267
+ def run() -> None:
268
+ warn_on_literal_secret_flag([api_key, client_secret], as_json, "add credential")
269
+ validation = validate_add_credential_options(
270
+ {
271
+ "name": name,
272
+ "type": cred_type,
273
+ "apiKey": api_key,
274
+ "discoveryUrl": discovery_url,
275
+ "clientId": client_id,
276
+ "clientSecret": client_secret,
277
+ "scopes": scopes,
278
+ }
279
+ )
280
+ if not validation.valid:
281
+ raise ValidationError(validation.error or "")
282
+ options: AddCredentialOptions
283
+ if cred_type == "oauth":
284
+ options = AddOAuthCredentialOptions(
285
+ name=name or "",
286
+ discovery_url=discovery_url or "",
287
+ client_id=client_id or "",
288
+ client_secret=client_secret or "",
289
+ scopes=[s.strip() for s in scopes.split(",") if s.strip()] if scopes is not None else None,
290
+ )
291
+ else:
292
+ options = AddApiKeyCredentialOptions(name=name or "", api_key=api_key or "")
293
+ result = self.add(options)
294
+ if not result.success:
295
+ raise result.error
296
+ if as_json:
297
+ emit_json(serialize_result(result))
298
+ else:
299
+ typer.echo(f"Added credential '{result.value['credentialName']}'")
300
+
301
+ run_cli_command(as_json, run)
302
+
303
+ self.register_remove_subcommand(remove_app)
304
+
305
+ def add_interactive(self, identity_type: str | None = None) -> str | None:
306
+ """Prompt flow mirroring tui/screens/identity/AddIdentityScreen (type, name, secrets, confirm).
307
+
308
+ ``identity_type`` skips the type question (inline creation from other wizards, upstream
309
+ useCreateIdentity). Returns the new credential's name, or None if cancelled.
310
+ """
311
+ existing = self.get_all_names()
312
+ identity_type = identity_type or interactive.select(
313
+ "Select credential type",
314
+ [
315
+ interactive.Choice("API Key", "ApiKeyCredentialProvider", "Store and manage API key credentials"),
316
+ interactive.Choice("OAuth", "OAuthCredentialProvider", "OAuth 2.0 client credentials"),
317
+ ],
318
+ )
319
+ is_oauth = identity_type == "OAuthCredentialProvider"
320
+
321
+ def validate_name(value: str) -> str | None:
322
+ issue = first_issue(CredentialName, value)
323
+ if issue:
324
+ return issue
325
+ if value in existing:
326
+ return "Credential name already exists"
327
+ if not is_oauth:
328
+ check = validate_credential_name_encryptable(value)
329
+ if check is not True:
330
+ return check
331
+ return None
332
+
333
+ name = interactive.text(
334
+ "Credential name",
335
+ default=generate_unique_name("MyOAuth" if is_oauth else "MyApiKey", existing),
336
+ validate=validate_name,
337
+ )
338
+ options: AddCredentialOptions
339
+ if is_oauth:
340
+
341
+ def validate_url(value: str) -> str | None:
342
+ if not js_url_ok(value):
343
+ return "Must be a valid URL"
344
+ if not value.endswith("/.well-known/openid-configuration"):
345
+ return "URL must end with '/.well-known/openid-configuration'"
346
+ return None
347
+
348
+ discovery_url = interactive.text("Discovery URL (OIDC well-known endpoint)", validate=validate_url)
349
+ client_id = interactive.text(
350
+ "Client ID", secret=True, validate=lambda v: None if v.strip() else "Client ID is required"
351
+ )
352
+ client_secret = interactive.text(
353
+ "Client Secret", secret=True, validate=lambda v: None if v.strip() else "Client secret is required"
354
+ )
355
+ scopes = interactive.text("Scopes (comma-separated, optional)", default="")
356
+ summary = [("Type", "OAuth"), ("Name", name), ("Discovery URL", discovery_url)]
357
+ if scopes:
358
+ summary.append(("Scopes", scopes))
359
+ options = AddOAuthCredentialOptions(
360
+ name=name,
361
+ discovery_url=discovery_url,
362
+ client_id=client_id,
363
+ client_secret=client_secret,
364
+ scopes=[s.strip() for s in scopes.split(",") if s.strip()] if scopes else None,
365
+ )
366
+ else:
367
+ api_key = interactive.text(
368
+ "API Key", secret=True, validate=lambda v: None if v.strip() else "API key is required"
369
+ )
370
+ summary = [("Type", "API Key"), ("Name", name), ("API Key", "*" * min(len(api_key), 20))]
371
+ options = AddApiKeyCredentialOptions(name=name, api_key=api_key)
372
+
373
+ for label, value in summary:
374
+ typer.echo(f" {label}: {value}")
375
+ if not interactive.confirm("Add this credential?", default=True):
376
+ typer.echo("Cancelled.")
377
+ return None
378
+ result = self.add(options)
379
+ if not result.success:
380
+ typer.echo("Failed to add credential", err=True)
381
+ typer.echo(get_error_message(result.error), err=True)
382
+ raise typer.Exit(1)
383
+ typer.echo(f"Added credential: {result.value['credentialName']}")
384
+ return result.value["credentialName"]
385
+
386
+
387
+ PRIMITIVE = CredentialPrimitive()
@@ -0,0 +1,45 @@
1
+ """Credential env-var naming (port of src/cli/primitives/credential-utils.ts)."""
2
+
3
+ from dataclasses import dataclass
4
+
5
+
6
+ def _prefix(credential_name: str) -> str:
7
+ return f"AGENTCORE_CREDENTIAL_{credential_name.replace('-', '_').upper()}"
8
+
9
+
10
+ def compute_default_credential_env_var_name(credential_name: str) -> str:
11
+ return _prefix(credential_name)
12
+
13
+
14
+ def compute_managed_oauth_credential_name(gateway_name: str) -> str:
15
+ return f"{gateway_name}-oauth"
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class PaymentCredentialEnvVarNames:
20
+ api_key_id: str
21
+ api_key_secret: str
22
+ wallet_secret: str
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class StripePrivyCredentialEnvVarNames:
27
+ app_id: str
28
+ app_secret: str
29
+ authorization_private_key: str
30
+ authorization_id: str
31
+
32
+
33
+ def compute_payment_credential_env_var_names(credential_name: str) -> PaymentCredentialEnvVarNames:
34
+ prefix = _prefix(credential_name)
35
+ return PaymentCredentialEnvVarNames(f"{prefix}_API_KEY_ID", f"{prefix}_API_KEY_SECRET", f"{prefix}_WALLET_SECRET")
36
+
37
+
38
+ def compute_stripe_privy_credential_env_var_names(credential_name: str) -> StripePrivyCredentialEnvVarNames:
39
+ prefix = _prefix(credential_name)
40
+ return StripePrivyCredentialEnvVarNames(
41
+ f"{prefix}_APP_ID",
42
+ f"{prefix}_APP_SECRET",
43
+ f"{prefix}_AUTHORIZATION_PRIVATE_KEY",
44
+ f"{prefix}_AUTHORIZATION_ID",
45
+ )
@@ -0,0 +1,211 @@
1
+ """Dataset add/remove (port of src/cli/primitives/DatasetPrimitive.ts)."""
2
+
3
+ import json
4
+ import os
5
+ from dataclasses import dataclass
6
+ from importlib import resources
7
+ from typing import Any
8
+
9
+ import typer
10
+
11
+ from agentcore.cli import interactive
12
+ from agentcore.cli.commands.add._common import first_issue
13
+ from agentcore.cli.commands.add.validate import validate_add_dataset_options
14
+ from agentcore.cli.errors import get_error_message
15
+ from agentcore.cli.naming import generate_unique_name
16
+ from agentcore.cli.run_command import run_cli_command
17
+ from agentcore.lib import find_config_root
18
+ from agentcore.lib.result import Err, Ok
19
+ from agentcore.lib.schemas.io.config_io import to_jsonable
20
+ from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange
21
+ from agentcore.schema import DatasetName, is_valid_kms_key_arn
22
+
23
+ SCHEMA_TYPE_TO_ASSET = {
24
+ "AGENTCORE_EVALUATION_PREDEFINED_V1": "predefined-v1.jsonl",
25
+ "AGENTCORE_EVALUATION_SIMULATED_V1": "simulated-v1.jsonl",
26
+ }
27
+ SCHEMA_TYPE_OPTIONS = (
28
+ ("AGENTCORE_EVALUATION_PREDEFINED_V1", "Predefined Turns", "Explicit inputs with expected responses"),
29
+ ("AGENTCORE_EVALUATION_SIMULATED_V1", "Actor Simulator", "Actor profiles for synthetic conversations"),
30
+ )
31
+
32
+
33
+ @dataclass
34
+ class AddDatasetOptions:
35
+ name: str
36
+ schema_type: str
37
+ description: str | None = None
38
+ kms_key_arn: str | None = None
39
+
40
+
41
+ def read_dataset_asset(asset_file: str) -> bytes:
42
+ """Bundled starter dataset (``agentcore/assets/datasets/*.jsonl``)."""
43
+ return resources.files("agentcore.assets").joinpath("datasets", asset_file).read_bytes()
44
+
45
+
46
+ class DatasetPrimitive(BasePrimitive):
47
+ kind = "dataset"
48
+ label = "Dataset"
49
+ article = "a"
50
+
51
+ def _project(self) -> dict[str, Any]:
52
+ return to_jsonable(self.read_project_spec())
53
+
54
+ def add(self, options: AddDatasetOptions) -> Ok | Err:
55
+ try:
56
+ project = self._project()
57
+ datasets = project.get("datasets") or []
58
+ self.check_duplicate([RemovableResource(d["name"]) for d in datasets], options.name)
59
+ location = f"datasets/{options.name}.jsonl"
60
+ dataset: dict[str, Any] = {"name": options.name, "schemaType": options.schema_type}
61
+ if options.description:
62
+ dataset["description"] = options.description
63
+ if options.kms_key_arn:
64
+ dataset["kmsKeyArn"] = options.kms_key_arn
65
+ dataset["config"] = {"managed": {"location": location}}
66
+ datasets.append(dataset)
67
+ project["datasets"] = datasets
68
+ self.write_project_spec(project)
69
+ self._scaffold_dataset_file(options.schema_type, location)
70
+ return Ok({"datasetName": options.name, "location": f"agentcore/{location}"})
71
+ except Exception as exc: # noqa: BLE001
72
+ return Err(exc if isinstance(exc, Exception) else Exception(get_error_message(exc)))
73
+
74
+ def _scaffold_dataset_file(self, schema_type: str, location: str) -> None:
75
+ config_root = find_config_root()
76
+ if not config_root:
77
+ return
78
+ os.makedirs(os.path.join(config_root, "datasets"), exist_ok=True)
79
+ asset = SCHEMA_TYPE_TO_ASSET.get(schema_type)
80
+ if not asset:
81
+ return
82
+ with open(os.path.join(config_root, location), "wb") as fh:
83
+ fh.write(read_dataset_asset(asset))
84
+
85
+ def remove(self, name: str) -> Ok | Err:
86
+ try:
87
+ project = self._project()
88
+ datasets = project.get("datasets") or []
89
+ index = next((i for i, d in enumerate(datasets) if d["name"] == name), -1)
90
+ if index == -1:
91
+ return Err(Exception(f'Dataset "{name}" not found.'))
92
+ datasets.pop(index)
93
+ project["datasets"] = datasets
94
+ self.write_project_spec(project)
95
+ return Ok(None)
96
+ except Exception as exc: # noqa: BLE001
97
+ return Err(exc)
98
+
99
+ def preview_remove(self, name: str) -> RemovalPreview:
100
+ project = self._project()
101
+ datasets = project.get("datasets") or []
102
+ if not any(d["name"] == name for d in datasets):
103
+ raise Exception(f'Dataset "{name}" not found.')
104
+ after = {**project, "datasets": [d for d in datasets if d["name"] != name]}
105
+ return RemovalPreview(
106
+ [f"Removing dataset: {name}"], [], [SchemaChange("agentcore/agentcore.json", project, after)]
107
+ )
108
+
109
+ def get_removable(self) -> list[RemovableResource]:
110
+ try:
111
+ return [RemovableResource(d["name"]) for d in self._project().get("datasets") or []]
112
+ except Exception: # noqa: BLE001
113
+ return []
114
+
115
+ def get_all_names(self) -> list[str]:
116
+ return [r.name for r in self.get_removable()]
117
+
118
+ def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
119
+ @add_app.command("dataset", help="Add a dataset to the project")
120
+ def add_dataset(
121
+ name: str | None = typer.Option(None, "--name", help="Dataset name [non-interactive]"),
122
+ schema_type: str | None = typer.Option(
123
+ None,
124
+ "--schema-type",
125
+ help="Dataset schema type: AGENTCORE_EVALUATION_PREDEFINED_V1 | AGENTCORE_EVALUATION_SIMULATED_V1 "
126
+ "[non-interactive]",
127
+ ),
128
+ description: str | None = typer.Option(None, "--description", help="Dataset description [non-interactive]"),
129
+ kms_key_arn: str | None = typer.Option(
130
+ None, "--kms-key-arn", help="KMS key ARN for dataset encryption (optional) [non-interactive]"
131
+ ),
132
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
133
+ ) -> None:
134
+ if not find_config_root():
135
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
136
+ raise typer.Exit(1)
137
+ if not (name or as_json):
138
+ try:
139
+ interactive.require_tty()
140
+ self.add_interactive()
141
+ except typer.Exit:
142
+ raise
143
+ except Exception as exc: # noqa: BLE001
144
+ typer.echo(get_error_message(exc), err=True)
145
+ raise typer.Exit(1) from None
146
+ raise typer.Exit(0)
147
+
148
+ def run() -> None:
149
+ validation = validate_add_dataset_options(
150
+ {
151
+ "name": name or "",
152
+ "schemaType": schema_type or "",
153
+ "description": description,
154
+ "kmsKeyArn": kms_key_arn,
155
+ }
156
+ )
157
+ if not validation.valid:
158
+ raise Exception(validation.error)
159
+ result = self.add(AddDatasetOptions(name or "", schema_type or "", description, kms_key_arn))
160
+ if not result.success:
161
+ raise result.error
162
+ if as_json:
163
+ # Upstream prints the raw AddResult (`JSON.stringify(result)`).
164
+ typer.echo(json.dumps({"success": True, **result.value}, separators=(",", ":")))
165
+ else:
166
+ typer.echo(f"Added dataset '{result.value['datasetName']}'")
167
+ typer.echo(f" File: {result.value['location']}")
168
+
169
+ run_cli_command(as_json, run)
170
+
171
+ self.register_remove_subcommand(remove_app)
172
+
173
+ def add_interactive(self) -> None:
174
+ """Prompt flow mirroring tui/screens/dataset/AddDatasetScreen."""
175
+ existing = self.get_all_names()
176
+
177
+ def validate_name(value: str) -> str | None:
178
+ issue = first_issue(DatasetName, value)
179
+ if issue:
180
+ return issue
181
+ return "Dataset name already exists" if value in existing else None
182
+
183
+ name = interactive.text(
184
+ "Dataset name", default=generate_unique_name("MyDataset", existing), validate=validate_name
185
+ )
186
+ schema_type = interactive.select(
187
+ "Schema type", [interactive.Choice(t, i, d) for i, t, d in SCHEMA_TYPE_OPTIONS]
188
+ )
189
+ description = interactive.text("Description (optional, press Enter to skip)")
190
+ kms = interactive.text(
191
+ "KMS Key ARN (optional, press Enter to skip)",
192
+ validate=lambda v: None if v == "" or is_valid_kms_key_arn(v) else "Must be a valid KMS key ARN",
193
+ )
194
+ typer.echo(f" Name: {name}")
195
+ typer.echo(f" Schema Type: {schema_type}")
196
+ if description:
197
+ typer.echo(f" Description: {description}")
198
+ if kms:
199
+ typer.echo(f" KMS Key: {kms}")
200
+ if not interactive.confirm("Add this dataset?", default=True):
201
+ typer.echo("Cancelled.")
202
+ return
203
+ result = self.add(AddDatasetOptions(name, schema_type, description or None, kms or None))
204
+ if not result.success:
205
+ typer.echo("Failed to add dataset", err=True)
206
+ typer.echo(get_error_message(result.error), err=True)
207
+ raise typer.Exit(1)
208
+ typer.echo(f"Added dataset: {name}")
209
+
210
+
211
+ PRIMITIVE = DatasetPrimitive()
@@ -0,0 +1,34 @@
1
+ """Resolve deployed gateways across both storage locations (port of primitives/deployed-gateways.ts).
2
+
3
+ Deployed state keeps MCP gateways under ``resources.mcp.gateways`` and HTTP gateways
4
+ (``protocolType: "None"``) under ``resources.gateways``. A project can populate both maps, so they
5
+ are merged rather than falling back from one to the other.
6
+ """
7
+
8
+ from typing import Any
9
+
10
+
11
+ def merge_deployed_gateways(target: Any) -> dict[str, Any]:
12
+ resources = getattr(target, "resources", None)
13
+ mcp = getattr(resources, "mcp", None) if resources is not None else None
14
+ merged: dict[str, Any] = dict((getattr(mcp, "gateways", None) or {}) if mcp is not None else {})
15
+ merged.update((getattr(resources, "gateways", None) or {}) if resources is not None else {})
16
+ return merged
17
+
18
+
19
+ def find_deployed_gateway(state: Any, name: str) -> Any | None:
20
+ """Find a deployed gateway by name across all targets."""
21
+ for target in (state.targets or {}).values():
22
+ gateway = merge_deployed_gateways(target).get(name)
23
+ if gateway:
24
+ return gateway
25
+ return None
26
+
27
+
28
+ def first_deployed_gateway(state: Any) -> Any | None:
29
+ """The first deployed gateway across all targets."""
30
+ for target in (state.targets or {}).values():
31
+ gateways = list(merge_deployed_gateways(target).values())
32
+ if gateways:
33
+ return gateways[0]
34
+ return None