@pheem49/mint 1.17.0 → 1.18.0

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 (421) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +2 -2
  3. package/README.md +8 -2
  4. package/Release_Note.md +222 -71
  5. package/crates/mint-cli/src/agent/diff_render.rs +66 -44
  6. package/crates/mint-cli/src/agent/live_status.rs +21 -4
  7. package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
  8. package/crates/mint-cli/src/agent.rs +25 -10
  9. package/crates/mint-cli/src/commands/agent.rs +4 -92
  10. package/crates/mint-cli/src/commands/browser.rs +2 -15
  11. package/crates/mint-cli/src/commands/integrations.rs +3 -3
  12. package/crates/mint-cli/src/commands/mod.rs +0 -3
  13. package/crates/mint-cli/src/commands/tailnet_web.rs +1 -0
  14. package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
  15. package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
  16. package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
  17. package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
  18. package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
  19. package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
  20. package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
  21. package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
  22. package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
  23. package/crates/mint-cli/src/interactive/command_ui.rs +53 -5
  24. package/crates/mint-cli/src/interactive/composer.rs +186 -0
  25. package/crates/mint-cli/src/interactive/format.rs +78 -3
  26. package/crates/mint-cli/src/interactive/input_box.rs +61 -1
  27. package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
  28. package/crates/mint-cli/src/interactive/slash_commands.rs +648 -371
  29. package/crates/mint-cli/src/interactive/tool_activity.rs +93 -20
  30. package/crates/mint-cli/src/interactive.rs +37 -0
  31. package/crates/mint-cli/src/main.rs +6 -3
  32. package/crates/mint-cli/src/markdown.rs +2 -37
  33. package/crates/mint-cli/src/onboard.rs +700 -282
  34. package/crates/mint-cli/src/setup.rs +1342 -624
  35. package/crates/mint-cli/src/terminal_theme.rs +159 -35
  36. package/crates/mint-cli/tests/library_intake.rs +1 -0
  37. package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
  38. package/crates/mint-core/src/agent/chat/custom.rs +149 -0
  39. package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
  40. package/crates/mint-core/src/agent/chat/mod.rs +857 -0
  41. package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
  42. package/crates/mint-core/src/agent/chat/openai.rs +582 -0
  43. package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
  44. package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
  45. package/crates/mint-core/src/agent/memory.rs +56 -2
  46. package/crates/mint-core/src/agent/tasks.rs +2 -2
  47. package/crates/mint-core/src/api_server/routes/chat.rs +24 -2
  48. package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
  49. package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
  50. package/crates/mint-core/src/api_server/routes/sessions.rs +21 -0
  51. package/crates/mint-core/src/avatar_bridge.rs +0 -22
  52. package/crates/mint-core/src/browser/cdp.rs +10 -4
  53. package/crates/mint-core/src/browser/headless.rs +582 -0
  54. package/crates/mint-core/src/browser/input.rs +7 -62
  55. package/crates/mint-core/src/browser/interact.rs +0 -14
  56. package/crates/mint-core/src/browser/mod.rs +8 -29
  57. package/crates/mint-core/src/browser/navigate.rs +2 -36
  58. package/crates/mint-core/src/browser/runtime.rs +2 -4
  59. package/crates/mint-core/src/browser/session.rs +50 -466
  60. package/crates/mint-core/src/browser/workflow.rs +142 -32
  61. package/crates/mint-core/src/cron/store.rs +2 -2
  62. package/crates/mint-core/src/integrations/mcp.rs +6 -8
  63. package/crates/mint-core/src/lib.rs +0 -5
  64. package/crates/mint-core/src/media/gemini_live.rs +636 -86
  65. package/crates/mint-core/src/media/library/migration.rs +26 -0
  66. package/crates/mint-core/src/media/library/tests.rs +1 -1
  67. package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
  68. package/crates/mint-core/src/media/pictures.rs +1 -1
  69. package/crates/mint-core/src/media/tool_images.rs +92 -1
  70. package/crates/mint-core/src/mods/manager.rs +101 -35
  71. package/crates/mint-core/src/orchestration/context_render.rs +441 -24
  72. package/crates/mint-core/src/orchestration/decision_parsing.rs +531 -16
  73. package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
  74. package/crates/mint-core/src/orchestration/loop_guard.rs +145 -0
  75. package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
  76. package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
  77. package/crates/mint-core/src/orchestration/mod.rs +320 -4249
  78. package/crates/mint-core/src/orchestration/reliability.rs +67 -27
  79. package/crates/mint-core/src/orchestration/review_regressions.rs +5 -0
  80. package/crates/mint-core/src/orchestration/tests.rs +1665 -0
  81. package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
  82. package/crates/mint-core/src/orchestration/tools/files.rs +1 -0
  83. package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
  84. package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
  85. package/crates/mint-core/src/orchestration/tools/shell.rs +129 -58
  86. package/crates/mint-core/src/orchestration/truncation.rs +170 -13
  87. package/crates/mint-core/src/orchestration/types.rs +648 -0
  88. package/crates/mint-core/src/orchestration/verification.rs +0 -3
  89. package/crates/mint-core/src/orchestration/workspace_helpers.rs +24 -6
  90. package/crates/mint-core/src/prompts/agent.rs +52 -76
  91. package/crates/mint-core/src/prompts/tool_catalog.rs +8 -151
  92. package/crates/mint-core/src/search/files.rs +20 -0
  93. package/crates/mint-core/src/slash/mod.rs +228 -265
  94. package/crates/mint-core/src/slash/models.rs +6 -1
  95. package/crates/mint-core/src/system/bg_shell.rs +1 -0
  96. package/crates/mint-core/src/system/config.rs +176 -34
  97. package/crates/mint-mod-runtime/src/lib.rs +37 -23
  98. package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
  99. package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
  100. package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
  101. package/out/web/assets/{CliSessionsView-MI8kXMAb.js → CliSessionsView-z5i6qGyb.js} +1 -1
  102. package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
  103. package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
  104. package/out/web/assets/{CommandPalette-BD8SlTE5.js → CommandPalette-DaKlzbKs.js} +1 -1
  105. package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
  106. package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
  107. package/out/web/assets/{ImageStudioPanel-BP7N4rLr.js → ImageStudioPanel-B5N7TjeB.js} +1 -1
  108. package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
  109. package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
  110. package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
  111. package/out/web/assets/{McpRegistryPicker-CoS83vtc.js → McpRegistryPicker-DnXPlzI7.js} +1 -1
  112. package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
  113. package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
  114. package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
  115. package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
  116. package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
  117. package/out/web/assets/{PluginsView-jBYmcKh4.js → PluginsView-DoTg9MVa.js} +1 -1
  118. package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
  119. package/out/web/assets/{ScheduledTasksView-5uw9-V9H.js → ScheduledTasksView-BD5DVPkZ.js} +1 -1
  120. package/out/web/assets/{SelectField-DXBQtrUK.js → SelectField-Cy6CghrU.js} +1 -1
  121. package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
  122. package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
  123. package/out/web/assets/{SkillsView-C-gp9J7m.js → SkillsView-CIeWwq5z.js} +1 -1
  124. package/out/web/assets/StockCard-DxUciKyp.js +1 -0
  125. package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
  126. package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
  127. package/out/web/assets/{UiFeatureCard-6BwxTOCe.js → UiFeatureCard-CdY0hGWy.js} +1 -1
  128. package/out/web/assets/{UiGridCard-DvZcLNxb.js → UiGridCard-BBK3I5hC.js} +1 -1
  129. package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
  130. package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
  131. package/out/web/assets/{VeoStudioPanel-DfsOJKv0.js → VeoStudioPanel-Co6-wEWM.js} +2 -2
  132. package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
  133. package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
  134. package/out/web/assets/{abnfDiagram-VCTEODGH-BOo3Ckng.js → abnfDiagram-VCTEODGH-CMfR95N2.js} +1 -1
  135. package/out/web/assets/{architecture-7GRP2DOG-ZOwheW3n.js → architecture-7GRP2DOG-DhAM4HyO.js} +1 -1
  136. package/out/web/assets/{architectureDiagram-5GKGNRK7-DC2FDzVd.js → architectureDiagram-5GKGNRK7-Yk3TUJ_F.js} +1 -1
  137. package/out/web/assets/{blockDiagram-I7D4REHJ-BrKFWdAH.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +1 -1
  138. package/out/web/assets/{c4Diagram-7LVT6UL2-BHTHK1Yd.js → c4Diagram-7LVT6UL2-Bk9x7N-8.js} +1 -1
  139. package/out/web/assets/{chunk-4HAMMTFA-BYFkZwNj.js → chunk-4HAMMTFA-Dx5fk1_0.js} +1 -1
  140. package/out/web/assets/{chunk-75Z2AOVW-BSKfSKSA.js → chunk-75Z2AOVW-BszTQoM4.js} +1 -1
  141. package/out/web/assets/{chunk-DU6HZSFF-vIhsiW6n.js → chunk-DU6HZSFF-DK-As3rk.js} +1 -1
  142. package/out/web/assets/{chunk-F27PBJKO-BlYpW9xq.js → chunk-F27PBJKO-LmncZZIS.js} +1 -1
  143. package/out/web/assets/{chunk-GMAD6QVW-BIBz_Ug5.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +1 -1
  144. package/out/web/assets/{chunk-GVQU2GXP-NPSHxeqC.js → chunk-GVQU2GXP-Cno3ulje.js} +1 -1
  145. package/out/web/assets/{chunk-IMKFNOWR-YlJK8_Fp.js → chunk-IMKFNOWR-bIzfY9Jc.js} +1 -1
  146. package/out/web/assets/{chunk-L3NEJ4N5-DMYi4-af.js → chunk-L3NEJ4N5-Dl6eOa0D.js} +1 -1
  147. package/out/web/assets/{chunk-OSK3NFVY-Begd3-jA.js → chunk-OSK3NFVY-BaUGJ-cM.js} +1 -1
  148. package/out/web/assets/{chunk-P2QGCYS3-D1I4xFHN.js → chunk-P2QGCYS3-_066ndhH.js} +1 -1
  149. package/out/web/assets/{chunk-POPQ4Y6H-CafZZzNE.js → chunk-POPQ4Y6H-YT1AKhTv.js} +1 -1
  150. package/out/web/assets/{chunk-PWAF6VOD-Dwh6_Lnt.js → chunk-PWAF6VOD-CrEgDsxh.js} +1 -1
  151. package/out/web/assets/{chunk-SHT3W25Y-B0XrCSEb.js → chunk-SHT3W25Y-_KwaRLOl.js} +1 -1
  152. package/out/web/assets/{chunk-SVP7TREG-CxLsddxC.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
  153. package/out/web/assets/{chunk-TICWLB2K-y156QInb.js → chunk-TICWLB2K-BDyehCtg.js} +1 -1
  154. package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
  155. package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
  156. package/out/web/assets/{config-DqXJXeZM.css → config-2suVFPZg.css} +1 -1
  157. package/out/web/assets/config-CkRCdkxn.js +2 -0
  158. package/out/web/assets/{cynefin-OW5HDTMX-SMVvrLf-.js → cynefin-OW5HDTMX-Dl_31aaN.js} +1 -1
  159. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-rZznN24T.js → cynefinDiagram-5FMLGOSQ-Bpir8jha.js} +1 -1
  160. package/out/web/assets/{dagre-GXQ25YYZ-BOToydFu.js → dagre-GXQ25YYZ-D9xu3nsq.js} +1 -1
  161. package/out/web/assets/{diagram-S7CK7UJ4-TMVaGQEJ.js → diagram-S7CK7UJ4-DeveoEeB.js} +1 -1
  162. package/out/web/assets/{diagram-UQ7AKVKN-C2JK-GP2.js → diagram-UQ7AKVKN-p4xWRESV.js} +1 -1
  163. package/out/web/assets/{diagram-VSXAHHWV-Cw8VSi2K.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
  164. package/out/web/assets/{diagram-VX7I27RA-DXp4fKk9.js → diagram-VX7I27RA-DRiCa3Vd.js} +1 -1
  165. package/out/web/assets/{diagram-Z3DM3KII-CzSicYiW.js → diagram-Z3DM3KII-Bt7zduQX.js} +1 -1
  166. package/out/web/assets/{ebnfDiagram-PWID7BFC-Dqj-zqPu.js → ebnfDiagram-PWID7BFC-DV9WpwdR.js} +1 -1
  167. package/out/web/assets/{erDiagram-RLTQ6QDP-DZwFZAuD.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +1 -1
  168. package/out/web/assets/{eventmodeling-NTZA5JFV-C0O-Lvgp.js → eventmodeling-NTZA5JFV-BTBMrfVa.js} +1 -1
  169. package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
  170. package/out/web/assets/{ganttDiagram-EL5Y4UJY-Da4ULXTl.js → ganttDiagram-EL5Y4UJY-DQLdsXrC.js} +1 -1
  171. package/out/web/assets/{gitGraph-4MIJSDKK-B9wNFZIP.js → gitGraph-4MIJSDKK-CL1OEOQ_.js} +1 -1
  172. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-RjrhB0MP.js → gitGraphDiagram-WWUBYQGX-8cSi42H7.js} +1 -1
  173. package/out/web/assets/index-BocxnrDG.js +168 -0
  174. package/out/web/assets/index-yeh_r55a.css +1 -0
  175. package/out/web/assets/{info-A6RAGUB7-B3dfCpeY.js → info-A6RAGUB7-C1zsX5sc.js} +1 -1
  176. package/out/web/assets/{infoDiagram-27XIBGKW-QVWkLVx7.js → infoDiagram-27XIBGKW-DsRYtIyI.js} +1 -1
  177. package/out/web/assets/{ishikawaDiagram-5VMMS53U-CLFNIRI9.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +1 -1
  178. package/out/web/assets/{journeyDiagram-3NMN7TZE-fgOQadYF.js → journeyDiagram-3NMN7TZE-BTH-GyVR.js} +1 -1
  179. package/out/web/assets/{kanban-definition-UXKFOSKX-G3Q_9g9O.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +1 -1
  180. package/out/web/assets/{mermaid-parser.core-v3Jm7nco.js → mermaid-parser.core-BJwgCBBc.js} +3 -3
  181. package/out/web/assets/{mermaid.core-DTEjLUA1.js → mermaid.core-CsDDodN8.js} +4 -4
  182. package/out/web/assets/{mindmap-definition-YA3MSWOX-C_D42_fF.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +1 -1
  183. package/out/web/assets/{modelManager-BPLycQrN.js → modelManager-B3ZFMh8v.js} +2 -2
  184. package/out/web/assets/{oauthManager-BUK7ic7q.js → oauthManager-Ch5Du2fF.js} +1 -1
  185. package/out/web/assets/{packet-AYTQ26CC-B-R-SHlF.js → packet-AYTQ26CC-B6xUyE6r.js} +1 -1
  186. package/out/web/assets/{pegDiagram-XKGWAZYB-Da2q_giz.js → pegDiagram-XKGWAZYB-1LabVycL.js} +1 -1
  187. package/out/web/assets/{pie-WAS4IAKB-BC8F0N7-.js → pie-WAS4IAKB-DJwo-nf_.js} +1 -1
  188. package/out/web/assets/{pieDiagram-E7YTZNPT-Iy9REJNC.js → pieDiagram-E7YTZNPT-icmAqzy4.js} +1 -1
  189. package/out/web/assets/{quadrantDiagram-AXDQQJYC-ztsiYw7h.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +1 -1
  190. package/out/web/assets/{radar-RG4KPBEZ-B_1P8Z_z.js → radar-RG4KPBEZ-D7d-Xriw.js} +1 -1
  191. package/out/web/assets/{railroad-74A4TZTK-DuTqczSo.js → railroad-74A4TZTK-viuhdYbs.js} +1 -1
  192. package/out/web/assets/{railroad-abnf-HS5TGJTU-Df29WLmp.js → railroad-abnf-HS5TGJTU-DNXiCNea.js} +1 -1
  193. package/out/web/assets/{railroad-ebnf-LZEXJU2U-ePFMo-qp.js → railroad-ebnf-LZEXJU2U-nkSu1-0C.js} +1 -1
  194. package/out/web/assets/{railroad-peg-WCYAUIDC-DYXLW4_E.js → railroad-peg-WCYAUIDC-BhbMeQzz.js} +1 -1
  195. package/out/web/assets/{railroadDiagram-O6MQD6OU-LStnZf2S.js → railroadDiagram-O6MQD6OU-CLpG1jUX.js} +1 -1
  196. package/out/web/assets/{requirementDiagram-BXWQKSXE-DmzonMH-.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +1 -1
  197. package/out/web/assets/{sankeyDiagram-P5KCCOFB-B8vjmUU1.js → sankeyDiagram-P5KCCOFB-DxAwmq4x.js} +1 -1
  198. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-CTnplOAX.js → sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js} +1 -1
  199. package/out/web/assets/{stateDiagram-D77RDMKH-BFrIaLdI.js → stateDiagram-D77RDMKH-D5QWfOhp.js} +1 -1
  200. package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
  201. package/out/web/assets/{swimlanes-42K2YHIH-BXGngUNU.js → swimlanes-42K2YHIH-CRs5UyA-.js} +1 -1
  202. package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
  203. package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
  204. package/out/web/assets/{timeline-definition-24CTP7MA-CegH7n43.js → timeline-definition-24CTP7MA-Denqd9qb.js} +1 -1
  205. package/out/web/assets/{treeView-Q6P3EWNA-DTpJv2Tw.js → treeView-Q6P3EWNA-0my3Z3s4.js} +1 -1
  206. package/out/web/assets/{treemap-WGGIJYW6-i8M9iJU6.js → treemap-WGGIJYW6-B_EjkLYq.js} +1 -1
  207. package/out/web/assets/{vennDiagram-4TSXK5OY-Dpzo1S8U.js → vennDiagram-4TSXK5OY-DxVg3Ewr.js} +1 -1
  208. package/out/web/assets/{wardley-WFR3VGLG-BrNsgtfw.js → wardley-WFR3VGLG-CGD-Tj4p.js} +1 -1
  209. package/out/web/assets/{wardleyDiagram-VM6X3IG4-lQ92LFE1.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +1 -1
  210. package/out/web/assets/{xychartDiagram-S5SC5T6Z-BaOaEoBd.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +1 -1
  211. package/out/web/index-web.html +2 -2
  212. package/out/web/index.html +2 -2
  213. package/package.json +2 -2
  214. package/shared-modules/CODEOWNERS +3 -3
  215. package/shared-modules/SDL2/SDL2_mixer.json +27 -0
  216. package/shared-modules/appstream/README.md +13 -0
  217. package/shared-modules/appstream/appstream-compose.json +111 -0
  218. package/shared-modules/dbus-glib/dbus-glib.json +2 -2
  219. package/shared-modules/libportal/libportal.json +23 -0
  220. package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
  221. package/shared-modules/linux-audio/fluidsynth2.json +2 -2
  222. package/shared-modules/linux-audio/libinstpatch.json +2 -2
  223. package/shared-modules/linux-audio/liblo-static.json +3 -0
  224. package/shared-modules/luajit/luajit.json +2 -2
  225. package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
  226. package/slash-commands.json +7 -2
  227. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  228. package/src/renderer/shared/agentProgress.ts +51 -3
  229. package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -56
  230. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +15 -1
  231. package/src/renderer/shared/components/Settings/GeneralTab.tsx +25 -12
  232. package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
  233. package/src/renderer/shared/components/Settings/ThemeTab.tsx +106 -3
  234. package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +67 -17
  235. package/src/renderer/shared/components/activity/AgentActivityTable.tsx +376 -134
  236. package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
  237. package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
  238. package/src/renderer/shared/components/activity/McpToolResults.tsx +39 -2
  239. package/src/renderer/shared/components/activity/SubagentDagView.tsx +7 -7
  240. package/src/renderer/shared/components/activity/ViewedImages.tsx +41 -2
  241. package/src/renderer/shared/components/app/ChunkErrorBoundary.tsx +3 -3
  242. package/src/renderer/shared/components/app/CommandPalette.tsx +7 -7
  243. package/src/renderer/shared/components/app/DesktopTitlebar.tsx +2 -2
  244. package/src/renderer/shared/components/app/MintDashboard.tsx +27 -17
  245. package/src/renderer/shared/components/app/ModalErrorBoundary.tsx +3 -3
  246. package/src/renderer/shared/components/cards/CalculationCard.tsx +3 -3
  247. package/src/renderer/shared/components/cards/ImageGenCard.tsx +2 -2
  248. package/src/renderer/shared/components/cards/ImageSearchCard.tsx +2 -2
  249. package/src/renderer/shared/components/cards/MermaidCard.tsx +1 -1
  250. package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
  251. package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
  252. package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
  253. package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
  254. package/src/renderer/shared/components/cards/StockCard.tsx +7 -7
  255. package/src/renderer/shared/components/cards/ToolResultCards.tsx +11 -3
  256. package/src/renderer/shared/components/cards/UiMockupWidget.tsx +4 -4
  257. package/src/renderer/shared/components/cards/WeatherCard.tsx +5 -5
  258. package/src/renderer/shared/components/chat/ApprovalCard.test.tsx +11 -0
  259. package/src/renderer/shared/components/chat/ApprovalCard.tsx +21 -2
  260. package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
  261. package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
  262. package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
  263. package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
  264. package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
  265. package/src/renderer/shared/components/chat/ChatCodeBlock.tsx +15 -1
  266. package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +40 -2
  267. package/src/renderer/shared/components/chat/ChatMessageItem.tsx +180 -34
  268. package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
  269. package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
  270. package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
  271. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +22 -0
  272. package/src/renderer/shared/components/chat/ChatPanel.tsx +227 -53
  273. package/src/renderer/shared/components/chat/DiffReviewModal.tsx +6 -6
  274. package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +142 -1
  275. package/src/renderer/shared/components/chat/GeminiLiveOverlay.tsx +45 -3
  276. package/src/renderer/shared/components/chat/ModelSelectorPopover.tsx +42 -14
  277. package/src/renderer/shared/components/chat/RewindModal.tsx +10 -10
  278. package/src/renderer/shared/components/chat/SlashSuggestions.test.tsx +14 -0
  279. package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
  280. package/src/renderer/shared/components/chat/SourcesBlock.tsx +236 -90
  281. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +45 -1
  282. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +202 -169
  283. package/src/renderer/shared/components/extensions/CliSessionsView.tsx +5 -4
  284. package/src/renderer/shared/components/extensions/McpRegistryPicker.tsx +3 -3
  285. package/src/renderer/shared/components/studio/LibraryPage.tsx +48 -5
  286. package/src/renderer/shared/components/workspace/ArtifactPreviewPanel.tsx +125 -13
  287. package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
  288. package/src/renderer/shared/components/workspace/CodeReviewPage.tsx +77 -16
  289. package/src/renderer/shared/components/workspace/GitBranchSelector.tsx +78 -22
  290. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +13 -0
  291. package/src/renderer/shared/components/workspace/ToolSurfacePage.tsx +48 -28
  292. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +266 -47
  293. package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +18 -6
  294. package/src/renderer/shared/components/workspace/background-terminals.css +11 -11
  295. package/src/renderer/shared/constants/config.ts +1 -5
  296. package/src/renderer/shared/constants/models.test.ts +51 -0
  297. package/src/renderer/shared/constants/models.ts +139 -32
  298. package/src/renderer/shared/conversation/lifecycle.test.ts +91 -3
  299. package/src/renderer/shared/conversation/lifecycle.ts +104 -5
  300. package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
  301. package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
  302. package/src/renderer/shared/css/agent-observability.css +133 -0
  303. package/src/renderer/shared/css/chat-ui-cards.css +13 -13
  304. package/src/renderer/shared/css/code-review.css +63 -34
  305. package/src/renderer/shared/css/code-sessions.css +47 -18
  306. package/src/renderer/shared/css/collapsed-paste.css +1 -1
  307. package/src/renderer/shared/css/error-notice.css +1 -1
  308. package/src/renderer/shared/css/file-changes.css +165 -80
  309. package/src/renderer/shared/css/library.css +105 -10
  310. package/src/renderer/shared/css/management-views.css +1 -1
  311. package/src/renderer/shared/css/mcp-results.css +5 -5
  312. package/src/renderer/shared/css/model-selector.css +18 -18
  313. package/src/renderer/shared/css/mods.css +7 -7
  314. package/src/renderer/shared/css/notification-notice.css +2 -2
  315. package/src/renderer/shared/css/queued-messages.css +5 -5
  316. package/src/renderer/shared/css/settings/general.css +18 -13
  317. package/src/renderer/shared/css/settings/profile.css +5 -5
  318. package/src/renderer/shared/css/settings/theme.css +5 -5
  319. package/src/renderer/shared/css/slash-choice.css +2 -2
  320. package/src/renderer/shared/css/slash-suggestions.css +3 -3
  321. package/src/renderer/shared/css/sources-block.css +41 -2
  322. package/src/renderer/shared/css/tools-panel.css +2 -2
  323. package/src/renderer/shared/css/ui-tailwind.css +8 -0
  324. package/src/renderer/shared/css/veo-studio.css +2 -2
  325. package/src/renderer/shared/css/viewed-images.css +7 -7
  326. package/src/renderer/shared/platform.ts +2 -1
  327. package/src/renderer/shared/theme/themeManager.test.ts +17 -0
  328. package/src/renderer/shared/theme/themeManager.ts +21 -4
  329. package/src/renderer/shared/theme/themes.ts +54 -0
  330. package/src/renderer/shared/theme/tokens.css +6 -4
  331. package/src/renderer/shared/types.ts +1 -1
  332. package/src/renderer/shared/utils/agentActivity.test.ts +468 -2
  333. package/src/renderer/shared/utils/agentActivity.ts +602 -35
  334. package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
  335. package/src/renderer/shared/utils/artifactBrowser.ts +17 -19
  336. package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
  337. package/src/renderer/shared/utils/attachedDocument.ts +49 -0
  338. package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
  339. package/src/renderer/shared/utils/fileIcons.ts +149 -16
  340. package/src/renderer/shared/utils/markdown.tsx +72 -19
  341. package/src/renderer/shared/utils/markdown.webImages.test.tsx +16 -0
  342. package/src/renderer/shared/utils/mcpResults.test.tsx +29 -0
  343. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  344. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
  345. package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
  346. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
  347. package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
  348. package/src/renderer/shared/utils/workspaceDrag.ts +142 -0
  349. package/src/renderer/shared/utils/workspaceMedia.ts +10 -2
  350. package/src/renderer/src/App.tsx +14 -8
  351. package/src/renderer/src/agentProgress.ts +1 -0
  352. package/src/renderer/src/components/ScreenPicker.css +1 -1
  353. package/src/renderer/src/components/WorkspacePanel.tsx +6 -5
  354. package/src/renderer/src/css/app-shell.css +4 -4
  355. package/src/renderer/src/css/chat.css +1261 -241
  356. package/src/renderer/src/css/desktop-tools.css +11 -11
  357. package/src/renderer/src/css/sidebar-workspace.css +2 -2
  358. package/src/renderer/src/css/tool-surfaces.css +12 -12
  359. package/src/renderer/src/index.css +38 -20
  360. package/src/renderer/src/tauri.ts +22 -2
  361. package/src/renderer/src-web/App.tsx +14 -0
  362. package/src/renderer/src-web/agentProgress.ts +1 -0
  363. package/src/renderer/src-web/css/app-shell.css +4 -4
  364. package/src/renderer/src-web/css/chat.css +1278 -190
  365. package/src/renderer/src-web/css/mobile.css +29 -13
  366. package/src/renderer/src-web/css/settings/mobile.css +2 -2
  367. package/src/renderer/src-web/css/sidebar-workspace.css +1 -1
  368. package/src/renderer/src-web/index.css +38 -20
  369. package/src/renderer/src-web/tauri.ts +22 -2
  370. package/src/renderer/tests/browserArtifacts.browser.tsx +1 -1
  371. package/src/renderer/tests/library.browser.tsx +3 -0
  372. package/src/renderer/tests/liveVoice.browser.html +1 -0
  373. package/src/renderer/tests/workspaceDrop.browser.tsx +1 -1
  374. package/src-tauri/src/app/lifecycle.rs +1 -14
  375. package/src-tauri/src/background/headless.rs +14 -8
  376. package/src-tauri/src/commands/conversation.rs +38 -0
  377. package/src-tauri/src/native/mod.rs +0 -1
  378. package/src-tauri/src/native/system.rs +4 -47
  379. package/crates/mint-cli/src/interactive/chat_tui.rs +0 -8855
  380. package/crates/mint-core/src/agent/chat.rs +0 -4394
  381. package/crates/mint-core/src/browser/lifecycle.rs +0 -291
  382. package/crates/mint-core/src/browser/logging.rs +0 -20
  383. package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
  384. package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +0 -2
  385. package/out/web/assets/CalculationCard-CRjP3E1j.js +0 -1
  386. package/out/web/assets/CliSessionsView-C3Br2v5Y.css +0 -1
  387. package/out/web/assets/CodeReviewPage-CUJceQme.css +0 -1
  388. package/out/web/assets/CodeReviewPage-VCUgPla_.js +0 -2
  389. package/out/web/assets/ImageGenCard-BCXxkVJX.js +0 -1
  390. package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +0 -1
  391. package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
  392. package/out/web/assets/LibraryPage-WlviRdR8.js +0 -2
  393. package/out/web/assets/LinkedFoldersView-CKRgroWK.js +0 -1
  394. package/out/web/assets/McpServersView-D3wHnuHg.js +0 -1
  395. package/out/web/assets/MermaidCard-NqrHdyJW.js +0 -2
  396. package/out/web/assets/MintDashboard-B2DJsDDO.css +0 -1
  397. package/out/web/assets/MintDashboard-COw_xol7.js +0 -63
  398. package/out/web/assets/RewindModal-DempuDod.js +0 -1
  399. package/out/web/assets/SettingsWindow-2YP3yj7s.js +0 -4
  400. package/out/web/assets/SettingsWindow-Dz8LQVgD.css +0 -1
  401. package/out/web/assets/StockCard-BDMCe7mx.js +0 -1
  402. package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +0 -38
  403. package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +0 -1
  404. package/out/web/assets/UiMockupWidget-DD73QWg1.js +0 -1
  405. package/out/web/assets/WeatherCard-CPucIfq8.js +0 -1
  406. package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +0 -2
  407. package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +0 -1
  408. package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +0 -1
  409. package/out/web/assets/config-CvIO5hkn.js +0 -2
  410. package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +0 -1
  411. package/out/web/assets/index-BmpulIkg.js +0 -168
  412. package/out/web/assets/index-CkvBwhX_.css +0 -1
  413. package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +0 -1
  414. package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +0 -8
  415. package/shared-modules/libsecret/libsecret.json +0 -23
  416. package/shared-modules/libusb/libusb.json +0 -27
  417. package/shared-modules/lzo/lzo.json +0 -27
  418. package/src/renderer/src/components/BrowserShell.tsx +0 -108
  419. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
  420. package/src/renderer/src/components/browser-shell.css +0 -185
  421. package/src-tauri/src/native/browser.rs +0 -252
@@ -1,10 +1,25 @@
1
1
  import type { ArtifactFile } from '../../utils/artifacts'
2
2
  import { Fragment, useState } from 'react'
3
- import type { AgentActivityView, AgentActivity, AgentActivityGroup, TimelineItem } from '../../utils/agentActivity'
4
- import { cleanIntermediateThought, groupActivities } from '../../utils/agentActivity'
3
+ import type { AgentActivityView, AgentActivity, AgentActivityGroup, TimelineItem, DirectoryEntryItem } from '../../utils/agentActivity'
4
+ import {
5
+ cleanIntermediateThought,
6
+ groupActivities,
7
+ isMarkdownContent,
8
+ cleanMarkdownOutput,
9
+ cleanCommandOutput,
10
+ parseDirectoryEntries,
11
+ formatFileSize,
12
+ summarizeDirectoryListing,
13
+ isAskUserActivity,
14
+ extractAskUserQuestions,
15
+ } from '../../utils/agentActivity'
5
16
  import { materialFileIcon, materialFolderIcon, getExtension } from '../../utils/fileIcons'
6
17
  import { renderFormattedMessage } from '../../utils/markdown'
7
18
  import { ViewedImage } from './ViewedImages'
19
+ import { AskUserActivityCard } from './AskUserActivityCard'
20
+ import type { AgentProgress } from '../../types'
21
+ import McpToolResults from './McpToolResults'
22
+ import { setWorkspaceDragData, isImageFileName } from '../../utils/workspaceDrag'
8
23
 
9
24
  export function InlineThoughtNote({ thought }: { thought: string }) {
10
25
  const cleaned = cleanIntermediateThought(thought)
@@ -32,7 +47,10 @@ import {
32
47
 
33
48
  interface Props {
34
49
  activityView: AgentActivityView
50
+ progress?: AgentProgress[]
35
51
  chatId?: string
52
+ workspacePath?: string
53
+ onReferenceFile?: (filePath: string) => void
36
54
  onOpenArtifact?: (artifact: ArtifactFile) => void
37
55
  }
38
56
 
@@ -43,34 +61,51 @@ function getFilename(target: string): string {
43
61
  }
44
62
 
45
63
  function renderActivityIcon(kind: AgentActivity['kind'], target: string, action?: string) {
46
- if (kind === 'file') {
64
+ const isFile =
65
+ kind === 'file' ||
66
+ action === 'read_file' ||
67
+ action === 'write_file' ||
68
+ action === 'edit_file' ||
69
+ action === 'apply_patch' ||
70
+ action === 'apply_code_edits'
71
+
72
+ if (isFile) {
47
73
  const filename = getFilename(target)
48
74
  const ext = getExtension(filename)
49
75
  const icon = materialFileIcon(filename, ext)
50
76
  if (icon) return <img src={icon} alt="" draggable={false} className="agent-activity-icon-img" />
51
- return <FileCode size={14} className="agent-activity-kind-icon" />
77
+ return <FileCode size={16} className="agent-activity-kind-icon" />
52
78
  }
53
- if (kind === 'folder') {
79
+ if (kind === 'folder' || action === 'list_files' || action === 'list_directory' || action === 'list_dir') {
54
80
  const foldername = getFilename(target)
55
81
  const icon = materialFolderIcon(foldername, false)
56
82
  if (icon) return <img src={icon} alt="" draggable={false} className="agent-activity-icon-img" />
57
- return <Folder size={14} className="agent-activity-kind-icon" />
83
+ return <Folder size={16} className="agent-activity-kind-icon" />
58
84
  }
59
85
  if (kind === 'calc' || action === 'calculation') {
60
- return <Calculator size={14} className="agent-activity-kind-icon" />
86
+ return <Calculator size={16} className="agent-activity-kind-icon" />
61
87
  }
62
88
  if (kind === 'search') {
63
- return <Search size={14} className="agent-activity-kind-icon" />
89
+ return <Search size={16} className="agent-activity-kind-icon" />
64
90
  }
65
91
  if (kind === 'terminal') {
66
- return <Terminal size={14} className="agent-activity-kind-icon" />
92
+ return <Terminal size={16} className="agent-activity-kind-icon" />
67
93
  }
68
- return <Wrench size={14} className="agent-activity-kind-icon" />
94
+ return <Wrench size={16} className="agent-activity-kind-icon" />
69
95
  }
70
96
 
71
97
  function extractResultPreview(action: string | undefined, result: string | undefined): string | null {
72
98
  if (!result || !result.trim() || action === 'view_image') return null
73
- const firstLine = result.trim().split('\n')[0].trim()
99
+ // Do not show inline raw text preview for file operations (filename and diff stats are already shown)
100
+ if (action === 'read_file' || action === 'write_file' || action === 'edit_file' || action === 'apply_patch') return null
101
+ if (action === 'list_files' || action === 'list_directory' || action === 'list_dir') {
102
+ const summary = summarizeDirectoryListing(result)
103
+ if (summary) return `→ ${summary}`
104
+ }
105
+ const cleaned = cleanCommandOutput(result)
106
+ const firstLine = cleaned.trim().split('\n')[0].trim()
107
+ // Filter out JSON brackets, objects, or errors
108
+ if (firstLine.startsWith('[') || firstLine.startsWith('{') || firstLine.startsWith('Error:') || firstLine === '(no output)') return null
74
109
  if (action === 'calculation') {
75
110
  const eqIdx = firstLine.indexOf('=')
76
111
  if (eqIdx !== -1) {
@@ -78,7 +113,7 @@ function extractResultPreview(action: string | undefined, result: string | undef
78
113
  if (val.length > 0 && val.length < 30) return `→ ${val}`
79
114
  }
80
115
  }
81
- if (firstLine.length > 0 && firstLine.length <= 35 && !firstLine.startsWith('Error:') && !firstLine.startsWith('{')) {
116
+ if (firstLine.length > 0 && firstLine.length <= 35) {
82
117
  return `→ ${firstLine}`
83
118
  }
84
119
  return null
@@ -86,7 +121,7 @@ function extractResultPreview(action: string | undefined, result: string | undef
86
121
 
87
122
  function renderStatusIndicator(state: AgentActivity['state']) {
88
123
  if (state === 'active') {
89
- return <Loader2 size={12} className="agent-activity-status-spin" />
124
+ return <Loader2 size={13} className="agent-activity-status-spin" />
90
125
  }
91
126
  if (state === 'retry') {
92
127
  return <span className="agent-activity-badge retry" title="Encountered an error but agent retried">Retried</span>
@@ -94,10 +129,109 @@ function renderStatusIndicator(state: AgentActivity['state']) {
94
129
  if (state === 'error') {
95
130
  return <span className="agent-activity-badge error" title="Action failed">Failed</span>
96
131
  }
97
- return <Check size={12} className="agent-activity-status-check" />
132
+ return <Check size={13} className="agent-activity-status-check" />
98
133
  }
99
134
 
100
- export function AgentActivityTable({ activityView, chatId, onOpenArtifact }: Props) {
135
+ function DirectoryListingView({
136
+ entries,
137
+ workspacePath,
138
+ onReferenceFile,
139
+ }: {
140
+ entries: DirectoryEntryItem[]
141
+ workspacePath?: string
142
+ onReferenceFile?: (filePath: string) => void
143
+ }) {
144
+ if (entries.length === 0) {
145
+ return <div className="modern-directory-empty">(empty directory)</div>
146
+ }
147
+
148
+ const getEntryName = (e: DirectoryEntryItem): string => {
149
+ if (e.name) return e.name
150
+ if (e.path) {
151
+ const parts = e.path.split(/[/\\]/)
152
+ return parts[parts.length - 1] || e.path
153
+ }
154
+ return ''
155
+ }
156
+
157
+ return (
158
+ <div className="modern-directory-listing" role="list">
159
+ {entries.map((entry, idx) => {
160
+ const name = getEntryName(entry)
161
+ const kind = (entry.kind || '').toLowerCase()
162
+ const isDir = kind === 'directory' || kind === 'dir' || kind === 'folder'
163
+ const ext = isDir ? '' : getExtension(name)
164
+
165
+ let iconSrc: string | null = null
166
+ if (isDir) {
167
+ iconSrc = materialFolderIcon(name, false)
168
+ } else {
169
+ iconSrc = materialFileIcon(name, ext)
170
+ }
171
+
172
+ const sizeStr = !isDir ? formatFileSize(entry.size) : ''
173
+ const fullPath = entry.path || name
174
+
175
+ return (
176
+ <div
177
+ key={`${name}-${idx}`}
178
+ className={`modern-directory-item ${isDir ? 'is-directory' : 'is-file'}`}
179
+ role="listitem"
180
+ title={fullPath}
181
+ >
182
+ <span className="modern-directory-item-icon" aria-hidden="true">
183
+ {iconSrc ? (
184
+ <img src={iconSrc} alt="" draggable={false} className="agent-activity-icon-img" />
185
+ ) : isDir ? (
186
+ <Folder size={15} className="agent-activity-kind-icon" />
187
+ ) : (
188
+ <FileCode size={15} className="agent-activity-kind-icon" />
189
+ )}
190
+ </span>
191
+
192
+ <span
193
+ className="modern-directory-item-name"
194
+ draggable={!isDir}
195
+ onDragStart={
196
+ !isDir
197
+ ? (e) => {
198
+ e.stopPropagation()
199
+ setWorkspaceDragData(e.dataTransfer, {
200
+ path: fullPath,
201
+ root: workspacePath,
202
+ kind: 'file',
203
+ })
204
+ }
205
+ : undefined
206
+ }
207
+ >
208
+ {name}{isDir ? '/' : ''}
209
+ </span>
210
+
211
+ {sizeStr && <span className="modern-directory-item-size">{sizeStr}</span>}
212
+
213
+ {onReferenceFile && !isDir && (
214
+ <button
215
+ type="button"
216
+ className="agent-activity-mention-btn modern-dir-mention-btn"
217
+ onClick={(e) => {
218
+ e.stopPropagation()
219
+ onReferenceFile(fullPath)
220
+ }}
221
+ title={`Reference in chat: ${name}`}
222
+ aria-label={`Reference ${name} in chat`}
223
+ >
224
+ @
225
+ </button>
226
+ )}
227
+ </div>
228
+ )
229
+ })}
230
+ </div>
231
+ )
232
+ }
233
+
234
+ export function AgentActivityTable({ activityView, progress, chatId, workspacePath, onReferenceFile, onOpenArtifact }: Props) {
101
235
  const groups: AgentActivityGroup[] = activityView.groups || groupActivities(activityView.items)
102
236
  const [expandedGroups, setExpandedGroups] = useState<Record<string, boolean>>({})
103
237
  const [expandedIndices, setExpandedIndices] = useState<Record<string, boolean>>({})
@@ -117,156 +251,268 @@ export function AgentActivityTable({ activityView, chatId, onOpenArtifact }: Pro
117
251
  }
118
252
 
119
253
  const renderSingleItem = (activity: AgentActivity, itemKey: string) => {
254
+ if (isAskUserActivity(activity)) {
255
+ const isAnswered =
256
+ activity.state === 'done' ||
257
+ Boolean(activity.askUserData?.questions.some((q) => Boolean(q.answer))) ||
258
+ activity.target.startsWith('(Answered:') ||
259
+ Boolean(activity.result?.startsWith('User answered:'))
260
+ if (isAnswered) {
261
+ const questions = extractAskUserQuestions(activity)
262
+ if (questions.length > 0) {
263
+ return (
264
+ <AskUserActivityCard
265
+ key={itemKey}
266
+ questions={questions}
267
+ header={activity.askUserData?.header}
268
+ />
269
+ )
270
+ }
271
+ }
272
+ }
273
+
120
274
  const isItemExpanded = Boolean(expandedIndices[itemKey])
121
275
  const output = activity.result?.trim()
122
276
  const inlineResult = extractResultPreview(activity.action, output)
277
+ const isFileAction =
278
+ activity.kind === 'file' ||
279
+ activity.action === 'write_file' ||
280
+ activity.action === 'edit_file' ||
281
+ activity.action === 'read_file'
282
+ const isFolderAction =
283
+ activity.kind === 'folder' ||
284
+ activity.action === 'list_files' ||
285
+ activity.action === 'list_directory' ||
286
+ activity.action === 'list_dir'
287
+ const hasIcon = isFileAction || isFolderAction
288
+ const isCommand =
289
+ activity.action === 'run_shell' ||
290
+ activity.action === 'run_command' ||
291
+ activity.action === 'bash' ||
292
+ activity.kind === 'terminal'
293
+
294
+ const cleanTarget = activity.target ? activity.target.split(' #')[0].trim() : ''
295
+ const fileName = getFilename(cleanTarget)
296
+
297
+ const verb =
298
+ activity.semanticVerb ||
299
+ (isCommand
300
+ ? 'Ran'
301
+ : isFolderAction
302
+ ? 'Explored'
303
+ : isFileAction
304
+ ? activity.action === 'read_file'
305
+ ? 'Analyzed'
306
+ : 'Edited'
307
+ : activity.label || activity.action || 'Executed')
123
308
 
124
309
  return (
125
310
  <Fragment key={itemKey}>
126
311
  <div
127
- className="agent-activity-item"
312
+ className={`agent-activity-item modern-timeline-row ${isItemExpanded ? 'is-expanded' : ''}`}
128
313
  data-kind={activity.kind}
129
314
  data-state={activity.state}
130
315
  style={{ cursor: output ? 'pointer' : 'default' }}
131
316
  onClick={() => output && toggleExpandItem(itemKey)}
132
317
  >
133
- <span className="agent-activity-icon-wrap" aria-hidden="true">
134
- {renderActivityIcon(activity.kind, activity.target, activity.action)}
135
- </span>
136
- <span className="agent-activity-label">
137
- <span className="agent-activity-tool-name">{activity.label || activity.action}</span>
138
- </span>
318
+ <span className="modern-timeline-verb">{verb}</span>
319
+
320
+ {hasIcon && (
321
+ <span className="modern-timeline-icon-wrap" aria-hidden="true">
322
+ {renderActivityIcon(activity.kind, cleanTarget, activity.action)}
323
+ </span>
324
+ )}
325
+
139
326
  <span
140
- className="agent-activity-text"
141
- title={activity.target}
142
- style={isItemExpanded ? { whiteSpace: 'normal', wordBreak: 'break-all', overflow: 'visible', textOverflow: 'clip' } : undefined}
327
+ className={`agent-activity-text modern-timeline-target ${isFileAction ? 'is-file-target' : ''}`}
328
+ title={
329
+ isFileAction
330
+ ? `Drag file to chat or click @ to reference: ${cleanTarget}`
331
+ : activity.target
332
+ }
143
333
  >
144
- <span className="agent-activity-target-text">{activity.target}</span>
334
+ <span
335
+ className={`agent-activity-target-text ${isFileAction ? 'is-file-target' : ''}`}
336
+ draggable={isFileAction}
337
+ onDragStart={
338
+ isFileAction
339
+ ? (e) => {
340
+ e.stopPropagation()
341
+ setWorkspaceDragData(e.dataTransfer, {
342
+ path: cleanTarget,
343
+ root: workspacePath,
344
+ kind: 'file',
345
+ })
346
+ }
347
+ : undefined
348
+ }
349
+ >
350
+ {isFileAction ? fileName : (activity.intentTitle || activity.target)}
351
+ </span>
352
+
353
+ {activity.lineRange && (
354
+ <span className="modern-timeline-line-range">{activity.lineRange}</span>
355
+ )}
356
+
357
+ {activity.diffStats &&
358
+ (activity.diffStats.additions > 0 || activity.diffStats.deletions > 0) && (
359
+ <span className="modern-timeline-diff-stats">
360
+ {activity.diffStats.additions > 0 && (
361
+ <span className="diff-stat-add">+{activity.diffStats.additions}</span>
362
+ )}
363
+ {activity.diffStats.deletions > 0 && (
364
+ <span className="diff-stat-del">-{activity.diffStats.deletions}</span>
365
+ )}
366
+ </span>
367
+ )}
368
+
145
369
  {inlineResult && <span className="agent-activity-inline-result">{inlineResult}</span>}
146
370
  </span>
147
- <span className="agent-activity-status-col">
371
+
372
+ <span className="agent-activity-status-col modern-timeline-status-col">
373
+ {onReferenceFile && isFileAction && cleanTarget && (
374
+ <button
375
+ type="button"
376
+ className="agent-activity-mention-btn"
377
+ onClick={(e) => {
378
+ e.stopPropagation()
379
+ onReferenceFile(cleanTarget)
380
+ }}
381
+ title={`Reference in chat: ${fileName}`}
382
+ aria-label={`Reference ${fileName} in chat`}
383
+ >
384
+ @
385
+ </button>
386
+ )}
148
387
  {renderStatusIndicator(activity.state)}
149
388
  {output && (
150
- <span
151
- className={`agent-activity-chevron${isItemExpanded ? ' is-open' : ''}`}
389
+ <ChevronRight
390
+ size={12}
391
+ className={`modern-timeline-chevron${isItemExpanded ? ' is-open' : ''}`}
152
392
  aria-hidden="true"
153
- >
154
- <ChevronRight size={12} strokeWidth={2.2} />
155
- </span>
393
+ />
156
394
  )}
157
395
  </span>
158
396
  </div>
159
397
  {activity.viewedImage && (
160
398
  <div className="agent-activity-inline-preview">
161
- <ViewedImage image={activity.viewedImage} chatId={chatId} variant="inline" onOpenArtifact={onOpenArtifact} />
399
+ <ViewedImage
400
+ image={activity.viewedImage}
401
+ chatId={chatId}
402
+ variant="inline"
403
+ onOpenArtifact={onOpenArtifact}
404
+ />
162
405
  </div>
163
406
  )}
164
407
  {isItemExpanded && output && (
165
- <div className="agent-activity-output">
166
- {output.includes('[Self-Correction Guidance]') ? (
167
- <>
168
- {output.split('[Self-Correction Guidance]')[0]?.trim() && (
169
- <pre>{output.split('[Self-Correction Guidance]')[0]?.trim()}</pre>
170
- )}
171
- <div className="diagnostic-guidance-card">
172
- <div className="diagnostic-guidance-header">
173
- <span>💡 Self-Correction Guidance</span>
174
- </div>
175
- <pre>{output.split('[Self-Correction Guidance]')[1]?.trim()}</pre>
176
- </div>
177
- </>
178
- ) : (
179
- <pre>{output}</pre>
180
- )}
181
- </div>
408
+ isMarkdownContent(activity.action, activity.target, output) ? (
409
+ <div className="agent-activity-thought-body modern-thought-body modern-timeline-prose">
410
+ {renderFormattedMessage(cleanMarkdownOutput(output)) ?? output}
411
+ </div>
412
+ ) : (
413
+ <div className="agent-activity-output modern-timeline-output">
414
+ {(() => {
415
+ const isDirAction =
416
+ activity.action === 'list_files' ||
417
+ activity.action === 'list_directory' ||
418
+ activity.action === 'list_dir' ||
419
+ activity.kind === 'folder'
420
+ const dirEntries = isDirAction ? parseDirectoryEntries(output) : null
421
+ if (dirEntries) {
422
+ return (
423
+ <DirectoryListingView
424
+ entries={dirEntries}
425
+ workspacePath={workspacePath}
426
+ onReferenceFile={onReferenceFile}
427
+ />
428
+ )
429
+ }
430
+
431
+ if (output.includes('[Self-Correction Guidance]')) {
432
+ return (
433
+ <>
434
+ {output.split('[Self-Correction Guidance]')[0]?.trim() && (
435
+ <pre>{cleanCommandOutput(output.split('[Self-Correction Guidance]')[0]?.trim())}</pre>
436
+ )}
437
+ <div className="diagnostic-guidance-card">
438
+ <div className="diagnostic-guidance-header">
439
+ <span>💡 Self-Correction Guidance</span>
440
+ </div>
441
+ <pre>{output.split('[Self-Correction Guidance]')[1]?.trim()}</pre>
442
+ </div>
443
+ </>
444
+ )
445
+ }
446
+
447
+ return <pre>{cleanCommandOutput(output)}</pre>
448
+ })()}
449
+ </div>
450
+ )
182
451
  )}
183
452
  </Fragment>
184
453
  )
185
454
  }
186
455
 
187
456
  const renderGroup = (group: AgentActivityGroup) => {
457
+ if (group.action === 'ask_user') {
458
+ const isAnswered =
459
+ group.state === 'done' ||
460
+ group.items.some(
461
+ (it) =>
462
+ Boolean(it.askUserData?.questions.some((q) => Boolean(q.answer))) ||
463
+ it.target.startsWith('(Answered:') ||
464
+ Boolean(it.result?.startsWith('User answered:')),
465
+ )
466
+ if (isAnswered) {
467
+ const questions = group.items.flatMap(extractAskUserQuestions)
468
+ if (questions.length > 0) {
469
+ return <AskUserActivityCard key={group.id} questions={questions} />
470
+ }
471
+ }
472
+ }
473
+
188
474
  const isGroupExpanded = Boolean(expandedGroups[group.id])
475
+ const verb =
476
+ group.semanticVerb ||
477
+ (group.action?.includes('shell') || group.action?.includes('command')
478
+ ? 'Ran'
479
+ : group.label || group.action || 'Executed')
189
480
 
190
481
  return (
191
- <div key={group.id} className="agent-activity-group">
482
+ <div key={group.id} className="agent-activity-group modern-timeline-group">
192
483
  <div
193
- className={`agent-activity-group-header${isGroupExpanded ? ' is-expanded' : ''}`}
484
+ className={`agent-activity-group-header modern-timeline-row modern-group-row${isGroupExpanded ? ' is-expanded' : ''}`}
194
485
  data-state={group.state}
195
486
  onClick={() => toggleGroup(group.id)}
196
487
  >
197
- <span className="agent-activity-icon-wrap" aria-hidden="true">
198
- {renderActivityIcon(group.kind, group.items[0]?.target, group.action)}
199
- </span>
200
- <span className="agent-activity-group-title">
488
+ <span className="modern-timeline-verb">{verb}</span>
489
+ <span className="agent-activity-group-title modern-timeline-target">
201
490
  {group.title}
202
491
  </span>
203
- <span className="agent-activity-group-badges">
204
- <span className="agent-activity-count-badge">
492
+ <span className="modern-timeline-status-col">
493
+ <span className="modern-timeline-count-badge">
205
494
  {group.count}
206
495
  </span>
207
496
  {renderStatusIndicator(group.state)}
208
- <span
209
- className={`agent-activity-chevron${isGroupExpanded ? ' is-open' : ''}`}
497
+ <ChevronRight
498
+ size={12}
499
+ className={`modern-timeline-chevron${isGroupExpanded ? ' is-open' : ''}`}
210
500
  aria-hidden="true"
211
- >
212
- <ChevronRight size={13} strokeWidth={2.2} />
213
- </span>
501
+ />
214
502
  </span>
215
503
  </div>
216
504
 
217
505
  {isGroupExpanded && (
218
- <div className="agent-activity-group-subitems">
506
+ <div className="agent-activity-group-subitems modern-group-subitems">
219
507
  {group.items.map((activity, itemIdx) => {
220
508
  const itemKey = `${group.id}-${itemIdx}-${activity.target}`
221
- const isItemExpanded = Boolean(expandedIndices[itemKey])
222
- const output = activity.result?.trim()
223
- const inlineResult = extractResultPreview(activity.action, output)
224
-
225
- return (
226
- <Fragment key={itemKey}>
227
- <div
228
- className="agent-activity-subitem"
229
- data-state={activity.state}
230
- style={{ cursor: output ? 'pointer' : 'default' }}
231
- onClick={() => output && toggleExpandItem(itemKey)}
232
- >
233
- <span className="agent-activity-tree-bullet" aria-hidden="true">
234
- {itemIdx === group.items.length - 1 ? '└─' : '├─'}
235
- </span>
236
- <span
237
- className="agent-activity-subitem-target"
238
- title={activity.target}
239
- >
240
- {activity.target}
241
- </span>
242
- {inlineResult && (
243
- <span className="agent-activity-inline-result">{inlineResult}</span>
244
- )}
245
- <span className="agent-activity-subitem-status">
246
- {renderStatusIndicator(activity.state)}
247
- {output && (
248
- <span
249
- className={`agent-activity-chevron${isItemExpanded ? ' is-open' : ''}`}
250
- aria-hidden="true"
251
- >
252
- <ChevronRight size={11} strokeWidth={2.2} />
253
- </span>
254
- )}
255
- </span>
256
- </div>
257
- {activity.viewedImage && (
258
- <div className="agent-activity-inline-preview agent-activity-subitem-preview">
259
- <ViewedImage image={activity.viewedImage} chatId={chatId} variant="inline" onOpenArtifact={onOpenArtifact} />
260
- </div>
261
- )}
262
- {isItemExpanded && output && (
263
- <div className="agent-activity-output agent-activity-subitem-output">
264
- <pre>{output}</pre>
265
- </div>
266
- )}
267
- </Fragment>
268
- )
509
+ return renderSingleItem(activity, itemKey)
269
510
  })}
511
+ {group.action === 'mcp_tool' && progress && (
512
+ <div className="agent-activity-mcp-details" style={{ padding: '4px 12px 10px 24px' }}>
513
+ <McpToolResults progress={progress} chatId={chatId} mode="artifacts-only" />
514
+ </div>
515
+ )}
270
516
  </div>
271
517
  )}
272
518
  </div>
@@ -274,7 +520,7 @@ export function AgentActivityTable({ activityView, chatId, onOpenArtifact }: Pro
274
520
  }
275
521
 
276
522
  return (
277
- <div className="agent-activity-list">
523
+ <div className="agent-activity-list modern-activity-list">
278
524
  {activityView.timeline && activityView.timeline.length > 0
279
525
  ? activityView.timeline.map((item, idx) => {
280
526
  if (item.kind === 'thought') {
@@ -283,34 +529,30 @@ export function AgentActivityTable({ activityView, chatId, onOpenArtifact }: Pro
283
529
  if (item.kind === 'extendedThinking') {
284
530
  const itemKey = item.id || `ext-thought-${idx}`
285
531
  const isThoughtExpanded = expandedIndices[itemKey] ?? Boolean(item.streaming)
532
+ const thoughtSecs = item.elapsedMs ? `${Math.max(1, Math.round(item.elapsedMs / 1000))}s` : ''
533
+ const thoughtTitle = item.streaming
534
+ ? 'Thinking…'
535
+ : thoughtSecs
536
+ ? `Thought for ${thoughtSecs}`
537
+ : 'Thought'
538
+
286
539
  return (
287
- <div key={itemKey} className="agent-activity-thought-step">
540
+ <div key={itemKey} className="agent-activity-thought-step modern-timeline-thought-item">
288
541
  <div
289
- className={`agent-activity-thought-header${isThoughtExpanded ? ' is-expanded' : ''}`}
542
+ className={`agent-activity-thought-header modern-timeline-row modern-thought-row${isThoughtExpanded ? ' is-expanded' : ''}`}
290
543
  onClick={() => toggleExpandItem(itemKey, Boolean(item.streaming))}
291
544
  >
292
- <span className="agent-activity-icon-wrap" aria-hidden="true">
293
- <Brain size={14} className="agent-activity-kind-icon" />
294
- </span>
295
- <span className="agent-activity-thought-title">
296
- Thought
297
- <span className="agent-activity-thought-meta">
298
- {item.streaming
299
- ? ' · Thinking…'
300
- : item.elapsedMs != null
301
- ? ` · ${(item.elapsedMs / 1000).toFixed(1)}s`
302
- : ''}
303
- </span>
304
- </span>
305
- <span
306
- className={`agent-activity-chevron${isThoughtExpanded ? ' is-open' : ''}`}
307
- aria-hidden="true"
308
- >
309
- <ChevronRight size={13} strokeWidth={2.2} />
545
+ <span className="modern-timeline-thought-label">
546
+ {thoughtTitle}
547
+ <ChevronRight
548
+ size={12}
549
+ className={`modern-timeline-chevron inline-chevron${isThoughtExpanded ? ' is-open' : ''}`}
550
+ aria-hidden="true"
551
+ />
310
552
  </span>
311
553
  </div>
312
554
  {isThoughtExpanded && (
313
- <div className="agent-activity-thought-body">
555
+ <div className="agent-activity-thought-body modern-thought-body">
314
556
  {item.streaming
315
557
  ? <>{item.thought}<span className="agent-activity-thought-cursor">▍</span></>
316
558
  : (renderFormattedMessage(item.thought) ?? item.thought)}