@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
|
@@ -37,10 +37,16 @@ pub enum ConfigError {
|
|
|
37
37
|
},
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
fn missing_tui_theme() -> String {
|
|
41
|
+
String::new()
|
|
42
|
+
}
|
|
43
|
+
|
|
40
44
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
41
45
|
#[serde(default, rename_all = "camelCase")]
|
|
42
46
|
pub struct MintConfig {
|
|
43
47
|
pub theme: String,
|
|
48
|
+
#[serde(default = "missing_tui_theme")]
|
|
49
|
+
pub tui_theme: String,
|
|
44
50
|
pub accent_color: String,
|
|
45
51
|
pub language: String,
|
|
46
52
|
pub assistant_mode: String,
|
|
@@ -88,6 +94,15 @@ pub struct MintConfig {
|
|
|
88
94
|
/// Optional per-model temperature overrides, keyed by model id (e.g. "deepseek-chat" => 0.65).
|
|
89
95
|
#[serde(default)]
|
|
90
96
|
pub model_temperatures: std::collections::HashMap<String, f64>,
|
|
97
|
+
/// Whether thinking / reasoning is globally enabled by default.
|
|
98
|
+
#[serde(default = "default_true")]
|
|
99
|
+
pub thinking_enabled: bool,
|
|
100
|
+
/// Default thinking effort: "low" | "medium" | "high" | "extra_high".
|
|
101
|
+
#[serde(default = "default_thinking_effort")]
|
|
102
|
+
pub thinking_effort: String,
|
|
103
|
+
/// Per-model thinking configuration overrides, keyed by model id.
|
|
104
|
+
#[serde(default)]
|
|
105
|
+
pub model_thinking_configs: std::collections::HashMap<String, ModelThinkingConfig>,
|
|
91
106
|
/// Active image-generation provider: "nanobanana" | "dalle" | "stability" | "ideogram" | "replicate"
|
|
92
107
|
pub image_gen_provider: String,
|
|
93
108
|
pub dalle_model: String,
|
|
@@ -173,6 +188,22 @@ pub struct MintConfig {
|
|
|
173
188
|
pub extra: BTreeMap<String, Value>,
|
|
174
189
|
}
|
|
175
190
|
|
|
191
|
+
fn default_true() -> bool {
|
|
192
|
+
true
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
fn default_thinking_effort() -> String {
|
|
196
|
+
"medium".into()
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// Thinking/reasoning configuration for a specific model.
|
|
200
|
+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
|
|
201
|
+
#[serde(rename_all = "camelCase")]
|
|
202
|
+
pub struct ModelThinkingConfig {
|
|
203
|
+
pub enabled: bool,
|
|
204
|
+
pub effort: String,
|
|
205
|
+
}
|
|
206
|
+
|
|
176
207
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
|
|
177
208
|
#[serde(rename_all = "camelCase")]
|
|
178
209
|
pub struct AgentConfig {
|
|
@@ -321,6 +352,9 @@ pub struct CustomProvider {
|
|
|
321
352
|
pub id: String,
|
|
322
353
|
/// Human-readable name shown in the UI.
|
|
323
354
|
pub display_name: String,
|
|
355
|
+
/// Optional custom provider logo stored as a small image data URL.
|
|
356
|
+
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
357
|
+
pub logo_data_url: Option<String>,
|
|
324
358
|
/// Base URL of the OpenAI-compatible endpoint, e.g. `"http://localhost:20128/v1"`.
|
|
325
359
|
pub base_url: String,
|
|
326
360
|
/// API key sent as `Authorization: Bearer <key>`. Empty = no auth header.
|
|
@@ -347,6 +381,7 @@ impl Default for MintConfig {
|
|
|
347
381
|
];
|
|
348
382
|
Self {
|
|
349
383
|
theme: "dark".into(),
|
|
384
|
+
tui_theme: "dark".into(),
|
|
350
385
|
accent_color: "#10b981".into(),
|
|
351
386
|
language: "th-TH".into(),
|
|
352
387
|
assistant_mode: "chat".into(),
|
|
@@ -383,6 +418,9 @@ impl Default for MintConfig {
|
|
|
383
418
|
bfl_model: "flux-pro-1.1".into(),
|
|
384
419
|
temperature: None,
|
|
385
420
|
model_temperatures: std::collections::HashMap::new(),
|
|
421
|
+
thinking_enabled: true,
|
|
422
|
+
thinking_effort: "medium".into(),
|
|
423
|
+
model_thinking_configs: std::collections::HashMap::new(),
|
|
386
424
|
show_desktop_widget: true,
|
|
387
425
|
safety_enabled: true,
|
|
388
426
|
sandbox_mode: "prefer".into(),
|
|
@@ -690,6 +728,118 @@ impl MintConfig {
|
|
|
690
728
|
}
|
|
691
729
|
}
|
|
692
730
|
|
|
731
|
+
/// Returns whether thinking/reasoning is supported by a given provider & model.
|
|
732
|
+
pub fn is_thinking_supported_for_model(provider: &str, model: &str) -> bool {
|
|
733
|
+
let p = provider.to_ascii_lowercase();
|
|
734
|
+
let m = model.to_ascii_lowercase();
|
|
735
|
+
if p == "gemini" {
|
|
736
|
+
return m.contains("2.5")
|
|
737
|
+
|| m.contains("2.0")
|
|
738
|
+
|| m.contains("3.")
|
|
739
|
+
|| m.contains("thinking");
|
|
740
|
+
}
|
|
741
|
+
if p == "anthropic" {
|
|
742
|
+
return m.contains("3-7")
|
|
743
|
+
|| m.contains("3.7")
|
|
744
|
+
|| m.contains("sonnet-5")
|
|
745
|
+
|| m.contains("opus-5")
|
|
746
|
+
|| m.contains("sonnet-4")
|
|
747
|
+
|| m.contains("opus-4");
|
|
748
|
+
}
|
|
749
|
+
if p == "openai" || p == "local_openai" {
|
|
750
|
+
return m.starts_with("o1")
|
|
751
|
+
|| m.starts_with("o3")
|
|
752
|
+
|| m.contains("thinking")
|
|
753
|
+
|| m.contains("reason")
|
|
754
|
+
|| m.contains("gpt-5");
|
|
755
|
+
}
|
|
756
|
+
if p == "deepseek" {
|
|
757
|
+
return m.contains("reasoner") || m.contains("r1") || m.contains("deepseek");
|
|
758
|
+
}
|
|
759
|
+
if p == "openrouter" {
|
|
760
|
+
return m.contains("o1")
|
|
761
|
+
|| m.contains("o3")
|
|
762
|
+
|| m.contains("thinking")
|
|
763
|
+
|| m.contains("reason")
|
|
764
|
+
|| m.contains("r1")
|
|
765
|
+
|| m.contains("qwq")
|
|
766
|
+
|| m.contains("glm")
|
|
767
|
+
|| m.contains("deepseek");
|
|
768
|
+
}
|
|
769
|
+
if p == "ollama" {
|
|
770
|
+
return m.contains("r1")
|
|
771
|
+
|| m.contains("qwq")
|
|
772
|
+
|| m.contains("thinking")
|
|
773
|
+
|| m.contains("deepseek");
|
|
774
|
+
}
|
|
775
|
+
false
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/// Returns whether the active model supports thinking/reasoning.
|
|
779
|
+
pub fn is_thinking_supported(&self) -> bool {
|
|
780
|
+
Self::is_thinking_supported_for_model(&self.ai_provider, self.active_model())
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/// Resolves thinking enabled state for a model.
|
|
784
|
+
pub fn resolved_thinking_enabled_for_model(&self, provider: &str, model: &str) -> bool {
|
|
785
|
+
let model_clean = model.trim();
|
|
786
|
+
if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
|
|
787
|
+
return cfg.enabled;
|
|
788
|
+
}
|
|
789
|
+
let lower = model_clean.to_ascii_lowercase();
|
|
790
|
+
for (k, v) in &self.model_thinking_configs {
|
|
791
|
+
if k.to_ascii_lowercase() == lower {
|
|
792
|
+
return v.enabled;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
// If not explicitly configured, enable by default only if model supports it
|
|
796
|
+
if Self::is_thinking_supported_for_model(provider, model) {
|
|
797
|
+
self.thinking_enabled
|
|
798
|
+
} else {
|
|
799
|
+
false
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
/// Resolves thinking effort for a model ("low", "medium", "high", "extra_high").
|
|
804
|
+
pub fn resolved_thinking_effort_for_model(&self, model: &str) -> &str {
|
|
805
|
+
let model_clean = model.trim();
|
|
806
|
+
if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
|
|
807
|
+
return &cfg.effort;
|
|
808
|
+
}
|
|
809
|
+
let lower = model_clean.to_ascii_lowercase();
|
|
810
|
+
for (k, v) in &self.model_thinking_configs {
|
|
811
|
+
if k.to_ascii_lowercase() == lower {
|
|
812
|
+
return &v.effort;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
if self.thinking_effort.is_empty() {
|
|
816
|
+
"medium"
|
|
817
|
+
} else {
|
|
818
|
+
&self.thinking_effort
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
/// Returns (enabled, effort) for the currently active model.
|
|
823
|
+
pub fn resolved_thinking(&self) -> (bool, &str) {
|
|
824
|
+
let model = self.active_model();
|
|
825
|
+
(
|
|
826
|
+
self.resolved_thinking_enabled_for_model(&self.ai_provider, model),
|
|
827
|
+
self.resolved_thinking_effort_for_model(model),
|
|
828
|
+
)
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/// Sets thinking enabled and effort for a specific model id.
|
|
832
|
+
pub fn set_model_thinking(&mut self, model: &str, enabled: bool, effort: &str) {
|
|
833
|
+
let model_key = model.trim().to_string();
|
|
834
|
+
self.model_thinking_configs.insert(
|
|
835
|
+
model_key,
|
|
836
|
+
ModelThinkingConfig {
|
|
837
|
+
enabled,
|
|
838
|
+
effort: effort.trim().to_ascii_lowercase(),
|
|
839
|
+
},
|
|
840
|
+
);
|
|
841
|
+
}
|
|
842
|
+
|
|
693
843
|
/// Sets the active provider and model, saves the configuration to disk, and logs a system event interaction.
|
|
694
844
|
pub fn set_active_model(
|
|
695
845
|
&mut self,
|
|
@@ -935,6 +1085,12 @@ fn load_config_from(path: &Path) -> Result<MintConfig, ConfigError> {
|
|
|
935
1085
|
path: path.to_path_buf(),
|
|
936
1086
|
source,
|
|
937
1087
|
})?;
|
|
1088
|
+
if config.tui_theme.is_empty() {
|
|
1089
|
+
config.tui_theme = match config.theme.as_str() {
|
|
1090
|
+
"system" | "light" => config.theme.clone(),
|
|
1091
|
+
_ => "dark".to_owned(),
|
|
1092
|
+
};
|
|
1093
|
+
}
|
|
938
1094
|
for (key, value) in runtime_extra_defaults() {
|
|
939
1095
|
config.extra.entry(key).or_insert(value);
|
|
940
1096
|
}
|
|
@@ -1359,6 +1515,26 @@ mod tests {
|
|
|
1359
1515
|
assert_eq!(actual, expected);
|
|
1360
1516
|
}
|
|
1361
1517
|
|
|
1518
|
+
#[test]
|
|
1519
|
+
fn custom_provider_logo_survives_config_round_trip() {
|
|
1520
|
+
let logo = "data:image/png;base64,aGVsbG8=";
|
|
1521
|
+
let mut value = serde_json::to_value(MintConfig::default()).unwrap();
|
|
1522
|
+
value["customProviders"] = serde_json::json!([{
|
|
1523
|
+
"id": "test-provider",
|
|
1524
|
+
"displayName": "Test Provider",
|
|
1525
|
+
"baseUrl": "https://example.test/v1",
|
|
1526
|
+
"apiKey": "",
|
|
1527
|
+
"models": [],
|
|
1528
|
+
"headers": [],
|
|
1529
|
+
"logoDataUrl": logo,
|
|
1530
|
+
}]);
|
|
1531
|
+
|
|
1532
|
+
let parsed: MintConfig = serde_json::from_value(value).unwrap();
|
|
1533
|
+
let round_tripped = serde_json::to_value(parsed).unwrap();
|
|
1534
|
+
|
|
1535
|
+
assert_eq!(round_tripped["customProviders"][0]["logoDataUrl"], logo);
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1362
1538
|
#[test]
|
|
1363
1539
|
fn config_preserves_fields_that_have_not_migrated_yet() {
|
|
1364
1540
|
let config: MintConfig =
|
|
@@ -1404,6 +1580,7 @@ mod tests {
|
|
|
1404
1580
|
custom_providers: vec![CustomProvider {
|
|
1405
1581
|
id: "myprovider".into(),
|
|
1406
1582
|
display_name: "My Provider".into(),
|
|
1583
|
+
logo_data_url: None,
|
|
1407
1584
|
base_url: "http://localhost:20128/v1".into(),
|
|
1408
1585
|
api_key: "sk-abc".into(),
|
|
1409
1586
|
models: vec![CustomProviderModel {
|
|
@@ -1583,4 +1760,57 @@ mod tests {
|
|
|
1583
1760
|
config.deepseek_model = "deepseek-chat".into();
|
|
1584
1761
|
assert_eq!(config.resolved_temperature(), 0.6);
|
|
1585
1762
|
}
|
|
1763
|
+
|
|
1764
|
+
#[test]
|
|
1765
|
+
fn test_thinking_configuration_and_resolution() {
|
|
1766
|
+
let mut config = MintConfig::default();
|
|
1767
|
+
|
|
1768
|
+
// Support checks
|
|
1769
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1770
|
+
"anthropic",
|
|
1771
|
+
"claude-3-7-sonnet"
|
|
1772
|
+
));
|
|
1773
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1774
|
+
"gemini",
|
|
1775
|
+
"gemini-2.5-pro"
|
|
1776
|
+
));
|
|
1777
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1778
|
+
"openai", "o3-mini"
|
|
1779
|
+
));
|
|
1780
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1781
|
+
"deepseek",
|
|
1782
|
+
"deepseek-reasoner"
|
|
1783
|
+
));
|
|
1784
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1785
|
+
"openai", "gpt-4o"
|
|
1786
|
+
));
|
|
1787
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1788
|
+
"anthropic",
|
|
1789
|
+
"claude-3-5-haiku"
|
|
1790
|
+
));
|
|
1791
|
+
|
|
1792
|
+
// Global default resolution
|
|
1793
|
+
config.ai_provider = "anthropic".into();
|
|
1794
|
+
config.anthropic_model = "claude-3-7-sonnet".into();
|
|
1795
|
+
let (enabled, effort) = config.resolved_thinking();
|
|
1796
|
+
assert!(enabled);
|
|
1797
|
+
assert_eq!(effort, "medium");
|
|
1798
|
+
|
|
1799
|
+
// Per-model override
|
|
1800
|
+
config.set_model_thinking("claude-3-7-sonnet", true, "high");
|
|
1801
|
+
let (enabled, effort) = config.resolved_thinking();
|
|
1802
|
+
assert!(enabled);
|
|
1803
|
+
assert_eq!(effort, "high");
|
|
1804
|
+
|
|
1805
|
+
// Turning thinking off for model
|
|
1806
|
+
config.set_model_thinking("claude-3-7-sonnet", false, "high");
|
|
1807
|
+
let (enabled, _) = config.resolved_thinking();
|
|
1808
|
+
assert!(!enabled);
|
|
1809
|
+
|
|
1810
|
+
// Unsupported model always resolves enabled to false
|
|
1811
|
+
config.ai_provider = "openai".into();
|
|
1812
|
+
config.openai_model = "gpt-4o".into();
|
|
1813
|
+
let (enabled, _) = config.resolved_thinking();
|
|
1814
|
+
assert!(!enabled);
|
|
1815
|
+
}
|
|
1586
1816
|
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
use serde::{Deserialize, Serialize};
|
|
2
|
+
use std::{
|
|
3
|
+
fs,
|
|
4
|
+
path::{Component, Path, PathBuf},
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const MAX_DEPTH: usize = 9;
|
|
8
|
+
const MAX_CHILDREN: usize = 400;
|
|
9
|
+
const COLLAPSED: &[&str] = &[
|
|
10
|
+
".git",
|
|
11
|
+
"node_modules",
|
|
12
|
+
"target",
|
|
13
|
+
"dist",
|
|
14
|
+
"out",
|
|
15
|
+
"build",
|
|
16
|
+
"coverage",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
20
|
+
#[serde(rename_all = "camelCase")]
|
|
21
|
+
pub struct WorkspaceTreeEntry {
|
|
22
|
+
pub name: String,
|
|
23
|
+
pub path: String,
|
|
24
|
+
pub kind: String,
|
|
25
|
+
pub children: Vec<WorkspaceTreeEntry>,
|
|
26
|
+
}
|
|
27
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
28
|
+
#[serde(rename_all = "camelCase")]
|
|
29
|
+
pub struct WorkspaceSnapshot {
|
|
30
|
+
pub path: String,
|
|
31
|
+
pub tree: WorkspaceTreeEntry,
|
|
32
|
+
pub git: crate::git::BranchInfo,
|
|
33
|
+
pub revision: u64,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
37
|
+
#[serde(rename_all = "camelCase")]
|
|
38
|
+
pub struct WorkspaceOperation {
|
|
39
|
+
pub root: PathBuf,
|
|
40
|
+
pub relative_path: String,
|
|
41
|
+
pub revision: u64,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
pub fn snapshot(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
|
|
45
|
+
let root = canonical_root(&operation.root)?;
|
|
46
|
+
let name = root
|
|
47
|
+
.file_name()
|
|
48
|
+
.map(|n| n.to_string_lossy().to_string())
|
|
49
|
+
.unwrap_or_else(|| root.display().to_string());
|
|
50
|
+
Ok(WorkspaceSnapshot {
|
|
51
|
+
path: root.display().to_string(),
|
|
52
|
+
tree: WorkspaceTreeEntry {
|
|
53
|
+
name,
|
|
54
|
+
path: ".".into(),
|
|
55
|
+
kind: "directory".into(),
|
|
56
|
+
children: children(&root, &root, 0)?,
|
|
57
|
+
},
|
|
58
|
+
git: crate::git::read_branch_info(&root)?,
|
|
59
|
+
revision: operation.revision,
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
pub fn resolve(root: &Path, relative: &str) -> Result<PathBuf, String> {
|
|
63
|
+
let root = canonical_root(root)?;
|
|
64
|
+
let relative = Path::new(relative);
|
|
65
|
+
if relative.as_os_str().is_empty() || relative.is_absolute() {
|
|
66
|
+
return Err("workspace path must be relative".into());
|
|
67
|
+
}
|
|
68
|
+
if relative
|
|
69
|
+
.components()
|
|
70
|
+
.any(|component| !matches!(component, Component::Normal(_)))
|
|
71
|
+
{
|
|
72
|
+
return Err("workspace path escapes root".into());
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let candidate = root.join(relative);
|
|
76
|
+
let mut existing = candidate.as_path();
|
|
77
|
+
while !existing.exists() {
|
|
78
|
+
existing = existing
|
|
79
|
+
.parent()
|
|
80
|
+
.ok_or_else(|| "workspace path escapes root".to_string())?;
|
|
81
|
+
}
|
|
82
|
+
let existing = existing.canonicalize().map_err(|e| e.to_string())?;
|
|
83
|
+
if !existing.starts_with(&root) {
|
|
84
|
+
return Err("workspace path escapes root".into());
|
|
85
|
+
}
|
|
86
|
+
Ok(candidate)
|
|
87
|
+
}
|
|
88
|
+
pub fn create_file(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
|
|
89
|
+
let path = resolve(&operation.root, &operation.relative_path)?;
|
|
90
|
+
fs::write(path, "").map_err(|e| e.to_string())?;
|
|
91
|
+
snapshot(&WorkspaceOperation {
|
|
92
|
+
revision: operation.revision + 1,
|
|
93
|
+
..operation.clone()
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
pub fn create_folder(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
|
|
97
|
+
let path = resolve(&operation.root, &operation.relative_path)?;
|
|
98
|
+
fs::create_dir_all(path).map_err(|e| e.to_string())?;
|
|
99
|
+
snapshot(&WorkspaceOperation {
|
|
100
|
+
revision: operation.revision + 1,
|
|
101
|
+
..operation.clone()
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
pub fn delete(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
|
|
105
|
+
let path = resolve(&operation.root, &operation.relative_path)?;
|
|
106
|
+
if path.is_dir() {
|
|
107
|
+
fs::remove_dir_all(path)
|
|
108
|
+
} else {
|
|
109
|
+
fs::remove_file(path)
|
|
110
|
+
}
|
|
111
|
+
.map_err(|e| e.to_string())?;
|
|
112
|
+
snapshot(&WorkspaceOperation {
|
|
113
|
+
revision: operation.revision + 1,
|
|
114
|
+
..operation.clone()
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
fn canonical_root(root: &Path) -> Result<PathBuf, String> {
|
|
118
|
+
let root = root.canonicalize().map_err(|e| e.to_string())?;
|
|
119
|
+
if root.is_dir() {
|
|
120
|
+
Ok(root)
|
|
121
|
+
} else {
|
|
122
|
+
Err("workspace is not a directory".into())
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
fn children(root: &Path, dir: &Path, depth: usize) -> Result<Vec<WorkspaceTreeEntry>, String> {
|
|
126
|
+
if depth >= MAX_DEPTH {
|
|
127
|
+
return Ok(vec![]);
|
|
128
|
+
}
|
|
129
|
+
let mut entries = fs::read_dir(dir)
|
|
130
|
+
.map_err(|e| e.to_string())?
|
|
131
|
+
.flatten()
|
|
132
|
+
.filter_map(|e| {
|
|
133
|
+
let t = e.file_type().ok()?;
|
|
134
|
+
if t.is_symlink() {
|
|
135
|
+
return None;
|
|
136
|
+
}
|
|
137
|
+
Some((
|
|
138
|
+
e.file_name().to_string_lossy().to_string(),
|
|
139
|
+
e.path(),
|
|
140
|
+
t.is_dir(),
|
|
141
|
+
))
|
|
142
|
+
})
|
|
143
|
+
.collect::<Vec<_>>();
|
|
144
|
+
entries.sort_by(|a, b| b.2.cmp(&a.2).then_with(|| a.0.cmp(&b.0)));
|
|
145
|
+
entries.truncate(MAX_CHILDREN);
|
|
146
|
+
entries
|
|
147
|
+
.into_iter()
|
|
148
|
+
.map(|(name, path, is_dir)| {
|
|
149
|
+
let children = if is_dir && !COLLAPSED.contains(&name.as_str()) {
|
|
150
|
+
children(root, &path, depth + 1)?
|
|
151
|
+
} else {
|
|
152
|
+
vec![]
|
|
153
|
+
};
|
|
154
|
+
Ok(WorkspaceTreeEntry {
|
|
155
|
+
name,
|
|
156
|
+
path: path
|
|
157
|
+
.strip_prefix(root)
|
|
158
|
+
.unwrap_or(&path)
|
|
159
|
+
.to_string_lossy()
|
|
160
|
+
.to_string(),
|
|
161
|
+
kind: if is_dir { "directory" } else { "file" }.into(),
|
|
162
|
+
children,
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
.collect()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
#[cfg(test)]
|
|
169
|
+
mod tests {
|
|
170
|
+
use super::*;
|
|
171
|
+
use std::time::{SystemTime, UNIX_EPOCH};
|
|
172
|
+
|
|
173
|
+
fn root() -> PathBuf {
|
|
174
|
+
let suffix = SystemTime::now()
|
|
175
|
+
.duration_since(UNIX_EPOCH)
|
|
176
|
+
.unwrap()
|
|
177
|
+
.as_nanos();
|
|
178
|
+
let root = std::env::temp_dir().join(format!(
|
|
179
|
+
"mint-workspace-interface-{}-{suffix}",
|
|
180
|
+
std::process::id()
|
|
181
|
+
));
|
|
182
|
+
fs::create_dir_all(&root).unwrap();
|
|
183
|
+
root
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
#[test]
|
|
187
|
+
fn interface_workspace_operations_return_snapshots_and_advance_revision() {
|
|
188
|
+
let root = root();
|
|
189
|
+
let create = WorkspaceOperation {
|
|
190
|
+
root: root.clone(),
|
|
191
|
+
relative_path: "notes/todo.md".into(),
|
|
192
|
+
revision: 4,
|
|
193
|
+
};
|
|
194
|
+
let folder = WorkspaceOperation {
|
|
195
|
+
relative_path: "notes".into(),
|
|
196
|
+
..create.clone()
|
|
197
|
+
};
|
|
198
|
+
let snapshot = create_folder(&folder).unwrap();
|
|
199
|
+
assert_eq!(snapshot.revision, 5);
|
|
200
|
+
let file = WorkspaceOperation {
|
|
201
|
+
revision: snapshot.revision,
|
|
202
|
+
..create
|
|
203
|
+
};
|
|
204
|
+
let snapshot = create_file(&file).unwrap();
|
|
205
|
+
assert_eq!(snapshot.revision, 6);
|
|
206
|
+
assert!(root.join("notes/todo.md").is_file());
|
|
207
|
+
assert_eq!(
|
|
208
|
+
snapshot.path,
|
|
209
|
+
root.canonicalize().unwrap().display().to_string()
|
|
210
|
+
);
|
|
211
|
+
fs::remove_dir_all(root).unwrap();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
#[test]
|
|
215
|
+
fn interface_workspace_rejects_parent_traversal() {
|
|
216
|
+
let root = root();
|
|
217
|
+
let operation = WorkspaceOperation {
|
|
218
|
+
root: root.clone(),
|
|
219
|
+
relative_path: "../escape.txt".into(),
|
|
220
|
+
revision: 0,
|
|
221
|
+
};
|
|
222
|
+
assert_eq!(
|
|
223
|
+
create_file(&operation).unwrap_err(),
|
|
224
|
+
"workspace path escapes root"
|
|
225
|
+
);
|
|
226
|
+
fs::remove_dir_all(root).unwrap();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -480,3 +480,42 @@ fn does_not_create_empty_chat_session_until_first_message() {
|
|
|
480
480
|
);
|
|
481
481
|
assert_eq!(created.unwrap().title, "Hello Mint!");
|
|
482
482
|
}
|
|
483
|
+
|
|
484
|
+
#[test]
|
|
485
|
+
fn test_cli_sessions_separate_and_metadata() {
|
|
486
|
+
let store = store("cli-sessions-separate");
|
|
487
|
+
let session_id = store
|
|
488
|
+
.create_cli_session(Some("/path/to/project"), Some("main"), Some("Rust"))
|
|
489
|
+
.unwrap();
|
|
490
|
+
|
|
491
|
+
assert!(session_id.starts_with("cli::"));
|
|
492
|
+
|
|
493
|
+
// Add an interaction to auto-title it
|
|
494
|
+
store
|
|
495
|
+
.add_interaction_for_chat(
|
|
496
|
+
&session_id,
|
|
497
|
+
"Fix background job bug",
|
|
498
|
+
"Bug fixed",
|
|
499
|
+
"openai",
|
|
500
|
+
"gpt-4",
|
|
501
|
+
)
|
|
502
|
+
.unwrap();
|
|
503
|
+
|
|
504
|
+
let sessions = store.list_chat_sessions().unwrap();
|
|
505
|
+
let session = sessions
|
|
506
|
+
.iter()
|
|
507
|
+
.find(|s| s.id == session_id)
|
|
508
|
+
.expect("Session must exist");
|
|
509
|
+
|
|
510
|
+
assert_eq!(session.title, "Fix background job bug");
|
|
511
|
+
assert_eq!(session.kind, "cli");
|
|
512
|
+
assert_eq!(session.workspace_path.as_deref(), Some("/path/to/project"));
|
|
513
|
+
assert_eq!(session.git_branch.as_deref(), Some("main"));
|
|
514
|
+
assert_eq!(session.main_language.as_deref(), Some("Rust"));
|
|
515
|
+
assert_eq!(session.message_count, 1);
|
|
516
|
+
assert!(session.total_bytes > 0);
|
|
517
|
+
|
|
518
|
+
let preview = store.get_session_preview(&session_id, 5).unwrap();
|
|
519
|
+
assert_eq!(preview.len(), 1);
|
|
520
|
+
assert_eq!(preview[0].user_text, "Fix background job bug");
|
|
521
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,n as t}from"./chunk-CacB07dV.js";import{k as n,y as r}from"./index-D8D9MeRA.js";import{ct as i,ot as a}from"./config-eEDngJXO.js";var o=t((()=>{}));function s(e){let t=i(e),n=Math.floor((new Date().getTime()-t.getTime())/1e3);return n<60?`Just now`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<86400*7?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function c(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function l(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var u,d,f;t((()=>{u=e(n()),a(),o(),d=r(),f=u.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,onSelectSession:r,onDeleteSession:a,onRenameSession:o,onRefreshSessions:f,onShowToast:p}){let[m,h]=(0,u.useState)(``),[g,_]=(0,u.useState)(`workspace`),[v,y]=(0,u.useState)(`recent`),[b,x]=(0,u.useState)(null),[S,C]=(0,u.useState)(``),w=(0,u.useRef)(f);(0,u.useEffect)(()=>{w.current=f},[f]),(0,u.useEffect)(()=>{w.current?.();let e=()=>{w.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let T=(0,u.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),E=(0,u.useMemo)(()=>T.filter(e=>{if(g===`workspace`&&n&&e.workspacePath&&e.workspacePath!==n)return!1;if(!m.trim())return!0;let t=m.toLowerCase();return e.title.toLowerCase().includes(t)||e.id.toLowerCase().includes(t)||e.workspacePath&&e.workspacePath.toLowerCase().includes(t)||e.gitBranch&&e.gitBranch.toLowerCase().includes(t)||e.mainLanguage&&e.mainLanguage.toLowerCase().includes(t)}).sort((e,t)=>{if(v===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=i(e.updatedAt||e.createdAt).getTime(),r=i(t.updatedAt||t.createdAt).getTime();return v===`oldest`?n-r:r-n}),[T,g,n,m,v]),D=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),p?.(`Copied: ${n}`)):p?.(`Resume command: ${n}`)},O=(e,t)=>{e.stopPropagation(),x(t.id),C(t.title)},k=e=>{if(e&&e.preventDefault(),!b)return;let t=S.trim();t&&(o(b,t),p?.(`Session renamed`)),x(null)},A=(e,t)=>{e.stopPropagation(),a(t.id)};return(0,d.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,d.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,d.jsxs)(`div`,{className:`code-header-main`,children:[(0,d.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,d.jsxs)(`h1`,{className:`code-header-title`,children:[(0,d.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{color:`var(--interactive-fg)`},children:[(0,d.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,d.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,d.jsx)(`span`,{children:`Code sessions`})]}),(0,d.jsxs)(`span`,{className:`code-header-count`,children:[T.length,` `,T.length===1?`session`:`sessions`]})]}),(0,d.jsx)(`p`,{className:`code-header-subtitle`,children:`Terminal conversations and agent runs from your active repositories.`})]}),(0,d.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,flexWrap:`wrap`},children:[(0,d.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,d.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${g===`workspace`?`active`:``}`,onClick:()=>_(`workspace`),title:`Show sessions from current workspace`,children:`Current Project`}),(0,d.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${g===`all`?`active`:``}`,onClick:()=>_(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,d.jsxs)(`select`,{className:`code-sort-select`,value:v,onChange:e=>y(e.target.value),title:`Sort sessions`,children:[(0,d.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,d.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,d.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),f&&(0,d.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:f,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,d.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,d.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,d.jsx)(`div`,{className:`code-controls-bar`,children:(0,d.jsxs)(`div`,{className:`code-search-box`,children:[(0,d.jsxs)(`svg`,{className:`code-search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,d.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,d.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:m,onChange:e=>h(e.target.value)})]})}),E.length===0?(0,d.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,d.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,d.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,d.jsx)(`p`,{className:`code-terminal-text`,children:m?`No terminal sessions match your query.`:g===`workspace`&&T.length>0?`No sessions found in this project. Switch to "All Repositories" or start one in this directory:`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),(0,d.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,d.jsx)(`span`,{children:`$ mint`}),(0,d.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),p?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,d.jsx)(`div`,{className:`code-sessions-list`,children:E.map(e=>{let n=e.id===t,i=l(e.workspacePath),a=b===e.id,o=e.id.replace(/^cli::/,``),u=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,d.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>r(e.id),children:[(0,d.jsxs)(`div`,{className:`code-row-meta`,children:[(0,d.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,d.jsx)(`span`,{className:`code-session-id`,title:e.id,children:u}),n&&(0,d.jsx)(`span`,{className:`code-active-badge`,children:`active`})]}),(0,d.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,d.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,d.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,d.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,d.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,d.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,d.jsx)(`span`,{children:e.gitBranch})]}),(0,d.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:i}),e.mainLanguage&&(0,d.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,d.jsx)(`div`,{className:`code-row-content`,children:a?(0,d.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,d.jsx)(`input`,{type:`text`,autoFocus:!0,value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&k(),e.key===`Escape`&&x(null)},style:{flex:1,background:`rgba(0, 0, 0, 0.4)`,border:`1px solid var(--border-light, rgba(255, 255, 255, 0.2))`,borderRadius:`var(--radius-xs, 6px)`,color:`#fff`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,d.jsx)(`button`,{type:`button`,onClick:k,style:{background:`var(--surface-strong, #3f3f46)`,color:`#fff`,border:`none`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,d.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,d.jsx)(`span`,{style:{color:`var(--interactive-fg)`,opacity:.8,marginRight:`4px`},children:`>`}),(0,d.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,d.jsxs)(`div`,{className:`code-row-actions`,children:[(0,d.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,c(e.totalBytes)]}),(0,d.jsx)(`span`,{className:`code-metric-time`,children:s(e.updatedAt||e.createdAt)}),(0,d.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>D(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,d.jsx)(`span`,{children:`$`}),(0,d.jsx)(`span`,{children:`resume`})]}),(0,d.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>O(t,e),title:`Rename session`,children:(0,d.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),(0,d.jsx)(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`})]})}),(0,d.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>A(t,e),title:`Delete session`,children:(0,d.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,d.jsx)(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})]})}),(0,d.jsx)(`span`,{className:`code-open-arrow`,children:(0,d.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,d.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{f as CliSessionsView,f as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.code-sessions-container{max-width:960px;color:var(--text-main,#ececec);margin:0 auto;padding:32px 24px 64px;font-family:inherit;animation:.2s ease-out codeFadeIn}@keyframes codeFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.code-sessions-header{border-bottom:1px solid var(--border,#ffffff14);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:24px;padding-bottom:16px;display:flex}.code-header-main{flex-direction:column;gap:4px;display:flex}.code-header-title-row{align-items:center;gap:10px;display:flex}.code-header-title{letter-spacing:-.02em;color:var(--text-main,#fff);align-items:center;gap:8px;margin:0;font-size:1.35rem;font-weight:600;display:flex}.code-header-count{border-radius:var(--radius-xs,6px);background:var(--surface-bg,#ffffff0f);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff0f);padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.76rem;font-weight:500}.code-header-subtitle{color:var(--text-muted,#8e8e8e);margin:0;font-size:.86rem}.code-controls-bar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;display:flex}.code-search-box{flex:280px;position:relative}.code-search-input{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);width:100%;color:var(--text-main,#ececec);outline:none;padding:8px 12px 8px 34px;font-size:.86rem;transition:border-color .15s}.code-search-input:focus{border-color:var(--border-light,#fff3);background:var(--surface-bg,#1a1a1c)}.code-search-input::placeholder{color:var(--placeholder,#71717a)}.code-search-icon{color:var(--placeholder,#71717a);pointer-events:none;position:absolute;top:50%;left:11px;transform:translateY(-50%)}.code-segmented-toggle{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);gap:2px;padding:3px;display:inline-flex}.code-segmented-btn{border-radius:calc(var(--radius-sm,8px) - 2px);color:var(--text-muted,#8e8e8e);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:5px 12px;font-size:.8rem;font-weight:500;transition:all .15s}.code-segmented-btn:hover{color:var(--text-main,#ececec)}.code-segmented-btn.active{background:var(--surface-strong,#2c2c2e);color:var(--text-main,#fff);box-shadow:0 1px 3px #0000004d}.code-sort-select{background:var(--panel-soft,#121214);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);cursor:pointer;outline:none;padding:6px 10px;font-size:.8rem}.code-sort-select:hover,.code-sort-select:focus{color:var(--text-main,#ececec);border-color:var(--border-light,#ffffff29)}.code-sessions-list{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);flex-direction:column;display:flex;overflow:hidden}.code-session-row{border-bottom:1px solid var(--border,#ffffff0f);cursor:pointer;grid-template-columns:minmax(140px,200px) 1fr auto;align-items:center;gap:16px;padding:13px 18px;text-decoration:none;transition:background .15s;display:grid}.code-session-row:last-child{border-bottom:none}.code-session-row:hover{background:var(--surface-bg,#ffffff09)}.code-session-row.is-active{background:color-mix(in srgb, var(--accent,#10b981) 6%, transparent)}.code-row-meta{flex-direction:column;gap:4px;min-width:0;display:flex}.code-row-meta-top{align-items:center;gap:7px;display:flex}.code-active-badge{text-transform:none;letter-spacing:.04em;color:var(--interactive-fg);background:color-mix(in srgb, var(--accent,#10b981) 12%, transparent);border:1px solid color-mix(in srgb, var(--accent,#10b981) 25%, transparent);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.65rem;font-weight:600;line-height:1}.code-session-id{color:var(--text-muted,#a1a1aa);letter-spacing:-.01em;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:500}.code-row-meta-sub{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:.74rem;display:flex;overflow:hidden}.code-branch-tag{color:#34d399;align-items:center;gap:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;font-weight:500;display:inline-flex}.code-folder-name{color:var(--text-muted,#a1a1aa);text-overflow:ellipsis;overflow:hidden}.code-row-content{flex-direction:column;gap:3px;min-width:0;display:flex}.code-session-title{color:var(--text-main,#fff);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.92rem;font-weight:500;overflow:hidden}.code-session-snippet{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;font-family:inherit;font-size:.78rem;overflow:hidden}.code-row-actions{flex-shrink:0;align-items:center;gap:12px;display:flex}.code-metric-turns{color:var(--text-muted,#71717a);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem}.code-metric-time{color:var(--text-muted,#71717a);white-space:nowrap;text-align:right;min-width:65px;font-size:.76rem}.code-resume-chip{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-xs,6px);color:var(--text-muted,#a1a1aa);cursor:pointer;background:#ffffff0a;align-items:center;gap:5px;padding:3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;transition:all .15s;display:inline-flex}.code-resume-chip:hover{border-color:var(--border-light,#ffffff2e);color:var(--text-main,#fff);background:#ffffff14}.code-icon-btn{color:var(--text-muted,#71717a);border-radius:var(--radius-xs,6px);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;transition:all .15s;display:inline-flex}.code-icon-btn:hover{color:var(--text-main,#fff);background:#ffffff0f}.code-icon-btn.destructive:hover{color:#f87171;background:#ef44441a}.code-open-arrow{color:var(--text-muted,#52525b);align-items:center;transition:transform .15s,color .15s;display:inline-flex}.code-session-row:hover .code-open-arrow{color:var(--text-main,#fff);transform:translate(2px)}.code-empty-terminal{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);max-width:520px;margin:32px auto;overflow:hidden}.code-terminal-header{border-bottom:1px solid var(--border,#ffffff0f);background:#0000004d;align-items:center;gap:6px;padding:10px 14px;display:flex}.code-terminal-dot{background:#ffffff26;border-radius:50%;width:10px;height:10px}.code-terminal-title{color:var(--text-muted,#71717a);margin-left:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.74rem}.code-terminal-body{text-align:left;padding:24px}.code-terminal-text{color:var(--text-muted,#a1a1aa);margin-bottom:16px;font-size:.86rem;line-height:1.5}.code-terminal-codeblock{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);color:var(--interactive-fg);background:#00000073;justify-content:space-between;align-items:center;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.84rem;display:flex}@media (width<=720px){.code-session-row{grid-template-columns:1fr;gap:10px;padding:14px}.code-row-actions{border-top:1px solid var(--border,#ffffff0a);justify-content:space-between;width:100%;padding-top:6px}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.code-review-page{background:var(--bg-surface,#141518);will-change:transform, opacity;flex-direction:column;flex:auto;min-height:0;animation:.28s cubic-bezier(.16,1,.3,1) forwards codeReviewEntrance;display:flex;overflow:hidden}@keyframes codeReviewEntrance{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.code-review-top-bar{flex:none;justify-content:space-between;align-items:center;padding:10px 16px 4px;display:flex}.code-review-branch-group{align-items:center;gap:8px;display:flex}.code-review-branch-btn{color:var(--text-main,#f1f5f9);cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:4px;padding:2px 4px;font-size:.88rem;font-weight:600;transition:background .15s;display:inline-flex}.code-review-branch-btn:hover{background:#ffffff0f}.code-review-chevron-small{color:var(--text-muted,#94a3b8);font-size:.8rem}.code-review-branch-stat-add{color:#22c55e;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-branch-stat-del{color:#ef4444;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-top-actions{align-items:center;gap:4px;display:flex}.code-review-icon-btn,.code-review-close-btn{width:28px;height:28px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;transition:all .15s;display:inline-flex}.code-review-icon-btn:hover,.code-review-close-btn:hover{color:#f1f5f9;background:#ffffff14}.code-review-close-btn{margin-left:2px;font-size:1.15rem;line-height:1}.code-review-target-branch{align-items:center;padding:0 16px 8px;display:flex}.code-review-target-branch-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:4px;padding:2px 4px;font-size:.78rem;transition:color .15s,background .15s;display:inline-flex}.code-review-target-branch-btn:hover{color:var(--text-main,#f1f5f9);background:#ffffff0a}.code-review-banner{background:#ffffff09;border:1px solid #ffffff12;border-radius:10px;justify-content:space-between;align-items:center;gap:12px;margin:4px 16px 10px;padding:8px 14px;animation:.25s cubic-bezier(.16,1,.3,1) forwards codeReviewBannerIn;display:flex}@keyframes codeReviewBannerIn{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.code-review-banner-left{color:#cbd5e1;align-items:center;gap:8px;font-size:.78rem;font-weight:500;display:flex}.code-review-banner-info-icon{color:#818cf8;flex-shrink:0}.code-review-pagination{align-items:center;gap:6px;display:flex}.code-review-page-arrow{width:24px;height:24px;color:var(--text-muted,#94a3b8);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff14;border-radius:5px;justify-content:center;align-items:center;font-size:.95rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-page-arrow:hover:not(:disabled){color:#fff;background:#ffffff1f}.code-review-page-arrow:disabled{opacity:.3;cursor:not-allowed}.code-review-split{border-top:1px solid #ffffff0f;flex-direction:row;flex:auto;min-height:0;display:flex;position:relative;overflow:hidden}.code-review-split.is-resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.code-review-split.is-resizing *{pointer-events:none;-webkit-user-select:none!important;user-select:none!important}.code-review-split.is-resizing .code-review-resizer{pointer-events:auto}.code-review-diff-pane{flex-direction:column;flex:1 1 0;min-width:0;display:flex;overflow:auto}.code-review-resizer{z-index:10;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;outline:none;flex:0 0 10px;justify-content:center;align-items:center;margin:0 -5px;transition:background-color .15s;display:flex;position:relative}.code-review-resizer-line{background:#ffffff14;width:1px;transition:background-color .15s,box-shadow .15s,width .15s;position:absolute;top:0;bottom:0;left:4px}.code-review-resizer:hover .code-review-resizer-line,.code-review-resizer.is-dragging .code-review-resizer-line{background:#818cf8;width:2px;box-shadow:0 0 8px #818cf899}.code-review-resizer-handle{z-index:2;background:#ffffff2e;border-radius:2px;width:4px;height:26px;transition:all .15s}.code-review-resizer:hover .code-review-resizer-handle,.code-review-resizer.is-dragging .code-review-resizer-handle{background:#a5b4fc;height:38px;box-shadow:0 0 6px #a5b4fc80}.code-review-resizer.is-collapsed{cursor:pointer;flex:0 0 8px;margin:0}.code-review-resizer.is-collapsed .code-review-resizer-line{background:#ffffff24;left:3px}.code-review-file-view{flex-direction:column;flex:1;animation:.2s cubic-bezier(.16,1,.3,1) forwards codeReviewDiffSwap;display:flex}@keyframes codeReviewDiffSwap{0%{opacity:.4;transform:translate(-4px)}to{opacity:1;transform:translate(0)}}.code-review-file-bar{z-index:2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#ffffff05;border-bottom:1px solid #ffffff0f;align-items:center;gap:8px;padding:8px 16px;font-size:.78rem;display:flex;position:sticky;top:0}.code-review-file-bar-status{border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:700;line-height:1.2}.code-review-file-bar-status.is-modified{color:#38bdf8;background:#38bdf81f}.code-review-file-bar-status.is-created{color:#22c55e;background:#22c55e1f}.code-review-file-bar-path{color:var(--text-main,#f1f5f9);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.code-review-file-bar-stat-add{color:#22c55e;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-file-bar-stat-del{color:#ef4444;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-code-container{min-width:0;padding:6px 0 20px;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:.78rem;line-height:1.55;overflow:auto visible}.code-review-hunk-block{margin-bottom:8px}.code-review-line{align-items:stretch;width:max-content;min-width:100%;min-height:22px;padding:0 4px;transition:background-color .12s;display:flex}.code-review-line.is-add{background:#10b9811f;border-left:2px solid #10b981}.code-review-line.is-del{background:#ef44441f;border-left:2px solid #ef4444}.code-review-gutter{text-align:right;color:#64748b;-webkit-user-select:none;user-select:none;flex-shrink:0;width:38px;padding-right:12px}.code-review-line.is-add .code-review-gutter{color:#34d399}.code-review-line.is-del .code-review-gutter{color:#f87171}.code-review-sign{text-align:center;color:#64748b;-webkit-user-select:none;user-select:none;flex-shrink:0;width:14px}.code-review-line.is-add .code-review-sign{color:#10b981}.code-review-line.is-del .code-review-sign{color:#ef4444}.code-review-code-text{color:var(--text-main,#e2e8f0);font:inherit;white-space:pre;word-break:normal;padding-left:4px;padding-right:16px}.code-review-line.is-add .code-review-code-text{color:#d1fae5}.code-review-line.is-del .code-review-code-text{color:#fee2e2}.code-review-empty-diff,.code-review-empty-state{color:var(--text-muted,#94a3b8);padding:24px;font-size:.8rem}.code-review-tree-pane{background:#00000038;border-left:1px solid #ffffff12;flex-direction:column;flex:none;min-width:0;display:flex;overflow:hidden}.code-review-tree-collapse-btn{width:22px;height:22px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:1rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-tree-collapse-btn:hover{color:#f1f5f9;background:#ffffff14}.code-review-icon-btn.is-active{color:#818cf8;background:#818cf81f}.code-review-search-wrap{border-bottom:1px solid #ffffff0f;align-items:center;gap:8px;padding:10px 12px;display:flex}.code-review-search-icon{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-search-input{width:100%;color:var(--text-main,#f1f5f9);background:#ffffff0a;border:1px solid #ffffff14;border-radius:8px;outline:none;padding:5px 10px;font-size:.76rem;transition:border-color .15s,background .15s}.code-review-search-input:focus{background:#ffffff0f;border-color:#ffffff2e}.code-review-tree-list{flex-direction:column;flex:1;gap:2px;padding:8px 6px;display:flex;overflow-y:auto}.code-review-tree-folder{flex-direction:column;display:flex}.code-review-tree-folder-btn{color:#cbd5e1;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;padding-top:5px;padding-bottom:5px;padding-right:8px;font-size:.78rem;font-weight:500;transition:background-color .12s;display:flex}.code-review-tree-folder-btn:hover{color:#fff;background:#ffffff0a}.code-review-chevron{width:12px;color:var(--text-muted,#94a3b8);flex-shrink:0;font-size:.85rem}.code-review-folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-mod-dot{color:#ea580c;flex-shrink:0;margin-left:auto;font-size:1rem;line-height:1}.code-review-tree-sub{flex-direction:column;gap:2px;display:flex}.code-review-tree-file{color:#cbd5e1;cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;width:100%;padding-top:6px;padding-bottom:6px;padding-right:8px;font-size:.76rem;transition:all .15s cubic-bezier(.16,1,.3,1);display:flex}.code-review-tree-file:hover{color:#f8fafc;background:#ffffff0a}.code-review-tree-file.is-selected{color:#fff;background:#ffffff14;border-color:#ffffff21;box-shadow:0 1px 4px #0000004d}.code-review-tree-icon{flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex;position:relative}.code-review-tree-icon.material-icon img{object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none;flex:none;width:16px;height:16px;display:block}.code-review-file-status-icon{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.7rem;font-weight:700;line-height:1.2}.code-review-file-status-icon.is-modified{color:#38bdf8;background:#38bdf81a}.code-review-file-status-icon.is-created{color:#22c55e;background:#22c55e1a}.code-review-tree-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-branch-group .git-branch-selector{flex:none;min-width:0;max-width:none}.code-review-branch-group .git-branch-trigger{color:var(--text-main,#f1f5f9);cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:6px;align-items:center;gap:7px;max-width:260px;height:28px;min-height:28px;padding:4px 10px;font-size:.84rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-branch-group .git-branch-trigger:hover{background:#ffffff1a;border-color:#fff3}.code-review-branch-group .git-branch-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:180px;color:var(--text-main,#f1f5f9);font-size:.82rem;font-weight:600;line-height:1.2;overflow:hidden}.code-review-branch-group .git-branch-icon{color:var(--accent,#6366f1);flex-shrink:0}.code-review-branch-group .git-branch-dirty{background:#10b981;border-radius:50%;flex:0 0 6px;width:6px;height:6px}.code-review-branch-group .git-branch-chevron{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-branch-group .git-branch-menu{z-index:200}.code-review-branch-static{color:var(--text-main,#f1f5f9);font-size:.85rem;font-weight:600}.code-review-spin{animation:1s linear infinite codeReviewSpin}@keyframes codeReviewSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.code-review-clean-state{text-align:center;color:var(--text-muted,#94a3b8);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:60px 24px;display:flex}.code-review-clean-state h3{color:var(--text-main,#f1f5f9);margin:14px 0 6px;font-size:1.05rem;font-weight:600}.code-review-clean-state p{margin:0 0 16px;font-size:.82rem}.code-review-clean-refresh-btn{color:#cbd5e1;cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:.78rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-clean-refresh-btn:hover{color:#fff;background:#ffffff1f}.code-review-scope-group{align-items:center;gap:4px;display:flex}.code-review-scope-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:#ffffff0a;border:1px solid #ffffff14;border-radius:5px;padding:3px 8px;font-size:.74rem;transition:all .15s}.code-review-scope-btn:hover{color:#fff;background:#ffffff14}.code-review-scope-btn.is-active{color:#818cf8;background:#818cf829;border-color:#818cf859;font-weight:600}
|