@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
|
@@ -21,6 +21,7 @@ mod plugins_cli;
|
|
|
21
21
|
mod setup;
|
|
22
22
|
mod skills;
|
|
23
23
|
mod subagent_wizard;
|
|
24
|
+
pub(crate) mod terminal_theme;
|
|
24
25
|
mod updater;
|
|
25
26
|
|
|
26
27
|
pub use commands::Command;
|
|
@@ -29,12 +30,13 @@ pub use interactive::{
|
|
|
29
30
|
run_interactive_chat, run_interactive_chat_with_options,
|
|
30
31
|
};
|
|
31
32
|
|
|
32
|
-
pub const RESET: &str =
|
|
33
|
-
pub const
|
|
34
|
-
pub const
|
|
35
|
-
pub const
|
|
36
|
-
pub const
|
|
37
|
-
pub const
|
|
33
|
+
pub const RESET: &str = terminal_theme::ANSI_RESET;
|
|
34
|
+
pub const BOLD: &str = terminal_theme::ANSI_BOLD;
|
|
35
|
+
pub const MINT: &str = terminal_theme::ANSI_ACCENT;
|
|
36
|
+
pub const BLUE: &str = terminal_theme::ANSI_BLUE;
|
|
37
|
+
pub const DIM: &str = terminal_theme::ANSI_MUTED;
|
|
38
|
+
pub const ERROR: &str = terminal_theme::ANSI_ERROR;
|
|
39
|
+
pub const WARN: &str = terminal_theme::ANSI_WARNING;
|
|
38
40
|
|
|
39
41
|
pub(crate) async fn run_code_agent_with_saved_image(
|
|
40
42
|
task: &str,
|
|
@@ -46,16 +48,29 @@ pub(crate) async fn run_code_agent_with_saved_image(
|
|
|
46
48
|
) -> Result<(Vec<String>, Option<String>)> {
|
|
47
49
|
let sent_image = image_data_uri.clone();
|
|
48
50
|
let sent_video = video_data_uri.clone();
|
|
51
|
+
let tui_handle = options.tui.clone();
|
|
49
52
|
// Follow-up messages the user typed into the queueing box while this
|
|
50
53
|
// turn was still running (see `agent::run_code_agent_with_options`)
|
|
51
54
|
// land here; the caller is responsible for dispatching them. On error
|
|
52
55
|
// the queue is dropped along with the interrupted turn.
|
|
53
56
|
let queue = std::sync::Arc::new(std::sync::Mutex::new(Vec::new()));
|
|
54
|
-
// The box's leftover, not-yet-submitted text (typed but no Enter yet) at
|
|
55
|
-
// the moment the turn ended — same idea as `queue` above, but for the one
|
|
56
|
-
// partial entry that was never confirmed, so the caller can hand it back
|
|
57
|
-
// as the next prompt's starting text instead of dropping it silently.
|
|
58
57
|
let draft = std::sync::Arc::new(std::sync::Mutex::new(None));
|
|
58
|
+
let target_chat_id = options
|
|
59
|
+
.chat_id
|
|
60
|
+
.clone()
|
|
61
|
+
.unwrap_or_else(|| mint_core::CHAT_CLI_ID.to_string());
|
|
62
|
+
if mint_core::is_cli_chat_id(&target_chat_id)
|
|
63
|
+
&& let Ok(memory) = mint_core::MemoryStore::open_default()
|
|
64
|
+
{
|
|
65
|
+
let branch = mint_core::git::get_current_branch(current_dir);
|
|
66
|
+
let lang = mint_core::git::detect_project_language(current_dir);
|
|
67
|
+
let _ = memory.register_cli_session(
|
|
68
|
+
&target_chat_id,
|
|
69
|
+
Some(¤t_dir.to_string_lossy()),
|
|
70
|
+
branch.as_deref(),
|
|
71
|
+
lang.as_deref(),
|
|
72
|
+
);
|
|
73
|
+
}
|
|
59
74
|
let result = agent::run_code_agent_with_options(
|
|
60
75
|
task,
|
|
61
76
|
current_dir,
|
|
@@ -68,16 +83,12 @@ pub(crate) async fn run_code_agent_with_saved_image(
|
|
|
68
83
|
)
|
|
69
84
|
.await;
|
|
70
85
|
result?;
|
|
71
|
-
// This turn just committed a row to the
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
// one that arrived from another surface (web/desktop).
|
|
86
|
+
// This turn just committed a row to the session's chat_id
|
|
87
|
+
// — raise live_sync's watermark past it so the next poll tick doesn't mistake
|
|
88
|
+
// the user's own just-sent message for one that arrived from another surface.
|
|
75
89
|
if let Ok(memory) = mint_core::MemoryStore::open_default()
|
|
76
90
|
&& let Ok(rows) = memory.recent_interactions_for_chat(
|
|
77
|
-
&mint_core::scoped_chat_id(
|
|
78
|
-
mint_core::CHAT_CLI_ID,
|
|
79
|
-
Some(¤t_dir.to_string_lossy()),
|
|
80
|
-
),
|
|
91
|
+
&mint_core::scoped_chat_id(&target_chat_id, Some(¤t_dir.to_string_lossy())),
|
|
81
92
|
1,
|
|
82
93
|
)
|
|
83
94
|
&& let Some(row) = rows.first()
|
|
@@ -85,8 +96,8 @@ pub(crate) async fn run_code_agent_with_saved_image(
|
|
|
85
96
|
mint_core::live_sync::note_own_interaction(row.id);
|
|
86
97
|
}
|
|
87
98
|
// Save any attached images and videos that were sent with the task
|
|
88
|
-
image::save_sent_image_after_send(sent_image.as_deref(), task);
|
|
89
|
-
image::save_sent_image_after_send(sent_video.as_deref(), task);
|
|
99
|
+
image::save_sent_image_after_send(sent_image.as_deref(), task, tui_handle.as_ref());
|
|
100
|
+
image::save_sent_image_after_send(sent_video.as_deref(), task, tui_handle.as_ref());
|
|
90
101
|
let queued = queue
|
|
91
102
|
.lock()
|
|
92
103
|
.map(|mut q| std::mem::take(&mut *q))
|
|
@@ -160,6 +171,8 @@ pub(crate) async fn run_oneshot_agent_task(
|
|
|
160
171
|
plan_mode,
|
|
161
172
|
queueing: false,
|
|
162
173
|
pinned_mcp_server,
|
|
174
|
+
chat_id: None,
|
|
175
|
+
tui: None,
|
|
163
176
|
};
|
|
164
177
|
|
|
165
178
|
let queue = std::sync::Arc::new(std::sync::Mutex::new(Vec::new()));
|
|
@@ -199,7 +212,7 @@ pub(crate) async fn run_oneshot_agent_task(
|
|
|
199
212
|
mint_core::live_sync::note_own_interaction(row.id);
|
|
200
213
|
}
|
|
201
214
|
|
|
202
|
-
image::save_sent_image_after_send(image_data_uri.as_deref(), task);
|
|
215
|
+
image::save_sent_image_after_send(image_data_uri.as_deref(), task, None);
|
|
203
216
|
Ok(())
|
|
204
217
|
}
|
|
205
218
|
|
|
@@ -250,10 +263,22 @@ pub struct Cli {
|
|
|
250
263
|
#[arg(long, global = true)]
|
|
251
264
|
pub plan: bool,
|
|
252
265
|
|
|
266
|
+
/// Explicitly use the full-screen interactive chat interface
|
|
267
|
+
#[arg(long, global = true, conflicts_with = "classic")]
|
|
268
|
+
pub tui: bool,
|
|
269
|
+
|
|
270
|
+
/// Use the classic scrolling interactive interface
|
|
271
|
+
#[arg(long, global = true, conflicts_with = "tui")]
|
|
272
|
+
pub classic: bool,
|
|
273
|
+
|
|
253
274
|
/// Attach an image file to the prompt
|
|
254
275
|
#[arg(long, global = true)]
|
|
255
276
|
pub image: Option<PathBuf>,
|
|
256
277
|
|
|
278
|
+
/// Resume a previous conversation session, or open the interactive session picker
|
|
279
|
+
#[arg(short = 'r', long, global = true)]
|
|
280
|
+
pub resume: Option<Option<String>>,
|
|
281
|
+
|
|
257
282
|
#[command(subcommand)]
|
|
258
283
|
pub command: Option<Command>,
|
|
259
284
|
|
|
@@ -266,7 +291,7 @@ pub struct Cli {
|
|
|
266
291
|
fn install_panic_hook() {
|
|
267
292
|
let default_hook = std::panic::take_hook();
|
|
268
293
|
std::panic::set_hook(Box::new(move |info| {
|
|
269
|
-
|
|
294
|
+
interactive::restore_terminal();
|
|
270
295
|
log_panic_to_file(&info.to_string());
|
|
271
296
|
default_hook(info);
|
|
272
297
|
}));
|
|
@@ -327,7 +352,22 @@ async fn main() -> Result<()> {
|
|
|
327
352
|
} else {
|
|
328
353
|
mint_core::channels::start_channels();
|
|
329
354
|
mint_core::start_cron_scheduler();
|
|
330
|
-
|
|
355
|
+
let resume_id = if let Some(ref r_opt) = cli.resume {
|
|
356
|
+
match r_opt {
|
|
357
|
+
Some(id) => Some(id.clone()),
|
|
358
|
+
None => Some("__prompt__".to_string()),
|
|
359
|
+
}
|
|
360
|
+
} else {
|
|
361
|
+
None
|
|
362
|
+
};
|
|
363
|
+
interactive::run_interactive_chat_with_session(
|
|
364
|
+
cli.model,
|
|
365
|
+
cli.fast,
|
|
366
|
+
cli.plan,
|
|
367
|
+
resume_id,
|
|
368
|
+
!cli.classic,
|
|
369
|
+
)
|
|
370
|
+
.await?;
|
|
331
371
|
}
|
|
332
372
|
}
|
|
333
373
|
Some(cmd) => {
|
|
@@ -361,6 +401,27 @@ mod cli_tests {
|
|
|
361
401
|
assert_eq!(cli.prompt, vec!["explain this function"]);
|
|
362
402
|
}
|
|
363
403
|
|
|
404
|
+
#[test]
|
|
405
|
+
fn parse_tui_flag() {
|
|
406
|
+
let cli = Cli::try_parse_from(["mint", "--tui"]).unwrap();
|
|
407
|
+
assert!(cli.tui);
|
|
408
|
+
assert!(!cli.classic);
|
|
409
|
+
assert!(cli.command.is_none());
|
|
410
|
+
assert!(cli.prompt.is_empty());
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
#[test]
|
|
414
|
+
fn parse_classic_flag() {
|
|
415
|
+
let cli = Cli::try_parse_from(["mint", "--classic"]).unwrap();
|
|
416
|
+
assert!(cli.classic);
|
|
417
|
+
assert!(!cli.tui);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
#[test]
|
|
421
|
+
fn tui_and_classic_conflict() {
|
|
422
|
+
assert!(Cli::try_parse_from(["mint", "--tui", "--classic"]).is_err());
|
|
423
|
+
}
|
|
424
|
+
|
|
364
425
|
#[test]
|
|
365
426
|
fn parse_oneshot_unquoted_prompt_words() {
|
|
366
427
|
let cli = Cli::try_parse_from(["mint", "fix", "all", "tests"]).unwrap();
|
|
@@ -146,6 +146,11 @@ pub(crate) fn hard_wrap(text: &str, max_width: usize) -> Vec<String> {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
pub fn render_markdown_table(table_lines: &[String]) -> String {
|
|
149
|
+
let (term_width, _) = terminal_size_or_default();
|
|
150
|
+
render_markdown_table_with_width(table_lines, term_width)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
fn render_markdown_table_with_width(table_lines: &[String], term_width: u16) -> String {
|
|
149
154
|
let mut rows: Vec<Vec<String>> = Vec::new();
|
|
150
155
|
for line in table_lines {
|
|
151
156
|
let trimmed = line.trim();
|
|
@@ -229,7 +234,6 @@ pub fn render_markdown_table(table_lines: &[String]) -> String {
|
|
|
229
234
|
// that no longer fits gets word-wrapped below rather than left to overflow
|
|
230
235
|
// and break the border characters (see `wrap_cell_text`).
|
|
231
236
|
if num_cols > 0 {
|
|
232
|
-
let (term_width, _) = terminal_size_or_default();
|
|
233
237
|
// Each column contributes `width + 2` (one space of padding either
|
|
234
238
|
// side) plus one border character; there's one extra border character
|
|
235
239
|
// closing the row.
|
|
@@ -310,7 +314,10 @@ pub fn render_markdown_table(table_lines: &[String]) -> String {
|
|
|
310
314
|
rendered.push_str(&render_wrapped_row(
|
|
311
315
|
header,
|
|
312
316
|
&col_widths,
|
|
313
|
-
Some((
|
|
317
|
+
Some((
|
|
318
|
+
crate::terminal_theme::ANSI_BLUE_BOLD,
|
|
319
|
+
crate::terminal_theme::ANSI_RESET,
|
|
320
|
+
)),
|
|
314
321
|
));
|
|
315
322
|
rendered.push_str(&draw_border("├", "┼", "┤", "─", &col_widths));
|
|
316
323
|
}
|
|
@@ -368,10 +375,10 @@ mod table_tests {
|
|
|
368
375
|
"| --- | --- |",
|
|
369
376
|
&format!("| x | {long_cell} |"),
|
|
370
377
|
]);
|
|
371
|
-
let rendered =
|
|
378
|
+
let rendered = render_markdown_table_with_width(&table, 80);
|
|
372
379
|
assert_borders_aligned(&rendered);
|
|
373
|
-
//
|
|
374
|
-
//
|
|
380
|
+
// The test pins the renderer to 80 columns so its result does not
|
|
381
|
+
// depend on whether the test process inherited a real TTY.
|
|
375
382
|
for line in rendered.lines() {
|
|
376
383
|
assert!(
|
|
377
384
|
unicode_width(line) <= 80,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
|
|
2
|
+
|
|
1
3
|
use anyhow::{Result, bail};
|
|
2
4
|
use crossterm::event::{self, Event, KeyCode};
|
|
3
5
|
use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
|
|
@@ -92,9 +94,9 @@ async fn fetch_live_models_with_notice(api_key: &str) -> Vec<String> {
|
|
|
92
94
|
pub async fn run() -> Result<()> {
|
|
93
95
|
let mut config = load_config()?;
|
|
94
96
|
|
|
95
|
-
println!("
|
|
97
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
96
98
|
println!("\x1b[32m Mint CLI Onboarding Wizard\x1b[0m");
|
|
97
|
-
println!("
|
|
99
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
98
100
|
println!("Welcome to Mint! Let's get your workspace configured.");
|
|
99
101
|
println!();
|
|
100
102
|
|
|
@@ -419,7 +421,7 @@ pub async fn run() -> Result<()> {
|
|
|
419
421
|
|
|
420
422
|
// Anthropic
|
|
421
423
|
if is_selected("anthropic", &services) {
|
|
422
|
-
println!("\n
|
|
424
|
+
println!("\n{ANSI_BLUE}--- Anthropic (Claude) API ---\x1b[0m");
|
|
423
425
|
config.anthropic_api_key =
|
|
424
426
|
prompt_sensitive("Anthropic API Key", &config.anthropic_api_key)?;
|
|
425
427
|
let anthropic_models = fetch_models_with_notice(&config, "anthropic").await;
|
|
@@ -435,7 +437,7 @@ pub async fn run() -> Result<()> {
|
|
|
435
437
|
|
|
436
438
|
// OpenAI
|
|
437
439
|
if is_selected("openai", &services) {
|
|
438
|
-
println!("\n
|
|
440
|
+
println!("\n{ANSI_BLUE}--- OpenAI API ---\x1b[0m");
|
|
439
441
|
config.openai_api_key = prompt_sensitive("OpenAI API Key", &config.openai_api_key)?;
|
|
440
442
|
let openai_models = fetch_models_with_notice(&config, "openai").await;
|
|
441
443
|
config.openai_model = prompt_select_or_custom(
|
|
@@ -450,7 +452,7 @@ pub async fn run() -> Result<()> {
|
|
|
450
452
|
|
|
451
453
|
// OpenRouter
|
|
452
454
|
if is_selected("openrouter", &services) {
|
|
453
|
-
println!("\n
|
|
455
|
+
println!("\n{ANSI_BLUE}--- OpenRouter API ---\x1b[0m");
|
|
454
456
|
println!(
|
|
455
457
|
"\x1b[90mOpenRouter model uses a provider/model slug, for example: openai/gpt-4o-mini, anthropic/claude-3.5-sonnet, google/gemini-2.5-flash, meta-llama/llama-3.3-70b-instruct, mistralai/mistral-large\x1b[0m"
|
|
456
458
|
);
|
|
@@ -469,7 +471,7 @@ pub async fn run() -> Result<()> {
|
|
|
469
471
|
|
|
470
472
|
// DeepSeek
|
|
471
473
|
if is_selected("deepseek", &services) {
|
|
472
|
-
println!("\n
|
|
474
|
+
println!("\n{ANSI_BLUE}--- DeepSeek API ---\x1b[0m");
|
|
473
475
|
println!(
|
|
474
476
|
"\x1b[90mDeepSeek uses OpenAI-compatible model names. Prefer deepseek-v4-flash or deepseek-v4-pro; deepseek-chat and deepseek-reasoner are compatibility aliases scheduled for deprecation on 2026-07-24.\x1b[0m"
|
|
475
477
|
);
|
|
@@ -487,7 +489,7 @@ pub async fn run() -> Result<()> {
|
|
|
487
489
|
|
|
488
490
|
// Hugging Face
|
|
489
491
|
if is_selected("huggingface", &services) {
|
|
490
|
-
println!("\n
|
|
492
|
+
println!("\n{ANSI_BLUE}--- Hugging Face API ---\x1b[0m");
|
|
491
493
|
config.hf_api_key = prompt_sensitive("Hugging Face API Key", &config.hf_api_key)?;
|
|
492
494
|
config.hf_model = prompt_select_or_custom(
|
|
493
495
|
"Hugging Face Model",
|
|
@@ -501,7 +503,7 @@ pub async fn run() -> Result<()> {
|
|
|
501
503
|
|
|
502
504
|
// Local OpenAI
|
|
503
505
|
if is_selected("local_openai", &services) {
|
|
504
|
-
println!("\n
|
|
506
|
+
println!("\n{ANSI_BLUE}--- Local OpenAI (e.g. LM Studio) ---\x1b[0m");
|
|
505
507
|
config.local_api_base_url =
|
|
506
508
|
prompt_input("Local OpenAI Base URL", Some(&config.local_api_base_url))?;
|
|
507
509
|
config.local_model_name = prompt_input("Local Model Name", Some(&config.local_model_name))?;
|
|
@@ -511,7 +513,7 @@ pub async fn run() -> Result<()> {
|
|
|
511
513
|
|
|
512
514
|
// Ollama
|
|
513
515
|
if is_selected("ollama", &services) {
|
|
514
|
-
println!("\n
|
|
516
|
+
println!("\n{ANSI_BLUE}--- Ollama ---\x1b[0m");
|
|
515
517
|
config.ollama_host = prompt_input("Ollama Host", Some(&config.ollama_host))?;
|
|
516
518
|
// Get the server up first, so the model list below can actually see it.
|
|
517
519
|
ensure_ollama_serving(&config.ollama_host);
|
|
@@ -540,7 +542,7 @@ pub async fn run() -> Result<()> {
|
|
|
540
542
|
|
|
541
543
|
// Google Search
|
|
542
544
|
if is_selected("google_search", &services) {
|
|
543
|
-
println!("\n
|
|
545
|
+
println!("\n{ANSI_BLUE}--- Google Search API ---\x1b[0m");
|
|
544
546
|
let current_key = config
|
|
545
547
|
.extra
|
|
546
548
|
.get("googleSearchApiKey")
|
|
@@ -573,7 +575,7 @@ pub async fn run() -> Result<()> {
|
|
|
573
575
|
|
|
574
576
|
// Brave Search
|
|
575
577
|
if is_selected("brave_search", &services) {
|
|
576
|
-
println!("\n
|
|
578
|
+
println!("\n{ANSI_BLUE}--- Brave Search API ---\x1b[0m");
|
|
577
579
|
let current_key = config
|
|
578
580
|
.extra
|
|
579
581
|
.get("braveSearchApiKey")
|
|
@@ -593,7 +595,7 @@ pub async fn run() -> Result<()> {
|
|
|
593
595
|
|
|
594
596
|
// SearXNG
|
|
595
597
|
if is_selected("searxng", &services) {
|
|
596
|
-
println!("\n
|
|
598
|
+
println!("\n{ANSI_BLUE}--- SearXNG (self-hosted) ---\x1b[0m");
|
|
597
599
|
let current_url = config
|
|
598
600
|
.extra
|
|
599
601
|
.get("searxngBaseUrl")
|
|
@@ -645,7 +647,7 @@ pub async fn run() -> Result<()> {
|
|
|
645
647
|
.collect();
|
|
646
648
|
|
|
647
649
|
let provider = if configured.len() > 1 {
|
|
648
|
-
println!("\n
|
|
650
|
+
println!("\n{ANSI_BLUE}--- Preferred Search Provider ---\x1b[0m");
|
|
649
651
|
let current = config
|
|
650
652
|
.extra
|
|
651
653
|
.get("searchProvider")
|
|
@@ -681,7 +683,7 @@ pub async fn run() -> Result<()> {
|
|
|
681
683
|
|
|
682
684
|
// Telegram Bot
|
|
683
685
|
if is_selected("telegram", &services) {
|
|
684
|
-
println!("\n
|
|
686
|
+
println!("\n{ANSI_BLUE}--- Telegram Bot Bridge ---\x1b[0m");
|
|
685
687
|
let current_token = config
|
|
686
688
|
.extra
|
|
687
689
|
.get("telegramBotToken")
|
|
@@ -705,7 +707,7 @@ pub async fn run() -> Result<()> {
|
|
|
705
707
|
|
|
706
708
|
// Discord Bot
|
|
707
709
|
if is_selected("discord", &services) {
|
|
708
|
-
println!("\n
|
|
710
|
+
println!("\n{ANSI_BLUE}--- Discord Bot Bridge ---\x1b[0m");
|
|
709
711
|
let current_token = config
|
|
710
712
|
.extra
|
|
711
713
|
.get("discordBotToken")
|
|
@@ -739,7 +741,7 @@ pub async fn run() -> Result<()> {
|
|
|
739
741
|
|
|
740
742
|
// Slack Bot
|
|
741
743
|
if is_selected("slack", &services) {
|
|
742
|
-
println!("\n
|
|
744
|
+
println!("\n{ANSI_BLUE}--- Slack Bot Bridge ---\x1b[0m");
|
|
743
745
|
let current_token = config
|
|
744
746
|
.extra
|
|
745
747
|
.get("slackBotToken")
|
|
@@ -773,7 +775,7 @@ pub async fn run() -> Result<()> {
|
|
|
773
775
|
|
|
774
776
|
// LINE Bot
|
|
775
777
|
if is_selected("line", &services) {
|
|
776
|
-
println!("\n
|
|
778
|
+
println!("\n{ANSI_BLUE}--- LINE Bot Bridge ---\x1b[0m");
|
|
777
779
|
let current_token = config
|
|
778
780
|
.extra
|
|
779
781
|
.get("lineChannelAccessToken")
|
|
@@ -807,7 +809,7 @@ pub async fn run() -> Result<()> {
|
|
|
807
809
|
|
|
808
810
|
// WhatsApp Cloud
|
|
809
811
|
if is_selected("whatsapp", &services) {
|
|
810
|
-
println!("\n
|
|
812
|
+
println!("\n{ANSI_BLUE}--- WhatsApp Cloud Bridge ---\x1b[0m");
|
|
811
813
|
let current_token = config
|
|
812
814
|
.extra
|
|
813
815
|
.get("whatsappCloudAccessToken")
|
|
@@ -863,7 +865,7 @@ pub async fn run() -> Result<()> {
|
|
|
863
865
|
// has no official bot API, so unlike the other bridges here Mint is the
|
|
864
866
|
// one polling a REST endpoint rather than receiving a webhook/socket push)
|
|
865
867
|
if is_selected("signal", &services) {
|
|
866
|
-
println!("\n
|
|
868
|
+
println!("\n{ANSI_BLUE}--- Signal Bridge ---\x1b[0m");
|
|
867
869
|
println!(
|
|
868
870
|
"Needs a self-hosted signal-cli-rest-api instance with a number already \
|
|
869
871
|
linked/registered: https://github.com/bbernhard/signal-cli-rest-api"
|
|
@@ -906,7 +908,7 @@ pub async fn run() -> Result<()> {
|
|
|
906
908
|
// plugin — see `mint gmail auth` — rather than asking for separate
|
|
907
909
|
// IMAP/SMTP credentials)
|
|
908
910
|
if is_selected("email", &services) {
|
|
909
|
-
println!("\n
|
|
911
|
+
println!("\n{ANSI_BLUE}--- Email Bridge (via Gmail) ---\x1b[0m");
|
|
910
912
|
println!(
|
|
911
913
|
"Reuses the same Gmail OAuth connection as the `gmail` plugin. Needs a \
|
|
912
914
|
Google Cloud OAuth client (Client ID/Secret) — see \
|
|
@@ -960,7 +962,7 @@ pub async fn run() -> Result<()> {
|
|
|
960
962
|
|
|
961
963
|
// NanoBanana (Gemini Images)
|
|
962
964
|
if is_selected("img_nanobanana", &services) {
|
|
963
|
-
println!("\n
|
|
965
|
+
println!("\n{ANSI_BLUE}--- Google NanoBanana (Gemini Images) ---\x1b[0m");
|
|
964
966
|
println!(
|
|
965
967
|
"\x1b[90mUses the same Gemini API key as Step 1. Select the image generation model.\x1b[0m"
|
|
966
968
|
);
|
|
@@ -975,7 +977,7 @@ pub async fn run() -> Result<()> {
|
|
|
975
977
|
|
|
976
978
|
// DALL·E
|
|
977
979
|
if is_selected("img_dalle", &services) {
|
|
978
|
-
println!("\n
|
|
980
|
+
println!("\n{ANSI_BLUE}--- OpenAI DALL·E ---\x1b[0m");
|
|
979
981
|
println!(
|
|
980
982
|
"\x1b[90mUses the same OpenAI API key. DALL·E 3 supports only 1 image per request; DALL·E 2 supports up to 10.\x1b[0m"
|
|
981
983
|
);
|
|
@@ -990,7 +992,7 @@ pub async fn run() -> Result<()> {
|
|
|
990
992
|
|
|
991
993
|
// Stability AI
|
|
992
994
|
if is_selected("img_stability", &services) {
|
|
993
|
-
println!("\n
|
|
995
|
+
println!("\n{ANSI_BLUE}--- Stability AI ---\x1b[0m");
|
|
994
996
|
println!(
|
|
995
997
|
"\x1b[90mGet your API key at https://platform.stability.ai/. Supports SD3.5 Large, SD3 Medium, and Stable Image Core.\x1b[0m"
|
|
996
998
|
);
|
|
@@ -1009,7 +1011,7 @@ pub async fn run() -> Result<()> {
|
|
|
1009
1011
|
|
|
1010
1012
|
// Ideogram
|
|
1011
1013
|
if is_selected("img_ideogram", &services) {
|
|
1012
|
-
println!("\n
|
|
1014
|
+
println!("\n{ANSI_BLUE}--- Ideogram ---\x1b[0m");
|
|
1013
1015
|
println!(
|
|
1014
1016
|
"\x1b[90mGet your API key at https://ideogram.ai/api. Supports V_3, V_2, and V_2_TURBO.\x1b[0m"
|
|
1015
1017
|
);
|
|
@@ -1027,7 +1029,7 @@ pub async fn run() -> Result<()> {
|
|
|
1027
1029
|
|
|
1028
1030
|
// Replicate
|
|
1029
1031
|
if is_selected("img_replicate", &services) {
|
|
1030
|
-
println!("\n
|
|
1032
|
+
println!("\n{ANSI_BLUE}--- Replicate ---\x1b[0m");
|
|
1031
1033
|
println!(
|
|
1032
1034
|
"\x1b[90mGet your API token at https://replicate.com/account/api-tokens. Works with FLUX, SDXL, and any public image model.\x1b[0m"
|
|
1033
1035
|
);
|
|
@@ -1046,7 +1048,7 @@ pub async fn run() -> Result<()> {
|
|
|
1046
1048
|
|
|
1047
1049
|
// Black Forest Labs (FLUX API)
|
|
1048
1050
|
if is_selected("img_bfl", &services) {
|
|
1049
|
-
println!("\n
|
|
1051
|
+
println!("\n{ANSI_BLUE}--- Black Forest Labs (FLUX API) ---\x1b[0m");
|
|
1050
1052
|
println!(
|
|
1051
1053
|
"\x1b[90mGet your API key at https://api.bfl.ml. Supports flux-pro-1.1, flux-pro-1.1-ultra, flux-dev, and flux-pro-1.0-fill.\x1b[0m"
|
|
1052
1054
|
);
|
|
@@ -1064,7 +1066,7 @@ pub async fn run() -> Result<()> {
|
|
|
1064
1066
|
|
|
1065
1067
|
// Google Veo (Gemini Videos)
|
|
1066
1068
|
if is_selected("vid_veo", &services) {
|
|
1067
|
-
println!("\n
|
|
1069
|
+
println!("\n{ANSI_BLUE}--- Google Veo (Gemini Videos) ---\x1b[0m");
|
|
1068
1070
|
println!(
|
|
1069
1071
|
"\x1b[90mUses the same Gemini API key as Step 1. Select the video generation model.\x1b[0m"
|
|
1070
1072
|
);
|
|
@@ -1099,7 +1101,7 @@ pub async fn run() -> Result<()> {
|
|
|
1099
1101
|
}
|
|
1100
1102
|
|
|
1101
1103
|
if is_selected("gemini_live", &services) {
|
|
1102
|
-
println!("\n
|
|
1104
|
+
println!("\n{ANSI_BLUE}--- Realtime Live Model (Gemini Live) ---\x1b[0m");
|
|
1103
1105
|
println!(
|
|
1104
1106
|
"\x1b[90mUses the same Gemini API key as Step 1. Select the model used for realtime voice conversations.\x1b[0m"
|
|
1105
1107
|
);
|
|
@@ -1152,7 +1154,7 @@ fn print_services(services: &[OnboardService], cursor: usize) {
|
|
|
1152
1154
|
};
|
|
1153
1155
|
if i == cursor {
|
|
1154
1156
|
println!(
|
|
1155
|
-
"
|
|
1157
|
+
" {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{}\x1b[0m",
|
|
1156
1158
|
checkbox, svc.name
|
|
1157
1159
|
);
|
|
1158
1160
|
} else {
|
|
@@ -1503,7 +1505,7 @@ fn ensure_ollama_serving(host: &str) {
|
|
|
1503
1505
|
pub(crate) fn print_select_options(options: &[String], cursor: usize) {
|
|
1504
1506
|
for (i, option) in options.iter().enumerate() {
|
|
1505
1507
|
if i == cursor {
|
|
1506
|
-
println!("
|
|
1508
|
+
println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", option);
|
|
1507
1509
|
} else {
|
|
1508
1510
|
println!(" {}", option);
|
|
1509
1511
|
}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
//! Provides commands for listing, enabling/disabling, configuring API credentials,
|
|
3
3
|
//! and managing OAuth sign-in for all Built-in Plugins.
|
|
4
4
|
|
|
5
|
+
const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
|
|
6
|
+
const ANSI_BLUE_BOLD: &str = crate::terminal_theme::ANSI_BLUE_BOLD;
|
|
7
|
+
|
|
5
8
|
use anyhow::{Result, anyhow};
|
|
6
9
|
use clap::Subcommand;
|
|
7
10
|
use crossterm::event::{self, Event, KeyCode};
|
|
@@ -222,7 +225,7 @@ pub fn list_plugins(config: &MintConfig) -> Result<()> {
|
|
|
222
225
|
if let Some(st) = matched {
|
|
223
226
|
if st.connected {
|
|
224
227
|
format!(
|
|
225
|
-
"
|
|
228
|
+
"{ANSI_BLUE}Connected ({})\x1b[0m",
|
|
226
229
|
st.account_email.as_deref().unwrap_or("Yes")
|
|
227
230
|
)
|
|
228
231
|
} else {
|
|
@@ -342,7 +345,7 @@ async fn login_plugin_oauth(provider: &str) -> Result<()> {
|
|
|
342
345
|
let (auth_url, _state) = build_auth_url(provider, redirect_uri, client_id.as_deref())
|
|
343
346
|
.ok_or_else(|| anyhow!("Invalid OAuth provider: {provider}"))?;
|
|
344
347
|
|
|
345
|
-
println!("
|
|
348
|
+
println!("{ANSI_BLUE_BOLD}🔑 Mint OAuth Sign-In Authorization\x1b[0m");
|
|
346
349
|
println!(
|
|
347
350
|
" Opening browser for provider: \x1b[32m{}\x1b[0m",
|
|
348
351
|
provider
|
|
@@ -532,7 +535,7 @@ pub async fn run_interactive_plugins_wizard(config: &mut MintConfig) -> Result<(
|
|
|
532
535
|
for (plugin, enabled) in &items {
|
|
533
536
|
if *enabled {
|
|
534
537
|
let title = format!(
|
|
535
|
-
"
|
|
538
|
+
"{ANSI_BLUE_BOLD}⚙️ Authentication Setup for {}\x1b[0m",
|
|
536
539
|
plugin.name
|
|
537
540
|
);
|
|
538
541
|
if plugin.is_oauth {
|
|
@@ -627,7 +630,7 @@ fn prompt_select_option_menu(title: &str, options: &[&str]) -> Result<usize> {
|
|
|
627
630
|
fn print_select_options_list(options: &[&str], cursor: usize) {
|
|
628
631
|
for (i, option) in options.iter().enumerate() {
|
|
629
632
|
if i == cursor {
|
|
630
|
-
println!("
|
|
633
|
+
println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", option);
|
|
631
634
|
} else {
|
|
632
635
|
println!(" {}", option);
|
|
633
636
|
}
|
|
@@ -734,7 +737,7 @@ fn print_plugin_checkbox_items(items: &[(&BuiltinPluginInfo, bool)], cursor: usi
|
|
|
734
737
|
};
|
|
735
738
|
if i == cursor {
|
|
736
739
|
println!(
|
|
737
|
-
"
|
|
740
|
+
" {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{:<18}\x1b[0m \x1b[90m({})\x1b[0m",
|
|
738
741
|
checkbox, plugin.name, plugin.description
|
|
739
742
|
);
|
|
740
743
|
} else {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
|
|
2
|
+
|
|
1
3
|
use anyhow::Result;
|
|
2
4
|
use crossterm::event::{self, Event, KeyCode};
|
|
3
5
|
use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
|
|
@@ -599,7 +601,7 @@ fn print_options(options: &[ToolOption], cursor: usize) {
|
|
|
599
601
|
};
|
|
600
602
|
if i == cursor {
|
|
601
603
|
println!(
|
|
602
|
-
"
|
|
604
|
+
" {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{}\x1b[0m",
|
|
603
605
|
checkbox, opt.name
|
|
604
606
|
);
|
|
605
607
|
} else {
|
|
@@ -612,7 +614,7 @@ fn print_options(options: &[ToolOption], cursor: usize) {
|
|
|
612
614
|
fn print_run_options(options: &[ToolOption], cursor: usize) {
|
|
613
615
|
for (i, opt) in options.iter().enumerate() {
|
|
614
616
|
if i == cursor {
|
|
615
|
-
println!("
|
|
617
|
+
println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", opt.name);
|
|
616
618
|
} else {
|
|
617
619
|
println!(" {}", opt.name);
|
|
618
620
|
}
|
|
@@ -622,9 +624,9 @@ fn print_run_options(options: &[ToolOption], cursor: usize) {
|
|
|
622
624
|
|
|
623
625
|
fn redraw_phase_1(options: &[ToolOption], cursor: usize) {
|
|
624
626
|
print!("\x1b[2J\x1b[1;1H");
|
|
625
|
-
println!("
|
|
627
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
626
628
|
println!("\x1b[32m Mint CLI Tool Manager Wizard\x1b[0m");
|
|
627
|
-
println!("
|
|
629
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
628
630
|
println!("Configure which agent tools are enabled or disabled:");
|
|
629
631
|
println!(
|
|
630
632
|
" \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Space: Toggle | a: All | i: Invert | Enter: Confirm]\x1b[0m"
|
|
@@ -635,9 +637,9 @@ fn redraw_phase_1(options: &[ToolOption], cursor: usize) {
|
|
|
635
637
|
|
|
636
638
|
fn redraw_phase_2(options: &[ToolOption], cursor: usize) {
|
|
637
639
|
print!("\x1b[2J\x1b[1;1H");
|
|
638
|
-
println!("
|
|
640
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
639
641
|
println!("\x1b[32m Configure Native Plugins Access\x1b[0m");
|
|
640
|
-
println!("
|
|
642
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
641
643
|
println!("Select which native plugins are allowed to run:");
|
|
642
644
|
println!(
|
|
643
645
|
" \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Space: Toggle | a: All | i: Invert | Enter: Confirm]\x1b[0m"
|
|
@@ -648,9 +650,9 @@ fn redraw_phase_2(options: &[ToolOption], cursor: usize) {
|
|
|
648
650
|
|
|
649
651
|
fn redraw_phase_3(options: &[ToolOption], cursor: usize) {
|
|
650
652
|
print!("\x1b[2J\x1b[1;1H");
|
|
651
|
-
println!("
|
|
653
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
652
654
|
println!("\x1b[32m Choose where to run Mint AI Agent\x1b[0m");
|
|
653
|
-
println!("
|
|
655
|
+
println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
|
|
654
656
|
println!("Select the environment you want to launch:");
|
|
655
657
|
println!(" \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Enter: Confirm]\x1b[0m");
|
|
656
658
|
println!();
|