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,155 @@
1
+ """`agentcore traces list|get` (port of src/cli/commands/traces)."""
2
+
3
+ import json
4
+ import math
5
+ from datetime import UTC, datetime
6
+ from typing import Any
7
+
8
+ import typer
9
+
10
+ from agentcore.cli.commands.logs.guards import get_project_root_mismatch, project_exists, require_project
11
+ from agentcore.cli.commands.traces import action
12
+ from agentcore.cli.errors import get_error_message
13
+ from agentcore.cli.groups import group
14
+ from agentcore.lib.result import serialize_result
15
+ from agentcore.operations import resolve_agent as resolve_agent_ops
16
+
17
+ SINCE_HELP = "Start time — defaults to 12h ago (e.g. 5m, 1h, 2d, ISO 8601, epoch ms)"
18
+ UNTIL_HELP = "End time — defaults to now (e.g. now, 1h, ISO 8601, epoch ms)"
19
+
20
+
21
+ def _dumps(payload: dict[str, Any]) -> str:
22
+ return json.dumps({k: v for k, v in payload.items() if v is not None}, separators=(",", ":"), ensure_ascii=False)
23
+
24
+
25
+ def format_timestamp(ts: str) -> str:
26
+ try:
27
+ num = float(ts)
28
+ except ValueError:
29
+ return ts
30
+ if math.isnan(num):
31
+ return ts
32
+ return datetime.fromtimestamp(num / 1000, tz=UTC).strftime("%Y-%m-%d %H:%M:%SZ")
33
+
34
+
35
+ def _require_traces_project(as_json: bool) -> None:
36
+ if not as_json:
37
+ require_project()
38
+ return
39
+ if not project_exists():
40
+ typer.echo(_dumps({"success": False, "error": "No agentcore project found. Run agentcore create first."}))
41
+ raise typer.Exit(1)
42
+ project_root = get_project_root_mismatch()
43
+ if project_root:
44
+ typer.echo(
45
+ _dumps(
46
+ {"success": False, "error": f"Please run this command from your project root directory: {project_root}"}
47
+ )
48
+ )
49
+ raise typer.Exit(1)
50
+
51
+
52
+ def _print_failure(result: dict[str, Any], as_json: bool) -> None:
53
+ if as_json:
54
+ typer.echo(_dumps(serialize_result(result)))
55
+ else:
56
+ typer.secho(f"Error: {result['error']}", fg=typer.colors.RED)
57
+ if result.get("consoleUrl"):
58
+ typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
59
+ raise typer.Exit(1)
60
+
61
+
62
+ def _handle_unexpected(exc: Exception, as_json: bool) -> None:
63
+ if as_json:
64
+ typer.echo(_dumps({"success": False, "error": get_error_message(exc)}))
65
+ else:
66
+ typer.secho(f"Error: {get_error_message(exc)}", fg=typer.colors.RED)
67
+ raise typer.Exit(1) from None
68
+
69
+
70
+ def traces_list(
71
+ runtime: str | None = typer.Option(None, "--runtime", help="Select specific runtime"),
72
+ limit: str = typer.Option("20", "--limit", help="Maximum number of traces to display"),
73
+ since: str | None = typer.Option(None, "--since", help=SINCE_HELP),
74
+ until: str | None = typer.Option(None, "--until", help=UNTIL_HELP),
75
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
76
+ ) -> None:
77
+ """List recent traces for a deployed runtime"""
78
+ try:
79
+ _require_traces_project(as_json)
80
+ context = resolve_agent_ops.load_deployed_project_config()
81
+ result = action.handle_traces_list(
82
+ context, action.TracesListOptions(runtime=runtime, limit=limit, since=since, until=until, json=as_json)
83
+ )
84
+ except typer.Exit:
85
+ raise
86
+ except Exception as exc: # noqa: BLE001 - top-level command boundary, as upstream
87
+ _handle_unexpected(exc, as_json)
88
+ return
89
+ if not result["success"]:
90
+ _print_failure(result, as_json)
91
+ if as_json:
92
+ typer.echo(_dumps(serialize_result(result)))
93
+ return
94
+
95
+ typer.secho(f"Traces for {result.get('agentName')} (target: {result.get('targetName')})", bold=True)
96
+ typer.echo(" ")
97
+ traces = result.get("traces") or []
98
+ if traces:
99
+ typer.echo(
100
+ typer.style(f"{'Trace ID':<34}", bold=True)
101
+ + typer.style(f"{'Timestamp':<22}", bold=True)
102
+ + typer.style(f"{'Session ID':<38}", bold=True)
103
+ )
104
+ for trace in traces:
105
+ typer.echo(
106
+ typer.style(f"{trace['traceId']:<34}", fg=typer.colors.CYAN)
107
+ + f"{format_timestamp(trace['timestamp']):<22}"
108
+ + typer.style(f"{trace.get('sessionId') or '-':<38}", fg=typer.colors.MAGENTA)
109
+ )
110
+ else:
111
+ typer.secho("No traces found in the specified time range.", fg=typer.colors.YELLOW)
112
+ typer.echo(" ")
113
+ if result.get("consoleUrl"):
114
+ typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
115
+ typer.secho("Note: Traces may take 2-3 minutes to appear in CloudWatch", dim=True)
116
+
117
+
118
+ def traces_get(
119
+ trace_id: str = typer.Argument(..., metavar="TRACEID"),
120
+ runtime: str | None = typer.Option(None, "--runtime", help="Select specific runtime"),
121
+ output: str | None = typer.Option(None, "--output", help="Output file path"),
122
+ since: str | None = typer.Option(None, "--since", help=SINCE_HELP),
123
+ until: str | None = typer.Option(None, "--until", help=UNTIL_HELP),
124
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
125
+ ) -> None:
126
+ """Download a trace to a JSON file"""
127
+ try:
128
+ _require_traces_project(as_json)
129
+ context = resolve_agent_ops.load_deployed_project_config()
130
+ result = action.handle_traces_get(
131
+ context,
132
+ trace_id,
133
+ action.TracesGetOptions(runtime=runtime, output=output, since=since, until=until, json=as_json),
134
+ )
135
+ except typer.Exit:
136
+ raise
137
+ except Exception as exc: # noqa: BLE001 - top-level command boundary, as upstream
138
+ _handle_unexpected(exc, as_json)
139
+ return
140
+ if not result["success"]:
141
+ _print_failure(result, as_json)
142
+ if as_json:
143
+ typer.echo(_dumps(serialize_result(result)))
144
+ return
145
+ typer.secho(f"Trace saved to: {result.get('filePath')}", fg=typer.colors.GREEN)
146
+ if result.get("consoleUrl"):
147
+ typer.secho(f"Console: {result['consoleUrl']}", fg="bright_black")
148
+
149
+
150
+ def register(app: typer.Typer) -> None:
151
+ traces = group("traces")
152
+ traces.command("list", help="List recent traces for a deployed runtime")(traces_list)
153
+ traces.command("get", help="Download a trace to a JSON file")(traces_get)
154
+ # Upstream alias `agentcore t`.
155
+ app.add_typer(traces, name="t", hidden=True)
@@ -0,0 +1,123 @@
1
+ """Port of src/cli/commands/traces/action.ts.
2
+
3
+ Handlers return upstream's flat result dicts: ``{"success": True, "agentName", "targetName",
4
+ "consoleUrl", ...}`` or ``{"success": False, "error": <exception>, "consoleUrl"?}`` (serialize with
5
+ ``agentcore.lib.result.serialize_result``).
6
+ """
7
+
8
+ from dataclasses import dataclass
9
+ from typing import Any
10
+
11
+ from agentcore.lib.errors.types import ResourceNotFoundError, ValidationError
12
+ from agentcore.lib.utils.time_parser import parse_time_string
13
+ from agentcore.operations import traces as traces_ops
14
+ from agentcore.operations.resolve_agent import DeployedProjectConfig, resolve_agent
15
+
16
+ PYTHON_ONLY_ERROR = (
17
+ "Traces are only supported for Python agents. TypeScript agents do not support observability traces."
18
+ )
19
+
20
+
21
+ @dataclass
22
+ class TracesListOptions:
23
+ runtime: str | None = None
24
+ limit: str | None = None
25
+ since: str | None = None
26
+ until: str | None = None
27
+ json: bool = False
28
+
29
+
30
+ @dataclass
31
+ class TracesGetOptions:
32
+ runtime: str | None = None
33
+ output: str | None = None
34
+ since: str | None = None
35
+ until: str | None = None
36
+ json: bool = False
37
+
38
+
39
+ def _parse_int(value: str) -> int | None:
40
+ text = value.strip()
41
+ end = 0
42
+ while end < len(text) and (text[end].isdigit() or (end == 0 and text[end] in "+-")):
43
+ end += 1
44
+ try:
45
+ return int(text[:end])
46
+ except ValueError:
47
+ return None
48
+
49
+
50
+ def _resolve(context: DeployedProjectConfig, runtime: str | None) -> tuple[Any, str] | dict[str, Any]:
51
+ resolved = resolve_agent(context, runtime)
52
+ if not resolved.success:
53
+ return {"success": False, "error": ResourceNotFoundError(resolved.error or "")}
54
+ agent = resolved.agent
55
+ spec = next((r for r in context.project.runtimes or [] if r.name == agent.agent_name), None)
56
+ entrypoint = str(spec.entrypoint) if spec is not None and spec.entrypoint else ""
57
+ if not (entrypoint.endswith(".py") or ".py:" in entrypoint):
58
+ return {"success": False, "error": ValidationError(PYTHON_ONLY_ERROR)}
59
+ console_url = traces_ops.build_trace_console_url(
60
+ region=agent.region, account_id=agent.account_id, runtime_id=agent.runtime_id, agent_name=agent.agent_name
61
+ )
62
+ return agent, console_url
63
+
64
+
65
+ def _times(since: str | None, until: str | None) -> tuple[int | None, int | None]:
66
+ return (parse_time_string(since) if since else None, parse_time_string(until) if until else None)
67
+
68
+
69
+ def handle_traces_list(context: DeployedProjectConfig, options: TracesListOptions) -> dict[str, Any]:
70
+ resolved = _resolve(context, options.runtime)
71
+ if isinstance(resolved, dict):
72
+ return resolved
73
+ agent, console_url = resolved
74
+
75
+ limit = _parse_int(options.limit) if options.limit else 20
76
+ if limit is None:
77
+ return {"success": False, "error": ValidationError("--limit must be a number")}
78
+
79
+ start_time, end_time = _times(options.since, options.until)
80
+ result = traces_ops.list_traces(
81
+ region=agent.region,
82
+ runtime_id=agent.runtime_id,
83
+ agent_name=agent.agent_name,
84
+ limit=limit,
85
+ start_time=start_time,
86
+ end_time=end_time,
87
+ )
88
+ if not result.success:
89
+ return {"success": False, "error": result.error, "consoleUrl": console_url}
90
+ return {
91
+ "success": True,
92
+ "agentName": agent.agent_name,
93
+ "targetName": agent.target_name,
94
+ "consoleUrl": console_url,
95
+ "traces": result.value["traces"],
96
+ }
97
+
98
+
99
+ def handle_traces_get(context: DeployedProjectConfig, trace_id: str, options: TracesGetOptions) -> dict[str, Any]:
100
+ resolved = _resolve(context, options.runtime)
101
+ if isinstance(resolved, dict):
102
+ return resolved
103
+ agent, console_url = resolved
104
+
105
+ start_time, end_time = _times(options.since, options.until)
106
+ result = traces_ops.get_trace(
107
+ region=agent.region,
108
+ runtime_id=agent.runtime_id,
109
+ agent_name=agent.agent_name,
110
+ trace_id=trace_id,
111
+ output_path=options.output,
112
+ start_time=start_time,
113
+ end_time=end_time,
114
+ )
115
+ if not result.success:
116
+ return {"success": False, "error": result.error, "consoleUrl": console_url}
117
+ return {
118
+ "success": True,
119
+ "agentName": agent.agent_name,
120
+ "targetName": agent.target_name,
121
+ "consoleUrl": console_url,
122
+ "filePath": result.value["filePath"],
123
+ }
@@ -0,0 +1,63 @@
1
+ """`agentcore update` / `agentcore update cli` (port of src/cli/commands/update/command.tsx)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import typer
6
+
7
+ from agentcore.cli.commands.update.action import get_install_command_display, handle_update
8
+ from agentcore.cli.constants import ANSI
9
+ from agentcore.cli.errors import get_error_message
10
+ from agentcore.cli.groups import group
11
+
12
+
13
+ def _run_update(check: bool, rerun_command: str) -> None:
14
+ green, yellow, red, reset = ANSI.green, ANSI.yellow, ANSI.red, ANSI.reset
15
+ try:
16
+ typer.echo("Checking for updates...")
17
+ result = handle_update(check)
18
+ except Exception as exc: # noqa: BLE001
19
+ typer.echo(f"{red}Error: {get_error_message(exc)}{reset}")
20
+ raise typer.Exit(1) from None
21
+
22
+ if result.status == "up-to-date":
23
+ typer.echo(f"{green}You are already on the latest version ({result.current_version}){reset}")
24
+ elif result.status == "newer-local":
25
+ typer.echo(
26
+ f"{yellow}Your version ({result.current_version}) is newer than the published version "
27
+ f"({result.latest_version}){reset}"
28
+ )
29
+ elif result.status == "update-available":
30
+ typer.echo(f"Update available: {result.current_version} → {green}{result.latest_version}{reset}")
31
+ typer.echo(f"Run `{rerun_command}` to install the update.")
32
+ elif result.status == "manual-install":
33
+ typer.echo(f"Update available: {result.current_version} → {green}{result.latest_version}{reset}")
34
+ typer.echo(f"Run `{result.install_command}` to install the update.")
35
+ elif result.status == "updated":
36
+ typer.echo(f"{green}Successfully updated to {result.latest_version}{reset}")
37
+ else:
38
+ typer.echo(f"{red}Failed to install update. Try running: {get_install_command_display()}{reset}")
39
+ raise typer.Exit(1)
40
+
41
+
42
+ def register(app: typer.Typer) -> None:
43
+ update = group("update")
44
+ update.info.no_args_is_help = False
45
+
46
+ @update.callback(invoke_without_command=True)
47
+ def update_root(
48
+ ctx: typer.Context,
49
+ check: bool = typer.Option(False, "-c", "--check", help="Check for updates without installing"),
50
+ ) -> None:
51
+ """Check for and install CLI updates"""
52
+ if ctx.invoked_subcommand is not None:
53
+ return
54
+ _run_update(check, "agentcore update")
55
+
56
+ @update.command("cli", help="Update the AgentCore CLI to the latest version")
57
+ def update_cli(
58
+ check: bool = typer.Option(False, "-c", "--check", help="Check for updates without installing"),
59
+ ) -> None:
60
+ _run_update(check, "agentcore update cli")
61
+
62
+
63
+ __all__ = ["register"]
@@ -0,0 +1,164 @@
1
+ """`agentcore update` logic (port of src/cli/commands/update/action.ts).
2
+
3
+ Deliberate deviation: the Python port is published on PyPI as ``agentcore-cli``. The latest version
4
+ comes from the PyPI JSON API; installs run ``python -m pip install -U agentcore-cli`` — unless the
5
+ CLI lives in a pipx or uv-tool environment, in which case the matching upgrade command is printed
6
+ instead of running pip.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ import os
13
+ import subprocess
14
+ import sys
15
+ import urllib.request
16
+ from dataclasses import dataclass
17
+ from typing import Literal
18
+
19
+ from agentcore import __version__
20
+
21
+ PACKAGE_NAME = "agentcore-cli"
22
+ PYPI_URL = f"https://pypi.org/pypi/{PACKAGE_NAME}/json"
23
+ PIP_INSTALL_ARGS = [sys.executable, "-m", "pip", "install", "-U", PACKAGE_NAME]
24
+
25
+ InstallMethod = Literal["pip", "pipx", "uv"]
26
+ UpdateStatus = Literal["up-to-date", "newer-local", "update-available", "updated", "update-failed", "manual-install"]
27
+
28
+
29
+ def _http_get_json(url: str) -> tuple[int, str, object]:
30
+ """Network seam (tests replace it): returns (status, reason, parsed JSON or None)."""
31
+ request = urllib.request.Request(url, headers={"accept": "application/json"})
32
+ try:
33
+ with urllib.request.urlopen(request, timeout=10) as response: # noqa: S310 - fixed https URL
34
+ return response.status, response.reason or "", json.loads(response.read())
35
+ except urllib.error.HTTPError as exc:
36
+ return exc.code, exc.reason or "", None
37
+
38
+
39
+ def fetch_latest_version() -> str:
40
+ status, reason, data = _http_get_json(PYPI_URL)
41
+ if not 200 <= status < 300 or not isinstance(data, dict):
42
+ raise Exception(f"Failed to fetch latest version: {reason}")
43
+ return str(data["info"]["version"])
44
+
45
+
46
+ def _semver_compare(current: str, latest: str) -> int:
47
+ """Upstream's semver-style comparison (1 when ``latest`` is newer)."""
48
+
49
+ def parse(v: str) -> tuple[list[float], str]:
50
+ core, _, prerelease = v.partition("-")
51
+ nums: list[float] = []
52
+ for part in core.split("."):
53
+ try:
54
+ nums.append(float(part))
55
+ except ValueError:
56
+ nums.append(float("nan"))
57
+ return nums, prerelease
58
+
59
+ curr, lat = parse(current), parse(latest)
60
+ for i in range(3):
61
+ c = curr[0][i] if i < len(curr[0]) else 0
62
+ n = lat[0][i] if i < len(lat[0]) else 0
63
+ if n > c:
64
+ return 1
65
+ if n < c:
66
+ return -1
67
+ if not curr[1] and not lat[1]:
68
+ return 0
69
+ if not curr[1]:
70
+ return -1
71
+ if not lat[1]:
72
+ return 1
73
+ cs, ls = curr[1].split("."), lat[1].split(".")
74
+ for i in range(max(len(cs), len(ls))):
75
+ if i >= len(cs):
76
+ return 1
77
+ if i >= len(ls):
78
+ return -1
79
+ a, b = cs[i], ls[i]
80
+ if a.isdigit() and b.isdigit():
81
+ if int(b) > int(a):
82
+ return 1
83
+ if int(b) < int(a):
84
+ return -1
85
+ else:
86
+ if b > a:
87
+ return 1
88
+ if b < a:
89
+ return -1
90
+ return 0
91
+
92
+
93
+ def compare_versions(current: str, latest: str) -> int:
94
+ """1 if ``latest`` is newer, -1 if older, 0 if equal. PEP 440 when both parse, else semver."""
95
+ from packaging.version import InvalidVersion, Version
96
+
97
+ try:
98
+ c, n = Version(current), Version(latest)
99
+ except InvalidVersion:
100
+ return _semver_compare(current, latest)
101
+ return 1 if n > c else -1 if n < c else 0
102
+
103
+
104
+ def detect_install_method(prefix: str | None = None) -> InstallMethod:
105
+ """pipx and ``uv tool`` keep each tool in its own venv under a recognisable directory."""
106
+ parts = [p.lower() for p in os.path.normpath(prefix or sys.prefix).split(os.sep)]
107
+ for i, part in enumerate(parts[:-1]):
108
+ if part == "venvs" and i > 0 and "pipx" in parts[i - 1]:
109
+ return "pipx"
110
+ if part == "tools" and i > 0 and parts[i - 1] == "uv":
111
+ return "uv"
112
+ return "pip"
113
+
114
+
115
+ def get_install_command_display(method: InstallMethod | None = None) -> str:
116
+ method = method or detect_install_method()
117
+ if method == "pipx":
118
+ return f"pipx upgrade {PACKAGE_NAME}"
119
+ if method == "uv":
120
+ return f"uv tool upgrade {PACKAGE_NAME}"
121
+ return f"pip install -U {PACKAGE_NAME}"
122
+
123
+
124
+ def _run_pip_install() -> None:
125
+ subprocess.run(PIP_INSTALL_ARGS, check=True)
126
+
127
+
128
+ @dataclass
129
+ class UpdateResult:
130
+ status: UpdateStatus
131
+ current_version: str
132
+ latest_version: str
133
+ install_command: str | None = None
134
+
135
+
136
+ def handle_update(check_only: bool) -> UpdateResult:
137
+ latest = fetch_latest_version()
138
+ comparison = compare_versions(__version__, latest)
139
+ if comparison == 0:
140
+ return UpdateResult("up-to-date", __version__, latest)
141
+ if comparison < 0:
142
+ return UpdateResult("newer-local", __version__, latest)
143
+ if check_only:
144
+ return UpdateResult("update-available", __version__, latest)
145
+ method = detect_install_method()
146
+ if method != "pip":
147
+ return UpdateResult("manual-install", __version__, latest, get_install_command_display(method))
148
+ try:
149
+ _run_pip_install()
150
+ return UpdateResult("updated", __version__, latest)
151
+ except (OSError, subprocess.CalledProcessError):
152
+ return UpdateResult("update-failed", __version__, latest)
153
+
154
+
155
+ __all__ = [
156
+ "PIP_INSTALL_ARGS",
157
+ "PYPI_URL",
158
+ "UpdateResult",
159
+ "compare_versions",
160
+ "detect_install_method",
161
+ "fetch_latest_version",
162
+ "get_install_command_display",
163
+ "handle_update",
164
+ ]
@@ -0,0 +1,165 @@
1
+ """`agentcore validate` (port of src/cli/commands/validate)."""
2
+
3
+ import json
4
+ import os
5
+
6
+ import typer
7
+ from rich.console import Console
8
+
9
+ from agentcore.lib.errors.types import (
10
+ ConfigNotFoundError,
11
+ ConfigParseError,
12
+ ConfigReadError,
13
+ ConfigValidationError,
14
+ NoProjectError,
15
+ )
16
+ from agentcore.lib.result import Err, Ok
17
+ from agentcore.lib.schemas.io.config_io import ConfigIO
18
+ from agentcore.lib.schemas.io.path_resolver import find_config_root
19
+ from agentcore.lib.utils.credentials import SecureCredentials
20
+ from agentcore.lib.utils.env import read_env_file
21
+ from agentcore.operations.deploy.preflight import validate_harness_specs # noqa: E402
22
+ from agentcore.primitives.credential_utils import (
23
+ compute_payment_credential_env_var_names,
24
+ compute_stripe_privy_credential_env_var_names,
25
+ )
26
+
27
+ DESCRIPTION = "Validate agentcore/ config files."
28
+
29
+
30
+ def _expected_vars(connector) -> list[str]:
31
+ """Env vars a manual payment connector needs in .env.local."""
32
+ if (connector.provider or "CoinbaseCDP") == "StripePrivy":
33
+ v = compute_stripe_privy_credential_env_var_names(connector.credential_name)
34
+ return [v.app_id, v.app_secret, v.authorization_private_key, v.authorization_id]
35
+ v = compute_payment_credential_env_var_names(connector.credential_name)
36
+ return [v.api_key_id, v.api_key_secret, v.wallet_secret]
37
+
38
+
39
+ def _validate_payments(project_spec, config_root: str) -> Exception | None:
40
+ payments = project_spec.payments or []
41
+ if not payments:
42
+ return None
43
+
44
+ credentials = {c.name: c for c in reversed(project_spec.credentials or [])} # first match wins
45
+ for payment in payments:
46
+ if not payment.connectors:
47
+ return Exception(
48
+ f'Payment manager "{payment.name}" has no connectors. Add a connector with '
49
+ f"`agentcore add payment-connector --manager {payment.name}`"
50
+ )
51
+ for connector in payment.connectors:
52
+ if connector.provision_mode == "QUICK_CREATE":
53
+ continue
54
+ credential = credentials.get(connector.credential_name)
55
+ if credential is None:
56
+ return Exception(
57
+ f'Payment connector "{connector.name}" (manager "{payment.name}") references credential '
58
+ f'"{connector.credential_name}" which does not exist.'
59
+ )
60
+ if credential.authorizer_type != "PaymentCredentialProvider":
61
+ return Exception(
62
+ f'Payment connector "{connector.name}" references credential "{connector.credential_name}" '
63
+ f'with type "{credential.authorizer_type}" — expected "PaymentCredentialProvider".'
64
+ )
65
+ connector_provider = connector.provider or "CoinbaseCDP"
66
+ credential_provider = getattr(credential, "provider", None)
67
+ if credential_provider and credential_provider != connector_provider:
68
+ return Exception(
69
+ f'Payment connector "{connector.name}" uses provider "{connector_provider}" but credential '
70
+ f'"{connector.credential_name}" is configured for "{credential_provider}".'
71
+ )
72
+
73
+ manual = [c for p in payments for c in p.connectors if c.provision_mode != "QUICK_CREATE"]
74
+ env_path = os.path.join(config_root, ".env.local")
75
+ if manual and not os.path.exists(env_path):
76
+ expected = "\n".join(f" {name}" for c in manual for name in _expected_vars(c))
77
+ return Exception(
78
+ f"agentcore/.env.local not found. Payment credentials required:\n{expected}\n\n"
79
+ "Run 'agentcore add payment-connector --manager <name>' to set credentials interactively."
80
+ )
81
+ if os.path.exists(env_path):
82
+ try:
83
+ creds = SecureCredentials.from_env_vars(read_env_file(config_root))
84
+ except Exception as exc: # noqa: BLE001
85
+ return Exception(
86
+ f"Failed to read .env.local: {exc}. Fix the file or re-run 'agentcore add payment-connector' "
87
+ "to set credentials."
88
+ )
89
+ for payment in payments:
90
+ for connector in payment.connectors:
91
+ if connector.provision_mode == "QUICK_CREATE":
92
+ continue
93
+ missing = [name for name in _expected_vars(connector) if not (creds.get(name) or "").strip()]
94
+ if missing:
95
+ provider = connector.provider or "CoinbaseCDP"
96
+ return Exception(
97
+ f'Missing {provider} credentials for connector "{connector.name}" in .env.local: '
98
+ + ", ".join(missing)
99
+ )
100
+ return None
101
+
102
+
103
+ def _format_error(err: Exception, file_name: str) -> str:
104
+ if isinstance(err, ConfigValidationError):
105
+ return str(err)
106
+ cause = err.__cause__ if err.__cause__ is not None else err
107
+ if isinstance(err, ConfigParseError):
108
+ return f"Invalid JSON in {file_name}: {cause}"
109
+ if isinstance(err, ConfigReadError):
110
+ return f"Failed to read {file_name}: {cause}"
111
+ if isinstance(err, ConfigNotFoundError):
112
+ return f"Required file not found: {file_name}"
113
+ return str(err)
114
+
115
+
116
+ def handle_validate(directory: str | None = None) -> Ok[None] | Err[Exception]:
117
+ config_root = find_config_root(directory or os.getcwd())
118
+ if not config_root:
119
+ return Err(NoProjectError())
120
+
121
+ io = ConfigIO(base_dir=config_root)
122
+ try:
123
+ project_spec = io.read_project_spec()
124
+ except Exception as exc: # noqa: BLE001
125
+ return Err(Exception(_format_error(exc, "agentcore.json")))
126
+
127
+ if payment_error := _validate_payments(project_spec, config_root):
128
+ return Err(payment_error)
129
+
130
+ try:
131
+ io.read_aws_deployment_targets()
132
+ except Exception as exc: # noqa: BLE001
133
+ return Err(Exception(_format_error(exc, "aws-targets.json")))
134
+
135
+ if io.config_exists("state"):
136
+ try:
137
+ io.read_deployed_state()
138
+ except Exception as exc: # noqa: BLE001
139
+ return Err(Exception(_format_error(exc, ".cli/state.json")))
140
+
141
+ try:
142
+ validate_harness_specs(project_spec, config_root)
143
+ except Exception as exc: # noqa: BLE001
144
+ return Err(exc)
145
+
146
+ return Ok(None)
147
+
148
+
149
+ def register(app: typer.Typer) -> None:
150
+ @app.command("validate", help=DESCRIPTION)
151
+ def validate(
152
+ directory: str | None = typer.Option(
153
+ None, "-d", "--directory", help="Project directory containing agentcore config"
154
+ ),
155
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
156
+ ) -> None:
157
+ result = handle_validate(directory)
158
+ if as_json:
159
+ payload = {"success": True} if result.success else {"success": False, "error": str(result.error)}
160
+ typer.echo(json.dumps(payload, separators=(",", ":")))
161
+ elif result.success:
162
+ Console().print("[green]Valid[/green]")
163
+ else:
164
+ Console().print(str(result.error), style="red", markup=False, highlight=False, soft_wrap=True)
165
+ raise typer.Exit(0 if result.success else 1)