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,154 @@
1
+ """JWT authorizer flag validation (port of src/cli/commands/add/auth-options.ts).
2
+
3
+ ``options`` is a dict keyed by upstream option names (discoveryUrl, allowedAudience, ...).
4
+ """
5
+
6
+ from typing import Any
7
+ from urllib.parse import urlsplit
8
+
9
+ from agentcore.cli.commands.add._common import ValidationResult, first_issue, js_url_ok, parse_json
10
+ from agentcore.schema import CustomClaimValidation, PrivateEndpoint, PrivateEndpointOverride
11
+
12
+ OIDC_WELL_KNOWN_SUFFIX = "/.well-known/openid-configuration"
13
+
14
+
15
+ def _s(options: dict[str, Any], key: str) -> str:
16
+ value = options.get(key)
17
+ return value.strip() if isinstance(value, str) else ""
18
+
19
+
20
+ def validate_jwt_authorizer_options(options: dict[str, Any]) -> ValidationResult:
21
+ discovery_url = options.get("discoveryUrl")
22
+ if not discovery_url:
23
+ return ValidationResult(False, "--discovery-url is required for CUSTOM_JWT authorizer")
24
+ if not js_url_ok(discovery_url):
25
+ return ValidationResult(False, "Discovery URL must be a valid URL")
26
+ if urlsplit(discovery_url).scheme.lower() != "https":
27
+ return ValidationResult(False, "Discovery URL must use HTTPS")
28
+ if not discovery_url.endswith(OIDC_WELL_KNOWN_SUFFIX):
29
+ return ValidationResult(False, f"Discovery URL must end with {OIDC_WELL_KNOWN_SUFFIX}")
30
+
31
+ custom_claims = options.get("customClaims")
32
+ if custom_claims:
33
+ ok, parsed = parse_json(custom_claims)
34
+ if not ok:
35
+ return ValidationResult(False, "--custom-claims must be valid JSON")
36
+ if not isinstance(parsed, list) or len(parsed) == 0:
37
+ return ValidationResult(False, "--custom-claims must be a non-empty JSON array")
38
+ for i, entry in enumerate(parsed):
39
+ issue = first_issue(CustomClaimValidation, entry)
40
+ if issue:
41
+ return ValidationResult(False, f"Invalid custom claim at index {i}: {issue}")
42
+
43
+ if not any(_s(options, k) for k in ("allowedAudience", "allowedClients", "allowedScopes", "customClaims")):
44
+ return ValidationResult(
45
+ False,
46
+ "At least one of --allowed-audience, --allowed-clients, --allowed-scopes, or --custom-claims must be "
47
+ "provided for CUSTOM_JWT authorizer",
48
+ )
49
+
50
+ if bool(options.get("clientId")) != bool(options.get("clientSecret")):
51
+ return ValidationResult(False, "Both --client-id and --client-secret must be provided together")
52
+
53
+ return _validate_private_endpoint_options(options)
54
+
55
+
56
+ def _split(value: str) -> list[str]:
57
+ return [s.strip() for s in value.split(",")]
58
+
59
+
60
+ def _validate_private_endpoint_options(options: dict[str, Any]) -> ValidationResult:
61
+ has_lattice = bool(_s(options, "privateEndpointLatticeArn"))
62
+ has_vpc = bool(_s(options, "privateEndpointVpcId"))
63
+
64
+ if has_lattice and has_vpc:
65
+ return ValidationResult(
66
+ False,
67
+ "--private-endpoint-lattice-arn and --private-endpoint-vpc-id are mutually exclusive (a private endpoint "
68
+ "is one of VPC Lattice or a managed VPC endpoint)",
69
+ )
70
+ vpc_sub_flags = (
71
+ "privateEndpointSubnets",
72
+ "privateEndpointIpType",
73
+ "privateEndpointSecurityGroups",
74
+ "privateEndpointRoutingDomain",
75
+ "privateEndpointTags",
76
+ )
77
+ if not has_vpc and any(_s(options, k) for k in vpc_sub_flags):
78
+ return ValidationResult(False, "--private-endpoint-* VPC flags require --private-endpoint-vpc-id")
79
+
80
+ if has_lattice:
81
+ issue = first_issue(
82
+ PrivateEndpoint,
83
+ {"selfManagedLatticeResource": {"resourceConfigurationIdentifier": options["privateEndpointLatticeArn"]}},
84
+ )
85
+ if issue:
86
+ return ValidationResult(False, f"Invalid --private-endpoint-lattice-arn: {issue}")
87
+
88
+ if has_vpc:
89
+ if not _s(options, "privateEndpointSubnets"):
90
+ return ValidationResult(False, "--private-endpoint-subnets is required with --private-endpoint-vpc-id")
91
+ if not _s(options, "privateEndpointIpType"):
92
+ return ValidationResult(
93
+ False, "--private-endpoint-ip-type (IPV4 or IPV6) is required with --private-endpoint-vpc-id"
94
+ )
95
+ tags: Any = None
96
+ has_tags = False
97
+ if options.get("privateEndpointTags"):
98
+ ok, tags = parse_json(options["privateEndpointTags"])
99
+ if not ok:
100
+ return ValidationResult(False, "--private-endpoint-tags must be valid JSON")
101
+ has_tags = True
102
+ resource: dict[str, Any] = {
103
+ "vpcIdentifier": options["privateEndpointVpcId"],
104
+ "subnetIds": _split(options["privateEndpointSubnets"]),
105
+ "endpointIpAddressType": options["privateEndpointIpType"],
106
+ }
107
+ if options.get("privateEndpointSecurityGroups"):
108
+ resource["securityGroupIds"] = _split(options["privateEndpointSecurityGroups"])
109
+ if options.get("privateEndpointRoutingDomain"):
110
+ resource["routingDomain"] = options["privateEndpointRoutingDomain"]
111
+ if has_tags:
112
+ resource["tags"] = tags
113
+ issue = first_issue(PrivateEndpoint, {"managedVpcResource": resource})
114
+ if issue:
115
+ return ValidationResult(False, f"Invalid managed-VPC private endpoint: {issue}")
116
+
117
+ overrides_raw = options.get("privateEndpointOverrides")
118
+ if overrides_raw:
119
+ ok, parsed = parse_json(overrides_raw)
120
+ if not ok:
121
+ return ValidationResult(False, "--private-endpoint-overrides must be valid JSON")
122
+ if not isinstance(parsed, list):
123
+ return ValidationResult(False, "--private-endpoint-overrides must be a JSON array")
124
+ if len(parsed) > 5:
125
+ return ValidationResult(False, "--private-endpoint-overrides allows at most 5 entries")
126
+ if not has_lattice and not has_vpc:
127
+ return ValidationResult(
128
+ False,
129
+ "--private-endpoint-overrides requires a base private endpoint (--private-endpoint-lattice-arn or "
130
+ "--private-endpoint-vpc-id)",
131
+ )
132
+ base_arm = "selfManagedLatticeResource" if has_lattice else "managedVpcResource"
133
+ seen: set[str] = set()
134
+ for i, entry in enumerate(parsed):
135
+ issue = first_issue(PrivateEndpointOverride, entry)
136
+ if issue:
137
+ return ValidationResult(False, f"Invalid private-endpoint override at index {i}: {issue}")
138
+ override = PrivateEndpointOverride.model_validate(entry)
139
+ arm = (
140
+ "selfManagedLatticeResource"
141
+ if override.private_endpoint.self_managed_lattice_resource
142
+ else "managedVpcResource"
143
+ )
144
+ if arm != base_arm:
145
+ kind = "VPC Lattice" if base_arm == "selfManagedLatticeResource" else "managed VPC"
146
+ return ValidationResult(
147
+ False,
148
+ f"Private-endpoint override at index {i} must be the same kind as the base endpoint (all {kind})",
149
+ )
150
+ if override.domain in seen:
151
+ return ValidationResult(False, f"Duplicate private-endpoint override domain: {override.domain}")
152
+ seen.add(override.domain)
153
+
154
+ return ValidationResult(True)
@@ -0,0 +1,105 @@
1
+ """`add skill` logic (port of src/cli/commands/add/skill-action.ts).
2
+
3
+ Upstream records the skill source in harness.json; nothing is fetched or cloned at add time.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass
9
+ from typing import Any
10
+
11
+ from agentcore.lib.errors.types import ValidationError
12
+ from agentcore.lib.result import Err, Ok
13
+ from agentcore.lib.schemas.io.config_io import ConfigIO, to_jsonable
14
+ from agentcore.operations.harness.skill_utils import get_skill_key, validate_git_skill_credential
15
+
16
+
17
+ @dataclass
18
+ class AddSkillOptions:
19
+ harness: str
20
+ path: str | None = None
21
+ s3: str | None = None
22
+ git: str | None = None
23
+ git_path: str | None = None
24
+ credential_name: str | None = None
25
+ username: str | None = None
26
+ aws_skills: str | bool | None = None
27
+
28
+
29
+ def handle_add_skill(
30
+ options: AddSkillOptions, config_io: ConfigIO | None = None
31
+ ) -> Ok[dict[str, Any]] | Err[Exception]:
32
+ harness = options.harness
33
+ git_only = [
34
+ flag
35
+ for flag, value in (
36
+ ("--git-path", options.git_path),
37
+ ("--credential", options.credential_name),
38
+ ("--username", options.username),
39
+ )
40
+ if value
41
+ ]
42
+ if git_only and not options.git:
43
+ return Err(ValidationError(f"{', '.join(git_only)} can only be used with --git"))
44
+
45
+ if sum(1 for s in (options.path, options.s3, options.git, options.aws_skills) if s) != 1:
46
+ return Err(ValidationError("Exactly one of --path, --s3, --git, or --aws-skills is required"))
47
+ if options.s3 and not options.s3.startswith("s3://"):
48
+ return Err(ValidationError("--s3 must be an S3 URI starting with s3://"))
49
+ if options.git and not options.git.startswith("https://"):
50
+ return Err(ValidationError("--git must be an HTTPS URL starting with https://"))
51
+
52
+ io = config_io or ConfigIO()
53
+ try:
54
+ spec = to_jsonable(io.read_harness_spec(harness))
55
+ except Exception: # noqa: BLE001
56
+ return Err(
57
+ ValidationError(f"Harness '{harness}' not found. Check the name or run 'agentcore add harness' first.")
58
+ )
59
+
60
+ if options.credential_name:
61
+ try:
62
+ project = io.read_project_spec()
63
+ except Exception: # noqa: BLE001
64
+ return Err(
65
+ ValidationError("Could not read project configuration. Ensure agentcore.json exists and is valid.")
66
+ )
67
+ validation = validate_git_skill_credential(project, options.credential_name)
68
+ if not validation.success:
69
+ return validation
70
+
71
+ entry: dict[str, Any]
72
+ if options.path:
73
+ entry, source = {"path": options.path}, options.path
74
+ elif options.s3:
75
+ entry, source = {"s3Uri": options.s3}, options.s3
76
+ elif options.git:
77
+ entry = {"gitUrl": options.git}
78
+ if options.git_path:
79
+ entry["path"] = options.git_path
80
+ if options.credential_name:
81
+ auth = {"credentialName": options.credential_name}
82
+ if options.username:
83
+ auth["username"] = options.username
84
+ entry["auth"] = auth
85
+ source = f"{options.git} (path: {options.git_path})" if options.git_path else options.git
86
+ else:
87
+ paths = (
88
+ None
89
+ if options.aws_skills is True
90
+ else sorted(s.strip() for s in str(options.aws_skills).split(",") if s.strip())
91
+ )
92
+ # JS truthiness: an empty (filtered) list is still truthy, so it is written as `paths: []`.
93
+ entry = {"awsSkills": {} if paths is None else {"paths": paths}}
94
+ source = "aws-skills (all)" if paths is None else f"aws-skills ({', '.join(paths)})"
95
+
96
+ new_key = get_skill_key(entry)
97
+ if any(get_skill_key(s) == new_key for s in spec.get("skills") or []):
98
+ return Err(ValidationError(f"Skill '{source}' already exists in harness '{harness}'"))
99
+
100
+ spec.setdefault("skills", []).append(entry)
101
+ io.write_harness_spec(harness, spec)
102
+ return Ok({"harnessName": harness, "skillSource": source})
103
+
104
+
105
+ __all__ = ["AddSkillOptions", "handle_add_skill"]
@@ -0,0 +1,87 @@
1
+ """`agentcore add skill` (port of src/cli/commands/add/skill-command.ts)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+
7
+ import typer
8
+
9
+ from agentcore.cli.commands.add._commander import (
10
+ optional_value,
11
+ optional_value_command,
12
+ require_options,
13
+ require_project,
14
+ )
15
+ from agentcore.cli.commands.add.skill_action import AddSkillOptions, handle_add_skill
16
+ from agentcore.cli.errors import get_error_message
17
+
18
+
19
+ def _dump(payload: dict) -> str:
20
+ return json.dumps(payload, separators=(",", ":"))
21
+
22
+
23
+ def register_add_skill(add_app: typer.Typer) -> None:
24
+ @add_app.command("skill", help="Add a skill to a harness", cls=optional_value_command("--aws-skills"))
25
+ def add_skill(
26
+ harness: str | None = typer.Option(None, "--harness", help="Target harness name"),
27
+ path: str | None = typer.Option(None, "--path", help="Path to an installed skill in the environment"),
28
+ s3: str | None = typer.Option(None, "--s3", help="S3 URI (s3://bucket/path)"),
29
+ git: str | None = typer.Option(None, "--git", help="HTTPS git repository URL"),
30
+ git_path: str | None = typer.Option(None, "--git-path", help="Subdirectory within the git repo (for --git)"),
31
+ credential: str | None = typer.Option(
32
+ None, "--credential", help="Name of an API key credential in the project (for git auth)"
33
+ ),
34
+ username: str | None = typer.Option(None, "--username", help="Username for git auth (for --git)"),
35
+ aws_skills: str | None = typer.Option(
36
+ None,
37
+ "--aws-skills",
38
+ metavar="[PATHS]",
39
+ help="Add built-in AWS skills (comma-separated paths, or omit for all)",
40
+ ),
41
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
42
+ ) -> None:
43
+ require_options(("--harness <name>", harness))
44
+ require_project()
45
+ try:
46
+ result = handle_add_skill(
47
+ AddSkillOptions(
48
+ harness=harness or "",
49
+ path=path,
50
+ s3=s3,
51
+ git=git,
52
+ git_path=git_path,
53
+ credential_name=credential,
54
+ username=username,
55
+ aws_skills=optional_value(aws_skills),
56
+ )
57
+ )
58
+ if not result.success:
59
+ if as_json:
60
+ typer.echo(_dump({"success": False, "error": get_error_message(result.error)}))
61
+ else:
62
+ typer.echo(get_error_message(result.error), err=True)
63
+ raise typer.Exit(1)
64
+ if as_json:
65
+ typer.echo(
66
+ _dump(
67
+ {
68
+ "success": True,
69
+ "harnessName": result.value["harnessName"],
70
+ "skillSource": result.value["skillSource"],
71
+ }
72
+ )
73
+ )
74
+ else:
75
+ typer.echo(f"Added skill '{result.value['skillSource']}' to harness '{result.value['harnessName']}'.")
76
+ typer.echo("Run 'agentcore deploy' to apply changes.")
77
+ except typer.Exit:
78
+ raise
79
+ except Exception as exc: # noqa: BLE001
80
+ if as_json:
81
+ typer.echo(_dump({"success": False, "error": get_error_message(exc)}))
82
+ else:
83
+ typer.echo(get_error_message(exc), err=True)
84
+ raise typer.Exit(1) from None
85
+
86
+
87
+ __all__ = ["register_add_skill"]
@@ -0,0 +1,160 @@
1
+ """`add tool` logic (port of src/cli/commands/add/tool-action.ts).
2
+
3
+ Results are plain dicts shaped like upstream's ``AddToolResult`` (``success``, ``error``,
4
+ ``harnessName``, ``toolName``).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import re
11
+ from dataclasses import dataclass
12
+ from typing import Any
13
+
14
+ from agentcore.lib.schemas.io.config_io import ConfigIO, to_jsonable
15
+ from agentcore.primitives.deployed_gateways import find_deployed_gateway
16
+
17
+ VALID_OUTBOUND_AUTH_TYPES = ("awsIam", "none", "oauth")
18
+ VALID_GRANT_TYPES = ("CLIENT_CREDENTIALS", "USER_FEDERATION")
19
+ ARN_PATTERN = re.compile(r"^arn:[^:]+:")
20
+ VALID_TOOL_TYPES = (
21
+ "agentcore_browser",
22
+ "agentcore_code_interpreter",
23
+ "remote_mcp",
24
+ "agentcore_gateway",
25
+ "inline_function",
26
+ )
27
+
28
+
29
+ @dataclass
30
+ class AddToolOptions:
31
+ harness: str
32
+ type: str
33
+ name: str
34
+ url: str | None = None
35
+ browser_arn: str | None = None
36
+ code_interpreter_arn: str | None = None
37
+ gateway_arn: str | None = None
38
+ gateway: str | None = None
39
+ outbound_auth: str | None = None
40
+ provider_arn: str | None = None
41
+ scopes: str | None = None
42
+ grant_type: str | None = None
43
+ description: str | None = None
44
+ input_schema: str | None = None
45
+ json: bool | None = None
46
+
47
+
48
+ def _fail(error: str) -> dict[str, Any]:
49
+ return {"success": False, "error": error}
50
+
51
+
52
+ def handle_add_tool(options: AddToolOptions, config_io: ConfigIO | None = None) -> dict[str, Any]:
53
+ harness, tool_type, name = options.harness, options.type, options.name
54
+
55
+ if tool_type not in VALID_TOOL_TYPES:
56
+ return _fail(f"Invalid tool type '{tool_type}'. Valid types: {', '.join(VALID_TOOL_TYPES)}")
57
+ if tool_type == "remote_mcp" and not options.url:
58
+ return _fail("--url is required for remote_mcp tools")
59
+ if tool_type == "agentcore_gateway" and not options.gateway_arn and not options.gateway:
60
+ return _fail("--gateway-arn or --gateway is required for agentcore_gateway tools")
61
+
62
+ if (options.description is not None or options.input_schema is not None) and tool_type != "inline_function":
63
+ return _fail("--description and --input-schema are only valid for inline_function tools")
64
+ inline_schema: dict[str, Any] | None = None
65
+ if tool_type == "inline_function":
66
+ if not options.description:
67
+ return _fail("--description is required for inline_function tools")
68
+ if not options.input_schema:
69
+ return _fail("--input-schema is required for inline_function tools")
70
+ raw = options.input_schema
71
+ if raw.startswith("@"):
72
+ path = raw[1:]
73
+ try:
74
+ with open(path, encoding="utf-8") as fh:
75
+ raw = fh.read()
76
+ except (OSError, UnicodeDecodeError):
77
+ return _fail(f"Could not read --input-schema file: {path}")
78
+ try:
79
+ parsed = json.loads(raw)
80
+ except ValueError:
81
+ return _fail("--input-schema is not valid JSON")
82
+ if not isinstance(parsed, dict):
83
+ return _fail("--input-schema must be a JSON object (a JSON Schema for the tool input)")
84
+ inline_schema = parsed
85
+
86
+ outbound: dict[str, Any] | None = None
87
+ if options.outbound_auth is not None:
88
+ if tool_type != "agentcore_gateway":
89
+ return _fail("--outbound-auth is only valid for agentcore_gateway tools")
90
+ if options.outbound_auth not in VALID_OUTBOUND_AUTH_TYPES:
91
+ return _fail(
92
+ f"Invalid --outbound-auth '{options.outbound_auth}'. Valid: {', '.join(VALID_OUTBOUND_AUTH_TYPES)}"
93
+ )
94
+ if options.outbound_auth in ("awsIam", "none"):
95
+ if options.provider_arn or options.scopes or options.grant_type:
96
+ return _fail("--provider-arn, --scopes, and --grant-type are only valid with --outbound-auth oauth")
97
+ outbound = {"awsIam": {}} if options.outbound_auth == "awsIam" else {"none": {}}
98
+ else:
99
+ if not options.provider_arn:
100
+ return _fail("--provider-arn is required when --outbound-auth oauth")
101
+ if not ARN_PATTERN.match(options.provider_arn):
102
+ return _fail(f"Invalid --provider-arn '{options.provider_arn}': must be a valid ARN")
103
+ if not options.scopes:
104
+ return _fail("--scopes is required when --outbound-auth oauth")
105
+ scopes = [s.strip() for s in options.scopes.split(",") if s.strip()]
106
+ if not scopes:
107
+ return _fail("--scopes must contain at least one scope")
108
+ if options.grant_type is not None and options.grant_type not in VALID_GRANT_TYPES:
109
+ return _fail(f"Invalid --grant-type '{options.grant_type}'. Valid: {', '.join(VALID_GRANT_TYPES)}")
110
+ oauth: dict[str, Any] = {"providerArn": options.provider_arn, "scopes": scopes}
111
+ if options.grant_type:
112
+ oauth["grantType"] = options.grant_type
113
+ outbound = {"oauth": oauth}
114
+
115
+ io = config_io or ConfigIO()
116
+
117
+ resolved_gateway_arn = options.gateway_arn
118
+ if tool_type == "agentcore_gateway" and options.gateway and not resolved_gateway_arn:
119
+ try:
120
+ state = io.read_deployed_state()
121
+ gateway_state = find_deployed_gateway(state, options.gateway)
122
+ except Exception: # noqa: BLE001
123
+ return _fail("Could not read deployed state. Deploy the gateway first or use --gateway-arn.")
124
+ if not gateway_state:
125
+ return _fail(
126
+ f"Gateway '{options.gateway}' not found in deployed state. Deploy it first or use --gateway-arn."
127
+ )
128
+ resolved_gateway_arn = (
129
+ gateway_state.get("gatewayArn") if isinstance(gateway_state, dict) else gateway_state.gateway_arn
130
+ )
131
+
132
+ try:
133
+ spec = to_jsonable(io.read_harness_spec(harness))
134
+ except Exception: # noqa: BLE001
135
+ return _fail(f"Harness '{harness}' not found. Check the name or run 'agentcore add harness' first.")
136
+
137
+ if any(t.get("name") == name for t in spec.get("tools") or []):
138
+ return _fail(f"Tool '{name}' already exists in harness '{harness}'")
139
+
140
+ entry: dict[str, Any] = {"type": tool_type, "name": name}
141
+ if tool_type == "remote_mcp":
142
+ entry["config"] = {"remoteMcp": {"url": options.url}}
143
+ elif tool_type == "agentcore_browser" and options.browser_arn:
144
+ entry["config"] = {"agentCoreBrowser": {"browserArn": options.browser_arn}}
145
+ elif tool_type == "agentcore_code_interpreter" and options.code_interpreter_arn:
146
+ entry["config"] = {"agentCoreCodeInterpreter": {"codeInterpreterArn": options.code_interpreter_arn}}
147
+ elif tool_type == "agentcore_gateway":
148
+ gateway: dict[str, Any] = {"gatewayArn": resolved_gateway_arn}
149
+ if outbound:
150
+ gateway["outboundAuth"] = outbound
151
+ entry["config"] = {"agentCoreGateway": gateway}
152
+ elif tool_type == "inline_function":
153
+ entry["config"] = {"inlineFunction": {"description": options.description, "inputSchema": inline_schema}}
154
+
155
+ spec.setdefault("tools", []).append(entry)
156
+ io.write_harness_spec(harness, spec)
157
+ return {"success": True, "harnessName": harness, "toolName": name}
158
+
159
+
160
+ __all__ = ["VALID_TOOL_TYPES", "AddToolOptions", "handle_add_tool"]
@@ -0,0 +1,117 @@
1
+ """`agentcore add tool` (port of src/cli/commands/add/tool-command.ts)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+
7
+ import typer
8
+
9
+ from agentcore.cli.commands.add._commander import require_options, require_project
10
+ from agentcore.cli.commands.add.tool_action import AddToolOptions, handle_add_tool
11
+ from agentcore.cli.errors import get_error_message
12
+
13
+
14
+ def _dump(payload: dict) -> str:
15
+ return json.dumps({k: v for k, v in payload.items() if v is not None}, separators=(",", ":"))
16
+
17
+
18
+ def register_add_tool(add_app: typer.Typer) -> None:
19
+ @add_app.command("tool", help="Add a tool to a harness")
20
+ def add_tool(
21
+ harness: str | None = typer.Option(None, "--harness", help="Target harness name"),
22
+ type_: str | None = typer.Option(
23
+ None,
24
+ "--type",
25
+ help="Tool type: agentcore_browser, agentcore_code_interpreter, remote_mcp, agentcore_gateway, "
26
+ "inline_function",
27
+ ),
28
+ name: str | None = typer.Option(None, "--name", help="Tool name"),
29
+ url: str | None = typer.Option(None, "--url", help="MCP server URL (required for remote_mcp)"),
30
+ browser_arn: str | None = typer.Option(
31
+ None, "--browser-arn", help="Custom browser ARN (optional for agentcore_browser)"
32
+ ),
33
+ code_interpreter_arn: str | None = typer.Option(
34
+ None,
35
+ "--code-interpreter-arn",
36
+ help="Custom code interpreter ARN (optional for agentcore_code_interpreter)",
37
+ ),
38
+ gateway_arn: str | None = typer.Option(None, "--gateway-arn", help="Gateway ARN (for agentcore_gateway)"),
39
+ gateway: str | None = typer.Option(
40
+ None,
41
+ "--gateway",
42
+ help="Project gateway name — resolves ARN from deployed state (for agentcore_gateway)",
43
+ ),
44
+ outbound_auth: str | None = typer.Option(
45
+ None,
46
+ "--outbound-auth",
47
+ help="Gateway outbound auth: awsIam, none, or oauth (default: awsIam if omitted) [agentcore_gateway]",
48
+ ),
49
+ provider_arn: str | None = typer.Option(
50
+ None, "--provider-arn", help="OAuth credential provider ARN (required when --outbound-auth oauth)"
51
+ ),
52
+ scopes: str | None = typer.Option(
53
+ None,
54
+ "--scopes",
55
+ help='Comma-separated OAuth scopes (required when --outbound-auth oauth), e.g. "openid,profile" or '
56
+ '"https://api.example.com/read"',
57
+ ),
58
+ grant_type: str | None = typer.Option(
59
+ None,
60
+ "--grant-type",
61
+ help="OAuth grant type: CLIENT_CREDENTIALS or USER_FEDERATION (for --outbound-auth oauth)",
62
+ ),
63
+ description: str | None = typer.Option(
64
+ None, "--description", help="Tool description shown to the model (required for inline_function)"
65
+ ),
66
+ input_schema: str | None = typer.Option(
67
+ None,
68
+ "--input-schema",
69
+ help="JSON Schema for the tool input, as a JSON string or @path/to/schema.json (required for "
70
+ "inline_function)",
71
+ ),
72
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON"),
73
+ ) -> None:
74
+ require_options(("--harness <name>", harness), ("--type <type>", type_), ("--name <name>", name))
75
+ require_project()
76
+ try:
77
+ result = handle_add_tool(
78
+ AddToolOptions(
79
+ harness=harness or "",
80
+ type=type_ or "",
81
+ name=name or "",
82
+ url=url,
83
+ browser_arn=browser_arn,
84
+ code_interpreter_arn=code_interpreter_arn,
85
+ gateway_arn=gateway_arn,
86
+ gateway=gateway,
87
+ outbound_auth=outbound_auth,
88
+ provider_arn=provider_arn,
89
+ scopes=scopes,
90
+ grant_type=grant_type,
91
+ description=description,
92
+ input_schema=input_schema,
93
+ json=as_json,
94
+ )
95
+ )
96
+ if not result["success"]:
97
+ if as_json:
98
+ typer.echo(_dump(result))
99
+ else:
100
+ typer.echo(result["error"], err=True)
101
+ raise typer.Exit(1)
102
+ if as_json:
103
+ typer.echo(_dump(result))
104
+ else:
105
+ typer.echo(f"Added tool '{result['toolName']}' to harness '{result['harnessName']}'.")
106
+ typer.echo("Run 'agentcore deploy' to apply changes.")
107
+ except typer.Exit:
108
+ raise
109
+ except Exception as exc: # noqa: BLE001
110
+ if as_json:
111
+ typer.echo(_dump({"success": False, "error": get_error_message(exc)}))
112
+ else:
113
+ typer.echo(get_error_message(exc), err=True)
114
+ raise typer.Exit(1) from None
115
+
116
+
117
+ __all__ = ["register_add_tool"]