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,84 @@
1
+ """Models list command implementation."""
2
+
3
+ from enum import Enum
4
+ from typing import Optional
5
+
6
+ import typer
7
+
8
+ from cli.commands.models.list.presenter import present_models_list
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ class DisplayColumn(str, Enum):
13
+ """Column display options."""
14
+
15
+ MODEL = "model"
16
+ PROVIDER = "provider"
17
+
18
+
19
+ def models_list_command(
20
+ search: Optional[str] = typer.Option(
21
+ None,
22
+ "-s",
23
+ "--search",
24
+ help="Fuzzy search terms",
25
+ ),
26
+ provider_filter: Optional[str] = typer.Option(
27
+ None,
28
+ "-p",
29
+ "--provider",
30
+ help="Filter by provider",
31
+ ),
32
+ configured_only: bool = typer.Option(
33
+ False,
34
+ "--configured",
35
+ help="Only show models with credentials",
36
+ ),
37
+ display: DisplayColumn | None = typer.Option(
38
+ None,
39
+ "--display",
40
+ help="Show only: model or provider",
41
+ ),
42
+ extra_fields: bool = typer.Option(
43
+ False,
44
+ "--extra",
45
+ help="Show detailed table",
46
+ ),
47
+ ) -> None:
48
+ """List available AI models.
49
+
50
+ Examples:
51
+ ai models list
52
+ ai models list -s "claude sonnet"
53
+ ai models list -p anthropic
54
+ ai models list --configured
55
+ ai models list --display model
56
+ ai models list --extra
57
+ """
58
+ _execute_list(
59
+ search=search,
60
+ provider_filter=provider_filter,
61
+ configured_only=configured_only,
62
+ display=display,
63
+ extra_fields=extra_fields,
64
+ )
65
+
66
+
67
+ @async_command
68
+ async def _execute_list(
69
+ search: Optional[str],
70
+ provider_filter: Optional[str],
71
+ configured_only: bool,
72
+ display: DisplayColumn | None,
73
+ extra_fields: bool,
74
+ ) -> None:
75
+ """Execute list models operation."""
76
+ async with authenticated_client() as (_config, client):
77
+ response = await client.list_models(
78
+ search=search,
79
+ provider_filter=provider_filter,
80
+ configured_only=configured_only,
81
+ limit=100,
82
+ )
83
+
84
+ present_models_list(response, display_column=display, extra_fields=extra_fields)
@@ -0,0 +1,114 @@
1
+ """Presenter for models list command output."""
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from alloy_runtime_types.dtos.models import ListModelsResponse
6
+
7
+ from cli.infrastructure.output import OutputService
8
+ from cli.infrastructure.renderers.list_renderer import ColumnConfig
9
+
10
+ if TYPE_CHECKING:
11
+ from cli.commands.models.list.command import DisplayColumn
12
+
13
+
14
+ def present_models_list(
15
+ response: ListModelsResponse,
16
+ *,
17
+ display_column: "DisplayColumn | None" = None,
18
+ extra_fields: bool = False,
19
+ ) -> None:
20
+ """Present list of models with Rich table formatting.
21
+
22
+ Args:
23
+ response: List models response from server
24
+ display_column: If set, only show that specific column. None = all columns.
25
+ extra_fields: If True, show detailed table with all fields. Default is simple one-line format.
26
+ """
27
+ # Import here to avoid circular import
28
+ from cli.commands.models.list.command import DisplayColumn
29
+
30
+ output = OutputService.get()
31
+
32
+ if not response.models:
33
+ output.info("No models found")
34
+ return
35
+
36
+ # If display_column is set, show single column
37
+ if display_column == DisplayColumn.PROVIDER:
38
+ columns = [
39
+ ColumnConfig(
40
+ source_field="provider_key",
41
+ header_label="Provider",
42
+ compact_line=1,
43
+ compact_style="green",
44
+ ),
45
+ ]
46
+ elif display_column == DisplayColumn.MODEL:
47
+ columns = [
48
+ ColumnConfig(
49
+ source_field="provider_model_name",
50
+ header_label="Model Name",
51
+ compact_line=1,
52
+ compact_style="cyan",
53
+ ),
54
+ ]
55
+ # If extra_fields is True, show detailed table with compact layout
56
+ elif extra_fields:
57
+ # Line 1 (primary): Provider, model name, context window - identifiers
58
+ # Line 2 (detail): Max output, modalities - technical details
59
+ columns = [
60
+ ColumnConfig(
61
+ source_field="provider_key",
62
+ header_label="Provider",
63
+ compact_line=1,
64
+ compact_style="green",
65
+ ),
66
+ ColumnConfig(
67
+ source_field="provider_model_name",
68
+ header_label="Model Name",
69
+ compact_line=1,
70
+ compact_style="cyan",
71
+ ),
72
+ ColumnConfig(
73
+ source_field="context_window",
74
+ header_label="Context",
75
+ formatter=lambda x: f"{x:,}" if x else "-",
76
+ align="right",
77
+ compact_line=1,
78
+ compact_style="yellow",
79
+ ),
80
+ ColumnConfig(
81
+ source_field="max_output_tokens",
82
+ header_label="Max Output",
83
+ formatter=lambda x: f"{x:,}" if x else "-",
84
+ align="right",
85
+ compact_line=2,
86
+ compact_style="dim",
87
+ ),
88
+ ColumnConfig(
89
+ source_field="input_modalities",
90
+ header_label="Input",
91
+ formatter=lambda x: ", ".join(sorted(x)) if x else "-",
92
+ compact_line=2,
93
+ compact_style="dim",
94
+ ),
95
+ ColumnConfig(
96
+ source_field="output_modalities",
97
+ header_label="Output",
98
+ formatter=lambda x: ", ".join(sorted(x)) if x else "-",
99
+ compact_line=2,
100
+ compact_style="dim",
101
+ ),
102
+ ]
103
+ else:
104
+ # Default: simple one-line format (provider/model)
105
+ for model in response.models:
106
+ output.console.print(f"{model.provider_key}/{model.provider_model_name}")
107
+ return
108
+
109
+ # Render table (cast needed due to list invariance)
110
+ output.table(
111
+ items=response.models, # type: ignore[arg-type]
112
+ title=f"Available Models ({response.total_count})",
113
+ columns=columns,
114
+ )
File without changes
@@ -0,0 +1,32 @@
1
+ """Organizations create command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.organizations.create.presenter import present_create_result
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+ from alloy_runtime_types.dtos.organizations import CreateOrganizationRequest
8
+
9
+
10
+ def organizations_create_command(
11
+ name: str = typer.Option(
12
+ ...,
13
+ "-n",
14
+ "--name",
15
+ help="Organization name",
16
+ ),
17
+ ) -> None:
18
+ """Create a new organization.
19
+
20
+ Examples:
21
+ ai organizations create --name "My Company"
22
+ """
23
+ _execute_create(name=name)
24
+
25
+
26
+ @async_command
27
+ async def _execute_create(name: str) -> None:
28
+ request = CreateOrganizationRequest(name=name)
29
+ async with authenticated_client() as (_config, client):
30
+ response = await client.create_organization(request)
31
+
32
+ present_create_result(response)
@@ -0,0 +1,9 @@
1
+ """Presenter for organizations create command output."""
2
+
3
+ from cli.infrastructure.output import OutputService
4
+ from alloy_runtime_types.dtos.organizations import OrganizationResponse
5
+
6
+
7
+ def present_create_result(response: OrganizationResponse) -> None:
8
+ output = OutputService.get()
9
+ output.success(f"Created organization: {response.name}")
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,77 @@
1
+ """Pipeline approval checkpoint decide command implementation."""
2
+
3
+ import json
4
+ from typing import Any, Optional
5
+ from uuid import UUID
6
+
7
+ import typer
8
+
9
+ from cli.commands.flag_utils import validate_uuid
10
+ from cli.commands.pipelines.approvals.presenter import present_approval_checkpoint
11
+ from cli.infrastructure.command import async_command, authenticated_client
12
+
13
+
14
+ def pipelines_approvals_decide_command(
15
+ execution_id: str = typer.Argument(
16
+ ...,
17
+ help="Pipeline execution UUID",
18
+ ),
19
+ approval_key: str = typer.Argument(
20
+ ...,
21
+ help="Approval checkpoint key",
22
+ ),
23
+ approve: bool = typer.Option(
24
+ ...,
25
+ "--approve/--reject",
26
+ help="Approve or reject the checkpoint",
27
+ ),
28
+ data: Optional[str] = typer.Option(
29
+ None,
30
+ "-d",
31
+ "--data",
32
+ help='Decision data as JSON string (e.g. \'{"reason": "looks good"}\')',
33
+ ),
34
+ ) -> None:
35
+ """Submit a decision on an approval checkpoint.
36
+
37
+ Examples:
38
+ ai pipelines approvals decide 123e4567... pe:123:approval:review --approve
39
+ ai pipelines approvals decide 123e4567... pe:123:approval:review --reject
40
+ ai pipelines approvals decide 123e4567... pe:123:approval:review --approve -d '{"reason": "LGTM"}'
41
+ """
42
+ e_uuid = validate_uuid(execution_id, "execution")
43
+
44
+ decision_data: dict[str, Any] | None = None
45
+ if data:
46
+ try:
47
+ decision_data = json.loads(data)
48
+ except json.JSONDecodeError as e:
49
+ raise typer.BadParameter(f"Invalid JSON for --data: {e}")
50
+ if not isinstance(decision_data, dict):
51
+ raise typer.BadParameter("--data must be a JSON object")
52
+
53
+ _execute_decide(
54
+ execution_id=e_uuid,
55
+ approval_key=approval_key,
56
+ approved=approve,
57
+ decision_data=decision_data,
58
+ )
59
+
60
+
61
+ @async_command
62
+ async def _execute_decide(
63
+ execution_id: UUID,
64
+ approval_key: str,
65
+ approved: bool,
66
+ decision_data: dict[str, Any] | None,
67
+ ) -> None:
68
+ """Execute decide approval checkpoint operation."""
69
+ async with authenticated_client() as (_config, client):
70
+ checkpoint = await client.decide_approval(
71
+ execution_id,
72
+ approval_key,
73
+ approved=approved,
74
+ decision_data=decision_data,
75
+ )
76
+
77
+ present_approval_checkpoint(checkpoint)
@@ -0,0 +1,44 @@
1
+ """Pipeline approval checkpoint get command implementation."""
2
+
3
+ from uuid import UUID
4
+
5
+ import typer
6
+
7
+ from cli.commands.flag_utils import validate_uuid
8
+ from cli.commands.pipelines.approvals.presenter import (
9
+ present_approval_checkpoint,
10
+ present_approval_not_found,
11
+ )
12
+ from cli.infrastructure.command import async_command, authenticated_client
13
+
14
+
15
+ def pipelines_approvals_get_command(
16
+ execution_id: str = typer.Argument(
17
+ ...,
18
+ help="Pipeline execution UUID",
19
+ ),
20
+ approval_key: str = typer.Argument(
21
+ ...,
22
+ help="Approval checkpoint key",
23
+ ),
24
+ ) -> None:
25
+ """Get details of an approval checkpoint.
26
+
27
+ Examples:
28
+ ai pipelines approvals get 123e4567... pe:123:approval:review_step
29
+ """
30
+ e_uuid = validate_uuid(execution_id, "execution")
31
+ _execute_get(execution_id=e_uuid, approval_key=approval_key)
32
+
33
+
34
+ @async_command
35
+ async def _execute_get(execution_id: UUID, approval_key: str) -> None:
36
+ """Execute get approval checkpoint operation."""
37
+ async with authenticated_client() as (_config, client):
38
+ checkpoint = await client.get_approval_checkpoint(execution_id, approval_key)
39
+
40
+ if checkpoint is None:
41
+ present_approval_not_found(str(execution_id), approval_key)
42
+ raise typer.Exit(code=1)
43
+
44
+ present_approval_checkpoint(checkpoint)
@@ -0,0 +1,56 @@
1
+ """Presenters for pipeline approval checkpoint command output."""
2
+
3
+ import json
4
+
5
+ from alloy_runtime_sdk.pipeline.types import ApprovalCheckpoint
6
+
7
+ from cli.infrastructure.formatting.fields import format_optional
8
+ from cli.infrastructure.output import OutputService
9
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
10
+
11
+
12
+ def _format_status(status: str) -> str:
13
+ """Format approval status for display."""
14
+ return status
15
+
16
+
17
+ def _format_approved(approved: bool | None) -> str:
18
+ """Format approved boolean for display."""
19
+ if approved is None:
20
+ return "(pending)"
21
+ return "Yes" if approved else "No"
22
+
23
+
24
+ def present_approval_checkpoint(checkpoint: ApprovalCheckpoint) -> None:
25
+ """Present a single approval checkpoint with Rich formatting."""
26
+ output = OutputService.get()
27
+
28
+ fields = [
29
+ FieldConfig("id", "Checkpoint ID", str),
30
+ FieldConfig("pipeline_execution_id", "Execution ID", str),
31
+ FieldConfig("approval_key", "Approval Key"),
32
+ FieldConfig("status", "Status", _format_status),
33
+ FieldConfig("approved", "Approved", _format_approved),
34
+ FieldConfig(
35
+ "decided_by_user_id", "Decided By", lambda v: format_optional(v, str)
36
+ ),
37
+ FieldConfig("decided_at", "Decided At", format_optional),
38
+ FieldConfig("created_at", "Created At"),
39
+ ]
40
+
41
+ output.entity(checkpoint, f"Approval: {checkpoint.status}", fields)
42
+
43
+ if checkpoint.decision_data:
44
+ data_str = json.dumps(checkpoint.decision_data, indent=2)
45
+ if len(data_str) > 500:
46
+ data_str = data_str[:500] + "\n..."
47
+ output.info(f"Decision Data:\n{data_str}")
48
+
49
+
50
+ def present_approval_not_found(execution_id: str, approval_key: str) -> None:
51
+ """Present a not-found message for an approval checkpoint."""
52
+ output = OutputService.get()
53
+ output.warning(
54
+ f"No approval checkpoint found for execution {execution_id} "
55
+ f"with key '{approval_key}'"
56
+ )
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,57 @@
1
+ """Pipeline costs command implementation."""
2
+
3
+ from typing import Optional
4
+ from uuid import UUID
5
+
6
+ import typer
7
+
8
+ from cli.commands.flag_utils import validate_uuid
9
+ from cli.commands.pipelines.costs.presenter import present_pipeline_costs
10
+ from cli.infrastructure.command import async_command, authenticated_client
11
+
12
+
13
+ def pipelines_costs_command(
14
+ pipeline_id: str = typer.Argument(
15
+ ...,
16
+ help="Pipeline UUID",
17
+ ),
18
+ start_date: Optional[str] = typer.Option(
19
+ None,
20
+ "--start",
21
+ help="Start date (ISO 8601, defaults to 30 days ago)",
22
+ ),
23
+ end_date: Optional[str] = typer.Option(
24
+ None,
25
+ "--end",
26
+ help="End date (ISO 8601, defaults to now)",
27
+ ),
28
+ ) -> None:
29
+ """Get cost summary for a pipeline.
30
+
31
+ Examples:
32
+ ai pipelines costs 123e4567-89ab...
33
+ ai pipelines costs 123e4567-89ab... --start 2026-01-01 --end 2026-01-31
34
+ """
35
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
36
+ _execute_costs(
37
+ pipeline_id=pipeline_uuid,
38
+ start_date=start_date,
39
+ end_date=end_date,
40
+ )
41
+
42
+
43
+ @async_command
44
+ async def _execute_costs(
45
+ pipeline_id: UUID,
46
+ start_date: Optional[str],
47
+ end_date: Optional[str],
48
+ ) -> None:
49
+ """Execute get pipeline costs operation."""
50
+ async with authenticated_client() as (_config, client):
51
+ response = await client.get_pipeline_costs(
52
+ pipeline_id,
53
+ start_date=start_date,
54
+ end_date=end_date,
55
+ )
56
+
57
+ present_pipeline_costs(response)
@@ -0,0 +1,54 @@
1
+ """Pipeline daily costs command implementation."""
2
+
3
+ from uuid import UUID
4
+
5
+ import typer
6
+
7
+ from cli.commands.flag_utils import validate_uuid
8
+ from cli.commands.pipelines.costs.daily_presenter import present_pipeline_daily_costs
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def pipeline_costs_daily_command(
13
+ pipeline_id: str = typer.Argument(
14
+ ...,
15
+ help="Pipeline UUID",
16
+ ),
17
+ start_date: str = typer.Option(
18
+ ...,
19
+ "--from",
20
+ help="Start date (ISO 8601, required)",
21
+ ),
22
+ end_date: str = typer.Option(
23
+ ...,
24
+ "--to",
25
+ help="End date (ISO 8601, required)",
26
+ ),
27
+ ) -> None:
28
+ """Get daily cost breakdown for a pipeline.
29
+
30
+ Examples:
31
+ ai pipelines costs daily 123e4567-89ab... --from 2026-01-01 --to 2026-01-31
32
+ """
33
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
34
+ _execute_daily_costs(
35
+ pipeline_id=pipeline_uuid,
36
+ start_date=start_date,
37
+ end_date=end_date,
38
+ )
39
+
40
+
41
+ @async_command
42
+ async def _execute_daily_costs(
43
+ pipeline_id: UUID,
44
+ start_date: str,
45
+ end_date: str,
46
+ ) -> None:
47
+ async with authenticated_client() as (_config, client):
48
+ response = await client.get_pipeline_costs_daily(
49
+ pipeline_id,
50
+ start_date=start_date,
51
+ end_date=end_date,
52
+ )
53
+
54
+ present_pipeline_daily_costs(response)
@@ -0,0 +1,59 @@
1
+ """Presenter for pipeline daily costs command output."""
2
+
3
+ from decimal import Decimal
4
+
5
+ from alloy_runtime_types.dtos.pipeline_costs import DailyCostEntry
6
+
7
+ from cli.infrastructure.output import OutputService
8
+ from cli.infrastructure.renderers.list_renderer import ColumnConfig
9
+
10
+
11
+ def _format_cost(cost: Decimal | None) -> str:
12
+ if cost is None:
13
+ return "-"
14
+ return f"${cost:.4f}"
15
+
16
+
17
+ def present_pipeline_daily_costs(entries: list[DailyCostEntry]) -> None:
18
+ output = OutputService.get()
19
+
20
+ if not entries:
21
+ output.info("No daily cost data found for the specified period")
22
+ return
23
+
24
+ columns = [
25
+ ColumnConfig(
26
+ source_field="date",
27
+ header_label="Date",
28
+ formatter=str,
29
+ compact_line=1,
30
+ compact_style="cyan",
31
+ ),
32
+ ColumnConfig(
33
+ source_field="execution_count",
34
+ header_label="Executions",
35
+ formatter=str,
36
+ compact_line=1,
37
+ compact_style="white",
38
+ ),
39
+ ColumnConfig(
40
+ source_field="total_cost_usd",
41
+ header_label="Total Cost",
42
+ formatter=_format_cost,
43
+ compact_line=1,
44
+ compact_style="green bold",
45
+ ),
46
+ ColumnConfig(
47
+ source_field="avg_cost_usd",
48
+ header_label="Avg Cost",
49
+ formatter=_format_cost,
50
+ compact_line=2,
51
+ compact_style="dim",
52
+ ),
53
+ ]
54
+
55
+ output.table(
56
+ items=entries, # type: ignore[arg-type]
57
+ title=f"Daily Costs ({len(entries)} days)",
58
+ columns=columns,
59
+ )
@@ -0,0 +1,37 @@
1
+ """Presenter for pipeline costs command output."""
2
+
3
+ from alloy_runtime_types.dtos.pipeline_costs import PipelineDefinitionCostSummary
4
+
5
+ from cli.infrastructure.output import OutputService
6
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
7
+
8
+
9
+ def _format_period(response: PipelineDefinitionCostSummary) -> str:
10
+ """Format period dates for display."""
11
+ return f"{response.period_start.strftime('%Y-%m-%d')} to {response.period_end.strftime('%Y-%m-%d')}"
12
+
13
+
14
+ def _format_cost(cost: float | None) -> str:
15
+ """Format cost for display."""
16
+ if cost is None:
17
+ return "-"
18
+ return f"${cost:.4f}"
19
+
20
+
21
+ def present_pipeline_costs(response: PipelineDefinitionCostSummary) -> None:
22
+ """Present pipeline cost summary."""
23
+ output = OutputService.get()
24
+
25
+ fields = [
26
+ FieldConfig("pipeline_definition_id", "Pipeline ID", str),
27
+ FieldConfig("period", "Period", lambda _: _format_period(response)),
28
+ FieldConfig("execution_count", "Total Executions", str),
29
+ FieldConfig("completed_count", "Completed", str),
30
+ FieldConfig("failed_count", "Failed", str),
31
+ FieldConfig("total_cost_usd", "Total Cost", _format_cost),
32
+ FieldConfig("avg_cost_usd", "Avg Cost", _format_cost),
33
+ FieldConfig("min_cost_usd", "Min Cost", _format_cost),
34
+ FieldConfig("max_cost_usd", "Max Cost", _format_cost),
35
+ ]
36
+
37
+ output.entity(response, "Pipeline Cost Summary", fields)
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules