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,102 @@
1
+ """Lines formatter for easy-to-copy terminal output.
2
+
3
+ Outputs each field on its own line, making individual values easy to copy
4
+ without table formatting artifacts.
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from cli.infrastructure.formatters.base import ColumnMeta, Formatter
10
+
11
+
12
+ class LinesFormatter(Formatter):
13
+ """Formatter that outputs each field on its own line for easy copying."""
14
+
15
+ def format_entity(self, data: dict[str, Any], title: str | None = None) -> str:
16
+ """Format entity as key-value lines.
17
+
18
+ Args:
19
+ data: Dictionary mapping field labels to values
20
+ title: Optional title displayed above the data
21
+
22
+ Returns:
23
+ String with each field on its own line
24
+ """
25
+ lines: list[str] = []
26
+
27
+ if title:
28
+ lines.append(title)
29
+ lines.append("-" * len(title))
30
+
31
+ for field, value in data.items():
32
+ display_value = "(not set)" if value is None else str(value)
33
+ lines.append(f"{field}: {display_value}")
34
+
35
+ return "\n".join(lines)
36
+
37
+ def format_list(
38
+ self,
39
+ items: list[dict[str, Any]],
40
+ title: str | None = None,
41
+ columns: list[ColumnMeta] | None = None,
42
+ ) -> str:
43
+ """Format list as blocks of key-value lines.
44
+
45
+ Args:
46
+ items: List of dictionaries, each representing one item
47
+ title: Optional title displayed above the list
48
+
49
+ Returns:
50
+ String with each item as a block separated by blank lines
51
+ """
52
+ if not items:
53
+ return self.format_info("No items to display")
54
+
55
+ lines: list[str] = []
56
+
57
+ if title:
58
+ lines.append(title)
59
+ lines.append("=" * len(title))
60
+ lines.append("")
61
+
62
+ for i, item in enumerate(items, start=1):
63
+ lines.append(f"--- Item {i} ---")
64
+ for field, value in item.items():
65
+ display_value = "(not set)" if value is None else str(value)
66
+ lines.append(f"{field}: {display_value}")
67
+ lines.append("") # Blank line between items
68
+
69
+ return "\n".join(lines).rstrip()
70
+
71
+ def format_success(self, message: str) -> str:
72
+ """Format success message with prefix.
73
+
74
+ Args:
75
+ message: Success message text
76
+
77
+ Returns:
78
+ Prefixed success message
79
+ """
80
+ return f"[OK] {message}"
81
+
82
+ def format_info(self, message: str) -> str:
83
+ """Format info message with prefix.
84
+
85
+ Args:
86
+ message: Info message text
87
+
88
+ Returns:
89
+ Prefixed info message
90
+ """
91
+ return f"[INFO] {message}"
92
+
93
+ def format_warning(self, message: str) -> str:
94
+ """Format warning message with prefix.
95
+
96
+ Args:
97
+ message: Warning message text
98
+
99
+ Returns:
100
+ Prefixed warning message
101
+ """
102
+ return f"[WARN] {message}"
File without changes
@@ -0,0 +1,193 @@
1
+ """Field formatting utilities for common data types.
2
+
3
+ Provides reusable formatters for UUIDs, dates, currency, tokens, etc.
4
+ """
5
+
6
+ from datetime import datetime
7
+ from decimal import Decimal
8
+ from typing import Any, Callable
9
+ from uuid import UUID
10
+
11
+
12
+ def format_uuid(value: UUID | None, short: bool = True) -> str:
13
+ """Format UUID for display.
14
+
15
+ Args:
16
+ value: UUID to format (None returns placeholder)
17
+ short: If True, show first 8 characters with "...". If False, show full UUID.
18
+
19
+ Returns:
20
+ Formatted UUID string or "(not set)" for None
21
+ """
22
+ if value is None:
23
+ return "(not set)"
24
+
25
+ if short:
26
+ return str(value)[:8] + "..."
27
+ return str(value)
28
+
29
+
30
+ def format_datetime(
31
+ value: datetime | None, mode: str = "absolute", include_time: bool = True
32
+ ) -> str:
33
+ """Format datetime for display.
34
+
35
+ Args:
36
+ value: Datetime to format (None returns placeholder)
37
+ mode: Format mode - "absolute", "iso", or "date_only"
38
+ include_time: Whether to include time component
39
+
40
+ Returns:
41
+ Formatted datetime string or "(not set)" for None
42
+ """
43
+ if value is None:
44
+ return "(not set)"
45
+
46
+ if mode == "iso":
47
+ return value.isoformat()
48
+ elif mode == "date_only":
49
+ return value.strftime("%Y-%m-%d")
50
+ else: # absolute
51
+ if include_time:
52
+ return value.strftime("%Y-%m-%d %H:%M:%S UTC")
53
+ return value.strftime("%Y-%m-%d")
54
+
55
+
56
+ def format_cost(amount: Decimal | float, currency: str = "USD") -> str:
57
+ """Format monetary amount.
58
+
59
+ Args:
60
+ amount: Decimal or float amount
61
+ currency: Currency code (default USD, reserved for future use)
62
+
63
+ Returns:
64
+ Formatted currency string
65
+ """
66
+ _ = currency # Reserved for future multi-currency support
67
+ # Convert float to Decimal for precision
68
+ if isinstance(amount, float):
69
+ amount = Decimal(str(amount))
70
+
71
+ # Format with full precision (no rounding for small amounts)
72
+ return f"${amount}"
73
+
74
+
75
+ def format_tokens(count: int) -> str:
76
+ """Format token count with thousands separator.
77
+
78
+ Args:
79
+ count: Number of tokens
80
+
81
+ Returns:
82
+ Formatted token count string
83
+ """
84
+ return f"{count:,}"
85
+
86
+
87
+ def format_boolean(value: bool, mode: str = "text") -> str:
88
+ """Format boolean value for display.
89
+
90
+ Args:
91
+ value: Boolean value to format
92
+ mode: Format mode - "text", "emoji", or "raw"
93
+
94
+ Returns:
95
+ Formatted boolean string
96
+ """
97
+ if mode == "emoji":
98
+ return "✓" if value else "✗"
99
+ elif mode == "raw":
100
+ return str(value)
101
+ else: # text
102
+ return "Yes" if value else "No"
103
+
104
+
105
+ def format_optional(
106
+ value: Any | None,
107
+ formatter: Callable[[Any], str] | None = None,
108
+ placeholder: str = "(not set)",
109
+ ) -> str:
110
+ """Format optional value with placeholder for None.
111
+
112
+ Args:
113
+ value: Value to format (may be None)
114
+ formatter: Optional formatter function to apply if value is not None
115
+ placeholder: Text to display when value is None
116
+
117
+ Returns:
118
+ Formatted value or placeholder
119
+ """
120
+ if value is None:
121
+ return placeholder
122
+ if formatter:
123
+ return formatter(value)
124
+ return str(value)
125
+
126
+
127
+ def format_enum(value: Any, capitalize: bool = True) -> str:
128
+ """Format enum value for display.
129
+
130
+ Args:
131
+ value: Enum value (expected to have .value attribute)
132
+ capitalize: Whether to capitalize the output
133
+
134
+ Returns:
135
+ Formatted enum string
136
+ """
137
+ if hasattr(value, "value"):
138
+ text = str(value.value)
139
+ else:
140
+ text = str(value)
141
+
142
+ if capitalize:
143
+ return text.capitalize()
144
+ return text
145
+
146
+
147
+ def format_percentage(value: float, decimals: int = 1) -> str:
148
+ """Format percentage value.
149
+
150
+ Args:
151
+ value: Percentage as float (e.g., 0.85 for 85%)
152
+ decimals: Number of decimal places
153
+
154
+ Returns:
155
+ Formatted percentage string
156
+ """
157
+ return f"{value * 100:.{decimals}f}%"
158
+
159
+
160
+ def format_file_size(bytes_count: int) -> str:
161
+ """Format file size in human-readable format.
162
+
163
+ Args:
164
+ bytes_count: Size in bytes
165
+
166
+ Returns:
167
+ Formatted size string (e.g., "1.5 MB")
168
+ """
169
+ size = float(bytes_count)
170
+ for unit in ["B", "KB", "MB", "GB", "TB"]:
171
+ if size < 1024.0:
172
+ return f"{size:.1f} {unit}"
173
+ size /= 1024.0
174
+ return f"{size:.1f} PB"
175
+
176
+
177
+ def format_duration_ms(milliseconds: int) -> str:
178
+ """Format duration in milliseconds to human-readable format.
179
+
180
+ Args:
181
+ milliseconds: Duration in milliseconds
182
+
183
+ Returns:
184
+ Formatted duration string
185
+ """
186
+ if milliseconds < 1000:
187
+ return f"{milliseconds}ms"
188
+ elif milliseconds < 60000:
189
+ seconds = milliseconds / 1000
190
+ return f"{seconds:.2f}s"
191
+ else:
192
+ minutes = milliseconds / 60000
193
+ return f"{minutes:.2f}min"
File without changes
@@ -0,0 +1,123 @@
1
+ """Agent picker component for selecting base agents.
2
+
3
+ A specialized search picker that uses the ApiClient to fetch agents
4
+ and returns the selected agent's ID.
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from alloy_runtime_sdk.api_client.client import ApiClient
10
+
11
+ from cli.infrastructure.forms.base_picker import SingleSelectPicker
12
+
13
+
14
+ def _format_agent(agent: dict[str, Any]) -> str:
15
+ """Format an agent for display in the picker."""
16
+ name = agent.get("name", "Unknown")
17
+ description = agent.get("description")
18
+ model_count = agent.get("model_count", 0)
19
+
20
+ parts = [name]
21
+ if model_count:
22
+ parts.append(f"({model_count} model{'s' if model_count != 1 else ''})")
23
+ if description:
24
+ # Truncate long descriptions
25
+ if len(description) > 40:
26
+ description = description[:37] + "..."
27
+ parts.append(f"- {description}")
28
+
29
+ return " ".join(parts)
30
+
31
+
32
+ class AgentPicker(SingleSelectPicker[dict[str, Any]]):
33
+ """Agent picker for selecting base agents.
34
+
35
+ Searches agents via the ApiClient and returns the selected agent's ID.
36
+ User sees friendly agent names, not UUIDs.
37
+
38
+ Usage:
39
+ yield AgentPicker(
40
+ client=server_client,
41
+ id="base-agent",
42
+ )
43
+
44
+ # Get selected agent ID
45
+ picker = self.query_one("#base-agent", AgentPicker)
46
+ agent_id = picker.selected_agent_id # UUID string or None
47
+ """
48
+
49
+ def __init__(
50
+ self,
51
+ client: ApiClient,
52
+ placeholder: str = "Search agents (e.g., my writer agent)...",
53
+ empty_message: str = "No base agent selected (optional)",
54
+ fetch_on_mount: bool = True,
55
+ **kwargs: Any,
56
+ ) -> None:
57
+ """Initialize the agent picker.
58
+
59
+ Args:
60
+ client: ApiClient instance for API calls
61
+ placeholder: Placeholder text for search input
62
+ empty_message: Message shown when nothing is selected
63
+ fetch_on_mount: If True, show recent agents when picker opens (default True)
64
+ """
65
+ super().__init__(
66
+ client=client,
67
+ placeholder=placeholder,
68
+ empty_message=empty_message,
69
+ fetch_on_mount=fetch_on_mount,
70
+ **kwargs,
71
+ )
72
+
73
+ @property
74
+ def selected_agent_id(self) -> str | None:
75
+ """Alias for selected_id - returns the agent UUID."""
76
+ return self.selected_id
77
+
78
+ @property
79
+ def selected_agent_name(self) -> str | None:
80
+ """Get the name of the selected agent."""
81
+ if self._selected_item is None:
82
+ return None
83
+ return self._selected_item.get("name")
84
+
85
+ async def _fetch_items(self, query: str) -> list[dict[str, Any]]:
86
+ """Fetch agents matching query from the API.
87
+
88
+ When query is empty, returns recent agents sorted by updated_at.
89
+ """
90
+ response = await self._client.list_agents(
91
+ search=query if query else None,
92
+ limit=10 if not query else 50,
93
+ )
94
+ return [agent.model_dump() for agent in response.agents]
95
+
96
+ def _format_item(self, item: dict[str, Any]) -> str:
97
+ """Format agent for display in option list."""
98
+ return _format_agent(item)
99
+
100
+ def _get_item_id(self, item: dict[str, Any]) -> str:
101
+ """Get unique identifier for an agent."""
102
+ return str(item.get("id", ""))
103
+
104
+ def set_initial_agent(self, agent: dict[str, Any]) -> None:
105
+ """Pre-populate the picker with an existing agent selection.
106
+
107
+ Args:
108
+ agent: Agent dict with at least 'id' and 'name' keys
109
+ """
110
+ self.set_initial_selection(agent)
111
+
112
+ def set_initial_agent_by_id(
113
+ self, agent_id: str, name: str = "Selected Agent"
114
+ ) -> None:
115
+ """Pre-populate the picker with an agent by its ID.
116
+
117
+ Use this when you only have the agent ID and not the full agent data.
118
+
119
+ Args:
120
+ agent_id: The agent UUID
121
+ name: Display name for the agent
122
+ """
123
+ self.set_initial_selection({"id": agent_id, "name": name})