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,93 @@
1
+ """Fetch OTEL span + log records for one session (port of recommendation/fetch-session-spans.ts).
2
+
3
+ Tool description recommendations need inline ``sessionSpans``: span records from ``aws/spans`` plus
4
+ log records (body.input/output.messages) from the runtime log group.
5
+ """
6
+
7
+ import json
8
+ import time
9
+ from collections.abc import Callable
10
+ from concurrent.futures import ThreadPoolExecutor
11
+ from typing import Any
12
+
13
+ from agentcore.aws import cloudwatch
14
+ from agentcore.aws._aws_errors import aws_error_name
15
+
16
+ SPANS_LOG_GROUP = "aws/spans"
17
+
18
+
19
+ def _collect_log_events(**options: Any) -> list[dict[str, Any]]:
20
+ try:
21
+ return list(cloudwatch.search_logs(**options))
22
+ except Exception as exc:
23
+ message = str(exc)
24
+ if (
25
+ aws_error_name(exc) == "ResourceNotFoundException"
26
+ or "ResourceNotFoundException" in message
27
+ or "does not exist" in message
28
+ ):
29
+ return []
30
+ raise
31
+
32
+
33
+ def _matches_session(record: dict[str, Any], session_id: str) -> bool:
34
+ attrs = record.get("attributes")
35
+ if isinstance(attrs, dict) and attrs.get("session.id") == session_id:
36
+ return True
37
+ body = record.get("body")
38
+ if body:
39
+ return session_id in json.dumps(body, separators=(",", ":"), ensure_ascii=False)
40
+ return False
41
+
42
+
43
+ def fetch_session_spans(
44
+ *,
45
+ region: str,
46
+ runtime_id: str,
47
+ session_id: str,
48
+ lookback_days: int = 7,
49
+ on_progress: Callable[[str], None] | None = None,
50
+ ) -> dict[str, Any]:
51
+ """{"spans": [...], "spanRecordCount": n, "logRecordCount": m}"""
52
+ progress = on_progress or (lambda _m: None)
53
+ runtime_group = cloudwatch.runtime_log_group(runtime_id)
54
+ end_ms = int(time.time() * 1000)
55
+ start_ms = end_ms - lookback_days * 24 * 60 * 60 * 1000
56
+ session_filter = f'"session.id" "{session_id}"'
57
+ common = {"region": region, "start_time_ms": start_ms, "end_time_ms": end_ms}
58
+
59
+ progress("Fetching span records from aws/spans and runtime log group...")
60
+ with ThreadPoolExecutor(max_workers=3) as pool:
61
+ shared_f = pool.submit(
62
+ _collect_log_events, log_group_name=SPANS_LOG_GROUP, filter_pattern=session_filter, **common
63
+ )
64
+ runtime_f = pool.submit(
65
+ _collect_log_events, log_group_name=runtime_group, filter_pattern=session_filter, **common
66
+ )
67
+ logs_f = pool.submit(
68
+ _collect_log_events, log_group_name=runtime_group, filter_pattern='"body" "input"', **common
69
+ )
70
+ span_records = shared_f.result() + runtime_f.result()
71
+ log_records = logs_f.result()
72
+
73
+ progress(f"Found {len(span_records)} span records, {len(log_records)} log record candidates")
74
+
75
+ spans: list[Any] = []
76
+ for event in span_records:
77
+ try:
78
+ spans.append(json.loads(event["message"]))
79
+ except ValueError:
80
+ continue
81
+
82
+ log_count = 0
83
+ for event in log_records:
84
+ try:
85
+ parsed = json.loads(event["message"])
86
+ except ValueError:
87
+ continue
88
+ if isinstance(parsed, dict) and _matches_session(parsed, session_id):
89
+ spans.append(parsed)
90
+ log_count += 1
91
+
92
+ progress(f"Combined {len(spans)} spans ({len(spans) - log_count} span records + {log_count} log records)")
93
+ return {"spans": spans, "spanRecordCount": len(spans) - log_count, "logRecordCount": log_count}
@@ -0,0 +1,77 @@
1
+ """Presentation helpers for recommendation jobs (port of operations/jobs/recommendation/format.ts)."""
2
+
3
+ from typing import Any
4
+
5
+ import typer
6
+
7
+ from agentcore.operations.jobs.shared.format import format_job_date
8
+
9
+
10
+ def short_type(rec_type: str | None) -> str:
11
+ if rec_type == "SYSTEM_PROMPT_RECOMMENDATION":
12
+ return "System Prompt"
13
+ if rec_type == "TOOL_DESCRIPTION_RECOMMENDATION":
14
+ return "Tool Description"
15
+ return str(rec_type)
16
+
17
+
18
+ def print_recommendation_history(records: list[dict[str, Any]]) -> None:
19
+ if not records:
20
+ typer.echo("No recommendation jobs found. Run `agentcore run recommendation` to create one.")
21
+ return
22
+ typer.echo(f"\n{'Date'.ljust(22)} {'Status'.ljust(14)} {'Type'.ljust(18)} {'Agent'.ljust(18)} ID")
23
+ typer.echo("─" * 100)
24
+ for r in records:
25
+ agent = r.get("agent")
26
+ typer.echo(
27
+ f"{format_job_date(r.get('createdAt')).ljust(22)} {str(r.get('status')).ljust(14)} "
28
+ f"{short_type(r.get('recommendationType')).ljust(18)} "
29
+ f"{(agent if agent is not None else 'unknown').ljust(18)} {r['id']}"
30
+ )
31
+ typer.echo("")
32
+
33
+
34
+ def failure_text(record: dict[str, Any]) -> str:
35
+ if record.get("failureDetail") is not None:
36
+ return record["failureDetail"]
37
+ if record.get("statusReasons") is not None:
38
+ return "; ".join(record["statusReasons"])
39
+ return "unknown"
40
+
41
+
42
+ def print_recommendation_detail(record: dict[str, Any]) -> None:
43
+ typer.echo(f"\nRecommendation: {record['id']}")
44
+ typer.echo(f"Status: {record.get('status')}")
45
+ typer.echo(f"Agent: {record.get('agent')}")
46
+ typer.echo(f"Type: {short_type(record.get('recommendationType'))}")
47
+ typer.echo(f"Evaluators: {', '.join(record.get('evaluators') or []) or '(none)'}")
48
+ typer.echo(f"Started: {format_job_date(record.get('createdAt'))}")
49
+ if record.get("completedAt"):
50
+ typer.echo(f"Completed: {format_job_date(record['completedAt'])}")
51
+ if record.get("kmsKeyArn"):
52
+ typer.echo(f"KMS Key: {record['kmsKeyArn']}")
53
+
54
+ result = record.get("result") or {}
55
+ sys_result = result.get("systemPromptRecommendationResult") or {}
56
+ tool_result = result.get("toolDescriptionRecommendationResult") or {}
57
+ if sys_result.get("recommendedSystemPrompt"):
58
+ typer.echo("\n+++ Recommended System Prompt +++")
59
+ typer.echo(sys_result["recommendedSystemPrompt"])
60
+ if sys_result.get("explanation"):
61
+ typer.echo("\n--- Explanation ---")
62
+ typer.echo(sys_result["explanation"])
63
+ elif tool_result.get("tools"):
64
+ for t in tool_result["tools"]:
65
+ typer.echo(f"\nTool: {t.get('toolName')}")
66
+ typer.echo(f"Recommended: {t.get('recommendedToolDescription')}")
67
+ if t.get("explanation"):
68
+ typer.echo(f"Explanation: {t['explanation']}")
69
+ elif record.get("status") == "FAILED":
70
+ typer.echo(f"\nError: {failure_text(record)}")
71
+ else:
72
+ typer.echo("\nResult not yet available.")
73
+ if record.get("syncedVersionId"):
74
+ typer.echo(f"\nNew config bundle version {record['syncedVersionId']} applied to agentcore.json.")
75
+ if record.get("logFilePath"):
76
+ typer.echo(f"\nLog: {record['logFilePath']}")
77
+ typer.echo("")
@@ -0,0 +1,331 @@
1
+ """Recommendation job handler (port of operations/jobs/recommendation/handler.ts).
2
+
3
+ - create(): resolve agent + evaluator(s), build the recommendationConfig, ONE StartRecommendation.
4
+ - refresh(): GET latest status (404 -> NOT_FOUND); copy result / failure detail.
5
+ - settle(): once COMPLETED for a config-bundle input, sync the new bundle version into
6
+ agentcore.json exactly once (``syncedVersionId``).
7
+ - archive(): DeleteRecommendation (recommendations have no Stop).
8
+ """
9
+
10
+ import re
11
+ import time
12
+ from typing import Any
13
+
14
+ from agentcore.aws import agentcore_recommendation as api
15
+ from agentcore.lib import ConfigIO, JobNotFoundError, ResourceNotFoundError, ValidationError
16
+ from agentcore.lib.errors.types import to_error
17
+ from agentcore.lib.result import Err, Ok
18
+ from agentcore.lib.schemas.io.config_io import to_jsonable
19
+ from agentcore.lib.utils.json_format import to_json_string
20
+ from agentcore.operations.jobs.batch_evaluation.handler import new_logger
21
+ from agentcore.operations.jobs.recommendation import apply_to_bundle as _apply
22
+ from agentcore.operations.jobs.recommendation import build_config as _build
23
+ from agentcore.operations.jobs.shared.constants import (
24
+ MAX_INLINE_TEXT_LENGTH,
25
+ NOT_FOUND_STATUS,
26
+ RECOMMENDATION_NAME_REGEX,
27
+ TERMINAL_STATUSES,
28
+ )
29
+ from agentcore.operations.jobs.shared.format import iso_now
30
+ from agentcore.operations.jobs.shared.region import region_of, resolve_job_region
31
+ from agentcore.operations.jobs.shared.resolve_agent_state import deployed_dict, resolve_agent_state
32
+ from agentcore.operations.jobs.shared.storage import drop_undefined
33
+
34
+ MAX_RECOMMENDATION_NAME_LENGTH = 48
35
+
36
+
37
+ def auto_recommendation_name(project_name: str, agent: str | None, now: int | None = None) -> str:
38
+ """``<project>_<agent>_<timestamp>`` sanitized/truncated to satisfy RECOMMENDATION_NAME_REGEX."""
39
+ suffix = str(now if now is not None else int(time.time() * 1000))
40
+ max_prefix = MAX_RECOMMENDATION_NAME_LENGTH - len(suffix) - 1
41
+ raw = f"{project_name}_{agent}" if agent else project_name
42
+ prefix = re.sub(r"[^a-zA-Z0-9_-]", "_", raw)[: max(1, max_prefix)]
43
+ if not re.match(r"^[a-zA-Z]", prefix):
44
+ prefix = f"r{prefix}"[: max(1, max_prefix)]
45
+ return f"{prefix}_{suffix}"
46
+
47
+
48
+ def _fail(logger: Any, err: BaseException, end_step: bool = True) -> Err:
49
+ if logger:
50
+ if end_step:
51
+ logger.end_step("error", str(err))
52
+ logger.finalize(False)
53
+ return Err(err)
54
+
55
+
56
+ def create(opts: dict[str, Any], config_io: ConfigIO) -> Ok | Err:
57
+ logger = new_logger("recommend")
58
+ try:
59
+ if logger:
60
+ logger.start_step("Load project config")
61
+ project = to_jsonable(config_io.read_project_spec())
62
+ deployed_state = deployed_dict(config_io.read_deployed_state())
63
+ aws_targets = config_io.resolve_aws_deployment_targets()
64
+ region = resolve_job_region(opts.get("region"), aws_targets)
65
+ if logger:
66
+ logger.log(f"Region: {region}")
67
+ logger.end_step("success")
68
+ logger.start_step("Resolve agent and evaluators")
69
+
70
+ agent = opts.get("agent")
71
+ trace_source = opts["traceSource"]
72
+ agent_state = resolve_agent_state(deployed_state, agent) if agent else None
73
+ source_needs_no_agent = trace_source in ("batch-evaluation", "online-evaluation")
74
+ if not agent_state and not source_needs_no_agent:
75
+ return _fail(logger, ResourceNotFoundError(f'Agent "{agent}" not deployed. Run `agentcore deploy` first.'))
76
+
77
+ evaluator_ids: list[str] = []
78
+ for evaluator in opts.get("evaluators") or []:
79
+ resolved = _build.resolve_evaluator_id(deployed_state, evaluator, region)
80
+ if not resolved:
81
+ return _fail(
82
+ logger,
83
+ ResourceNotFoundError(
84
+ f'Evaluator "{evaluator}" not found. Use a Builtin.* name, a full ARN, or deploy a custom '
85
+ "evaluator first."
86
+ ),
87
+ )
88
+ evaluator_ids.append(resolved)
89
+ rec_type = opts["type"]
90
+ if rec_type == "SYSTEM_PROMPT_RECOMMENDATION":
91
+ too_few = not source_needs_no_agent and len(evaluator_ids) != 1
92
+ too_many = len(evaluator_ids) > 1
93
+ if too_few or too_many:
94
+ return _fail(
95
+ logger,
96
+ ValidationError(
97
+ "System prompt recommendations accept at most one evaluator."
98
+ if too_many
99
+ else "System prompt recommendations require exactly one evaluator."
100
+ ),
101
+ )
102
+ if logger:
103
+ logger.log(f"Evaluators: {', '.join(evaluator_ids) or '(none)'}")
104
+ logger.end_step("success")
105
+
106
+ input_source = opts["inputSource"]
107
+ inline_content: str | None = None
108
+ if input_source == "file" and opts.get("promptFile"):
109
+ with open(opts["promptFile"], encoding="utf-8") as fh:
110
+ inline_content = fh.read()
111
+ elif input_source == "inline":
112
+ inline_content = opts.get("inlineContent")
113
+ if (
114
+ rec_type == "SYSTEM_PROMPT_RECOMMENDATION"
115
+ and input_source != "config-bundle"
116
+ and not (inline_content or "").strip()
117
+ ):
118
+ return _fail(
119
+ logger,
120
+ ValidationError(
121
+ "System prompt content is required. Provide via --inline, --prompt-file, or --bundle-name."
122
+ ),
123
+ end_step=False,
124
+ )
125
+ if inline_content and len(inline_content) > MAX_INLINE_TEXT_LENGTH:
126
+ return _fail(
127
+ logger,
128
+ ValidationError(
129
+ f"Inline text exceeds the maximum allowed length ({len(inline_content)} characters, limit is "
130
+ f"{MAX_INLINE_TEXT_LENGTH})."
131
+ ),
132
+ end_step=False,
133
+ )
134
+
135
+ account_id = _build.extract_account_id_from_arn(agent_state["runtimeArn"]) if agent_state else ""
136
+
137
+ bundle_name = opts.get("bundleName")
138
+ bundle_arn: str | None = None
139
+ bundle_version = opts.get("bundleVersion")
140
+ prompt_path = opts.get("systemPromptJsonPath")
141
+ if input_source == "config-bundle" and bundle_name:
142
+ if bundle_name.startswith("arn:"):
143
+ bundle_arn = bundle_name
144
+ else:
145
+ for target in (deployed_state.get("targets") or {}).values():
146
+ bundle = ((((target or {}).get("resources")) or {}).get("configBundles") or {}).get(bundle_name)
147
+ if bundle and bundle.get("bundleArn"):
148
+ bundle_arn = bundle["bundleArn"]
149
+ break
150
+ if not bundle_arn:
151
+ return _fail(
152
+ logger,
153
+ ResourceNotFoundError(
154
+ f'Config bundle "{bundle_name}" not found in deployed state. Run `agentcore deploy` first.'
155
+ ),
156
+ end_step=False,
157
+ )
158
+ if bundle_version == "LATEST" and bundle_arn:
159
+ version_id = _build.resolve_bundle_version_id(bundle_arn, bundle_version, deployed_state)
160
+ if not version_id:
161
+ return _fail(
162
+ logger,
163
+ ResourceNotFoundError(
164
+ f'Could not resolve version "LATEST" for config bundle "{bundle_name}". '
165
+ "Run `agentcore deploy` first, or pass an explicit version UUID."
166
+ ),
167
+ end_step=False,
168
+ )
169
+ bundle_version = version_id
170
+ if prompt_path and not prompt_path.startswith("$"):
171
+ local_name = bundle_name
172
+ if bundle_name.startswith("arn:"):
173
+ local_name = next(
174
+ (
175
+ n
176
+ for t in (deployed_state.get("targets") or {}).values()
177
+ for n, b in ((((t or {}).get("resources")) or {}).get("configBundles") or {}).items()
178
+ if b.get("bundleArn") == bundle_name
179
+ ),
180
+ None,
181
+ )
182
+ if local_name:
183
+ proj_bundle = next(
184
+ (b for b in project.get("configBundles") or [] if b.get("name") == local_name), None
185
+ )
186
+ components = (proj_bundle or {}).get("components")
187
+ if components:
188
+ first_key = next(iter(components), None)
189
+ if first_key:
190
+ resolved_key = _build.resolve_component_key_for_json_path(first_key, deployed_state)
191
+ prompt_path = f"$.{resolved_key}.configuration.{prompt_path}"
192
+
193
+ config = _build.build_recommendation_config(
194
+ type=rec_type,
195
+ inline_content=inline_content,
196
+ bundle_arn=bundle_arn,
197
+ bundle_version=bundle_version,
198
+ system_prompt_json_path=prompt_path,
199
+ tool_desc_json_paths=opts.get("toolDescJsonPaths"),
200
+ input_source=input_source,
201
+ tools=opts.get("tools"),
202
+ trace_source=trace_source,
203
+ lookback_days=opts.get("lookbackDays"),
204
+ session_ids=opts.get("sessionIds"),
205
+ spans_file=opts.get("spansFile"),
206
+ from_insights=opts.get("fromInsights"),
207
+ batch_evaluation_arn=opts.get("batchEvaluationArn"),
208
+ online_evaluation_arn=opts.get("onlineEvaluationArn"),
209
+ runtime_id=(agent_state or {}).get("runtimeId", ""),
210
+ account_id=account_id,
211
+ region=region,
212
+ evaluator_ids=evaluator_ids,
213
+ on_progress=opts.get("onProgress"),
214
+ logger=logger,
215
+ )
216
+
217
+ if logger:
218
+ logger.start_step("Start recommendation")
219
+ explicit_name = opts.get("recommendationName")
220
+ name = explicit_name if explicit_name is not None else auto_recommendation_name(project["name"], agent)
221
+ if explicit_name and not RECOMMENDATION_NAME_REGEX.match(explicit_name):
222
+ return _fail(
223
+ logger,
224
+ ValidationError(
225
+ f'Recommendation name "{explicit_name}" is invalid. Must begin with a letter and contain only '
226
+ "alphanumeric characters, underscores, or hyphens (max 48 chars)."
227
+ ),
228
+ )
229
+ on_progress = opts.get("onProgress")
230
+ if on_progress:
231
+ on_progress("starting", f'Starting recommendation "{name}"...')
232
+ start = api.start_recommendation(
233
+ region=region,
234
+ name=name,
235
+ type=rec_type,
236
+ recommendation_config=config,
237
+ kms_key_arn=opts.get("kmsKeyArn") or None,
238
+ )
239
+ if logger:
240
+ logger.log(f"Response: {to_json_string(start)}")
241
+ logger.end_step("success")
242
+ if on_progress:
243
+ on_progress("started", f"Recommendation created: {start['recommendationId']} ({start['status']})")
244
+ if logger:
245
+ logger.finalize(True)
246
+
247
+ record: dict[str, Any] = {
248
+ "type": "recommendation",
249
+ "id": start["recommendationId"],
250
+ "arn": start["recommendationArn"],
251
+ "status": start["status"],
252
+ "createdAt": start.get("createdAt") or iso_now(),
253
+ "agent": agent or "",
254
+ "logFilePath": logger.log_file_path if logger else None,
255
+ "recommendationType": rec_type,
256
+ "evaluators": opts.get("evaluators") or [],
257
+ "inputSource": input_source,
258
+ "bundleName": bundle_name,
259
+ "bundleArn": bundle_arn,
260
+ "bundleVersion": bundle_version,
261
+ "systemPromptJsonPath": prompt_path,
262
+ "toolDescJsonPaths": opts.get("toolDescJsonPaths"),
263
+ }
264
+ if opts.get("kmsKeyArn"):
265
+ record["kmsKeyArn"] = opts["kmsKeyArn"]
266
+ return Ok(drop_undefined(record))
267
+ except Exception as exc: # noqa: BLE001
268
+ if logger:
269
+ logger.finalize(False)
270
+ return Err(to_error(exc))
271
+
272
+
273
+ def refresh(record: dict[str, Any]) -> Ok | Err:
274
+ region = region_of(record["arn"])
275
+ try:
276
+ response = api.get_recommendation(region=region, recommendation_id=record["id"])
277
+ except JobNotFoundError:
278
+ return Ok({**record, "status": NOT_FOUND_STATUS})
279
+ except Exception as exc: # noqa: BLE001
280
+ return Err(to_error(exc))
281
+
282
+ status = response["status"]
283
+ failure = (
284
+ _build.extract_failure_details(response.get("statusReasons"), response.get("recommendationResult"))
285
+ if status == "FAILED"
286
+ else None
287
+ )
288
+ terminal = status in TERMINAL_STATUSES["recommendation"]
289
+ completed_at = (
290
+ (response.get("completedAt") or response.get("updatedAt") or record.get("completedAt")) if terminal else None
291
+ )
292
+ updated = {
293
+ **record,
294
+ "status": status,
295
+ "completedAt": completed_at,
296
+ "result": response.get("recommendationResult") or record.get("result"),
297
+ "statusReasons": response.get("statusReasons") or record.get("statusReasons"),
298
+ "failureDetail": failure or record.get("failureDetail"),
299
+ }
300
+ return Ok(drop_undefined(updated))
301
+
302
+
303
+ def settle(record: dict[str, Any], config_io: ConfigIO) -> dict[str, Any]:
304
+ if record.get("inputSource") != "config-bundle" or record.get("status") != "COMPLETED" or not record.get("result"):
305
+ return record
306
+ result = record["result"]
307
+ result_bundle = (result.get("systemPromptRecommendationResult") or {}).get("configurationBundle") or (
308
+ result.get("toolDescriptionRecommendationResult") or {}
309
+ ).get("configurationBundle")
310
+ if not result_bundle or record.get("syncedVersionId") == result_bundle.get("versionId"):
311
+ return record
312
+ applied = _apply.apply_recommendation_to_bundle(
313
+ bundle_name=record.get("bundleName"),
314
+ bundle_arn=record.get("bundleArn"),
315
+ result=result,
316
+ region=region_of(record["arn"]),
317
+ config_io=config_io,
318
+ )
319
+ if applied.success:
320
+ return {**record, "syncedVersionId": result_bundle["versionId"]}
321
+ return record
322
+
323
+
324
+ def archive(record: dict[str, Any]) -> Ok | Err:
325
+ try:
326
+ api.delete_recommendation(region=region_of(record["arn"]), recommendation_id=record["id"])
327
+ return Ok(None)
328
+ except JobNotFoundError:
329
+ return Ok(None)
330
+ except Exception as exc: # noqa: BLE001
331
+ return Err(to_error(exc))
File without changes
@@ -0,0 +1,85 @@
1
+ """Job Engine constants (port of operations/jobs/shared/constants.ts).
2
+
3
+ Storage directory names, per-type terminal-status sets, capability flags and shared validation
4
+ patterns. Job records are plain camelCase dicts (the on-disk JSON shape shared with the npm CLI).
5
+ """
6
+
7
+ import re
8
+ from typing import Any, Final
9
+
10
+ JOB_TYPES: Final = ("recommendation", "batch-evaluation", "ab-test", "insights")
11
+
12
+ # Local storage directory per job type, under `<configRoot>/.cli/jobs/`.
13
+ STORAGE_DIRS: Final[dict[str, str]] = {
14
+ "recommendation": "recommendations",
15
+ "batch-evaluation": "batch-eval-results",
16
+ "ab-test": "ab-tests",
17
+ "insights": "insights",
18
+ }
19
+
20
+ # Human-readable label per job type, for user-facing messages (e.g. "not found" errors).
21
+ JOB_TYPE_LABELS: Final[dict[str, str]] = {
22
+ "recommendation": "Recommendation",
23
+ "batch-evaluation": "Batch evaluation",
24
+ "ab-test": "A/B test",
25
+ "insights": "Insights job",
26
+ }
27
+
28
+ # Sentinel status set when a refresh GET 404s (job deleted on the service). Terminal for all types.
29
+ NOT_FOUND_STATUS: Final = "NOT_FOUND"
30
+
31
+ TERMINAL_STATUSES: Final[dict[str, frozenset[str]]] = {
32
+ "recommendation": frozenset({"COMPLETED", "FAILED", "SUCCEEDED", "DELETING", NOT_FOUND_STATUS}),
33
+ "batch-evaluation": frozenset(
34
+ {"COMPLETED", "COMPLETED_WITH_ERRORS", "FAILED", "STOPPED", "CANCELLED", NOT_FOUND_STATUS}
35
+ ),
36
+ # AB test: `status` holds lifecycle status (ACTIVE/FAILED/CREATE_FAILED).
37
+ "ab-test": frozenset({"FAILED", "CREATE_FAILED", "UPDATE_FAILED", "DELETE_FAILED", NOT_FOUND_STATUS}),
38
+ "insights": frozenset({"COMPLETED", "COMPLETED_WITH_ERRORS", "FAILED", "STOPPED", NOT_FOUND_STATUS}),
39
+ }
40
+
41
+ # Runtime capability flags (TUI display only).
42
+ JOB_CAPABILITIES: Final[dict[str, dict[str, bool]]] = {
43
+ "recommendation": {"canStop": False, "canPause": False, "canPromote": False, "canDebug": False},
44
+ "batch-evaluation": {"canStop": True, "canPause": False, "canPromote": False, "canDebug": False},
45
+ "ab-test": {"canStop": True, "canPause": True, "canPromote": True, "canDebug": True},
46
+ "insights": {"canStop": False, "canPause": False, "canPromote": False, "canDebug": False},
47
+ }
48
+
49
+ STOPPABLE_JOB_TYPES: Final = ("batch-evaluation", "ab-test")
50
+ PAUSABLE_JOB_TYPES: Final = ("ab-test",)
51
+ PROMOTABLE_JOB_TYPES: Final = ("ab-test",)
52
+ DEBUGGABLE_JOB_TYPES: Final = ("ab-test",)
53
+
54
+ # Maximum character length for inline text input (system prompt or tool descriptions).
55
+ MAX_INLINE_TEXT_LENGTH: Final = 20_000
56
+
57
+ # Recommendation name rule: start with a letter, alphanumeric + underscore/hyphen, max 48 chars.
58
+ RECOMMENDATION_NAME_REGEX: Final = re.compile(r"^[a-zA-Z][a-zA-Z0-9_-]{0,47}$")
59
+
60
+ # Maximum number of inline spans the API accepts.
61
+ MAX_INLINE_SPANS: Final = 1000
62
+
63
+ # Recommendation tool name rule: alphanumeric + underscore/hyphen/dot, max 256 chars.
64
+ TOOL_NAME_REGEX: Final = re.compile(r"^[a-zA-Z0-9_\-.]+$")
65
+ MAX_TOOL_NAME_LENGTH: Final = 256
66
+
67
+ # Batch-evaluation name rule: start with a letter, then letters/digits/underscores, max 48 chars.
68
+ BATCH_EVAL_NAME_REGEX: Final = re.compile(r"^[a-zA-Z][a-zA-Z0-9_]{0,47}$")
69
+
70
+
71
+ def is_terminal(record: dict[str, Any]) -> bool:
72
+ """Whether a record is in a terminal state AND fully settled (no further work on read).
73
+
74
+ A terminal batch-evaluation whose per-session results have not yet been fetched is kept
75
+ refreshable; so is a terminal AB test whose failureReason was not captured yet.
76
+ """
77
+ if record.get("error"):
78
+ return True # refresh retries exhausted — settled with an error
79
+ job_type = record.get("type")
80
+ status = record.get("status")
81
+ if status not in TERMINAL_STATUSES.get(job_type, frozenset()): # type: ignore[arg-type]
82
+ return False
83
+ if job_type == "batch-evaluation" and status != NOT_FOUND_STATUS and not record.get("resultsFetched"):
84
+ return False
85
+ return not (job_type == "ab-test" and status != NOT_FOUND_STATUS and not record.get("failureReason"))