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,26 @@
1
+ """Port of operations/dev/load-dev-env.ts."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+
6
+ from agentcore.lib.schemas.io.path_resolver import find_config_root
7
+ from agentcore.lib.utils.env import read_env_file
8
+ from agentcore.operations.dev.gateway_env import get_gateway_env_vars
9
+ from agentcore.operations.dev.memory_env import get_memory_env_vars
10
+ from agentcore.operations.dev.payment_env import get_payment_env_vars
11
+
12
+
13
+ @dataclass
14
+ class DevEnv:
15
+ env_vars: dict[str, str]
16
+ """Deployed-state (gateway + memory + payment) vars first, then .env overrides."""
17
+ deployed_memory_count: int
18
+
19
+
20
+ def load_dev_env(working_dir: str, runtime: Any | None = None) -> DevEnv:
21
+ config_root = find_config_root(working_dir)
22
+ dot_env = read_env_file(config_root) if config_root else {}
23
+ gateway = get_gateway_env_vars()
24
+ memory = get_memory_env_vars()
25
+ payment = get_payment_env_vars(runtime)
26
+ return DevEnv(env_vars={**gateway, **memory, **payment, **dot_env}, deployed_memory_count=len(memory))
@@ -0,0 +1,19 @@
1
+ """Port of operations/dev/memory-env.ts."""
2
+
3
+ from agentcore.lib.schemas.io.config_io import ConfigIO
4
+
5
+
6
+ def get_memory_env_vars() -> dict[str, str]:
7
+ """``MEMORY_<NAME>_ID`` for every deployed memory across all targets."""
8
+ env: dict[str, str] = {}
9
+ try:
10
+ state = ConfigIO().read_deployed_state()
11
+ for target in (state.targets or {}).values():
12
+ resources = target.resources if target else None
13
+ for name, memory in ((resources.memories if resources else None) or {}).items():
14
+ if not memory.memory_id:
15
+ continue
16
+ env[f"MEMORY_{name.upper().replace('-', '_')}_ID"] = memory.memory_id
17
+ except Exception: # noqa: BLE001 - no deployed state: skip, as upstream
18
+ pass
19
+ return env
@@ -0,0 +1,5 @@
1
+ """Local OTLP collector for `agentcore dev` (port of operations/dev/otel)."""
2
+
3
+ from agentcore.operations.dev.otel.collector import OtelCollector, start_otel_collector
4
+
5
+ __all__ = ["OtelCollector", "start_otel_collector"]
@@ -0,0 +1,234 @@
1
+ """Port of operations/dev/otel/collector.ts: in-process OTLP/HTTP receiver for dev mode.
2
+
3
+ Accepts spans (POST /v1/traces) and logs (POST /v1/logs) as OTLP protobuf or JSON, appends them
4
+ to per-trace JSON Lines files under ``<persistDir>/otlp/`` and serves them back flattened. All reads
5
+ go to disk; there is no in-memory store.
6
+ """
7
+
8
+ import json
9
+ import os
10
+ import re
11
+ import threading
12
+ import time
13
+ from collections.abc import Callable
14
+ from datetime import UTC, datetime
15
+ from typing import Any
16
+
17
+ from agentcore.operations.dev._server import Request, Response, js_dumps, make_server
18
+ from agentcore.operations.dev.otel.transforms import build_trace_detail, extract_first_trace_info, extract_trace_meta
19
+ from agentcore.operations.dev.utils import find_available_port
20
+
21
+ DEFAULT_OTLP_PORT = 4318
22
+ OTLP_SUBDIR = "otlp"
23
+ OTLP_EXT = ".otlp.jsonl"
24
+
25
+ OnLog = Callable[[str, str], None]
26
+
27
+
28
+ def _iso(ms: int) -> str:
29
+ dt = datetime.fromtimestamp(ms / 1000, tz=UTC)
30
+ return dt.strftime("%Y-%m-%dT%H:%M:%S.") + f"{dt.microsecond // 1000:03d}Z"
31
+
32
+
33
+ def _decode_protobuf(raw: bytes, kind: str) -> dict[str, Any]:
34
+ """Decode an OTLP protobuf request into the same JSON shape protobufjs' toJSON produces
35
+ (camelCase fields, int64 as strings, enums as names, bytes as base64, defaults omitted)."""
36
+ from google.protobuf.json_format import MessageToDict
37
+
38
+ if kind == "traces":
39
+ from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ExportTraceServiceRequest
40
+
41
+ message: Any = ExportTraceServiceRequest()
42
+ else:
43
+ from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ExportLogsServiceRequest
44
+
45
+ message = ExportLogsServiceRequest()
46
+ message.ParseFromString(raw)
47
+ return MessageToDict(message)
48
+
49
+
50
+ class OtelCollector:
51
+ def __init__(self, on_log: OnLog | None = None, persist_traces_dir: str | None = None):
52
+ self.on_log = on_log
53
+ self.persist_dir = persist_traces_dir
54
+ self.port = 0
55
+ self._server = None
56
+ self._thread: threading.Thread | None = None
57
+
58
+ def _log(self, level: str, message: str) -> None:
59
+ if self.on_log:
60
+ self.on_log(level, message)
61
+
62
+ def start(self, port: int | None = None) -> int:
63
+ """Bind 127.0.0.1 on the first free port from 4318 (or ``port``); returns the port."""
64
+ self.port = port if port is not None else find_available_port(DEFAULT_OTLP_PORT)
65
+ self._server = make_server("127.0.0.1", self.port, self._handle_request)
66
+ self.port = self._server.server_address[1]
67
+ self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
68
+ self._thread.start()
69
+ self._log("info", f"OTEL collector listening on port {self.port}")
70
+ if self.persist_dir:
71
+ self._log("info", f"OTEL trace persistence enabled → {self.persist_dir}")
72
+ return self.port
73
+
74
+ def stop(self) -> None:
75
+ if self._server is not None:
76
+ self._server.shutdown()
77
+ self._server.server_close()
78
+ self._server = None
79
+
80
+ def get_port(self) -> int:
81
+ return self.port
82
+
83
+ # --- queries ----------------------------------------------------------------------------
84
+
85
+ def _otlp_dir(self) -> str | None:
86
+ return os.path.join(self.persist_dir, OTLP_SUBDIR) if self.persist_dir else None
87
+
88
+ def _files(self) -> list[str]:
89
+ otlp_dir = self._otlp_dir()
90
+ if not otlp_dir or not os.path.exists(otlp_dir):
91
+ return []
92
+ return [f for f in os.listdir(otlp_dir) if f.endswith(OTLP_EXT)]
93
+
94
+ def list_traces(
95
+ self, agent_name: str | None, start_time: float | None = None, end_time: float | None = None
96
+ ) -> dict[str, Any]:
97
+ otlp_dir = self._otlp_dir()
98
+ if not otlp_dir or not os.path.exists(otlp_dir):
99
+ return {"success": True, "traces": []}
100
+ now = int(time.time() * 1000)
101
+ start = start_time if start_time is not None else now - 12 * 60 * 60 * 1000
102
+ end = end_time if end_time is not None else now
103
+ traces: list[dict[str, Any]] = []
104
+ for name in self._files():
105
+ try:
106
+ spans, logs = self._read_trace_file(os.path.join(otlp_dir, name))
107
+ meta = extract_trace_meta(spans, logs)
108
+ if not meta["traceId"]:
109
+ continue
110
+ if meta["lastSeen"] < start or meta["firstSeen"] > end:
111
+ continue
112
+ if agent_name and meta["serviceName"] != agent_name:
113
+ continue
114
+ traces.append(
115
+ {
116
+ "traceId": meta["traceId"],
117
+ "timestamp": _iso(meta["lastSeen"]),
118
+ "sessionId": meta["sessionId"],
119
+ "spanCount": str(meta["spanCount"]),
120
+ **build_trace_detail(spans, logs),
121
+ "_sort": meta["lastSeen"],
122
+ }
123
+ )
124
+ except Exception: # noqa: BLE001 - skip malformed files, as upstream
125
+ continue
126
+ traces.sort(key=lambda t: t["_sort"], reverse=True)
127
+ for t in traces:
128
+ del t["_sort"]
129
+ return {"success": True, "traces": traces}
130
+
131
+ def get_trace_spans(self, _agent_name: str | None, trace_id: str) -> dict[str, Any]:
132
+ otlp_dir = self._otlp_dir()
133
+ not_found = {"success": False, "error": f"No trace data found for trace ID: {trace_id}"}
134
+ if not otlp_dir or not os.path.exists(otlp_dir):
135
+ return not_found
136
+ match = next((f for f in self._files() if trace_id in f), None)
137
+ if match is None:
138
+ return not_found
139
+ try:
140
+ spans, logs = self._read_trace_file(os.path.join(otlp_dir, match))
141
+ return {"success": True, **build_trace_detail(spans, logs)}
142
+ except Exception: # noqa: BLE001
143
+ return {"success": False, "error": f"Failed to read trace data for trace ID: {trace_id}"}
144
+
145
+ # --- ingest -----------------------------------------------------------------------------
146
+
147
+ def _handle_request(self, req: Request, res: Response) -> None:
148
+ if req.method == "POST" and req.url in ("/v1/traces", "/v1/logs"):
149
+ kind = "traces" if req.url == "/v1/traces" else "logs"
150
+ try:
151
+ payload = self._decode_payload(req.read_body(), req.header("content-type") or "", kind)
152
+ self._persist_otlp(payload)
153
+ res.write_head(200, {"Content-Type": "application/json"})
154
+ res.end("{}")
155
+ except Exception as err: # noqa: BLE001 - reported as 400, as upstream
156
+ label = "OTEL ingest error" if kind == "traces" else "OTEL log ingest error"
157
+ self._log("warn", f"{label}: {err}")
158
+ res.write_head(400, {"Content-Type": "application/json"})
159
+ error = "Invalid OTLP payload" if kind == "traces" else "Invalid OTLP logs payload"
160
+ res.end(js_dumps({"error": error}))
161
+ return
162
+ if req.method == "GET" and req.url == "/":
163
+ res.write_head(200, {"Content-Type": "application/json"})
164
+ res.end(js_dumps({"status": "ok"}))
165
+ return
166
+ self._log("warn", f"OTEL collector: unhandled {req.method} {req.url}")
167
+ res.write_head(404)
168
+ res.end()
169
+
170
+ def _decode_payload(self, raw: bytes, content_type: str, kind: str) -> dict[str, Any]:
171
+ if "application/json" in content_type:
172
+ parsed = json.loads(raw.decode("utf-8"))
173
+ if not isinstance(parsed, dict):
174
+ raise ValueError("OTLP JSON payload must be an object")
175
+ return parsed
176
+ return _decode_protobuf(raw, kind)
177
+
178
+ def _persist_otlp(self, data: dict[str, Any]) -> None:
179
+ otlp_dir = self._otlp_dir()
180
+ if not otlp_dir:
181
+ return
182
+ try:
183
+ os.makedirs(otlp_dir, exist_ok=True)
184
+ info = extract_first_trace_info(data)
185
+ trace_id = info.get("traceId")
186
+ if not trace_id:
187
+ return
188
+
189
+ def sanitize(val: str) -> str:
190
+ return re.sub(r"[^a-zA-Z0-9_-]", "_", val)
191
+
192
+ prefix = sanitize(info.get("serviceName") or "dev")
193
+ path = os.path.join(otlp_dir, f"{prefix}-{sanitize(trace_id)}{OTLP_EXT}")
194
+ with open(path, "a", encoding="utf-8") as f:
195
+ f.write(js_dumps(data) + "\n")
196
+ except Exception as err: # noqa: BLE001
197
+ self._log("warn", f"Failed to persist OTLP: {err}")
198
+
199
+ def _read_trace_file(self, path: str) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
200
+ spans: list[dict[str, Any]] = []
201
+ logs: list[dict[str, Any]] = []
202
+ with open(path, encoding="utf-8") as f:
203
+ for line in f.read().split("\n"):
204
+ if not line.strip():
205
+ continue
206
+ try:
207
+ entry = json.loads(line)
208
+ except ValueError:
209
+ continue
210
+ if entry.get("resourceSpans"):
211
+ spans.extend(entry["resourceSpans"])
212
+ if entry.get("resourceLogs"):
213
+ logs.extend(entry["resourceLogs"])
214
+ return spans, logs
215
+
216
+
217
+ def start_otel_collector(persist_traces_dir: str) -> tuple[OtelCollector, dict[str, str]]:
218
+ """Start a collector and return it with the OTEL env vars agents need to export to it."""
219
+ collector = OtelCollector(persist_traces_dir=persist_traces_dir)
220
+ port = collector.start()
221
+ env = os.environ
222
+ otel_env_vars = {
223
+ "OTEL_EXPORTER_OTLP_ENDPOINT": env.get("OTEL_EXPORTER_OTLP_ENDPOINT") or f"http://127.0.0.1:{port}",
224
+ "OTEL_EXPORTER_OTLP_PROTOCOL": env.get("OTEL_EXPORTER_OTLP_PROTOCOL") or "http/protobuf",
225
+ "OTEL_METRICS_EXPORTER": env.get("OTEL_METRICS_EXPORTER") or "none",
226
+ "AGENT_OBSERVABILITY_ENABLED": env.get("AGENT_OBSERVABILITY_ENABLED") or "true",
227
+ "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT": env.get(
228
+ "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT"
229
+ )
230
+ or "true",
231
+ "OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED": env.get("OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED")
232
+ or "true",
233
+ }
234
+ return collector, otel_env_vars
@@ -0,0 +1,331 @@
1
+ """Port of operations/dev/otel/transforms.ts: OTLP metadata extraction and frontend shaping."""
2
+
3
+ import base64
4
+ import binascii
5
+ import math
6
+ import re
7
+ import time
8
+ from typing import Any
9
+
10
+ _HEX = re.compile(r"^[0-9a-f]+$", re.IGNORECASE)
11
+
12
+
13
+ def _now_ms() -> int:
14
+ return int(time.time() * 1000)
15
+
16
+
17
+ def _js_number(value: Any) -> float | int | None:
18
+ """``Number(value)`` for OTLP int64 values (strings after the protobuf JSON roundtrip)."""
19
+ if isinstance(value, bool):
20
+ return int(value)
21
+ if isinstance(value, (int, float)):
22
+ return value
23
+ try:
24
+ return int(value)
25
+ except (TypeError, ValueError):
26
+ try:
27
+ number = float(value)
28
+ except (TypeError, ValueError):
29
+ return None
30
+ return None if math.isnan(number) else number
31
+
32
+
33
+ def nano_to_ms(nano: Any) -> int:
34
+ if not nano:
35
+ return 0
36
+ try:
37
+ return int(nano) // 1_000_000
38
+ except (TypeError, ValueError):
39
+ try:
40
+ return math.floor(float(nano) / 1_000_000)
41
+ except (TypeError, ValueError):
42
+ return 0
43
+
44
+
45
+ def hex_from_b64_or_string(val: str | None) -> str:
46
+ """Hex trace/span id from either a hex string or base64 (protobuf JSON roundtrip)."""
47
+ if not val:
48
+ return ""
49
+ if _HEX.match(val) and len(val) in (32, 16):
50
+ return val.lower()
51
+ try:
52
+ cleaned = re.sub(r"[^A-Za-z0-9+/=_-]", "", val).replace("-", "+").replace("_", "/")
53
+ cleaned += "=" * (-len(cleaned) % 4)
54
+ return base64.b64decode(cleaned).hex()
55
+ except (binascii.Error, ValueError):
56
+ return val
57
+
58
+
59
+ def _get_attr_value(attrs: Any, key: str) -> str | None:
60
+ if not attrs:
61
+ return None
62
+ if isinstance(attrs, list):
63
+ attr = next((a for a in attrs if isinstance(a, dict) and a.get("key") == key), None)
64
+ value = (attr or {}).get("value")
65
+ if not value:
66
+ return None
67
+ if value.get("stringValue") is not None:
68
+ return value["stringValue"]
69
+ return str(value["intValue"]) if value.get("intValue") is not None else None
70
+ val = attrs.get(key) if isinstance(attrs, dict) else None
71
+ return val if isinstance(val, str) else None
72
+
73
+
74
+ def _get_resource_attribute(resource: Any, key: str) -> str | None:
75
+ return _get_attr_value((resource or {}).get("attributes"), key)
76
+
77
+
78
+ def extract_trace_meta(resource_spans: list[dict[str, Any]], resource_logs: list[dict[str, Any]]) -> dict[str, Any]:
79
+ """traceId, firstSeen/lastSeen (ms), sessionId, serviceName and span/log count."""
80
+ trace_id: str | None = None
81
+ first_seen = math.inf
82
+ last_seen = 0
83
+ session_id: str | None = None
84
+ service_name: str | None = None
85
+ span_count = 0
86
+
87
+ for rs in resource_spans:
88
+ if service_name is None:
89
+ service_name = _get_resource_attribute(rs.get("resource"), "service.name")
90
+ for ss in rs.get("scopeSpans") or []:
91
+ for span in ss.get("spans") or []:
92
+ span_count += 1
93
+ if trace_id is None:
94
+ trace_id = hex_from_b64_or_string(span.get("traceId")) or None
95
+ start_ms = nano_to_ms(span.get("startTimeUnixNano"))
96
+ end_ms = nano_to_ms(span.get("endTimeUnixNano"))
97
+ if start_ms and start_ms < first_seen:
98
+ first_seen = start_ms
99
+ if end_ms and end_ms > last_seen:
100
+ last_seen = end_ms
101
+ if not session_id:
102
+ attrs = span.get("attributes")
103
+ session_id = _get_attr_value(attrs, "session.id") or _get_attr_value(attrs, "attributes.session.id")
104
+
105
+ for rl in resource_logs:
106
+ if service_name is None:
107
+ service_name = _get_resource_attribute(rl.get("resource"), "service.name")
108
+ for sl in rl.get("scopeLogs") or []:
109
+ for lr in sl.get("logRecords") or []:
110
+ span_count += 1
111
+ if trace_id is None:
112
+ trace_id = hex_from_b64_or_string(lr.get("traceId")) or None
113
+ t = nano_to_ms(lr.get("timeUnixNano")) or nano_to_ms(lr.get("observedTimeUnixNano"))
114
+ if t and t < first_seen:
115
+ first_seen = t
116
+ if t and t > last_seen:
117
+ last_seen = t
118
+
119
+ now = _now_ms()
120
+ if first_seen == math.inf:
121
+ first_seen = now
122
+ if last_seen == 0:
123
+ last_seen = now
124
+ return {
125
+ "traceId": trace_id,
126
+ "firstSeen": int(first_seen),
127
+ "lastSeen": last_seen,
128
+ "sessionId": session_id,
129
+ "serviceName": service_name,
130
+ "spanCount": span_count,
131
+ }
132
+
133
+
134
+ def extract_first_trace_info(data: dict[str, Any]) -> dict[str, str | None]:
135
+ for rs in data.get("resourceSpans") or []:
136
+ svc = _get_resource_attribute(rs.get("resource"), "service.name")
137
+ for ss in rs.get("scopeSpans") or []:
138
+ for span in ss.get("spans") or []:
139
+ if span.get("traceId"):
140
+ return {"traceId": hex_from_b64_or_string(span["traceId"]), "serviceName": svc}
141
+ for rl in data.get("resourceLogs") or []:
142
+ svc = _get_resource_attribute(rl.get("resource"), "service.name")
143
+ for sl in rl.get("scopeLogs") or []:
144
+ for lr in sl.get("logRecords") or []:
145
+ if lr.get("traceId"):
146
+ return {"traceId": hex_from_b64_or_string(lr["traceId"]), "serviceName": svc}
147
+ return {}
148
+
149
+
150
+ _SPAN_KINDS = {
151
+ "SPAN_KIND_INTERNAL": 1,
152
+ "SPAN_KIND_SERVER": 2,
153
+ "SPAN_KIND_CLIENT": 3,
154
+ "SPAN_KIND_PRODUCER": 4,
155
+ "SPAN_KIND_CONSUMER": 5,
156
+ }
157
+
158
+
159
+ def _normalize_span_kind(kind: Any) -> int:
160
+ if isinstance(kind, bool):
161
+ return 0
162
+ if isinstance(kind, (int, float)):
163
+ return int(kind)
164
+ if isinstance(kind, str):
165
+ return _SPAN_KINDS.get(kind, 0)
166
+ return 0
167
+
168
+
169
+ def is_meaningful_span(span: dict[str, Any]) -> bool:
170
+ """Drop ASGI/HTTP transport noise; keep GenAI, RPC, framework and tool spans."""
171
+ name = span.get("name") or ""
172
+ attrs = span.get("attributes") or {}
173
+ kind = _normalize_span_kind(span.get("kind"))
174
+ if name.endswith(" http send") or name.endswith(" http receive"):
175
+ return False
176
+ if attrs.get("asgi.event.type"):
177
+ return False
178
+ if any(k.startswith("gen_ai.") for k in attrs):
179
+ return True
180
+ if attrs.get("rpc.system") or attrs.get("rpc.method"):
181
+ return True
182
+ if any(h in name.lower() for h in ("strands", "bedrock", "langchain", "crewai", "autogen", "google_adk")):
183
+ return True
184
+ if name in ("tool_use", "tool_call") or attrs.get("tool.name"):
185
+ return True
186
+ if kind == 3 and (name in ("POST", "GET") or name.startswith("HTTP ")):
187
+ return False
188
+ if kind == 2 and name.startswith("POST /") and attrs.get("http.method"):
189
+ return False
190
+ return True
191
+
192
+
193
+ def _scalar(v: dict[str, Any]) -> Any:
194
+ for key in ("stringValue", "intValue", "doubleValue", "boolValue"):
195
+ if v.get(key) is not None:
196
+ return v[key]
197
+ return None
198
+
199
+
200
+ def flatten_attributes(attrs: Any) -> dict[str, Any] | None:
201
+ """OTLP key/value arrays → plain dict (already-flat dicts pass through)."""
202
+ if not attrs:
203
+ return None
204
+ if not isinstance(attrs, list):
205
+ return attrs
206
+ result: dict[str, Any] = {}
207
+ for attr in attrs:
208
+ value = attr.get("value")
209
+ if not value:
210
+ continue
211
+ key = attr.get("key")
212
+ if "stringValue" in value:
213
+ result[key] = value["stringValue"]
214
+ elif "intValue" in value:
215
+ result[key] = _js_number(value["intValue"])
216
+ elif "doubleValue" in value:
217
+ result[key] = value["doubleValue"]
218
+ elif "boolValue" in value:
219
+ result[key] = value["boolValue"]
220
+ elif (value.get("arrayValue") or {}).get("values"):
221
+ result[key] = [_scalar(v) for v in value["arrayValue"]["values"]]
222
+ return result
223
+
224
+
225
+ def extract_any_value(val: Any) -> Any:
226
+ if not val or not isinstance(val, dict):
227
+ return val
228
+ if "stringValue" in val:
229
+ return val["stringValue"]
230
+ if "intValue" in val:
231
+ return _js_number(val["intValue"])
232
+ if "doubleValue" in val:
233
+ return val["doubleValue"]
234
+ if "boolValue" in val:
235
+ return val["boolValue"]
236
+ if isinstance(val.get("arrayValue"), dict):
237
+ return [extract_any_value(v) for v in val["arrayValue"].get("values") or []]
238
+ if isinstance(val.get("kvlistValue"), dict):
239
+ return {
240
+ kv.get("key"): extract_any_value(kv["value"]) if kv.get("value") else None
241
+ for kv in val["kvlistValue"].get("values") or []
242
+ }
243
+ return val
244
+
245
+
246
+ def _drop_none(d: dict[str, Any]) -> dict[str, Any]:
247
+ """Mimic JSON.stringify dropping ``undefined`` properties."""
248
+ return {k: v for k, v in d.items() if v is not None}
249
+
250
+
251
+ def build_trace_detail(
252
+ resource_spans: list[dict[str, Any]], resource_logs: list[dict[str, Any]]
253
+ ) -> dict[str, list[Any]]:
254
+ """Frontend-ready detail: flattened attributes, hex ids, noise spans filtered, log bodies unwrapped."""
255
+ filtered_spans = []
256
+ for rs in resource_spans:
257
+ resource = rs.get("resource")
258
+ scope_spans = []
259
+ for ss in rs.get("scopeSpans") or []:
260
+ spans = [
261
+ _drop_none(
262
+ {
263
+ **span,
264
+ "traceId": hex_from_b64_or_string(span.get("traceId")),
265
+ "spanId": hex_from_b64_or_string(span.get("spanId")),
266
+ "parentSpanId": hex_from_b64_or_string(span.get("parentSpanId")),
267
+ "attributes": flatten_attributes(span.get("attributes")),
268
+ }
269
+ )
270
+ for span in ss.get("spans") or []
271
+ ]
272
+ spans = [s for s in spans if is_meaningful_span(s)]
273
+ if spans:
274
+ scope_spans.append(_drop_none({"scope": ss.get("scope"), "spans": spans}))
275
+ if scope_spans:
276
+ filtered_spans.append(
277
+ _drop_none(
278
+ {
279
+ "resource": _drop_none({"attributes": flatten_attributes(resource.get("attributes"))})
280
+ if resource
281
+ else None,
282
+ "scopeSpans": scope_spans,
283
+ }
284
+ )
285
+ )
286
+
287
+ flattened_logs = []
288
+ for rl in resource_logs:
289
+ resource = rl.get("resource")
290
+ scope_logs_raw = rl.get("scopeLogs")
291
+ if not scope_logs_raw:
292
+ continue
293
+ scope_logs = [
294
+ _drop_none(
295
+ {
296
+ "scope": sl.get("scope"),
297
+ "logRecords": [
298
+ _drop_none(
299
+ {
300
+ **lr,
301
+ "traceId": hex_from_b64_or_string(lr.get("traceId")),
302
+ "spanId": hex_from_b64_or_string(lr.get("spanId")),
303
+ "body": extract_any_value(lr["body"]) if lr.get("body") else None,
304
+ "attributes": flatten_attributes(lr.get("attributes")),
305
+ }
306
+ )
307
+ for lr in sl.get("logRecords") or []
308
+ ]
309
+ if sl.get("logRecords") is not None
310
+ else None,
311
+ }
312
+ )
313
+ for sl in scope_logs_raw
314
+ ]
315
+ flattened_logs.append(
316
+ _drop_none(
317
+ {
318
+ "resource": _drop_none({"attributes": flatten_attributes(resource.get("attributes"))})
319
+ if resource
320
+ else None,
321
+ "scopeLogs": scope_logs,
322
+ }
323
+ )
324
+ )
325
+
326
+ return _drop_none(
327
+ {
328
+ "resourceSpans": filtered_spans or None,
329
+ "resourceLogs": flattened_logs or None,
330
+ }
331
+ )
@@ -0,0 +1,50 @@
1
+ """Port of operations/dev/payment-env.ts (+ primitives/payment-eligible.ts)."""
2
+
3
+ from typing import Any
4
+
5
+ from agentcore.lib.schemas.io.config_io import ConfigIO
6
+
7
+
8
+ def is_payment_eligible_runtime(runtime: Any) -> bool:
9
+ """Payments only ship a shim for Python HTTP (Strands) runtimes; be conservative otherwise."""
10
+ protocol = getattr(runtime, "protocol", None)
11
+ if protocol and protocol != "HTTP":
12
+ return False
13
+ entrypoint = runtime.entrypoint if isinstance(getattr(runtime, "entrypoint", None), str) else ""
14
+ return entrypoint.split(":")[0].endswith(".py")
15
+
16
+
17
+ def _js_bool(value: Any) -> str:
18
+ return ("true" if value else "false") if isinstance(value, bool) else str(value)
19
+
20
+
21
+ def get_payment_env_vars(runtime: Any | None = None) -> dict[str, str]:
22
+ """Dev-mode payment env vars from deployed-state.json (mirrors the CDK stack's injection)."""
23
+ if runtime is not None and not is_payment_eligible_runtime(runtime):
24
+ return {}
25
+ env: dict[str, str] = {}
26
+ try:
27
+ state = ConfigIO().read_deployed_state()
28
+ for target in (state.targets or {}).values():
29
+ resources = target.resources if target else None
30
+ for name, payment in ((resources.payments if resources else None) or {}).items():
31
+ if not payment.manager_arn:
32
+ continue
33
+ s = name.upper().replace("-", "_")
34
+ env[f"AGENTCORE_PAYMENT_{s}_MANAGER_ARN"] = payment.manager_arn
35
+ if payment.process_payment_role_arn:
36
+ env[f"AGENTCORE_PAYMENT_{s}_PROCESS_PAYMENT_ROLE_ARN"] = payment.process_payment_role_arn
37
+ connectors = list((payment.connectors or {}).values())
38
+ if connectors:
39
+ env[f"AGENTCORE_PAYMENT_{s}_CONNECTOR_ID"] = connectors[0].connector_id
40
+ if payment.auto_payment is not None:
41
+ env[f"AGENTCORE_PAYMENT_{s}_AUTO_PAYMENT"] = _js_bool(payment.auto_payment)
42
+ if payment.payment_tool_allowlist:
43
+ env[f"AGENTCORE_PAYMENT_{s}_TOOL_ALLOWLIST"] = ",".join(payment.payment_tool_allowlist)
44
+ if payment.network_preferences:
45
+ env[f"AGENTCORE_PAYMENT_{s}_NETWORK_PREFERENCES"] = ",".join(payment.network_preferences)
46
+ if payment.authorizer_type == "CUSTOM_JWT":
47
+ env[f"AGENTCORE_PAYMENT_{s}_AUTH_MODE"] = "bearer"
48
+ except Exception: # noqa: BLE001 - no deployed state: skip, as upstream
49
+ pass
50
+ return env