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,430 @@
1
+ """Payment control/data-plane operations (port of ``agentcore-payments.ts``).
2
+
3
+ Upstream calls these with SigV4-signed ``fetch`` requests (8s timeout); the raw requests are kept
4
+ so paths, payloads, error redaction and the passthrough of the service JSON are unchanged.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import os
11
+ from collections.abc import Iterable, Mapping
12
+ from dataclasses import dataclass
13
+ from typing import Any, Literal, NotRequired, TypedDict
14
+
15
+ import urllib3
16
+
17
+ from agentcore.aws._http import HttpResponse, encode_uri_component, signed_request
18
+ from agentcore.aws.stage_endpoint import control_plane_endpoint, data_plane_endpoint
19
+ from agentcore.lib.utils.json_format import to_json_string
20
+
21
+ _REQUEST_TIMEOUT_S = 8.0
22
+
23
+
24
+ class PaymentApiError(RuntimeError):
25
+ """Payment API failure; ``code`` carries the service's ``code``/``__type`` when present."""
26
+
27
+ def __init__(self, message: str, code: str | None = None):
28
+ super().__init__(message)
29
+ self.code = code
30
+
31
+ @property
32
+ def message(self) -> str:
33
+ return str(self)
34
+
35
+
36
+ # --- Credential provider options ---
37
+
38
+
39
+ @dataclass(slots=True)
40
+ class CoinbaseCdpCredentialProviderOptions:
41
+ region: str
42
+ name: str
43
+ api_key_id: str
44
+ api_key_secret: str
45
+ wallet_secret: str
46
+ vendor: Literal["CoinbaseCDP"] = "CoinbaseCDP"
47
+
48
+
49
+ @dataclass(slots=True)
50
+ class StripePrivyCredentialProviderOptions:
51
+ region: str
52
+ name: str
53
+ app_id: str
54
+ app_secret: str
55
+ authorization_private_key: str
56
+ authorization_id: str
57
+ vendor: Literal["StripePrivy"] = "StripePrivy"
58
+
59
+
60
+ CreatePaymentCredentialProviderOptions = CoinbaseCdpCredentialProviderOptions | StripePrivyCredentialProviderOptions
61
+ UpdatePaymentCredentialProviderOptions = CreatePaymentCredentialProviderOptions
62
+
63
+
64
+ class PaymentCredentialProviderApiResult(TypedDict):
65
+ credentialProviderArn: str
66
+ status: str
67
+
68
+
69
+ class PaymentCredentialProviderDetail(TypedDict):
70
+ credentialProviderArn: str
71
+ name: str
72
+ status: str
73
+
74
+
75
+ class PaymentManagerDetail(TypedDict):
76
+ paymentManagerId: str
77
+ paymentManagerArn: str
78
+ name: str
79
+ status: str
80
+ description: NotRequired[str]
81
+ roleArn: NotRequired[str]
82
+
83
+
84
+ PaymentConnectorStatus = Literal[
85
+ "CREATING",
86
+ "UPDATING",
87
+ "DELETING",
88
+ "READY",
89
+ "CREATE_FAILED",
90
+ "UPDATE_FAILED",
91
+ "DELETE_FAILED",
92
+ "AWS_MARKETPLACE_SUBSCRIPTION_REQUIRED",
93
+ "PENDING_AUTHENTICATION",
94
+ "PROVISIONING",
95
+ "AUTHENTICATION_EXPIRED",
96
+ "AUTHENTICATION_FAILED",
97
+ ]
98
+
99
+
100
+ class PaymentCredentialProviderConfiguration(TypedDict, total=False):
101
+ coinbaseCDP: dict[str, str]
102
+ stripePrivy: dict[str, str]
103
+
104
+
105
+ class PaymentConnectorDetail(TypedDict):
106
+ paymentConnectorId: str
107
+ name: str
108
+ description: NotRequired[str]
109
+ type: Literal["CoinbaseCDP", "StripePrivy"]
110
+ credentialProviderConfigurations: list[PaymentCredentialProviderConfiguration]
111
+ createdAt: float | str
112
+ lastUpdatedAt: float | str
113
+ status: PaymentConnectorStatus
114
+ authorizationUrl: NotRequired[str]
115
+
116
+
117
+ # ============================================================================
118
+ # Error helpers
119
+ # ============================================================================
120
+
121
+
122
+ def rethrow_with_context(prefix: str, err: object) -> PaymentApiError:
123
+ """Wrap ``err`` with a contextual prefix, preserving its structured ``code``."""
124
+ code = getattr(err, "code", None)
125
+ wrapped = PaymentApiError(f"{prefix}: {err}", code if isinstance(code, str) else None)
126
+ if isinstance(err, BaseException):
127
+ wrapped.__cause__ = err
128
+ return wrapped
129
+
130
+
131
+ def redact_secrets(text: str, secrets: Iterable[str] | None) -> str:
132
+ """Replace every literal occurrence of each secret with ``[REDACTED]``."""
133
+ out = text
134
+ for secret in secrets or []:
135
+ if isinstance(secret, str) and secret:
136
+ out = out.replace(secret, "[REDACTED]")
137
+ return out
138
+
139
+
140
+ def sanitize_error_body(body: str, secrets: Iterable[str] | None) -> str:
141
+ """Error excerpt: parsed ``code``/``__type`` and redacted ``message``; plus the redacted body under ``DEBUG``."""
142
+ if not body:
143
+ return ""
144
+ secret_list = list(secrets or [])
145
+ parts: list[str] = []
146
+ try:
147
+ parsed = json.loads(body)
148
+ if isinstance(parsed, dict):
149
+ code = parsed.get("code") if parsed.get("code") is not None else parsed.get("__type")
150
+ if isinstance(code, str):
151
+ parts.append(code)
152
+ message = next(
153
+ (parsed[k] for k in ("message", "Message", "errorMessage") if parsed.get(k) is not None), None
154
+ )
155
+ if isinstance(message, str):
156
+ parts.append(redact_secrets(message, secret_list))
157
+ except ValueError:
158
+ pass # body is not JSON
159
+ if os.environ.get("DEBUG"):
160
+ parts.append(redact_secrets(body, secret_list)[:500])
161
+ return " — ".join(parts)
162
+
163
+
164
+ def _error_code(body: str) -> str | None:
165
+ try:
166
+ parsed = json.loads(body)
167
+ except ValueError:
168
+ return None
169
+ if not isinstance(parsed, dict):
170
+ return None
171
+ code = parsed.get("code") if parsed.get("code") is not None else parsed.get("__type")
172
+ return code if isinstance(code, str) else None
173
+
174
+
175
+ def _send(
176
+ *,
177
+ endpoint: str,
178
+ label: str,
179
+ region: str,
180
+ method: str,
181
+ path: str,
182
+ body: str | None,
183
+ extra_headers: Mapping[str, str] | None,
184
+ secrets_to_redact: Iterable[str] | None,
185
+ ) -> Any:
186
+ try:
187
+ response: HttpResponse = signed_request(
188
+ method, f"{endpoint}{path}", region=region, body=body, headers=extra_headers, timeout=_REQUEST_TIMEOUT_S
189
+ )
190
+ except (urllib3.exceptions.TimeoutError, TimeoutError) as exc:
191
+ raise PaymentApiError(
192
+ f"{label} request timed out (>8s) for {method} {path}. Check network connectivity and region."
193
+ ) from exc
194
+
195
+ if not response.ok:
196
+ try:
197
+ error_body = response.text()
198
+ except Exception: # noqa: BLE001
199
+ error_body = ""
200
+ base = f"{label} error ({response.status})"
201
+ excerpt = sanitize_error_body(error_body, secrets_to_redact)
202
+ raise PaymentApiError(f"{base}: {excerpt}" if excerpt else base, _error_code(error_body))
203
+
204
+ if response.status == 204:
205
+ return {}
206
+ return response.json()
207
+
208
+
209
+ def _signed_request(
210
+ *, region: str, method: str, path: str, body: str | None = None, secrets_to_redact: Iterable[str] | None = None
211
+ ) -> Any:
212
+ return _send(
213
+ endpoint=control_plane_endpoint(region),
214
+ label="Payment API",
215
+ region=region,
216
+ method=method,
217
+ path=path,
218
+ body=body,
219
+ extra_headers=None,
220
+ secrets_to_redact=secrets_to_redact,
221
+ )
222
+
223
+
224
+ def _signed_data_plane_request(
225
+ *,
226
+ region: str,
227
+ method: str,
228
+ path: str,
229
+ body: str | None = None,
230
+ extra_headers: Mapping[str, str] | None = None,
231
+ secrets_to_redact: Iterable[str] | None = None,
232
+ ) -> Any:
233
+ return _send(
234
+ endpoint=data_plane_endpoint(region),
235
+ label="Payment data plane API",
236
+ region=region,
237
+ method=method,
238
+ path=path,
239
+ body=body,
240
+ extra_headers=extra_headers,
241
+ secrets_to_redact=secrets_to_redact,
242
+ )
243
+
244
+
245
+ def _is_not_found(err: PaymentApiError) -> bool:
246
+ return err.code == "ResourceNotFoundException" or "(404)" in str(err)
247
+
248
+
249
+ # ============================================================================
250
+ # Payment credential providers
251
+ # ============================================================================
252
+
253
+
254
+ def _build_provider_config_payload(
255
+ options: CreatePaymentCredentialProviderOptions,
256
+ ) -> tuple[str, dict[str, Any], list[str]]:
257
+ """(vendor, providerConfigurationInput, literal secrets used only for redaction)."""
258
+ if isinstance(options, StripePrivyCredentialProviderOptions):
259
+ return (
260
+ "StripePrivy",
261
+ {
262
+ "stripePrivyConfiguration": {
263
+ "appId": options.app_id,
264
+ "appSecret": options.app_secret,
265
+ "authorizationPrivateKey": options.authorization_private_key,
266
+ "authorizationId": options.authorization_id,
267
+ }
268
+ },
269
+ [options.app_id, options.app_secret, options.authorization_private_key, options.authorization_id],
270
+ )
271
+ return (
272
+ "CoinbaseCDP",
273
+ {
274
+ "coinbaseCdpConfiguration": {
275
+ "apiKeyId": options.api_key_id,
276
+ "apiKeySecret": options.api_key_secret,
277
+ "walletSecret": options.wallet_secret,
278
+ }
279
+ },
280
+ [options.api_key_id, options.api_key_secret, options.wallet_secret],
281
+ )
282
+
283
+
284
+ def _write_credential_provider(
285
+ options: CreatePaymentCredentialProviderOptions, operation: str, verb: str
286
+ ) -> PaymentCredentialProviderApiResult:
287
+ vendor, config_input, secrets = _build_provider_config_payload(options)
288
+ body = to_json_string(
289
+ {"name": options.name, "credentialProviderVendor": vendor, "providerConfigurationInput": config_input},
290
+ indent=None,
291
+ )
292
+ try:
293
+ data = _signed_request(
294
+ region=options.region,
295
+ method="POST",
296
+ path=f"/identities/{operation}",
297
+ body=body,
298
+ secrets_to_redact=secrets,
299
+ )
300
+ except Exception as exc:
301
+ raise rethrow_with_context(f'Failed to {verb} payment credential provider "{options.name}"', exc) from exc
302
+ return {"credentialProviderArn": data.get("credentialProviderArn"), "status": data.get("status")}
303
+
304
+
305
+ def create_payment_credential_provider(
306
+ options: CreatePaymentCredentialProviderOptions,
307
+ ) -> PaymentCredentialProviderApiResult:
308
+ return _write_credential_provider(options, "CreatePaymentCredentialProvider", "create")
309
+
310
+
311
+ def update_payment_credential_provider(
312
+ options: UpdatePaymentCredentialProviderOptions,
313
+ ) -> PaymentCredentialProviderApiResult:
314
+ return _write_credential_provider(options, "UpdatePaymentCredentialProvider", "update")
315
+
316
+
317
+ def get_payment_credential_provider(*, region: str, name: str) -> PaymentCredentialProviderDetail | None:
318
+ """Provider details, or ``None`` if it does not exist."""
319
+ try:
320
+ return _signed_request(
321
+ region=region,
322
+ method="POST",
323
+ path="/identities/GetPaymentCredentialProvider",
324
+ body=to_json_string({"name": name}, indent=None),
325
+ )
326
+ except PaymentApiError as exc:
327
+ if _is_not_found(exc):
328
+ return None
329
+ raise rethrow_with_context(f'Failed to get payment credential provider "{name}"', exc) from exc
330
+ except Exception as exc:
331
+ raise rethrow_with_context(f'Failed to get payment credential provider "{name}"', exc) from exc
332
+
333
+
334
+ def delete_payment_credential_provider(*, region: str, name: str) -> None:
335
+ try:
336
+ _signed_request(
337
+ region=region,
338
+ method="POST",
339
+ path="/identities/DeletePaymentCredentialProvider",
340
+ body=to_json_string({"name": name}, indent=None),
341
+ )
342
+ except Exception as exc:
343
+ raise rethrow_with_context(f'Failed to delete payment credential provider "{name}"', exc) from exc
344
+
345
+
346
+ # ============================================================================
347
+ # Payment managers / connectors
348
+ # ============================================================================
349
+
350
+
351
+ def _get_or_none(path: str, region: str, context: str) -> Any:
352
+ try:
353
+ return _signed_request(region=region, method="GET", path=path)
354
+ except PaymentApiError as exc:
355
+ if _is_not_found(exc):
356
+ return None
357
+ raise rethrow_with_context(context, exc) from exc
358
+ except Exception as exc:
359
+ raise rethrow_with_context(context, exc) from exc
360
+
361
+
362
+ def get_payment_manager(*, region: str, payment_manager_id: str) -> PaymentManagerDetail | None:
363
+ return _get_or_none(
364
+ f"/payments/managers/{encode_uri_component(payment_manager_id)}",
365
+ region,
366
+ f'Failed to get payment manager "{payment_manager_id}"',
367
+ )
368
+
369
+
370
+ def get_payment_connector(
371
+ *, region: str, payment_manager_id: str, payment_connector_id: str
372
+ ) -> PaymentConnectorDetail | None:
373
+ return _get_or_none(
374
+ f"/payments/managers/{encode_uri_component(payment_manager_id)}/connectors/"
375
+ + encode_uri_component(payment_connector_id),
376
+ region,
377
+ f'Failed to get payment connector "{payment_connector_id}"',
378
+ )
379
+
380
+
381
+ # ============================================================================
382
+ # Data plane: payment sessions
383
+ # ============================================================================
384
+
385
+
386
+ def get_or_create_payment_session(
387
+ *,
388
+ region: str,
389
+ manager_arn: str,
390
+ user_id: str,
391
+ default_spend_limit: str = "10.00",
392
+ default_expiry_minutes: int = 60,
393
+ ) -> str:
394
+ """Return an ACTIVE payment session for ``user_id``, creating one with the default budget if needed.
395
+
396
+ Uses the developer's credentials (ManagementRole).
397
+ """
398
+ user_id_header = {"X-Amzn-Bedrock-AgentCore-Payments-User-Id": user_id}
399
+
400
+ try:
401
+ listed = _signed_data_plane_request(
402
+ region=region,
403
+ method="POST",
404
+ path="/payments/listPaymentSessions",
405
+ body=to_json_string({"userId": user_id, "paymentManagerArn": manager_arn}, indent=None),
406
+ extra_headers=user_id_header,
407
+ )
408
+ active = [s for s in listed.get("paymentSessions") or [] if s.get("status") == "ACTIVE"]
409
+ if active:
410
+ return active[0]["paymentSessionId"]
411
+ except Exception: # noqa: BLE001, S110 - fall through to create
412
+ pass
413
+
414
+ # CreatePaymentSession wraps the session in `paymentSession` (unlike the list response).
415
+ created = _signed_data_plane_request(
416
+ region=region,
417
+ method="POST",
418
+ path="/payments/createPaymentSession",
419
+ body=to_json_string(
420
+ {
421
+ "userId": user_id,
422
+ "paymentManagerArn": manager_arn,
423
+ "expiryTimeInMinutes": default_expiry_minutes,
424
+ "limits": {"maxSpendAmount": {"value": default_spend_limit, "currency": "USD"}},
425
+ },
426
+ indent=None,
427
+ ),
428
+ extra_headers=user_id_header,
429
+ )
430
+ return created["paymentSession"]["paymentSessionId"]
@@ -0,0 +1,140 @@
1
+ """Recommendation API operations (port of ``agentcore-recommendation.ts``).
2
+
3
+ All Recommendation endpoints are on the data plane (as of upstream v0.31.1). Recommendations are
4
+ one-shot and immutable: start, poll with get, stop via delete. Upstream calls these with
5
+ SigV4-signed ``fetch`` requests; the raw requests are kept so payloads and the passthrough of the
6
+ service JSON (e.g. ``statusReasons``, ``completedAt``) are unchanged.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import Any, Literal, NotRequired, TypedDict
12
+
13
+ from agentcore.aws._http import HttpResponse, query_string, signed_request
14
+ from agentcore.aws._util import drop_none
15
+ from agentcore.aws.stage_endpoint import data_plane_endpoint
16
+ from agentcore.lib.errors.types import JobNotFoundError
17
+ from agentcore.lib.utils.json_format import to_json_string
18
+
19
+ RecommendationType = Literal["SYSTEM_PROMPT_RECOMMENDATION", "TOOL_DESCRIPTION_RECOMMENDATION"]
20
+
21
+ # Input config: tagged union, populate only the member matching the type:
22
+ # {"systemPromptRecommendationConfig": {systemPrompt, agentTraces, evaluationConfig?}}
23
+ # {"toolDescriptionRecommendationConfig": {toolDescription, agentTraces}}
24
+ RecommendationConfig = dict[str, Any]
25
+ # Result: {"systemPromptRecommendationResult": {...}} or {"toolDescriptionRecommendationResult": {...}}
26
+ RecommendationResult = dict[str, Any]
27
+
28
+
29
+ class StartRecommendationResult(TypedDict):
30
+ recommendationId: str
31
+ recommendationArn: str
32
+ name: str
33
+ type: str
34
+ status: str
35
+ createdAt: NotRequired[str]
36
+ updatedAt: NotRequired[str]
37
+ requestId: NotRequired[str]
38
+
39
+
40
+ class GetRecommendationResult(TypedDict):
41
+ recommendationId: str
42
+ recommendationArn: str
43
+ name: str
44
+ description: NotRequired[str]
45
+ type: str
46
+ recommendationConfig: NotRequired[RecommendationConfig]
47
+ status: str
48
+ statusReasons: NotRequired[list[str]]
49
+ createdAt: NotRequired[str]
50
+ updatedAt: NotRequired[str]
51
+ completedAt: NotRequired[str]
52
+ recommendationResult: NotRequired[RecommendationResult]
53
+ requestId: NotRequired[str]
54
+
55
+
56
+ class RecommendationSummary(TypedDict):
57
+ recommendationId: str
58
+ recommendationArn: str
59
+ name: str
60
+ description: NotRequired[str]
61
+ type: str
62
+ status: str
63
+ createdAt: NotRequired[str]
64
+ updatedAt: NotRequired[str]
65
+
66
+
67
+ class ListRecommendationsResult(TypedDict):
68
+ recommendationSummaries: list[RecommendationSummary]
69
+ nextToken: NotRequired[str]
70
+
71
+
72
+ class DeleteRecommendationResult(TypedDict):
73
+ recommendationId: str
74
+ status: str
75
+
76
+
77
+ def _signed_request(*, region: str, method: str, path: str, body: str | None = None) -> tuple[Any, str]:
78
+ endpoint = data_plane_endpoint(region)
79
+ response: HttpResponse = signed_request(method, f"{endpoint}{path}", region=region, body=body)
80
+ request_id = response.header("x-amzn-requestid") or "unknown"
81
+ if not response.ok:
82
+ message = f"Recommendation API error ({response.status}): {response.text()} [requestId: {request_id}]"
83
+ if response.status == 404:
84
+ raise JobNotFoundError(message, error_source="service")
85
+ raise RuntimeError(message)
86
+ if response.status == 204:
87
+ return {}, request_id
88
+ return response.json(), request_id
89
+
90
+
91
+ def start_recommendation(
92
+ *,
93
+ region: str,
94
+ name: str,
95
+ type: RecommendationType,
96
+ recommendation_config: RecommendationConfig,
97
+ description: str | None = None,
98
+ kms_key_arn: str | None = None,
99
+ client_token: str | None = None,
100
+ ) -> StartRecommendationResult:
101
+ """Start a recommendation (202): PENDING -> IN_PROGRESS -> COMPLETED | FAILED."""
102
+ body: dict[str, Any] = {"name": name}
103
+ if description:
104
+ body["description"] = description
105
+ body["type"] = type
106
+ body["recommendationConfig"] = recommendation_config
107
+ if kms_key_arn:
108
+ body["kmsKeyArn"] = kms_key_arn
109
+ if client_token:
110
+ body["clientToken"] = client_token
111
+ data, request_id = _signed_request(
112
+ region=region, method="POST", path="/recommendations", body=to_json_string(body, indent=None)
113
+ )
114
+ if request_id:
115
+ data["requestId"] = request_id
116
+ return data
117
+
118
+
119
+ def get_recommendation(*, region: str, recommendation_id: str) -> GetRecommendationResult:
120
+ """Recommendation status; ``recommendationResult`` is populated once COMPLETED."""
121
+ data, request_id = _signed_request(region=region, method="GET", path=f"/recommendations/{recommendation_id}")
122
+ if request_id:
123
+ data["requestId"] = request_id
124
+ return data
125
+
126
+
127
+ def list_recommendations(
128
+ *, region: str, status: str | None = None, max_results: int | None = None, next_token: str | None = None
129
+ ) -> ListRecommendationsResult:
130
+ query = query_string({"status": status, "maxResults": max_results, "nextToken": next_token})
131
+ data, _ = _signed_request(region=region, method="GET", path=f"/recommendations{query}")
132
+ return drop_none( # type: ignore[return-value]
133
+ {"recommendationSummaries": data.get("recommendationSummaries") or [], "nextToken": data.get("nextToken")}
134
+ )
135
+
136
+
137
+ def delete_recommendation(*, region: str, recommendation_id: str) -> DeleteRecommendationResult:
138
+ """Delete a recommendation; also stops an in-progress one (there is no separate Stop API)."""
139
+ data, _ = _signed_request(region=region, method="DELETE", path=f"/recommendations/{recommendation_id}")
140
+ return data
@@ -0,0 +1,131 @@
1
+ """Incremental AG-UI SSE stream parser (port of ``agui-parser.ts``).
2
+
3
+ Upstream runs a background read loop that fans events out to two async consumers (a typed event
4
+ stream and a text-only stream). This synchronous port keeps the same contract with a lazily-pulled
5
+ shared buffer: whichever consumer runs ahead reads the next chunk from the source, and events are
6
+ pruned once every active consumer has seen them. Consumers may be interleaved freely.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import codecs
12
+ import re
13
+ from collections.abc import Iterable, Iterator
14
+ from dataclasses import dataclass
15
+ from typing import TYPE_CHECKING, Any
16
+
17
+ from agentcore.aws.agui_types import AguiEvent, AguiEventType, parse_agui_event
18
+
19
+ if TYPE_CHECKING:
20
+ from agentcore.aws.agentcore import SSELogger
21
+
22
+ _LINE_SPLIT = re.compile(r"\r?\n")
23
+
24
+
25
+ @dataclass(slots=True)
26
+ class AguiSSEStreams:
27
+ event_stream: Iterator[AguiEvent]
28
+ text_stream: Iterator[str] | None = None
29
+
30
+
31
+ class _SharedEventBuffer:
32
+ def __init__(self, chunks: Iterable[bytes], logger: SSELogger | None, consumers: tuple[str, ...]):
33
+ self._source = iter(chunks)
34
+ self._logger = logger
35
+ self._decoder = codecs.getincrementaldecoder("utf-8")(errors="replace")
36
+ self._line_buffer = ""
37
+ self._events: list[AguiEvent] = []
38
+ self._offset = 0 # absolute index of self._events[0]
39
+ self._cursors = dict.fromkeys(consumers, 0)
40
+ self._done = False
41
+ self._error: BaseException | None = None
42
+
43
+ def _log(self, line: str) -> None:
44
+ if self._logger is not None:
45
+ self._logger.log_sse_event(line)
46
+
47
+ def _finish(self) -> None:
48
+ self._done = True
49
+ close = getattr(self._source, "close", None)
50
+ if close is not None:
51
+ try:
52
+ close()
53
+ except Exception: # noqa: BLE001, S110 - already released
54
+ pass
55
+
56
+ def _pull(self) -> None:
57
+ try:
58
+ chunk = next(self._source)
59
+ except StopIteration:
60
+ if self._line_buffer.strip():
61
+ self._log(self._line_buffer)
62
+ event = parse_agui_event(self._line_buffer)
63
+ if event is not None:
64
+ self._events.append(event)
65
+ self._line_buffer = ""
66
+ self._finish()
67
+ return
68
+ except Exception as exc: # noqa: BLE001 - surfaced to consumers once drained
69
+ self._error = exc
70
+ self._finish()
71
+ return
72
+
73
+ self._line_buffer += self._decoder.decode(chunk)
74
+ lines = _LINE_SPLIT.split(self._line_buffer)
75
+ self._line_buffer = lines.pop()
76
+ for line in lines:
77
+ if line.strip():
78
+ self._log(line)
79
+ event = parse_agui_event(line)
80
+ if event is not None:
81
+ self._events.append(event)
82
+
83
+ def _prune(self) -> None:
84
+ min_cursor = min(self._cursors.values())
85
+ drop = min_cursor - self._offset
86
+ if drop > 0:
87
+ del self._events[:drop]
88
+ self._offset = min_cursor
89
+
90
+ def next_event(self, consumer: str) -> AguiEvent | None:
91
+ """Next event for ``consumer``; ``None`` at end of stream (raises a deferred read error)."""
92
+ while True:
93
+ index = self._cursors[consumer] - self._offset
94
+ if index < len(self._events):
95
+ event = self._events[index]
96
+ self._cursors[consumer] += 1
97
+ self._prune()
98
+ return event
99
+ if self._done:
100
+ if self._error is not None:
101
+ raise self._error
102
+ return None
103
+ self._pull()
104
+
105
+
106
+ def _js_str(value: Any) -> str:
107
+ return "undefined" if value is None else str(value)
108
+
109
+
110
+ def parse_agui_sse_stream(
111
+ reader: Iterable[bytes], logger: SSELogger | None = None, single_consumer: bool = False
112
+ ) -> AguiSSEStreams:
113
+ """Split an SSE byte stream into AG-UI events (and, unless ``single_consumer``, text deltas)."""
114
+ consumers = ("events",) if single_consumer else ("events", "text")
115
+ shared = _SharedEventBuffer(reader, logger, consumers)
116
+
117
+ def event_stream() -> Iterator[AguiEvent]:
118
+ while (event := shared.next_event("events")) is not None:
119
+ yield event
120
+
121
+ def text_stream() -> Iterator[str]:
122
+ while (event := shared.next_event("text")) is not None:
123
+ event_type = event.get("type")
124
+ if event_type in (AguiEventType.TEXT_MESSAGE_CONTENT, AguiEventType.TEXT_MESSAGE_CHUNK):
125
+ delta = event.get("delta")
126
+ if delta:
127
+ yield delta
128
+ elif event_type == AguiEventType.RUN_ERROR:
129
+ yield f"Error: {_js_str(event.get('message'))}"
130
+
131
+ return AguiSSEStreams(event_stream=event_stream(), text_stream=None if single_consumer else text_stream())