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,41 @@
1
+ """Knowledge collections list command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.knowledge.collections.list.presenter import present_collections_list
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+
8
+
9
+ def knowledge_collections_list_command(
10
+ limit: int = typer.Option(
11
+ 50,
12
+ "-l",
13
+ "--limit",
14
+ min=1,
15
+ max=100,
16
+ help="Max results",
17
+ ),
18
+ offset: int = typer.Option(
19
+ 0,
20
+ "--offset",
21
+ min=0,
22
+ help="Skip N results",
23
+ ),
24
+ ) -> None:
25
+ """List knowledge collections.
26
+
27
+ Examples:
28
+ ai2 knowledge collections list
29
+ ai2 kb collections list -l 20
30
+ ai2 kb collections list --offset 10
31
+ """
32
+ _execute_list(limit=limit, offset=offset)
33
+
34
+
35
+ @async_command
36
+ async def _execute_list(limit: int, offset: int) -> None:
37
+ """Execute list collections operation."""
38
+ async with authenticated_client() as (_config, client):
39
+ response = await client.list_collections(limit=limit, offset=offset)
40
+
41
+ present_collections_list(response)
@@ -0,0 +1,68 @@
1
+ """Presenter for knowledge collections list command output."""
2
+
3
+ from alloy_runtime_types.dtos.knowledge import ListCollectionsResponse
4
+
5
+ from cli.infrastructure.output import OutputService
6
+ from cli.infrastructure.renderers.list_renderer import ColumnConfig
7
+
8
+
9
+ def present_collections_list(response: ListCollectionsResponse) -> None:
10
+ """Present list of collections with Rich table formatting.
11
+
12
+ Args:
13
+ response: List collections response from server
14
+ """
15
+ output = OutputService.get()
16
+
17
+ if not response.collections:
18
+ output.info("No collections found")
19
+ return
20
+
21
+ columns = [
22
+ ColumnConfig(
23
+ source_field="id",
24
+ header_label="ID",
25
+ compact_line=1,
26
+ compact_style="cyan",
27
+ ),
28
+ ColumnConfig(
29
+ source_field="section_strategy",
30
+ header_label="Strategy",
31
+ compact_line=1,
32
+ compact_style="green",
33
+ ),
34
+ ColumnConfig(
35
+ source_field="chunk_size_tokens",
36
+ header_label="Chunk Size",
37
+ align="right",
38
+ formatter=lambda x: f"{x} tokens",
39
+ compact_line=1,
40
+ compact_style="blue",
41
+ ),
42
+ ColumnConfig(
43
+ source_field="updated_at",
44
+ header_label="Updated",
45
+ formatter=lambda x: x.strftime("%Y-%m-%d") if x else "-",
46
+ compact_line=1,
47
+ compact_style="dim",
48
+ ),
49
+ ColumnConfig(
50
+ source_field="name",
51
+ header_label="Name",
52
+ compact_line=2,
53
+ compact_style="white bold",
54
+ ),
55
+ ColumnConfig(
56
+ source_field="description",
57
+ header_label="Description",
58
+ formatter=lambda x: x[:80] + "..." if x and len(x) > 80 else (x or "-"),
59
+ compact_line=2,
60
+ compact_style="dim",
61
+ ),
62
+ ]
63
+
64
+ output.table(
65
+ items=response.collections, # type: ignore[arg-type]
66
+ title=f"Collections ({response.total})",
67
+ columns=columns,
68
+ )
File without changes
@@ -0,0 +1,97 @@
1
+ """Knowledge collection update command implementation."""
2
+
3
+ from typing import Optional
4
+
5
+ import typer
6
+
7
+ from cli.commands.flag_utils import require_update_flags, validate_uuid
8
+ from cli.commands.knowledge.collections.update.presenter import (
9
+ present_collection_update_success,
10
+ )
11
+ from cli.infrastructure.command import async_command, authenticated_client
12
+ from alloy_runtime_types.dtos.knowledge import UpdateCollectionRequest
13
+
14
+
15
+ def knowledge_collections_update_command(
16
+ collection_id: str = typer.Argument(
17
+ ...,
18
+ help="Collection UUID or name to update",
19
+ ),
20
+ name: Optional[str] = typer.Option(
21
+ None,
22
+ "-n",
23
+ "--name",
24
+ help="New collection name",
25
+ ),
26
+ description: Optional[str] = typer.Option(
27
+ None,
28
+ "-d",
29
+ "--description",
30
+ help="New collection description",
31
+ ),
32
+ rerank_instruction: Optional[str] = typer.Option(
33
+ None,
34
+ "-r",
35
+ "--rerank-instruction",
36
+ help="New default instruction for Voyage AI reranking (max 500 chars)",
37
+ ),
38
+ ) -> None:
39
+ """Update a knowledge collection.
40
+
41
+ At least one update flag (--name, --description, or --rerank-instruction) is required.
42
+
43
+ Examples:
44
+ ai2 knowledge collections update <uuid> -n "New Name"
45
+ ai2 knowledge collections update <uuid> -d "Updated description"
46
+ ai2 kb collections update <uuid> -r "Prioritize recent documents"
47
+ ai2 kb collections update <uuid> -n "Docs" -d "Documentation" -r "Focus on API details"
48
+ """
49
+ require_update_flags(
50
+ ("--name", name),
51
+ ("--description", description),
52
+ ("--rerank-instruction", rerank_instruction),
53
+ )
54
+
55
+ _execute_update_from_flags(
56
+ collection_id=collection_id,
57
+ name=name,
58
+ description=description,
59
+ rerank_instruction=rerank_instruction,
60
+ )
61
+
62
+
63
+ def _execute_update_from_flags(
64
+ collection_id: str,
65
+ name: Optional[str],
66
+ description: Optional[str],
67
+ rerank_instruction: Optional[str],
68
+ ) -> None:
69
+ """Build and execute collection update from command flags."""
70
+ # Validate collection ID if it looks like a UUID
71
+ # (Server accepts both UUID and name, so we only validate UUID format)
72
+ try:
73
+ validate_uuid(collection_id, "collection")
74
+ except typer.BadParameter:
75
+ # Not a UUID - treat as name, let server handle validation
76
+ pass
77
+
78
+ # Build request with only provided fields
79
+ request = UpdateCollectionRequest(
80
+ name=name,
81
+ description=description,
82
+ rerank_instruction=rerank_instruction,
83
+ )
84
+
85
+ _execute_update(collection_id, request)
86
+
87
+
88
+ @async_command
89
+ async def _execute_update(
90
+ collection_id: str,
91
+ request: UpdateCollectionRequest,
92
+ ) -> None:
93
+ """Execute the collection update with the given request."""
94
+ async with authenticated_client() as (_config, client):
95
+ response = await client.update_collection(collection_id, request)
96
+
97
+ present_collection_update_success(response)
@@ -0,0 +1,42 @@
1
+ """Presenter for collection update output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.formatting.fields import (
7
+ format_datetime,
8
+ format_optional,
9
+ format_uuid,
10
+ )
11
+ from cli.infrastructure.output import OutputService
12
+ from alloy_runtime_types.dtos.knowledge import UpdateCollectionResponse
13
+
14
+
15
+ def present_collection_update_success(response: UpdateCollectionResponse) -> None:
16
+ """Present successful collection update.
17
+
18
+ Args:
19
+ response: Collection update response from server
20
+ """
21
+ output = OutputService.get()
22
+
23
+ output.success("Collection updated successfully")
24
+
25
+ # Build a simple table for entity display
26
+ table = Table(show_header=False, box=None, padding=(0, 1))
27
+ table.add_column("Field", style="dim")
28
+ table.add_column("Value")
29
+
30
+ table.add_row("ID", format_uuid(response.id, short=False))
31
+ table.add_row("Name", response.name)
32
+ table.add_row("Description", format_optional(response.description))
33
+ table.add_row("Embedding Model", response.embedding_model)
34
+ table.add_row("Chunk Size", f"{response.chunk_size_tokens} tokens")
35
+ table.add_row("Chunk Overlap", f"{response.chunk_overlap_tokens} tokens")
36
+ table.add_row("Section Strategy", response.section_strategy)
37
+ table.add_row("Rerank Instruction", format_optional(response.rerank_instruction))
38
+ table.add_row("Created", format_datetime(response.created_at))
39
+ table.add_row("Updated", format_datetime(response.updated_at))
40
+
41
+ panel = Panel(table, title=f"Collection: {response.name}", border_style="green")
42
+ output.console.print(panel)
File without changes
@@ -0,0 +1,119 @@
1
+ """Knowledge documents bulk metadata update command implementation."""
2
+
3
+ import json
4
+ from typing import Any, Optional, cast
5
+ from uuid import UUID
6
+
7
+ import typer
8
+
9
+ from cli.commands.knowledge.documents.bulk_metadata.presenter import (
10
+ present_bulk_metadata_result,
11
+ )
12
+ from cli.commands.flag_utils import validate_uuid
13
+ from cli.infrastructure.command import async_command, authenticated_client
14
+ from cli.infrastructure.file_content import resolve_content_or_raise
15
+ from alloy_runtime_types.dtos.knowledge import BulkUpdateDocumentMetadataRequest
16
+
17
+
18
+ def knowledge_documents_bulk_metadata_command(
19
+ filter_: str = typer.Option(
20
+ ...,
21
+ "--filter",
22
+ help="JSONB containment filter to match documents (JSON or @file.json)",
23
+ ),
24
+ metadata: str = typer.Option(
25
+ ...,
26
+ "--metadata",
27
+ help="Metadata fields to apply (JSON or @file.json)",
28
+ ),
29
+ metadata_mode: str = typer.Option(
30
+ "merge",
31
+ "--metadata-mode",
32
+ help="Metadata update mode: 'merge' (default) or 'replace'",
33
+ ),
34
+ collection: Optional[str] = typer.Option(
35
+ None,
36
+ "-C",
37
+ "--collection",
38
+ help="Optional collection UUID to scope the update",
39
+ ),
40
+ dry_run: bool = typer.Option(
41
+ False,
42
+ "--dry-run",
43
+ help="Preview matched count without updating",
44
+ ),
45
+ ) -> None:
46
+ """Bulk-update metadata across documents matching a filter.
47
+
48
+ Both --filter and --metadata accept a JSON string or @file reference.
49
+ Use --dry-run to preview how many documents match without modifying them.
50
+
51
+ Examples:
52
+ ai2 knowledge documents bulk-metadata \\
53
+ --filter '{"source": "slack"}' \\
54
+ --metadata '{"reviewed": true}'
55
+
56
+ ai2 kb documents bulk-metadata \\
57
+ --filter @filter.json --metadata @patch.json --dry-run
58
+
59
+ ai2 kb documents bulk-metadata \\
60
+ --filter '{"team": "eng"}' --metadata '{"archived": true}' \\
61
+ -C <collection-uuid>
62
+ """
63
+ _execute_bulk_metadata(
64
+ filter_raw=filter_,
65
+ metadata_raw=metadata,
66
+ metadata_mode=metadata_mode,
67
+ collection=collection,
68
+ dry_run=dry_run,
69
+ )
70
+
71
+
72
+ def _parse_json_option(value: str, option_name: str) -> dict[str, Any]:
73
+ resolved = resolve_content_or_raise(value)
74
+ if resolved is None:
75
+ raise typer.BadParameter(f"{option_name} is required")
76
+
77
+ try:
78
+ result = json.loads(resolved)
79
+ except json.JSONDecodeError as e:
80
+ raise typer.BadParameter(f"Invalid JSON for {option_name}: {e}")
81
+ if not isinstance(result, dict):
82
+ raise typer.BadParameter(f"{option_name} must be a JSON object")
83
+ return cast(dict[str, Any], result)
84
+
85
+
86
+ @async_command
87
+ async def _execute_bulk_metadata(
88
+ filter_raw: str,
89
+ metadata_raw: str,
90
+ metadata_mode: str,
91
+ collection: Optional[str],
92
+ dry_run: bool,
93
+ ) -> None:
94
+ """Execute bulk document metadata update operation."""
95
+
96
+ if metadata_mode not in ("merge", "replace"):
97
+ raise typer.BadParameter(
98
+ f"Invalid metadata mode '{metadata_mode}'. Must be 'merge' or 'replace'."
99
+ )
100
+
101
+ filter_dict = _parse_json_option(filter_raw, "--filter")
102
+ metadata_dict = _parse_json_option(metadata_raw, "--metadata")
103
+
104
+ collection_id: UUID | None = None
105
+ if collection is not None:
106
+ collection_id = validate_uuid(collection, "collection")
107
+
108
+ request = BulkUpdateDocumentMetadataRequest(
109
+ filter=filter_dict,
110
+ patch=metadata_dict,
111
+ metadata_mode=metadata_mode, # type: ignore[arg-type]
112
+ collection_id=collection_id,
113
+ dry_run=dry_run,
114
+ )
115
+
116
+ async with authenticated_client() as (_config, client):
117
+ response = await client.bulk_update_document_metadata(request)
118
+
119
+ present_bulk_metadata_result(response)
@@ -0,0 +1,36 @@
1
+ """Presenter for knowledge documents bulk metadata update command output."""
2
+
3
+ from rich.panel import Panel
4
+ from rich.table import Table
5
+
6
+ from cli.infrastructure.output import OutputService
7
+ from alloy_runtime_types.dtos.knowledge import BulkUpdateDocumentMetadataResponse
8
+
9
+
10
+ def present_bulk_metadata_result(
11
+ response: BulkUpdateDocumentMetadataResponse,
12
+ ) -> None:
13
+ """Present bulk metadata update result.
14
+
15
+ Args:
16
+ response: BulkUpdateDocumentMetadataResponse from server
17
+ """
18
+ output = OutputService.get()
19
+
20
+ if response.dry_run:
21
+ output.info("Dry run — no documents modified")
22
+ else:
23
+ output.success(f"Updated metadata on {response.updated_count} document(s)")
24
+
25
+ table = Table(show_header=False, box=None, padding=(0, 1))
26
+ table.add_column("Field", style="dim")
27
+ table.add_column("Value")
28
+
29
+ table.add_row("Matched", str(response.matched_count))
30
+ table.add_row("Updated", str(response.updated_count))
31
+ table.add_row("Dry Run", str(response.dry_run))
32
+
33
+ border_style = "blue" if response.dry_run else "green"
34
+ title = "Bulk Metadata Dry Run" if response.dry_run else "Bulk Metadata Update"
35
+ panel = Panel(table, title=title, border_style=border_style)
36
+ output.console.print(panel)
File without changes
@@ -0,0 +1,47 @@
1
+ """Knowledge documents delete command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.knowledge.documents.delete.presenter import present_delete_result
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+ from cli.infrastructure.console import Confirm
8
+
9
+
10
+ def knowledge_documents_delete_command(
11
+ document: str = typer.Argument(
12
+ ...,
13
+ help="Document UUID",
14
+ ),
15
+ yes: bool = typer.Option(
16
+ False,
17
+ "-y",
18
+ "--yes",
19
+ help="Skip confirmation",
20
+ ),
21
+ ) -> None:
22
+ """Delete a document and all its chunks.
23
+
24
+ Permanently removes the document and all associated chunks and questions.
25
+
26
+ Examples:
27
+ ai2 knowledge documents delete 550e8400-e29b-41d4-a716-446655440000
28
+ ai2 kb documents delete 550e8400-e29b-41d4-a716-446655440000 -y
29
+ """
30
+ _execute_delete(document_id=document, skip_confirm=yes)
31
+
32
+
33
+ @async_command
34
+ async def _execute_delete(document_id: str, skip_confirm: bool) -> None:
35
+ """Execute delete document operation."""
36
+ if not skip_confirm:
37
+ confirmed = Confirm.ask(
38
+ f"[yellow]Delete document '{document_id}'?[/yellow] "
39
+ "This will delete all chunks and cannot be undone"
40
+ )
41
+ if not confirmed:
42
+ raise typer.Abort()
43
+
44
+ async with authenticated_client() as (_config, client):
45
+ response = await client.delete_document(document_id)
46
+
47
+ present_delete_result(response)
@@ -0,0 +1,20 @@
1
+ """Presenter for knowledge document delete command output."""
2
+
3
+ from cli.infrastructure.output import OutputService
4
+ from alloy_runtime_types.dtos.knowledge import DeleteDocumentResponse
5
+
6
+
7
+ def present_delete_result(response: DeleteDocumentResponse) -> None:
8
+ """Present document deletion result.
9
+
10
+ Args:
11
+ response: DeleteDocumentResponse from server
12
+ """
13
+ output = OutputService.get()
14
+
15
+ chunks_msg = (
16
+ f" ({response.chunks_deleted} chunks deleted)"
17
+ if response.chunks_deleted > 0
18
+ else ""
19
+ )
20
+ output.success(f"Document '{response.title}' deleted successfully{chunks_msg}")
File without changes
@@ -0,0 +1,39 @@
1
+ """Knowledge documents get command implementation."""
2
+
3
+ import typer
4
+
5
+ from cli.commands.knowledge.documents.get.presenter import present_document_details
6
+ from cli.infrastructure.command import async_command, authenticated_client
7
+
8
+
9
+ def knowledge_documents_get_command(
10
+ document: str = typer.Argument(
11
+ ...,
12
+ help="Document UUID",
13
+ ),
14
+ include_content: bool = typer.Option(
15
+ False,
16
+ "-c",
17
+ "--include-content",
18
+ help="Include original document content",
19
+ ),
20
+ ) -> None:
21
+ """Get document details.
22
+
23
+ Examples:
24
+ ai2 knowledge documents get 550e8400-e29b-41d4-a716-446655440000
25
+ ai2 kb documents get 550e8400-e29b-41d4-a716-446655440000 -c
26
+ """
27
+ _execute_get(document_id=document, include_content=include_content)
28
+
29
+
30
+ @async_command
31
+ async def _execute_get(document_id: str, include_content: bool) -> None:
32
+ """Execute get document operation."""
33
+ async with authenticated_client() as (_config, client):
34
+ response = await client.get_document(
35
+ document_id=document_id,
36
+ include_content=include_content,
37
+ )
38
+
39
+ present_document_details(response, show_content=include_content)
@@ -0,0 +1,78 @@
1
+ """Presenter for knowledge document get command output."""
2
+
3
+ import json
4
+
5
+ from rich.panel import Panel
6
+ from rich.table import Table
7
+
8
+ from cli.infrastructure.formatting.fields import (
9
+ format_datetime,
10
+ format_uuid,
11
+ )
12
+ from cli.infrastructure.output import OutputService
13
+ from alloy_runtime_types.dtos.knowledge import GetDocumentResponse
14
+
15
+
16
+ def _format_status(status: str) -> str:
17
+ """Format processing status with color."""
18
+ status_colors = {
19
+ "completed": "[green]completed[/]",
20
+ "processing": "[yellow]processing[/]",
21
+ "pending": "[blue]pending[/]",
22
+ "failed": "[red]failed[/]",
23
+ }
24
+ return status_colors.get(status, status)
25
+
26
+
27
+ def present_document_details(
28
+ response: GetDocumentResponse, show_content: bool = False
29
+ ) -> None:
30
+ """Present document details with Rich formatting.
31
+
32
+ Args:
33
+ response: GetDocumentResponse from server
34
+ show_content: Whether to show original content panel
35
+ """
36
+ output = OutputService.get()
37
+
38
+ table = Table(show_header=False, box=None, padding=(0, 1))
39
+ table.add_column("Field", style="dim")
40
+ table.add_column("Value")
41
+
42
+ table.add_row("ID", format_uuid(response.id, short=False))
43
+ table.add_row("Collection ID", format_uuid(response.collection_id, short=False))
44
+ table.add_row("Title", response.title)
45
+ table.add_row("Source Type", response.source_type)
46
+ table.add_row("Character Count", f"{response.character_count:,}")
47
+ table.add_row(
48
+ "Estimated Tokens",
49
+ f"{response.estimated_tokens:,}" if response.estimated_tokens else "-",
50
+ )
51
+ table.add_row("Processing Status", _format_status(response.processing_status))
52
+ if response.processing_error:
53
+ table.add_row("Processing Error", f"[red]{response.processing_error}[/]")
54
+ table.add_row("Chunks Count", str(response.chunks_count))
55
+ table.add_row("Chunks Failed", str(response.chunks_failed))
56
+ table.add_row("Questions Generated", str(response.questions_generated))
57
+ if response.metadata:
58
+ table.add_row("Metadata", json.dumps(response.metadata, indent=2))
59
+ table.add_row("Created At", format_datetime(response.created_at))
60
+ table.add_row("Updated At", format_datetime(response.updated_at))
61
+
62
+ panel = Panel(
63
+ table,
64
+ title=f"Document: {response.title}",
65
+ border_style="green",
66
+ )
67
+ output.console.print(panel)
68
+
69
+ if show_content and response.original_content:
70
+ content_panel = Panel(
71
+ response.original_content[:2000]
72
+ + ("..." if len(response.original_content) > 2000 else ""),
73
+ title="Original Content",
74
+ border_style="blue",
75
+ )
76
+ output.console.print(content_panel)
77
+ elif show_content and not response.original_content:
78
+ output.info("No original content available")
File without changes