alloy-runtime-cli 0.1.0__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 (451) hide show
  1. alloy_runtime_cli-0.1.0.dist-info/METADATA +61 -0
  2. alloy_runtime_cli-0.1.0.dist-info/RECORD +451 -0
  3. alloy_runtime_cli-0.1.0.dist-info/WHEEL +5 -0
  4. alloy_runtime_cli-0.1.0.dist-info/entry_points.txt +2 -0
  5. alloy_runtime_cli-0.1.0.dist-info/top_level.txt +1 -0
  6. cli/__init__.py +0 -0
  7. cli/commands/__init__.py +0 -0
  8. cli/commands/admin/__init__.py +0 -0
  9. cli/commands/admin/bootstrap_command.py +118 -0
  10. cli/commands/admin/credentials/__init__.py +0 -0
  11. cli/commands/admin/credentials/create/__init__.py +0 -0
  12. cli/commands/admin/credentials/create/command.py +148 -0
  13. cli/commands/admin/credentials/create/presenter.py +16 -0
  14. cli/commands/admin/credentials/grant/__init__.py +0 -0
  15. cli/commands/admin/credentials/grant/command.py +119 -0
  16. cli/commands/admin/credentials/grant/fields.py +33 -0
  17. cli/commands/admin/credentials/grant/presenter.py +23 -0
  18. cli/commands/agents/__init__.py +0 -0
  19. cli/commands/agents/create/__init__.py +0 -0
  20. cli/commands/agents/create/command.py +475 -0
  21. cli/commands/agents/create/fields.py +64 -0
  22. cli/commands/agents/create/presenter.py +68 -0
  23. cli/commands/agents/delete/__init__.py +0 -0
  24. cli/commands/agents/delete/command.py +47 -0
  25. cli/commands/agents/delete/presenter.py +16 -0
  26. cli/commands/agents/get/command.py +37 -0
  27. cli/commands/agents/get/presenter.py +32 -0
  28. cli/commands/agents/list/__init__.py +1 -0
  29. cli/commands/agents/list/command.py +54 -0
  30. cli/commands/agents/list/presenter.py +82 -0
  31. cli/commands/agents/update/__init__.py +0 -0
  32. cli/commands/agents/update/command.py +435 -0
  33. cli/commands/agents/update/fields.py +40 -0
  34. cli/commands/agents/update/presenter.py +68 -0
  35. cli/commands/audio/__init__.py +0 -0
  36. cli/commands/audio/transcribe/__init__.py +0 -0
  37. cli/commands/audio/transcribe/command.py +144 -0
  38. cli/commands/audio/transcribe/presenter.py +15 -0
  39. cli/commands/auth/__init__.py +0 -0
  40. cli/commands/auth/login/__init__.py +0 -0
  41. cli/commands/auth/login/command.py +80 -0
  42. cli/commands/auth/signup/__init__.py +0 -0
  43. cli/commands/auth/signup/command.py +115 -0
  44. cli/commands/billing/__init__.py +1 -0
  45. cli/commands/billing/costs/__init__.py +1 -0
  46. cli/commands/billing/costs/by_agent/__init__.py +1 -0
  47. cli/commands/billing/costs/by_agent/command.py +57 -0
  48. cli/commands/billing/costs/by_agent/presenter.py +81 -0
  49. cli/commands/billing/costs/by_model/__init__.py +1 -0
  50. cli/commands/billing/costs/by_model/command.py +57 -0
  51. cli/commands/billing/costs/by_model/presenter.py +80 -0
  52. cli/commands/billing/costs/daily/__init__.py +1 -0
  53. cli/commands/billing/costs/daily/command.py +55 -0
  54. cli/commands/billing/costs/daily/presenter.py +75 -0
  55. cli/commands/billing/costs/summary/__init__.py +1 -0
  56. cli/commands/billing/costs/summary/command.py +57 -0
  57. cli/commands/billing/costs/summary/presenter.py +42 -0
  58. cli/commands/billing/projects/__init__.py +1 -0
  59. cli/commands/billing/projects/create/__init__.py +1 -0
  60. cli/commands/billing/projects/create/command.py +60 -0
  61. cli/commands/billing/projects/create/presenter.py +26 -0
  62. cli/commands/billing/projects/get/__init__.py +1 -0
  63. cli/commands/billing/projects/get/command.py +33 -0
  64. cli/commands/billing/projects/get/presenter.py +32 -0
  65. cli/commands/billing/projects/list/__init__.py +1 -0
  66. cli/commands/billing/projects/list/command.py +40 -0
  67. cli/commands/billing/projects/list/presenter.py +57 -0
  68. cli/commands/content/__init__.py +1 -0
  69. cli/commands/content/delete/__init__.py +0 -0
  70. cli/commands/content/delete/command.py +49 -0
  71. cli/commands/content/delete/presenter.py +18 -0
  72. cli/commands/content/edit/__init__.py +1 -0
  73. cli/commands/content/edit/command.py +155 -0
  74. cli/commands/content/edit/editor.py +150 -0
  75. cli/commands/content/edit/presenter.py +146 -0
  76. cli/commands/content/get/__init__.py +1 -0
  77. cli/commands/content/get/command.py +39 -0
  78. cli/commands/content/get/presenter.py +176 -0
  79. cli/commands/content/list/__init__.py +1 -0
  80. cli/commands/content/list/command.py +347 -0
  81. cli/commands/content/list/export_formatters.py +409 -0
  82. cli/commands/content/list/export_handler.py +165 -0
  83. cli/commands/content/list/presenter.py +190 -0
  84. cli/commands/credentials/__init__.py +0 -0
  85. cli/commands/credentials/create/__init__.py +0 -0
  86. cli/commands/credentials/create/command.py +165 -0
  87. cli/commands/credentials/create/fields.py +38 -0
  88. cli/commands/credentials/create/presenter.py +20 -0
  89. cli/commands/credentials/update/__init__.py +0 -0
  90. cli/commands/credentials/update/command.py +53 -0
  91. cli/commands/credentials/update/fields.py +71 -0
  92. cli/commands/credentials/update/presenter.py +16 -0
  93. cli/commands/flag_utils.py +366 -0
  94. cli/commands/generate/__init__.py +0 -0
  95. cli/commands/generate/cancel/__init__.py +1 -0
  96. cli/commands/generate/cancel/command.py +44 -0
  97. cli/commands/generate/cancel/presenter.py +26 -0
  98. cli/commands/generate/status/__init__.py +1 -0
  99. cli/commands/generate/status/command.py +58 -0
  100. cli/commands/generate/status/presenter.py +78 -0
  101. cli/commands/generate/text/__init__.py +0 -0
  102. cli/commands/generate/text/command.py +1325 -0
  103. cli/commands/generate/text/concurrent_renderer.py +355 -0
  104. cli/commands/generate/text/presenter.py +287 -0
  105. cli/commands/generate/text/stream_renderer.py +129 -0
  106. cli/commands/knowledge/__init__.py +0 -0
  107. cli/commands/knowledge/collections/__init__.py +0 -0
  108. cli/commands/knowledge/collections/cluster/__init__.py +0 -0
  109. cli/commands/knowledge/collections/cluster/command.py +64 -0
  110. cli/commands/knowledge/collections/cluster/presenter.py +74 -0
  111. cli/commands/knowledge/collections/cluster_status/__init__.py +0 -0
  112. cli/commands/knowledge/collections/cluster_status/command.py +46 -0
  113. cli/commands/knowledge/collections/cluster_status/presenter.py +10 -0
  114. cli/commands/knowledge/collections/create/__init__.py +0 -0
  115. cli/commands/knowledge/collections/create/command.py +137 -0
  116. cli/commands/knowledge/collections/create/presenter.py +38 -0
  117. cli/commands/knowledge/collections/delete/__init__.py +1 -0
  118. cli/commands/knowledge/collections/delete/command.py +47 -0
  119. cli/commands/knowledge/collections/delete/presenter.py +20 -0
  120. cli/commands/knowledge/collections/get/__init__.py +1 -0
  121. cli/commands/knowledge/collections/get/command.py +30 -0
  122. cli/commands/knowledge/collections/get/presenter.py +44 -0
  123. cli/commands/knowledge/collections/list/__init__.py +1 -0
  124. cli/commands/knowledge/collections/list/command.py +41 -0
  125. cli/commands/knowledge/collections/list/presenter.py +68 -0
  126. cli/commands/knowledge/collections/update/__init__.py +0 -0
  127. cli/commands/knowledge/collections/update/command.py +97 -0
  128. cli/commands/knowledge/collections/update/presenter.py +42 -0
  129. cli/commands/knowledge/documents/__init__.py +0 -0
  130. cli/commands/knowledge/documents/bulk_metadata/__init__.py +0 -0
  131. cli/commands/knowledge/documents/bulk_metadata/command.py +119 -0
  132. cli/commands/knowledge/documents/bulk_metadata/presenter.py +36 -0
  133. cli/commands/knowledge/documents/delete/__init__.py +0 -0
  134. cli/commands/knowledge/documents/delete/command.py +47 -0
  135. cli/commands/knowledge/documents/delete/presenter.py +20 -0
  136. cli/commands/knowledge/documents/get/__init__.py +0 -0
  137. cli/commands/knowledge/documents/get/command.py +39 -0
  138. cli/commands/knowledge/documents/get/presenter.py +78 -0
  139. cli/commands/knowledge/documents/ingest/__init__.py +0 -0
  140. cli/commands/knowledge/documents/ingest/command.py +222 -0
  141. cli/commands/knowledge/documents/ingest/presenter.py +41 -0
  142. cli/commands/knowledge/documents/list/__init__.py +0 -0
  143. cli/commands/knowledge/documents/list/command.py +69 -0
  144. cli/commands/knowledge/documents/list/presenter.py +86 -0
  145. cli/commands/knowledge/documents/reingest/__init__.py +0 -0
  146. cli/commands/knowledge/documents/reingest/command.py +102 -0
  147. cli/commands/knowledge/documents/reingest/presenter.py +70 -0
  148. cli/commands/knowledge/documents/update/__init__.py +0 -0
  149. cli/commands/knowledge/documents/update/command.py +85 -0
  150. cli/commands/knowledge/documents/update/presenter.py +37 -0
  151. cli/commands/knowledge/recover/__init__.py +0 -0
  152. cli/commands/knowledge/recover/command.py +46 -0
  153. cli/commands/knowledge/recover/presenter.py +79 -0
  154. cli/commands/knowledge/search/__init__.py +0 -0
  155. cli/commands/knowledge/search/command.py +218 -0
  156. cli/commands/knowledge/search/presenter.py +111 -0
  157. cli/commands/knowledge/synthesis/__init__.py +0 -0
  158. cli/commands/knowledge/synthesis/create/__init__.py +0 -0
  159. cli/commands/knowledge/synthesis/create/command.py +127 -0
  160. cli/commands/knowledge/synthesis/create/presenter.py +33 -0
  161. cli/commands/knowledge/synthesis/delete/__init__.py +0 -0
  162. cli/commands/knowledge/synthesis/delete/command.py +53 -0
  163. cli/commands/knowledge/synthesis/delete/presenter.py +31 -0
  164. cli/commands/knowledge/synthesis/get/__init__.py +0 -0
  165. cli/commands/knowledge/synthesis/get/command.py +55 -0
  166. cli/commands/knowledge/synthesis/get/presenter.py +114 -0
  167. cli/commands/knowledge/synthesis/list/__init__.py +0 -0
  168. cli/commands/knowledge/synthesis/list/command.py +132 -0
  169. cli/commands/knowledge/synthesis/list/presenter.py +84 -0
  170. cli/commands/knowledge/synthesis/refresh/__init__.py +0 -0
  171. cli/commands/knowledge/synthesis/refresh/command.py +42 -0
  172. cli/commands/knowledge/synthesis/refresh/presenter.py +33 -0
  173. cli/commands/knowledge/synthesis/update/__init__.py +0 -0
  174. cli/commands/knowledge/synthesis/update/command.py +76 -0
  175. cli/commands/knowledge/synthesis/update/presenter.py +41 -0
  176. cli/commands/models/__init__.py +0 -0
  177. cli/commands/models/list/__init__.py +0 -0
  178. cli/commands/models/list/command.py +84 -0
  179. cli/commands/models/list/presenter.py +114 -0
  180. cli/commands/organizations/__init__.py +0 -0
  181. cli/commands/organizations/create/command.py +32 -0
  182. cli/commands/organizations/create/presenter.py +9 -0
  183. cli/commands/pipelines/__init__.py +1 -0
  184. cli/commands/pipelines/approvals/__init__.py +1 -0
  185. cli/commands/pipelines/approvals/decide_command.py +77 -0
  186. cli/commands/pipelines/approvals/get_command.py +44 -0
  187. cli/commands/pipelines/approvals/presenter.py +56 -0
  188. cli/commands/pipelines/costs/__init__.py +1 -0
  189. cli/commands/pipelines/costs/command.py +57 -0
  190. cli/commands/pipelines/costs/daily_command.py +54 -0
  191. cli/commands/pipelines/costs/daily_presenter.py +59 -0
  192. cli/commands/pipelines/costs/presenter.py +37 -0
  193. cli/commands/pipelines/create/__init__.py +1 -0
  194. cli/commands/pipelines/create/command.py +103 -0
  195. cli/commands/pipelines/create/presenter.py +22 -0
  196. cli/commands/pipelines/env_vars/__init__.py +1 -0
  197. cli/commands/pipelines/env_vars/command.py +51 -0
  198. cli/commands/pipelines/env_vars/presenter.py +16 -0
  199. cli/commands/pipelines/execute/__init__.py +1 -0
  200. cli/commands/pipelines/execute/command.py +142 -0
  201. cli/commands/pipelines/execute/presenter.py +47 -0
  202. cli/commands/pipelines/executions/__init__.py +1 -0
  203. cli/commands/pipelines/executions/costs/__init__.py +1 -0
  204. cli/commands/pipelines/executions/costs/command.py +48 -0
  205. cli/commands/pipelines/executions/costs/presenter.py +29 -0
  206. cli/commands/pipelines/executions/costs_by_model/__init__.py +1 -0
  207. cli/commands/pipelines/executions/costs_by_model/command.py +50 -0
  208. cli/commands/pipelines/executions/costs_by_model/presenter.py +78 -0
  209. cli/commands/pipelines/executions/costs_by_step/__init__.py +1 -0
  210. cli/commands/pipelines/executions/costs_by_step/command.py +50 -0
  211. cli/commands/pipelines/executions/costs_by_step/presenter.py +72 -0
  212. cli/commands/pipelines/executions/get_command.py +38 -0
  213. cli/commands/pipelines/executions/list_command.py +123 -0
  214. cli/commands/pipelines/executions/presenter.py +131 -0
  215. cli/commands/pipelines/executions/rerun_command.py +41 -0
  216. cli/commands/pipelines/executions/update/__init__.py +1 -0
  217. cli/commands/pipelines/executions/update/command.py +110 -0
  218. cli/commands/pipelines/executions/update/presenter.py +28 -0
  219. cli/commands/pipelines/get/__init__.py +1 -0
  220. cli/commands/pipelines/get/command.py +33 -0
  221. cli/commands/pipelines/get/presenter.py +48 -0
  222. cli/commands/pipelines/list/__init__.py +1 -0
  223. cli/commands/pipelines/list/command.py +53 -0
  224. cli/commands/pipelines/list/presenter.py +66 -0
  225. cli/commands/pipelines/schedules/__init__.py +1 -0
  226. cli/commands/pipelines/schedules/create_command.py +119 -0
  227. cli/commands/pipelines/schedules/create_presenter.py +35 -0
  228. cli/commands/pipelines/schedules/delete_command.py +52 -0
  229. cli/commands/pipelines/schedules/env_vars_command.py +59 -0
  230. cli/commands/pipelines/schedules/env_vars_presenter.py +16 -0
  231. cli/commands/pipelines/schedules/get_command.py +38 -0
  232. cli/commands/pipelines/schedules/list_command.py +33 -0
  233. cli/commands/pipelines/schedules/once_command.py +90 -0
  234. cli/commands/pipelines/schedules/once_presenter.py +30 -0
  235. cli/commands/pipelines/schedules/presenter.py +104 -0
  236. cli/commands/pipelines/schedules/update_command.py +139 -0
  237. cli/commands/pipelines/schedules/update_presenter.py +29 -0
  238. cli/commands/render/__init__.py +0 -0
  239. cli/commands/render/html_to_image/__init__.py +0 -0
  240. cli/commands/render/html_to_image/command.py +170 -0
  241. cli/commands/schemas/__init__.py +0 -0
  242. cli/commands/schemas/create/__init__.py +0 -0
  243. cli/commands/schemas/create/command.py +122 -0
  244. cli/commands/schemas/create/presenter.py +53 -0
  245. cli/commands/schemas/delete/command.py +45 -0
  246. cli/commands/schemas/delete/presenter.py +9 -0
  247. cli/commands/schemas/get/__init__.py +0 -0
  248. cli/commands/schemas/get/command.py +56 -0
  249. cli/commands/schemas/get/presenter.py +129 -0
  250. cli/commands/schemas/list/__init__.py +0 -0
  251. cli/commands/schemas/list/command.py +64 -0
  252. cli/commands/schemas/list/presenter.py +133 -0
  253. cli/commands/schemas/update/__init__.py +0 -0
  254. cli/commands/schemas/update/command.py +369 -0
  255. cli/commands/schemas/update/presenter.py +53 -0
  256. cli/commands/sessions/__init__.py +1 -0
  257. cli/commands/sessions/delete/__init__.py +1 -0
  258. cli/commands/sessions/delete/command.py +47 -0
  259. cli/commands/sessions/delete/presenter.py +10 -0
  260. cli/commands/sessions/get/__init__.py +1 -0
  261. cli/commands/sessions/get/command.py +42 -0
  262. cli/commands/sessions/get/presenter.py +59 -0
  263. cli/commands/sessions/list/__init__.py +1 -0
  264. cli/commands/sessions/list/command.py +61 -0
  265. cli/commands/sessions/list/presenter.py +68 -0
  266. cli/commands/sessions/messages/__init__.py +1 -0
  267. cli/commands/sessions/messages/command.py +78 -0
  268. cli/commands/sessions/messages/presenter.py +79 -0
  269. cli/commands/shared_flags.py +500 -0
  270. cli/commands/sync/__init__.py +0 -0
  271. cli/commands/sync/command.py +45 -0
  272. cli/commands/sync/presenter.py +49 -0
  273. cli/commands/tags/__init__.py +1 -0
  274. cli/commands/tags/create/__init__.py +1 -0
  275. cli/commands/tags/create/command.py +60 -0
  276. cli/commands/tags/delete/__init__.py +1 -0
  277. cli/commands/tags/delete/command.py +47 -0
  278. cli/commands/tags/delete/presenter.py +10 -0
  279. cli/commands/tags/get/command.py +31 -0
  280. cli/commands/tags/get/presenter.py +23 -0
  281. cli/commands/tags/list/__init__.py +1 -0
  282. cli/commands/tags/list/command.py +52 -0
  283. cli/commands/tags/list/presenter.py +49 -0
  284. cli/commands/tags/update/command.py +64 -0
  285. cli/commands/tags/update/presenter.py +9 -0
  286. cli/commands/templates/__init__.py +0 -0
  287. cli/commands/templates/create/__init__.py +0 -0
  288. cli/commands/templates/create/command.py +152 -0
  289. cli/commands/templates/create/presenter.py +86 -0
  290. cli/commands/templates/delete/__init__.py +0 -0
  291. cli/commands/templates/delete/command.py +47 -0
  292. cli/commands/templates/delete/presenter.py +16 -0
  293. cli/commands/templates/get/__init__.py +0 -0
  294. cli/commands/templates/get/command.py +52 -0
  295. cli/commands/templates/get/presenter.py +233 -0
  296. cli/commands/templates/get_by_version/command.py +32 -0
  297. cli/commands/templates/get_by_version/presenter.py +30 -0
  298. cli/commands/templates/list/__init__.py +1 -0
  299. cli/commands/templates/list/command.py +102 -0
  300. cli/commands/templates/list/presenter.py +93 -0
  301. cli/commands/templates/render/__init__.py +0 -0
  302. cli/commands/templates/render/command.py +115 -0
  303. cli/commands/templates/render/presenter.py +276 -0
  304. cli/commands/templates/update/__init__.py +0 -0
  305. cli/commands/templates/update/command.py +199 -0
  306. cli/commands/templates/update/presenter.py +94 -0
  307. cli/commands/templates/version/__init__.py +1 -0
  308. cli/commands/templates/version/command.py +116 -0
  309. cli/commands/templates/version/presenter.py +100 -0
  310. cli/commands/tool_configs/__init__.py +0 -0
  311. cli/commands/tool_configs/create/__init__.py +0 -0
  312. cli/commands/tool_configs/create/command.py +118 -0
  313. cli/commands/tool_configs/create/presenter.py +53 -0
  314. cli/commands/tool_configs/delete/__init__.py +0 -0
  315. cli/commands/tool_configs/delete/command.py +47 -0
  316. cli/commands/tool_configs/delete/presenter.py +18 -0
  317. cli/commands/tool_configs/get/__init__.py +0 -0
  318. cli/commands/tool_configs/get/command.py +31 -0
  319. cli/commands/tool_configs/get/presenter.py +62 -0
  320. cli/commands/tool_configs/list/__init__.py +0 -0
  321. cli/commands/tool_configs/list/command.py +59 -0
  322. cli/commands/tool_configs/list/presenter.py +60 -0
  323. cli/commands/tool_configs/update/__init__.py +0 -0
  324. cli/commands/tool_configs/update/command.py +128 -0
  325. cli/commands/tool_configs/update/presenter.py +53 -0
  326. cli/commands/tools/__init__.py +1 -0
  327. cli/commands/tools/get/__init__.py +1 -0
  328. cli/commands/tools/get/command.py +42 -0
  329. cli/commands/tools/get/presenter.py +45 -0
  330. cli/commands/tools/list/__init__.py +1 -0
  331. cli/commands/tools/list/command.py +56 -0
  332. cli/commands/tools/list/presenter.py +44 -0
  333. cli/commands/users/__init__.py +0 -0
  334. cli/commands/users/create/command.py +53 -0
  335. cli/commands/users/create/presenter.py +9 -0
  336. cli/commands/whoami/__init__.py +0 -0
  337. cli/commands/whoami/command.py +42 -0
  338. cli/infrastructure/__init__.py +0 -0
  339. cli/infrastructure/auth_storage.py +71 -0
  340. cli/infrastructure/client_factory.py +36 -0
  341. cli/infrastructure/command.py +75 -0
  342. cli/infrastructure/config.py +188 -0
  343. cli/infrastructure/console.py +27 -0
  344. cli/infrastructure/editor.py +138 -0
  345. cli/infrastructure/error_display.py +178 -0
  346. cli/infrastructure/field_extractor.py +360 -0
  347. cli/infrastructure/file_content.py +210 -0
  348. cli/infrastructure/filter_parser.py +256 -0
  349. cli/infrastructure/formatters/__init__.py +0 -0
  350. cli/infrastructure/formatters/base.py +99 -0
  351. cli/infrastructure/formatters/compact_formatter.py +245 -0
  352. cli/infrastructure/formatters/json_formatter.py +84 -0
  353. cli/infrastructure/formatters/lines_formatter.py +102 -0
  354. cli/infrastructure/formatting/__init__.py +0 -0
  355. cli/infrastructure/formatting/fields.py +193 -0
  356. cli/infrastructure/forms/__init__.py +0 -0
  357. cli/infrastructure/forms/agent_picker.py +123 -0
  358. cli/infrastructure/forms/agent_tool_editor.py +384 -0
  359. cli/infrastructure/forms/agent_tools_manager.py +212 -0
  360. cli/infrastructure/forms/base_picker.py +469 -0
  361. cli/infrastructure/forms/components.py +126 -0
  362. cli/infrastructure/forms/json_schema_builder.py +149 -0
  363. cli/infrastructure/forms/model_picker.py +134 -0
  364. cli/infrastructure/forms/parsers.py +173 -0
  365. cli/infrastructure/forms/resolution_modal.py +302 -0
  366. cli/infrastructure/forms/schema_picker.py +137 -0
  367. cli/infrastructure/forms/tag_management_modal.py +103 -0
  368. cli/infrastructure/forms/tag_picker.py +207 -0
  369. cli/infrastructure/forms/template_picker.py +131 -0
  370. cli/infrastructure/forms/tool_config_picker.py +130 -0
  371. cli/infrastructure/forms/tool_picker.py +103 -0
  372. cli/infrastructure/injection/__init__.py +0 -0
  373. cli/infrastructure/injection/parser.py +302 -0
  374. cli/infrastructure/injection/resolver.py +399 -0
  375. cli/infrastructure/kv_parser.py +130 -0
  376. cli/infrastructure/local_storage.py +227 -0
  377. cli/infrastructure/macro_parser.py +215 -0
  378. cli/infrastructure/output.py +192 -0
  379. cli/infrastructure/provider_setup.py +81 -0
  380. cli/infrastructure/renderers/__init__.py +0 -0
  381. cli/infrastructure/renderers/entity_renderer.py +77 -0
  382. cli/infrastructure/renderers/list_renderer.py +114 -0
  383. cli/infrastructure/scope_utils.py +47 -0
  384. cli/infrastructure/spinner.py +101 -0
  385. cli/infrastructure/tui/__init__.py +0 -0
  386. cli/infrastructure/tui/clipboard.py +41 -0
  387. cli/infrastructure/tui/formatters.py +105 -0
  388. cli/infrastructure/tui/preview.py +14 -0
  389. cli/infrastructure/tui/selectable.py +198 -0
  390. cli/infrastructure/validation/__init__.py +0 -0
  391. cli/infrastructure/validation/tag_validation.py +74 -0
  392. cli/main.py +759 -0
  393. cli/tui/__init__.py +0 -0
  394. cli/tui/app.py +199 -0
  395. cli/tui/app_store.py +73 -0
  396. cli/tui/chat/__init__.py +0 -0
  397. cli/tui/chat/commands/__init__.py +0 -0
  398. cli/tui/chat/commands/base.py +65 -0
  399. cli/tui/chat/commands/create_session.py +135 -0
  400. cli/tui/chat/commands/load_session.py +119 -0
  401. cli/tui/chat/commands/regenerate.py +120 -0
  402. cli/tui/chat/commands/reload_session.py +63 -0
  403. cli/tui/chat/commands/send_message.py +190 -0
  404. cli/tui/chat/commands/undo.py +66 -0
  405. cli/tui/chat/editor.py +71 -0
  406. cli/tui/chat/messages.py +223 -0
  407. cli/tui/chat/pane.py +141 -0
  408. cli/tui/chat/renderers/__init__.py +0 -0
  409. cli/tui/chat/renderers/base.py +72 -0
  410. cli/tui/chat/renderers/markdown.py +250 -0
  411. cli/tui/chat/renderers/plain.py +83 -0
  412. cli/tui/chat/screen.py +1155 -0
  413. cli/tui/chat/services/__init__.py +0 -0
  414. cli/tui/chat/services/injection.py +386 -0
  415. cli/tui/chat/services/name_generator.py +256 -0
  416. cli/tui/chat/slash_commands.py +424 -0
  417. cli/tui/chat/store.py +280 -0
  418. cli/tui/chat/types.py +220 -0
  419. cli/tui/chat/widgets/__init__.py +0 -0
  420. cli/tui/chat/widgets/chat_header.py +75 -0
  421. cli/tui/chat/widgets/chat_input.py +362 -0
  422. cli/tui/chat/widgets/injection_popup.py +161 -0
  423. cli/tui/chat/widgets/message_display.py +287 -0
  424. cli/tui/chat/widgets/session_sidebar.py +214 -0
  425. cli/tui/chat/widgets/welcome_screen.py +290 -0
  426. cli/tui/screens/__init__.py +0 -0
  427. cli/tui/screens/agents.py +344 -0
  428. cli/tui/screens/base.py +301 -0
  429. cli/tui/screens/content.py +508 -0
  430. cli/tui/screens/dashboard.py +89 -0
  431. cli/tui/screens/models.py +96 -0
  432. cli/tui/screens/nav_screen.py +186 -0
  433. cli/tui/screens/schemas.py +522 -0
  434. cli/tui/screens/templates.py +734 -0
  435. cli/tui/screens/tool_configs.py +335 -0
  436. cli/tui/styles/__init__.py +0 -0
  437. cli/tui/widgets/__init__.py +0 -0
  438. cli/tui/widgets/agent_create_modal.py +139 -0
  439. cli/tui/widgets/agent_form_modal.py +659 -0
  440. cli/tui/widgets/agent_update_modal.py +299 -0
  441. cli/tui/widgets/base_form_modal.py +77 -0
  442. cli/tui/widgets/confirm_modal.py +75 -0
  443. cli/tui/widgets/help_modal.py +145 -0
  444. cli/tui/widgets/new_session_modal.py +328 -0
  445. cli/tui/widgets/schema_create_modal.py +271 -0
  446. cli/tui/widgets/schema_update_modal.py +188 -0
  447. cli/tui/widgets/status_footer.py +147 -0
  448. cli/tui/widgets/template_create_modal.py +502 -0
  449. cli/tui/widgets/template_update_modal.py +308 -0
  450. cli/tui/widgets/tool_config_create_modal.py +216 -0
  451. cli/tui/widgets/tool_config_update_modal.py +208 -0
@@ -0,0 +1,475 @@
1
+ """Agent create command implementation."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import Annotated, Any, Optional, cast
6
+ from uuid import UUID
7
+
8
+ import typer
9
+ from pydantic import ValidationError
10
+
11
+ from cli.commands.agents.create.presenter import present_agent_create_success
12
+ from cli.commands.flag_utils import (
13
+ parse_tags_required,
14
+ require_exclusive,
15
+ validate_provider,
16
+ validate_scope,
17
+ )
18
+ from cli.infrastructure.command import async_command, authenticated_client
19
+ from cli.infrastructure.file_content import FileContentError, resolve_content
20
+ from alloy_runtime_types.dtos.agents import (
21
+ AgentModelConfig,
22
+ AgentToolConfig,
23
+ CreateAgentRequest,
24
+ )
25
+ from alloy_runtime_types.dtos.generation import GenerationParameters
26
+ from alloy_runtime_types.enums.ownership_scope import OwnershipScope
27
+
28
+ REQUEST_HEADERS = Annotated[
29
+ Optional[list[str]],
30
+ typer.Option(
31
+ "-H",
32
+ "--header",
33
+ help="Default request header (key:value). Repeatable. E.g., -H 'anthropic-beta:context-1m-2025-08-07'",
34
+ ),
35
+ ]
36
+
37
+
38
+ def agents_create_command(
39
+ name: str = typer.Option(
40
+ "...",
41
+ "-n",
42
+ "--name",
43
+ help="Agent name",
44
+ ),
45
+ provider: str = typer.Option(
46
+ "...",
47
+ "-p",
48
+ "--provider",
49
+ help="Provider (openai, anthropic, etc.)",
50
+ ),
51
+ model: str = typer.Option(
52
+ "...",
53
+ "-M",
54
+ "--model",
55
+ help="Model name (gpt-4o, claude-3-sonnet, etc.)",
56
+ ),
57
+ tags: str = typer.Option(
58
+ "...",
59
+ "-t",
60
+ "--tags",
61
+ help="Comma-separated tags",
62
+ ),
63
+ description: Optional[str] = typer.Option(
64
+ None,
65
+ "-d",
66
+ "--description",
67
+ help="Agent description",
68
+ ),
69
+ scope: Optional[str] = typer.Option(
70
+ None,
71
+ "--scope",
72
+ help="Scope: user, organization, global",
73
+ ),
74
+ temperature: Optional[float] = typer.Option(
75
+ None,
76
+ "-T",
77
+ "--temperature",
78
+ help="Temperature (0.0-2.0)",
79
+ ),
80
+ max_tokens: Optional[int] = typer.Option(
81
+ None,
82
+ "--max-tokens",
83
+ help="Max tokens to generate",
84
+ ),
85
+ system_template: Optional[str] = typer.Option(
86
+ None,
87
+ "--system-template",
88
+ help="System template name or UUID",
89
+ ),
90
+ tools: Optional[str] = typer.Option(
91
+ None,
92
+ "--tools",
93
+ help="JSON array of tool configs (or @file.json)",
94
+ ),
95
+ tools_file: Optional[Path] = typer.Option(
96
+ None,
97
+ "--tools-file",
98
+ help="Path to JSON file with tool configs",
99
+ exists=True,
100
+ readable=True,
101
+ ),
102
+ base_agent: Optional[UUID] = typer.Option(
103
+ None,
104
+ "--base-agent",
105
+ help="Base agent UUID to inherit configuration from",
106
+ ),
107
+ system_version: Optional[UUID] = typer.Option(
108
+ None,
109
+ "--system-version",
110
+ help="Specific system instruction version UUID",
111
+ ),
112
+ input_schema: Optional[UUID] = typer.Option(
113
+ None,
114
+ "--input-schema",
115
+ help="Input schema UUID",
116
+ ),
117
+ output_schema: Optional[UUID] = typer.Option(
118
+ None,
119
+ "--output-schema",
120
+ help="Output schema UUID (mutually exclusive with --output-schema-def)",
121
+ ),
122
+ output_schema_def: Optional[str] = typer.Option(
123
+ None,
124
+ "--output-schema-def",
125
+ help="Output schema definition JSON (or @file.json). Mutually exclusive with --output-schema.",
126
+ ),
127
+ headers: REQUEST_HEADERS = None,
128
+ top_p: Optional[float] = typer.Option(
129
+ None,
130
+ "--top-p",
131
+ help="Nucleus sampling parameter (0.0-1.0)",
132
+ ),
133
+ top_k: Optional[int] = typer.Option(
134
+ None,
135
+ "--top-k",
136
+ help="Top-k sampling parameter",
137
+ ),
138
+ frequency_penalty: Optional[float] = typer.Option(
139
+ None,
140
+ "--frequency-penalty",
141
+ help="Frequency penalty (-2.0 to 2.0)",
142
+ ),
143
+ presence_penalty: Optional[float] = typer.Option(
144
+ None,
145
+ "--presence-penalty",
146
+ help="Presence penalty (-2.0 to 2.0)",
147
+ ),
148
+ seed: Optional[int] = typer.Option(
149
+ None,
150
+ "--seed",
151
+ help="Random seed for reproducible outputs",
152
+ ),
153
+ stop: Optional[str] = typer.Option(
154
+ None,
155
+ "--stop",
156
+ help="Stop sequences (string or comma-separated for multiple)",
157
+ ),
158
+ logprobs: Optional[bool] = typer.Option(
159
+ None,
160
+ "--logprobs/--no-logprobs",
161
+ help="Include log probabilities in response",
162
+ ),
163
+ top_logprobs: Optional[int] = typer.Option(
164
+ None,
165
+ "--top-logprobs",
166
+ help="Number of top log probabilities to return (1-20)",
167
+ ),
168
+ user: Optional[str] = typer.Option(
169
+ None,
170
+ "--user",
171
+ help="End-user ID for tracking and abuse monitoring",
172
+ ),
173
+ ) -> None:
174
+ """Create a new AI agent.
175
+
176
+ Examples:
177
+ ai agents create -n "My Agent" -p openai -M gpt-4o -t "agent.llm"
178
+ ai agents create -n "Writer" -p anthropic -M claude-3-sonnet -t "agent.creative" -d "Creative writer" -T 0.9
179
+ ai agents create -n "Org Agent" -p openai -M gpt-4o -t "agent.llm,team.backend" --scope organization
180
+ ai agents create -n "With Tools" -p openai -M gpt-4o -t "agent" --tools '[{"tool_id": "web_search"}]'
181
+ ai agents create -n "With Tools" -p openai -M gpt-4o -t "agent" --tools-file tools.json
182
+ ai agents create -n "With Headers" -p openai -M gpt-4o -t "agent" -H 'anthropic-beta:context-1m-2025-08-07'
183
+ """
184
+ require_exclusive(("--tools", tools), ("--tools-file", tools_file))
185
+ require_exclusive(
186
+ ("--output-schema", output_schema), ("--output-schema-def", output_schema_def)
187
+ )
188
+
189
+ _execute_create_from_flags(
190
+ name=name,
191
+ provider=provider,
192
+ model=model,
193
+ tags=tags,
194
+ description=description,
195
+ scope=scope,
196
+ temperature=temperature,
197
+ max_tokens=max_tokens,
198
+ system_template=system_template,
199
+ tools=tools,
200
+ tools_file=tools_file,
201
+ base_agent=base_agent,
202
+ system_version=system_version,
203
+ input_schema=input_schema,
204
+ output_schema=output_schema,
205
+ output_schema_def=output_schema_def,
206
+ headers=headers,
207
+ top_p=top_p,
208
+ top_k=top_k,
209
+ frequency_penalty=frequency_penalty,
210
+ presence_penalty=presence_penalty,
211
+ seed=seed,
212
+ stop=stop,
213
+ logprobs=logprobs,
214
+ top_logprobs=top_logprobs,
215
+ user=user,
216
+ )
217
+
218
+
219
+ @async_command
220
+ async def _execute_create(request: CreateAgentRequest) -> None:
221
+ """Execute the agent creation with the given request."""
222
+ async with authenticated_client() as (_config, client):
223
+ response = await client.create_agent(request)
224
+
225
+ present_agent_create_success(response)
226
+
227
+
228
+ def parse_tools(
229
+ tools: Optional[str],
230
+ tools_file: Optional[Path],
231
+ ) -> list[AgentToolConfig] | None:
232
+ """Parse tool configurations from CLI input.
233
+
234
+ Args:
235
+ tools: JSON string (or @file.json reference) containing tool configs
236
+ tools_file: Path to JSON file containing tool configs
237
+
238
+ Returns:
239
+ List of AgentToolConfig objects, or None if no tools provided
240
+
241
+ Raises:
242
+ typer.BadParameter: If JSON is invalid or doesn't match schema
243
+ """
244
+ if tools is None and tools_file is None:
245
+ return None
246
+
247
+ if tools_file is not None:
248
+ try:
249
+ json_content = tools_file.read_text()
250
+ except IOError as e:
251
+ raise typer.BadParameter(f"Failed to read tools file: {e}")
252
+ else:
253
+ try:
254
+ json_content = resolve_content(tools)
255
+ except FileContentError as e:
256
+ raise typer.BadParameter(str(e))
257
+
258
+ if not json_content:
259
+ return None
260
+
261
+ try:
262
+ tools_data_raw: object = json.loads(json_content)
263
+ except json.JSONDecodeError as e:
264
+ raise typer.BadParameter(f"Invalid JSON in tools: {e}")
265
+
266
+ if not isinstance(tools_data_raw, list):
267
+ raise typer.BadParameter("Tools must be a JSON array")
268
+
269
+ tools_data: list[object] = cast(list[object], tools_data_raw)
270
+
271
+ if not tools_data:
272
+ return None
273
+
274
+ tool_configs: list[AgentToolConfig] = []
275
+ for i, tool_data in enumerate(tools_data):
276
+ if not isinstance(tool_data, dict):
277
+ raise typer.BadParameter(f"Tool at index {i} must be an object")
278
+ try:
279
+ tool_configs.append(AgentToolConfig(**cast(dict[str, Any], tool_data)))
280
+ except ValidationError as e:
281
+ errors = e.errors()
282
+ if errors:
283
+ first_error = errors[0]
284
+ field = ".".join(str(loc) for loc in first_error["loc"])
285
+ msg = first_error["msg"]
286
+ raise typer.BadParameter(f"Tool at index {i}: {field} - {msg}")
287
+ raise typer.BadParameter(f"Tool at index {i}: {e}")
288
+
289
+ return tool_configs
290
+
291
+
292
+ _parse_tools = parse_tools
293
+
294
+
295
+ def parse_output_schema_def(
296
+ output_schema_def: Optional[str],
297
+ ) -> dict[str, Any] | None:
298
+ """Parse output schema definition from CLI input.
299
+
300
+ Args:
301
+ output_schema_def: JSON string (or @file.json reference) containing schema
302
+
303
+ Returns:
304
+ Parsed schema dict, or None if not provided
305
+
306
+ Raises:
307
+ typer.BadParameter: If JSON is invalid
308
+ """
309
+ if output_schema_def is None:
310
+ return None
311
+
312
+ try:
313
+ json_content = resolve_content(output_schema_def)
314
+ except FileContentError as e:
315
+ raise typer.BadParameter(str(e))
316
+
317
+ if not json_content:
318
+ return None
319
+
320
+ try:
321
+ schema_data: object = json.loads(json_content)
322
+ except json.JSONDecodeError as e:
323
+ raise typer.BadParameter(f"Invalid JSON in output-schema-def: {e}")
324
+
325
+ if not isinstance(schema_data, dict):
326
+ raise typer.BadParameter("Output schema definition must be a JSON object")
327
+
328
+ return cast(dict[str, Any], schema_data)
329
+
330
+
331
+ def parse_headers(
332
+ headers: Optional[list[str]],
333
+ ) -> dict[str, str] | None:
334
+ """Parse headers from CLI input.
335
+
336
+ Args:
337
+ headers: List of key:value strings
338
+
339
+ Returns:
340
+ Parsed headers dict, or None if not provided
341
+
342
+ Raises:
343
+ typer.BadParameter: If header format is invalid
344
+ """
345
+ if headers is None:
346
+ return None
347
+
348
+ parsed: dict[str, str] = {}
349
+ for h in headers:
350
+ if ":" not in h:
351
+ raise typer.BadParameter(
352
+ f"Invalid header format '{h}'. Use 'key:value' format."
353
+ )
354
+ key, value = h.split(":", 1)
355
+ parsed[key.strip()] = value.strip()
356
+
357
+ return parsed if parsed else None
358
+
359
+
360
+ def parse_stop_sequences(stop: Optional[str]) -> str | list[str] | None:
361
+ """Parse stop sequences from CLI input.
362
+
363
+ Args:
364
+ stop: Stop sequence string (comma-separated for multiple)
365
+
366
+ Returns:
367
+ Single string or list of strings, or None if not provided
368
+ """
369
+ if stop is None:
370
+ return None
371
+
372
+ if "," in stop:
373
+ sequences = [s.strip() for s in stop.split(",") if s.strip()]
374
+ return sequences if sequences else None
375
+
376
+ return stop
377
+
378
+
379
+ def _execute_create_from_flags(
380
+ name: str,
381
+ provider: str,
382
+ model: str,
383
+ tags: str,
384
+ description: Optional[str],
385
+ scope: Optional[str],
386
+ temperature: Optional[float],
387
+ max_tokens: Optional[int],
388
+ system_template: Optional[str],
389
+ tools: Optional[str],
390
+ tools_file: Optional[Path],
391
+ base_agent: Optional[UUID],
392
+ system_version: Optional[UUID],
393
+ input_schema: Optional[UUID],
394
+ output_schema: Optional[UUID],
395
+ output_schema_def: Optional[str],
396
+ headers: Optional[list[str]],
397
+ top_p: Optional[float],
398
+ top_k: Optional[int],
399
+ frequency_penalty: Optional[float],
400
+ presence_penalty: Optional[float],
401
+ seed: Optional[int],
402
+ stop: Optional[str],
403
+ logprobs: Optional[bool],
404
+ top_logprobs: Optional[int],
405
+ user: Optional[str],
406
+ ) -> None:
407
+ """Build and execute agent creation from command flags."""
408
+ provider_enum = validate_provider(provider)
409
+
410
+ tag_list = parse_tags_required(tags)
411
+
412
+ model_config = AgentModelConfig(
413
+ provider_key=provider_enum,
414
+ provider_model_name=model,
415
+ preference_order=0,
416
+ )
417
+
418
+ ownership_scope = OwnershipScope.USER
419
+ if scope:
420
+ ownership_scope = validate_scope(scope)
421
+
422
+ gen_params = None
423
+ if any(
424
+ [
425
+ temperature is not None,
426
+ max_tokens is not None,
427
+ top_p is not None,
428
+ top_k is not None,
429
+ frequency_penalty is not None,
430
+ presence_penalty is not None,
431
+ seed is not None,
432
+ stop is not None,
433
+ logprobs is not None,
434
+ top_logprobs is not None,
435
+ user is not None,
436
+ ]
437
+ ):
438
+ gen_params = GenerationParameters(
439
+ temperature=temperature,
440
+ max_tokens=max_tokens,
441
+ top_p=top_p,
442
+ top_k=top_k,
443
+ frequency_penalty=frequency_penalty,
444
+ presence_penalty=presence_penalty,
445
+ seed=seed,
446
+ stop=parse_stop_sequences(stop),
447
+ logprobs=logprobs,
448
+ top_logprobs=top_logprobs,
449
+ user=user,
450
+ )
451
+
452
+ tool_configs = parse_tools(tools, tools_file)
453
+
454
+ parsed_output_schema = parse_output_schema_def(output_schema_def)
455
+
456
+ parsed_headers = parse_headers(headers)
457
+
458
+ request = CreateAgentRequest(
459
+ name=name,
460
+ models=[model_config],
461
+ tags=tag_list,
462
+ scope=ownership_scope,
463
+ description=description,
464
+ system_instruction_template=system_template,
465
+ generation_params=gen_params,
466
+ tools=tool_configs,
467
+ base_agent_id=base_agent,
468
+ system_instruction_version_id=system_version,
469
+ input_schema_id=input_schema,
470
+ output_schema_id=output_schema,
471
+ output_schema=parsed_output_schema,
472
+ default_request_headers=parsed_headers,
473
+ )
474
+
475
+ _execute_create(request)
@@ -0,0 +1,64 @@
1
+ """Field definitions for agent presentation."""
2
+
3
+ from cli.infrastructure.formatting.fields import (
4
+ format_datetime,
5
+ format_optional,
6
+ format_uuid,
7
+ )
8
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
9
+ from alloy_runtime_types.dtos.agents import CreateAgentResponse
10
+
11
+
12
+ def format_models(response: CreateAgentResponse) -> str:
13
+ """Format models list for display."""
14
+ return ", ".join(
15
+ f"{m.provider_key.value}:{m.provider_model_name}" for m in response.models
16
+ )
17
+
18
+
19
+ def format_tools(response: CreateAgentResponse) -> str:
20
+ """Format tools list for display."""
21
+ if not response.tools:
22
+ return "(none)"
23
+ return ", ".join(t.tool_id for t in response.tools)
24
+
25
+
26
+ def format_tags(response: CreateAgentResponse) -> str:
27
+ """Format tags list for display."""
28
+ if not response.tags:
29
+ return "(none)"
30
+ return ", ".join(t.tag_path for t in response.tags)
31
+
32
+
33
+ def format_generation_params(response: CreateAgentResponse) -> str:
34
+ """Format generation parameters for display."""
35
+ if not response.generation_params:
36
+ return "(default)"
37
+
38
+ params: list[str] = []
39
+ if response.generation_params.temperature is not None:
40
+ params.append(f"temp={response.generation_params.temperature}")
41
+ if response.generation_params.max_tokens is not None:
42
+ params.append(f"max_tokens={response.generation_params.max_tokens}")
43
+ if response.generation_params.reasoning_effort is not None:
44
+ params.append(f"reasoning={response.generation_params.reasoning_effort}")
45
+
46
+ return ", ".join(params) if params else "(default)"
47
+
48
+
49
+ AGENT_FIELDS = [
50
+ FieldConfig("id", "ID", lambda v: format_uuid(v, short=False)),
51
+ FieldConfig("name", "Name"),
52
+ FieldConfig("description", "Description", format_optional),
53
+ FieldConfig(
54
+ "organization_id",
55
+ "Organization ID",
56
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
57
+ ),
58
+ FieldConfig(
59
+ "user_id",
60
+ "User ID",
61
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
62
+ ),
63
+ FieldConfig("created_at", "Created At", format_datetime),
64
+ ]
@@ -0,0 +1,68 @@
1
+ """Presenter for agent creation output."""
2
+
3
+ from cli.commands.agents.create.fields import (
4
+ format_generation_params,
5
+ format_models,
6
+ format_tags,
7
+ format_tools,
8
+ )
9
+ from cli.infrastructure.formatting.fields import (
10
+ format_datetime,
11
+ format_optional,
12
+ format_uuid,
13
+ )
14
+ from cli.infrastructure.output import OutputService
15
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
16
+ from alloy_runtime_types.dtos.agents import CreateAgentResponse
17
+
18
+
19
+ def present_agent_create_success(response: CreateAgentResponse) -> None:
20
+ """Present successful agent creation.
21
+
22
+ Args:
23
+ response: Agent creation response from server
24
+ """
25
+ output = OutputService.get()
26
+ output.success("Agent created successfully")
27
+
28
+ fields = [
29
+ FieldConfig("id", "ID", lambda v: format_uuid(v, short=False)),
30
+ FieldConfig("name", "Name"),
31
+ FieldConfig("description", "Description", format_optional),
32
+ FieldConfig("models", "Models", lambda _: format_models(response)),
33
+ FieldConfig("tools", "Tools", lambda _: format_tools(response)),
34
+ FieldConfig("tags", "Tags", lambda _: format_tags(response)),
35
+ FieldConfig(
36
+ "generation_params",
37
+ "Generation Params",
38
+ lambda _: format_generation_params(response),
39
+ ),
40
+ FieldConfig(
41
+ "system_instruction_version_id",
42
+ "System Prompt ID",
43
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
44
+ ),
45
+ FieldConfig(
46
+ "input_schema_id",
47
+ "Input Schema ID",
48
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
49
+ ),
50
+ FieldConfig(
51
+ "output_schema_id",
52
+ "Output Schema ID",
53
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=False)),
54
+ ),
55
+ FieldConfig(
56
+ "organization_id",
57
+ "Organization ID",
58
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
59
+ ),
60
+ FieldConfig(
61
+ "user_id",
62
+ "User ID",
63
+ lambda v: format_optional(v, lambda x: format_uuid(x, short=True)),
64
+ ),
65
+ FieldConfig("created_at", "Created At", format_datetime),
66
+ ]
67
+
68
+ output.entity(response, f"Agent: {response.name}", fields)
File without changes
@@ -0,0 +1,47 @@
1
+ """Agents delete command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.agents.delete.presenter import present_delete_result
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+ from cli.infrastructure.console import Confirm
8
+
9
+
10
+ def agents_delete_command(
11
+ agent: str = typer.Argument(
12
+ ...,
13
+ help="Agent name or UUID",
14
+ ),
15
+ yes: bool = typer.Option(
16
+ False,
17
+ "-y",
18
+ "--yes",
19
+ help="Skip confirmation",
20
+ ),
21
+ ) -> None:
22
+ """Delete an agent.
23
+
24
+ Permanently removes the agent and associated models, tools, and tags.
25
+ Agents referenced by pipeline steps cannot be deleted.
26
+
27
+ Examples:
28
+ ai agents delete my-agent
29
+ ai agents delete 550e8400-e29b-41d4-a716-446655440000 -y
30
+ """
31
+ _execute_delete(agent_identifier=agent, skip_confirm=yes)
32
+
33
+
34
+ @async_command
35
+ async def _execute_delete(agent_identifier: str, skip_confirm: bool) -> None:
36
+ """Execute delete agent operation."""
37
+ if not skip_confirm:
38
+ confirmed = Confirm.ask(
39
+ f"[yellow]Delete agent '{agent_identifier}'?[/yellow] This cannot be undone"
40
+ )
41
+ if not confirmed:
42
+ raise typer.Abort()
43
+
44
+ async with authenticated_client() as (_config, client):
45
+ response = await client.delete_agent(agent_identifier)
46
+
47
+ present_delete_result(response)
@@ -0,0 +1,16 @@
1
+ """Presenter for agent delete command output."""
2
+
3
+ from cli.infrastructure.output import OutputService
4
+ from alloy_runtime_types.dtos.agents import DeleteAgentResponse
5
+
6
+
7
+ def present_delete_result(response: DeleteAgentResponse) -> None:
8
+ """Present agent deletion result.
9
+
10
+ Args:
11
+ response: DeleteAgentResponse from server
12
+ """
13
+ output = OutputService.get()
14
+ deleted = response.deleted_agent
15
+
16
+ output.success(f"Agent '{deleted.name}' deleted successfully")