@pheem49/mint 1.14.0 → 1.15.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/CLAUDE.md +1 -1
- package/Cargo.lock +291 -11
- package/Cargo.toml +1 -1
- package/README.md +71 -9
- package/ROADMAP.md +30 -0
- package/Release_Note.md +579 -465
- package/crates/mint-cli/Cargo.toml +3 -1
- package/crates/mint-cli/src/agent/approval_prompts.rs +16 -3
- package/crates/mint-cli/src/agent/live_status.rs +367 -118
- package/crates/mint-cli/src/agent/markdown_render.rs +601 -61
- package/crates/mint-cli/src/agent.rs +452 -215
- package/crates/mint-cli/src/commands/agent.rs +16 -21
- package/crates/mint-cli/src/commands/eval.rs +9 -5
- package/crates/mint-cli/src/commands/git.rs +204 -0
- package/crates/mint-cli/src/commands/integrations.rs +28 -0
- package/crates/mint-cli/src/commands/knowledge.rs +1 -0
- package/crates/mint-cli/src/commands/mod.rs +37 -2
- package/crates/mint-cli/src/commands/tailnet_web.rs +235 -0
- package/crates/mint-cli/src/image.rs +26 -3
- package/crates/mint-cli/src/interactive/chat_tui.rs +4742 -0
- package/crates/mint-cli/src/interactive/command_ui.rs +477 -0
- package/crates/mint-cli/src/interactive/format.rs +8 -0
- package/crates/mint-cli/src/interactive/input_box.rs +38 -2
- package/crates/mint-cli/src/interactive/picker.rs +180 -37
- package/crates/mint-cli/src/interactive/resume_picker.rs +686 -0
- package/crates/mint-cli/src/interactive/slash_commands.rs +868 -450
- package/crates/mint-cli/src/interactive/thought_viewer.rs +286 -0
- package/crates/mint-cli/src/interactive.rs +400 -136
- package/crates/mint-cli/src/main.rs +84 -23
- package/crates/mint-cli/src/markdown.rs +12 -5
- package/crates/mint-cli/src/onboard.rs +32 -30
- package/crates/mint-cli/src/plugins_cli.rs +8 -5
- package/crates/mint-cli/src/setup.rs +10 -8
- package/crates/mint-cli/src/terminal_theme.rs +187 -0
- package/crates/mint-cli/src/updater.rs +56 -21
- package/crates/mint-core/src/agent/agent_loop.rs +1 -0
- package/crates/mint-core/src/agent/chat.rs +843 -177
- package/crates/mint-core/src/agent/code_tools.rs +83 -2
- package/crates/mint-core/src/agent/memory.rs +658 -20
- package/crates/mint-core/src/agent/skills.rs +1 -1
- package/crates/mint-core/src/api_server/routes/chat.rs +31 -5
- package/crates/mint-core/src/api_server/routes/linked_folders.rs +118 -3
- package/crates/mint-core/src/api_server/routes/misc.rs +10 -14
- package/crates/mint-core/src/api_server/routes/sessions.rs +44 -0
- package/crates/mint-core/src/api_server.rs +22 -3
- package/crates/mint-core/src/avatar_bridge.rs +2 -0
- package/crates/mint-core/src/browser/cdp.rs +74 -83
- package/crates/mint-core/src/browser/evidence.rs +260 -0
- package/crates/mint-core/src/browser/input.rs +1 -1
- package/crates/mint-core/src/browser/interact.rs +98 -124
- package/crates/mint-core/src/browser/lifecycle.rs +75 -4
- package/crates/mint-core/src/browser/mod.rs +16 -2
- package/crates/mint-core/src/browser/navigate.rs +27 -19
- package/crates/mint-core/src/browser/observe.js +40 -0
- package/crates/mint-core/src/browser/session.rs +1558 -0
- package/crates/mint-core/src/git/branches.rs +348 -0
- package/crates/mint-core/src/git/checkpoint.rs +40 -0
- package/crates/mint-core/src/git/diff.rs +206 -0
- package/crates/mint-core/src/git/mod.rs +10 -2
- package/crates/mint-core/src/integrations/channels.rs +1 -0
- package/crates/mint-core/src/lib.rs +22 -14
- package/crates/mint-core/src/live_sync.rs +28 -9
- package/crates/mint-core/src/media/auto_shorts.rs +1 -0
- package/crates/mint-core/src/media/gemini_live.rs +12 -1
- package/crates/mint-core/src/media/mic_transcribe.rs +1 -0
- package/crates/mint-core/src/media/subtitle.rs +1 -0
- package/crates/mint-core/src/orchestration/context_render.rs +1 -0
- package/crates/mint-core/src/orchestration/memory_skill.rs +6 -1
- package/crates/mint-core/src/orchestration/mod.rs +1024 -271
- package/crates/mint-core/src/orchestration/tools/browser.rs +16 -139
- package/crates/mint-core/src/orchestration/tools/misc.rs +2 -1
- package/crates/mint-core/src/orchestration/tools/web.rs +1 -1
- package/crates/mint-core/src/prompts/agent.rs +58 -29
- package/crates/mint-core/src/prompts/chat.rs +1 -1
- package/crates/mint-core/src/prompts/persona.rs +1 -1
- package/crates/mint-core/src/prompts/tool_catalog.rs +93 -25
- package/crates/mint-core/src/search/linked_folders/index.rs +732 -0
- package/crates/mint-core/src/search/linked_folders.rs +391 -130
- package/crates/mint-core/src/slash/mod.rs +470 -22
- package/crates/mint-core/src/slash/model_fetcher.rs +12 -3
- package/crates/mint-core/src/slash/models.rs +66 -10
- package/crates/mint-core/src/system/config.rs +230 -0
- package/crates/mint-core/src/system/workspace.rs +228 -0
- package/crates/mint-core/src/system.rs +1 -0
- package/crates/mint-core/tests/memory_persistence.rs +39 -0
- package/mint-presentation-demo.mp4 +0 -0
- package/out/web/assets/CliSessionsView-BxUVWEEL.js +1 -0
- package/out/web/assets/CliSessionsView-CBDTXuQv.css +1 -0
- package/out/web/assets/CodeReviewPage-DkMgfcos.css +1 -0
- package/out/web/assets/CodeReviewPage-jKlmLJwT.js +3 -0
- package/out/web/assets/CommandPalette-DnwPA5hy.js +1 -0
- package/out/web/assets/ImageStudioPanel-BR1XFwhR.js +1 -0
- package/out/web/assets/ImageStudioPanel-D0lnhQV5.css +1 -0
- package/out/web/assets/LinkedFoldersView-bi-CWQ-I.js +1 -0
- package/out/web/assets/McpRegistryPicker-D5tEFnyq.js +1 -0
- package/out/web/assets/McpServersView-BGG1dhFM.js +1 -0
- package/out/web/assets/MintDashboard-BIglDEWX.js +20 -0
- package/out/web/assets/MintDashboard-DSMywSgs.css +1 -0
- package/out/web/assets/ModelPanel-CbJ1PFoZ.js +1 -0
- package/out/web/assets/PicturesLibrary-CQP0fLP1.css +1 -0
- package/out/web/assets/PicturesLibrary-DoYN7T1p.js +1 -0
- package/out/web/assets/PluginsView-CU1HWXGk.js +1 -0
- package/out/web/assets/ScheduledTasksView-Bnl36y2N.js +1 -0
- package/out/web/assets/SettingsWindow-DhWLAn9T.css +1 -0
- package/out/web/assets/SettingsWindow-Dw8L01pw.js +2 -0
- package/out/web/assets/SkillsView-cnl8aY5p.js +2 -0
- package/out/web/assets/ToolSurfacePage-CgsQw6l5.css +1 -0
- package/out/web/assets/ToolSurfacePage-Cz2VJAPZ.js +37 -0
- package/out/web/assets/VeoStudioPanel-D4JnERWR.js +4 -0
- package/out/web/assets/VeoStudioPanel-DOj7_WR3.css +1 -0
- package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +1 -0
- package/out/web/assets/{abnfDiagram-VCTEODGH-DAOBA7ZG.js → abnfDiagram-VCTEODGH-ByMyfanq.js} +1 -1
- package/out/web/assets/{architecture-7GRP2DOG-CgSwQOPQ.js → architecture-7GRP2DOG-CLq2kEOB.js} +1 -1
- package/out/web/assets/{architectureDiagram-5GKGNRK7-CYp3yupP.js → architectureDiagram-5GKGNRK7-6PoVSmNG.js} +1 -1
- package/out/web/assets/{blockDiagram-NRAW4CY4-CyWybDWr.js → blockDiagram-NRAW4CY4-cKw9mAKi.js} +1 -1
- package/out/web/assets/{c4Diagram-UCG6FXSJ-BvY3U709.js → c4Diagram-UCG6FXSJ-Cqy8N5Ge.js} +1 -1
- package/out/web/assets/{chunk-75Z2AOVW-TLXCoZYv.js → chunk-75Z2AOVW-3qybijF5.js} +1 -1
- package/out/web/assets/chunk-CKBBP62Z-cIrXq6jN.js +2 -0
- package/out/web/assets/{chunk-CLGD4ZFX-xjsKtNS7.js → chunk-CLGD4ZFX-CndDQkww.js} +1 -1
- package/out/web/assets/chunk-DSNCTWBM-Cc4NxvgD.js +2 -0
- package/out/web/assets/chunk-DU6HZSFF-drzh6GsU.js +128 -0
- package/out/web/assets/{chunk-F27PBJKO-BFpgF55A.js → chunk-F27PBJKO-FiY35l4v.js} +1 -1
- package/out/web/assets/{chunk-G27WJ6UU-DfF7qW-C.js → chunk-G27WJ6UU-Bjt9Il4A.js} +1 -1
- package/out/web/assets/{chunk-GMAD6QVW-C-558kh_.js → chunk-GMAD6QVW-Bppi3Ctd.js} +1 -1
- package/out/web/assets/{chunk-JQ64N6SF-wJmeGKAw.js → chunk-JQ64N6SF-DGg5kcEV.js} +1 -1
- package/out/web/assets/{chunk-LCL6LL3I-C1wHD8Ie.js → chunk-LCL6LL3I-CCYcjd7p.js} +1 -1
- package/out/web/assets/{chunk-OBVCFTLP-BsRTPBqs.js → chunk-OBVCFTLP-DJeNil5M.js} +1 -1
- package/out/web/assets/{chunk-P2QGCYS3-HZIiM7Ni.js → chunk-P2QGCYS3-lRzkRjBB.js} +1 -1
- package/out/web/assets/{chunk-POPQ4Y6H-Dk9wvVb0.js → chunk-POPQ4Y6H-DouASMBW.js} +1 -1
- package/out/web/assets/{chunk-PWAF6VOD-BmjYLNbq.js → chunk-PWAF6VOD-DMmD1vVf.js} +1 -1
- package/out/web/assets/{chunk-R7TYR2AO-CaHIf-lK.js → chunk-R7TYR2AO-CYLA5UC5.js} +1 -1
- package/out/web/assets/{chunk-RHFEMEQ7-_T561hOU.js → chunk-RHFEMEQ7-BiXwEcUT.js} +1 -1
- package/out/web/assets/{chunk-SVP7TREG-CM-GGYoY.js → chunk-SVP7TREG-BV-zPslF.js} +1 -1
- package/out/web/assets/{chunk-TEH6E4GO-K2A8Vg2C.js → chunk-TEH6E4GO-B2RGEohZ.js} +1 -1
- package/out/web/assets/classDiagram-DTDB5LWJ-Dq0smRWk.js +1 -0
- package/out/web/assets/classDiagram-v2-JRS7N3AN-Dq0smRWk.js +1 -0
- package/out/web/assets/config-C-ZFtipU.css +1 -0
- package/out/web/assets/config-eEDngJXO.js +1 -0
- package/out/web/assets/core-hQ2VA9Ti.js +1 -0
- package/out/web/assets/{cynefin-OW5HDTMX-ClzaB6cc.js → cynefin-OW5HDTMX-Cas4csHM.js} +1 -1
- package/out/web/assets/{cynefinDiagram-5FMLGOSQ-D_JzZBzf.js → cynefinDiagram-5FMLGOSQ-Bbpj66Y3.js} +1 -1
- package/out/web/assets/{dagre-3AP2YEHR-BDuUeMHj.js → dagre-3AP2YEHR-B0-2RDEd.js} +1 -1
- package/out/web/assets/{diagram-S7CK7UJ4-DgtcfE8P.js → diagram-S7CK7UJ4-BdzEjUyH.js} +1 -1
- package/out/web/assets/{diagram-UQ7AKVKN-DTLoEYti.js → diagram-UQ7AKVKN-CJDwyPxF.js} +1 -1
- package/out/web/assets/{diagram-VSXAHHWV-ChGl9pXz.js → diagram-VSXAHHWV-BxaG1r_B.js} +1 -1
- package/out/web/assets/{diagram-VX7I27RA-Be8DWz0S.js → diagram-VX7I27RA-BMmUqm8f.js} +1 -1
- package/out/web/assets/{diagram-Z3DM3KII-BMXjRTOF.js → diagram-Z3DM3KII-CFtd03eE.js} +1 -1
- package/out/web/assets/dist-js-Bf2bhoku.js +1 -0
- package/out/web/assets/{ebnfDiagram-PWID7BFC-8Q9pl1CJ.js → ebnfDiagram-PWID7BFC-DwAen1hO.js} +1 -1
- package/out/web/assets/{erDiagram-SSCWMZ5O-DjH8Lnkn.js → erDiagram-SSCWMZ5O-BCZSHACj.js} +1 -1
- package/out/web/assets/event-ChBVpRy0.js +1 -0
- package/out/web/assets/{eventmodeling-NTZA5JFV-BKUH_DOp.js → eventmodeling-NTZA5JFV-XHStE4E_.js} +1 -1
- package/out/web/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
- package/out/web/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
- package/out/web/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
- package/out/web/assets/flowDiagram-A5DVABFB-BLg7nEcd.js +1 -0
- package/out/web/assets/{ganttDiagram-EL5Y4UJY-D7fZKJNM.js → ganttDiagram-EL5Y4UJY-BAEu1Cql.js} +1 -1
- package/out/web/assets/{gitGraph-4MIJSDKK-BypWaaBU.js → gitGraph-4MIJSDKK-r32Vyper.js} +1 -1
- package/out/web/assets/{gitGraphDiagram-WWUBYQGX-DWiw_3bq.js → gitGraphDiagram-WWUBYQGX-z9o9qt6V.js} +1 -1
- package/out/web/assets/index-Btsf4L8M.css +1 -0
- package/out/web/assets/index-D8D9MeRA.js +11 -0
- package/out/web/assets/{info-A6RAGUB7-KkAUxT4j.js → info-A6RAGUB7-BvLaC2cw.js} +1 -1
- package/out/web/assets/{infoDiagram-RXCK75RN-BNb6E48y.js → infoDiagram-RXCK75RN-Be6WAXXw.js} +1 -1
- package/out/web/assets/{ishikawaDiagram-5VMMS53U-Caa-JoAK.js → ishikawaDiagram-5VMMS53U-DZjoHJHC.js} +1 -1
- package/out/web/assets/{journeyDiagram-EYS64GPL-DOrmFGz6.js → journeyDiagram-EYS64GPL-CtVkjkGm.js} +1 -1
- package/out/web/assets/{kanban-definition-3QL26DDD-BOWCYcK0.js → kanban-definition-3QL26DDD-CW5FMv1w.js} +1 -1
- package/out/web/assets/lucide-react-Ip3L6Jtn.js +1 -0
- package/out/web/assets/markdown-BSeeUbJH.js +38 -0
- package/out/web/assets/{mermaid-parser.core-BQqjCkS_.js → mermaid-parser.core-aUgCqsZ5.js} +3 -3
- package/out/web/assets/mermaid.core-D57sEiSL.js +11 -0
- package/out/web/assets/{mindmap-definition-FBJOCRG2-jTceWpr0.js → mindmap-definition-FBJOCRG2-DAmSpM3a.js} +1 -1
- package/out/web/assets/modelManager-tMVmJVAW.js +2 -0
- package/out/web/assets/oauthManager-9jxicDWJ.js +1 -0
- package/out/web/assets/{packet-AYTQ26CC-CJ5RXgol.js → packet-AYTQ26CC-DJ27iIoJ.js} +1 -1
- package/out/web/assets/{pegDiagram-XKGWAZYB-y8wMtd0y.js → pegDiagram-XKGWAZYB-Bj3ii-gS.js} +1 -1
- package/out/web/assets/{pie-WAS4IAKB-72fTBbl4.js → pie-WAS4IAKB-DG5mCUbc.js} +1 -1
- package/out/web/assets/{pieDiagram-E7YTZNPT-e0O02qWq.js → pieDiagram-E7YTZNPT-BrJLPnDA.js} +1 -1
- package/out/web/assets/prompt-latin-700-normal-BfbftDSq.woff +0 -0
- package/out/web/assets/prompt-latin-700-normal-I2gc831J.woff2 +0 -0
- package/out/web/assets/prompt-thai-700-normal-Cb5ilR-c.woff +0 -0
- package/out/web/assets/prompt-thai-700-normal-Cg4aQ0Nn.woff2 +0 -0
- package/out/web/assets/{quadrantDiagram-AXDQQJYC-C9phYLom.js → quadrantDiagram-AXDQQJYC-3x_TmF3j.js} +1 -1
- package/out/web/assets/{radar-RG4KPBEZ-BAU2hzUT.js → radar-RG4KPBEZ-CrXaTTuV.js} +1 -1
- package/out/web/assets/{railroad-74A4TZTK-B0bCAVHC.js → railroad-74A4TZTK-BpqMH9BE.js} +1 -1
- package/out/web/assets/{railroad-abnf-HS5TGJTU-WhxO7ndE.js → railroad-abnf-HS5TGJTU-DHI0uLlV.js} +1 -1
- package/out/web/assets/{railroad-ebnf-LZEXJU2U-BkA0m7-F.js → railroad-ebnf-LZEXJU2U-CQCb316y.js} +1 -1
- package/out/web/assets/{railroad-peg-WCYAUIDC-BsVpHIaj.js → railroad-peg-WCYAUIDC-Ph1giKkH.js} +1 -1
- package/out/web/assets/{railroadDiagram-O6MQD6OU-CyOLN65Q.js → railroadDiagram-O6MQD6OU-BRq6wIxx.js} +1 -1
- package/out/web/assets/{requirementDiagram-EFPCY7ZU-DQXJ7Dud.js → requirementDiagram-EFPCY7ZU-DIJj6G1g.js} +1 -1
- package/out/web/assets/{sankeyDiagram-P5KCCOFB-B2XLyIIc.js → sankeyDiagram-P5KCCOFB-DZajSryq.js} +1 -1
- package/out/web/assets/{sequenceDiagram-WJ2MYXX4-DGQY4wwm.js → sequenceDiagram-WJ2MYXX4-DxJCWyZS.js} +1 -1
- package/out/web/assets/{stateDiagram-HBIQ2CUA-DHZpDwNy.js → stateDiagram-HBIQ2CUA-k6voi8Vf.js} +1 -1
- package/out/web/assets/stateDiagram-v2-4QOOHH4V-DeEc0lGZ.js +1 -0
- package/out/web/assets/studio-B1mk40wD.js +1 -0
- package/out/web/assets/{swimlanes-XN3QIQJK-Bn_jcZz-.js → swimlanes-XN3QIQJK-igYhTjXB.js} +1 -1
- package/out/web/assets/swimlanesDiagram-VK2B7HYN-DpVik9v7.js +8 -0
- package/out/web/assets/{timeline-definition-24CTP7MA-CdTERuJZ.js → timeline-definition-24CTP7MA-Dke2p93p.js} +1 -1
- package/out/web/assets/{treeView-Q6P3EWNA-TKBKQG6R.js → treeView-Q6P3EWNA-hNELnXUs.js} +1 -1
- package/out/web/assets/{treemap-WGGIJYW6-BP7gQoiC.js → treemap-WGGIJYW6-D2B6wDsx.js} +1 -1
- package/out/web/assets/{vennDiagram-4TSXK5OY-BHUmxDuK.js → vennDiagram-4TSXK5OY-CDkW7rUP.js} +1 -1
- package/out/web/assets/{wardley-WFR3VGLG-9bct5AAN.js → wardley-WFR3VGLG-BECdXETi.js} +1 -1
- package/out/web/assets/{wardleyDiagram-VM6X3IG4-BfJwDDso.js → wardleyDiagram-VM6X3IG4-B5BycpQ4.js} +1 -1
- package/out/web/assets/window-5qYXKoW7.js +1 -0
- package/out/web/assets/{xychartDiagram-S5SC5T6Z-Dqd9Mvpo.js → xychartDiagram-S5SC5T6Z-CtJS3b--.js} +1 -1
- package/out/web/index-web.html +3 -4
- package/out/web/index.html +3 -4
- package/package.json +17 -6
- package/skills-lock.json +36 -0
- package/slash-commands.json +9 -0
- package/src/renderer/index-web.html +1 -0
- package/src/renderer/index.html +1 -0
- package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/src/renderer/shared/agentProgress.ts +168 -3
- package/src/renderer/shared/components/AgentActivityDrawer.tsx +6 -6
- package/src/renderer/shared/components/AgentActivityTable.tsx +192 -132
- package/src/renderer/shared/components/ArtifactPreviewPanel.tsx +4 -4
- package/src/renderer/shared/components/AuthGate.tsx +4 -9
- package/src/renderer/shared/components/CalculationCard.tsx +41 -15
- package/src/renderer/shared/components/ChatMessageItem.tsx +20 -21
- package/src/renderer/shared/components/ChatPanel.tsx +432 -193
- package/src/renderer/shared/components/ChunkErrorBoundary.tsx +198 -49
- package/src/renderer/shared/components/CliSessionsView.tsx +495 -0
- package/src/renderer/shared/components/CodeReviewPage.tsx +565 -0
- package/src/renderer/shared/components/CommandPalette.tsx +8 -8
- package/src/renderer/shared/components/DashboardSidebar.tsx +862 -125
- package/src/renderer/shared/components/DesktopTitlebar.tsx +345 -0
- package/src/renderer/shared/components/DiffReviewModal.tsx +3 -3
- package/src/renderer/shared/components/GitBranchSelector.tsx +442 -0
- package/src/renderer/shared/components/ImageGenCard.tsx +31 -12
- package/src/renderer/shared/components/ImageSearchCard.tsx +59 -38
- package/src/renderer/shared/components/ImageStudioPanel.tsx +40 -41
- package/src/renderer/shared/components/InlineThoughtNote.tsx +27 -0
- package/src/renderer/shared/components/LinkedFoldersView.tsx +365 -46
- package/src/renderer/shared/components/McpRegistryPicker.tsx +1 -1
- package/src/renderer/shared/components/McpServersView.tsx +24 -22
- package/src/renderer/shared/components/MermaidCard.tsx +14 -8
- package/src/renderer/shared/components/MintDashboard.tsx +1141 -508
- package/src/renderer/shared/components/ModelSelectorPopover.tsx +535 -214
- package/src/renderer/shared/components/PlanChecklistWidget.tsx +1 -1
- package/src/renderer/shared/components/PluginsView.tsx +1 -1
- package/src/renderer/shared/components/RewindModal.tsx +6 -6
- package/src/renderer/shared/components/RunSummaryDashboard.tsx +3 -3
- package/src/renderer/shared/components/ScheduledTasksView.tsx +4 -4
- package/src/renderer/shared/components/ScreenCaptureDialog.css +221 -0
- package/src/renderer/shared/components/ScreenCaptureDialog.tsx +199 -0
- package/src/renderer/shared/components/Settings/AgentsTab.tsx +34 -39
- package/src/renderer/shared/components/Settings/AudioTab.tsx +8 -8
- package/src/renderer/shared/components/Settings/AutomationTab.tsx +8 -58
- package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +368 -0
- package/src/renderer/shared/components/Settings/GeneralTab.tsx +335 -81
- package/src/renderer/shared/components/Settings/MemoryTab.tsx +3 -3
- package/src/renderer/shared/components/Settings/PluginsTab.tsx +20 -12
- package/src/renderer/shared/components/Settings/ProfileTab.tsx +29 -5
- package/src/renderer/shared/components/Settings/SearchableModelCombobox.tsx +411 -0
- package/src/renderer/shared/components/Settings/ThemeTab.tsx +401 -158
- package/src/renderer/shared/components/SkillsView.tsx +41 -16
- package/src/renderer/shared/components/SlashSuggestions.tsx +3 -2
- package/src/renderer/shared/components/SourcesBlock.tsx +44 -32
- package/src/renderer/shared/components/StockCard.tsx +58 -24
- package/src/renderer/shared/components/SubagentDagView.tsx +4 -4
- package/src/renderer/shared/components/TerminalDock.tsx +241 -0
- package/src/renderer/shared/components/ThinkingBlock.tsx +14 -8
- package/src/renderer/shared/components/ToolSurfacePage.tsx +520 -0
- package/src/renderer/shared/components/UiFeatureCard.tsx +267 -0
- package/src/renderer/shared/components/UiGridCard.tsx +188 -0
- package/src/renderer/shared/components/UiMockupWidget.tsx +149 -0
- package/src/renderer/shared/components/VeoStudioPanel.tsx +13 -29
- package/src/renderer/shared/components/WeatherCard.tsx +3 -3
- package/src/renderer/shared/components/WorkspaceContextPopover.tsx +133 -0
- package/src/renderer/shared/components/WorkspaceSelector.tsx +149 -0
- package/src/renderer/shared/constants/config.ts +28 -3
- package/src/renderer/shared/constants/models.ts +189 -2
- package/src/renderer/shared/conversation/coordinator.test.ts +27 -0
- package/src/renderer/shared/conversation/coordinator.ts +82 -0
- package/src/renderer/shared/conversation/syncView.test.ts +46 -0
- package/src/renderer/shared/conversation/syncView.ts +43 -0
- package/src/renderer/shared/conversation/useConversationCoordinator.ts +106 -0
- package/src/renderer/shared/css/agent-observability.css +35 -3
- package/src/renderer/shared/css/auth-gate.css +2 -2
- package/src/renderer/shared/css/chat-ui-cards.css +495 -0
- package/src/renderer/shared/css/code-review.css +823 -0
- package/src/renderer/shared/css/code-sessions.css +452 -0
- package/src/renderer/shared/css/file-changes.css +132 -0
- package/src/renderer/shared/css/image-studio.css +16 -16
- package/src/renderer/shared/css/management-views.css +277 -27
- package/src/renderer/shared/css/model-selector.css +442 -42
- package/src/renderer/shared/css/settings/agents.css +1 -1
- package/src/renderer/shared/css/settings/automation.css +13 -13
- package/src/renderer/shared/css/settings/general.css +526 -5
- package/src/renderer/shared/css/settings/plugins.css +5 -5
- package/src/renderer/shared/css/settings/profile.css +331 -1
- package/src/renderer/shared/css/settings/theme.css +651 -3
- package/src/renderer/shared/css/veo-studio.css +16 -15
- package/src/renderer/shared/fonts.ts +19 -37
- package/src/renderer/shared/platform.test.ts +34 -0
- package/src/renderer/shared/platform.ts +173 -6
- package/src/renderer/shared/theme/themeManager.ts +144 -0
- package/src/renderer/shared/theme/themes.ts +116 -0
- package/src/renderer/shared/theme/tokens.css +318 -0
- package/src/renderer/shared/types.ts +82 -1
- package/src/renderer/shared/utils/agentActivity.ts +126 -5
- package/src/renderer/shared/utils/cardJson.test.ts +35 -0
- package/src/renderer/shared/utils/cardJson.ts +30 -0
- package/src/renderer/shared/utils/fileIcons.ts +1 -1
- package/src/renderer/shared/utils/markdown.tsx +329 -80
- package/src/renderer/shared/utils/markdown.webImages.test.tsx +40 -0
- package/src/renderer/shared/utils/providers.ts +8 -3
- package/src/renderer/shared/utils/screenCapture.ts +43 -0
- package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
- package/src/renderer/shared/utils/ui.ts +4 -64
- package/src/renderer/src/App.tsx +7 -0
- package/src/renderer/src/components/BrowserShell.tsx +108 -0
- package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +91 -0
- package/src/renderer/src/components/Live2DStage.tsx +32 -9
- package/src/renderer/src/components/MintDashboard.tsx +4 -2
- package/src/renderer/src/components/ModelPanel.tsx +2 -1
- package/src/renderer/src/components/PicturesLibrary.tsx +3 -2
- package/src/renderer/src/components/ScreenPicker.css +190 -0
- package/src/renderer/src/components/ScreenPicker.tsx +185 -540
- package/src/renderer/src/components/SettingsWindow.tsx +40 -2
- package/src/renderer/src/components/SpotlightWindow.tsx +1 -0
- package/src/renderer/src/components/WidgetWindow.tsx +27 -3
- package/src/renderer/src/components/WorkspacePanel.tsx +61 -43
- package/src/renderer/src/components/browser-shell.css +185 -0
- package/src/renderer/src/components/browser-suggestions-popup.css +55 -0
- package/src/renderer/src/components/liveTranslateFrames.test.ts +23 -0
- package/src/renderer/src/components/liveTranslateFrames.ts +34 -0
- package/src/renderer/src/css/app-shell.css +394 -113
- package/src/renderer/src/css/chat.css +1926 -380
- package/src/renderer/src/css/dashboard.css +11 -0
- package/src/renderer/src/css/desktop-tools.css +730 -0
- package/src/renderer/src/css/misc.css +19 -22
- package/src/renderer/src/css/model.css +49 -48
- package/src/renderer/src/css/pictures.css +144 -136
- package/src/renderer/src/css/settings/base.css +357 -123
- package/src/renderer/src/css/sidebar-workspace.css +930 -291
- package/src/renderer/src/css/spotlight.css +15 -26
- package/src/renderer/src/css/tool-surfaces.css +728 -0
- package/src/renderer/src/css/widget.css +35 -7
- package/src/renderer/src/env.d.ts +3 -0
- package/src/renderer/src/hooks/useProviderModels.ts +2 -9
- package/src/renderer/src/index.css +53 -46
- package/src/renderer/src/main.tsx +11 -0
- package/src/renderer/src/tauri.ts +201 -30
- package/src/renderer/src-web/App.tsx +40 -0
- package/src/renderer/src-web/components/MintDashboard.tsx +4 -2
- package/src/renderer/src-web/components/PicturesLibrary.tsx +3 -2
- package/src/renderer/src-web/components/PullToRefresh.tsx +107 -0
- package/src/renderer/src-web/components/SettingsWindow.tsx +28 -2
- package/src/renderer/src-web/css/app-shell.css +174 -96
- package/src/renderer/src-web/css/chat.css +1519 -316
- package/src/renderer/src-web/css/dashboard.css +11 -0
- package/src/renderer/src-web/css/misc.css +17 -17
- package/src/renderer/src-web/css/mobile.css +678 -0
- package/src/renderer/src-web/css/model.css +46 -46
- package/src/renderer/src-web/css/pictures.css +81 -34
- package/src/renderer/src-web/css/pull-to-refresh.css +54 -0
- package/src/renderer/src-web/css/settings/base.css +316 -100
- package/src/renderer/src-web/css/settings/mobile.css +320 -0
- package/src/renderer/src-web/css/sidebar-workspace.css +545 -100
- package/src/renderer/src-web/css/spotlight.css +9 -26
- package/src/renderer/src-web/css/widget.css +0 -5
- package/src/renderer/src-web/env.d.ts +3 -0
- package/src/renderer/src-web/hooks/useProviderModels.ts +2 -9
- package/src/renderer/src-web/index.css +53 -96
- package/src/renderer/src-web/main.tsx +11 -0
- package/src/renderer/src-web/tauri.ts +200 -30
- package/vite.config.web.ts +1 -0
- package/out/web/assets/MintDashboard-DWSqucgb.js +0 -57
- package/out/web/assets/SettingsWindow-DFM2aj5B.js +0 -2
- package/out/web/assets/chunk-CKBBP62Z-nr1uKPj9.js +0 -2
- package/out/web/assets/chunk-DSNCTWBM-Dtj8Rqsd.js +0 -2
- package/out/web/assets/chunk-DU6HZSFF-2tv5K1wT.js +0 -128
- package/out/web/assets/classDiagram-DTDB5LWJ-BdSFArgw.js +0 -1
- package/out/web/assets/classDiagram-v2-JRS7N3AN-BdSFArgw.js +0 -1
- package/out/web/assets/core-DImejIUG.js +0 -1
- package/out/web/assets/dist-js-BxuKEVWM.js +0 -1
- package/out/web/assets/event-BNl8Zahw.js +0 -1
- package/out/web/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
- package/out/web/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
- package/out/web/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
- package/out/web/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
- package/out/web/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
- package/out/web/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
- package/out/web/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
- package/out/web/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
- package/out/web/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
- package/out/web/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
- package/out/web/assets/flowDiagram-A5DVABFB-BpnHUSU7.js +0 -1
- package/out/web/assets/index-CVRg270z.css +0 -1
- package/out/web/assets/index-DxZQr9yD.js +0 -10
- package/out/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/out/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/out/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/out/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/out/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/out/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/out/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/out/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/out/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/out/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/out/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/out/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/out/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/out/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/out/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/out/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/out/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/out/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/out/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/out/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/out/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/out/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/out/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/out/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/out/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/out/web/assets/kanit-latin-400-normal-BUlsQXH3.woff2 +0 -0
- package/out/web/assets/kanit-latin-400-normal-HVZWrfev.woff +0 -0
- package/out/web/assets/kanit-latin-500-normal-CX_4XcKi.woff2 +0 -0
- package/out/web/assets/kanit-latin-500-normal-qBha86O4.woff +0 -0
- package/out/web/assets/kanit-latin-600-normal-0lS78yAd.woff2 +0 -0
- package/out/web/assets/kanit-latin-600-normal-DlacpeTg.woff +0 -0
- package/out/web/assets/kanit-latin-ext-400-normal-B2xPf58u.woff2 +0 -0
- package/out/web/assets/kanit-latin-ext-400-normal-CHvNKHHD.woff +0 -0
- package/out/web/assets/kanit-latin-ext-500-normal-BFdWrG22.woff +0 -0
- package/out/web/assets/kanit-latin-ext-500-normal-EHs3suD6.woff2 +0 -0
- package/out/web/assets/kanit-latin-ext-600-normal-BBDzoLaj.woff +0 -0
- package/out/web/assets/kanit-latin-ext-600-normal-DAX3wtuq.woff2 +0 -0
- package/out/web/assets/kanit-thai-400-normal-D2nliXKa.woff +0 -0
- package/out/web/assets/kanit-thai-400-normal-D80Pglro.woff2 +0 -0
- package/out/web/assets/kanit-thai-500-normal-BB8gri04.woff2 +0 -0
- package/out/web/assets/kanit-thai-500-normal-Iy_w0a80.woff +0 -0
- package/out/web/assets/kanit-thai-600-normal-Bj6oiaDc.woff2 +0 -0
- package/out/web/assets/kanit-thai-600-normal-wbTlPO7I.woff +0 -0
- package/out/web/assets/kanit-vietnamese-400-normal-DRI8YWyb.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-400-normal-dow6Bnto.woff +0 -0
- package/out/web/assets/kanit-vietnamese-500-normal-BzTrpCM3.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-500-normal-T1ndT7MF.woff +0 -0
- package/out/web/assets/kanit-vietnamese-600-normal-Bi7fw3I4.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-600-normal-DXCRAa_8.woff +0 -0
- package/out/web/assets/mali-latin-400-normal-ByPcZ8Gx.woff +0 -0
- package/out/web/assets/mali-latin-400-normal-Cuc6Ykl8.woff2 +0 -0
- package/out/web/assets/mali-latin-500-normal-B01M-LP6.woff2 +0 -0
- package/out/web/assets/mali-latin-500-normal-Thgqw_9f.woff +0 -0
- package/out/web/assets/mali-latin-600-normal-B9TiUNpT.woff2 +0 -0
- package/out/web/assets/mali-latin-600-normal-CycpQCwU.woff +0 -0
- package/out/web/assets/mali-latin-ext-400-normal-DUVdJQO4.woff +0 -0
- package/out/web/assets/mali-latin-ext-400-normal-iCG1ALuJ.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-500-normal-BfJE4UMZ.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-500-normal-FoLEyOKS.woff +0 -0
- package/out/web/assets/mali-latin-ext-600-normal-BTvIfiCp.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-600-normal-DAQcLVmD.woff +0 -0
- package/out/web/assets/mali-thai-400-normal-BO7A3bLZ.woff2 +0 -0
- package/out/web/assets/mali-thai-400-normal-CX9VrjTn.woff +0 -0
- package/out/web/assets/mali-thai-500-normal-Cph2qha9.woff +0 -0
- package/out/web/assets/mali-thai-500-normal-D89rMT77.woff2 +0 -0
- package/out/web/assets/mali-thai-600-normal-DPgXT6rZ.woff +0 -0
- package/out/web/assets/mali-thai-600-normal-DlTx3OsB.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-400-normal-DUKxzXaz.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-400-normal-gFDLvsOK.woff +0 -0
- package/out/web/assets/mali-vietnamese-500-normal--OY07q2c.woff +0 -0
- package/out/web/assets/mali-vietnamese-500-normal-KDrNRwfW.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-600-normal-CtTMUU7T.woff +0 -0
- package/out/web/assets/mali-vietnamese-600-normal-DFlJr66u.woff2 +0 -0
- package/out/web/assets/mermaid.core-DYGGlqOf.js +0 -11
- package/out/web/assets/mitr-latin-400-normal-Cb18vPmZ.woff +0 -0
- package/out/web/assets/mitr-latin-400-normal-CwbkLQ4a.woff2 +0 -0
- package/out/web/assets/mitr-latin-500-normal-B4JOhzAi.woff +0 -0
- package/out/web/assets/mitr-latin-500-normal-BmClOow2.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-400-normal-B3CPG7Yo.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-400-normal-DTx65hiC.woff +0 -0
- package/out/web/assets/mitr-latin-ext-500-normal-B_Diajz1.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-500-normal-DYOsVaVT.woff +0 -0
- package/out/web/assets/mitr-thai-400-normal-CS4Do6aM.woff +0 -0
- package/out/web/assets/mitr-thai-400-normal-CXWaAdVj.woff2 +0 -0
- package/out/web/assets/mitr-thai-500-normal-CVdBrEVH.woff2 +0 -0
- package/out/web/assets/mitr-thai-500-normal-CW_B5D-i.woff +0 -0
- package/out/web/assets/mitr-vietnamese-400-normal-CPMGWyoC.woff2 +0 -0
- package/out/web/assets/mitr-vietnamese-400-normal-Z6XhIpdY.woff +0 -0
- package/out/web/assets/mitr-vietnamese-500-normal-CDrv0585.woff2 +0 -0
- package/out/web/assets/mitr-vietnamese-500-normal-CMQWyq-Z.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-400-normal-BaWBrqFP.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-400-normal-Dh_FJjOB.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-500-normal-BC04jsmm.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-500-normal-fyBKClF1.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-600-normal-CemcjnVR.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-600-normal-Dbc-dNO6.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-400-normal-B-1H0YkH.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-400-normal-nBP59pVw.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-500-normal-B-ZWb8SZ.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-500-normal-CrEHO7C8.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-600-normal-PkMZo0xa.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-600-normal-maHHBsez.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-400-normal-BEOmKAI1.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-400-normal-Dxb_unuU.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-500-normal-BOGXO2tw.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-500-normal-CU_X86GQ.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-600-normal-CmgB8_JK.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-600-normal-Cs73sVjl.woff2 +0 -0
- package/out/web/assets/oauthManager-DNiwM8Rn.js +0 -2
- package/out/web/assets/oauthManager-DuamS1Av.css +0 -1
- package/out/web/assets/outfit-latin-300-normal-AWLfuCom.woff +0 -0
- package/out/web/assets/outfit-latin-300-normal-CRYTwY6m.woff2 +0 -0
- package/out/web/assets/outfit-latin-400-normal-BGsTXAXT.woff2 +0 -0
- package/out/web/assets/outfit-latin-400-normal-DMwTpYkH.woff +0 -0
- package/out/web/assets/outfit-latin-500-normal-ClnHRwRh.woff +0 -0
- package/out/web/assets/outfit-latin-500-normal-DKnIMDSk.woff2 +0 -0
- package/out/web/assets/outfit-latin-600-normal-B7SfZ07L.woff2 +0 -0
- package/out/web/assets/outfit-latin-600-normal-BEfTtDA7.woff +0 -0
- package/out/web/assets/outfit-latin-ext-300-normal-BYS6Dpvq.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-300-normal-CMIMshEd.woff +0 -0
- package/out/web/assets/outfit-latin-ext-400-normal-5tcqmc2S.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-400-normal-DHm7mdGe.woff +0 -0
- package/out/web/assets/outfit-latin-ext-500-normal-DrCvqoFD.woff +0 -0
- package/out/web/assets/outfit-latin-ext-500-normal-zeox_O30.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-600-normal-B85nYjL1.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-600-normal-CWJcPgd7.woff +0 -0
- package/out/web/assets/preload-helper-D0uHx7FM.js +0 -1
- package/out/web/assets/prompt-latin-ext-400-normal-1pHbN9uy.woff +0 -0
- package/out/web/assets/prompt-latin-ext-400-normal-DdSafGZ9.woff2 +0 -0
- package/out/web/assets/prompt-latin-ext-500-normal--EZ1um7s.woff2 +0 -0
- package/out/web/assets/prompt-latin-ext-500-normal-D-lI1EVT.woff +0 -0
- package/out/web/assets/prompt-latin-ext-600-normal-C8b50x67.woff +0 -0
- package/out/web/assets/prompt-latin-ext-600-normal-Cg9L7iJU.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-400-normal-BCPzsgPT.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-400-normal-D4pLyeNK.woff +0 -0
- package/out/web/assets/prompt-vietnamese-500-normal-DmzxmPwa.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-500-normal-w_sS_j2F.woff +0 -0
- package/out/web/assets/prompt-vietnamese-600-normal-1dyohtNh.woff +0 -0
- package/out/web/assets/prompt-vietnamese-600-normal-7QWjJBsF.woff2 +0 -0
- package/out/web/assets/sarabun-latin-400-normal-DmguIS-7.woff +0 -0
- package/out/web/assets/sarabun-latin-400-normal-URPBxl-K.woff2 +0 -0
- package/out/web/assets/sarabun-latin-500-normal-BjUTcdxu.woff2 +0 -0
- package/out/web/assets/sarabun-latin-500-normal-CJexTAnl.woff +0 -0
- package/out/web/assets/sarabun-latin-600-normal-9FonlkKx.woff +0 -0
- package/out/web/assets/sarabun-latin-600-normal-DMD3TROr.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-400-normal-BbP7GpLL.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-400-normal-BsmTn0SS.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-500-normal-Cot16Bd2.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-500-normal-DE1LysqI.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-600-normal-0tXu9x_i.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-600-normal-BRxjKUQ6.woff2 +0 -0
- package/out/web/assets/sarabun-thai-400-normal-C2DaJlKK.woff2 +0 -0
- package/out/web/assets/sarabun-thai-400-normal-CH-UbWgg.woff +0 -0
- package/out/web/assets/sarabun-thai-500-normal-BVssjame.woff2 +0 -0
- package/out/web/assets/sarabun-thai-500-normal-C3iDLEzi.woff +0 -0
- package/out/web/assets/sarabun-thai-600-normal-3dIAQ-_s.woff2 +0 -0
- package/out/web/assets/sarabun-thai-600-normal-DWKeTe6a.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-400-normal-DPfkSCMy.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-400-normal-igdrzAGY.woff2 +0 -0
- package/out/web/assets/sarabun-vietnamese-500-normal-CpRVvGRU.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-500-normal-Dpe7Br9m.woff2 +0 -0
- package/out/web/assets/sarabun-vietnamese-600-normal-BMbOgAW-.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-600-normal-DkxrOlLB.woff2 +0 -0
- package/out/web/assets/stateDiagram-v2-4QOOHH4V-s6P9g2_b.js +0 -1
- package/out/web/assets/swimlanesDiagram-VK2B7HYN-CV9fOLrV.js +0 -8
- package/out/web/assets/tauri-CNrHQ2Gb.js +0 -3
- package/out/web/assets/window-DkIhgI7B.js +0 -1
|
@@ -3,8 +3,8 @@ use std::path::Path;
|
|
|
3
3
|
use super::super::*;
|
|
4
4
|
|
|
5
5
|
/// Handles the subset of `execute_tool` actions related to browser.
|
|
6
|
-
///
|
|
7
|
-
///
|
|
6
|
+
/// Keeps legacy argument aliases at the orchestration seam; session behavior
|
|
7
|
+
/// and browser result verification live in the shared browser module.
|
|
8
8
|
pub(in crate::orchestration) async fn execute(
|
|
9
9
|
action: &str,
|
|
10
10
|
input: &AgentInput,
|
|
@@ -13,142 +13,19 @@ pub(in crate::orchestration) async fn execute(
|
|
|
13
13
|
_chat_id: &str,
|
|
14
14
|
_approve_cb: &mut (dyn FnMut(&AgentApproval) -> Result<ApprovalOutcome, String> + Send),
|
|
15
15
|
) -> Result<String, OrchestrationError> {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
&input.path
|
|
22
|
-
} else {
|
|
23
|
-
return Err(OrchestrationError::Agent(
|
|
24
|
-
"browser_open requires 'url'".into(),
|
|
25
|
-
));
|
|
26
|
-
};
|
|
27
|
-
if crate::is_browser_running(config).await {
|
|
28
|
-
let result = crate::browser::navigate(config, url)
|
|
29
|
-
.await
|
|
30
|
-
.map_err(OrchestrationError::Agent)?;
|
|
31
|
-
Ok(result)
|
|
32
|
-
} else {
|
|
33
|
-
let opened = if cfg!(target_os = "macos") {
|
|
34
|
-
std::process::Command::new("open").arg(url).spawn().is_ok()
|
|
35
|
-
} else if cfg!(target_os = "windows") {
|
|
36
|
-
std::process::Command::new("cmd")
|
|
37
|
-
.args(["/C", "start", url])
|
|
38
|
-
.spawn()
|
|
39
|
-
.is_ok()
|
|
40
|
-
} else {
|
|
41
|
-
std::process::Command::new("xdg-open")
|
|
42
|
-
.arg(url)
|
|
43
|
-
.spawn()
|
|
44
|
-
.is_ok()
|
|
45
|
-
};
|
|
46
|
-
if opened {
|
|
47
|
-
Ok(format!(
|
|
48
|
-
"Mint Auto is not active. Opened {url} in your default browser instead."
|
|
49
|
-
))
|
|
50
|
-
} else {
|
|
51
|
-
Err(OrchestrationError::Agent(
|
|
52
|
-
"Failed to open URL in default browser.".into(),
|
|
53
|
-
))
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
"browser_click" => {
|
|
58
|
-
let selector = if !input.selector.is_empty() {
|
|
59
|
-
&input.selector
|
|
60
|
-
} else if !input.path.is_empty() {
|
|
61
|
-
&input.path
|
|
62
|
-
} else {
|
|
63
|
-
return Err(OrchestrationError::Agent(
|
|
64
|
-
"browser_click requires 'selector'".into(),
|
|
65
|
-
));
|
|
66
|
-
};
|
|
67
|
-
let result = crate::browser::click(config, selector)
|
|
68
|
-
.await
|
|
69
|
-
.map_err(OrchestrationError::Agent)?;
|
|
70
|
-
Ok(result)
|
|
71
|
-
}
|
|
72
|
-
"browser_type" => {
|
|
73
|
-
let selector = if !input.selector.is_empty() {
|
|
74
|
-
&input.selector
|
|
75
|
-
} else if !input.path.is_empty() {
|
|
76
|
-
&input.path
|
|
77
|
-
} else {
|
|
78
|
-
return Err(OrchestrationError::Agent(
|
|
79
|
-
"browser_type requires 'selector'".into(),
|
|
80
|
-
));
|
|
81
|
-
};
|
|
82
|
-
let text = if !input.text.is_empty() {
|
|
83
|
-
&input.text
|
|
84
|
-
} else if !input.query.is_empty() {
|
|
85
|
-
&input.query
|
|
86
|
-
} else {
|
|
87
|
-
return Err(OrchestrationError::Agent(
|
|
88
|
-
"browser_type requires 'text'".into(),
|
|
89
|
-
));
|
|
90
|
-
};
|
|
91
|
-
let result = crate::browser::type_text(config, selector, text)
|
|
92
|
-
.await
|
|
93
|
-
.map_err(OrchestrationError::Agent)?;
|
|
94
|
-
Ok(result)
|
|
95
|
-
}
|
|
96
|
-
"browser_read" => {
|
|
97
|
-
let result = crate::browser::read_page_text(config)
|
|
98
|
-
.await
|
|
99
|
-
.map_err(OrchestrationError::Agent)?;
|
|
100
|
-
Ok(result)
|
|
101
|
-
}
|
|
102
|
-
"browser_mouse_move" => {
|
|
103
|
-
let x = input.x.ok_or_else(|| {
|
|
104
|
-
OrchestrationError::Agent("browser_mouse_move requires 'x'".into())
|
|
105
|
-
})?;
|
|
106
|
-
let y = input.y.ok_or_else(|| {
|
|
107
|
-
OrchestrationError::Agent("browser_mouse_move requires 'y'".into())
|
|
108
|
-
})?;
|
|
109
|
-
let result = crate::browser::mouse_move(config, x, y)
|
|
110
|
-
.await
|
|
111
|
-
.map_err(OrchestrationError::Agent)?;
|
|
112
|
-
Ok(result)
|
|
113
|
-
}
|
|
114
|
-
"browser_mouse_click" => {
|
|
115
|
-
let x = input.x.ok_or_else(|| {
|
|
116
|
-
OrchestrationError::Agent("browser_mouse_click requires 'x'".into())
|
|
117
|
-
})?;
|
|
118
|
-
let y = input.y.ok_or_else(|| {
|
|
119
|
-
OrchestrationError::Agent("browser_mouse_click requires 'y'".into())
|
|
120
|
-
})?;
|
|
121
|
-
let button = if input.button.is_empty() {
|
|
122
|
-
"left"
|
|
123
|
-
} else {
|
|
124
|
-
&input.button
|
|
125
|
-
};
|
|
126
|
-
let result = crate::browser::mouse_click(config, x, y, button)
|
|
127
|
-
.await
|
|
128
|
-
.map_err(OrchestrationError::Agent)?;
|
|
129
|
-
Ok(result)
|
|
130
|
-
}
|
|
131
|
-
"browser_key_press" => {
|
|
132
|
-
let key = if !input.key.is_empty() {
|
|
133
|
-
&input.key
|
|
134
|
-
} else {
|
|
135
|
-
return Err(OrchestrationError::Agent(
|
|
136
|
-
"browser_key_press requires 'key'".into(),
|
|
137
|
-
));
|
|
138
|
-
};
|
|
139
|
-
let result = crate::browser::key_press(config, key)
|
|
140
|
-
.await
|
|
141
|
-
.map_err(OrchestrationError::Agent)?;
|
|
142
|
-
Ok(result)
|
|
143
|
-
}
|
|
144
|
-
"browser_screenshot" => {
|
|
145
|
-
let data = crate::browser::screenshot(config)
|
|
146
|
-
.await
|
|
147
|
-
.map_err(OrchestrationError::Agent)?;
|
|
148
|
-
Ok(format!("data:image/png;base64,{data}"))
|
|
149
|
-
}
|
|
150
|
-
_ => unreachable!(
|
|
151
|
-
"execute_tool routed an unhandled action into tools::browser::execute: {action}"
|
|
152
|
-
),
|
|
16
|
+
let mut args =
|
|
17
|
+
serde_json::to_value(input).map_err(|e| OrchestrationError::Agent(e.to_string()))?;
|
|
18
|
+
// Preserve the established legacy argument aliases.
|
|
19
|
+
if input.url.is_empty() && !input.path.is_empty() {
|
|
20
|
+
args["url"] = input.path.clone().into();
|
|
153
21
|
}
|
|
22
|
+
if input.selector.is_empty() && input.element_ref.is_empty() && !input.path.is_empty() {
|
|
23
|
+
args["selector"] = input.path.clone().into();
|
|
24
|
+
}
|
|
25
|
+
if input.text.is_empty() && !input.query.is_empty() {
|
|
26
|
+
args["text"] = input.query.clone().into();
|
|
27
|
+
}
|
|
28
|
+
crate::browser::execute_action(config, action, &args)
|
|
29
|
+
.await
|
|
30
|
+
.map_err(OrchestrationError::Agent)
|
|
154
31
|
}
|
|
@@ -74,7 +74,8 @@ pub(in crate::orchestration) async fn execute(
|
|
|
74
74
|
let mut results = Vec::new();
|
|
75
75
|
|
|
76
76
|
if let Ok(memory) = MemoryStore::open_default() {
|
|
77
|
-
if let Ok(interactions) = memory.
|
|
77
|
+
if let Ok(interactions) = memory.recent_completed_interactions_for_chat(chat_id, 50)
|
|
78
|
+
{
|
|
78
79
|
for item in interactions.iter().rev() {
|
|
79
80
|
if item.user_text.to_ascii_lowercase().contains(&query_lower)
|
|
80
81
|
|| item.ai_text.to_ascii_lowercase().contains(&query_lower)
|
|
@@ -67,7 +67,7 @@ pub(in crate::orchestration) async fn execute(
|
|
|
67
67
|
Err(e) => Ok(format!(
|
|
68
68
|
"Web search error: {e}. Web search is currently unavailable. \
|
|
69
69
|
Do not try to search again. You MUST now proceed by calling the 'finish' action. \
|
|
70
|
-
In your finish summary, explain
|
|
70
|
+
In your finish summary, explain in the user's language that the web search failed (mentioning the search error: {e}), \
|
|
71
71
|
and then answer their query using your own pre-existing knowledge/database."
|
|
72
72
|
)),
|
|
73
73
|
}
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
use super::persona;
|
|
2
2
|
use crate::MintConfig;
|
|
3
3
|
|
|
4
|
-
pub(crate) fn
|
|
5
|
-
use std::net::TcpStream;
|
|
4
|
+
pub(crate) fn browser_endpoint_available(config: &MintConfig) -> bool {
|
|
5
|
+
use std::net::{TcpStream, ToSocketAddrs};
|
|
6
6
|
use std::time::Duration;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
let endpoint = config
|
|
8
|
+
.extra
|
|
9
|
+
.get("browserDebugUrl")
|
|
10
|
+
.and_then(serde_json::Value::as_str)
|
|
11
|
+
.unwrap_or("http://127.0.0.1:9222/json/list");
|
|
12
|
+
let Ok(url) = reqwest::Url::parse(endpoint) else {
|
|
13
|
+
return false;
|
|
14
|
+
};
|
|
15
|
+
let Some(host) = url.host_str() else {
|
|
16
|
+
return false;
|
|
17
|
+
};
|
|
18
|
+
let Some(port) = url.port_or_known_default() else {
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
(host, port)
|
|
22
|
+
.to_socket_addrs()
|
|
23
|
+
.ok()
|
|
24
|
+
.is_some_and(|mut addresses| {
|
|
25
|
+
addresses.any(|address| {
|
|
26
|
+
TcpStream::connect_timeout(&address, Duration::from_millis(50)).is_ok()
|
|
27
|
+
})
|
|
28
|
+
})
|
|
12
29
|
}
|
|
13
30
|
|
|
14
31
|
pub(crate) const PLAN_MODE_ALLOWED_ACTIONS: &[&str] = &[
|
|
@@ -47,6 +64,9 @@ pub(crate) const PLAN_MODE_ALLOWED_ACTIONS: &[&str] = &[
|
|
|
47
64
|
"mcp_list_tools",
|
|
48
65
|
"browser_open",
|
|
49
66
|
"browser_read",
|
|
67
|
+
"browser_observe",
|
|
68
|
+
"browser_wait",
|
|
69
|
+
"browser_scroll",
|
|
50
70
|
"browser_mouse_move",
|
|
51
71
|
"browser_screenshot",
|
|
52
72
|
"run_shell",
|
|
@@ -145,15 +165,8 @@ pub fn build_system_prompt(
|
|
|
145
165
|
) -> String {
|
|
146
166
|
let mut allowed_actions = base_allowed_actions();
|
|
147
167
|
|
|
148
|
-
if
|
|
149
|
-
allowed_actions.
|
|
150
|
-
allowed_actions.push("browser_click");
|
|
151
|
-
allowed_actions.push("browser_type");
|
|
152
|
-
allowed_actions.push("browser_read");
|
|
153
|
-
allowed_actions.push("browser_mouse_move");
|
|
154
|
-
allowed_actions.push("browser_mouse_click");
|
|
155
|
-
allowed_actions.push("browser_key_press");
|
|
156
|
-
allowed_actions.push("browser_screenshot");
|
|
168
|
+
if browser_endpoint_available(config) {
|
|
169
|
+
allowed_actions.extend_from_slice(crate::browser::BROWSER_TOOLS);
|
|
157
170
|
}
|
|
158
171
|
|
|
159
172
|
if !config.avatar_token.is_empty() {
|
|
@@ -182,7 +195,7 @@ pub fn build_system_prompt(
|
|
|
182
195
|
.push("- read_file: {\"path\":\"relative/path\",\"startLine\":1,\"endLine\":240} (if the file has more lines than the requested range, the result says so explicitly and tells you the exact startLine/endLine to use next — re-read with those before assuming you've seen the whole file)");
|
|
183
196
|
}
|
|
184
197
|
if allowed_actions.contains(&"search_code") {
|
|
185
|
-
input_formats.push("- search_code: {\"query\":\"text\",\"path\":\".\",\"limit\":20}");
|
|
198
|
+
input_formats.push("- search_code: {\"query\":\"text\",\"path\":\".\",\"limit\":20} (path MUST be \".\" or a sub-path of the workspace — never use home dir, username, or absolute paths outside the project)");
|
|
186
199
|
}
|
|
187
200
|
if allowed_actions.contains(&"symbols") {
|
|
188
201
|
input_formats.push("- symbols: {\"path\":\".\",\"limit\":100}");
|
|
@@ -239,6 +252,9 @@ pub fn build_system_prompt(
|
|
|
239
252
|
if allowed_actions.contains(&"browser_open") {
|
|
240
253
|
input_formats.push("- browser_open: {\"url\":\"https://example.com\"}");
|
|
241
254
|
}
|
|
255
|
+
if allowed_actions.contains(&"browser_observe") {
|
|
256
|
+
input_formats.push("- browser_observe: {textOffset?:number,elementOffset?:number,takeoverComplete?:boolean}; browser_tabs: {operation:list|open|select|close,tabId?:string,url?:string}; browser_fill: {elementRef?:string,selector?:string,text:string}; browser_select: {elementRef?:string,selector?:string,value:string}; browser_scroll: {elementRef?:string,selector?:string,x?:number,y?:number}; browser_wait: {condition:url|text|visible|hidden,value?:string,elementRef?:string,selector?:string,timeoutMs?:number}. browser_click/browser_type also accept elementRef instead of selector.");
|
|
257
|
+
}
|
|
242
258
|
if allowed_actions.contains(&"browser_click") {
|
|
243
259
|
input_formats.push("- browser_click: {\"selector\":\"button.submit-btn\"} (CSS selector, or text=Login, contains=Submit, xpath=//button)");
|
|
244
260
|
}
|
|
@@ -430,7 +446,7 @@ pub fn build_system_prompt(
|
|
|
430
446
|
if allowed_actions.contains(&"generate_video") {
|
|
431
447
|
input_formats.push("- generate_video / veo.generate: {\"prompt\":\"sunset over ocean waves\",\"aspectRatio\":\"16:9\",\"duration\":5}");
|
|
432
448
|
}
|
|
433
|
-
input_formats.push("- finish: {\"summary\":\"complete final answer in
|
|
449
|
+
input_formats.push("- finish: {\"summary\":\"complete final answer in the user's language, covering every part of what was asked\",\"verification\":\"what you ran via the verify tool and its result — REQUIRED (finish will be rejected) if this run used apply_patch or write_file, unless you explain here why no check applies (no test suite, documentation-only change, etc.)\"}");
|
|
434
450
|
|
|
435
451
|
let input_formats_str = input_formats.join("\n");
|
|
436
452
|
|
|
@@ -464,6 +480,9 @@ pub fn build_system_prompt(
|
|
|
464
480
|
rules.push(
|
|
465
481
|
"2a. BOUND INVESTIGATION: Keep investigations concise and targeted. Do NOT recursively read dozens of source files across directories. After 2-4 read/search inspection calls, synthesize your findings and present your answer or plan. Do NOT get trapped in endless exploratory reading.",
|
|
466
482
|
);
|
|
483
|
+
rules.push(
|
|
484
|
+
"2b. SEARCH PATH SCOPE: For search_code, always use \".\" or a specific sub-directory of the current workspace as the path. NEVER use a home directory, username path, or any path outside the project root — doing so scans thousands of unrelated files and spikes CPU.",
|
|
485
|
+
);
|
|
467
486
|
}
|
|
468
487
|
if allowed_actions.contains(&"apply_patch") && allowed_actions.contains(&"write_file") {
|
|
469
488
|
rules.push("3. Use apply_patch for all edits to existing files (write_file is only for creating new files). For edits across multiple sections of a file, supply separate small hunks in the 'hunks' array (one hunk per edit location). Keep oldText in each hunk minimal (only 1-3 exact lines needed to pinpoint the edit). NEVER bundle multiple separate edits into a single giant hunk that spans the entire file.");
|
|
@@ -527,6 +546,9 @@ pub fn build_system_prompt(
|
|
|
527
546
|
if allowed_actions.contains(&"browser_screenshot") {
|
|
528
547
|
rules.push("7h. Use browser_screenshot to capture the current page as a PNG image (base64). Use it to inspect the visual state of the page before deciding where to click.");
|
|
529
548
|
}
|
|
549
|
+
if allowed_actions.contains(&"browser_observe") {
|
|
550
|
+
rules.push("7i. Browser workflow: browser_observe -> action -> inspect the returned observation -> verify the expected result with browser_wait. Each run starts in its own tab. Use browser_tabs to list/open/select/close tabs; select new popup tabs explicitly. Prefer elementRef from the most recent observation over guessing selectors. Old refs expire after observation refresh, navigation, removed nodes, or tab selection. browser_fill replaces text; browser_type appends. browser_select handles native dropdowns; browser_scroll scrolls the viewport or a target. browser_wait accepts condition url/text/visible/hidden, value or target, and timeoutMs (default 10000, maximum 30000). Observations support textOffset and elementOffset pagination. Coordinate actions require a screenshot of the selected tab within 30 seconds. Never retry an ambiguous click or submission automatically; observe and check the result first. input_dispatched is not task completion. Cite observed URL/text/field evidence in finish.verification, or say the task is unverified/blocked. If blocked by login, CAPTCHA, or repeated lack of progress, ask_user for manual takeover; only after user confirmation call browser_observe with takeoverComplete=true.");
|
|
551
|
+
}
|
|
530
552
|
if allowed_actions.contains(&"memory_recall") {
|
|
531
553
|
rules.push("8. Use memory_recall to search past interactions before asking the user to repeat context.");
|
|
532
554
|
}
|
|
@@ -553,14 +575,21 @@ pub fn build_system_prompt(
|
|
|
553
575
|
rules.push(&pin_rule);
|
|
554
576
|
}
|
|
555
577
|
if native {
|
|
556
|
-
rules.push("11. When you
|
|
578
|
+
rules.push("11. When you call tools, you may include a brief 1-line progress note in the user's language explaining what you are about to do next. Do not repeat greetings in intermediate notes before tool calls — state your immediate action directly. Give your final answer in the language the user uses or explicitly requests. When work is complete, call the finish tool and put the entire final answer in its summary field; do not return a plain-text final answer.");
|
|
557
579
|
} else {
|
|
558
|
-
rules.push("11. Keep thought short and concrete.
|
|
580
|
+
rules.push("11. Keep thought short and concrete (1-2 sentences). DO NOT repeat greetings in the thought field — state your immediate action directly. Use the user's language for the thought and final summary, unless they explicitly request another language.");
|
|
559
581
|
}
|
|
560
582
|
rules.push("11a. The final summary must be complete, not just concise. Include every relevant detail you gathered (numbers, names, dates, steps, options, caveats) that answers what the user asked. If the user asked multiple things, address all of them. Only cut filler and repetition, never cut substance. Never truncate a list or explanation just to keep the reply short.");
|
|
561
583
|
rules.push("11b. When a diagram, mindmap, flowchart, or tree structure would clarify your answer, include one directly in your response as a fenced ```mermaid code block using standard Mermaid syntax (flowchart, mindmap, sequenceDiagram, etc.) — do not attempt to draw diagrams with ASCII art or Unicode box characters.");
|
|
584
|
+
rules.push("11c. For rich presentation in your final answers, leverage UI blocks and callouts when helpful: \
|
|
585
|
+
- Comparison / Multi-choice: use fenced ```ui-grid with JSON array:\n```ui-grid\n[{\"icon\": \"message-square\", \"title\": \"...\", \"desc\": \"...\", \"badge\": \"...\"}]\n```\n\
|
|
586
|
+
Each ui-grid array item must be one complete JSON object; keep every field (including badge) inside that item's braces, and validate the JSON before closing the code fence.\n\
|
|
587
|
+
For every JSON-backed card, ensure all properties stay inside their intended object and validate the JSON syntax before closing the code fence.\n\
|
|
588
|
+
- Feature showcases: use fenced ```ui-card with JSON array:\n```ui-card\n[{\"title\": \"...\", \"subtitle\": \"...\", \"icon\": \"file-text\", \"badge\": \"...\", \"details\": {\"Key\": \"Value\"}}]\n```\n\
|
|
589
|
+
- UI Prototypes: use fenced ```ui-mockup with JSON object:\n```ui-mockup\n{\"title\": \"...\", \"subtitle\": \"...\", \"dropzoneText\": \"...\", \"metrics\": {...}}\n```\n\
|
|
590
|
+
- Key insights / alerts: use GitHub callouts (> [!NOTE], > [!TIP], > [!IMPORTANT], > [!WARNING]). Always converse naturally and smoothly; never prefix conversational phrases or greetings with artificial status tags or badge pills. Always put opening and closing ``` fences on their own separate lines.");
|
|
562
591
|
if native {
|
|
563
|
-
rules.push("12. Commands that open URLs, files, folders, or launch apps (e.g. xdg-open, open) run in the background. Once they succeed (exit: 0), you are done
|
|
592
|
+
rules.push("12. Commands that open URLs, files, folders, or launch apps (e.g. xdg-open, open) run in the background. Once they succeed (exit: 0), you are done. Use the finish tool immediately.");
|
|
564
593
|
} else {
|
|
565
594
|
rules.push("12. Commands that open URLs, files, folders, or launch apps (e.g. xdg-open, open) run in the background. Once they succeed (exit: 0), you are done. Use the 'finish' action immediately.");
|
|
566
595
|
}
|
|
@@ -571,27 +600,27 @@ pub fn build_system_prompt(
|
|
|
571
600
|
|
|
572
601
|
let mut prompt = if native {
|
|
573
602
|
format!(
|
|
574
|
-
"You are Mint
|
|
603
|
+
"You are Mint Agent, a pragmatic AI coding agent working in a local workspace. Help with non-coding requests too when your available tools support them.\n\
|
|
575
604
|
You are also Mint: {persona} Keep the personality subtle during technical work: be friendly without adding fluff or reducing precision.\n\
|
|
576
|
-
Follow an inspect -> act -> verify loop using the tools available to you. On every single turn,
|
|
577
|
-
|
|
578
|
-
|
|
605
|
+
Follow an inspect -> act -> verify loop using the tools available to you. On every single turn, call a tool immediately; when the task is complete, call the finish tool with the complete final answer. \
|
|
606
|
+
When calling tools, you may include a brief 1-line progress note in the user's language explaining what you are about to do next. Do not repeat greetings in intermediate notes — state your immediate action directly. Never output a progress note without calling the tool in the same turn. \
|
|
607
|
+
Use finish only when the task is genuinely finished. Put all user-facing final text in finish.summary; never return a plain-text final answer.\n\n\
|
|
579
608
|
Rules:\n\
|
|
580
609
|
{rules}",
|
|
581
|
-
persona = persona::
|
|
610
|
+
persona = persona::PERSONA,
|
|
582
611
|
rules = rules_str
|
|
583
612
|
)
|
|
584
613
|
} else {
|
|
585
614
|
format!(
|
|
586
|
-
"You are Mint
|
|
587
|
-
You are also Mint: {persona} Keep the personality subtle during technical work: be friendly without adding fluff or reducing precision
|
|
615
|
+
"You are Mint Agent, a pragmatic AI coding agent working in a local workspace. Help with non-coding requests too when your available tools support them.\n\
|
|
616
|
+
You are also Mint: {persona} Keep the personality subtle during technical work: be friendly without adding fluff or reducing precision.\n\
|
|
588
617
|
Follow an inspect -> act -> verify loop. Return exactly one JSON object per response, with no markdown:\n\
|
|
589
618
|
{{\"thought\":\"short user-visible progress note\",\"action\":\"{actions}\",\"input\":{{...}}}}\n\n\
|
|
590
619
|
Input formats:\n\
|
|
591
620
|
{inputs}\n\n\
|
|
592
621
|
Rules:\n\
|
|
593
622
|
{rules}",
|
|
594
|
-
persona = persona::
|
|
623
|
+
persona = persona::PERSONA,
|
|
595
624
|
actions = actions_str,
|
|
596
625
|
inputs = input_formats_str,
|
|
597
626
|
rules = rules_str
|
|
@@ -8,7 +8,7 @@ pub fn default_chat_system_instruction() -> String {
|
|
|
8
8
|
"You are Mint, {persona} \
|
|
9
9
|
{completeness} \
|
|
10
10
|
{mature_policy}",
|
|
11
|
-
persona = persona::
|
|
11
|
+
persona = persona::PERSONA,
|
|
12
12
|
completeness = persona::COMPLETENESS_RULE,
|
|
13
13
|
mature_policy = persona::MATURE_CONTENT_POLICY,
|
|
14
14
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// Shared persona/tone fragment. Callers prepend their own opening sentence
|
|
2
2
|
/// (e.g. "You are Mint, ..." or "You are also Mint: ...") before this fragment.
|
|
3
|
-
pub const
|
|
3
|
+
pub const PERSONA: &str = "Mint is a female AI assistant with a cute, warm, and helpful personality. Reply in the language the user uses in their current message, or in the language they explicitly request. Follow language changes naturally across the conversation; do not default to any one language. In Thai, refer to yourself as \"มิ้น\" and use feminine polite particles such as \"ค่ะ\" and \"นะคะ\" where appropriate. In other languages, express the same personality naturally without inserting Thai words or particles. Keep answers clear and accurate; do not force sweet wording into technical explanations.";
|
|
4
4
|
|
|
5
5
|
/// Instruction to give complete, thorough answers rather than truncated ones.
|
|
6
6
|
pub const COMPLETENESS_RULE: &str = "Always give a complete answer, not just a short one: cover every part of what the user asked, include relevant details and context you know, and only trim filler or repetition, never substance. If the user asks a multi-part question, answer all parts.";
|
|
@@ -12,7 +12,7 @@ use std::path::Path;
|
|
|
12
12
|
|
|
13
13
|
use serde_json::{Value, json};
|
|
14
14
|
|
|
15
|
-
use super::agent::{PLAN_MODE_ALLOWED_ACTIONS, base_allowed_actions,
|
|
15
|
+
use super::agent::{PLAN_MODE_ALLOWED_ACTIONS, base_allowed_actions, browser_endpoint_available};
|
|
16
16
|
use crate::MintConfig;
|
|
17
17
|
use crate::chat::ToolSpec;
|
|
18
18
|
use crate::subagents::list_subagents;
|
|
@@ -55,15 +55,8 @@ pub fn tool_catalog(
|
|
|
55
55
|
allow_subagent_dispatch: bool,
|
|
56
56
|
) -> Vec<ToolSpec> {
|
|
57
57
|
let mut allowed = base_allowed_actions();
|
|
58
|
-
if
|
|
59
|
-
allowed.
|
|
60
|
-
allowed.push("browser_click");
|
|
61
|
-
allowed.push("browser_type");
|
|
62
|
-
allowed.push("browser_read");
|
|
63
|
-
allowed.push("browser_mouse_move");
|
|
64
|
-
allowed.push("browser_mouse_click");
|
|
65
|
-
allowed.push("browser_key_press");
|
|
66
|
-
allowed.push("browser_screenshot");
|
|
58
|
+
if browser_endpoint_available(config) {
|
|
59
|
+
allowed.extend_from_slice(crate::browser::BROWSER_TOOLS);
|
|
67
60
|
}
|
|
68
61
|
if !config.avatar_token.is_empty() && !config.avatar_signal_disabled {
|
|
69
62
|
allowed.push("avatar_signal");
|
|
@@ -81,6 +74,11 @@ pub fn tool_catalog(
|
|
|
81
74
|
.filter_map(|action| all_tools().into_iter().find(|t| t.name == action))
|
|
82
75
|
.collect();
|
|
83
76
|
|
|
77
|
+
// Native models need a structured terminal action. Plain text can be a
|
|
78
|
+
// progress preamble or a final reply, but finish.summary is unambiguous
|
|
79
|
+
// and can be streamed as the final answer.
|
|
80
|
+
tools.push(finish_tool());
|
|
81
|
+
|
|
84
82
|
if allow_subagent_dispatch && !plan_mode {
|
|
85
83
|
let subagents = list_subagents(Some(root));
|
|
86
84
|
if !subagents.is_empty() {
|
|
@@ -116,6 +114,26 @@ fn dispatch_subagent_tool(subagents: &[crate::subagents::SubagentDefinition]) ->
|
|
|
116
114
|
)
|
|
117
115
|
}
|
|
118
116
|
|
|
117
|
+
fn finish_tool() -> ToolSpec {
|
|
118
|
+
tool(
|
|
119
|
+
"finish",
|
|
120
|
+
"Complete the task and deliver the final answer. Call this only when no further tool calls are needed. Put the complete user-facing response in summary. If this run changed files, verification must state the check and its result, or explain why no check applies.",
|
|
121
|
+
schema(
|
|
122
|
+
json!({
|
|
123
|
+
"summary": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Complete final answer in the user's language."
|
|
126
|
+
},
|
|
127
|
+
"verification": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"description": "Verification performed after file changes and its result; otherwise omit."
|
|
130
|
+
}
|
|
131
|
+
}),
|
|
132
|
+
&["summary"],
|
|
133
|
+
),
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
119
137
|
fn all_tools() -> Vec<ToolSpec> {
|
|
120
138
|
vec![
|
|
121
139
|
tool(
|
|
@@ -277,26 +295,66 @@ fn all_tools() -> Vec<ToolSpec> {
|
|
|
277
295
|
),
|
|
278
296
|
tool(
|
|
279
297
|
"browser_click",
|
|
280
|
-
"Click an element
|
|
298
|
+
"Click an observed element. Provide elementRef or selector, not both.",
|
|
281
299
|
schema(
|
|
282
|
-
json!({
|
|
283
|
-
|
|
284
|
-
"type": "string",
|
|
285
|
-
"description": "CSS selector, or text=ExactText, contains=PartialText, xpath=//expr."
|
|
286
|
-
}
|
|
287
|
-
}),
|
|
288
|
-
&["selector"],
|
|
300
|
+
json!({"elementRef":{"type":"string"},"selector":{"type":"string"}}),
|
|
301
|
+
&[],
|
|
289
302
|
),
|
|
290
303
|
),
|
|
291
304
|
tool(
|
|
292
305
|
"browser_type",
|
|
293
|
-
"
|
|
306
|
+
"Append text to a field. Provide elementRef or selector, not both.",
|
|
294
307
|
schema(
|
|
295
|
-
json!({
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
308
|
+
json!({"elementRef":{"type":"string"},"selector":{"type":"string"},"text":{"type":"string"}}),
|
|
309
|
+
&["text"],
|
|
310
|
+
),
|
|
311
|
+
),
|
|
312
|
+
tool(
|
|
313
|
+
"browser_fill",
|
|
314
|
+
"Replace a field's value and verify it.",
|
|
315
|
+
schema(
|
|
316
|
+
json!({"elementRef":{"type":"string"},"selector":{"type":"string"},"text":{"type":"string"}}),
|
|
317
|
+
&["text"],
|
|
318
|
+
),
|
|
319
|
+
),
|
|
320
|
+
tool(
|
|
321
|
+
"browser_select",
|
|
322
|
+
"Select a native dropdown option by value.",
|
|
323
|
+
schema(
|
|
324
|
+
json!({"elementRef":{"type":"string"},"selector":{"type":"string"},"value":{"type":"string"}}),
|
|
325
|
+
&["value"],
|
|
326
|
+
),
|
|
327
|
+
),
|
|
328
|
+
tool(
|
|
329
|
+
"browser_observe",
|
|
330
|
+
"Read structured page state and fresh element references. Confirm takeover only after the user has completed it.",
|
|
331
|
+
schema(
|
|
332
|
+
json!({"textOffset":{"type":"integer","minimum":0},"elementOffset":{"type":"integer","minimum":0},"takeoverComplete":{"type":"boolean"}}),
|
|
333
|
+
&[],
|
|
334
|
+
),
|
|
335
|
+
),
|
|
336
|
+
tool(
|
|
337
|
+
"browser_tabs",
|
|
338
|
+
"List/open/select/close tabs. Selection and closure require explicit tabId; popups are never auto-selected.",
|
|
339
|
+
schema(
|
|
340
|
+
json!({"operation":{"type":"string","enum":["list","open","select","close"]},"tabId":{"type":"string"},"url":{"type":"string"}}),
|
|
341
|
+
&["operation"],
|
|
342
|
+
),
|
|
343
|
+
),
|
|
344
|
+
tool(
|
|
345
|
+
"browser_scroll",
|
|
346
|
+
"Scroll the viewport or an observed element by pixels.",
|
|
347
|
+
schema(
|
|
348
|
+
json!({"elementRef":{"type":"string"},"selector":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"}}),
|
|
349
|
+
&[],
|
|
350
|
+
),
|
|
351
|
+
),
|
|
352
|
+
tool(
|
|
353
|
+
"browser_wait",
|
|
354
|
+
"Wait for a URL, text, or element visibility condition; at most 30 seconds.",
|
|
355
|
+
schema(
|
|
356
|
+
json!({"condition":{"type":"string","enum":["url","text","visible","hidden"]},"value":{"type":"string"},"elementRef":{"type":"string"},"selector":{"type":"string"},"timeoutMs":{"type":"integer","minimum":1,"maximum":30000}}),
|
|
357
|
+
&["condition"],
|
|
300
358
|
),
|
|
301
359
|
),
|
|
302
360
|
tool(
|
|
@@ -306,7 +364,7 @@ fn all_tools() -> Vec<ToolSpec> {
|
|
|
306
364
|
),
|
|
307
365
|
tool(
|
|
308
366
|
"browser_mouse_move",
|
|
309
|
-
"Move the
|
|
367
|
+
"Move the browser cursor to viewport (x, y) coordinates.",
|
|
310
368
|
schema(
|
|
311
369
|
json!({ "x": { "type": "number" }, "y": { "type": "number" } }),
|
|
312
370
|
&["x", "y"],
|
|
@@ -1097,4 +1155,14 @@ mod tests {
|
|
|
1097
1155
|
}
|
|
1098
1156
|
}
|
|
1099
1157
|
}
|
|
1158
|
+
|
|
1159
|
+
#[test]
|
|
1160
|
+
fn native_catalog_always_offers_finish() {
|
|
1161
|
+
let config = MintConfig::default();
|
|
1162
|
+
let tools = tool_catalog(&config, false, Path::new("."), true);
|
|
1163
|
+
assert!(
|
|
1164
|
+
tools.iter().any(|tool| tool.name == "finish"),
|
|
1165
|
+
"native tool catalog must include the terminal finish tool"
|
|
1166
|
+
);
|
|
1167
|
+
}
|
|
1100
1168
|
}
|