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,66 @@
1
+ """Presenter for pipelines list command output."""
2
+
3
+ from alloy_runtime_types.dtos.pipeline import ListPipelinesResponse
4
+
5
+ from cli.infrastructure.output import OutputService
6
+ from cli.infrastructure.renderers.list_renderer import ColumnConfig
7
+
8
+
9
+ def _format_description(description: str | None) -> str:
10
+ """Format description for display, truncating if too long."""
11
+ if not description:
12
+ return "-"
13
+ if len(description) > 100:
14
+ return description[:97] + "..."
15
+ return description
16
+
17
+
18
+ def present_pipelines_list(response: ListPipelinesResponse) -> None:
19
+ """Present list of pipelines with Rich table formatting."""
20
+ output = OutputService.get()
21
+
22
+ if not response.pipelines:
23
+ output.info("No pipelines found")
24
+ return
25
+
26
+ columns = [
27
+ ColumnConfig(
28
+ source_field="id",
29
+ header_label="ID",
30
+ compact_line=1,
31
+ compact_style="cyan",
32
+ ),
33
+ ColumnConfig(
34
+ source_field="is_public",
35
+ header_label="Public",
36
+ formatter=lambda x: "Yes" if x else "No",
37
+ compact_line=1,
38
+ compact_style="green",
39
+ ),
40
+ ColumnConfig(
41
+ source_field="created_at",
42
+ header_label="Created",
43
+ formatter=lambda x: x.strftime("%Y-%m-%d") if x else "-",
44
+ compact_line=1,
45
+ compact_style="blue",
46
+ ),
47
+ ColumnConfig(
48
+ source_field="name",
49
+ header_label="Name",
50
+ compact_line=2,
51
+ compact_style="white bold",
52
+ ),
53
+ ColumnConfig(
54
+ source_field="description",
55
+ header_label="Description",
56
+ formatter=_format_description,
57
+ compact_line=2,
58
+ compact_style="dim",
59
+ ),
60
+ ]
61
+
62
+ output.table(
63
+ items=response.pipelines, # type: ignore[arg-type]
64
+ title=f"Pipelines ({response.total})",
65
+ columns=columns,
66
+ )
@@ -0,0 +1 @@
1
+ # Empty per project convention - import directly from submodules
@@ -0,0 +1,119 @@
1
+ """Pipeline schedule create command implementation."""
2
+
3
+ import json
4
+ from typing import Annotated, Any
5
+ from uuid import UUID
6
+
7
+ import typer
8
+
9
+ from alloy_runtime_types.dtos.schedule import (
10
+ CreateScheduleRequest,
11
+ CronSchedule,
12
+ )
13
+ from cli.commands.flag_utils import validate_uuid
14
+ from cli.commands.pipelines.schedules.create_presenter import present_create_result
15
+ from cli.infrastructure.command import async_command, authenticated_client
16
+
17
+
18
+ def pipelines_schedules_create_command(
19
+ pipeline_id: str = typer.Argument(
20
+ ...,
21
+ help="Pipeline UUID",
22
+ ),
23
+ name: str = typer.Option(
24
+ ...,
25
+ "-n",
26
+ "--name",
27
+ help="Schedule name",
28
+ ),
29
+ cron: str = typer.Option(
30
+ ...,
31
+ "--cron",
32
+ help="Cron expression (5 fields: minute hour day month weekday)",
33
+ ),
34
+ description: Annotated[
35
+ str | None,
36
+ typer.Option(
37
+ "-d",
38
+ "--description",
39
+ help="Schedule description",
40
+ ),
41
+ ] = None,
42
+ timezone: str = typer.Option(
43
+ "UTC",
44
+ "--timezone",
45
+ "-tz",
46
+ help="IANA timezone (e.g. America/Chicago, Europe/London)",
47
+ ),
48
+ input_params: Annotated[
49
+ str | None,
50
+ typer.Option(
51
+ "--input-params",
52
+ "-i",
53
+ help="Input parameters as JSON string",
54
+ ),
55
+ ] = None,
56
+ timeout: int = typer.Option(
57
+ 300,
58
+ "--timeout",
59
+ "-t",
60
+ help="Execution timeout in seconds (1-3600)",
61
+ min=1,
62
+ max=3600,
63
+ ),
64
+ disabled: bool = typer.Option(
65
+ False,
66
+ "--disabled",
67
+ help="Create schedule in disabled state",
68
+ ),
69
+ allow_concurrent: bool = typer.Option(
70
+ False,
71
+ "--allow-concurrent",
72
+ help="Allow concurrent executions",
73
+ ),
74
+ max_failures: int = typer.Option(
75
+ 5,
76
+ "--max-failures",
77
+ help="Auto-disable after this many consecutive failures (0 = never)",
78
+ min=0,
79
+ ),
80
+ ) -> None:
81
+ """Create a recurring schedule for a pipeline.
82
+
83
+ Examples:
84
+ ai pipelines schedules create 123e4567... -n 'Daily Report' --cron '0 9 * * *'
85
+ ai pipelines schedules create 123e4567... -n 'Weekly' --cron '0 9 * * 1' --timezone America/Chicago
86
+ ai pipelines schedules create 123e4567... -n 'Hourly' --cron '0 * * * *' -i '{"key": "value"}'
87
+ """
88
+ p_uuid = validate_uuid(pipeline_id, "pipeline")
89
+
90
+ params: dict[str, Any] = {}
91
+ if input_params:
92
+ try:
93
+ params = json.loads(input_params)
94
+ except json.JSONDecodeError as e:
95
+ raise typer.BadParameter(f"Invalid JSON for --input-params: {e}")
96
+
97
+ schedule_expr = CronSchedule(expression=cron, timezone=timezone)
98
+
99
+ request = CreateScheduleRequest(
100
+ name=name,
101
+ description=description,
102
+ schedule=schedule_expr,
103
+ input_parameters=params,
104
+ timeout_seconds=timeout,
105
+ is_enabled=not disabled,
106
+ allow_concurrent=allow_concurrent,
107
+ max_consecutive_failures=max_failures,
108
+ )
109
+
110
+ _execute_create(pipeline_id=p_uuid, request=request)
111
+
112
+
113
+ @async_command
114
+ async def _execute_create(pipeline_id: UUID, request: CreateScheduleRequest) -> None:
115
+ """Execute create schedule operation."""
116
+ async with authenticated_client() as (_config, client):
117
+ response = await client.create_pipeline_schedule(pipeline_id, request)
118
+
119
+ present_create_result(response)
@@ -0,0 +1,35 @@
1
+ """Presenter for pipeline schedule create command output."""
2
+
3
+ from alloy_runtime_types.dtos.schedule import CreateScheduleResponse
4
+
5
+ from cli.infrastructure.output import OutputService
6
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
7
+
8
+
9
+ def present_create_result(response: CreateScheduleResponse) -> None:
10
+ """Present created schedule details."""
11
+ output = OutputService.get()
12
+
13
+ from cli.infrastructure.formatting.fields import format_optional
14
+
15
+ fields = [
16
+ FieldConfig("id", "Schedule ID", str),
17
+ FieldConfig("pipeline_id", "Pipeline ID", str),
18
+ FieldConfig("name", "Name"),
19
+ FieldConfig("description", "Description", format_optional),
20
+ FieldConfig("schedule_type", "Type"),
21
+ FieldConfig("timezone", "Timezone"),
22
+ FieldConfig("is_enabled", "Enabled", lambda v: "Yes" if v else "No"),
23
+ FieldConfig(
24
+ "next_run_at",
25
+ "Next Run",
26
+ lambda v: v.strftime("%Y-%m-%d %H:%M:%S %Z") if v else "N/A",
27
+ ),
28
+ FieldConfig(
29
+ "created_at",
30
+ "Created",
31
+ lambda v: v.strftime("%Y-%m-%d %H:%M:%S %Z") if v else "N/A",
32
+ ),
33
+ ]
34
+
35
+ output.entity(response, f"Created schedule: {response.name}", fields)
@@ -0,0 +1,52 @@
1
+ """Pipeline schedule delete 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.schedules.presenter import present_delete_result
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+ from cli.infrastructure.console import Confirm
11
+
12
+
13
+ def pipelines_schedules_delete_command(
14
+ pipeline_id: str = typer.Argument(
15
+ ...,
16
+ help="Pipeline UUID",
17
+ ),
18
+ schedule_id: str = typer.Argument(
19
+ ...,
20
+ help="Schedule UUID",
21
+ ),
22
+ yes: bool = typer.Option(
23
+ False,
24
+ "-y",
25
+ "--yes",
26
+ help="Skip confirmation",
27
+ ),
28
+ ) -> None:
29
+ """Delete a pipeline schedule.
30
+
31
+ Examples:
32
+ ai pipelines schedules delete 123e4567... 456e7890...
33
+ ai pipelines schedules delete 123e4567... 456e7890... -y
34
+ """
35
+ p_uuid = validate_uuid(pipeline_id, "pipeline")
36
+ s_uuid = validate_uuid(schedule_id, "schedule")
37
+
38
+ if not yes:
39
+ confirmed = Confirm.ask(f"[yellow]Delete schedule {schedule_id}?[/yellow]")
40
+ if not confirmed:
41
+ raise typer.Abort()
42
+
43
+ _execute_delete(pipeline_id=p_uuid, schedule_id=s_uuid)
44
+
45
+
46
+ @async_command
47
+ async def _execute_delete(pipeline_id: UUID, schedule_id: UUID) -> None:
48
+ """Execute delete schedule operation."""
49
+ async with authenticated_client() as (_config, client):
50
+ response = await client.delete_pipeline_schedule(pipeline_id, schedule_id)
51
+
52
+ present_delete_result(response)
@@ -0,0 +1,59 @@
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.schedules.env_vars_presenter import (
8
+ present_set_env_vars_result,
9
+ )
10
+ from cli.infrastructure.command import async_command, authenticated_client
11
+ from cli.infrastructure.kv_parser import parse_kv_pairs
12
+
13
+ from alloy_runtime_types.dtos.schedule import SetScheduleEnvVarsRequest
14
+
15
+
16
+ def pipelines_schedules_env_vars_command(
17
+ pipeline_id: str = typer.Argument(
18
+ ...,
19
+ help="Pipeline UUID",
20
+ ),
21
+ schedule_id: str = typer.Argument(
22
+ ...,
23
+ help="Schedule UUID",
24
+ ),
25
+ env: Annotated[
26
+ list[str] | None,
27
+ typer.Option(
28
+ "--env",
29
+ "-e",
30
+ help="Environment variable in KEY=VALUE format (repeatable). Pass no values to clear all.",
31
+ ),
32
+ ] = None,
33
+ ) -> None:
34
+ """Set environment variables on a pipeline schedule.
35
+
36
+ Schedule-level env vars override pipeline-level env vars when the
37
+ schedule triggers execution.
38
+
39
+ Examples:
40
+ ai pipelines schedules env-vars 123e4567... 456e7890... --env API_KEY=secret
41
+ ai pipelines schedules env-vars 123e4567... 456e7890... -e KEY1=val1 -e KEY2=val2
42
+ ai pipelines schedules env-vars 123e4567... 456e7890...
43
+ """
44
+ p_uuid = validate_uuid(pipeline_id, "pipeline")
45
+ s_uuid = validate_uuid(schedule_id, "schedule")
46
+ env_vars = parse_kv_pairs(env)
47
+
48
+ _execute_set(pipeline_id=p_uuid, schedule_id=s_uuid, env_vars=env_vars)
49
+
50
+
51
+ @async_command
52
+ async def _execute_set(
53
+ pipeline_id: UUID, schedule_id: UUID, env_vars: dict[str, str]
54
+ ) -> None:
55
+ async with authenticated_client() as (_config, client):
56
+ request = SetScheduleEnvVarsRequest(env_vars=env_vars)
57
+ response = await client.set_schedule_env_vars(pipeline_id, schedule_id, request)
58
+
59
+ present_set_env_vars_result(response)
@@ -0,0 +1,16 @@
1
+ from alloy_runtime_types.dtos.schedule import SetScheduleEnvVarsResponse
2
+
3
+ from cli.infrastructure.output import OutputService
4
+
5
+
6
+ def present_set_env_vars_result(response: SetScheduleEnvVarsResponse) -> None:
7
+ output = OutputService.get()
8
+
9
+ if not response.env_var_keys:
10
+ output.success(f"Cleared all env vars for schedule {response.schedule_id}")
11
+ return
12
+
13
+ output.info(f"Set env vars for schedule {response.schedule_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,38 @@
1
+ """Pipeline schedule 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.schedules.presenter import present_schedule_detail
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def pipelines_schedules_get_command(
13
+ pipeline_id: str = typer.Argument(
14
+ ...,
15
+ help="Pipeline UUID",
16
+ ),
17
+ schedule_id: str = typer.Argument(
18
+ ...,
19
+ help="Schedule UUID",
20
+ ),
21
+ ) -> None:
22
+ """Get details of a pipeline schedule.
23
+
24
+ Examples:
25
+ ai pipelines schedules get 123e4567... 456e7890...
26
+ """
27
+ p_uuid = validate_uuid(pipeline_id, "pipeline")
28
+ s_uuid = validate_uuid(schedule_id, "schedule")
29
+ _execute_get(pipeline_id=p_uuid, schedule_id=s_uuid)
30
+
31
+
32
+ @async_command
33
+ async def _execute_get(pipeline_id: UUID, schedule_id: UUID) -> None:
34
+ """Execute get schedule operation."""
35
+ async with authenticated_client() as (_config, client):
36
+ response = await client.get_pipeline_schedule(pipeline_id, schedule_id)
37
+
38
+ present_schedule_detail(response)
@@ -0,0 +1,33 @@
1
+ """Pipeline schedules list 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.schedules.presenter import present_schedules_list
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def pipelines_schedules_list_command(
13
+ pipeline_id: str = typer.Argument(
14
+ ...,
15
+ help="Pipeline UUID",
16
+ ),
17
+ ) -> None:
18
+ """List schedules for a pipeline.
19
+
20
+ Examples:
21
+ ai pipelines schedules list 123e4567-89ab...
22
+ """
23
+ pipeline_uuid = validate_uuid(pipeline_id, "pipeline")
24
+ _execute_list(pipeline_id=pipeline_uuid)
25
+
26
+
27
+ @async_command
28
+ async def _execute_list(pipeline_id: UUID) -> None:
29
+ """Execute list schedules operation."""
30
+ async with authenticated_client() as (_config, client):
31
+ response = await client.list_pipeline_schedules(pipeline_id)
32
+
33
+ present_schedules_list(response)
@@ -0,0 +1,90 @@
1
+ """Pipeline schedule once command implementation."""
2
+
3
+ import json
4
+ from typing import Annotated, Any
5
+ from uuid import UUID
6
+
7
+ import typer
8
+
9
+ from alloy_runtime_types.dtos.schedule import ScheduleOnceRequest
10
+ from cli.commands.flag_utils import validate_uuid
11
+ from cli.commands.pipelines.schedules.once_presenter import present_once_result
12
+ from cli.infrastructure.command import async_command, authenticated_client
13
+
14
+
15
+ def pipelines_schedules_once_command(
16
+ pipeline_id: str = typer.Argument(
17
+ ...,
18
+ help="Pipeline UUID",
19
+ ),
20
+ scheduled_for: str = typer.Option(
21
+ ...,
22
+ "--scheduled-for",
23
+ "-s",
24
+ help="When to execute (ISO 8601 datetime, e.g. 2026-03-01T15:00:00)",
25
+ ),
26
+ timezone: str = typer.Option(
27
+ "UTC",
28
+ "--timezone",
29
+ "-tz",
30
+ help="IANA timezone for interpreting scheduled_for",
31
+ ),
32
+ input_params: Annotated[
33
+ str | None,
34
+ typer.Option(
35
+ "--input-params",
36
+ "-i",
37
+ help="Input parameters as JSON string",
38
+ ),
39
+ ] = None,
40
+ timeout: int = typer.Option(
41
+ 300,
42
+ "--timeout",
43
+ "-t",
44
+ help="Execution timeout in seconds (1-3600)",
45
+ min=1,
46
+ max=3600,
47
+ ),
48
+ ) -> None:
49
+ """Schedule a one-time pipeline execution.
50
+
51
+ Examples:
52
+ ai pipelines schedules once 123e4567... --scheduled-for 2026-03-01T15:00:00
53
+ ai pipelines schedules once 123e4567... -s 2026-03-01T15:00:00 --timezone America/New_York
54
+ ai pipelines schedules once 123e4567... -s 2026-03-01T15:00:00 -i '{"key": "value"}'
55
+ """
56
+ from datetime import datetime as dt
57
+
58
+ p_uuid = validate_uuid(pipeline_id, "pipeline")
59
+
60
+ try:
61
+ scheduled_dt = dt.fromisoformat(scheduled_for)
62
+ except ValueError:
63
+ raise typer.BadParameter(
64
+ f"Invalid datetime format: '{scheduled_for}'. Use ISO 8601 (e.g. 2026-03-01T15:00:00)"
65
+ )
66
+
67
+ params: dict[str, Any] = {}
68
+ if input_params:
69
+ try:
70
+ params = json.loads(input_params)
71
+ except json.JSONDecodeError as e:
72
+ raise typer.BadParameter(f"Invalid JSON for --input-params: {e}")
73
+
74
+ request = ScheduleOnceRequest(
75
+ scheduled_for=scheduled_dt,
76
+ timezone=timezone,
77
+ input_parameters=params,
78
+ timeout_seconds=timeout,
79
+ )
80
+
81
+ _execute_once(pipeline_id=p_uuid, request=request)
82
+
83
+
84
+ @async_command
85
+ async def _execute_once(pipeline_id: UUID, request: ScheduleOnceRequest) -> None:
86
+ """Execute schedule-once operation."""
87
+ async with authenticated_client() as (_config, client):
88
+ response = await client.schedule_pipeline_once(pipeline_id, request)
89
+
90
+ present_once_result(response)
@@ -0,0 +1,30 @@
1
+ """Presenter for pipeline schedule once command output."""
2
+
3
+ from alloy_runtime_types.dtos.schedule import ScheduleOnceResponse
4
+
5
+ from cli.infrastructure.output import OutputService
6
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
7
+
8
+
9
+ def present_once_result(response: ScheduleOnceResponse) -> None:
10
+ """Present scheduled one-time execution details."""
11
+ output = OutputService.get()
12
+
13
+ fields = [
14
+ FieldConfig("id", "Execution ID", str),
15
+ FieldConfig("pipeline_id", "Pipeline ID", str),
16
+ FieldConfig(
17
+ "scheduled_for",
18
+ "Scheduled For",
19
+ lambda v: v.strftime("%Y-%m-%d %H:%M:%S %Z") if v else "N/A",
20
+ ),
21
+ FieldConfig("timezone", "Timezone"),
22
+ FieldConfig("status", "Status", lambda v: v.capitalize()),
23
+ FieldConfig(
24
+ "created_at",
25
+ "Created",
26
+ lambda v: v.strftime("%Y-%m-%d %H:%M:%S %Z") if v else "N/A",
27
+ ),
28
+ ]
29
+
30
+ output.entity(response, "Scheduled one-time execution", fields)
@@ -0,0 +1,104 @@
1
+ """Presenters for pipeline schedules command output."""
2
+
3
+ from datetime import datetime
4
+
5
+ from alloy_runtime_types.dtos.schedule import (
6
+ DeleteScheduleResponse,
7
+ GetScheduleResponse,
8
+ ListSchedulesResponse,
9
+ )
10
+
11
+ from cli.infrastructure.output import OutputService
12
+ from cli.infrastructure.renderers.list_renderer import ColumnConfig
13
+
14
+
15
+ def present_schedules_list(response: ListSchedulesResponse) -> None:
16
+ """Present list of schedules with Rich table formatting."""
17
+ output = OutputService.get()
18
+
19
+ if not response.schedules:
20
+ output.info("No schedules found")
21
+ return
22
+
23
+ columns = [
24
+ ColumnConfig(
25
+ source_field="id",
26
+ header_label="ID",
27
+ compact_line=1,
28
+ compact_style="cyan",
29
+ ),
30
+ ColumnConfig(
31
+ source_field="is_enabled",
32
+ header_label="Enabled",
33
+ formatter=lambda x: "Yes" if x else "No",
34
+ compact_line=1,
35
+ compact_style="green",
36
+ ),
37
+ ColumnConfig(
38
+ source_field="schedule_type",
39
+ header_label="Type",
40
+ compact_line=1,
41
+ compact_style="yellow",
42
+ ),
43
+ ColumnConfig(
44
+ source_field="name",
45
+ header_label="Name",
46
+ compact_line=2,
47
+ compact_style="white bold",
48
+ ),
49
+ ColumnConfig(
50
+ source_field="next_run_at",
51
+ header_label="Next Run",
52
+ formatter=lambda x: x.strftime("%Y-%m-%d %H:%M") if x else "Never",
53
+ compact_line=2,
54
+ compact_style="blue",
55
+ ),
56
+ ]
57
+
58
+ output.table(
59
+ items=response.schedules, # type: ignore[arg-type]
60
+ title=f"Schedules ({response.total})",
61
+ columns=columns,
62
+ )
63
+
64
+
65
+ def present_schedule_detail(response: GetScheduleResponse) -> None:
66
+ """Present schedule details with Rich formatting."""
67
+ output = OutputService.get()
68
+
69
+ from cli.infrastructure.formatting.fields import format_optional
70
+ from cli.infrastructure.renderers.entity_renderer import FieldConfig
71
+
72
+ def _format_datetime_with_tz(dt: datetime | None) -> str:
73
+ """Format datetime with timezone."""
74
+ return format_optional(dt, lambda x: x.strftime("%Y-%m-%d %H:%M:%S %Z"))
75
+
76
+ fields = [
77
+ FieldConfig("id", "Schedule ID", str),
78
+ FieldConfig("pipeline_id", "Pipeline ID", str),
79
+ FieldConfig("name", "Name"),
80
+ FieldConfig("description", "Description", format_optional),
81
+ FieldConfig("schedule_type", "Type"),
82
+ FieldConfig("timezone", "Timezone"),
83
+ FieldConfig("is_enabled", "Enabled", lambda v: "Yes" if v else "No"),
84
+ FieldConfig("cron_expression", "Cron Expression", format_optional),
85
+ FieldConfig("rrule_freq", "RRULE Freq", format_optional),
86
+ FieldConfig(
87
+ "rrule_interval", "RRULE Interval", lambda v: str(v) if v and v > 1 else "-"
88
+ ),
89
+ FieldConfig("next_run_at", "Next Run", _format_datetime_with_tz),
90
+ FieldConfig("last_run_at", "Last Run", _format_datetime_with_tz),
91
+ FieldConfig("consecutive_failures", "Consecutive Failures", str),
92
+ FieldConfig(
93
+ "allow_concurrent", "Allow Concurrent", lambda v: "Yes" if v else "No"
94
+ ),
95
+ FieldConfig("max_consecutive_failures", "Max Failures", str),
96
+ ]
97
+
98
+ output.entity(response, f"Schedule: {response.name}", fields)
99
+
100
+
101
+ def present_delete_result(response: DeleteScheduleResponse) -> None:
102
+ """Present schedule deletion result."""
103
+ output = OutputService.get()
104
+ output.success(f"Deleted schedule {response.id}")