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,53 @@
1
+ """Knowledge synthesis delete command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.flag_utils import validate_uuid
6
+ from cli.commands.knowledge.synthesis.delete.presenter import (
7
+ present_synthesis_delete_success,
8
+ )
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def knowledge_synthesis_delete_command(
13
+ synthesis_id: str = typer.Argument(
14
+ ...,
15
+ help="Synthesis UUID to delete",
16
+ ),
17
+ yes: bool = typer.Option(
18
+ False,
19
+ "-y",
20
+ "--yes",
21
+ help="Skip confirmation prompt",
22
+ ),
23
+ ) -> None:
24
+ """Delete a synthesis.
25
+
26
+ This permanently removes the synthesis, its collection associations,
27
+ and its source tracking records.
28
+
29
+ Examples:
30
+ ai2 knowledge synthesis delete <synthesis-uuid>
31
+ ai2 kb synthesis delete <uuid> --yes
32
+ """
33
+ # Validate synthesis UUID
34
+ validate_uuid(synthesis_id, "synthesis")
35
+
36
+ # Confirm deletion unless --yes flag provided
37
+ if not yes:
38
+ confirm = typer.confirm(
39
+ f"Are you sure you want to delete synthesis {synthesis_id}?"
40
+ )
41
+ if not confirm:
42
+ raise typer.Abort()
43
+
44
+ _execute_delete(synthesis_id)
45
+
46
+
47
+ @async_command
48
+ async def _execute_delete(synthesis_id: str) -> None:
49
+ """Execute synthesis deletion."""
50
+ async with authenticated_client() as (_config, client):
51
+ response = await client.delete_synthesis(synthesis_id)
52
+
53
+ present_synthesis_delete_success(response)
@@ -0,0 +1,31 @@
1
+ """Presenter for synthesis delete output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import format_uuid
7
+ from cli.infrastructure.output import OutputService
8
+ from alloy_runtime_types.dtos.knowledge import DeleteSynthesisResponse
9
+
10
+
11
+ def present_synthesis_delete_success(response: DeleteSynthesisResponse) -> None:
12
+ """Present successful synthesis deletion.
13
+
14
+ Args:
15
+ response: Delete synthesis response from server
16
+ """
17
+ output = OutputService.get()
18
+
19
+ output.success("Synthesis deleted successfully")
20
+
21
+ # Build a simple table for deleted entity info
22
+ table = Table(show_header=False, box=None, padding=(0, 1))
23
+ table.add_column("Field", style="dim")
24
+ table.add_column("Value")
25
+
26
+ table.add_row("ID", format_uuid(response.id, short=False))
27
+ table.add_row("Title", response.title)
28
+ table.add_row("Topic", response.topic)
29
+
30
+ panel = Panel(table, title="Deleted Synthesis", border_style="red")
31
+ output.console.print(panel)
File without changes
@@ -0,0 +1,55 @@
1
+ """Knowledge synthesis get command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.flag_utils import validate_uuid
6
+ from cli.commands.knowledge.synthesis.get.presenter import present_synthesis_details
7
+ from cli.infrastructure.command import async_command, authenticated_client
8
+
9
+
10
+ def knowledge_synthesis_get_command(
11
+ synthesis_id: str = typer.Argument(
12
+ ...,
13
+ help="Synthesis UUID",
14
+ ),
15
+ output: str = typer.Option(
16
+ "panel",
17
+ "-o",
18
+ "--output",
19
+ help="Output format: 'panel' or 'json'",
20
+ ),
21
+ ) -> None:
22
+ """Get synthesis details.
23
+
24
+ Returns the full synthesis details including content (if completed),
25
+ status, staleness information, and source tracking.
26
+
27
+ Examples:
28
+ ai2 knowledge synthesis get <synthesis-uuid>
29
+ ai2 kb synthesis get <uuid> --output json
30
+ """
31
+ _execute_get_from_flags(synthesis_id=synthesis_id, output=output)
32
+
33
+
34
+ def _execute_get_from_flags(synthesis_id: str, output: str) -> None:
35
+ """Validate flags and execute get."""
36
+ # Validate synthesis UUID
37
+ validate_uuid(synthesis_id, "synthesis")
38
+
39
+ # Validate output format
40
+ output_format = output.lower()
41
+ if output_format not in ("panel", "json"):
42
+ raise typer.BadParameter(
43
+ f"Invalid output format '{output}'. Valid: panel, json"
44
+ )
45
+
46
+ _execute_get(synthesis_id, output_format)
47
+
48
+
49
+ @async_command
50
+ async def _execute_get(synthesis_id: str, output_format: str) -> None:
51
+ """Execute synthesis get."""
52
+ async with authenticated_client() as (_config, client):
53
+ response = await client.get_synthesis(synthesis_id)
54
+
55
+ present_synthesis_details(response, output_format)
@@ -0,0 +1,114 @@
1
+ """Presenter for synthesis get output."""
2
+
3
+ import json
4
+
5
+ from rich.markdown import Markdown
6
+ from rich.panel import Panel
7
+ from rich.table import Table
8
+
9
+ from cli.infrastructure.formatting.fields import (
10
+ format_datetime,
11
+ format_uuid,
12
+ )
13
+ from cli.infrastructure.output import OutputService
14
+ from alloy_runtime_types.dtos.knowledge import GetSynthesisResponse
15
+
16
+
17
+ def present_synthesis_details(
18
+ response: GetSynthesisResponse, output_format: str
19
+ ) -> None:
20
+ """Present synthesis details.
21
+
22
+ Args:
23
+ response: Get synthesis response from server
24
+ output_format: Output format ('panel' or 'json')
25
+ """
26
+ output = OutputService.get()
27
+
28
+ if output_format == "json":
29
+ # JSON output
30
+ data = {
31
+ "id": str(response.id),
32
+ "topic": response.topic,
33
+ "title": response.title,
34
+ "status": response.status,
35
+ "synthesis_content": response.synthesis_content,
36
+ "error_message": response.error_message,
37
+ "is_stale": response.is_stale,
38
+ "staleness_reason": response.staleness_reason,
39
+ "source_chunk_count": response.source_chunk_count,
40
+ "collection_ids": [str(c) for c in response.collection_ids],
41
+ "synthesizer_agent_id": str(response.synthesizer_agent_id)
42
+ if response.synthesizer_agent_id
43
+ else None,
44
+ "execution_id": str(response.execution_id)
45
+ if response.execution_id
46
+ else None,
47
+ "metadata": response.metadata,
48
+ "created_at": response.created_at.isoformat(),
49
+ "updated_at": response.updated_at.isoformat(),
50
+ }
51
+ output.console.print_json(json.dumps(data))
52
+ return
53
+
54
+ # Panel output
55
+ # Build metadata table
56
+ table = Table(show_header=False, box=None, padding=(0, 1))
57
+ table.add_column("Field", style="dim")
58
+ table.add_column("Value")
59
+
60
+ table.add_row("ID", format_uuid(response.id, short=False))
61
+ table.add_row("Title", response.title)
62
+ table.add_row("Topic", response.topic)
63
+
64
+ # Status with color
65
+ status = response.status
66
+ if status == "completed":
67
+ status_display = f"[green]{status}[/green]"
68
+ elif status == "failed":
69
+ status_display = f"[red]{status}[/red]"
70
+ elif status == "processing":
71
+ status_display = f"[yellow]{status}[/yellow]"
72
+ else:
73
+ status_display = f"[dim]{status}[/dim]"
74
+ table.add_row("Status", status_display)
75
+
76
+ # Staleness
77
+ if response.is_stale:
78
+ stale_display = (
79
+ f"[yellow]Yes[/yellow] - {response.staleness_reason or 'Unknown reason'}"
80
+ )
81
+ else:
82
+ stale_display = "[green]No[/green]"
83
+ table.add_row("Stale", stale_display)
84
+
85
+ table.add_row("Source Chunks", str(response.source_chunk_count))
86
+ table.add_row("Collections", str(len(response.collection_ids)))
87
+
88
+ if response.synthesizer_agent_id:
89
+ table.add_row("Agent", format_uuid(response.synthesizer_agent_id, short=True))
90
+ if response.execution_id:
91
+ table.add_row("Execution", format_uuid(response.execution_id, short=True))
92
+
93
+ table.add_row("Created", format_datetime(response.created_at))
94
+ table.add_row("Updated", format_datetime(response.updated_at))
95
+
96
+ if response.error_message:
97
+ table.add_row("Error", f"[red]{response.error_message}[/red]")
98
+
99
+ # Show metadata if present
100
+ if response.metadata:
101
+ table.add_row("Metadata", str(response.metadata))
102
+
103
+ panel = Panel(table, title=f"Synthesis: {response.title}", border_style="blue")
104
+ output.console.print(panel)
105
+
106
+ # Show content if completed
107
+ if response.synthesis_content:
108
+ output.console.print()
109
+ content_panel = Panel(
110
+ Markdown(response.synthesis_content),
111
+ title="Synthesis Content",
112
+ border_style="green",
113
+ )
114
+ output.console.print(content_panel)
File without changes
@@ -0,0 +1,132 @@
1
+ """Knowledge synthesis list command implementation."""
2
+
3
+ from typing import Optional
4
+
5
+ import typer
6
+
7
+ from cli.commands.flag_utils import validate_uuid
8
+ from cli.commands.knowledge.synthesis.list.presenter import present_syntheses_list
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def knowledge_synthesis_list_command(
13
+ collection: Optional[str] = typer.Option(
14
+ None,
15
+ "-C",
16
+ "--collection",
17
+ help="Filter by collection UUID",
18
+ ),
19
+ status: Optional[str] = typer.Option(
20
+ None,
21
+ "-s",
22
+ "--status",
23
+ help="Filter by status: pending, processing, completed, failed",
24
+ ),
25
+ include_stale: bool = typer.Option(
26
+ True,
27
+ "--include-stale/--no-stale",
28
+ help="Include stale syntheses (default: include)",
29
+ ),
30
+ limit: int = typer.Option(
31
+ 50,
32
+ "-l",
33
+ "--limit",
34
+ min=1,
35
+ max=100,
36
+ help="Maximum results (1-100)",
37
+ ),
38
+ offset: int = typer.Option(
39
+ 0,
40
+ "--offset",
41
+ min=0,
42
+ help="Pagination offset",
43
+ ),
44
+ output: str = typer.Option(
45
+ "table",
46
+ "-o",
47
+ "--output",
48
+ help="Output format: 'table' or 'json'",
49
+ ),
50
+ ) -> None:
51
+ """List syntheses for the organization.
52
+
53
+ Supports filtering by collection, status, and staleness.
54
+ Results are ordered by creation date (newest first).
55
+
56
+ Examples:
57
+ ai2 knowledge synthesis list
58
+ ai2 kb synthesis list -C <collection-uuid>
59
+ ai2 kb synthesis list --status completed --no-stale
60
+ ai2 kb synthesis list -l 10 --output json
61
+ """
62
+ _execute_list_from_flags(
63
+ collection=collection,
64
+ status=status,
65
+ include_stale=include_stale,
66
+ limit=limit,
67
+ offset=offset,
68
+ output=output,
69
+ )
70
+
71
+
72
+ def _execute_list_from_flags(
73
+ collection: Optional[str],
74
+ status: Optional[str],
75
+ include_stale: bool,
76
+ limit: int,
77
+ offset: int,
78
+ output: str,
79
+ ) -> None:
80
+ """Validate flags and execute list."""
81
+ # Validate collection ID if provided
82
+ collection_id: str | None = None
83
+ if collection:
84
+ validate_uuid(collection, "collection")
85
+ collection_id = collection
86
+
87
+ # Validate status if provided
88
+ if status:
89
+ valid_statuses = ["pending", "processing", "completed", "failed"]
90
+ if status.lower() not in valid_statuses:
91
+ raise typer.BadParameter(
92
+ f"Invalid status '{status}'. Valid: {', '.join(valid_statuses)}"
93
+ )
94
+ status = status.lower()
95
+
96
+ # Validate output format
97
+ output_format = output.lower()
98
+ if output_format not in ("table", "json"):
99
+ raise typer.BadParameter(
100
+ f"Invalid output format '{output}'. Valid: table, json"
101
+ )
102
+
103
+ _execute_list(
104
+ collection_id=collection_id,
105
+ status=status,
106
+ include_stale=include_stale,
107
+ limit=limit,
108
+ offset=offset,
109
+ output_format=output_format,
110
+ )
111
+
112
+
113
+ @async_command
114
+ async def _execute_list(
115
+ collection_id: str | None,
116
+ status: str | None,
117
+ include_stale: bool,
118
+ limit: int,
119
+ offset: int,
120
+ output_format: str,
121
+ ) -> None:
122
+ """Execute synthesis list."""
123
+ async with authenticated_client() as (_config, client):
124
+ response = await client.list_syntheses(
125
+ collection_id=collection_id,
126
+ status=status,
127
+ include_stale=include_stale,
128
+ limit=limit,
129
+ offset=offset,
130
+ )
131
+
132
+ present_syntheses_list(response, output_format)
@@ -0,0 +1,84 @@
1
+ """Presenter for synthesis list output."""
2
+
3
+ import json
4
+
5
+ from rich.table import Table
6
+
7
+ from cli.infrastructure.formatting.fields import format_datetime, format_uuid
8
+ from cli.infrastructure.output import OutputService
9
+ from alloy_runtime_types.dtos.knowledge import ListSynthesesResponse
10
+
11
+
12
+ def present_syntheses_list(response: ListSynthesesResponse, output_format: str) -> None:
13
+ """Present synthesis list results.
14
+
15
+ Args:
16
+ response: List syntheses response from server
17
+ output_format: Output format ('table' or 'json')
18
+ """
19
+ output = OutputService.get()
20
+
21
+ if output_format == "json":
22
+ # JSON output
23
+ data = {
24
+ "syntheses": [
25
+ {
26
+ "id": str(s.id),
27
+ "topic": s.topic,
28
+ "title": s.title,
29
+ "status": s.status,
30
+ "is_stale": s.is_stale,
31
+ "source_chunk_count": s.source_chunk_count,
32
+ "collection_ids": [str(c) for c in s.collection_ids],
33
+ "created_at": s.created_at.isoformat(),
34
+ "updated_at": s.updated_at.isoformat(),
35
+ }
36
+ for s in response.syntheses
37
+ ],
38
+ "total": response.total,
39
+ }
40
+ output.console.print_json(json.dumps(data))
41
+ return
42
+
43
+ # Table output
44
+ if not response.syntheses:
45
+ output.info("No syntheses found")
46
+ return
47
+
48
+ table = Table(title=f"Syntheses ({response.total} total)")
49
+ table.add_column("ID", style="dim")
50
+ table.add_column("Title")
51
+ table.add_column("Status")
52
+ table.add_column("Stale", justify="center")
53
+ table.add_column("Sources", justify="right")
54
+ table.add_column("Created")
55
+
56
+ for synthesis in response.syntheses:
57
+ # Status styling
58
+ status = synthesis.status
59
+ if status == "completed":
60
+ status_display = f"[green]{status}[/green]"
61
+ elif status == "failed":
62
+ status_display = f"[red]{status}[/red]"
63
+ elif status == "processing":
64
+ status_display = f"[yellow]{status}[/yellow]"
65
+ else:
66
+ status_display = f"[dim]{status}[/dim]"
67
+
68
+ # Stale indicator
69
+ stale_display = (
70
+ "[yellow]⚠[/yellow]" if synthesis.is_stale else "[green]✓[/green]"
71
+ )
72
+
73
+ table.add_row(
74
+ format_uuid(synthesis.id, short=True),
75
+ synthesis.title[:40] + "..."
76
+ if len(synthesis.title) > 40
77
+ else synthesis.title,
78
+ status_display,
79
+ stale_display,
80
+ str(synthesis.source_chunk_count),
81
+ format_datetime(synthesis.created_at),
82
+ )
83
+
84
+ output.console.print(table)
File without changes
@@ -0,0 +1,42 @@
1
+ """Knowledge synthesis refresh command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.flag_utils import validate_uuid
6
+ from cli.commands.knowledge.synthesis.refresh.presenter import (
7
+ present_synthesis_refresh_success,
8
+ )
9
+ from cli.infrastructure.command import async_command, authenticated_client
10
+
11
+
12
+ def knowledge_synthesis_refresh_command(
13
+ synthesis_id: str = typer.Argument(
14
+ ...,
15
+ help="Synthesis UUID to refresh",
16
+ ),
17
+ ) -> None:
18
+ """Refresh a synthesis.
19
+
20
+ Regenerates the synthesis content using the same topic, agent, and template.
21
+ Use this to update a stale synthesis or to get updated results after
22
+ new documents have been added to the source collections.
23
+
24
+ Cannot refresh a synthesis that is currently processing.
25
+
26
+ Examples:
27
+ ai2 knowledge synthesis refresh <synthesis-uuid>
28
+ ai2 kb synthesis refresh <uuid>
29
+ """
30
+ # Validate synthesis UUID
31
+ validate_uuid(synthesis_id, "synthesis")
32
+
33
+ _execute_refresh(synthesis_id)
34
+
35
+
36
+ @async_command
37
+ async def _execute_refresh(synthesis_id: str) -> None:
38
+ """Execute synthesis refresh."""
39
+ async with authenticated_client() as (_config, client):
40
+ response = await client.refresh_synthesis(synthesis_id)
41
+
42
+ present_synthesis_refresh_success(response)
@@ -0,0 +1,33 @@
1
+ """Presenter for synthesis refresh output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import format_uuid
7
+ from cli.infrastructure.output import OutputService
8
+ from alloy_runtime_types.dtos.knowledge import RefreshSynthesisResponse
9
+
10
+
11
+ def present_synthesis_refresh_success(response: RefreshSynthesisResponse) -> None:
12
+ """Present successful synthesis refresh.
13
+
14
+ Args:
15
+ response: Refresh synthesis response from server
16
+ """
17
+ output = OutputService.get()
18
+
19
+ output.success("Synthesis refresh queued")
20
+
21
+ # Build a simple table for entity display
22
+ table = Table(show_header=False, box=None, padding=(0, 1))
23
+ table.add_column("Field", style="dim")
24
+ table.add_column("Value")
25
+
26
+ table.add_row("Synthesis ID", format_uuid(response.synthesis_id, short=False))
27
+ table.add_row("Status", f"[yellow]{response.status}[/yellow]")
28
+ table.add_row("Message", response.message)
29
+
30
+ panel = Panel(table, title="Synthesis Refresh Started", border_style="green")
31
+ output.console.print(panel)
32
+
33
+ output.info(f"Poll status with: ai2 kb synthesis get {response.synthesis_id}")
File without changes
@@ -0,0 +1,76 @@
1
+ """Knowledge synthesis update command implementation."""
2
+
3
+ from typing import Optional
4
+
5
+ import typer
6
+
7
+ from cli.commands.knowledge.synthesis.update.presenter import (
8
+ present_synthesis_update_result,
9
+ )
10
+ from cli.infrastructure.command import async_command, authenticated_client
11
+ from cli.infrastructure.file_content import resolve_content_or_raise
12
+ from alloy_runtime_types.dtos.knowledge import UpdateSynthesisRequest
13
+
14
+
15
+ def knowledge_synthesis_update_command(
16
+ synthesis_id: str = typer.Argument(
17
+ ...,
18
+ help="Synthesis UUID",
19
+ ),
20
+ title: Optional[str] = typer.Option(
21
+ None,
22
+ "--title",
23
+ help="New title for the synthesis",
24
+ ),
25
+ content: Optional[str] = typer.Option(
26
+ None,
27
+ "--content",
28
+ help="New synthesis content (or @file)",
29
+ ),
30
+ ) -> None:
31
+ """Update a synthesis document.
32
+
33
+ Update synthesis properties like title or content.
34
+ At least one of --title or --content must be provided.
35
+
36
+ The --content flag accepts a text string or @file reference.
37
+
38
+ Examples:
39
+ ai2 knowledge synthesis update <uuid> --title "New Title"
40
+ ai2 kb synthesis update <uuid> --content @updated.md
41
+ ai2 kb synthesis update <uuid> --title "New Title" --content "Updated content"
42
+ """
43
+ _execute_update(
44
+ synthesis_id=synthesis_id,
45
+ title=title,
46
+ content_raw=content,
47
+ )
48
+
49
+
50
+ @async_command
51
+ async def _execute_update(
52
+ synthesis_id: str,
53
+ title: Optional[str],
54
+ content_raw: Optional[str],
55
+ ) -> None:
56
+ """Execute synthesis update operation."""
57
+
58
+ resolved_content = resolve_content_or_raise(content_raw)
59
+
60
+ if title is None and resolved_content is None:
61
+ raise typer.BadParameter(
62
+ "At least one of --title or --content must be provided"
63
+ )
64
+
65
+ request = UpdateSynthesisRequest(
66
+ title=title,
67
+ synthesis_content=resolved_content,
68
+ )
69
+
70
+ async with authenticated_client() as (_config, client):
71
+ response = await client.update_synthesis(
72
+ synthesis_id=synthesis_id,
73
+ request=request,
74
+ )
75
+
76
+ present_synthesis_update_result(response)
@@ -0,0 +1,41 @@
1
+ """Presenter for knowledge synthesis update command output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import format_datetime, format_uuid
7
+ from cli.infrastructure.output import OutputService
8
+ from alloy_runtime_types.dtos.knowledge import UpdateSynthesisResponse
9
+
10
+
11
+ def present_synthesis_update_result(
12
+ response: UpdateSynthesisResponse,
13
+ ) -> None:
14
+ """Present synthesis update result.
15
+
16
+ Args:
17
+ response: UpdateSynthesisResponse from server
18
+ """
19
+ output = OutputService.get()
20
+
21
+ output.success(f"Synthesis '{response.title}' updated")
22
+
23
+ table = Table(show_header=False, box=None, padding=(0, 1))
24
+ table.add_column("Field", style="dim")
25
+ table.add_column("Value")
26
+
27
+ table.add_row("ID", format_uuid(response.id, short=False))
28
+ table.add_row("Title", response.title)
29
+ table.add_row("Topic", response.topic)
30
+ table.add_row("Status", response.status)
31
+
32
+ stale_display = "[red]Yes[/]" if response.is_stale else "[green]No[/]"
33
+ table.add_row("Stale", stale_display)
34
+ if response.staleness_reason:
35
+ table.add_row("Staleness Reason", response.staleness_reason)
36
+
37
+ table.add_row("Source Chunks", str(response.source_chunk_count))
38
+ table.add_row("Updated At", format_datetime(response.updated_at))
39
+
40
+ panel = Panel(table, title="Synthesis Updated", border_style="green")
41
+ output.console.print(panel)
File without changes
File without changes