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,366 @@
1
+ """Shared flag validation and parsing utilities.
2
+
3
+ This module provides reusable validation functions for common flag patterns.
4
+ Import these in command handlers to avoid duplicating validation logic.
5
+
6
+ Usage:
7
+ from cli.commands.flag_utils import validate_provider, validate_uuid, parse_tags
8
+
9
+ def my_command(provider: str, id: str, tags: str | None) -> None:
10
+ provider_enum = validate_provider(provider)
11
+ uuid = validate_uuid(id, "resource")
12
+ tag_list = parse_tags(tags)
13
+ """
14
+
15
+ from uuid import UUID
16
+
17
+ import typer
18
+
19
+ from alloy_runtime_types.dtos.knowledge import (
20
+ SectionStrategyType,
21
+ SourceType,
22
+ )
23
+ from alloy_runtime_types.enums.ownership_scope import OwnershipScope
24
+ from alloy_runtime_types.enums.provider import Provider
25
+ from alloy_runtime_types.enums.schema_enums import SchemaFormat
26
+ from alloy_runtime_types.enums.template_enums import (
27
+ TemplateContentType,
28
+ TemplateVisibility,
29
+ )
30
+
31
+
32
+ def validate_provider(provider: str) -> Provider:
33
+ """Validate and convert provider string to Provider enum.
34
+
35
+ Args:
36
+ provider: Provider key string (e.g., 'openai', 'anthropic')
37
+
38
+ Returns:
39
+ Provider enum value
40
+
41
+ Raises:
42
+ typer.BadParameter: If provider is invalid
43
+ """
44
+ try:
45
+ return Provider(provider.lower())
46
+ except ValueError:
47
+ valid = [p.value for p in Provider if not p.name.startswith("TESTING")]
48
+ raise typer.BadParameter(
49
+ f"Invalid provider '{provider}'. Valid: {', '.join(valid[:8])}..."
50
+ )
51
+
52
+
53
+ def validate_uuid(value: str, name: str = "ID") -> UUID:
54
+ """Validate and convert string to UUID.
55
+
56
+ Args:
57
+ value: UUID string
58
+ name: Field name for error message (e.g., "agent", "template")
59
+
60
+ Returns:
61
+ UUID object
62
+
63
+ Raises:
64
+ typer.BadParameter: If UUID format is invalid
65
+ """
66
+ try:
67
+ return UUID(value)
68
+ except ValueError:
69
+ raise typer.BadParameter(f"Invalid {name} UUID format: '{value}'")
70
+
71
+
72
+ def validate_scope(scope: str) -> OwnershipScope:
73
+ """Validate and convert scope string to OwnershipScope enum.
74
+
75
+ Args:
76
+ scope: Scope string ('user', 'organization', 'global')
77
+
78
+ Returns:
79
+ OwnershipScope enum value
80
+
81
+ Raises:
82
+ typer.BadParameter: If scope is invalid
83
+ """
84
+ try:
85
+ return OwnershipScope(scope.lower())
86
+ except ValueError:
87
+ valid = ", ".join(s.value for s in OwnershipScope)
88
+ raise typer.BadParameter(f"Invalid scope '{scope}'. Valid: {valid}")
89
+
90
+
91
+ def validate_visibility(visibility: str) -> TemplateVisibility:
92
+ """Validate and convert visibility string to TemplateVisibility enum.
93
+
94
+ Args:
95
+ visibility: Visibility string ('private', 'organization', 'public')
96
+
97
+ Returns:
98
+ TemplateVisibility enum value
99
+
100
+ Raises:
101
+ typer.BadParameter: If visibility is invalid
102
+ """
103
+ try:
104
+ return TemplateVisibility(visibility.lower())
105
+ except ValueError:
106
+ valid = ", ".join(v.value for v in TemplateVisibility)
107
+ raise typer.BadParameter(f"Invalid visibility '{visibility}'. Valid: {valid}")
108
+
109
+
110
+ def validate_template_content_type(content_type: str) -> TemplateContentType:
111
+ """Validate and convert content type string to TemplateContentType enum.
112
+
113
+ Args:
114
+ content_type: Content type string ('system_instruction', 'user_message', 'fragment')
115
+
116
+ Returns:
117
+ TemplateContentType enum value
118
+
119
+ Raises:
120
+ typer.BadParameter: If content type is invalid
121
+ """
122
+ try:
123
+ return TemplateContentType(content_type.lower())
124
+ except ValueError:
125
+ valid = ", ".join(ct.value for ct in TemplateContentType)
126
+ raise typer.BadParameter(f"Invalid type '{content_type}'. Valid: {valid}")
127
+
128
+
129
+ def validate_schema_format(schema_format: str) -> SchemaFormat:
130
+ """Validate and convert schema format string to SchemaFormat enum.
131
+
132
+ Args:
133
+ schema_format: Schema format string ('json_schema', 'regex')
134
+
135
+ Returns:
136
+ SchemaFormat enum value
137
+
138
+ Raises:
139
+ typer.BadParameter: If schema format is invalid
140
+ """
141
+ try:
142
+ return SchemaFormat(schema_format.lower())
143
+ except ValueError:
144
+ valid = ", ".join(f.value for f in SchemaFormat)
145
+ raise typer.BadParameter(
146
+ f"Invalid schema format '{schema_format}'. Valid: {valid}"
147
+ )
148
+
149
+
150
+ def validate_section_strategy(strategy: str) -> SectionStrategyType:
151
+ """Validate section strategy for knowledge collection chunking.
152
+
153
+ Args:
154
+ strategy: Strategy string ('heading_based', 'paragraph_based', 'fixed_size', 'none')
155
+
156
+ Returns:
157
+ Valid SectionStrategyType value
158
+
159
+ Raises:
160
+ typer.BadParameter: If strategy is invalid
161
+ """
162
+ valid_strategies = ["heading_based", "paragraph_based", "fixed_size", "none"]
163
+ lower = strategy.lower()
164
+ if lower not in valid_strategies:
165
+ raise typer.BadParameter(
166
+ f"Invalid section strategy '{strategy}'. Valid: {', '.join(valid_strategies)}"
167
+ )
168
+ return lower # type: ignore[return-value]
169
+
170
+
171
+ def validate_source_type(source_type: str) -> SourceType:
172
+ """Validate source type for document ingestion.
173
+
174
+ Args:
175
+ source_type: Source type string ('upload', 'paste', 'api_import', 'url_scrape')
176
+
177
+ Returns:
178
+ Valid SourceType value
179
+
180
+ Raises:
181
+ typer.BadParameter: If source type is invalid
182
+ """
183
+ valid_types = ["upload", "paste", "api_import", "url_scrape"]
184
+ lower = source_type.lower()
185
+ if lower not in valid_types:
186
+ raise typer.BadParameter(
187
+ f"Invalid source type '{source_type}'. Valid: {', '.join(valid_types)}"
188
+ )
189
+ return lower # type: ignore[return-value]
190
+
191
+
192
+ def validate_document_type(
193
+ document_type: str,
194
+ ) -> str:
195
+ """Validate document type for preprocessing.
196
+
197
+ Args:
198
+ document_type: Document type string ('transcript', 'sales_call', 'markdown', 'document')
199
+
200
+ Returns:
201
+ Valid document type string
202
+
203
+ Raises:
204
+ typer.BadParameter: If document type is invalid
205
+ """
206
+ valid_types = ["transcript", "markdown", "document"]
207
+ lower = document_type.lower()
208
+ if lower not in valid_types:
209
+ raise typer.BadParameter(
210
+ f"Invalid document type '{document_type}'. Valid: {', '.join(valid_types)}"
211
+ )
212
+ return lower
213
+
214
+
215
+ def validate_output_mode(
216
+ output_mode: str,
217
+ output_file: str | None,
218
+ valid_modes: tuple[str, ...] = ("console", "clipboard", "file"),
219
+ ) -> None:
220
+ """Validate output mode and file path combination.
221
+
222
+ Args:
223
+ output_mode: Output mode ('console', 'clipboard', 'file', 'editor')
224
+ output_file: Output file path (required for 'file' mode)
225
+ valid_modes: Tuple of valid mode strings
226
+
227
+ Raises:
228
+ typer.BadParameter: If mode is invalid or file required but not provided
229
+ """
230
+ if output_mode not in valid_modes:
231
+ raise typer.BadParameter(
232
+ f"Invalid output '{output_mode}'. Valid: {', '.join(valid_modes)}"
233
+ )
234
+ if output_mode == "file" and not output_file:
235
+ raise typer.BadParameter("--output-file/-O required with --output file")
236
+
237
+
238
+ def parse_tags(tags: str | None) -> list[str]:
239
+ """Parse comma-separated tags string into list.
240
+
241
+ Args:
242
+ tags: Comma-separated tags string or None
243
+
244
+ Returns:
245
+ List of tag strings (empty list if None)
246
+
247
+ Example:
248
+ parse_tags("email,marketing,draft") -> ["email", "marketing", "draft"]
249
+ parse_tags(None) -> []
250
+ """
251
+ if not tags:
252
+ return []
253
+ return [t.strip() for t in tags.split(",") if t.strip()]
254
+
255
+
256
+ def parse_tags_required(tags: str) -> list[str]:
257
+ """Parse comma-separated tags string, requiring at least one tag.
258
+
259
+ Args:
260
+ tags: Comma-separated tags string
261
+
262
+ Returns:
263
+ List of tag strings
264
+
265
+ Raises:
266
+ typer.BadParameter: If no valid tags after parsing
267
+ """
268
+ tag_list = parse_tags(tags)
269
+ if not tag_list:
270
+ raise typer.BadParameter("At least one tag required")
271
+ return tag_list
272
+
273
+
274
+ def require_one_of(*args: tuple[str, object]) -> None:
275
+ """Require that at least one of the named values is provided.
276
+
277
+ Args:
278
+ *args: Tuples of (name, value) to check
279
+
280
+ Raises:
281
+ typer.BadParameter: If all values are None/empty
282
+
283
+ Example:
284
+ require_one_of(
285
+ ("--message", message),
286
+ ("--message-template", message_template),
287
+ )
288
+ """
289
+ provided = [name for name, value in args if value]
290
+ if not provided:
291
+ names = " or ".join(name for name, _ in args)
292
+ raise typer.BadParameter(f"One of {names} is required")
293
+
294
+
295
+ def require_exclusive(*args: tuple[str, object]) -> None:
296
+ """Require that at most one of the named values is provided.
297
+
298
+ Args:
299
+ *args: Tuples of (name, value) to check
300
+
301
+ Raises:
302
+ typer.BadParameter: If more than one value is provided
303
+
304
+ Example:
305
+ require_exclusive(
306
+ ("--agent", agent),
307
+ ("--provider/--model", provider or model),
308
+ )
309
+ """
310
+ provided = [name for name, value in args if value]
311
+ if len(provided) > 1:
312
+ raise typer.BadParameter(f"Cannot use {' and '.join(provided)} together")
313
+
314
+
315
+ def require_together(*args: tuple[str, object]) -> None:
316
+ """Require that if any of the named values is provided, all must be provided.
317
+
318
+ Args:
319
+ *args: Tuples of (name, value) to check
320
+
321
+ Raises:
322
+ typer.BadParameter: If some but not all values are provided
323
+
324
+ Example:
325
+ require_together(
326
+ ("--provider", provider),
327
+ ("--model", model),
328
+ )
329
+ """
330
+ provided = [name for name, value in args if value]
331
+ missing = [name for name, value in args if not value]
332
+
333
+ if provided and missing:
334
+ raise typer.BadParameter(
335
+ f"{' and '.join(missing)} required with {' and '.join(provided)}"
336
+ )
337
+
338
+
339
+ def check_no_update_flags(*args: tuple[str, object]) -> bool:
340
+ """Check if no update flags were provided.
341
+
342
+ Args:
343
+ *args: Tuples of (name, value) to check
344
+
345
+ Returns:
346
+ True if no flags provided
347
+
348
+ Example:
349
+ if check_no_update_flags(("--name", name), ("--description", desc)):
350
+ raise typer.BadParameter("At least one update flag required")
351
+ """
352
+ return not any(value for _, value in args)
353
+
354
+
355
+ def require_update_flags(*args: tuple[str, object]) -> None:
356
+ """Require that at least one update flag was provided.
357
+
358
+ Args:
359
+ *args: Tuples of (name, value) to check
360
+
361
+ Raises:
362
+ typer.BadParameter: If no flags provided
363
+ """
364
+ if check_no_update_flags(*args):
365
+ names = ", ".join(name for name, _ in args)
366
+ raise typer.BadParameter(f"At least one flag required: {names}")
File without changes
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,44 @@
1
+ """Async generation cancel command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.generate.cancel.presenter import present_generation_cancel
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+ from cli.infrastructure.console import Confirm
8
+
9
+
10
+ def generate_cancel_command(
11
+ execution_id: str = typer.Argument(
12
+ ...,
13
+ help="Execution UUID of the async generation to cancel",
14
+ ),
15
+ yes: bool = typer.Option(
16
+ False,
17
+ "-y",
18
+ "--yes",
19
+ help="Skip confirmation",
20
+ ),
21
+ ) -> None:
22
+ """Cancel a pending or running async generation.
23
+
24
+ Only generations in non-terminal states (pending, running) can be cancelled.
25
+
26
+ Examples:
27
+ ai generate cancel 123e4567-89ab-cdef-0123-456789abcdef
28
+ ai generate cancel 123e4567-... -y
29
+ """
30
+ if not yes:
31
+ confirmed = Confirm.ask(f"[yellow]Cancel generation {execution_id}?[/yellow]")
32
+ if not confirmed:
33
+ raise typer.Abort()
34
+
35
+ _execute_cancel(execution_id=execution_id)
36
+
37
+
38
+ @async_command
39
+ async def _execute_cancel(execution_id: str) -> None:
40
+ """Execute cancel operation."""
41
+ async with authenticated_client() as (_config, client):
42
+ response = await client.cancel_generation(execution_id)
43
+
44
+ present_generation_cancel(response)
@@ -0,0 +1,26 @@
1
+ """Presenter for async generation cancel command output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import format_uuid
7
+ from cli.infrastructure.output import OutputService
8
+ from alloy_runtime_types.dtos.generation import AsyncGenerationCancelResponse
9
+
10
+
11
+ def present_generation_cancel(response: AsyncGenerationCancelResponse) -> None:
12
+ """Present async generation cancel result."""
13
+ output = OutputService.get()
14
+
15
+ output.success(response.message)
16
+
17
+ table = Table(show_header=False, box=None, padding=(0, 1))
18
+ table.add_column("Field", style="dim")
19
+ table.add_column("Value")
20
+
21
+ table.add_row("Execution ID", format_uuid(response.execution_id, short=False))
22
+ table.add_row("Status", response.status)
23
+ table.add_row("Was Running", "Yes" if response.was_running else "No")
24
+
25
+ panel = Panel(table, title="Generation Cancelled", border_style="yellow")
26
+ output.console.print(panel)
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,58 @@
1
+ """Async generation status command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.generate.status.presenter import present_generation_status
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+
8
+
9
+ def generate_status_command(
10
+ execution_id: str = typer.Argument(
11
+ ...,
12
+ help="Execution UUID of the async generation",
13
+ ),
14
+ watch: bool = typer.Option(
15
+ False,
16
+ "--watch",
17
+ help="Poll until generation reaches terminal state",
18
+ ),
19
+ timeout: float = typer.Option(
20
+ 300.0,
21
+ "--timeout",
22
+ help="Maximum seconds to wait when using --watch (default: 300)",
23
+ ),
24
+ ) -> None:
25
+ """Get status of an async generation.
26
+
27
+ Check the status and result of a previously submitted async generation.
28
+ Use --watch to poll until completion.
29
+
30
+ Examples:
31
+ ai generate status 123e4567-89ab-cdef-0123-456789abcdef
32
+ ai generate status 123e4567-... --watch
33
+ ai generate status 123e4567-... --watch --timeout 600
34
+ """
35
+ _execute_status(
36
+ execution_id=execution_id,
37
+ watch=watch,
38
+ timeout=timeout,
39
+ )
40
+
41
+
42
+ @async_command
43
+ async def _execute_status(
44
+ execution_id: str,
45
+ watch: bool,
46
+ timeout: float,
47
+ ) -> None:
48
+ """Execute status operation."""
49
+ async with authenticated_client() as (_config, client):
50
+ if watch:
51
+ response = await client.wait_for_generation(
52
+ execution_id,
53
+ timeout=timeout,
54
+ )
55
+ else:
56
+ response = await client.get_generation(execution_id)
57
+
58
+ present_generation_status(response)
@@ -0,0 +1,78 @@
1
+ """Presenter for async generation status command output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import (
7
+ format_cost,
8
+ format_datetime,
9
+ format_duration_ms,
10
+ format_optional,
11
+ format_tokens,
12
+ format_uuid,
13
+ )
14
+ from cli.infrastructure.output import OutputService
15
+ from alloy_runtime_types.dtos.generation import AsyncGenerationStatusResponse
16
+
17
+
18
+ def present_generation_status(response: AsyncGenerationStatusResponse) -> None:
19
+ """Present async generation status details."""
20
+ output = OutputService.get()
21
+
22
+ border_style = {
23
+ "completed": "green",
24
+ "failed": "red",
25
+ "cancelled": "yellow",
26
+ "timeout": "yellow",
27
+ "running": "blue",
28
+ "pending": "dim",
29
+ }.get(response.status, "dim")
30
+
31
+ table = Table(show_header=False, box=None, padding=(0, 1))
32
+ table.add_column("Field", style="dim")
33
+ table.add_column("Value")
34
+
35
+ table.add_row("Execution ID", format_uuid(response.execution_id, short=False))
36
+ table.add_row("Status", response.status)
37
+ table.add_row("Queued At", format_datetime(response.queued_at))
38
+
39
+ if response.started_at:
40
+ table.add_row("Started At", format_datetime(response.started_at))
41
+
42
+ if response.completed_at:
43
+ table.add_row("Completed At", format_datetime(response.completed_at))
44
+
45
+ if response.total_duration_ms:
46
+ table.add_row("Duration", format_duration_ms(response.total_duration_ms))
47
+
48
+ if response.output_text:
49
+ table.add_row(
50
+ "Output",
51
+ response.output_text[:200] + "..."
52
+ if len(response.output_text) > 200
53
+ else response.output_text,
54
+ )
55
+
56
+ if response.usage:
57
+ table.add_row("Input Tokens", format_tokens(response.usage.input_tokens))
58
+ table.add_row("Output Tokens", format_tokens(response.usage.output_tokens))
59
+
60
+ if response.cost:
61
+ table.add_row("Cost", format_cost(response.cost.total_cost_usd))
62
+
63
+ if response.provider_key:
64
+ table.add_row("Provider", response.provider_key)
65
+
66
+ if response.provider_model_name:
67
+ table.add_row("Model", response.provider_model_name)
68
+
69
+ if response.error_message:
70
+ table.add_row("Error", response.error_message)
71
+
72
+ if response.error_type:
73
+ table.add_row("Error Type", response.error_type)
74
+
75
+ table.add_row("External ID", format_optional(response.external_id))
76
+
77
+ panel = Panel(table, title="Generation Status", border_style=border_style)
78
+ output.console.print(panel)
File without changes