@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
@@ -34,7 +34,7 @@
34
34
  height: 40px;
35
35
  padding: 0;
36
36
  border: 1px solid var(--border-default);
37
- border-radius: 12px;
37
+ border-radius: var(--radius-xl, 18px);
38
38
  background: var(--bg-surface-raised);
39
39
  color: var(--text-primary);
40
40
  }
@@ -406,7 +406,7 @@
406
406
  height: 52px;
407
407
  padding: 0 8px;
408
408
  border: 1px solid var(--border-default);
409
- border-radius: 18px;
409
+ border-radius: var(--radius-full, 9999px);
410
410
  background: var(--mobile-chrome-bg);
411
411
  backdrop-filter: var(--mobile-chrome-filter);
412
412
  -webkit-backdrop-filter: var(--mobile-chrome-filter);
@@ -422,7 +422,7 @@
422
422
  .chat-header-clear-btn,
423
423
  .chat-header-back-btn,
424
424
  .web-mobile-nav-btn {
425
- border-radius: 14px;
425
+ border-radius: var(--radius-full, 9999px);
426
426
  }
427
427
 
428
428
  .web-mobile-nav-btn,
@@ -443,7 +443,7 @@
443
443
  height: 44px;
444
444
  padding: 0;
445
445
  border: 1px solid var(--border);
446
- border-radius: 14px;
446
+ border-radius: var(--radius-full, 9999px);
447
447
  background: var(--mobile-chrome-bg);
448
448
  color: var(--text-main);
449
449
  backdrop-filter: var(--mobile-chrome-filter);
@@ -460,7 +460,7 @@
460
460
  width: min(280px, calc(100vw - 24px)) !important;
461
461
  padding-top: calc(20px + env(safe-area-inset-top)) !important;
462
462
  padding-bottom: calc(12px + env(safe-area-inset-bottom)) !important;
463
- border-radius: 0 22px 22px 0;
463
+ border-radius: 0 var(--radius-2xl) var(--radius-2xl) 0;
464
464
  border-right: 1px solid var(--border-default);
465
465
  }
466
466
 
@@ -470,7 +470,7 @@
470
470
  -webkit-backdrop-filter: var(--mobile-chrome-filter);
471
471
  border: 1px solid var(--border-subtle);
472
472
  border-bottom: 0;
473
- border-radius: 22px 22px 0 0;
473
+ border-radius: var(--radius-2xl) var(--radius-2xl) 0 0;
474
474
  }
475
475
 
476
476
  #chat-form,
@@ -499,12 +499,12 @@
499
499
  }
500
500
 
501
501
  #chat-form {
502
- border-radius: 20px;
502
+ border-radius: var(--radius-composer, 24px);
503
503
  }
504
504
 
505
505
  .user-message .message-bubble {
506
506
  background: color-mix(in srgb, var(--accent) 10%, var(--mobile-reading-bg));
507
- border-radius: 20px 20px 6px 20px;
507
+ border-radius: var(--radius-xl) var(--radius-xl) var(--radius-xs, 4px) var(--radius-xl);
508
508
  }
509
509
 
510
510
  .app-body .img-studio,
@@ -514,18 +514,18 @@
514
514
 
515
515
  .app-body .img-studio-controls,
516
516
  .app-body .veo-studio-controls {
517
- border-radius: 20px 20px 0 0;
517
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
518
518
  }
519
519
 
520
520
  .app-body .management-card,
521
521
  .picture-card,
522
522
  .img-studio-dropzone {
523
- border-radius: 20px;
523
+ border-radius: var(--radius-xl);
524
524
  }
525
525
 
526
526
  .pictures-header {
527
527
  border: 1px solid var(--border-default);
528
- border-radius: 18px;
528
+ border-radius: var(--radius-xl);
529
529
  padding: 12px;
530
530
  }
531
531
 
@@ -570,19 +570,35 @@
570
570
  grid-template-rows: minmax(48px, auto) 40px 40px;
571
571
  }
572
572
 
573
+ #chat-form .chat-composer-pills,
573
574
  #chat-form .model-selector-container {
574
575
  grid-column: 1 / -1;
575
576
  grid-row: 3;
576
577
  display: flex;
578
+ align-items: center;
579
+ justify-content: space-between;
580
+ gap: 6px;
577
581
  width: 100%;
578
582
  min-width: 0;
579
583
  height: 40px;
580
584
  }
581
585
 
586
+ #chat-form:not(:has(.mint-attachment)) .chat-composer-pills,
582
587
  #chat-form:not(:has(.mint-attachment)) .model-selector-container {
583
588
  grid-row: 2;
584
589
  }
585
590
 
591
+ #chat-form .chat-composer-pills .chat-mode-selector-wrap {
592
+ flex: 0 0 auto;
593
+ }
594
+
595
+ #chat-form .chat-composer-pills .model-selector-container {
596
+ flex: 1 1 auto;
597
+ min-width: 0;
598
+ grid-column: unset;
599
+ grid-row: unset;
600
+ }
601
+
586
602
  #chat-form .model-selector-trigger {
587
603
  display: flex;
588
604
  width: 100%;
@@ -625,7 +641,7 @@
625
641
  height: min(60dvh, 420px);
626
642
  max-height: calc(var(--mint-viewport-height, 100dvh) - 160px);
627
643
  flex-direction: column;
628
- border-radius: 20px;
644
+ border-radius: var(--radius-xl);
629
645
  background: var(--bg-overlay);
630
646
  backdrop-filter: none;
631
647
  -webkit-backdrop-filter: none;
@@ -643,7 +659,7 @@
643
659
  flex: 1;
644
660
  min-height: 40px;
645
661
  border: 0;
646
- border-radius: 12px;
662
+ border-radius: var(--radius-lg, 14px);
647
663
  background: transparent;
648
664
  color: var(--text-soft);
649
665
  }
@@ -178,7 +178,7 @@
178
178
  .settings-content .setting-feature-card {
179
179
  min-width: 0;
180
180
  padding: 14px;
181
- border-radius: 18px;
181
+ border-radius: var(--radius-xl, 18px);
182
182
  }
183
183
 
184
184
  .settings-content .provider-card-header {
@@ -315,6 +315,6 @@
315
315
 
316
316
  .settings-nav-search,
317
317
  .tab-btn {
318
- border-radius: 14px;
318
+ border-radius: var(--radius-lg, 14px);
319
319
  }
320
320
  }
@@ -419,7 +419,7 @@
419
419
  gap: 9px;
420
420
  padding: 0 10px;
421
421
  color: var(--text-secondary);
422
- border-radius: 7px;
422
+ border-radius: var(--radius-sm, 8px);
423
423
  white-space: nowrap;
424
424
  overflow: hidden;
425
425
  text-overflow: ellipsis;
@@ -51,12 +51,26 @@ button {
51
51
  background: color-mix(in srgb, var(--accent, #10b981) 12%, transparent);
52
52
  border: 1px solid color-mix(in srgb, var(--accent, #10b981) 25%, transparent);
53
53
  color: var(--interactive-fg);
54
- padding: 2px 6px;
55
- border-radius: 6px;
54
+ padding: 1px 6px;
55
+ border-radius: var(--radius-xs, 6px);
56
56
  font-weight: 500;
57
- font-size: 0.9em;
58
- display: inline-block;
57
+ font-size: 0.88em;
58
+ display: inline-flex;
59
+ align-items: center;
60
+ gap: 4px;
61
+ vertical-align: middle;
59
62
  margin: 0 2px;
63
+ line-height: 1.4;
64
+ }
65
+
66
+ .chat-mention.chat-file-mention {
67
+ cursor: pointer;
68
+ transition: background 0.15s ease, border-color 0.15s ease;
69
+ }
70
+
71
+ .chat-mention.chat-file-mention:hover {
72
+ background: color-mix(in srgb, var(--accent, #10b981) 20%, transparent);
73
+ border-color: color-mix(in srgb, var(--accent, #10b981) 40%, transparent);
60
74
  }
61
75
 
62
76
  .chat-ui-grid-item:hover {
@@ -75,7 +89,7 @@ button {
75
89
  flex-direction: column;
76
90
  background: var(--panel-soft, #121214);
77
91
  border: 1px solid var(--border, rgba(255, 255, 255, 0.08));
78
- border-radius: 16px;
92
+ border-radius: var(--radius-xl, 18px);
79
93
  margin: 12px 0;
80
94
  overflow: hidden;
81
95
  box-shadow: var(--shadow-sm, 0 4px 16px rgba(0, 0, 0, 0.18));
@@ -110,7 +124,7 @@ button {
110
124
  color: var(--text-soft, #64748b);
111
125
  background: var(--bg-surface-soft);
112
126
  padding: 1px 6px;
113
- border-radius: 4px;
127
+ border-radius: var(--radius-2xs, 4px);
114
128
  }
115
129
 
116
130
  .chat-code-block-actions {
@@ -125,7 +139,7 @@ button {
125
139
  color: var(--text-soft, #94a3b8);
126
140
  cursor: pointer;
127
141
  padding: 4px 8px;
128
- border-radius: 5px;
142
+ border-radius: var(--radius-xs, 6px);
129
143
  display: inline-flex;
130
144
  align-items: center;
131
145
  gap: 5px;
@@ -143,6 +157,10 @@ button {
143
157
  padding: 4px 6px;
144
158
  }
145
159
 
160
+ .chat-code-toggle-lines-btn.is-active {
161
+ color: var(--interactive-fg, #38bdf8);
162
+ }
163
+
146
164
  .chat-code-copy-btn.is-copied {
147
165
  color: var(--interactive-fg);
148
166
  }
@@ -164,9 +182,9 @@ button {
164
182
  }
165
183
 
166
184
  .chat-code-block-body code {
167
- font-family: 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
168
- font-size: 13px;
169
- line-height: 1.6;
185
+ font-family: 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Noto Sans Thai', monospace;
186
+ font-size: 14.5px;
187
+ line-height: 1.65;
170
188
  white-space: pre;
171
189
  color: var(--text-chat, var(--text-main, #e2e8f0));
172
190
  display: block;
@@ -197,7 +215,7 @@ button {
197
215
  padding-right: 14px;
198
216
  text-align: right;
199
217
  color: var(--text-soft, #475569);
200
- font-size: 0.76rem;
218
+ font-size: 0.82rem;
201
219
  user-select: none;
202
220
  opacity: 0.65;
203
221
  }
@@ -219,6 +237,7 @@ button {
219
237
  /* Code Syntax Highlighting (Driven by tokens.css) */
220
238
  .token-command { color: var(--syntax-command); font-weight: 500; }
221
239
  .token-keyword { color: var(--syntax-keyword); font-weight: 500; }
240
+ .token-tag { color: var(--syntax-variable, #f43f5e); font-weight: 500; }
222
241
  .token-string { color: var(--syntax-string); }
223
242
  .token-flag { color: var(--syntax-flag); }
224
243
  .token-comment { color: var(--syntax-comment); font-style: italic; }
@@ -231,19 +250,18 @@ button {
231
250
  .token-operator { color: var(--syntax-operator); }
232
251
  .token-punctuation { color: var(--syntax-punctuation); }
233
252
 
234
- /* Tech Pill Inline Code (ChatGPT style) */
253
+ /* Minimal Inline Code */
235
254
  .chat-inline-code {
236
- background: var(--bg-surface-soft);
237
- border: 1px solid var(--border-default);
238
- color: var(--text-primary);
239
- padding: 2px 7px;
240
- border-radius: var(--radius-sm, 6px);
255
+ background: var(--bg-surface-hover, rgba(127, 127, 127, 0.14));
256
+ border: none;
257
+ color: var(--text-chat, var(--text-primary, inherit));
258
+ padding: 1.5px 5px;
259
+ border-radius: var(--radius-xs, 4px);
241
260
  font-family: 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
242
- font-size: 0.86em;
261
+ font-size: 0.88em;
243
262
  font-weight: 500;
244
263
  letter-spacing: -0.01em;
245
- box-shadow: var(--shadow-sm);
246
- display: inline-block;
264
+ box-shadow: none;
247
265
  vertical-align: baseline;
248
266
  }
249
267
 
@@ -798,6 +798,25 @@ export async function clearChatHistory(chatId?: string | null): Promise<number>
798
798
  return invoke<number>('clear_chat_history', { chatId })
799
799
  }
800
800
 
801
+ export async function truncateInteractionsFrom(chatId: string | null | undefined, fromId: number): Promise<number> {
802
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
803
+ const API_BASE = getApiBase();
804
+ try {
805
+ const params = new URLSearchParams();
806
+ if (chatId) params.set('chatId', chatId);
807
+ params.set('fromId', String(fromId));
808
+ const res = await authFetch(`${API_BASE}/interactions/truncate?${params.toString()}`, { method: 'POST' });
809
+ const data = await res.json();
810
+ return data.status === 'ok' ? 1 : 0;
811
+ } catch (e) {
812
+ console.error("Failed to truncate interactions on web:", e);
813
+ return 0;
814
+ }
815
+ }
816
+ const { invoke } = await import('@tauri-apps/api/core')
817
+ return invoke<number>('truncate_interactions_from', { chatId, fromId })
818
+ }
819
+
801
820
  export async function listSavedPictures(): Promise<PictureEntry[]> {
802
821
  if (typeof window === 'undefined' || !isTauriRuntime()) {
803
822
  const API_BASE = getApiBase();
@@ -2402,6 +2421,7 @@ const _apiCheck: MintPlatformApi = {
2402
2421
  saveSubagent,
2403
2422
  deleteSubagent,
2404
2423
  clearChatHistory,
2424
+ truncateInteractionsFrom,
2405
2425
  listSavedPictures,
2406
2426
  deleteSavedPicture,
2407
2427
  generateImages,
@@ -2451,8 +2471,8 @@ export function getBackgroundJob(id: string) { return backgroundRequest<import('
2451
2471
  export function stopBackgroundJob(id: string) { return backgroundRequest<import('../shared/types').BackgroundJob>(`/${encodeURIComponent(id)}/stop`, 'POST') }
2452
2472
  export function deleteBackgroundJob(id: string) { return backgroundRequest<{deleted: boolean}>(`/${encodeURIComponent(id)}`, 'DELETE').then(() => undefined) }
2453
2473
 
2454
- export async function startHtmlPreview(root: string, relativePath: string, mintBrowser = false): Promise<{url: string; jobId: string}> {
2455
- const response = await authFetch(`${getLocalApiBase()}/html-preview`, { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({root, relativePath, mintBrowser}) })
2474
+ export async function startHtmlPreview(root: string, relativePath: string, _mintBrowser = false): Promise<{url: string; jobId: string}> {
2475
+ const response = await authFetch(`${getLocalApiBase()}/html-preview`, { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({root, relativePath}) })
2456
2476
  const value = await response.json()
2457
2477
  if (!response.ok) throw new Error(value.message || 'Could not start HTML preview')
2458
2478
  return value
@@ -25,7 +25,7 @@ installRendererPlatform({ readMcpArtifact: async (id, chat) => {
25
25
 
26
26
  const artifacts: AgentProgress = { type: 'ToolArtifacts', data: { callId: 'capture', warnings: [], artifacts: [{ id: 'browser-image', name: 'result.png', mimeType: 'image/png', kind: 'image', size: 12000, chatId: 'browser-chat', callId: 'capture', server: 'browser', metadata: { url: 'http://localhost:3000/search', width: 960, height: 600, capturedAt: '2026-10-19T10:00:00Z' } }] } }
27
27
  const original: AgentProgress[] = [
28
- { type: 'ToolEnd', data: { action: 'browser_screenshot', callId: 'capture', input: {}, result: 'Screenshot saved as an artifact.', status: 'success' } }, artifacts,
28
+ { type: 'ToolEnd', data: { action: 'view_image', callId: 'capture', input: { path: 'result.png' }, result: 'Screenshot saved as an artifact.', status: 'success' } }, artifacts,
29
29
  // Reopening the same image should not create another gallery card.
30
30
  { ...artifacts, data: { ...artifacts.data, callId: 'view-again' } },
31
31
  { type: 'RunCompleted', data: { summary: { outcome: 'UNVERIFIED' } as any } },
@@ -42,6 +42,9 @@ async function run(){
42
42
  check(document.documentElement.scrollWidth<=innerWidth,'long source message fits viewport')
43
43
  if(location.search.includes('source-preview')){document.getElementById('qa-results')!.textContent='';return}
44
44
  document.dispatchEvent(new KeyboardEvent('keydown',{key:'Escape',bubbles:true}));await waitFor(()=>!document.querySelector('.library-preview'),'Close image preview')
45
+ click('[data-filter="image"]');await waitFor(()=>Boolean(document.querySelector('.library-grid-sizes')),'Image filter shows grid size controls')
46
+ click('[data-grid-size="large"]');await waitFor(()=>Boolean(document.querySelector('.library-items.is-grid-large')),'Grid size switches to large')
47
+ click('[data-grid-size="normal"]');await waitFor(()=>Boolean(document.querySelector('.library-items.is-grid-normal')),'Grid size switches back to normal')
45
48
  click('[data-filter="file"]');await waitFor(()=>document.querySelectorAll('.library-item').length===2,'Files filter')
46
49
  click('[data-preview="notes"]');await waitFor(()=>Boolean(document.querySelector('.library-preview pre')?.textContent?.includes('Regression reference')),'Document preview')
47
50
  check(document.querySelector('.library-preview pre')?.textContent?.includes('Regression reference'),'text preview reads original file')
@@ -19,6 +19,7 @@ try{
19
19
  permission=defer();session=defer();voice.setVoiceMode(true);await wait(50);const live=stream();permission.resolve(live);await wait(50);session.resolve('live');await wait(100);
20
20
  assert(voice.isRecording&&voice.analyserRef.current,'active call exposes its existing audio analyser');
21
21
  eventHandler({type:'audioChunk',data:btoa('\0\0\0\0')});await wait(50);const ctx=contexts.at(-1);assert(ctx.sources.length===1,'normal streamed playback still works');
22
+ eventHandler({type:'interrupted'});await wait(50);assert(ctx.sources[0].stopped&&!voice.isSpeaking&&voice.isRecording,'barge-in interruption stops queued playback immediately without closing mic session');
22
23
  voice.setVoiceMode(false);await wait(100);
23
24
  assert(live.track.stopped&&ctx.state==='closed'&&ctx.sources[0].stopped&&!voice.analyserRef.current,'ending releases microphone, output audio, analyser and audio context');
24
25
  const count=ctx.sources.length;eventHandler({type:'audioChunk',data:btoa('\0\0')});await wait(50);assert(ctx.sources.length===count&&contexts.length===1,'late events cannot restart audio after call ends');
@@ -108,7 +108,7 @@ async function run() {
108
108
  await until(() => document.querySelector<HTMLImageElement>('.artifact-preview-panel img')?.naturalWidth)
109
109
  check(!document.querySelector('.tool-surface-drop-overlay'), 'dropping clears the drag overlay')
110
110
  check(calls.filter(call => call.startsWith('serve:')).length === 0 && calls.filter(call => call.startsWith('image:')).length === 1, 'image reads directly without starting any background preview service')
111
- check(!document.querySelector('[aria-label="Open in Mint Browser (Mint Auto)"]'), 'direct images do not offer an HTTP-only browser action')
111
+ check(!document.querySelector('[aria-label="Open preview"]'), 'direct images do not offer an HTTP-only browser action')
112
112
  await drop('notes.md'); await until(() => document.querySelector('.artifact-preview-panel')?.textContent?.includes('Preview heading') && !document.querySelector('.artifact-preview-panel')?.textContent?.includes('# Preview heading'))
113
113
  check(true, 'Markdown opens rendered content')
114
114
  await drop('main.py'); await until(() => document.querySelector('.artifact-preview-panel')?.textContent?.includes('Hello from Workspace'))
@@ -158,15 +158,6 @@ pub fn run() {
158
158
  native::terminal::write_interactive_terminal,
159
159
  native::terminal::resize_interactive_terminal,
160
160
  native::terminal::stop_interactive_terminal,
161
- native::browser::open_mint_browser,
162
- native::browser::close_mint_browser,
163
- native::browser::show_mint_browser_suggestions,
164
- native::browser::hide_mint_browser_suggestions,
165
- native::browser::get_mint_browser_suggestion_query,
166
- native::browser::navigate_mint_browser,
167
- native::browser::browser_go_back,
168
- native::browser::browser_go_forward,
169
- native::browser::browser_reload,
170
161
  commands::settings::get_runtime_status,
171
162
  commands::settings::detect_system_tools,
172
163
  commands::integrations::reauth_mcp_server,
@@ -228,6 +219,7 @@ pub fn run() {
228
219
  commands::auth::auth_update_profile,
229
220
  commands::auth::auth_upload_avatar,
230
221
  commands::conversation::clear_chat_history,
222
+ commands::conversation::truncate_interactions_from,
231
223
  commands::integrations::list_learned_skills,
232
224
  commands::integrations::add_learned_skill,
233
225
  commands::integrations::delete_learned_skill,
@@ -286,11 +278,6 @@ pub fn run() {
286
278
  native::capture::capture_translation_frame,
287
279
  native::capture::translate_captured_frame,
288
280
  native::actions::get_smart_context,
289
- native::browser::get_browser_tabs,
290
- native::browser::navigate_browser,
291
- native::browser::read_browser_page,
292
- native::browser::click_browser_selector,
293
- native::browser::type_in_browser,
294
281
  native::capture::start_live_translate,
295
282
  native::capture::open_live_translate_controls,
296
283
  native::capture::live_translate_geometry,
@@ -8,12 +8,10 @@ use mint_core::{
8
8
  use serde_json::{Value, json};
9
9
  use tauri::{AppHandle, Emitter, Manager};
10
10
 
11
- use mint_core::browser::{click, navigate, read_page_text, type_text};
12
-
13
11
  const MAX_STEPS: usize = 20;
14
12
  const SYSTEM_PROMPT: &str = r#"You are Mint's native background task agent. Return only JSON:
15
- {"thought":"short progress note","action":"done|propose_folder|propose_write_file|open_url|browser_read|browser_click|browser_type|knowledge_search|propose_bash","target":"path, URL, selector, query, command, or final result","data":"optional file content"}
16
- Use only one action per response. Background tasks never mutate the filesystem or execute shell commands. Use propose_folder, propose_write_file, and propose_bash so Mint can record a proposal for explicit user approval."#;
13
+ {"thought":"short progress note","action":"done|propose_folder|propose_write_file|propose_url|knowledge_search|propose_bash","target":"path, URL, query, command, or final result","data":"optional file content"}
14
+ Use only one action per response. Background tasks never mutate the filesystem or execute shell commands. Use propose_folder, propose_write_file, propose_url, and propose_bash so Mint can record a proposal for explicit user approval."#;
17
15
 
18
16
  #[derive(Debug, Deserialize)]
19
17
  struct AgentAction {
@@ -174,10 +172,18 @@ async fn execute_action(
174
172
  action.target
175
173
  ))
176
174
  }
177
- "open_url" => navigate(config, &action.target).await,
178
- "browser_read" => read_page_text(config).await,
179
- "browser_click" => click(config, &action.target).await,
180
- "browser_type" => type_text(config, &action.target, &action.data).await,
175
+ "propose_url" | "open_url" => {
176
+ store
177
+ .add_artifact(
178
+ &task.id,
179
+ json!({ "type": "url_proposal", "url": action.target, "description": format!("Proposed by native task step {step}; explicit approval required") }),
180
+ )
181
+ .map_err(|error| error.to_string())?;
182
+ Ok(format!(
183
+ "url proposal recorded but not opened: {}",
184
+ action.target
185
+ ))
186
+ }
181
187
  "knowledge_search" => {
182
188
  let hits = KnowledgeStore::open_default()
183
189
  .map_err(|error| error.to_string())?
@@ -27,6 +27,26 @@ pub(crate) enum DesktopStreamEvent {
27
27
  },
28
28
  }
29
29
 
30
+ fn apply_request_overrides_to_config(config: &mut mint_core::MintConfig, chat_req: &ChatRequest) {
31
+ let active_model = config.active_model().to_string();
32
+ if let Some(temp) = chat_req.temperature {
33
+ config.temperature = Some(temp);
34
+ config.set_model_temperature(&active_model, Some(temp));
35
+ }
36
+ if chat_req.thinking_enabled.is_some() || chat_req.thinking_effort.is_some() {
37
+ let (cur_enabled, cur_effort) = config.resolved_thinking();
38
+ let enabled = chat_req.thinking_enabled.unwrap_or(cur_enabled);
39
+ let effort = chat_req
40
+ .thinking_effort
41
+ .as_deref()
42
+ .unwrap_or(cur_effort)
43
+ .to_string();
44
+ config.thinking_enabled = enabled;
45
+ config.thinking_effort = effort.clone();
46
+ config.set_model_thinking(&active_model, enabled, &effort);
47
+ }
48
+ }
49
+
30
50
  #[tauri::command]
31
51
  pub(crate) async fn send_chat_message(
32
52
  app: AppHandle,
@@ -52,6 +72,7 @@ pub(crate) async fn send_chat_message(
52
72
  }
53
73
  let (request, receipt) =
54
74
  mint_core::library::prepare_chat(&request, attachment_metadata.as_ref(), &config).await?;
75
+ apply_request_overrides_to_config(&mut config, &request);
55
76
 
56
77
  if request.message.starts_with("/chat ") {
57
78
  let mut clean_request = request.clone();
@@ -225,6 +246,7 @@ pub(crate) async fn stream_chat_message(
225
246
  }
226
247
  let (request, receipt) =
227
248
  mint_core::library::prepare_chat(&request, attachment_metadata.as_ref(), &config).await?;
249
+ apply_request_overrides_to_config(&mut config, &request);
228
250
 
229
251
  if request.message.starts_with("/chat ") {
230
252
  let mut clean_request = request.clone();
@@ -583,6 +605,22 @@ pub(crate) async fn clear_chat_history(chat_id: Option<String>) -> Result<usize,
583
605
  .await
584
606
  }
585
607
 
608
+ #[tauri::command]
609
+ pub(crate) async fn truncate_interactions_from(
610
+ chat_id: Option<String>,
611
+ from_id: i64,
612
+ ) -> Result<usize, String> {
613
+ with_default_memory(move |memory| {
614
+ memory.truncate_interactions_from(
615
+ chat_id
616
+ .as_deref()
617
+ .unwrap_or(mint_core::DEFAULT_CONVERSATION_ID),
618
+ from_id,
619
+ )
620
+ })
621
+ .await
622
+ }
623
+
586
624
  #[tauri::command]
587
625
  pub(crate) async fn submit_tool_approval(
588
626
  state: tauri::State<'_, ApprovalsState>,
@@ -1,6 +1,5 @@
1
1
  //! Native platform IO, windows, terminal ownership and Desktop integrations.
2
2
  pub(crate) mod actions;
3
- pub(crate) mod browser;
4
3
  pub(crate) mod capture;
5
4
  pub(crate) mod discord_rpc;
6
5
  pub(crate) mod integrations;
@@ -29,62 +29,19 @@ pub async fn smart_context() -> SmartContext {
29
29
  captured_at: unix_timestamp().to_string(),
30
30
  platform: std::env::consts::OS,
31
31
  host: hostname(),
32
- browser: browser_context(&active_window).await,
32
+ browser: browser_context().await,
33
33
  active_window,
34
34
  current_app,
35
35
  selected_text: selected_text(),
36
36
  }
37
37
  }
38
38
 
39
- async fn browser_context(active_window: &Option<Value>) -> Option<Value> {
40
- let is_chromium = active_window
41
- .as_ref()
42
- .and_then(|window| window["appName"].as_str())
43
- .map(str::to_ascii_lowercase)
44
- .is_some_and(|name| {
45
- ["chrome", "chromium", "brave", "edge"]
46
- .iter()
47
- .any(|browser| name.contains(browser))
48
- });
49
- if is_chromium && let Some(context) = chromium_context().await {
50
- return Some(context);
51
- }
39
+ /// Active-tab context comes from the optional browser extension only; Mint no
40
+ /// longer reads a remote-debugging port.
41
+ async fn browser_context() -> Option<Value> {
52
42
  browser_extension_context().await
53
43
  }
54
44
 
55
- async fn chromium_context() -> Option<Value> {
56
- let endpoint = load_config()
57
- .ok()
58
- .and_then(|config| {
59
- config
60
- .extra
61
- .get("browserDebugUrl")
62
- .and_then(Value::as_str)
63
- .map(str::to_owned)
64
- })
65
- .unwrap_or_else(|| "http://127.0.0.1:9222/json/list".into());
66
- let pages: Value = mint_core::HTTP_CLIENT
67
- .clone()
68
- .get(endpoint)
69
- .send()
70
- .await
71
- .ok()?
72
- .json()
73
- .await
74
- .ok()?;
75
- pages
76
- .as_array()?
77
- .iter()
78
- .find(|page| page["type"] == "page")
79
- .map(|page| {
80
- json!({
81
- "title": page["title"],
82
- "url": page["url"],
83
- "source": "chromium-remote-debug"
84
- })
85
- })
86
- }
87
-
88
45
  async fn browser_extension_context() -> Option<Value> {
89
46
  let endpoint = load_config()
90
47
  .ok()