@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
@@ -227,7 +227,12 @@ pub fn execute(req: &SlashRequest, config: &mut MintConfig) -> SlashResponse {
227
227
  agent_mode: true,
228
228
  plan_mode: false,
229
229
  },
230
- "/release-notes" => message(crate::release_notes::text()),
230
+ "/release-notes"
231
+ | "/release_notes"
232
+ | "/release-note"
233
+ | "/release_note"
234
+ | "/releasenotes"
235
+ | "/releasenote" => message(crate::release_notes::text()),
231
236
  "/clear" => SlashResponse::Applied {
232
237
  markdown: "🧹 Conversation history cleared.".into(),
233
238
  effects: vec![SlashEffect::HistoryCleared],
@@ -515,14 +520,64 @@ fn cmd_plan(req: &SlashRequest, rest: &str) -> SlashResponse {
515
520
  markdown: "📋 Plan Mode **OFF**.".into(),
516
521
  effects: vec![SlashEffect::PlanModeChanged { enabled: false }],
517
522
  }
518
- } else if trimmed == "list" {
523
+ } else if trimmed == "list" || trimmed.starts_with("list ") {
524
+ let list_arg = trimmed.trim_start_matches("list").trim();
519
525
  let ws = req.workspace();
520
526
  let plan_dir = ws.join(".agents").join("plans");
521
- let mut entries = Vec::new();
522
- if let Ok(rd) = std::fs::read_dir(&plan_dir) {
523
- for entry in rd.flatten() {
524
- let path = entry.path();
525
- if path.is_file() {
527
+ if !list_arg.is_empty() {
528
+ let arg = list_arg;
529
+ let mut found_content = None;
530
+ if let Ok(rd) = std::fs::read_dir(&plan_dir) {
531
+ let mut files: Vec<_> = rd
532
+ .flatten()
533
+ .map(|e| e.path())
534
+ .filter(|p| p.is_file())
535
+ .collect();
536
+ files.sort_by(|a, b| b.file_name().cmp(&a.file_name()));
537
+ if let Ok(idx) = arg.parse::<usize>() {
538
+ if let Some(path) = idx.checked_sub(1).and_then(|i| files.get(i)) {
539
+ if let Ok(content) = std::fs::read_to_string(path) {
540
+ let name = path
541
+ .file_name()
542
+ .and_then(|n| n.to_str())
543
+ .unwrap_or_default()
544
+ .to_string();
545
+ found_content = Some((name, content));
546
+ }
547
+ }
548
+ } else {
549
+ for path in &files {
550
+ let name = path
551
+ .file_name()
552
+ .and_then(|n| n.to_str())
553
+ .unwrap_or_default()
554
+ .to_string();
555
+ if name.contains(arg) {
556
+ if let Ok(content) = std::fs::read_to_string(path) {
557
+ found_content = Some((name, content));
558
+ break;
559
+ }
560
+ }
561
+ }
562
+ }
563
+ }
564
+ match found_content {
565
+ Some((name, content)) => message(format!("### Plan: {}\n\n{}", name, content)),
566
+ None => error(format!(
567
+ "No saved plan matching \"{}\" under `.agents/plans/`",
568
+ arg
569
+ )),
570
+ }
571
+ } else {
572
+ let mut entries = Vec::new();
573
+ if let Ok(rd) = std::fs::read_dir(&plan_dir) {
574
+ let mut files: Vec<_> = rd
575
+ .flatten()
576
+ .map(|e| e.path())
577
+ .filter(|p| p.is_file())
578
+ .collect();
579
+ files.sort_by(|a, b| b.file_name().cmp(&a.file_name()));
580
+ for (idx, path) in files.iter().enumerate() {
526
581
  let name = path
527
582
  .file_name()
528
583
  .and_then(|n| n.to_str())
@@ -530,16 +585,23 @@ fn cmd_plan(req: &SlashRequest, rest: &str) -> SlashResponse {
530
585
  .to_string();
531
586
  let first_line = std::fs::read_to_string(&path)
532
587
  .ok()
533
- .and_then(|s| s.lines().next().map(|l| l.trim().to_string()))
588
+ .and_then(|s| {
589
+ s.lines()
590
+ .find(|l| !l.trim().is_empty())
591
+ .map(|l| l.trim().trim_start_matches('#').trim().to_string())
592
+ })
534
593
  .unwrap_or_default();
535
- entries.push(format!("- **{}**: {}", name, first_line));
594
+ entries.push(format!("- **[{}] `{}`**: {}", idx + 1, name, first_line));
536
595
  }
537
596
  }
538
- }
539
- if entries.is_empty() {
540
- message("No saved plans found under `.agents/plans/`.")
541
- } else {
542
- message(format!("### Saved Plans\n\n{}", entries.join("\n")))
597
+ if entries.is_empty() {
598
+ message("No saved plans found under `.agents/plans/`.")
599
+ } else {
600
+ message(format!(
601
+ "### Saved Plans\n\n{}\n\n*Type `/plan list <number>` or `/plan show <name>` to view.*",
602
+ entries.join("\n")
603
+ ))
604
+ }
543
605
  }
544
606
  } else if let Some(show_arg) = trimmed.strip_prefix("show") {
545
607
  let arg = show_arg.trim();
@@ -547,17 +609,35 @@ fn cmd_plan(req: &SlashRequest, rest: &str) -> SlashResponse {
547
609
  let plan_dir = ws.join(".agents").join("plans");
548
610
  let mut found_content = None;
549
611
  if let Ok(rd) = std::fs::read_dir(&plan_dir) {
550
- for entry in rd.flatten() {
551
- let path = entry.path();
552
- let name = path
553
- .file_name()
554
- .and_then(|n| n.to_str())
555
- .unwrap_or_default()
556
- .to_string();
557
- if name.contains(arg) {
558
- if let Ok(content) = std::fs::read_to_string(&path) {
612
+ let mut files: Vec<_> = rd
613
+ .flatten()
614
+ .map(|e| e.path())
615
+ .filter(|p| p.is_file())
616
+ .collect();
617
+ files.sort_by(|a, b| b.file_name().cmp(&a.file_name()));
618
+ if let Ok(idx) = arg.parse::<usize>() {
619
+ if let Some(path) = idx.checked_sub(1).and_then(|i| files.get(i)) {
620
+ if let Ok(content) = std::fs::read_to_string(path) {
621
+ let name = path
622
+ .file_name()
623
+ .and_then(|n| n.to_str())
624
+ .unwrap_or_default()
625
+ .to_string();
559
626
  found_content = Some((name, content));
560
- break;
627
+ }
628
+ }
629
+ } else {
630
+ for path in &files {
631
+ let name = path
632
+ .file_name()
633
+ .and_then(|n| n.to_str())
634
+ .unwrap_or_default()
635
+ .to_string();
636
+ if name.contains(arg) {
637
+ if let Ok(content) = std::fs::read_to_string(path) {
638
+ found_content = Some((name, content));
639
+ break;
640
+ }
561
641
  }
562
642
  }
563
643
  }
@@ -927,16 +1007,33 @@ fn capitalize_effort(s: &str) -> String {
927
1007
  fn cmd_thinking(rest: &str, config: &mut MintConfig) -> SlashResponse {
928
1008
  let model = config.active_model().to_string();
929
1009
  let supported = config.is_thinking_supported();
1010
+ let has_native = MintConfig::has_native_thinking_api(&config.ai_provider, &model);
1011
+ let mode_desc = if !supported {
1012
+ "Non-text model (image/audio/embedding)"
1013
+ } else if has_native {
1014
+ "Native Reasoning API"
1015
+ } else {
1016
+ "Prompted CoT (<think>)"
1017
+ };
930
1018
  let (current_enabled, current_effort) = config.resolved_thinking();
931
1019
  let raw = rest.trim().to_ascii_lowercase();
932
1020
 
1021
+ if !supported && raw != "off" && raw != "disable" && raw != "false" {
1022
+ return message(format!(
1023
+ "⚠️ **Thinking is not available for `{model}`**\n\n\
1024
+ `{model}` is classified as a non-text model (image/audio/embedding), which does not support Chain-of-Thought reasoning."
1025
+ ));
1026
+ }
1027
+
933
1028
  if raw.is_empty() {
934
- let status_label = if !supported {
935
- "Not supported by active model".to_string()
936
- } else if current_enabled {
937
- format!("ON (Effort: {})", capitalize_effort(current_effort))
1029
+ let status_label = if current_enabled {
1030
+ format!(
1031
+ "ON ({}, Effort: {})",
1032
+ mode_desc,
1033
+ capitalize_effort(current_effort)
1034
+ )
938
1035
  } else {
939
- "OFF".to_string()
1036
+ format!("OFF ({mode_desc})")
940
1037
  };
941
1038
 
942
1039
  let mut choices = Vec::new();
@@ -976,14 +1073,15 @@ fn cmd_thinking(rest: &str, config: &mut MintConfig) -> SlashResponse {
976
1073
  "⚠️ Thinking is **not supported** by the current active model.".to_string()
977
1074
  } else if current_enabled {
978
1075
  format!(
979
- "✅ Thinking is **ON** (Effort: **{}**)",
980
- capitalize_effort(current_effort)
1076
+ "✅ Thinking is **ON** (Effort: **{}**, Mode: `{}`)",
1077
+ capitalize_effort(current_effort),
1078
+ mode_desc
981
1079
  )
982
1080
  } else {
983
- "⏸️ Thinking is **OFF**".to_string()
1081
+ format!("⏸️ Thinking is **OFF** (Mode: `{mode_desc}`)")
984
1082
  };
985
1083
  return message(format!(
986
- "🧠 **Thinking Status**\n\n- Active Model: `{model}`\n- Supported: **{supported}**\n- State: {status_label}\n\nUsage: `/thinking [on|off|low|medium|high|extra_high]`"
1084
+ "🧠 **Thinking Status**\n\n- Active Model: `{model}`\n- Supported: **{supported}** (`{mode_desc}`)\n- State: {status_label}\n\nUsage: `/thinking [on|off|low|medium|high|extra_high]`"
987
1085
  ));
988
1086
  }
989
1087
 
@@ -1019,16 +1117,11 @@ fn cmd_thinking(rest: &str, config: &mut MintConfig) -> SlashResponse {
1019
1117
  config.thinking_enabled = new_enabled;
1020
1118
  config.thinking_effort = new_effort.clone();
1021
1119
 
1022
- let text = if !supported {
1023
- format!(
1024
- "🧠 Updated thinking preference for `{model}` to **{}** (Effort: **{}**).\n*Note: `{model}` may not natively emit reasoning tokens.*",
1025
- if new_enabled { "ON" } else { "OFF" },
1026
- capitalize_effort(&new_effort)
1027
- )
1028
- } else if new_enabled {
1120
+ let text = if new_enabled {
1029
1121
  format!(
1030
- "🧠 Thinking **ON** for `{model}` (Effort: **{}**).",
1031
- capitalize_effort(&new_effort)
1122
+ "🧠 Thinking **ON** for `{model}` (Effort: **{}**, Mode: `{}`).",
1123
+ capitalize_effort(&new_effort),
1124
+ mode_desc
1032
1125
  )
1033
1126
  } else {
1034
1127
  format!("🧠 Thinking **OFF** for `{model}`.")
@@ -1372,17 +1465,7 @@ fn cmd_steps(rest: &str, config: &mut MintConfig) -> SlashResponse {
1372
1465
  }
1373
1466
 
1374
1467
  fn cmd_browser(rest: &str, config: &mut MintConfig) -> SlashResponse {
1375
- let raw = rest.trim();
1376
- let current_enabled = config
1377
- .extra
1378
- .get("browserAutomationEnabled")
1379
- .and_then(serde_json::Value::as_bool)
1380
- != Some(false);
1381
- let current_mode = config
1382
- .extra
1383
- .get("browserAgentMode")
1384
- .and_then(serde_json::Value::as_str)
1385
- .unwrap_or("headless");
1468
+ let raw = rest.trim().to_ascii_lowercase();
1386
1469
  let custom_exe = config
1387
1470
  .extra
1388
1471
  .get("browserExecutable")
@@ -1393,149 +1476,22 @@ fn cmd_browser(rest: &str, config: &mut MintConfig) -> SlashResponse {
1393
1476
  } else {
1394
1477
  "Auto-detect (Chrome / Chromium / Edge)"
1395
1478
  };
1396
- let width = config
1397
- .extra
1398
- .get("browserViewportWidth")
1399
- .and_then(serde_json::Value::as_u64)
1400
- .unwrap_or(1440);
1401
- let height = config
1402
- .extra
1403
- .get("browserViewportHeight")
1404
- .and_then(serde_json::Value::as_u64)
1405
- .unwrap_or(900);
1406
- let debug_url = config
1407
- .extra
1408
- .get("browserDebugUrl")
1409
- .and_then(serde_json::Value::as_str)
1410
- .unwrap_or("http://127.0.0.1:9222/json/list");
1411
1479
 
1412
- if raw.is_empty() {
1413
- return SlashResponse::NeedsChoice {
1414
- command: "/browser".into(),
1415
- title: format!(
1416
- "🌐 Browser Automation Configuration\n• Tools: {}\n• Mode: {}\nSelect an option to configure or run `/browser [on|off|headless|headed|status]`",
1417
- if current_enabled {
1418
- "Enabled (on)"
1419
- } else {
1420
- "Disabled (off)"
1421
- },
1422
- if current_mode == "headless" {
1423
- "headless Browser"
1424
- } else {
1425
- "headed Automation"
1426
- }
1427
- ),
1428
- options: vec![
1429
- SlashChoice {
1430
- label: format!(
1431
- "on — Enable browser automation tools{}",
1432
- if current_enabled { " (current)" } else { "" }
1433
- ),
1434
- value: "on".into(),
1435
- },
1436
- SlashChoice {
1437
- label: format!(
1438
- "off — Disable browser automation tools{}",
1439
- if !current_enabled { " (current)" } else { "" }
1440
- ),
1441
- value: "off".into(),
1442
- },
1443
- SlashChoice {
1444
- label: format!(
1445
- "headless Browser — Run silently in background without window{}",
1446
- if current_mode == "headless" {
1447
- " (current)"
1448
- } else {
1449
- ""
1450
- }
1451
- ),
1452
- value: "headless".into(),
1453
- },
1454
- SlashChoice {
1455
- label: format!(
1456
- "headed Automation — Show browser window on screen{}",
1457
- if current_mode == "headed" {
1458
- " (current)"
1459
- } else {
1460
- ""
1461
- }
1462
- ),
1463
- value: "headed".into(),
1464
- },
1465
- SlashChoice {
1466
- label: "status — View current configuration & detected Chrome".into(),
1467
- value: "status".into(),
1468
- },
1469
- ],
1480
+ if !raw.is_empty() && raw != "status" {
1481
+ return SlashResponse::Message {
1482
+ markdown: "Usage: `/browser` or `/browser status`.\n\n*Note: Agent tools `browser_*` have been superseded by headless Chrome shell execution and `mint browser run`.*".into(),
1470
1483
  };
1471
1484
  }
1472
1485
 
1473
- let normalized = raw.to_ascii_lowercase();
1474
- match normalized.as_str() {
1475
- "status" => SlashResponse::Message {
1476
- markdown: format!(
1477
- "### 🌐 Browser Automation Status\n\n\
1478
- - **Tools Enabled**: {}\n\
1479
- - **Browser Mode**: {}\n\
1480
- - **Viewport Size**: `{}` × `{}`\n\
1481
- - **Executable**: `{}`\n\
1482
- - **Debugging Endpoint**: `{}`\n\n\
1483
- *Use `/browser on` or `/browser off` to toggle tools, and `/browser headless` or `/browser headed` to change display mode.*",
1484
- if current_enabled {
1485
- "🟢 **Enabled** (`on`)"
1486
- } else {
1487
- "🔴 **Disabled** (`off`)"
1488
- },
1489
- if current_mode == "headless" {
1490
- "🕶️ `headless Browser` (runs in background)"
1491
- } else {
1492
- "🖥️ `headed Automation` (shows window)"
1493
- },
1494
- width,
1495
- height,
1496
- exe_display,
1497
- debug_url
1498
- ),
1499
- },
1500
- "on" | "enable" => {
1501
- config
1502
- .extra
1503
- .insert("browserAutomationEnabled".into(), serde_json::json!(true));
1504
- SlashResponse::Applied {
1505
- markdown: "🟢 **Browser automation tools enabled (`on`)**.\nAgent can inspect web pages and capture screenshots using Headless Chromium.".into(),
1506
- effects: vec![SlashEffect::ConfigChanged],
1507
- }
1508
- }
1509
- "off" | "disable" => {
1510
- config
1511
- .extra
1512
- .insert("browserAutomationEnabled".into(), serde_json::json!(false));
1513
- SlashResponse::Applied {
1514
- markdown: "🔴 **Browser automation tools disabled (`off`)**.".into(),
1515
- effects: vec![SlashEffect::ConfigChanged],
1516
- }
1517
- }
1518
- "headless" | "headless browser" => {
1519
- config
1520
- .extra
1521
- .insert("browserAgentMode".into(), serde_json::json!("headless"));
1522
- SlashResponse::Applied {
1523
- markdown: "🕶️ **Browser mode set to `headless Browser`**.\nAutomation will run silently in the background without opening a window.".into(),
1524
- effects: vec![SlashEffect::ConfigChanged],
1525
- }
1526
- }
1527
- "headed" | "headed automation" => {
1528
- config
1529
- .extra
1530
- .insert("browserAgentMode".into(), serde_json::json!("headed"));
1531
- SlashResponse::Applied {
1532
- markdown: "🖥️ **Browser mode set to `headed Automation`**.\nAutomation will display the browser window on screen in real time.".into(),
1533
- effects: vec![SlashEffect::ConfigChanged],
1534
- }
1535
- }
1536
- _ => SlashResponse::Message {
1537
- markdown: "Usage: `/browser [on|off|headless|headed|status]`".into(),
1538
- },
1486
+ SlashResponse::Message {
1487
+ markdown: format!(
1488
+ "### 🌐 Browser Automation Status\n\n\
1489
+ - **Engine**: Headless Chromium (CLI shell execution)\n\
1490
+ - **Executable**: `{}`\n\
1491
+ - **Interactive Runner**: `mint browser run --file <workflow.json>`\n\n\
1492
+ Browsing is executed via `google-chrome --headless=new` through `run_shell` or bounded headless workflows with `mint browser run`.",
1493
+ exe_display
1494
+ ),
1539
1495
  }
1540
1496
  }
1541
1497
 
@@ -2843,17 +2799,24 @@ mod tests {
2843
2799
  #[test]
2844
2800
  fn release_notes_are_available_on_every_surface() {
2845
2801
  for surface in ["cli", "desktop", "web"] {
2846
- match execute(
2847
- &req_surface("/release-notes", surface),
2848
- &mut MintConfig::default(),
2849
- ) {
2850
- SlashResponse::Message { markdown } => {
2851
- assert!(markdown.starts_with("# Release Notes - Mint Agent"));
2802
+ for cmd in [
2803
+ "/release-notes",
2804
+ "/release_notes",
2805
+ "/release-note",
2806
+ "/release_note",
2807
+ ] {
2808
+ match execute(&req_surface(cmd, surface), &mut MintConfig::default()) {
2809
+ SlashResponse::Message { markdown } => {
2810
+ assert!(
2811
+ markdown.starts_with("# Release Notes - Mint Agent"),
2812
+ "failed for command {cmd} on {surface}"
2813
+ );
2814
+ }
2815
+ other => panic!(
2816
+ "expected release notes for {cmd} on {surface}, got {}",
2817
+ serde_json::to_value(other).unwrap()
2818
+ ),
2852
2819
  }
2853
- other => panic!(
2854
- "expected release notes on {surface}, got {}",
2855
- serde_json::to_value(other).unwrap()
2856
- ),
2857
2820
  }
2858
2821
  }
2859
2822
  }
@@ -3239,6 +3202,46 @@ mod tests {
3239
3202
  serde_json::to_value(other)
3240
3203
  ),
3241
3204
  }
3205
+
3206
+ let temp = std::env::temp_dir().join(format!("mint-core-plan-test-{}", std::process::id()));
3207
+ let plans_dir = temp.join(".agents").join("plans");
3208
+ std::fs::create_dir_all(&plans_dir).unwrap();
3209
+ std::fs::write(
3210
+ plans_dir.join("20261102-190000-arch.md"),
3211
+ "# Architecture Plan\n1. Module seam",
3212
+ )
3213
+ .unwrap();
3214
+
3215
+ let req_ws = |input: &str| SlashRequest {
3216
+ input: input.to_string(),
3217
+ surface: Some("cli".to_string()),
3218
+ cwd: Some(temp.to_string_lossy().to_string()),
3219
+ chat_id: None,
3220
+ };
3221
+
3222
+ match execute(&req_ws("/plan list"), &mut cfg) {
3223
+ SlashResponse::Message { markdown } => {
3224
+ assert!(markdown.contains("Architecture Plan"));
3225
+ assert!(markdown.contains("20261102-190000-arch.md"));
3226
+ }
3227
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3228
+ }
3229
+
3230
+ match execute(&req_ws("/plan list 1"), &mut cfg) {
3231
+ SlashResponse::Message { markdown } => {
3232
+ assert!(markdown.contains("# Architecture Plan"));
3233
+ }
3234
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3235
+ }
3236
+
3237
+ match execute(&req_ws("/plan show 1"), &mut cfg) {
3238
+ SlashResponse::Message { markdown } => {
3239
+ assert!(markdown.contains("# Architecture Plan"));
3240
+ }
3241
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3242
+ }
3243
+
3244
+ let _ = std::fs::remove_dir_all(temp);
3242
3245
  }
3243
3246
 
3244
3247
  #[test]
@@ -3419,15 +3422,25 @@ mod tests {
3419
3422
  other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3420
3423
  }
3421
3424
 
3422
- // 5. Non-reasoning model accepts preference with advisory note
3425
+ // 5. Non-native chat model accepts preference with Prompted CoT mode
3423
3426
  cfg.ai_provider = "openai".into();
3424
3427
  cfg.openai_model = "gpt-4o".into();
3425
3428
  match execute(&req("/thinking on"), &mut cfg) {
3426
3429
  SlashResponse::Applied { markdown, .. } => {
3427
- assert!(markdown.contains("may not natively emit reasoning tokens"));
3430
+ assert!(markdown.contains("Prompted CoT (<think>)"));
3428
3431
  }
3429
3432
  other => panic!("expected Applied, got {:?}", serde_json::to_value(other)),
3430
3433
  }
3434
+
3435
+ // 6. Non-text media model rejects enabling thinking
3436
+ cfg.ai_provider = "gemini".into();
3437
+ cfg.gemini_model = "nano-banana-pro-preview".into();
3438
+ match execute(&req("/thinking on"), &mut cfg) {
3439
+ SlashResponse::Message { markdown } => {
3440
+ assert!(markdown.contains("Thinking is not available"));
3441
+ }
3442
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3443
+ }
3431
3444
  }
3432
3445
 
3433
3446
  #[tokio::test]
@@ -3560,80 +3573,30 @@ mod tests {
3560
3573
  fn browser_slash_command_behavior() {
3561
3574
  let mut cfg = MintConfig::default();
3562
3575
 
3563
- // 1. Bare /browser returns NeedsChoice with options
3576
+ // 1. Bare /browser returns status message
3564
3577
  match execute(&req("/browser"), &mut cfg) {
3565
- SlashResponse::NeedsChoice {
3566
- command, options, ..
3567
- } => {
3568
- assert_eq!(command, "/browser");
3569
- assert!(options.iter().any(|o| o.value == "on"));
3570
- assert!(options.iter().any(|o| o.value == "off"));
3571
- assert!(options.iter().any(|o| o.value == "headless"));
3572
- assert!(options.iter().any(|o| o.value == "headed"));
3573
- assert!(options.iter().any(|o| o.value == "status"));
3578
+ SlashResponse::Message { markdown } => {
3579
+ assert!(markdown.contains("Browser Automation Status"));
3580
+ assert!(markdown.contains("Headless Chromium"));
3574
3581
  }
3575
- other => panic!(
3576
- "expected NeedsChoice, got {:?}",
3577
- serde_json::to_value(other)
3578
- ),
3582
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3579
3583
  }
3580
3584
 
3581
- // 2. /browser status returns informative message
3585
+ // 2. /browser status also returns informative message
3582
3586
  match execute(&req("/browser status"), &mut cfg) {
3583
3587
  SlashResponse::Message { markdown } => {
3584
3588
  assert!(markdown.contains("Browser Automation Status"));
3585
- assert!(markdown.contains("Enabled"));
3586
- assert!(markdown.contains("headless Browser"));
3589
+ assert!(markdown.contains("mint browser run"));
3587
3590
  }
3588
3591
  other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3589
3592
  }
3590
3593
 
3591
- // 3. /browser off disables tools
3592
- match execute(&req("/browser off"), &mut cfg) {
3593
- SlashResponse::Applied { effects, .. } => {
3594
- assert!(effects.contains(&SlashEffect::ConfigChanged));
3595
- assert_eq!(
3596
- cfg.extra.get("browserAutomationEnabled"),
3597
- Some(&serde_json::json!(false))
3598
- );
3599
- }
3600
- other => panic!("expected Applied, got {:?}", serde_json::to_value(other)),
3601
- }
3602
-
3603
- // 4. /browser on re-enables tools
3594
+ // 3. /browser with invalid subcommand gives usage
3604
3595
  match execute(&req("/browser on"), &mut cfg) {
3605
- SlashResponse::Applied { effects, .. } => {
3606
- assert!(effects.contains(&SlashEffect::ConfigChanged));
3607
- assert_eq!(
3608
- cfg.extra.get("browserAutomationEnabled"),
3609
- Some(&serde_json::json!(true))
3610
- );
3611
- }
3612
- other => panic!("expected Applied, got {:?}", serde_json::to_value(other)),
3613
- }
3614
-
3615
- // 5. /browser headed switches mode
3616
- match execute(&req("/browser headed"), &mut cfg) {
3617
- SlashResponse::Applied { effects, .. } => {
3618
- assert!(effects.contains(&SlashEffect::ConfigChanged));
3619
- assert_eq!(
3620
- cfg.extra.get("browserAgentMode"),
3621
- Some(&serde_json::json!("headed"))
3622
- );
3623
- }
3624
- other => panic!("expected Applied, got {:?}", serde_json::to_value(other)),
3625
- }
3626
-
3627
- // 6. /browser headless switches mode back
3628
- match execute(&req("/browser headless"), &mut cfg) {
3629
- SlashResponse::Applied { effects, .. } => {
3630
- assert!(effects.contains(&SlashEffect::ConfigChanged));
3631
- assert_eq!(
3632
- cfg.extra.get("browserAgentMode"),
3633
- Some(&serde_json::json!("headless"))
3634
- );
3596
+ SlashResponse::Message { markdown } => {
3597
+ assert!(markdown.contains("Usage: `/browser` or `/browser status`"));
3635
3598
  }
3636
- other => panic!("expected Applied, got {:?}", serde_json::to_value(other)),
3599
+ other => panic!("expected Message, got {:?}", serde_json::to_value(other)),
3637
3600
  }
3638
3601
  }
3639
3602
  }
@@ -69,7 +69,12 @@ pub fn popular_models_for_provider(provider: &str) -> &'static [&'static str] {
69
69
  }
70
70
  }
71
71
 
72
- pub const DEEPSEEK_MODEL_PRESETS: &[&str] = &["deepseek-chat", "deepseek-reasoner"];
72
+ pub const DEEPSEEK_MODEL_PRESETS: &[&str] = &[
73
+ "deepseek-flash",
74
+ "deepseek-v4-pro",
75
+ "deepseek-chat",
76
+ "deepseek-reasoner",
77
+ ];
73
78
 
74
79
  pub const HUGGINGFACE_MODEL_PRESETS: &[&str] = &[
75
80
  "Qwen/Qwen3.6-27B",
@@ -487,6 +487,7 @@ pub fn start_web_frontend(
487
487
  }
488
488
  let mut program = Command::new(if cfg!(windows) { "npm.cmd" } else { "npm" });
489
489
  program.args(["run", script]);
490
+ program.env("VITE_CONFIG_NATIVE_IGNORE_WARNING", "true");
490
491
  #[cfg(unix)]
491
492
  {
492
493
  use std::os::unix::process::CommandExt;