@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.
- package/Cargo.lock +6 -6
- package/Cargo.toml +2 -2
- package/README.md +8 -2
- package/Release_Note.md +222 -71
- package/crates/mint-cli/src/agent/diff_render.rs +66 -44
- package/crates/mint-cli/src/agent/live_status.rs +21 -4
- package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
- package/crates/mint-cli/src/agent.rs +25 -10
- package/crates/mint-cli/src/commands/agent.rs +4 -92
- package/crates/mint-cli/src/commands/browser.rs +2 -15
- package/crates/mint-cli/src/commands/integrations.rs +3 -3
- package/crates/mint-cli/src/commands/mod.rs +0 -3
- package/crates/mint-cli/src/commands/tailnet_web.rs +1 -0
- package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
- package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
- package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
- package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
- package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
- package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
- package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
- package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
- package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
- package/crates/mint-cli/src/interactive/command_ui.rs +53 -5
- package/crates/mint-cli/src/interactive/composer.rs +186 -0
- package/crates/mint-cli/src/interactive/format.rs +78 -3
- package/crates/mint-cli/src/interactive/input_box.rs +61 -1
- package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
- package/crates/mint-cli/src/interactive/slash_commands.rs +648 -371
- package/crates/mint-cli/src/interactive/tool_activity.rs +93 -20
- package/crates/mint-cli/src/interactive.rs +37 -0
- package/crates/mint-cli/src/main.rs +6 -3
- package/crates/mint-cli/src/markdown.rs +2 -37
- package/crates/mint-cli/src/onboard.rs +700 -282
- package/crates/mint-cli/src/setup.rs +1342 -624
- package/crates/mint-cli/src/terminal_theme.rs +159 -35
- package/crates/mint-cli/tests/library_intake.rs +1 -0
- package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
- package/crates/mint-core/src/agent/chat/custom.rs +149 -0
- package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
- package/crates/mint-core/src/agent/chat/mod.rs +857 -0
- package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
- package/crates/mint-core/src/agent/chat/openai.rs +582 -0
- package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
- package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
- package/crates/mint-core/src/agent/memory.rs +56 -2
- package/crates/mint-core/src/agent/tasks.rs +2 -2
- package/crates/mint-core/src/api_server/routes/chat.rs +24 -2
- package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
- package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
- package/crates/mint-core/src/api_server/routes/sessions.rs +21 -0
- package/crates/mint-core/src/avatar_bridge.rs +0 -22
- package/crates/mint-core/src/browser/cdp.rs +10 -4
- package/crates/mint-core/src/browser/headless.rs +582 -0
- package/crates/mint-core/src/browser/input.rs +7 -62
- package/crates/mint-core/src/browser/interact.rs +0 -14
- package/crates/mint-core/src/browser/mod.rs +8 -29
- package/crates/mint-core/src/browser/navigate.rs +2 -36
- package/crates/mint-core/src/browser/runtime.rs +2 -4
- package/crates/mint-core/src/browser/session.rs +50 -466
- package/crates/mint-core/src/browser/workflow.rs +142 -32
- package/crates/mint-core/src/cron/store.rs +2 -2
- package/crates/mint-core/src/integrations/mcp.rs +6 -8
- package/crates/mint-core/src/lib.rs +0 -5
- package/crates/mint-core/src/media/gemini_live.rs +636 -86
- package/crates/mint-core/src/media/library/migration.rs +26 -0
- package/crates/mint-core/src/media/library/tests.rs +1 -1
- package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
- package/crates/mint-core/src/media/pictures.rs +1 -1
- package/crates/mint-core/src/media/tool_images.rs +92 -1
- package/crates/mint-core/src/mods/manager.rs +101 -35
- package/crates/mint-core/src/orchestration/context_render.rs +441 -24
- package/crates/mint-core/src/orchestration/decision_parsing.rs +531 -16
- package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
- package/crates/mint-core/src/orchestration/loop_guard.rs +145 -0
- package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
- package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
- package/crates/mint-core/src/orchestration/mod.rs +320 -4249
- package/crates/mint-core/src/orchestration/reliability.rs +67 -27
- package/crates/mint-core/src/orchestration/review_regressions.rs +5 -0
- package/crates/mint-core/src/orchestration/tests.rs +1665 -0
- package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
- package/crates/mint-core/src/orchestration/tools/files.rs +1 -0
- package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
- package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
- package/crates/mint-core/src/orchestration/tools/shell.rs +129 -58
- package/crates/mint-core/src/orchestration/truncation.rs +170 -13
- package/crates/mint-core/src/orchestration/types.rs +648 -0
- package/crates/mint-core/src/orchestration/verification.rs +0 -3
- package/crates/mint-core/src/orchestration/workspace_helpers.rs +24 -6
- package/crates/mint-core/src/prompts/agent.rs +52 -76
- package/crates/mint-core/src/prompts/tool_catalog.rs +8 -151
- package/crates/mint-core/src/search/files.rs +20 -0
- package/crates/mint-core/src/slash/mod.rs +228 -265
- package/crates/mint-core/src/slash/models.rs +6 -1
- package/crates/mint-core/src/system/bg_shell.rs +1 -0
- package/crates/mint-core/src/system/config.rs +176 -34
- package/crates/mint-mod-runtime/src/lib.rs +37 -23
- package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
- package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
- package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
- package/out/web/assets/{CliSessionsView-MI8kXMAb.js → CliSessionsView-z5i6qGyb.js} +1 -1
- package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
- package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
- package/out/web/assets/{CommandPalette-BD8SlTE5.js → CommandPalette-DaKlzbKs.js} +1 -1
- package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
- package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
- package/out/web/assets/{ImageStudioPanel-BP7N4rLr.js → ImageStudioPanel-B5N7TjeB.js} +1 -1
- package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
- package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
- package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
- package/out/web/assets/{McpRegistryPicker-CoS83vtc.js → McpRegistryPicker-DnXPlzI7.js} +1 -1
- package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
- package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
- package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
- package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
- package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
- package/out/web/assets/{PluginsView-jBYmcKh4.js → PluginsView-DoTg9MVa.js} +1 -1
- package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
- package/out/web/assets/{ScheduledTasksView-5uw9-V9H.js → ScheduledTasksView-BD5DVPkZ.js} +1 -1
- package/out/web/assets/{SelectField-DXBQtrUK.js → SelectField-Cy6CghrU.js} +1 -1
- package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
- package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
- package/out/web/assets/{SkillsView-C-gp9J7m.js → SkillsView-CIeWwq5z.js} +1 -1
- package/out/web/assets/StockCard-DxUciKyp.js +1 -0
- package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
- package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
- package/out/web/assets/{UiFeatureCard-6BwxTOCe.js → UiFeatureCard-CdY0hGWy.js} +1 -1
- package/out/web/assets/{UiGridCard-DvZcLNxb.js → UiGridCard-BBK3I5hC.js} +1 -1
- package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
- package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
- package/out/web/assets/{VeoStudioPanel-DfsOJKv0.js → VeoStudioPanel-Co6-wEWM.js} +2 -2
- package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
- package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
- package/out/web/assets/{abnfDiagram-VCTEODGH-BOo3Ckng.js → abnfDiagram-VCTEODGH-CMfR95N2.js} +1 -1
- package/out/web/assets/{architecture-7GRP2DOG-ZOwheW3n.js → architecture-7GRP2DOG-DhAM4HyO.js} +1 -1
- package/out/web/assets/{architectureDiagram-5GKGNRK7-DC2FDzVd.js → architectureDiagram-5GKGNRK7-Yk3TUJ_F.js} +1 -1
- package/out/web/assets/{blockDiagram-I7D4REHJ-BrKFWdAH.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +1 -1
- package/out/web/assets/{c4Diagram-7LVT6UL2-BHTHK1Yd.js → c4Diagram-7LVT6UL2-Bk9x7N-8.js} +1 -1
- package/out/web/assets/{chunk-4HAMMTFA-BYFkZwNj.js → chunk-4HAMMTFA-Dx5fk1_0.js} +1 -1
- package/out/web/assets/{chunk-75Z2AOVW-BSKfSKSA.js → chunk-75Z2AOVW-BszTQoM4.js} +1 -1
- package/out/web/assets/{chunk-DU6HZSFF-vIhsiW6n.js → chunk-DU6HZSFF-DK-As3rk.js} +1 -1
- package/out/web/assets/{chunk-F27PBJKO-BlYpW9xq.js → chunk-F27PBJKO-LmncZZIS.js} +1 -1
- package/out/web/assets/{chunk-GMAD6QVW-BIBz_Ug5.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +1 -1
- package/out/web/assets/{chunk-GVQU2GXP-NPSHxeqC.js → chunk-GVQU2GXP-Cno3ulje.js} +1 -1
- package/out/web/assets/{chunk-IMKFNOWR-YlJK8_Fp.js → chunk-IMKFNOWR-bIzfY9Jc.js} +1 -1
- package/out/web/assets/{chunk-L3NEJ4N5-DMYi4-af.js → chunk-L3NEJ4N5-Dl6eOa0D.js} +1 -1
- package/out/web/assets/{chunk-OSK3NFVY-Begd3-jA.js → chunk-OSK3NFVY-BaUGJ-cM.js} +1 -1
- package/out/web/assets/{chunk-P2QGCYS3-D1I4xFHN.js → chunk-P2QGCYS3-_066ndhH.js} +1 -1
- package/out/web/assets/{chunk-POPQ4Y6H-CafZZzNE.js → chunk-POPQ4Y6H-YT1AKhTv.js} +1 -1
- package/out/web/assets/{chunk-PWAF6VOD-Dwh6_Lnt.js → chunk-PWAF6VOD-CrEgDsxh.js} +1 -1
- package/out/web/assets/{chunk-SHT3W25Y-B0XrCSEb.js → chunk-SHT3W25Y-_KwaRLOl.js} +1 -1
- package/out/web/assets/{chunk-SVP7TREG-CxLsddxC.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
- package/out/web/assets/{chunk-TICWLB2K-y156QInb.js → chunk-TICWLB2K-BDyehCtg.js} +1 -1
- package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
- package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
- package/out/web/assets/{config-DqXJXeZM.css → config-2suVFPZg.css} +1 -1
- package/out/web/assets/config-CkRCdkxn.js +2 -0
- package/out/web/assets/{cynefin-OW5HDTMX-SMVvrLf-.js → cynefin-OW5HDTMX-Dl_31aaN.js} +1 -1
- package/out/web/assets/{cynefinDiagram-5FMLGOSQ-rZznN24T.js → cynefinDiagram-5FMLGOSQ-Bpir8jha.js} +1 -1
- package/out/web/assets/{dagre-GXQ25YYZ-BOToydFu.js → dagre-GXQ25YYZ-D9xu3nsq.js} +1 -1
- package/out/web/assets/{diagram-S7CK7UJ4-TMVaGQEJ.js → diagram-S7CK7UJ4-DeveoEeB.js} +1 -1
- package/out/web/assets/{diagram-UQ7AKVKN-C2JK-GP2.js → diagram-UQ7AKVKN-p4xWRESV.js} +1 -1
- package/out/web/assets/{diagram-VSXAHHWV-Cw8VSi2K.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
- package/out/web/assets/{diagram-VX7I27RA-DXp4fKk9.js → diagram-VX7I27RA-DRiCa3Vd.js} +1 -1
- package/out/web/assets/{diagram-Z3DM3KII-CzSicYiW.js → diagram-Z3DM3KII-Bt7zduQX.js} +1 -1
- package/out/web/assets/{ebnfDiagram-PWID7BFC-Dqj-zqPu.js → ebnfDiagram-PWID7BFC-DV9WpwdR.js} +1 -1
- package/out/web/assets/{erDiagram-RLTQ6QDP-DZwFZAuD.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +1 -1
- package/out/web/assets/{eventmodeling-NTZA5JFV-C0O-Lvgp.js → eventmodeling-NTZA5JFV-BTBMrfVa.js} +1 -1
- package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
- package/out/web/assets/{ganttDiagram-EL5Y4UJY-Da4ULXTl.js → ganttDiagram-EL5Y4UJY-DQLdsXrC.js} +1 -1
- package/out/web/assets/{gitGraph-4MIJSDKK-B9wNFZIP.js → gitGraph-4MIJSDKK-CL1OEOQ_.js} +1 -1
- package/out/web/assets/{gitGraphDiagram-WWUBYQGX-RjrhB0MP.js → gitGraphDiagram-WWUBYQGX-8cSi42H7.js} +1 -1
- package/out/web/assets/index-BocxnrDG.js +168 -0
- package/out/web/assets/index-yeh_r55a.css +1 -0
- package/out/web/assets/{info-A6RAGUB7-B3dfCpeY.js → info-A6RAGUB7-C1zsX5sc.js} +1 -1
- package/out/web/assets/{infoDiagram-27XIBGKW-QVWkLVx7.js → infoDiagram-27XIBGKW-DsRYtIyI.js} +1 -1
- package/out/web/assets/{ishikawaDiagram-5VMMS53U-CLFNIRI9.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +1 -1
- package/out/web/assets/{journeyDiagram-3NMN7TZE-fgOQadYF.js → journeyDiagram-3NMN7TZE-BTH-GyVR.js} +1 -1
- package/out/web/assets/{kanban-definition-UXKFOSKX-G3Q_9g9O.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +1 -1
- package/out/web/assets/{mermaid-parser.core-v3Jm7nco.js → mermaid-parser.core-BJwgCBBc.js} +3 -3
- package/out/web/assets/{mermaid.core-DTEjLUA1.js → mermaid.core-CsDDodN8.js} +4 -4
- package/out/web/assets/{mindmap-definition-YA3MSWOX-C_D42_fF.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +1 -1
- package/out/web/assets/{modelManager-BPLycQrN.js → modelManager-B3ZFMh8v.js} +2 -2
- package/out/web/assets/{oauthManager-BUK7ic7q.js → oauthManager-Ch5Du2fF.js} +1 -1
- package/out/web/assets/{packet-AYTQ26CC-B-R-SHlF.js → packet-AYTQ26CC-B6xUyE6r.js} +1 -1
- package/out/web/assets/{pegDiagram-XKGWAZYB-Da2q_giz.js → pegDiagram-XKGWAZYB-1LabVycL.js} +1 -1
- package/out/web/assets/{pie-WAS4IAKB-BC8F0N7-.js → pie-WAS4IAKB-DJwo-nf_.js} +1 -1
- package/out/web/assets/{pieDiagram-E7YTZNPT-Iy9REJNC.js → pieDiagram-E7YTZNPT-icmAqzy4.js} +1 -1
- package/out/web/assets/{quadrantDiagram-AXDQQJYC-ztsiYw7h.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +1 -1
- package/out/web/assets/{radar-RG4KPBEZ-B_1P8Z_z.js → radar-RG4KPBEZ-D7d-Xriw.js} +1 -1
- package/out/web/assets/{railroad-74A4TZTK-DuTqczSo.js → railroad-74A4TZTK-viuhdYbs.js} +1 -1
- package/out/web/assets/{railroad-abnf-HS5TGJTU-Df29WLmp.js → railroad-abnf-HS5TGJTU-DNXiCNea.js} +1 -1
- package/out/web/assets/{railroad-ebnf-LZEXJU2U-ePFMo-qp.js → railroad-ebnf-LZEXJU2U-nkSu1-0C.js} +1 -1
- package/out/web/assets/{railroad-peg-WCYAUIDC-DYXLW4_E.js → railroad-peg-WCYAUIDC-BhbMeQzz.js} +1 -1
- package/out/web/assets/{railroadDiagram-O6MQD6OU-LStnZf2S.js → railroadDiagram-O6MQD6OU-CLpG1jUX.js} +1 -1
- package/out/web/assets/{requirementDiagram-BXWQKSXE-DmzonMH-.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +1 -1
- package/out/web/assets/{sankeyDiagram-P5KCCOFB-B8vjmUU1.js → sankeyDiagram-P5KCCOFB-DxAwmq4x.js} +1 -1
- package/out/web/assets/{sequenceDiagram-WJ2MYXX4-CTnplOAX.js → sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js} +1 -1
- package/out/web/assets/{stateDiagram-D77RDMKH-BFrIaLdI.js → stateDiagram-D77RDMKH-D5QWfOhp.js} +1 -1
- package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
- package/out/web/assets/{swimlanes-42K2YHIH-BXGngUNU.js → swimlanes-42K2YHIH-CRs5UyA-.js} +1 -1
- package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
- package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
- package/out/web/assets/{timeline-definition-24CTP7MA-CegH7n43.js → timeline-definition-24CTP7MA-Denqd9qb.js} +1 -1
- package/out/web/assets/{treeView-Q6P3EWNA-DTpJv2Tw.js → treeView-Q6P3EWNA-0my3Z3s4.js} +1 -1
- package/out/web/assets/{treemap-WGGIJYW6-i8M9iJU6.js → treemap-WGGIJYW6-B_EjkLYq.js} +1 -1
- package/out/web/assets/{vennDiagram-4TSXK5OY-Dpzo1S8U.js → vennDiagram-4TSXK5OY-DxVg3Ewr.js} +1 -1
- package/out/web/assets/{wardley-WFR3VGLG-BrNsgtfw.js → wardley-WFR3VGLG-CGD-Tj4p.js} +1 -1
- package/out/web/assets/{wardleyDiagram-VM6X3IG4-lQ92LFE1.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +1 -1
- package/out/web/assets/{xychartDiagram-S5SC5T6Z-BaOaEoBd.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +1 -1
- package/out/web/index-web.html +2 -2
- package/out/web/index.html +2 -2
- package/package.json +2 -2
- package/shared-modules/CODEOWNERS +3 -3
- package/shared-modules/SDL2/SDL2_mixer.json +27 -0
- package/shared-modules/appstream/README.md +13 -0
- package/shared-modules/appstream/appstream-compose.json +111 -0
- package/shared-modules/dbus-glib/dbus-glib.json +2 -2
- package/shared-modules/libportal/libportal.json +23 -0
- package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
- package/shared-modules/linux-audio/fluidsynth2.json +2 -2
- package/shared-modules/linux-audio/libinstpatch.json +2 -2
- package/shared-modules/linux-audio/liblo-static.json +3 -0
- package/shared-modules/luajit/luajit.json +2 -2
- package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
- package/slash-commands.json +7 -2
- package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/src/renderer/shared/agentProgress.ts +51 -3
- package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -56
- package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +15 -1
- package/src/renderer/shared/components/Settings/GeneralTab.tsx +25 -12
- package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
- package/src/renderer/shared/components/Settings/ThemeTab.tsx +106 -3
- package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +67 -17
- package/src/renderer/shared/components/activity/AgentActivityTable.tsx +376 -134
- package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
- package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
- package/src/renderer/shared/components/activity/McpToolResults.tsx +39 -2
- package/src/renderer/shared/components/activity/SubagentDagView.tsx +7 -7
- package/src/renderer/shared/components/activity/ViewedImages.tsx +41 -2
- package/src/renderer/shared/components/app/ChunkErrorBoundary.tsx +3 -3
- package/src/renderer/shared/components/app/CommandPalette.tsx +7 -7
- package/src/renderer/shared/components/app/DesktopTitlebar.tsx +2 -2
- package/src/renderer/shared/components/app/MintDashboard.tsx +27 -17
- package/src/renderer/shared/components/app/ModalErrorBoundary.tsx +3 -3
- package/src/renderer/shared/components/cards/CalculationCard.tsx +3 -3
- package/src/renderer/shared/components/cards/ImageGenCard.tsx +2 -2
- package/src/renderer/shared/components/cards/ImageSearchCard.tsx +2 -2
- package/src/renderer/shared/components/cards/MermaidCard.tsx +1 -1
- package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
- package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
- package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
- package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
- package/src/renderer/shared/components/cards/StockCard.tsx +7 -7
- package/src/renderer/shared/components/cards/ToolResultCards.tsx +11 -3
- package/src/renderer/shared/components/cards/UiMockupWidget.tsx +4 -4
- package/src/renderer/shared/components/cards/WeatherCard.tsx +5 -5
- package/src/renderer/shared/components/chat/ApprovalCard.test.tsx +11 -0
- package/src/renderer/shared/components/chat/ApprovalCard.tsx +21 -2
- package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
- package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
- package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
- package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
- package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
- package/src/renderer/shared/components/chat/ChatCodeBlock.tsx +15 -1
- package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +40 -2
- package/src/renderer/shared/components/chat/ChatMessageItem.tsx +180 -34
- package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
- package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
- package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
- package/src/renderer/shared/components/chat/ChatPanel.test.tsx +22 -0
- package/src/renderer/shared/components/chat/ChatPanel.tsx +227 -53
- package/src/renderer/shared/components/chat/DiffReviewModal.tsx +6 -6
- package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +142 -1
- package/src/renderer/shared/components/chat/GeminiLiveOverlay.tsx +45 -3
- package/src/renderer/shared/components/chat/ModelSelectorPopover.tsx +42 -14
- package/src/renderer/shared/components/chat/RewindModal.tsx +10 -10
- package/src/renderer/shared/components/chat/SlashSuggestions.test.tsx +14 -0
- package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
- package/src/renderer/shared/components/chat/SourcesBlock.tsx +236 -90
- package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +45 -1
- package/src/renderer/shared/components/chat/TurnFileChanges.tsx +202 -169
- package/src/renderer/shared/components/extensions/CliSessionsView.tsx +5 -4
- package/src/renderer/shared/components/extensions/McpRegistryPicker.tsx +3 -3
- package/src/renderer/shared/components/studio/LibraryPage.tsx +48 -5
- package/src/renderer/shared/components/workspace/ArtifactPreviewPanel.tsx +125 -13
- package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
- package/src/renderer/shared/components/workspace/CodeReviewPage.tsx +77 -16
- package/src/renderer/shared/components/workspace/GitBranchSelector.tsx +78 -22
- package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +13 -0
- package/src/renderer/shared/components/workspace/ToolSurfacePage.tsx +48 -28
- package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +266 -47
- package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +18 -6
- package/src/renderer/shared/components/workspace/background-terminals.css +11 -11
- package/src/renderer/shared/constants/config.ts +1 -5
- package/src/renderer/shared/constants/models.test.ts +51 -0
- package/src/renderer/shared/constants/models.ts +139 -32
- package/src/renderer/shared/conversation/lifecycle.test.ts +91 -3
- package/src/renderer/shared/conversation/lifecycle.ts +104 -5
- package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
- package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
- package/src/renderer/shared/css/agent-observability.css +133 -0
- package/src/renderer/shared/css/chat-ui-cards.css +13 -13
- package/src/renderer/shared/css/code-review.css +63 -34
- package/src/renderer/shared/css/code-sessions.css +47 -18
- package/src/renderer/shared/css/collapsed-paste.css +1 -1
- package/src/renderer/shared/css/error-notice.css +1 -1
- package/src/renderer/shared/css/file-changes.css +165 -80
- package/src/renderer/shared/css/library.css +105 -10
- package/src/renderer/shared/css/management-views.css +1 -1
- package/src/renderer/shared/css/mcp-results.css +5 -5
- package/src/renderer/shared/css/model-selector.css +18 -18
- package/src/renderer/shared/css/mods.css +7 -7
- package/src/renderer/shared/css/notification-notice.css +2 -2
- package/src/renderer/shared/css/queued-messages.css +5 -5
- package/src/renderer/shared/css/settings/general.css +18 -13
- package/src/renderer/shared/css/settings/profile.css +5 -5
- package/src/renderer/shared/css/settings/theme.css +5 -5
- package/src/renderer/shared/css/slash-choice.css +2 -2
- package/src/renderer/shared/css/slash-suggestions.css +3 -3
- package/src/renderer/shared/css/sources-block.css +41 -2
- package/src/renderer/shared/css/tools-panel.css +2 -2
- package/src/renderer/shared/css/ui-tailwind.css +8 -0
- package/src/renderer/shared/css/veo-studio.css +2 -2
- package/src/renderer/shared/css/viewed-images.css +7 -7
- package/src/renderer/shared/platform.ts +2 -1
- package/src/renderer/shared/theme/themeManager.test.ts +17 -0
- package/src/renderer/shared/theme/themeManager.ts +21 -4
- package/src/renderer/shared/theme/themes.ts +54 -0
- package/src/renderer/shared/theme/tokens.css +6 -4
- package/src/renderer/shared/types.ts +1 -1
- package/src/renderer/shared/utils/agentActivity.test.ts +468 -2
- package/src/renderer/shared/utils/agentActivity.ts +602 -35
- package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
- package/src/renderer/shared/utils/artifactBrowser.ts +17 -19
- package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
- package/src/renderer/shared/utils/attachedDocument.ts +49 -0
- package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
- package/src/renderer/shared/utils/fileIcons.ts +149 -16
- package/src/renderer/shared/utils/markdown.tsx +72 -19
- package/src/renderer/shared/utils/markdown.webImages.test.tsx +16 -0
- package/src/renderer/shared/utils/mcpResults.test.tsx +29 -0
- package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
- package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
- package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
- package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
- package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
- package/src/renderer/shared/utils/workspaceDrag.ts +142 -0
- package/src/renderer/shared/utils/workspaceMedia.ts +10 -2
- package/src/renderer/src/App.tsx +14 -8
- package/src/renderer/src/agentProgress.ts +1 -0
- package/src/renderer/src/components/ScreenPicker.css +1 -1
- package/src/renderer/src/components/WorkspacePanel.tsx +6 -5
- package/src/renderer/src/css/app-shell.css +4 -4
- package/src/renderer/src/css/chat.css +1261 -241
- package/src/renderer/src/css/desktop-tools.css +11 -11
- package/src/renderer/src/css/sidebar-workspace.css +2 -2
- package/src/renderer/src/css/tool-surfaces.css +12 -12
- package/src/renderer/src/index.css +38 -20
- package/src/renderer/src/tauri.ts +22 -2
- package/src/renderer/src-web/App.tsx +14 -0
- package/src/renderer/src-web/agentProgress.ts +1 -0
- package/src/renderer/src-web/css/app-shell.css +4 -4
- package/src/renderer/src-web/css/chat.css +1278 -190
- package/src/renderer/src-web/css/mobile.css +29 -13
- package/src/renderer/src-web/css/settings/mobile.css +2 -2
- package/src/renderer/src-web/css/sidebar-workspace.css +1 -1
- package/src/renderer/src-web/index.css +38 -20
- package/src/renderer/src-web/tauri.ts +22 -2
- package/src/renderer/tests/browserArtifacts.browser.tsx +1 -1
- package/src/renderer/tests/library.browser.tsx +3 -0
- package/src/renderer/tests/liveVoice.browser.html +1 -0
- package/src/renderer/tests/workspaceDrop.browser.tsx +1 -1
- package/src-tauri/src/app/lifecycle.rs +1 -14
- package/src-tauri/src/background/headless.rs +14 -8
- package/src-tauri/src/commands/conversation.rs +38 -0
- package/src-tauri/src/native/mod.rs +0 -1
- package/src-tauri/src/native/system.rs +4 -47
- package/crates/mint-cli/src/interactive/chat_tui.rs +0 -8855
- package/crates/mint-core/src/agent/chat.rs +0 -4394
- package/crates/mint-core/src/browser/lifecycle.rs +0 -291
- package/crates/mint-core/src/browser/logging.rs +0 -20
- package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
- package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +0 -2
- package/out/web/assets/CalculationCard-CRjP3E1j.js +0 -1
- package/out/web/assets/CliSessionsView-C3Br2v5Y.css +0 -1
- package/out/web/assets/CodeReviewPage-CUJceQme.css +0 -1
- package/out/web/assets/CodeReviewPage-VCUgPla_.js +0 -2
- package/out/web/assets/ImageGenCard-BCXxkVJX.js +0 -1
- package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +0 -1
- package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
- package/out/web/assets/LibraryPage-WlviRdR8.js +0 -2
- package/out/web/assets/LinkedFoldersView-CKRgroWK.js +0 -1
- package/out/web/assets/McpServersView-D3wHnuHg.js +0 -1
- package/out/web/assets/MermaidCard-NqrHdyJW.js +0 -2
- package/out/web/assets/MintDashboard-B2DJsDDO.css +0 -1
- package/out/web/assets/MintDashboard-COw_xol7.js +0 -63
- package/out/web/assets/RewindModal-DempuDod.js +0 -1
- package/out/web/assets/SettingsWindow-2YP3yj7s.js +0 -4
- package/out/web/assets/SettingsWindow-Dz8LQVgD.css +0 -1
- package/out/web/assets/StockCard-BDMCe7mx.js +0 -1
- package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +0 -38
- package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +0 -1
- package/out/web/assets/UiMockupWidget-DD73QWg1.js +0 -1
- package/out/web/assets/WeatherCard-CPucIfq8.js +0 -1
- package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +0 -2
- package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +0 -1
- package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +0 -1
- package/out/web/assets/config-CvIO5hkn.js +0 -2
- package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +0 -1
- package/out/web/assets/index-BmpulIkg.js +0 -168
- package/out/web/assets/index-CkvBwhX_.css +0 -1
- package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +0 -1
- package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +0 -8
- package/shared-modules/libsecret/libsecret.json +0 -23
- package/shared-modules/libusb/libusb.json +0 -27
- package/shared-modules/lzo/lzo.json +0 -27
- package/src/renderer/src/components/BrowserShell.tsx +0 -108
- package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
- package/src/renderer/src/components/browser-shell.css +0 -185
- 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"
|
|
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
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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|
|
|
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!("- **{}
|
|
594
|
+
entries.push(format!("- **[{}] `{}`**: {}", idx + 1, name, first_line));
|
|
536
595
|
}
|
|
537
596
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
if
|
|
558
|
-
if let Ok(content) = std::fs::read_to_string(
|
|
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
|
-
|
|
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
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
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
|
|
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**
|
|
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}
|
|
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
|
|
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::
|
|
1414
|
-
|
|
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
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
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
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
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-
|
|
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("
|
|
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
|
|
3576
|
+
// 1. Bare /browser returns status message
|
|
3564
3577
|
match execute(&req("/browser"), &mut cfg) {
|
|
3565
|
-
SlashResponse::
|
|
3566
|
-
|
|
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("
|
|
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
|
|
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::
|
|
3606
|
-
assert!(
|
|
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
|
|
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] = &[
|
|
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;
|