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,103 @@
1
+ """Pipeline create command implementation."""
2
+
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+ import typer
7
+
8
+ from cli.commands.pipelines.create.presenter import present_pipeline_create_success
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+ from alloy_runtime_types.dtos.pipeline import CreatePipelineRequest
11
+
12
+
13
+ def pipelines_create_command(
14
+ name: str = typer.Option(
15
+ ...,
16
+ "--name",
17
+ "-n",
18
+ help="Pipeline name",
19
+ ),
20
+ description: Optional[str] = typer.Option(
21
+ None,
22
+ "--description",
23
+ "-d",
24
+ help="Pipeline description",
25
+ ),
26
+ file: Path = typer.Option(
27
+ ...,
28
+ "--file",
29
+ "-f",
30
+ help="Python file containing @pipeline decorated function",
31
+ exists=True,
32
+ readable=True,
33
+ ),
34
+ function_name: Optional[str] = typer.Option(
35
+ None,
36
+ "--function-name",
37
+ help="Name of the @pipeline function to run (uses first/only if not specified)",
38
+ ),
39
+ public: bool = typer.Option(
40
+ False,
41
+ "--public/--no-public",
42
+ help="Make pipeline publicly accessible",
43
+ ),
44
+ ) -> None:
45
+ """Create a new pipeline from a Python file.
46
+
47
+ The file must contain a @pipeline decorated function.
48
+
49
+ Examples:
50
+ ai pipelines create --name my-pipeline --file pipeline.py
51
+ ai pipelines create -n my-pipeline -f pipeline.py --public
52
+ ai pipelines create -n my-pipeline -f pipeline.py --function-name main_pipeline
53
+ """
54
+ _validate_file_extension(file)
55
+ _execute_create(
56
+ name=name,
57
+ description=description,
58
+ file=file,
59
+ function_name=function_name,
60
+ public=public,
61
+ )
62
+
63
+
64
+ def _validate_file_extension(file: Path) -> None:
65
+ """Validate file has .py extension."""
66
+ if file.suffix != ".py":
67
+ raise typer.BadParameter(
68
+ f"File must have .py extension, got: {file.suffix}",
69
+ param_hint="--file",
70
+ )
71
+
72
+
73
+ def _execute_create(
74
+ name: str,
75
+ description: Optional[str],
76
+ file: Path,
77
+ function_name: Optional[str],
78
+ public: bool,
79
+ ) -> None:
80
+ """Build and execute pipeline creation from command flags."""
81
+ module_content = file.read_text()
82
+
83
+ if not module_content.strip():
84
+ raise typer.BadParameter("Pipeline file cannot be empty", param_hint="--file")
85
+
86
+ request = CreatePipelineRequest(
87
+ name=name,
88
+ description=description,
89
+ module_content=module_content,
90
+ pipeline_function_name=function_name,
91
+ is_public=public,
92
+ )
93
+
94
+ _create_pipeline(request)
95
+
96
+
97
+ @async_command
98
+ async def _create_pipeline(request: CreatePipelineRequest) -> None:
99
+ """Create pipeline via API."""
100
+ async with authenticated_client() as (_config, client):
101
+ response = await client.create_pipeline(request)
102
+
103
+ present_pipeline_create_success(response)
@@ -0,0 +1,22 @@
1
+ """Presenter for pipeline create command output."""
2
+
3
+ from alloy_runtime_types.dtos.pipeline import CreatePipelineResponse
4
+
5
+ from cli.infrastructure.formatting.fields import format_datetime
6
+ from cli.infrastructure.output import OutputService
7
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
8
+
9
+
10
+ def present_pipeline_create_success(response: CreatePipelineResponse) -> None:
11
+ """Present pipeline creation success with Rich formatting."""
12
+ output = OutputService.get()
13
+
14
+ fields = [
15
+ FieldConfig("id", "ID", str),
16
+ FieldConfig("name", "Name"),
17
+ FieldConfig("description", "Description", lambda v: v or "(none)"),
18
+ FieldConfig("is_public", "Public", lambda v: "Yes" if v else "No"),
19
+ FieldConfig("created_at", "Created", format_datetime),
20
+ ]
21
+
22
+ output.entity(response, f"Pipeline Created: {response.name}", fields)
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,51 @@
1
+ from uuid import UUID
2
+ from typing import Annotated
3
+
4
+ import typer
5
+
6
+ from cli.commands.flag_utils import validate_uuid
7
+ from cli.commands.pipelines.env_vars.presenter import present_set_env_vars_result
8
+ from cli.infrastructure.command import async_command, authenticated_client
9
+ from cli.infrastructure.kv_parser import parse_kv_pairs
10
+
11
+ from alloy_runtime_types.dtos.pipeline import SetPipelineEnvVarsRequest
12
+
13
+
14
+ def pipelines_env_vars_command(
15
+ pipeline_id: str = typer.Argument(
16
+ ...,
17
+ help="Pipeline UUID",
18
+ ),
19
+ env: Annotated[
20
+ list[str] | None,
21
+ typer.Option(
22
+ "--env",
23
+ "-e",
24
+ help="Environment variable in KEY=VALUE format (repeatable). Pass no values to clear all.",
25
+ ),
26
+ ] = None,
27
+ ) -> None:
28
+ """Set environment variables on a pipeline.
29
+
30
+ Environment variables are encrypted at rest and injected into pipeline
31
+ executions. They can be overridden at execution time.
32
+
33
+ Examples:
34
+ ai pipelines env-vars 123e4567... --env API_KEY=secret
35
+ ai pipelines env-vars 123e4567... -e KEY1=val1 -e KEY2=val2
36
+ ai pipelines env-vars 123e4567... --env PORT:=8080
37
+ ai pipelines env-vars 123e4567...
38
+ """
39
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
40
+ env_vars = parse_kv_pairs(env)
41
+
42
+ _execute_set(pipeline_id=pipeline_uuid, env_vars=env_vars)
43
+
44
+
45
+ @async_command
46
+ async def _execute_set(pipeline_id: UUID, env_vars: dict[str, str]) -> None:
47
+ async with authenticated_client() as (_config, client):
48
+ request = SetPipelineEnvVarsRequest(env_vars=env_vars)
49
+ response = await client.set_pipeline_env_vars(pipeline_id, request)
50
+
51
+ present_set_env_vars_result(response)
@@ -0,0 +1,16 @@
1
+ from alloy_runtime_types.dtos.pipeline import SetPipelineEnvVarsResponse
2
+
3
+ from cli.infrastructure.output import OutputService
4
+
5
+
6
+ def present_set_env_vars_result(response: SetPipelineEnvVarsResponse) -> None:
7
+ output = OutputService.get()
8
+
9
+ if not response.env_var_keys:
10
+ output.success(f"Cleared all env vars for pipeline {response.pipeline_id}")
11
+ return
12
+
13
+ output.info(f"Set env vars for pipeline {response.pipeline_id}:")
14
+ for key in response.env_var_keys:
15
+ masked = response.masked_values.get(key, "***")
16
+ output.info(f" {key}: {masked}")
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,142 @@
1
+ """Pipeline execute command implementation."""
2
+
3
+ import json
4
+ from typing import Annotated, Any, Optional, cast
5
+ from uuid import UUID
6
+
7
+ import typer
8
+
9
+ from cli.commands.flag_utils import validate_uuid
10
+ from cli.commands.pipelines.execute.presenter import present_execution_result
11
+ from cli.infrastructure.command import async_command, authenticated_client
12
+ from cli.infrastructure.file_content import FileContentError, resolve_content
13
+ from cli.infrastructure.kv_parser import parse_kv_pairs
14
+
15
+ from alloy_runtime_types.dtos.pipeline import ExecutePipelineRequest
16
+
17
+
18
+ def pipelines_execute_command(
19
+ pipeline_id: str = typer.Argument(
20
+ ...,
21
+ help="Pipeline UUID",
22
+ ),
23
+ config: Optional[str] = typer.Option(
24
+ None,
25
+ "-c",
26
+ "--config",
27
+ help="Pipeline config as JSON string or @file.json",
28
+ ),
29
+ timeout: Optional[int] = typer.Option(
30
+ None,
31
+ "-t",
32
+ "--timeout",
33
+ help="Execution timeout in seconds",
34
+ ),
35
+ external_id: Optional[str] = typer.Option(
36
+ None,
37
+ "--external-id",
38
+ help="External identifier for tracking",
39
+ ),
40
+ tags: Optional[str] = typer.Option(
41
+ None,
42
+ "--tags",
43
+ help="Comma-separated tag paths",
44
+ ),
45
+ env: Annotated[
46
+ list[str] | None,
47
+ typer.Option(
48
+ "--env",
49
+ "-e",
50
+ help="Environment variable in KEY=VALUE format (repeatable)",
51
+ ),
52
+ ] = None,
53
+ metadata: Optional[str] = typer.Option(
54
+ None,
55
+ "--metadata",
56
+ help="Metadata as JSON string or @file.json",
57
+ ),
58
+ ) -> None:
59
+ """Execute a pipeline with optional configuration.
60
+
61
+ Examples:
62
+ ai pipelines execute 123e4567-89ab... -c '{"topic": "AI"}'
63
+ ai pipelines execute 123e4567-89ab... -c @config.json
64
+ ai pipelines execute 123e4567-89ab... --timeout 300
65
+ ai pipelines execute 123e4567-89ab... -e API_KEY=secret -e REGION=us-west
66
+ ai pipelines execute 123e4567-89ab... --metadata '{"run_id": "abc123"}'
67
+ """
68
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
69
+
70
+ # Parse config if provided
71
+ config_dict: dict[str, Any] = {}
72
+ if config:
73
+ try:
74
+ resolved = resolve_content(config)
75
+ except FileContentError as e:
76
+ raise typer.BadParameter(str(e))
77
+ if resolved is None:
78
+ raise typer.BadParameter("Could not resolve config content")
79
+ try:
80
+ config_dict = cast(dict[str, Any], json.loads(resolved))
81
+ except json.JSONDecodeError as e:
82
+ raise typer.BadParameter(f"Invalid JSON config: {e}")
83
+
84
+ # Parse tags if provided
85
+ tag_list: list[str] | None = None
86
+ if tags:
87
+ tag_list = [t.strip() for t in tags.split(",") if t.strip()]
88
+
89
+ # Parse env vars if provided
90
+ env_vars_dict: dict[str, str] | None = None
91
+ if env:
92
+ env_vars_dict = parse_kv_pairs(env)
93
+
94
+ # Parse metadata if provided
95
+ metadata_dict: dict[str, Any] | None = None
96
+ if metadata:
97
+ try:
98
+ resolved = resolve_content(metadata)
99
+ except FileContentError as e:
100
+ raise typer.BadParameter(str(e))
101
+ if resolved is None:
102
+ raise typer.BadParameter("Could not resolve metadata content")
103
+ try:
104
+ metadata_dict = cast(dict[str, Any], json.loads(resolved))
105
+ except json.JSONDecodeError as e:
106
+ raise typer.BadParameter(f"Invalid JSON metadata: {e}")
107
+
108
+ _execute_pipeline(
109
+ pipeline_id=pipeline_uuid,
110
+ config_dict=config_dict,
111
+ timeout=timeout,
112
+ external_id=external_id,
113
+ tags=tag_list,
114
+ env_vars=env_vars_dict,
115
+ metadata=metadata_dict,
116
+ )
117
+
118
+
119
+ @async_command
120
+ async def _execute_pipeline(
121
+ pipeline_id: UUID,
122
+ config_dict: dict[str, Any],
123
+ timeout: Optional[int],
124
+ external_id: Optional[str],
125
+ tags: Optional[list[str]],
126
+ env_vars: Optional[dict[str, str]],
127
+ metadata: Optional[dict[str, Any]],
128
+ ) -> None:
129
+ """Execute the pipeline."""
130
+ async with authenticated_client() as (_config, client):
131
+ request = ExecutePipelineRequest(
132
+ config=config_dict,
133
+ timeout_seconds=timeout,
134
+ external_id=external_id,
135
+ tags=tags,
136
+ env_vars=env_vars,
137
+ metadata=metadata,
138
+ )
139
+
140
+ response = await client.execute_pipeline(pipeline_id, request)
141
+
142
+ present_execution_result(response)
@@ -0,0 +1,47 @@
1
+ """Presenter for pipeline execute command output."""
2
+
3
+ import json
4
+
5
+ from alloy_runtime_types.dtos.pipeline import ExecutePipelineResponse
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_tags(response: ExecutePipelineResponse) -> str:
13
+ """Format tags for display."""
14
+ if not response.tags:
15
+ return "(none)"
16
+ return ", ".join(t.tag_path for t in response.tags)
17
+
18
+
19
+ def _format_duration(duration_ms: int | None) -> str:
20
+ """Format duration for display."""
21
+ if not duration_ms:
22
+ return "-"
23
+ return f"{duration_ms}ms"
24
+
25
+
26
+ def present_execution_result(response: ExecutePipelineResponse) -> None:
27
+ """Present pipeline execution result."""
28
+ output = OutputService.get()
29
+
30
+ fields = [
31
+ FieldConfig("execution_id", "Execution ID", str),
32
+ FieldConfig("pipeline_id", "Pipeline ID", str),
33
+ FieldConfig("status", "Status"),
34
+ FieldConfig("external_id", "External ID", format_optional),
35
+ FieldConfig("total_duration_ms", "Duration", _format_duration),
36
+ FieldConfig("error_message", "Error", format_optional),
37
+ FieldConfig("tags", "Tags", lambda _: _format_tags(response)),
38
+ ]
39
+
40
+ output.entity(response, f"Execution: {response.status}", fields)
41
+
42
+ # Show result data if present
43
+ if response.result_data:
44
+ result_str = json.dumps(response.result_data, indent=2)
45
+ if len(result_str) > 500:
46
+ result_str = result_str[:500] + "\n..."
47
+ output.info(f"Result:\n{result_str}")
@@ -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,48 @@
1
+ """Pipeline execution 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.executions.costs.presenter import present_execution_costs
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def pipeline_execution_costs_command(
13
+ pipeline_id: str = typer.Argument(
14
+ ...,
15
+ help="Pipeline UUID",
16
+ ),
17
+ execution_id: str = typer.Argument(
18
+ ...,
19
+ help="Execution UUID",
20
+ ),
21
+ ) -> None:
22
+ """Get cost summary for a pipeline execution.
23
+
24
+ Shows LLM cost, RAG cost, and total cost breakdown.
25
+
26
+ Examples:
27
+ ai pipelines executions costs 123e... 456e...
28
+ """
29
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
30
+ execution_uuid = validate_uuid(execution_id, "execution")
31
+ _execute_costs(
32
+ pipeline_id=pipeline_uuid,
33
+ execution_id=execution_uuid,
34
+ )
35
+
36
+
37
+ @async_command
38
+ async def _execute_costs(
39
+ pipeline_id: UUID,
40
+ execution_id: UUID,
41
+ ) -> None:
42
+ async with authenticated_client() as (_config, client):
43
+ response = await client.get_execution_costs(
44
+ pipeline_id,
45
+ execution_id,
46
+ )
47
+
48
+ present_execution_costs(response)
@@ -0,0 +1,29 @@
1
+ """Presenter for pipeline execution costs command output."""
2
+
3
+ from decimal import Decimal
4
+
5
+ from alloy_runtime_types.dtos.pipeline_costs import PipelineExecutionCostSummary
6
+
7
+ from cli.infrastructure.output import OutputService
8
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
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_execution_costs(response: PipelineExecutionCostSummary) -> None:
18
+ output = OutputService.get()
19
+
20
+ fields = [
21
+ FieldConfig("pipeline_execution_id", "Execution ID", str),
22
+ FieldConfig("llm_cost_usd", "LLM Cost", _format_cost),
23
+ FieldConfig("rag_cost_usd", "RAG Cost", _format_cost),
24
+ FieldConfig("total_cost_usd", "Total Cost", _format_cost),
25
+ FieldConfig("agent_execution_count", "Agent Executions", str),
26
+ FieldConfig("retrieval_count", "RAG Retrievals", str),
27
+ ]
28
+
29
+ output.entity(response, "Execution Cost Summary", fields)
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,50 @@
1
+ """Pipeline execution costs by model 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.executions.costs_by_model.presenter import (
9
+ present_execution_costs_by_model,
10
+ )
11
+ from cli.infrastructure.command import async_command, authenticated_client
12
+
13
+
14
+ def pipeline_execution_costs_by_model_command(
15
+ pipeline_id: str = typer.Argument(
16
+ ...,
17
+ help="Pipeline UUID",
18
+ ),
19
+ execution_id: str = typer.Argument(
20
+ ...,
21
+ help="Execution UUID",
22
+ ),
23
+ ) -> None:
24
+ """Get cost breakdown by model for a pipeline execution.
25
+
26
+ Shows costs grouped by provider and model.
27
+
28
+ Examples:
29
+ ai pipelines executions costs-by-model 123e... 456e...
30
+ """
31
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
32
+ execution_uuid = validate_uuid(execution_id, "execution")
33
+ _execute_costs_by_model(
34
+ pipeline_id=pipeline_uuid,
35
+ execution_id=execution_uuid,
36
+ )
37
+
38
+
39
+ @async_command
40
+ async def _execute_costs_by_model(
41
+ pipeline_id: UUID,
42
+ execution_id: UUID,
43
+ ) -> None:
44
+ async with authenticated_client() as (_config, client):
45
+ response = await client.get_execution_costs_by_model(
46
+ pipeline_id,
47
+ execution_id,
48
+ )
49
+
50
+ present_execution_costs_by_model(response)
@@ -0,0 +1,78 @@
1
+ """Presenter for pipeline execution costs by model command output."""
2
+
3
+ from decimal import Decimal
4
+
5
+ from alloy_runtime_types.dtos.pipeline_costs import ModelCostBreakdown
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_execution_costs_by_model(entries: list[ModelCostBreakdown]) -> None:
18
+ output = OutputService.get()
19
+
20
+ if not entries:
21
+ output.info("No cost data by model found for this execution")
22
+ return
23
+
24
+ columns = [
25
+ ColumnConfig(
26
+ source_field="provider_key",
27
+ header_label="Provider",
28
+ compact_line=1,
29
+ compact_style="cyan",
30
+ ),
31
+ ColumnConfig(
32
+ source_field="model_name",
33
+ header_label="Model",
34
+ compact_line=1,
35
+ compact_style="green",
36
+ ),
37
+ ColumnConfig(
38
+ source_field="execution_count",
39
+ header_label="Executions",
40
+ formatter=str,
41
+ compact_line=1,
42
+ compact_style="white",
43
+ ),
44
+ ColumnConfig(
45
+ source_field="total_tokens",
46
+ header_label="Total Tokens",
47
+ formatter=lambda x: f"{x:,}",
48
+ compact_line=2,
49
+ compact_style="dim",
50
+ ),
51
+ ColumnConfig(
52
+ source_field="llm_cost_usd",
53
+ header_label="LLM Cost",
54
+ formatter=_format_cost,
55
+ compact_line=2,
56
+ compact_style="dim",
57
+ ),
58
+ ColumnConfig(
59
+ source_field="rag_cost_usd",
60
+ header_label="RAG Cost",
61
+ formatter=_format_cost,
62
+ compact_line=2,
63
+ compact_style="dim",
64
+ ),
65
+ ColumnConfig(
66
+ source_field="total_cost_usd",
67
+ header_label="Total Cost",
68
+ formatter=_format_cost,
69
+ compact_line=1,
70
+ compact_style="green bold",
71
+ ),
72
+ ]
73
+
74
+ output.table(
75
+ items=entries, # type: ignore[arg-type]
76
+ title=f"Costs by Model ({len(entries)} models)",
77
+ columns=columns,
78
+ )
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,50 @@
1
+ """Pipeline execution costs by step 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.executions.costs_by_step.presenter import (
9
+ present_execution_costs_by_step,
10
+ )
11
+ from cli.infrastructure.command import async_command, authenticated_client
12
+
13
+
14
+ def pipeline_execution_costs_by_step_command(
15
+ pipeline_id: str = typer.Argument(
16
+ ...,
17
+ help="Pipeline UUID",
18
+ ),
19
+ execution_id: str = typer.Argument(
20
+ ...,
21
+ help="Execution UUID",
22
+ ),
23
+ ) -> None:
24
+ """Get cost breakdown by step for a pipeline execution.
25
+
26
+ Shows costs grouped by pipeline step.
27
+
28
+ Examples:
29
+ ai pipelines executions costs-by-step 123e... 456e...
30
+ """
31
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
32
+ execution_uuid = validate_uuid(execution_id, "execution")
33
+ _execute_costs_by_step(
34
+ pipeline_id=pipeline_uuid,
35
+ execution_id=execution_uuid,
36
+ )
37
+
38
+
39
+ @async_command
40
+ async def _execute_costs_by_step(
41
+ pipeline_id: UUID,
42
+ execution_id: UUID,
43
+ ) -> None:
44
+ async with authenticated_client() as (_config, client):
45
+ response = await client.get_execution_costs_by_step(
46
+ pipeline_id,
47
+ execution_id,
48
+ )
49
+
50
+ present_execution_costs_by_step(response)