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,335 @@
1
+ """Tool Configs screen for browsing and managing tool configurations.
2
+
3
+ This screen provides:
4
+ - Search and browse tool configs
5
+ - View tool config details in preview panel (including JSON config)
6
+ - Create new tool configs
7
+ - Edit existing tool configs
8
+ - Delete tool configs (with in-use protection)
9
+ """
10
+
11
+ from typing import TYPE_CHECKING
12
+
13
+ from rich.markup import escape
14
+ from textual import on, work
15
+ from textual.app import ComposeResult
16
+ from textual.binding import Binding
17
+ from textual.containers import Horizontal, Vertical, VerticalScroll
18
+ from textual.widgets import Button, DataTable, Input, Static
19
+
20
+ from alloy_runtime_types.dtos.tool_configs import ToolConfigSummary
21
+
22
+ from cli.infrastructure.scope_utils import format_scope_label
23
+ from cli.infrastructure.tui.clipboard import copy_to_clipboard
24
+ from cli.infrastructure.tui.formatters import format_datetime, truncate_text
25
+ from cli.tui.screens.base import BrowserWidget
26
+ from cli.tui.screens.nav_screen import NavScreen
27
+ from cli.tui.widgets.confirm_modal import ConfirmModal
28
+ from cli.tui.widgets.tool_config_create_modal import (
29
+ ToolConfigCreateModal,
30
+ ToolConfigCreateResult,
31
+ )
32
+ from cli.tui.widgets.tool_config_update_modal import ToolConfigUpdateModal
33
+
34
+ if TYPE_CHECKING:
35
+ from cli.tui.app import AlloyRuntimeApp
36
+
37
+
38
+ class ToolConfigsWidget(BrowserWidget[ToolConfigSummary]):
39
+ """Widget for browsing and managing tool configurations."""
40
+
41
+ app: "AlloyRuntimeApp"
42
+
43
+ TITLE = "Tool Configs"
44
+ TABLE_COLUMNS = ["Name", "Tool", "Scope", "Updated"]
45
+
46
+ def compose(self) -> ComposeResult:
47
+ """Compose the browser layout with a New button."""
48
+ with Vertical(id="browser-root"):
49
+ with Vertical(id="search-container"):
50
+ with Horizontal(id="search-row"):
51
+ yield Input(
52
+ placeholder=f"Search {self.TITLE.lower()}...",
53
+ id="search-input",
54
+ )
55
+ yield Button("+ New", id="new-config-btn", variant="primary")
56
+ yield Static("Loading...", id="status-bar")
57
+
58
+ with Horizontal(id="main-container"):
59
+ with Vertical(id="list-container"):
60
+ yield DataTable(id="data-table", cursor_type="row")
61
+
62
+ with Vertical(id="detail-container"):
63
+ yield Static("Preview", id="preview-title")
64
+ with VerticalScroll(id="preview-scroll"):
65
+ yield Static(
66
+ "Select an item to view details",
67
+ id="preview-content",
68
+ )
69
+
70
+ @on(Button.Pressed, "#new-config-btn")
71
+ def _on_new_config_btn_pressed(self, event: Button.Pressed) -> None:
72
+ """Handle New button press."""
73
+ self.open_new_modal()
74
+
75
+ async def _fetch_items(self, query: str) -> tuple[list[ToolConfigSummary], int]:
76
+ """Fetch tool configs from the API."""
77
+ client = await self._ensure_client()
78
+ response = await client.list_tool_configs(
79
+ search=query if query else None,
80
+ limit=50,
81
+ )
82
+ return list(response.tool_configs), response.total
83
+
84
+ def _format_row(self, item: ToolConfigSummary) -> tuple[str, ...]:
85
+ """Format a tool config as a table row."""
86
+ return (
87
+ truncate_text(item.name, max_length=30),
88
+ item.tool_id,
89
+ format_scope_label(
90
+ str(item.organization_id) if item.organization_id else None,
91
+ str(item.user_id) if item.user_id else None,
92
+ ),
93
+ format_datetime(item.updated_at),
94
+ )
95
+
96
+ def _update_preview(self, item: ToolConfigSummary) -> None:
97
+ """Update the preview pane with tool config details.
98
+
99
+ Note: ToolConfigSummary doesn't include the full config JSON.
100
+ We show the basic info here. For full config, user can edit.
101
+ """
102
+ preview = self.query_one("#preview-content", Static)
103
+
104
+ scope = format_scope_label(
105
+ str(item.organization_id) if item.organization_id else None,
106
+ str(item.user_id) if item.user_id else None,
107
+ )
108
+
109
+ created = format_datetime(item.created_at)
110
+ updated = format_datetime(item.updated_at)
111
+
112
+ preview_text = f"""[bold]Tool Config ID:[/] {escape(str(item.id))}
113
+ [bold]Name:[/] {escape(item.name)}
114
+ [bold]Slug:[/] {escape(item.slug)}
115
+ [bold]Tool:[/] {escape(item.tool_id)}
116
+ [bold]Scope:[/] {scope}
117
+
118
+ [bold]Description:[/]
119
+ {escape(item.description or "(no description)")}
120
+
121
+ [dim]Note: Edit to view full configuration JSON[/]
122
+
123
+ [bold]Created:[/] {created}
124
+ [bold]Updated:[/] {updated}"""
125
+
126
+ preview.update(preview_text)
127
+
128
+ # =========================================================================
129
+ # Public methods for parent Screen to call
130
+ # =========================================================================
131
+
132
+ def copy_config_name(self) -> None:
133
+ """Copy the tool config name to clipboard."""
134
+ config = self.get_selected_item()
135
+ if not config:
136
+ self.app.notify("No tool config selected", severity="warning")
137
+ return
138
+
139
+ copy_to_clipboard(self.app, config.name, "Tool config name")
140
+
141
+ def open_new_modal(self) -> None:
142
+ """Open the tool config creation modal."""
143
+ self._open_create_modal()
144
+
145
+ def open_edit_modal(self) -> None:
146
+ """Open the tool config update modal for the selected config."""
147
+ config = self.get_selected_item()
148
+ if not config:
149
+ self.app.notify("No tool config selected", severity="warning")
150
+ return
151
+ self._open_update_modal(config)
152
+
153
+ def delete_selected(self) -> None:
154
+ """Delete the currently selected tool config."""
155
+ config = self.get_selected_item()
156
+ if not config:
157
+ self.app.notify("No tool config selected", severity="warning")
158
+ return
159
+
160
+ config_name = config.name
161
+ self.app.push_screen(
162
+ ConfirmModal(
163
+ title="Delete Tool Config",
164
+ message=f"Delete tool config '{config_name}'?\n\n"
165
+ "Note: Deletion will fail if this config is used by any agents.",
166
+ ),
167
+ lambda confirmed: self._on_delete_confirmed(confirmed, str(config.id)),
168
+ )
169
+
170
+ # =========================================================================
171
+ # Internal async operations
172
+ # =========================================================================
173
+
174
+ @work(exclusive=True)
175
+ async def _open_create_modal(self) -> None:
176
+ """Open the tool config creation modal."""
177
+ try:
178
+ client = await self._ensure_client()
179
+ self.app.push_screen(
180
+ ToolConfigCreateModal(client=client),
181
+ self._on_config_created,
182
+ )
183
+ except Exception as e:
184
+ self.app.notify(f"Failed to open config creator: {e}", severity="error")
185
+
186
+ def _on_config_created(self, result: ToolConfigCreateResult | None) -> None:
187
+ """Callback when tool config creation modal is dismissed."""
188
+ if result is not None:
189
+ self.app.notify(
190
+ f"Created tool config: {result.config_name}",
191
+ severity="information",
192
+ )
193
+ # Refresh the list
194
+ self._do_search(self._last_search)
195
+
196
+ @work(exclusive=True)
197
+ async def _open_update_modal(self, config_summary: ToolConfigSummary) -> None:
198
+ """Fetch full tool config details and open the update modal."""
199
+ try:
200
+ client = await self._ensure_client()
201
+ # Fetch full config (includes the config JSON)
202
+ config = await client.get_tool_config(str(config_summary.id))
203
+ self.app.push_screen(
204
+ ToolConfigUpdateModal(client=client, config=config),
205
+ self._on_config_updated,
206
+ )
207
+ except Exception as e:
208
+ self.app.notify(f"Failed to open config editor: {e}", severity="error")
209
+
210
+ def _on_config_updated(self, result: ToolConfigCreateResult | None) -> None:
211
+ """Callback when tool config update modal is dismissed."""
212
+ if result is not None:
213
+ self.app.notify(
214
+ f"Updated tool config: {result.config_name}",
215
+ severity="information",
216
+ )
217
+ # Refresh the list
218
+ self._do_search(self._last_search)
219
+
220
+ def _on_delete_confirmed(self, confirmed: bool | None, config_id: str) -> None:
221
+ """Callback when delete confirmation modal is dismissed."""
222
+ if confirmed:
223
+ self._execute_delete(config_id)
224
+
225
+ @work(exclusive=True)
226
+ async def _execute_delete(self, config_id: str) -> None:
227
+ """Execute the delete operation."""
228
+ try:
229
+ client = await self._ensure_client()
230
+ response = await client.delete_tool_config(config_id)
231
+
232
+ self.app.notify(
233
+ f"Tool config '{response.deleted_tool_config.name}' deleted",
234
+ severity="information",
235
+ )
236
+ # Refresh the list
237
+ self._do_search(self._last_search)
238
+
239
+ except Exception as e:
240
+ error_msg = str(e)
241
+ if "in use" in error_msg.lower() or "referenced" in error_msg.lower():
242
+ self.app.notify(
243
+ "Cannot delete: config is used by one or more agents",
244
+ severity="error",
245
+ )
246
+ else:
247
+ self.app.notify(f"Failed to delete tool config: {e}", severity="error")
248
+
249
+
250
+ class ToolConfigsScreen(NavScreen):
251
+ """Screen for browsing and managing tool configurations.
252
+
253
+ This is a proper Textual Screen that wraps the ToolConfigsWidget
254
+ and provides keybindings that work regardless of focus.
255
+ """
256
+
257
+ app: "AlloyRuntimeApp"
258
+
259
+ SCREEN_ID = "tool_configs"
260
+
261
+ DEFAULT_CSS = """
262
+ ToolConfigsScreen #screen-root {
263
+ height: 1fr;
264
+ }
265
+
266
+ ToolConfigsScreen .browser-widget {
267
+ height: 100%;
268
+ width: 100%;
269
+ }
270
+ """
271
+
272
+ # Screen-specific bindings (Ctrl+ prefixed)
273
+ # NavScreen.BINDINGS provides global navigation (c, a, t, s, m, d, g, ?)
274
+ BINDINGS = NavScreen.BINDINGS + [
275
+ Binding("ctrl+f", "focus_search", "Search", show=True),
276
+ Binding("ctrl+r", "refresh", "Refresh", show=True),
277
+ Binding("ctrl+y", "copy_name", "Copy Name", show=True),
278
+ Binding("ctrl+n", "new_config", "New", show=True),
279
+ Binding("ctrl+e", "edit_config", "Edit", show=True),
280
+ Binding("ctrl+d", "delete_config", "Delete", show=True),
281
+ Binding("escape", "focus_table", "Focus List", show=False),
282
+ Binding("enter", "copy_name", "Copy Name", show=False),
283
+ ]
284
+
285
+ def compose_content(self) -> ComposeResult:
286
+ """Compose the screen content."""
287
+ yield ToolConfigsWidget(id="tool-configs-widget")
288
+
289
+ def on_screen_resume(self) -> None:
290
+ """Focus the data table when screen becomes active."""
291
+ self.call_after_refresh(self._focus_table)
292
+
293
+ def _focus_table(self) -> None:
294
+ """Focus the data table."""
295
+ try:
296
+ widget = self.query_one("#tool-configs-widget", ToolConfigsWidget)
297
+ widget.focus_table()
298
+ except Exception:
299
+ pass
300
+
301
+ def _get_widget(self) -> ToolConfigsWidget:
302
+ """Get the tool configs widget."""
303
+ return self.query_one("#tool-configs-widget", ToolConfigsWidget)
304
+
305
+ # =========================================================================
306
+ # Actions (keybinding handlers)
307
+ # =========================================================================
308
+
309
+ def action_focus_search(self) -> None:
310
+ """Focus the search input."""
311
+ self._get_widget().focus_search()
312
+
313
+ def action_focus_table(self) -> None:
314
+ """Focus the data table."""
315
+ self._get_widget().focus_table()
316
+
317
+ def action_refresh(self) -> None:
318
+ """Refresh the current search results."""
319
+ self._get_widget().refresh_data()
320
+
321
+ def action_copy_name(self) -> None:
322
+ """Copy the tool config name to clipboard."""
323
+ self._get_widget().copy_config_name()
324
+
325
+ def action_new_config(self) -> None:
326
+ """Open the tool config creation modal."""
327
+ self._get_widget().open_new_modal()
328
+
329
+ def action_edit_config(self) -> None:
330
+ """Open the tool config update modal."""
331
+ self._get_widget().open_edit_modal()
332
+
333
+ def action_delete_config(self) -> None:
334
+ """Delete the selected tool config."""
335
+ self._get_widget().delete_selected()
File without changes
File without changes
@@ -0,0 +1,139 @@
1
+ """Agent creation modal for creating new agents.
2
+
3
+ Provides a comprehensive modal screen that allows users to create a new agent
4
+ with all required fields: name, models, tags, and optional configuration.
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from alloy_runtime_sdk.api_client.client import ApiClient
10
+ from alloy_runtime_types.dtos.agents import CreateAgentRequest
11
+
12
+ from cli.infrastructure.forms.agent_picker import AgentPicker
13
+ from cli.infrastructure.forms.schema_picker import SchemaPicker
14
+ from cli.infrastructure.forms.tag_picker import TagPicker
15
+ from cli.infrastructure.forms.template_picker import TemplatePicker
16
+ from cli.tui.widgets.agent_form_modal import AgentFormModal, AgentFormResult
17
+
18
+
19
+ class AgentCreateModal(AgentFormModal):
20
+ """Modal for creating a new agent.
21
+
22
+ Provides a comprehensive form with:
23
+ - Required fields: name, models, tags
24
+ - Basic info: description, scope, base agent
25
+ - System instruction: template picker
26
+ - Schemas: input/output schema pickers or inline JSON schema builder
27
+ - Generation parameters: temperature, max_tokens, etc.
28
+ - Advanced: default headers with quick-add buttons
29
+
30
+ Usage:
31
+ def on_agent_created(result: AgentCreateResult | None):
32
+ if result is not None:
33
+ self.notify(f"Created agent: {result.agent_name}")
34
+ self._do_search("") # Refresh list
35
+
36
+ client = await self.app.store.get_client()
37
+ self.app.push_screen(
38
+ AgentCreateModal(client=client),
39
+ on_agent_created
40
+ )
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ client: ApiClient,
46
+ **kwargs: Any,
47
+ ) -> None:
48
+ """Initialize the agent creation modal.
49
+
50
+ Args:
51
+ client: ApiClient instance for API calls
52
+ """
53
+ super().__init__(client=client, **kwargs)
54
+
55
+ def _get_modal_title(self) -> str:
56
+ """Return the modal title."""
57
+ return "Create New Agent"
58
+
59
+ def _get_submit_button_text(self) -> str:
60
+ """Return the submit button text."""
61
+ return "Create Agent"
62
+
63
+ def _is_scope_editable(self) -> bool:
64
+ """Return whether the scope can be changed."""
65
+ return True
66
+
67
+ async def _submit_form(self) -> AgentFormResult:
68
+ """Submit the form to create a new agent."""
69
+ request = self._build_create_request()
70
+ response = await self._client.create_agent(request)
71
+
72
+ return AgentFormResult(
73
+ agent_id=str(response.id),
74
+ agent_name=response.name,
75
+ is_update=False,
76
+ )
77
+
78
+ def _build_create_request(self) -> CreateAgentRequest:
79
+ """Build the CreateAgentRequest from form fields."""
80
+ from textual.widgets import Input, TextArea
81
+
82
+ # Required: name
83
+ name = self.query_one("#name-input", Input).value.strip()
84
+
85
+ # Required: models
86
+ model_configs = self._build_model_configs()
87
+
88
+ # Required for non-global: tags
89
+ tag_picker = self.query_one("#tag-picker", TagPicker)
90
+ tags = tag_picker.selected_tags
91
+
92
+ # Basic info
93
+ description = self.query_one("#description-input", Input).value.strip() or None
94
+ scope = self._get_scope()
95
+
96
+ # Base agent
97
+ base_agent_picker = self.query_one("#base-agent-picker", AgentPicker)
98
+ base_agent_id = self._parse_uuid(
99
+ base_agent_picker.selected_agent_id, "Base Agent"
100
+ )
101
+
102
+ # System instruction template
103
+ template_picker = self.query_one("#system-template-picker", TemplatePicker)
104
+ system_instruction_version_id = self._parse_uuid(
105
+ template_picker.selected_id, "System Template"
106
+ )
107
+
108
+ # Schemas
109
+ output_schema_picker = self.query_one("#output-schema-picker", SchemaPicker)
110
+ output_schema_id = self._parse_uuid(
111
+ output_schema_picker.selected_id, "Output Schema"
112
+ )
113
+
114
+ # Output schema from JSON builder
115
+ output_schema = self._get_output_schema()
116
+
117
+ # Generation parameters
118
+ gen_params = self._build_generation_params()
119
+
120
+ # Advanced: default headers
121
+ default_headers = self._parse_json(
122
+ self.query_one("#default-headers-textarea", TextArea).text,
123
+ "Default Headers",
124
+ )
125
+
126
+ return CreateAgentRequest(
127
+ name=name,
128
+ models=model_configs,
129
+ tags=tags,
130
+ scope=scope,
131
+ base_agent_id=base_agent_id,
132
+ description=description,
133
+ system_instruction_version_id=system_instruction_version_id,
134
+ output_schema_id=output_schema_id,
135
+ output_schema=output_schema,
136
+ default_request_headers=default_headers,
137
+ generation_params=gen_params,
138
+ tools=self._build_tools(),
139
+ )