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,67 @@
1
+ """Legacy insights run storage (port of operations/insights/insights-storage.ts): ``<configRoot>/.cli/insights/``.
2
+
3
+ Unused by upstream commands (the job engine stores insights under ``.cli/jobs/insights``); kept for parity.
4
+ """
5
+
6
+ import json
7
+ import os
8
+ from typing import Any
9
+
10
+ from agentcore.lib import find_config_root
11
+ from agentcore.lib.utils.json_format import to_json_string
12
+ from agentcore.operations.jobs.shared.storage import drop_undefined
13
+
14
+ INSIGHTS_DIR = "insights"
15
+
16
+
17
+ def _insights_dir() -> str:
18
+ config_root = find_config_root()
19
+ if not config_root:
20
+ raise Exception("No agentcore project found. Run `agentcore create` first.")
21
+ return os.path.join(config_root, ".cli", INSIGHTS_DIR)
22
+
23
+
24
+ def _write(path: str, record: dict[str, Any]) -> None:
25
+ with open(path, "w", encoding="utf-8", newline="") as fh:
26
+ fh.write(to_json_string(drop_undefined(record), 2))
27
+
28
+
29
+ def save_insights_run(record: dict[str, Any]) -> str:
30
+ directory = _insights_dir()
31
+ os.makedirs(directory, exist_ok=True)
32
+ path = os.path.join(directory, f"{record['batchEvaluationId']}.json")
33
+ _write(path, record)
34
+ return path
35
+
36
+
37
+ def load_insights_run(batch_evaluation_id: str) -> dict[str, Any]:
38
+ name = batch_evaluation_id if batch_evaluation_id.endswith(".json") else f"{batch_evaluation_id}.json"
39
+ path = os.path.join(_insights_dir(), name)
40
+ if not os.path.exists(path):
41
+ raise Exception(f'Insights run "{batch_evaluation_id}" not found at {path}')
42
+ with open(path, encoding="utf-8") as fh:
43
+ return json.load(fh)
44
+
45
+
46
+ def list_insights_runs() -> list[dict[str, Any]]:
47
+ directory = _insights_dir()
48
+ if not os.path.isdir(directory):
49
+ return []
50
+ out = []
51
+ for f in sorted((f for f in os.listdir(directory) if f.endswith(".json")), reverse=True):
52
+ with open(os.path.join(directory, f), encoding="utf-8") as fh:
53
+ out.append(json.load(fh))
54
+ return out
55
+
56
+
57
+ def delete_local_insights_run(batch_evaluation_id: str) -> bool:
58
+ path = os.path.join(_insights_dir(), f"{batch_evaluation_id}.json")
59
+ if not os.path.exists(path):
60
+ return False
61
+ os.remove(path)
62
+ return True
63
+
64
+
65
+ def update_insights_run(batch_evaluation_id: str, updates: dict[str, Any]) -> None:
66
+ record = {**load_insights_run(batch_evaluation_id), **updates}
67
+ _write(os.path.join(_insights_dir(), f"{batch_evaluation_id}.json"), record)
@@ -0,0 +1,148 @@
1
+ """Legacy insights runner (port of operations/insights/run-insights.ts; unused by upstream commands)."""
2
+
3
+ import random
4
+ import string
5
+ import time
6
+ from collections.abc import Callable
7
+ from typing import Any
8
+
9
+ from agentcore.aws import agentcore_batch_evaluation as api
10
+ from agentcore.aws.cloudwatch import resolve_endpoint_name, runtime_log_group
11
+ from agentcore.cli.commands.shared.region_utils import get_region
12
+ from agentcore.lib import ConfigIO, ResourceNotFoundError
13
+ from agentcore.lib.errors.types import to_error
14
+ from agentcore.lib.result import Err, Ok
15
+ from agentcore.lib.utils.json_format import to_json_string
16
+ from agentcore.operations.insights.insights_storage import save_insights_run, update_insights_run
17
+ from agentcore.operations.jobs.batch_evaluation.handler import new_logger
18
+ from agentcore.operations.jobs.shared.format import iso_from_ms, iso_now
19
+ from agentcore.operations.jobs.shared.resolve_agent_state import deployed_dict, resolve_agent_state
20
+
21
+ DEFAULT_POLL_INTERVAL_MS = 5_000
22
+ DEFAULT_LOOKBACK_DAYS = 7
23
+ TERMINAL_STATUSES = frozenset({"COMPLETED", "FAILED", "COMPLETED_WITH_ERRORS", "STOPPED", "CANCELLED"})
24
+
25
+
26
+ def _filter_config(options: dict[str, Any]) -> dict[str, Any]:
27
+ if options.get("sessionIds"):
28
+ return {"sessionIds": options["sessionIds"]}
29
+ days = options.get("lookbackDays") or DEFAULT_LOOKBACK_DAYS
30
+ end = options.get("endTime") or iso_now()
31
+ start = options.get("startTime") or iso_from_ms(time.time() * 1000 - days * 24 * 60 * 60 * 1000)
32
+ return {"timeRange": {"startTime": start, "endTime": end}}
33
+
34
+
35
+ def run_insights_command(options: dict[str, Any], sleep: Callable[[float], None] = time.sleep) -> Ok | Err:
36
+ logger = new_logger("insights")
37
+ log_path = logger.log_file_path if logger else None
38
+ try:
39
+ if logger:
40
+ logger.start_step("Load project config")
41
+ config_io = ConfigIO()
42
+ project = config_io.read_project_spec()
43
+ deployed = deployed_dict(config_io.read_deployed_state())
44
+ region = get_region(options.get("region"))
45
+ if logger:
46
+ logger.log(f"Region: {region}")
47
+ logger.end_step("success")
48
+ logger.start_step("Build data source config")
49
+ if options.get("onlineEvalConfigArn"):
50
+ data_source: dict[str, Any] = {
51
+ "onlineEvaluationConfigSource": {"onlineEvaluationConfigArn": options["onlineEvalConfigArn"]}
52
+ }
53
+ else:
54
+ agent = options.get("agent")
55
+ if not agent:
56
+ error = "Agent name is required when not using --online-eval-config-arn"
57
+ if logger:
58
+ logger.log(error, "error")
59
+ logger.end_step("error", error)
60
+ logger.finalize(False)
61
+ return Err(ResourceNotFoundError(error), logFilePath=log_path)
62
+ state = resolve_agent_state(deployed, agent)
63
+ if not state:
64
+ error = f'Agent "{agent}" not deployed. Run `agentcore deploy` first.'
65
+ if logger:
66
+ logger.log(error, "error")
67
+ logger.end_step("error", error)
68
+ logger.finalize(False)
69
+ return Err(ResourceNotFoundError(error), logFilePath=log_path)
70
+ data_source = {
71
+ "cloudWatchLogs": {
72
+ "serviceNames": [f"{project.name}_{agent}.{resolve_endpoint_name(options.get('endpoint'))}"],
73
+ "logGroupNames": [runtime_log_group(state["runtimeId"], options.get("endpoint"))],
74
+ "filterConfig": _filter_config(options),
75
+ }
76
+ }
77
+ if logger:
78
+ logger.end_step("success")
79
+ date_str = iso_now()[:10].replace("-", "")
80
+ rand = "".join(random.choices(string.ascii_lowercase + string.digits, k=6))
81
+ name = options.get("name") or f"{options.get('agent') or 'insights'}_insights_{date_str}_{rand}"
82
+ if logger:
83
+ logger.start_step("Start insights job")
84
+ on_progress = options.get("onProgress") or (lambda _s, _m: None)
85
+ on_progress("starting", f'Starting insights job "{name}"...')
86
+ start = api.start_batch_evaluation(
87
+ region=region,
88
+ name=name,
89
+ insights=[{"insightId": i} for i in options.get("insights") or []],
90
+ evaluators=[{"evaluatorId": e} for e in options.get("evaluators") or []] or None,
91
+ data_source_config=data_source, # type: ignore[arg-type]
92
+ client_token=api.generate_client_token(),
93
+ )
94
+ if logger:
95
+ logger.log(f"Response: {to_json_string(start)}")
96
+ logger.end_step("success")
97
+ on_progress("running", f"Insights job started (ID: {start['batchEvaluationId']})")
98
+ if options.get("onStarted"):
99
+ options["onStarted"]({"batchEvaluationId": start["batchEvaluationId"], "region": region})
100
+ record: dict[str, Any] = {
101
+ "batchEvaluationId": start["batchEvaluationId"],
102
+ "batchEvaluationArn": start["batchEvaluationArn"],
103
+ "name": start["name"],
104
+ "status": start["status"],
105
+ "region": region,
106
+ "createdAt": start.get("createdAt"),
107
+ "insights": options.get("insights") or [],
108
+ "agent": options.get("agent"),
109
+ }
110
+ save_insights_run(record)
111
+ if options.get("wait"):
112
+ interval = options.get("pollIntervalMs") or DEFAULT_POLL_INTERVAL_MS
113
+ while record["status"] not in TERMINAL_STATUSES:
114
+ sleep(interval / 1000)
115
+ current = api.get_batch_evaluation(region=region, batch_evaluation_id=start["batchEvaluationId"])
116
+ record["status"] = current["status"]
117
+ results = current.get("evaluationResults")
118
+ if results:
119
+ record["sessionCount"] = results.get("totalNumberOfSessions")
120
+ record["sessionsCompleted"] = results.get("numberOfSessionsCompleted")
121
+ record["sessionsFailed"] = results.get("numberOfSessionsFailed")
122
+ if current["status"] in TERMINAL_STATUSES:
123
+ record["completedAt"] = current.get("updatedAt")
124
+ update_insights_run(start["batchEvaluationId"], record)
125
+ on_progress(current["status"], f"Status: {current['status']}")
126
+ if logger:
127
+ logger.finalize(True)
128
+ return Ok(
129
+ {
130
+ k: record.get(k)
131
+ for k in (
132
+ "batchEvaluationId",
133
+ "batchEvaluationArn",
134
+ "name",
135
+ "status",
136
+ "region",
137
+ "sessionCount",
138
+ "sessionsCompleted",
139
+ "sessionsFailed",
140
+ )
141
+ }
142
+ | {"logFilePath": log_path}
143
+ )
144
+ except Exception as exc: # noqa: BLE001
145
+ if logger:
146
+ logger.log(str(exc), "error")
147
+ logger.finalize(False)
148
+ return Err(to_error(exc), logFilePath=log_path)
@@ -0,0 +1,5 @@
1
+ """Invocation helpers shared across commands (port of src/cli/operations/invoke)."""
2
+
3
+ from agentcore.operations.invoke.resolve_agent_context import AgentContext, resolve_agent_context
4
+
5
+ __all__ = ["AgentContext", "resolve_agent_context"]
@@ -0,0 +1,85 @@
1
+ """Port of operations/invoke/resolve-agent-context.ts.
2
+
3
+ Resolves a deployed agent to its invocation context (runtime ARN, region, config bundle baggage,
4
+ bearer token) once, so callers (invoke, dataset eval scenarios) can reuse it across invocations.
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Any
9
+
10
+
11
+ @dataclass
12
+ class AgentContext:
13
+ runtime_arn: str
14
+ runtime_id: str
15
+ region: str
16
+ agent_name: str
17
+ endpoint: str | None = None
18
+ baggage: str | None = None
19
+ bearer_token: str | None = None
20
+
21
+
22
+ def resolve_agent_context(
23
+ *,
24
+ project: Any,
25
+ deployed_state: Any,
26
+ aws_targets: list[Any],
27
+ agent_name: str | None = None,
28
+ endpoint: str | None = None,
29
+ target_name: str | None = None,
30
+ ) -> AgentContext:
31
+ from agentcore.cli.commands.invoke import _deps
32
+ from agentcore.cli.commands.invoke.resolve import build_config_bundle_baggage
33
+
34
+ targets = deployed_state.targets or {}
35
+ target_names = list(targets)
36
+ if not target_names:
37
+ raise RuntimeError("No deployed targets found. Run `agentcore deploy` first.")
38
+
39
+ selected = target_name if target_name is not None else target_names[0]
40
+ if target_name and target_name not in target_names:
41
+ raise RuntimeError(f"Target '{target_name}' not found. Available: {', '.join(target_names)}")
42
+
43
+ target_state = targets.get(selected)
44
+ target_config = next((t for t in aws_targets if t.name == selected), None)
45
+ if target_config is None:
46
+ raise RuntimeError(f"Target config '{selected}' not found in aws-targets")
47
+
48
+ runtimes = project.runtimes or []
49
+ if not runtimes:
50
+ raise RuntimeError("No agents defined in configuration")
51
+
52
+ agent_spec = next((a for a in runtimes if a.name == agent_name), None) if agent_name else runtimes[0]
53
+ if agent_spec is None:
54
+ available = ", ".join(a.name for a in runtimes)
55
+ raise RuntimeError(f"Agent '{agent_name}' not found. Available: {available}")
56
+
57
+ resources = target_state.resources if target_state else None
58
+ agent_state = ((resources.runtimes if resources else None) or {}).get(agent_spec.name)
59
+ if not agent_state:
60
+ raise RuntimeError(f"Agent '{agent_spec.name}' is not deployed to target '{selected}'")
61
+
62
+ baggage = build_config_bundle_baggage(project, target_state, agent_spec.name)
63
+
64
+ bearer_token: str | None = None
65
+ if agent_spec.authorizer_type == "CUSTOM_JWT":
66
+ if _deps.can_fetch_runtime_token(agent_spec.name):
67
+ try:
68
+ bearer_token = _deps.token_of(_deps.fetch_runtime_token(agent_spec.name, deploy_target=selected))
69
+ except Exception as exc:
70
+ raise RuntimeError(f"CUSTOM_JWT agent requires a bearer token. Auto-fetch failed: {exc}") from exc
71
+ else:
72
+ raise RuntimeError(
73
+ f"Agent '{agent_spec.name}' is configured for CUSTOM_JWT but no bearer token is available. "
74
+ "Re-add the agent with --client-id and --client-secret to enable auto-fetch."
75
+ )
76
+
77
+ return AgentContext(
78
+ runtime_arn=agent_state.runtime_arn,
79
+ runtime_id=agent_state.runtime_id,
80
+ region=target_config.region,
81
+ endpoint=endpoint,
82
+ agent_name=agent_spec.name,
83
+ baggage=baggage,
84
+ bearer_token=bearer_token,
85
+ )
@@ -0,0 +1,38 @@
1
+ """Job Engine public API (port of operations/jobs/index.ts).
2
+
3
+ Usage::
4
+
5
+ engine = create_job_engine(ConfigIO())
6
+ result = engine.start("recommendation", opts)
7
+ jobs = engine.list(type="recommendation")
8
+ """
9
+
10
+ from agentcore.operations.jobs.batch_evaluation.dataset_phase1 import BATCH_INGESTION_DELAY_MS, run_dataset_phase1
11
+ from agentcore.operations.jobs.shared.constants import (
12
+ JOB_CAPABILITIES,
13
+ JOB_TYPE_LABELS,
14
+ JOB_TYPES,
15
+ NOT_FOUND_STATUS,
16
+ STORAGE_DIRS,
17
+ TERMINAL_STATUSES,
18
+ is_terminal,
19
+ )
20
+ from agentcore.operations.jobs.shared.engine import JobEngine, create_job_engine
21
+ from agentcore.operations.jobs.shared.region import region_from_arn
22
+ from agentcore.operations.jobs.shared.wait import wait_for_terminal
23
+
24
+ __all__ = [
25
+ "BATCH_INGESTION_DELAY_MS",
26
+ "JOB_CAPABILITIES",
27
+ "JOB_TYPES",
28
+ "JOB_TYPE_LABELS",
29
+ "NOT_FOUND_STATUS",
30
+ "STORAGE_DIRS",
31
+ "TERMINAL_STATUSES",
32
+ "JobEngine",
33
+ "create_job_engine",
34
+ "is_terminal",
35
+ "region_from_arn",
36
+ "run_dataset_phase1",
37
+ "wait_for_terminal",
38
+ ]
File without changes
@@ -0,0 +1,126 @@
1
+ """Build the CreateABTest request (port of operations/jobs/ab-test/build-options.ts)."""
2
+
3
+ from typing import Any
4
+
5
+ from agentcore.lib import ResourceNotFoundError, ValidationError
6
+ from agentcore.operations.jobs.ab_test.resolve import (
7
+ resolve_config_bundle_arn,
8
+ resolve_config_bundle_version,
9
+ resolve_online_eval_arn,
10
+ )
11
+
12
+ _NOT_DEPLOYED_BUNDLE = (
13
+ 'Config bundle "{}" is not deployed. Run `agentcore add config-bundle` and `agentcore deploy` first.'
14
+ )
15
+ _BAD_VERSION = (
16
+ 'Could not resolve version "{}" for config bundle "{}". Use LATEST or a version UUID '
17
+ "(e.g. a1b2c3d4-e5f6-7890-abcd-ef1234567890)."
18
+ )
19
+
20
+
21
+ def build_ab_test_request(opts: dict[str, Any], deployed: dict[str, Any] | None = None) -> dict[str, Any]:
22
+ """{"variants", "evaluationConfig", "gatewayFilter"?, "variantSummaries"}; raises on missing inputs."""
23
+ variants: list[dict[str, Any]] = []
24
+ summaries: list[dict[str, Any]] = []
25
+ cw, tw = opts["controlWeight"], opts["treatmentWeight"]
26
+
27
+ if opts["mode"] == "config-bundle":
28
+ cb, cv = opts.get("controlBundle"), opts.get("controlVersion")
29
+ tb, tv = opts.get("treatmentBundle"), opts.get("treatmentVersion")
30
+ if not cb or not cv or not tb or not tv:
31
+ raise ValidationError("config-bundle A/B test requires control and treatment bundle names and versions.")
32
+ if not opts.get("onlineEval"):
33
+ raise ValidationError("config-bundle A/B test requires an online-eval config.")
34
+ control_arn = resolve_config_bundle_arn(cb, deployed)
35
+ control_ver = resolve_config_bundle_version(cb, cv, deployed)
36
+ treatment_arn = resolve_config_bundle_arn(tb, deployed)
37
+ treatment_ver = resolve_config_bundle_version(tb, tv, deployed)
38
+ if not control_arn:
39
+ raise ResourceNotFoundError(_NOT_DEPLOYED_BUNDLE.format(cb))
40
+ if not control_ver:
41
+ raise ResourceNotFoundError(_BAD_VERSION.format(cv, cb))
42
+ if not treatment_arn:
43
+ raise ResourceNotFoundError(_NOT_DEPLOYED_BUNDLE.format(tb))
44
+ if not treatment_ver:
45
+ raise ResourceNotFoundError(_BAD_VERSION.format(tv, tb))
46
+ variants += [
47
+ {
48
+ "name": "C",
49
+ "weight": cw,
50
+ "variantConfiguration": {
51
+ "configurationBundle": {"bundleArn": control_arn, "bundleVersion": control_ver}
52
+ },
53
+ },
54
+ {
55
+ "name": "T1",
56
+ "weight": tw,
57
+ "variantConfiguration": {
58
+ "configurationBundle": {"bundleArn": treatment_arn, "bundleVersion": treatment_ver}
59
+ },
60
+ },
61
+ ]
62
+ summaries += [
63
+ {"name": "C", "weight": cw, "bundleArn": control_arn, "bundleVersion": control_ver},
64
+ {"name": "T1", "weight": tw, "bundleArn": treatment_arn, "bundleVersion": treatment_ver},
65
+ ]
66
+ online_arn = resolve_online_eval_arn(opts["onlineEval"], deployed)
67
+ if not online_arn:
68
+ raise ResourceNotFoundError(
69
+ f'Online-eval config "{opts["onlineEval"]}" is not deployed. Run `agentcore add online-eval` and '
70
+ "`agentcore deploy` first."
71
+ )
72
+ evaluation_config: dict[str, Any] = {"onlineEvaluationConfigArn": online_arn}
73
+ else:
74
+ ct, tt = opts.get("controlTarget"), opts.get("treatmentTarget")
75
+ if not ct or not tt:
76
+ raise ValidationError("target-based A/B test requires control and treatment target names.")
77
+ variants += [
78
+ {"name": "C", "weight": cw, "variantConfiguration": {"target": {"name": ct}}},
79
+ {"name": "T1", "weight": tw, "variantConfiguration": {"target": {"name": tt}}},
80
+ ]
81
+ summaries += [
82
+ {"name": "C", "weight": cw, "targetName": ct},
83
+ {"name": "T1", "weight": tw, "targetName": tt},
84
+ ]
85
+ coe, toe = opts.get("controlOnlineEval"), opts.get("treatmentOnlineEval")
86
+ if not coe or not toe:
87
+ raise ValidationError(
88
+ "target-based A/B test requires --control-online-eval and --treatment-online-eval (one per endpoint)."
89
+ )
90
+ control_eval = resolve_online_eval_arn(coe, deployed)
91
+ if not control_eval:
92
+ raise ResourceNotFoundError(
93
+ f'Online-eval config "{coe}" (--control-online-eval) is not deployed. Run `agentcore add online-eval` '
94
+ "and `agentcore deploy` first."
95
+ )
96
+ treatment_eval = resolve_online_eval_arn(toe, deployed)
97
+ if not treatment_eval:
98
+ raise ResourceNotFoundError(
99
+ f'Online-eval config "{toe}" (--treatment-online-eval) is not deployed. Run `agentcore add '
100
+ "online-eval` and `agentcore deploy` first."
101
+ )
102
+ evaluation_config = {
103
+ "perVariantOnlineEvaluationConfig": [
104
+ {"name": "C", "onlineEvaluationConfigArn": control_eval},
105
+ {"name": "T1", "onlineEvaluationConfigArn": treatment_eval},
106
+ ]
107
+ }
108
+
109
+ gateway_filter = None
110
+ if opts.get("gatewayFilter"):
111
+ paths = [s.strip() for s in opts["gatewayFilter"].split(",") if s.strip()]
112
+ if len(paths) > 1:
113
+ quoted = ", ".join(f'"{p}"' for p in paths)
114
+ raise ValidationError(
115
+ "--gateway-filter accepts exactly one target path pattern (the service allows a single path). "
116
+ f"Got {len(paths)}: {quoted}."
117
+ )
118
+ if len(paths) == 1:
119
+ gateway_filter = {"targetPaths": [paths[0]]}
120
+
121
+ return {
122
+ "variants": variants,
123
+ "evaluationConfig": evaluation_config,
124
+ "gatewayFilter": gateway_filter,
125
+ "variantSummaries": summaries,
126
+ }
@@ -0,0 +1,121 @@
1
+ """Presentation helpers for A/B-test jobs (port of operations/jobs/ab-test/format.ts)."""
2
+
3
+ from typing import Any
4
+
5
+ import typer
6
+
7
+ from agentcore.aws.partition import dns_suffix
8
+ from agentcore.operations.jobs.shared.format import format_job_date, to_fixed
9
+
10
+ # Names what the caller must append to a gateway base URL to reach a variant.
11
+ INVOCATION_PATH_HINT = "append /<gateway-target>/invocations (see `agentcore status --json`)"
12
+
13
+
14
+ def _gateway_base_url(record: dict[str, Any]) -> str | None:
15
+ parts = (record.get("gatewayArn") or "").split(":")
16
+ region = parts[3] if len(parts) > 3 else ""
17
+ resource = parts[5].split("/") if len(parts) > 5 else []
18
+ gateway_id = resource[1] if len(resource) > 1 else ""
19
+ if not region or not gateway_id:
20
+ return None
21
+ return f"https://{gateway_id}.gateway.bedrock-agentcore.{region}.{dns_suffix(region)}"
22
+
23
+
24
+ def _unique_target_name(record: dict[str, Any]) -> str | None:
25
+ if record.get("mode") == "target-based":
26
+ variants = record.get("variants") or []
27
+ return variants[0].get("targetName") if variants else None
28
+ return record.get("targetName")
29
+
30
+
31
+ def get_invocation_url(record: dict[str, Any]) -> str | None:
32
+ base = _gateway_base_url(record)
33
+ target = _unique_target_name(record)
34
+ return f"{base}/{target}/invocations" if base and target else None
35
+
36
+
37
+ def get_invocation_url_candidates(record: dict[str, Any]) -> list[str]:
38
+ base = _gateway_base_url(record)
39
+ if not base or not record.get("targetCandidates"):
40
+ return []
41
+ return [f"{base}/{t}/invocations" for t in record["targetCandidates"]]
42
+
43
+
44
+ def get_gateway_base_url(record: dict[str, Any]) -> str | None:
45
+ return _gateway_base_url(record)
46
+
47
+
48
+ def print_ab_test_history(records: list[dict[str, Any]]) -> None:
49
+ if not records:
50
+ typer.echo("No A/B test jobs found. Run `agentcore run ab-test` to create one.")
51
+ return
52
+ typer.echo(f"\n{'Date'.ljust(22)} {'Execution'.ljust(12)} {'Lifecycle'.ljust(12)} {'Name'.ljust(24)} ID")
53
+ typer.echo("─" * 100)
54
+ for r in records:
55
+ typer.echo(
56
+ f"{format_job_date(r.get('createdAt')).ljust(22)} {str(r.get('status')).ljust(12)} "
57
+ f"{str(r.get('lifecycleStatus')).ljust(12)} {str(r.get('name')).ljust(24)} {r['id']}"
58
+ )
59
+ typer.echo("")
60
+
61
+
62
+ def print_ab_test_detail(record: dict[str, Any]) -> None:
63
+ typer.echo(f"\nA/B test: {record['id']}")
64
+ typer.echo(f"Name: {record.get('name')}")
65
+ typer.echo(f"Mode: {record.get('mode')}")
66
+ typer.echo(f"Execution status: {record.get('status')}")
67
+ typer.echo(f"Lifecycle status: {record.get('lifecycleStatus')}")
68
+ typer.echo(f"Gateway: {record.get('gatewayArn')}")
69
+ paths = (record.get("gatewayFilter") or {}).get("targetPaths") or []
70
+ typer.echo(f"Gateway filter: {paths[0] if paths else 'none'}")
71
+ url = get_invocation_url(record)
72
+ candidates = get_invocation_url_candidates(record)
73
+ if url:
74
+ typer.echo(f"Invocation URL: {url}")
75
+ elif candidates:
76
+ typer.echo("Invocation URLs (one per matching gateway target — pick the one to send traffic to):")
77
+ for c in candidates:
78
+ typer.echo(f" {c}")
79
+ else:
80
+ base = get_gateway_base_url(record)
81
+ if base:
82
+ typer.echo(f"Gateway URL: {base}")
83
+ typer.echo(f" → {INVOCATION_PATH_HINT}")
84
+ typer.echo(f"Started: {format_job_date(record.get('createdAt'))}")
85
+ if record.get("completedAt"):
86
+ typer.echo(f"Stopped: {format_job_date(record['completedAt'])}")
87
+ if record.get("maxDurationExpiresAt"):
88
+ typer.echo(f"Max duration expires: {format_job_date(record['maxDurationExpiresAt'])}")
89
+
90
+ typer.echo("\nVariants:")
91
+ for v in record.get("variants") or []:
92
+ if v.get("bundleArn"):
93
+ detail = f"bundle {v['bundleArn']} @ {v.get('bundleVersion')}"
94
+ elif v.get("targetName"):
95
+ detail = f"target {v['targetName']}"
96
+ else:
97
+ detail = "(unspecified)"
98
+ typer.echo(f" {v.get('name')} (weight {v.get('weight')}): {detail}")
99
+
100
+ metrics = (record.get("results") or {}).get("evaluatorMetrics")
101
+ if metrics:
102
+ typer.echo("\nResults:")
103
+ for m in metrics:
104
+ typer.echo(f" {m.get('evaluatorArn')}")
105
+ cs = m.get("controlStats") or {}
106
+ typer.echo(f" C (n={cs.get('sampleSize')}): mean {to_fixed(cs.get('mean'), 3)}")
107
+ for vr in m.get("variantResults") or []:
108
+ pc = vr.get("percentChange")
109
+ change = f" ({'+' if pc > 0 else ''}{to_fixed(pc, 1)}%)" if pc is not None else ""
110
+ sig = " *significant*" if vr.get("isSignificant") else ""
111
+ typer.echo(
112
+ f" {vr.get('treatmentName')} (n={vr.get('sampleSize')}): mean {to_fixed(vr.get('mean'), 3)}"
113
+ f"{change}{sig}"
114
+ )
115
+ elif record.get("failureReason"):
116
+ typer.echo(f"\nFailure: {record['failureReason']}")
117
+ else:
118
+ typer.echo("\nResults not yet available.")
119
+ if record.get("logFilePath"):
120
+ typer.echo(f"\nLog: {record['logFilePath']}")
121
+ typer.echo("")