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
cli/main.py ADDED
@@ -0,0 +1,759 @@
1
+ """Alloy Runtime CLI main entry point.
2
+
3
+ This module defines the root Typer application and registers all command groups.
4
+ Running `alloy` with no arguments launches the unified TUI application.
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ import typer
12
+ from rich.console import Console
13
+
14
+ from cli.commands.admin.credentials.create.command import (
15
+ admin_credentials_create_command,
16
+ )
17
+ from cli.commands.admin.credentials.grant.command import (
18
+ admin_credentials_grant_command,
19
+ )
20
+ from cli.commands.agents.create.command import agents_create_command
21
+ from cli.commands.agents.delete.command import agents_delete_command
22
+ from cli.commands.agents.list.command import agents_list_command
23
+ from cli.commands.agents.update.command import agents_update_command
24
+ from cli.commands.auth.login.command import login_command
25
+ from cli.commands.auth.signup.command import signup_command
26
+ from cli.commands.whoami.command import whoami_command
27
+ from cli.commands.agents.get.command import agents_get_command
28
+ from cli.commands.audio.transcribe.command import audio_transcribe_command
29
+ from cli.commands.billing.costs.by_agent.command import billing_costs_by_agent_command
30
+ from cli.commands.billing.costs.by_model.command import billing_costs_by_model_command
31
+ from cli.commands.billing.costs.daily.command import billing_costs_daily_command
32
+ from cli.commands.billing.costs.summary.command import billing_costs_summary_command
33
+ from cli.commands.billing.projects.create.command import billing_projects_create_command
34
+ from cli.commands.billing.projects.get.command import billing_projects_get_command
35
+ from cli.commands.billing.projects.list.command import billing_projects_list_command
36
+ from cli.commands.generate.cancel.command import generate_cancel_command
37
+ from cli.commands.generate.status.command import generate_status_command
38
+ from cli.commands.knowledge.collections.cluster.command import (
39
+ knowledge_collections_cluster_command,
40
+ )
41
+ from cli.commands.knowledge.collections.cluster_status.command import (
42
+ knowledge_collections_cluster_status_command,
43
+ )
44
+ from cli.commands.knowledge.documents.bulk_metadata.command import (
45
+ knowledge_documents_bulk_metadata_command,
46
+ )
47
+ from cli.commands.knowledge.documents.reingest.command import (
48
+ knowledge_documents_reingest_command,
49
+ )
50
+ from cli.commands.knowledge.documents.update.command import (
51
+ knowledge_documents_update_command,
52
+ )
53
+ from cli.commands.knowledge.synthesis.update.command import (
54
+ knowledge_synthesis_update_command,
55
+ )
56
+ from cli.commands.organizations.create.command import organizations_create_command
57
+ from cli.commands.pipelines.create.command import pipelines_create_command
58
+ from cli.commands.pipelines.env_vars.command import pipelines_env_vars_command
59
+ from cli.commands.pipelines.executions.costs.command import (
60
+ pipeline_execution_costs_command,
61
+ )
62
+ from cli.commands.pipelines.executions.costs_by_model.command import (
63
+ pipeline_execution_costs_by_model_command,
64
+ )
65
+ from cli.commands.pipelines.executions.costs_by_step.command import (
66
+ pipeline_execution_costs_by_step_command,
67
+ )
68
+ from cli.commands.pipelines.executions.update.command import (
69
+ pipeline_execution_update_command,
70
+ )
71
+
72
+ from cli.commands.pipelines.schedules.env_vars_command import (
73
+ pipelines_schedules_env_vars_command,
74
+ )
75
+ from cli.commands.pipelines.schedules.create_command import (
76
+ pipelines_schedules_create_command,
77
+ )
78
+ from cli.commands.pipelines.schedules.update_command import (
79
+ pipelines_schedules_update_command,
80
+ )
81
+ from cli.commands.pipelines.schedules.once_command import (
82
+ pipelines_schedules_once_command,
83
+ )
84
+ from cli.commands.schemas.delete.command import schemas_delete_command
85
+ from cli.commands.tags.get.command import tags_get_command
86
+ from cli.commands.tags.update.command import tags_update_command
87
+ from cli.commands.templates.get_by_version.command import (
88
+ templates_get_by_version_command,
89
+ )
90
+ from cli.commands.tools.get.command import tools_get_command
91
+ from cli.commands.tools.list.command import tools_list_command
92
+ from cli.commands.users.create.command import users_create_command
93
+
94
+ from cli.commands.content.edit.command import content_edit_command
95
+ from cli.commands.content.get.command import content_get_command
96
+ from cli.commands.content.list.command import content_list_command
97
+ from cli.commands.credentials.create.command import credentials_create_command
98
+ from cli.commands.credentials.update.command import credentials_update_command
99
+ from cli.commands.generate.text.command import generate_text_command
100
+ from cli.commands.models.list.command import models_list_command
101
+ from cli.commands.schemas.create.command import schemas_create_command
102
+ from cli.commands.schemas.get.command import schemas_get_command
103
+ from cli.commands.schemas.list.command import schemas_list_command
104
+ from cli.commands.sync.command import sync_command
105
+ from cli.commands.admin.bootstrap_command import bootstrap_admin_command
106
+ from cli.commands.templates.create.command import templates_create_command
107
+ from cli.commands.templates.delete.command import templates_delete_command
108
+ from cli.commands.templates.get.command import templates_get_command
109
+ from cli.commands.templates.list.command import templates_list_command
110
+ from cli.commands.templates.render.command import templates_render_command
111
+ from cli.commands.templates.update.command import templates_update_command
112
+ from cli.commands.templates.version.command import templates_version_command
113
+ from cli.commands.content.delete.command import content_delete_command
114
+ from cli.commands.schemas.update.command import schemas_update_command
115
+ from cli.commands.render.html_to_image.command import render_html_to_image_command
116
+ from cli.commands.knowledge.collections.create.command import (
117
+ knowledge_collections_create_command,
118
+ )
119
+ from cli.commands.knowledge.collections.delete.command import (
120
+ knowledge_collections_delete_command,
121
+ )
122
+ from cli.commands.knowledge.collections.get.command import (
123
+ knowledge_collections_get_command,
124
+ )
125
+ from cli.commands.knowledge.collections.list.command import (
126
+ knowledge_collections_list_command,
127
+ )
128
+ from cli.commands.knowledge.collections.update.command import (
129
+ knowledge_collections_update_command,
130
+ )
131
+ from cli.commands.knowledge.documents.delete.command import (
132
+ knowledge_documents_delete_command,
133
+ )
134
+ from cli.commands.knowledge.documents.get.command import (
135
+ knowledge_documents_get_command,
136
+ )
137
+ from cli.commands.knowledge.documents.ingest.command import (
138
+ knowledge_documents_ingest_command,
139
+ )
140
+ from cli.commands.knowledge.documents.list.command import (
141
+ knowledge_documents_list_command,
142
+ )
143
+ from cli.commands.knowledge.recover.command import knowledge_recover_command
144
+ from cli.commands.knowledge.search.command import knowledge_search_command
145
+ from cli.commands.knowledge.synthesis.create.command import (
146
+ knowledge_synthesis_create_command,
147
+ )
148
+ from cli.commands.knowledge.synthesis.delete.command import (
149
+ knowledge_synthesis_delete_command,
150
+ )
151
+ from cli.commands.knowledge.synthesis.get.command import (
152
+ knowledge_synthesis_get_command,
153
+ )
154
+ from cli.commands.knowledge.synthesis.list.command import (
155
+ knowledge_synthesis_list_command,
156
+ )
157
+ from cli.commands.knowledge.synthesis.refresh.command import (
158
+ knowledge_synthesis_refresh_command,
159
+ )
160
+ from cli.commands.tool_configs.create.command import tool_configs_create_command
161
+ from cli.commands.tool_configs.delete.command import tool_configs_delete_command
162
+ from cli.commands.tool_configs.get.command import tool_configs_get_command
163
+ from cli.commands.tool_configs.list.command import tool_configs_list_command
164
+ from cli.commands.tool_configs.update.command import tool_configs_update_command
165
+ from cli.commands.pipelines.list.command import pipelines_list_command
166
+ from cli.commands.pipelines.get.command import pipelines_get_command
167
+ from cli.commands.pipelines.execute.command import pipelines_execute_command
168
+ from cli.commands.pipelines.executions.list_command import (
169
+ pipelines_executions_list_command,
170
+ )
171
+ from cli.commands.pipelines.executions.get_command import (
172
+ pipelines_executions_get_command,
173
+ )
174
+ from cli.commands.pipelines.schedules.list_command import (
175
+ pipelines_schedules_list_command,
176
+ )
177
+ from cli.commands.pipelines.schedules.get_command import pipelines_schedules_get_command
178
+ from cli.commands.pipelines.schedules.delete_command import (
179
+ pipelines_schedules_delete_command,
180
+ )
181
+ from cli.commands.pipelines.costs.command import pipelines_costs_command
182
+ from cli.commands.pipelines.approvals.get_command import (
183
+ pipelines_approvals_get_command,
184
+ )
185
+ from cli.commands.pipelines.approvals.decide_command import (
186
+ pipelines_approvals_decide_command,
187
+ )
188
+ from cli.commands.pipelines.executions.rerun_command import (
189
+ pipelines_executions_rerun_command,
190
+ )
191
+ from cli.commands.pipelines.costs.daily_command import pipeline_costs_daily_command
192
+ from cli.commands.sessions.list.command import sessions_list_command
193
+ from cli.commands.sessions.get.command import sessions_get_command
194
+ from cli.commands.sessions.delete.command import sessions_delete_command
195
+ from cli.commands.sessions.messages.command import sessions_messages_command
196
+ from cli.commands.tags.list.command import tags_list_command
197
+ from cli.commands.tags.create.command import tags_create_command
198
+ from cli.commands.tags.delete.command import tags_delete_command
199
+ from cli.infrastructure.config import load_config, set_global_overrides
200
+ from cli.infrastructure.output import OutputFormat, OutputService
201
+ from alloy_runtime_sdk.logging.config import LogConfig, LogFormat, LogLevel, configure
202
+ from trogon.typer import init_tui
203
+
204
+ console = Console()
205
+
206
+ # Root CLI application
207
+ # Note: no_args_is_help=False and invoke_without_command=True allows
208
+ app = typer.Typer(
209
+ name="alloy",
210
+ help="Alloy Runtime CLI - Unified interface for AI orchestration. Run without arguments to launch TUI.",
211
+ no_args_is_help=False,
212
+ invoke_without_command=True,
213
+ )
214
+
215
+
216
+ @app.callback(invoke_without_command=True)
217
+ def global_options(
218
+ ctx: typer.Context,
219
+ api_url: Optional[str] = typer.Option(
220
+ None,
221
+ "--api-url",
222
+ help="Override API URL",
223
+ envvar="ALLOY_RUNTIME_API_URL",
224
+ ),
225
+ api_key: Optional[str] = typer.Option(
226
+ None,
227
+ "--api-key",
228
+ help="Override API key",
229
+ envvar="ALLOY_RUNTIME_API_KEY",
230
+ ),
231
+ output_format: str = typer.Option(
232
+ "compact",
233
+ "--format",
234
+ help="Output format: compact, json, lines",
235
+ ),
236
+ no_tui: bool = typer.Option(
237
+ False,
238
+ "--no-tui",
239
+ help="Show CLI help instead of TUI",
240
+ ),
241
+ ) -> None:
242
+ """Global options for all commands.
243
+
244
+ Run with no arguments to launch TUI, or use --no-tui for CLI help.
245
+ """
246
+ # Store global overrides for load_config to use
247
+ set_global_overrides(api_url=api_url, api_key=api_key)
248
+
249
+ # Configure output format globally
250
+ format_lower = output_format.lower()
251
+ if format_lower == "json":
252
+ OutputService.configure(OutputFormat.JSON)
253
+ elif format_lower == "lines":
254
+ OutputService.configure(OutputFormat.LINES)
255
+ else:
256
+ # Default: compact (copy-friendly 2-line blocks)
257
+ OutputService.configure(OutputFormat.COMPACT)
258
+
259
+ # If no subcommand is invoked, launch TUI or show help
260
+ if ctx.invoked_subcommand is None:
261
+ if no_tui:
262
+ # Show help instead of launching TUI
263
+ console.print(ctx.get_help())
264
+ raise typer.Exit()
265
+
266
+ # Launch the unified TUI application
267
+ _launch_tui()
268
+ raise typer.Exit()
269
+
270
+
271
+ def _launch_tui() -> None:
272
+ """Launch the unified Terminal UI application."""
273
+ from cli.tui.app import run_app
274
+
275
+ try:
276
+ config = load_config()
277
+ except Exception as e:
278
+ console.print(f"[red]Configuration error:[/] {e}")
279
+ console.print("\n[dim]Run 'ai2 login' to authenticate first.[/]")
280
+ raise typer.Exit(code=1)
281
+
282
+ if not config.api_key:
283
+ console.print("[red]Not authenticated.[/]")
284
+ console.print("\n[dim]Run 'ai2 login' to authenticate first.[/]")
285
+ raise typer.Exit(code=1)
286
+
287
+ run_app(api_url=config.api_url, api_key=config.api_key)
288
+
289
+
290
+ # Register top-level auth commands for convenience
291
+ app.command("login")(login_command)
292
+ app.command("signup")(signup_command)
293
+ app.command("whoami")(whoami_command)
294
+
295
+ # Credentials command group
296
+ credentials_app = typer.Typer(
297
+ help="Manage AI provider credentials",
298
+ no_args_is_help=True,
299
+ )
300
+
301
+ # Register credentials group with main app
302
+ app.add_typer(credentials_app, name="credentials")
303
+ app.add_typer(credentials_app, name="creds") # Alias
304
+
305
+ # Register credential commands
306
+ credentials_app.command("create")(credentials_create_command)
307
+ credentials_app.command("update")(credentials_update_command)
308
+
309
+ # Sync command group
310
+ sync_app = typer.Typer(
311
+ help="Sync data from external sources",
312
+ no_args_is_help=True,
313
+ )
314
+
315
+ # Register sync group with main app
316
+ app.add_typer(sync_app, name="sync")
317
+
318
+ # Register sync commands
319
+ sync_app.command("models")(sync_command)
320
+
321
+ # Models command group
322
+ models_app = typer.Typer(
323
+ help="List and query AI models",
324
+ no_args_is_help=True,
325
+ )
326
+
327
+ # Register models group with main app
328
+ app.add_typer(models_app, name="models")
329
+
330
+ # Register model commands
331
+ models_app.command("list")(models_list_command)
332
+
333
+ # ========================================
334
+ # Admin group (system administration)
335
+ # ========================================
336
+ admin_app = typer.Typer(
337
+ name="admin",
338
+ help="System administration commands (requires system admin privileges)",
339
+ no_args_is_help=True,
340
+ )
341
+
342
+ # Register admin group with main app
343
+ app.add_typer(admin_app, name="admin")
344
+
345
+ # Register admin commands
346
+ admin_app.command("bootstrap")(bootstrap_admin_command)
347
+
348
+ # Admin credentials subgroup
349
+ admin_credentials_app = typer.Typer(
350
+ help="Manage system credentials",
351
+ no_args_is_help=True,
352
+ )
353
+
354
+ # Register admin credentials subgroup
355
+ admin_app.add_typer(admin_credentials_app, name="credentials")
356
+ admin_app.add_typer(admin_credentials_app, name="creds") # Alias
357
+
358
+ # Register admin credentials commands
359
+ admin_credentials_app.command("create")(admin_credentials_create_command)
360
+ admin_credentials_app.command("grant")(admin_credentials_grant_command)
361
+
362
+ # Agents command group
363
+ agents_app = typer.Typer(
364
+ help="Manage AI agents",
365
+ no_args_is_help=True,
366
+ )
367
+
368
+ # Register agents group with main app
369
+ app.add_typer(agents_app, name="agents")
370
+
371
+ # Register agent commands
372
+ agents_app.command("create")(agents_create_command)
373
+ agents_app.command("delete")(agents_delete_command)
374
+ agents_app.command("list")(agents_list_command)
375
+ agents_app.command("update")(agents_update_command)
376
+ agents_app.command("get")(agents_get_command)
377
+
378
+ # Templates command group
379
+ templates_app = typer.Typer(
380
+ help="Manage templates (system instructions, user messages, fragments)",
381
+ no_args_is_help=True,
382
+ )
383
+
384
+ # Register templates group with main app
385
+ app.add_typer(templates_app, name="templates")
386
+ app.add_typer(templates_app, name="tpl") # Alias
387
+
388
+ # Register template commands
389
+ templates_app.command("create")(templates_create_command)
390
+ templates_app.command("delete")(templates_delete_command)
391
+ templates_app.command("get")(templates_get_command)
392
+ templates_app.command("list")(templates_list_command)
393
+ templates_app.command("render")(templates_render_command)
394
+ templates_app.command("update")(templates_update_command)
395
+ templates_app.command("version")(templates_version_command)
396
+ templates_app.command("get-by-version")(templates_get_by_version_command)
397
+
398
+ # Generate command group
399
+ generate_app = typer.Typer(
400
+ help="Generate AI content (text, images, etc.)",
401
+ no_args_is_help=True,
402
+ )
403
+
404
+ # Register generate group with main app
405
+ app.add_typer(generate_app, name="generate")
406
+ app.add_typer(generate_app, name="gen") # Alias
407
+
408
+ # Register generate commands
409
+ generate_app.command("text")(generate_text_command)
410
+ generate_app.command("status")(generate_status_command)
411
+ generate_app.command("cancel")(generate_cancel_command)
412
+
413
+ # Content command group
414
+ content_app = typer.Typer(
415
+ help="Query and manage AI-generated content parts",
416
+ no_args_is_help=True,
417
+ )
418
+
419
+ # Register content group with main app
420
+ app.add_typer(content_app, name="content")
421
+
422
+ # Register content commands
423
+ content_app.command("list")(content_list_command)
424
+ content_app.command("get")(content_get_command)
425
+ content_app.command("edit")(content_edit_command)
426
+ content_app.command("delete")(content_delete_command)
427
+
428
+ # Schemas command group
429
+ schemas_app = typer.Typer(
430
+ help="Manage input/output validation schemas",
431
+ no_args_is_help=True,
432
+ )
433
+
434
+ # Register schemas group with main app
435
+ app.add_typer(schemas_app, name="schemas")
436
+
437
+ # Register schema commands
438
+ schemas_app.command("create")(schemas_create_command)
439
+ schemas_app.command("get")(schemas_get_command)
440
+ schemas_app.command("list")(schemas_list_command)
441
+ schemas_app.command("update")(schemas_update_command)
442
+ schemas_app.command("delete")(schemas_delete_command)
443
+
444
+ # Render command group
445
+ render_app = typer.Typer(
446
+ help="Render content to various formats (HTML to image, etc.)",
447
+ no_args_is_help=True,
448
+ )
449
+
450
+ # Register render group with main app
451
+ app.add_typer(render_app, name="render")
452
+
453
+ # Register render commands
454
+ render_app.command("image")(render_html_to_image_command)
455
+
456
+ # Knowledge command group
457
+ knowledge_app = typer.Typer(
458
+ help="Manage knowledge collections and documents",
459
+ no_args_is_help=True,
460
+ )
461
+
462
+ # Register knowledge group with main app
463
+ app.add_typer(knowledge_app, name="knowledge")
464
+ app.add_typer(knowledge_app, name="kb") # Alias
465
+
466
+ # Knowledge collections subgroup
467
+ knowledge_collections_app = typer.Typer(
468
+ help="Manage document collections",
469
+ no_args_is_help=True,
470
+ )
471
+
472
+ # Register collections subgroup with knowledge app
473
+ knowledge_app.add_typer(knowledge_collections_app, name="collections")
474
+
475
+ # Register knowledge collection commands
476
+ knowledge_collections_app.command("create")(knowledge_collections_create_command)
477
+ knowledge_collections_app.command("delete")(knowledge_collections_delete_command)
478
+ knowledge_collections_app.command("get")(knowledge_collections_get_command)
479
+ knowledge_collections_app.command("list")(knowledge_collections_list_command)
480
+ knowledge_collections_app.command("update")(knowledge_collections_update_command)
481
+ knowledge_collections_app.command("cluster")(knowledge_collections_cluster_command)
482
+ knowledge_collections_app.command("cluster-status")(
483
+ knowledge_collections_cluster_status_command
484
+ )
485
+
486
+ # Knowledge documents subgroup
487
+ knowledge_documents_app = typer.Typer(
488
+ help="Manage documents in collections",
489
+ no_args_is_help=True,
490
+ )
491
+
492
+ # Register documents subgroup with knowledge app
493
+ knowledge_app.add_typer(knowledge_documents_app, name="documents")
494
+
495
+ # Register knowledge document commands
496
+ knowledge_documents_app.command("delete")(knowledge_documents_delete_command)
497
+ knowledge_documents_app.command("get")(knowledge_documents_get_command)
498
+ knowledge_documents_app.command("ingest")(knowledge_documents_ingest_command)
499
+ knowledge_documents_app.command("list")(knowledge_documents_list_command)
500
+ knowledge_documents_app.command("update")(knowledge_documents_update_command)
501
+ knowledge_documents_app.command("reingest")(knowledge_documents_reingest_command)
502
+ knowledge_documents_app.command("bulk-metadata")(
503
+ knowledge_documents_bulk_metadata_command
504
+ )
505
+
506
+ # Knowledge synthesis subgroup
507
+ knowledge_synthesis_app = typer.Typer(
508
+ help="Manage corpus-level syntheses",
509
+ no_args_is_help=True,
510
+ )
511
+
512
+ # Register synthesis subgroup with knowledge app
513
+ knowledge_app.add_typer(knowledge_synthesis_app, name="synthesis")
514
+
515
+ # Register knowledge synthesis commands
516
+ knowledge_synthesis_app.command("create")(knowledge_synthesis_create_command)
517
+ knowledge_synthesis_app.command("delete")(knowledge_synthesis_delete_command)
518
+ knowledge_synthesis_app.command("get")(knowledge_synthesis_get_command)
519
+ knowledge_synthesis_app.command("list")(knowledge_synthesis_list_command)
520
+ knowledge_synthesis_app.command("refresh")(knowledge_synthesis_refresh_command)
521
+ knowledge_synthesis_app.command("update")(knowledge_synthesis_update_command)
522
+
523
+ # Register top-level knowledge commands
524
+ knowledge_app.command("recover")(knowledge_recover_command)
525
+ knowledge_app.command("search")(knowledge_search_command)
526
+
527
+ # Tool configs command group
528
+ tool_configs_app = typer.Typer(
529
+ help="Manage reusable tool configurations",
530
+ no_args_is_help=True,
531
+ )
532
+
533
+ # Register tool-configs group with main app
534
+ app.add_typer(tool_configs_app, name="tool-configs")
535
+ app.add_typer(tool_configs_app, name="tc") # Alias
536
+
537
+ # Register tool-configs commands
538
+ tool_configs_app.command("create")(tool_configs_create_command)
539
+ tool_configs_app.command("delete")(tool_configs_delete_command)
540
+ tool_configs_app.command("get")(tool_configs_get_command)
541
+ tool_configs_app.command("list")(tool_configs_list_command)
542
+ tool_configs_app.command("update")(tool_configs_update_command)
543
+
544
+ # Pipelines command group
545
+ pipelines_app = typer.Typer(
546
+ help="Manage and execute pipelines",
547
+ no_args_is_help=True,
548
+ )
549
+
550
+ # Register pipelines group with main app
551
+ app.add_typer(pipelines_app, name="pipelines")
552
+ app.add_typer(pipelines_app, name="pipe") # Alias
553
+
554
+ # Register pipeline commands
555
+ pipelines_app.command("list")(pipelines_list_command)
556
+ pipelines_app.command("get")(pipelines_get_command)
557
+ pipelines_app.command("execute")(pipelines_execute_command)
558
+ pipelines_app.command("costs")(pipelines_costs_command)
559
+ pipelines_app.command("costs-daily")(pipeline_costs_daily_command)
560
+ pipelines_app.command("create")(pipelines_create_command)
561
+ pipelines_app.command("env")(pipelines_env_vars_command)
562
+
563
+ # Pipelines executions subgroup
564
+ pipelines_executions_app = typer.Typer(
565
+ help="Manage pipeline executions",
566
+ no_args_is_help=True,
567
+ )
568
+
569
+ # Register executions subgroup with pipelines app
570
+ pipelines_app.add_typer(pipelines_executions_app, name="executions")
571
+ pipelines_app.add_typer(pipelines_executions_app, name="exec") # Alias
572
+
573
+ # Register pipeline execution commands
574
+ pipelines_executions_app.command("list")(pipelines_executions_list_command)
575
+ pipelines_executions_app.command("get")(pipelines_executions_get_command)
576
+ pipelines_executions_app.command("rerun")(pipelines_executions_rerun_command)
577
+ pipelines_executions_app.command("update")(pipeline_execution_update_command)
578
+ pipelines_executions_app.command("costs")(pipeline_execution_costs_command)
579
+ pipelines_executions_app.command("costs-by-model")(
580
+ pipeline_execution_costs_by_model_command
581
+ )
582
+ pipelines_executions_app.command("costs-by-step")(
583
+ pipeline_execution_costs_by_step_command
584
+ )
585
+
586
+ # Pipelines schedules subgroup
587
+ pipelines_schedules_app = typer.Typer(
588
+ help="Manage pipeline schedules",
589
+ no_args_is_help=True,
590
+ )
591
+
592
+ # Register schedules subgroup with pipelines app
593
+ pipelines_app.add_typer(pipelines_schedules_app, name="schedules")
594
+ pipelines_app.add_typer(pipelines_schedules_app, name="sched") # Alias
595
+
596
+ # Register pipeline schedule commands
597
+ pipelines_schedules_app.command("list")(pipelines_schedules_list_command)
598
+ pipelines_schedules_app.command("get")(pipelines_schedules_get_command)
599
+ pipelines_schedules_app.command("delete")(pipelines_schedules_delete_command)
600
+ pipelines_schedules_app.command("env")(pipelines_schedules_env_vars_command)
601
+ pipelines_schedules_app.command("create")(pipelines_schedules_create_command)
602
+ pipelines_schedules_app.command("update")(pipelines_schedules_update_command)
603
+ pipelines_schedules_app.command("once")(pipelines_schedules_once_command)
604
+
605
+
606
+ # Pipelines approvals subgroup
607
+ pipelines_approvals_app = typer.Typer(
608
+ help="Manage approval checkpoints for human-in-the-loop pipelines",
609
+ no_args_is_help=True,
610
+ )
611
+
612
+ # Register approvals subgroup with pipelines app
613
+ pipelines_app.add_typer(pipelines_approvals_app, name="approvals")
614
+
615
+ # Register pipeline approval commands
616
+ pipelines_approvals_app.command("get")(pipelines_approvals_get_command)
617
+ pipelines_approvals_app.command("decide")(pipelines_approvals_decide_command)
618
+
619
+ # Sessions command group
620
+ sessions_app = typer.Typer(
621
+ help="Manage chat sessions",
622
+ no_args_is_help=True,
623
+ )
624
+
625
+ # Register sessions group with main app
626
+ app.add_typer(sessions_app, name="sessions")
627
+
628
+ # Register session commands
629
+ sessions_app.command("list")(sessions_list_command)
630
+ sessions_app.command("get")(sessions_get_command)
631
+ sessions_app.command("delete")(sessions_delete_command)
632
+ sessions_app.command("messages")(sessions_messages_command)
633
+
634
+ # Tags command group
635
+ tags_app = typer.Typer(
636
+ help="Manage tags for organizing content",
637
+ no_args_is_help=True,
638
+ )
639
+
640
+ # Register tags group with main app
641
+ app.add_typer(tags_app, name="tags")
642
+
643
+ # Register tag commands
644
+ tags_app.command("list")(tags_list_command)
645
+ tags_app.command("create")(tags_create_command)
646
+ tags_app.command("delete")(tags_delete_command)
647
+ tags_app.command("get")(tags_get_command)
648
+ tags_app.command("update")(tags_update_command)
649
+
650
+ # Billing command group
651
+ billing_app = typer.Typer(
652
+ help="Manage billing projects and costs",
653
+ no_args_is_help=True,
654
+ )
655
+
656
+ app.add_typer(billing_app, name="billing")
657
+ app.add_typer(billing_app, name="bill") # Alias
658
+
659
+ # Billing projects subgroup
660
+ billing_projects_app = typer.Typer(
661
+ help="Manage billing projects",
662
+ no_args_is_help=True,
663
+ )
664
+
665
+ billing_app.add_typer(billing_projects_app, name="projects")
666
+
667
+ billing_projects_app.command("create")(billing_projects_create_command)
668
+ billing_projects_app.command("list")(billing_projects_list_command)
669
+ billing_projects_app.command("get")(billing_projects_get_command)
670
+
671
+ # Billing costs subgroup
672
+ billing_costs_app = typer.Typer(
673
+ help="View billing costs",
674
+ no_args_is_help=True,
675
+ )
676
+
677
+ billing_app.add_typer(billing_costs_app, name="costs")
678
+
679
+ billing_costs_app.command("summary")(billing_costs_summary_command)
680
+ billing_costs_app.command("daily")(billing_costs_daily_command)
681
+ billing_costs_app.command("by-agent")(billing_costs_by_agent_command)
682
+ billing_costs_app.command("by-model")(billing_costs_by_model_command)
683
+
684
+ # Tools command group
685
+ tools_app = typer.Typer(
686
+ help="List and inspect available tools",
687
+ no_args_is_help=True,
688
+ )
689
+
690
+ app.add_typer(tools_app, name="tools")
691
+ app.add_typer(tools_app, name="tool") # Alias
692
+
693
+ tools_app.command("list")(tools_list_command)
694
+ tools_app.command("get")(tools_get_command)
695
+
696
+ # Audio command group
697
+ audio_app = typer.Typer(
698
+ help="Audio processing commands",
699
+ no_args_is_help=True,
700
+ )
701
+
702
+ app.add_typer(audio_app, name="audio")
703
+ app.add_typer(audio_app, name="aud") # Alias
704
+
705
+ audio_app.command("transcribe")(audio_transcribe_command)
706
+
707
+ # Organizations command group
708
+ organizations_app = typer.Typer(
709
+ help="Manage organizations",
710
+ no_args_is_help=True,
711
+ )
712
+
713
+ app.add_typer(organizations_app, name="organizations")
714
+ app.add_typer(organizations_app, name="org") # Alias
715
+
716
+ organizations_app.command("create")(organizations_create_command)
717
+
718
+ # Users command group
719
+ users_app = typer.Typer(
720
+ help="Manage users",
721
+ no_args_is_help=True,
722
+ )
723
+
724
+ app.add_typer(users_app, name="users")
725
+ app.add_typer(users_app, name="user") # Alias
726
+
727
+ users_app.command("create")(users_create_command)
728
+
729
+
730
+ init_tui(app)
731
+
732
+
733
+ def main() -> None:
734
+ """CLI entry point."""
735
+ # Configure logging for CLI (logs to file, Rich console for user output)
736
+ log_level_str = os.environ.get("LOG_LEVEL", "warning").lower()
737
+ log_level = LogLevel(log_level_str)
738
+
739
+ # Determine log file path - use root logs directory
740
+ # From cli/main.py -> cli -> packages -> core-service
741
+ project_root = Path(__file__).parent.parent.parent.parent
742
+ log_dir = project_root / "logs"
743
+ log_file = log_dir / "cli.log"
744
+
745
+ configure(
746
+ LogConfig(
747
+ level=log_level,
748
+ format=LogFormat.JSON, # Always JSON for parsability
749
+ service_name="alloy-runtime-cli",
750
+ output_file=str(log_file),
751
+ capture_stdlib_logging=True,
752
+ )
753
+ )
754
+
755
+ app()
756
+
757
+
758
+ if __name__ == "__main__":
759
+ main()