@pheem49/mint 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +6 -6
- package/Cargo.toml +2 -2
- package/README.md +8 -2
- package/Release_Note.md +222 -71
- package/crates/mint-cli/src/agent/diff_render.rs +66 -44
- package/crates/mint-cli/src/agent/live_status.rs +21 -4
- package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
- package/crates/mint-cli/src/agent.rs +25 -10
- package/crates/mint-cli/src/commands/agent.rs +4 -92
- package/crates/mint-cli/src/commands/browser.rs +2 -15
- package/crates/mint-cli/src/commands/integrations.rs +3 -3
- package/crates/mint-cli/src/commands/mod.rs +0 -3
- package/crates/mint-cli/src/commands/tailnet_web.rs +1 -0
- package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
- package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
- package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
- package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
- package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
- package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
- package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
- package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
- package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
- package/crates/mint-cli/src/interactive/command_ui.rs +53 -5
- package/crates/mint-cli/src/interactive/composer.rs +186 -0
- package/crates/mint-cli/src/interactive/format.rs +78 -3
- package/crates/mint-cli/src/interactive/input_box.rs +61 -1
- package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
- package/crates/mint-cli/src/interactive/slash_commands.rs +648 -371
- package/crates/mint-cli/src/interactive/tool_activity.rs +93 -20
- package/crates/mint-cli/src/interactive.rs +37 -0
- package/crates/mint-cli/src/main.rs +6 -3
- package/crates/mint-cli/src/markdown.rs +2 -37
- package/crates/mint-cli/src/onboard.rs +700 -282
- package/crates/mint-cli/src/setup.rs +1342 -624
- package/crates/mint-cli/src/terminal_theme.rs +159 -35
- package/crates/mint-cli/tests/library_intake.rs +1 -0
- package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
- package/crates/mint-core/src/agent/chat/custom.rs +149 -0
- package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
- package/crates/mint-core/src/agent/chat/mod.rs +857 -0
- package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
- package/crates/mint-core/src/agent/chat/openai.rs +582 -0
- package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
- package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
- package/crates/mint-core/src/agent/memory.rs +56 -2
- package/crates/mint-core/src/agent/tasks.rs +2 -2
- package/crates/mint-core/src/api_server/routes/chat.rs +24 -2
- package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
- package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
- package/crates/mint-core/src/api_server/routes/sessions.rs +21 -0
- package/crates/mint-core/src/avatar_bridge.rs +0 -22
- package/crates/mint-core/src/browser/cdp.rs +10 -4
- package/crates/mint-core/src/browser/headless.rs +582 -0
- package/crates/mint-core/src/browser/input.rs +7 -62
- package/crates/mint-core/src/browser/interact.rs +0 -14
- package/crates/mint-core/src/browser/mod.rs +8 -29
- package/crates/mint-core/src/browser/navigate.rs +2 -36
- package/crates/mint-core/src/browser/runtime.rs +2 -4
- package/crates/mint-core/src/browser/session.rs +50 -466
- package/crates/mint-core/src/browser/workflow.rs +142 -32
- package/crates/mint-core/src/cron/store.rs +2 -2
- package/crates/mint-core/src/integrations/mcp.rs +6 -8
- package/crates/mint-core/src/lib.rs +0 -5
- package/crates/mint-core/src/media/gemini_live.rs +636 -86
- package/crates/mint-core/src/media/library/migration.rs +26 -0
- package/crates/mint-core/src/media/library/tests.rs +1 -1
- package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
- package/crates/mint-core/src/media/pictures.rs +1 -1
- package/crates/mint-core/src/media/tool_images.rs +92 -1
- package/crates/mint-core/src/mods/manager.rs +101 -35
- package/crates/mint-core/src/orchestration/context_render.rs +441 -24
- package/crates/mint-core/src/orchestration/decision_parsing.rs +531 -16
- package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
- package/crates/mint-core/src/orchestration/loop_guard.rs +145 -0
- package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
- package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
- package/crates/mint-core/src/orchestration/mod.rs +320 -4249
- package/crates/mint-core/src/orchestration/reliability.rs +67 -27
- package/crates/mint-core/src/orchestration/review_regressions.rs +5 -0
- package/crates/mint-core/src/orchestration/tests.rs +1665 -0
- package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
- package/crates/mint-core/src/orchestration/tools/files.rs +1 -0
- package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
- package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
- package/crates/mint-core/src/orchestration/tools/shell.rs +129 -58
- package/crates/mint-core/src/orchestration/truncation.rs +170 -13
- package/crates/mint-core/src/orchestration/types.rs +648 -0
- package/crates/mint-core/src/orchestration/verification.rs +0 -3
- package/crates/mint-core/src/orchestration/workspace_helpers.rs +24 -6
- package/crates/mint-core/src/prompts/agent.rs +52 -76
- package/crates/mint-core/src/prompts/tool_catalog.rs +8 -151
- package/crates/mint-core/src/search/files.rs +20 -0
- package/crates/mint-core/src/slash/mod.rs +228 -265
- package/crates/mint-core/src/slash/models.rs +6 -1
- package/crates/mint-core/src/system/bg_shell.rs +1 -0
- package/crates/mint-core/src/system/config.rs +176 -34
- package/crates/mint-mod-runtime/src/lib.rs +37 -23
- package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
- package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
- package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
- package/out/web/assets/{CliSessionsView-MI8kXMAb.js → CliSessionsView-z5i6qGyb.js} +1 -1
- package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
- package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
- package/out/web/assets/{CommandPalette-BD8SlTE5.js → CommandPalette-DaKlzbKs.js} +1 -1
- package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
- package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
- package/out/web/assets/{ImageStudioPanel-BP7N4rLr.js → ImageStudioPanel-B5N7TjeB.js} +1 -1
- package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
- package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
- package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
- package/out/web/assets/{McpRegistryPicker-CoS83vtc.js → McpRegistryPicker-DnXPlzI7.js} +1 -1
- package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
- package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
- package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
- package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
- package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
- package/out/web/assets/{PluginsView-jBYmcKh4.js → PluginsView-DoTg9MVa.js} +1 -1
- package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
- package/out/web/assets/{ScheduledTasksView-5uw9-V9H.js → ScheduledTasksView-BD5DVPkZ.js} +1 -1
- package/out/web/assets/{SelectField-DXBQtrUK.js → SelectField-Cy6CghrU.js} +1 -1
- package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
- package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
- package/out/web/assets/{SkillsView-C-gp9J7m.js → SkillsView-CIeWwq5z.js} +1 -1
- package/out/web/assets/StockCard-DxUciKyp.js +1 -0
- package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
- package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
- package/out/web/assets/{UiFeatureCard-6BwxTOCe.js → UiFeatureCard-CdY0hGWy.js} +1 -1
- package/out/web/assets/{UiGridCard-DvZcLNxb.js → UiGridCard-BBK3I5hC.js} +1 -1
- package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
- package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
- package/out/web/assets/{VeoStudioPanel-DfsOJKv0.js → VeoStudioPanel-Co6-wEWM.js} +2 -2
- package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
- package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
- package/out/web/assets/{abnfDiagram-VCTEODGH-BOo3Ckng.js → abnfDiagram-VCTEODGH-CMfR95N2.js} +1 -1
- package/out/web/assets/{architecture-7GRP2DOG-ZOwheW3n.js → architecture-7GRP2DOG-DhAM4HyO.js} +1 -1
- package/out/web/assets/{architectureDiagram-5GKGNRK7-DC2FDzVd.js → architectureDiagram-5GKGNRK7-Yk3TUJ_F.js} +1 -1
- package/out/web/assets/{blockDiagram-I7D4REHJ-BrKFWdAH.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +1 -1
- package/out/web/assets/{c4Diagram-7LVT6UL2-BHTHK1Yd.js → c4Diagram-7LVT6UL2-Bk9x7N-8.js} +1 -1
- package/out/web/assets/{chunk-4HAMMTFA-BYFkZwNj.js → chunk-4HAMMTFA-Dx5fk1_0.js} +1 -1
- package/out/web/assets/{chunk-75Z2AOVW-BSKfSKSA.js → chunk-75Z2AOVW-BszTQoM4.js} +1 -1
- package/out/web/assets/{chunk-DU6HZSFF-vIhsiW6n.js → chunk-DU6HZSFF-DK-As3rk.js} +1 -1
- package/out/web/assets/{chunk-F27PBJKO-BlYpW9xq.js → chunk-F27PBJKO-LmncZZIS.js} +1 -1
- package/out/web/assets/{chunk-GMAD6QVW-BIBz_Ug5.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +1 -1
- package/out/web/assets/{chunk-GVQU2GXP-NPSHxeqC.js → chunk-GVQU2GXP-Cno3ulje.js} +1 -1
- package/out/web/assets/{chunk-IMKFNOWR-YlJK8_Fp.js → chunk-IMKFNOWR-bIzfY9Jc.js} +1 -1
- package/out/web/assets/{chunk-L3NEJ4N5-DMYi4-af.js → chunk-L3NEJ4N5-Dl6eOa0D.js} +1 -1
- package/out/web/assets/{chunk-OSK3NFVY-Begd3-jA.js → chunk-OSK3NFVY-BaUGJ-cM.js} +1 -1
- package/out/web/assets/{chunk-P2QGCYS3-D1I4xFHN.js → chunk-P2QGCYS3-_066ndhH.js} +1 -1
- package/out/web/assets/{chunk-POPQ4Y6H-CafZZzNE.js → chunk-POPQ4Y6H-YT1AKhTv.js} +1 -1
- package/out/web/assets/{chunk-PWAF6VOD-Dwh6_Lnt.js → chunk-PWAF6VOD-CrEgDsxh.js} +1 -1
- package/out/web/assets/{chunk-SHT3W25Y-B0XrCSEb.js → chunk-SHT3W25Y-_KwaRLOl.js} +1 -1
- package/out/web/assets/{chunk-SVP7TREG-CxLsddxC.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
- package/out/web/assets/{chunk-TICWLB2K-y156QInb.js → chunk-TICWLB2K-BDyehCtg.js} +1 -1
- package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
- package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
- package/out/web/assets/{config-DqXJXeZM.css → config-2suVFPZg.css} +1 -1
- package/out/web/assets/config-CkRCdkxn.js +2 -0
- package/out/web/assets/{cynefin-OW5HDTMX-SMVvrLf-.js → cynefin-OW5HDTMX-Dl_31aaN.js} +1 -1
- package/out/web/assets/{cynefinDiagram-5FMLGOSQ-rZznN24T.js → cynefinDiagram-5FMLGOSQ-Bpir8jha.js} +1 -1
- package/out/web/assets/{dagre-GXQ25YYZ-BOToydFu.js → dagre-GXQ25YYZ-D9xu3nsq.js} +1 -1
- package/out/web/assets/{diagram-S7CK7UJ4-TMVaGQEJ.js → diagram-S7CK7UJ4-DeveoEeB.js} +1 -1
- package/out/web/assets/{diagram-UQ7AKVKN-C2JK-GP2.js → diagram-UQ7AKVKN-p4xWRESV.js} +1 -1
- package/out/web/assets/{diagram-VSXAHHWV-Cw8VSi2K.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
- package/out/web/assets/{diagram-VX7I27RA-DXp4fKk9.js → diagram-VX7I27RA-DRiCa3Vd.js} +1 -1
- package/out/web/assets/{diagram-Z3DM3KII-CzSicYiW.js → diagram-Z3DM3KII-Bt7zduQX.js} +1 -1
- package/out/web/assets/{ebnfDiagram-PWID7BFC-Dqj-zqPu.js → ebnfDiagram-PWID7BFC-DV9WpwdR.js} +1 -1
- package/out/web/assets/{erDiagram-RLTQ6QDP-DZwFZAuD.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +1 -1
- package/out/web/assets/{eventmodeling-NTZA5JFV-C0O-Lvgp.js → eventmodeling-NTZA5JFV-BTBMrfVa.js} +1 -1
- package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
- package/out/web/assets/{ganttDiagram-EL5Y4UJY-Da4ULXTl.js → ganttDiagram-EL5Y4UJY-DQLdsXrC.js} +1 -1
- package/out/web/assets/{gitGraph-4MIJSDKK-B9wNFZIP.js → gitGraph-4MIJSDKK-CL1OEOQ_.js} +1 -1
- package/out/web/assets/{gitGraphDiagram-WWUBYQGX-RjrhB0MP.js → gitGraphDiagram-WWUBYQGX-8cSi42H7.js} +1 -1
- package/out/web/assets/index-BocxnrDG.js +168 -0
- package/out/web/assets/index-yeh_r55a.css +1 -0
- package/out/web/assets/{info-A6RAGUB7-B3dfCpeY.js → info-A6RAGUB7-C1zsX5sc.js} +1 -1
- package/out/web/assets/{infoDiagram-27XIBGKW-QVWkLVx7.js → infoDiagram-27XIBGKW-DsRYtIyI.js} +1 -1
- package/out/web/assets/{ishikawaDiagram-5VMMS53U-CLFNIRI9.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +1 -1
- package/out/web/assets/{journeyDiagram-3NMN7TZE-fgOQadYF.js → journeyDiagram-3NMN7TZE-BTH-GyVR.js} +1 -1
- package/out/web/assets/{kanban-definition-UXKFOSKX-G3Q_9g9O.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +1 -1
- package/out/web/assets/{mermaid-parser.core-v3Jm7nco.js → mermaid-parser.core-BJwgCBBc.js} +3 -3
- package/out/web/assets/{mermaid.core-DTEjLUA1.js → mermaid.core-CsDDodN8.js} +4 -4
- package/out/web/assets/{mindmap-definition-YA3MSWOX-C_D42_fF.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +1 -1
- package/out/web/assets/{modelManager-BPLycQrN.js → modelManager-B3ZFMh8v.js} +2 -2
- package/out/web/assets/{oauthManager-BUK7ic7q.js → oauthManager-Ch5Du2fF.js} +1 -1
- package/out/web/assets/{packet-AYTQ26CC-B-R-SHlF.js → packet-AYTQ26CC-B6xUyE6r.js} +1 -1
- package/out/web/assets/{pegDiagram-XKGWAZYB-Da2q_giz.js → pegDiagram-XKGWAZYB-1LabVycL.js} +1 -1
- package/out/web/assets/{pie-WAS4IAKB-BC8F0N7-.js → pie-WAS4IAKB-DJwo-nf_.js} +1 -1
- package/out/web/assets/{pieDiagram-E7YTZNPT-Iy9REJNC.js → pieDiagram-E7YTZNPT-icmAqzy4.js} +1 -1
- package/out/web/assets/{quadrantDiagram-AXDQQJYC-ztsiYw7h.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +1 -1
- package/out/web/assets/{radar-RG4KPBEZ-B_1P8Z_z.js → radar-RG4KPBEZ-D7d-Xriw.js} +1 -1
- package/out/web/assets/{railroad-74A4TZTK-DuTqczSo.js → railroad-74A4TZTK-viuhdYbs.js} +1 -1
- package/out/web/assets/{railroad-abnf-HS5TGJTU-Df29WLmp.js → railroad-abnf-HS5TGJTU-DNXiCNea.js} +1 -1
- package/out/web/assets/{railroad-ebnf-LZEXJU2U-ePFMo-qp.js → railroad-ebnf-LZEXJU2U-nkSu1-0C.js} +1 -1
- package/out/web/assets/{railroad-peg-WCYAUIDC-DYXLW4_E.js → railroad-peg-WCYAUIDC-BhbMeQzz.js} +1 -1
- package/out/web/assets/{railroadDiagram-O6MQD6OU-LStnZf2S.js → railroadDiagram-O6MQD6OU-CLpG1jUX.js} +1 -1
- package/out/web/assets/{requirementDiagram-BXWQKSXE-DmzonMH-.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +1 -1
- package/out/web/assets/{sankeyDiagram-P5KCCOFB-B8vjmUU1.js → sankeyDiagram-P5KCCOFB-DxAwmq4x.js} +1 -1
- package/out/web/assets/{sequenceDiagram-WJ2MYXX4-CTnplOAX.js → sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js} +1 -1
- package/out/web/assets/{stateDiagram-D77RDMKH-BFrIaLdI.js → stateDiagram-D77RDMKH-D5QWfOhp.js} +1 -1
- package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
- package/out/web/assets/{swimlanes-42K2YHIH-BXGngUNU.js → swimlanes-42K2YHIH-CRs5UyA-.js} +1 -1
- package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
- package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
- package/out/web/assets/{timeline-definition-24CTP7MA-CegH7n43.js → timeline-definition-24CTP7MA-Denqd9qb.js} +1 -1
- package/out/web/assets/{treeView-Q6P3EWNA-DTpJv2Tw.js → treeView-Q6P3EWNA-0my3Z3s4.js} +1 -1
- package/out/web/assets/{treemap-WGGIJYW6-i8M9iJU6.js → treemap-WGGIJYW6-B_EjkLYq.js} +1 -1
- package/out/web/assets/{vennDiagram-4TSXK5OY-Dpzo1S8U.js → vennDiagram-4TSXK5OY-DxVg3Ewr.js} +1 -1
- package/out/web/assets/{wardley-WFR3VGLG-BrNsgtfw.js → wardley-WFR3VGLG-CGD-Tj4p.js} +1 -1
- package/out/web/assets/{wardleyDiagram-VM6X3IG4-lQ92LFE1.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +1 -1
- package/out/web/assets/{xychartDiagram-S5SC5T6Z-BaOaEoBd.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +1 -1
- package/out/web/index-web.html +2 -2
- package/out/web/index.html +2 -2
- package/package.json +2 -2
- package/shared-modules/CODEOWNERS +3 -3
- package/shared-modules/SDL2/SDL2_mixer.json +27 -0
- package/shared-modules/appstream/README.md +13 -0
- package/shared-modules/appstream/appstream-compose.json +111 -0
- package/shared-modules/dbus-glib/dbus-glib.json +2 -2
- package/shared-modules/libportal/libportal.json +23 -0
- package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
- package/shared-modules/linux-audio/fluidsynth2.json +2 -2
- package/shared-modules/linux-audio/libinstpatch.json +2 -2
- package/shared-modules/linux-audio/liblo-static.json +3 -0
- package/shared-modules/luajit/luajit.json +2 -2
- package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
- package/slash-commands.json +7 -2
- package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/src/renderer/shared/agentProgress.ts +51 -3
- package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -56
- package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +15 -1
- package/src/renderer/shared/components/Settings/GeneralTab.tsx +25 -12
- package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
- package/src/renderer/shared/components/Settings/ThemeTab.tsx +106 -3
- package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +67 -17
- package/src/renderer/shared/components/activity/AgentActivityTable.tsx +376 -134
- package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
- package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
- package/src/renderer/shared/components/activity/McpToolResults.tsx +39 -2
- package/src/renderer/shared/components/activity/SubagentDagView.tsx +7 -7
- package/src/renderer/shared/components/activity/ViewedImages.tsx +41 -2
- package/src/renderer/shared/components/app/ChunkErrorBoundary.tsx +3 -3
- package/src/renderer/shared/components/app/CommandPalette.tsx +7 -7
- package/src/renderer/shared/components/app/DesktopTitlebar.tsx +2 -2
- package/src/renderer/shared/components/app/MintDashboard.tsx +27 -17
- package/src/renderer/shared/components/app/ModalErrorBoundary.tsx +3 -3
- package/src/renderer/shared/components/cards/CalculationCard.tsx +3 -3
- package/src/renderer/shared/components/cards/ImageGenCard.tsx +2 -2
- package/src/renderer/shared/components/cards/ImageSearchCard.tsx +2 -2
- package/src/renderer/shared/components/cards/MermaidCard.tsx +1 -1
- package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
- package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
- package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
- package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
- package/src/renderer/shared/components/cards/StockCard.tsx +7 -7
- package/src/renderer/shared/components/cards/ToolResultCards.tsx +11 -3
- package/src/renderer/shared/components/cards/UiMockupWidget.tsx +4 -4
- package/src/renderer/shared/components/cards/WeatherCard.tsx +5 -5
- package/src/renderer/shared/components/chat/ApprovalCard.test.tsx +11 -0
- package/src/renderer/shared/components/chat/ApprovalCard.tsx +21 -2
- package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
- package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
- package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
- package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
- package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
- package/src/renderer/shared/components/chat/ChatCodeBlock.tsx +15 -1
- package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +40 -2
- package/src/renderer/shared/components/chat/ChatMessageItem.tsx +180 -34
- package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
- package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
- package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
- package/src/renderer/shared/components/chat/ChatPanel.test.tsx +22 -0
- package/src/renderer/shared/components/chat/ChatPanel.tsx +227 -53
- package/src/renderer/shared/components/chat/DiffReviewModal.tsx +6 -6
- package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +142 -1
- package/src/renderer/shared/components/chat/GeminiLiveOverlay.tsx +45 -3
- package/src/renderer/shared/components/chat/ModelSelectorPopover.tsx +42 -14
- package/src/renderer/shared/components/chat/RewindModal.tsx +10 -10
- package/src/renderer/shared/components/chat/SlashSuggestions.test.tsx +14 -0
- package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
- package/src/renderer/shared/components/chat/SourcesBlock.tsx +236 -90
- package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +45 -1
- package/src/renderer/shared/components/chat/TurnFileChanges.tsx +202 -169
- package/src/renderer/shared/components/extensions/CliSessionsView.tsx +5 -4
- package/src/renderer/shared/components/extensions/McpRegistryPicker.tsx +3 -3
- package/src/renderer/shared/components/studio/LibraryPage.tsx +48 -5
- package/src/renderer/shared/components/workspace/ArtifactPreviewPanel.tsx +125 -13
- package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
- package/src/renderer/shared/components/workspace/CodeReviewPage.tsx +77 -16
- package/src/renderer/shared/components/workspace/GitBranchSelector.tsx +78 -22
- package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +13 -0
- package/src/renderer/shared/components/workspace/ToolSurfacePage.tsx +48 -28
- package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +266 -47
- package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +18 -6
- package/src/renderer/shared/components/workspace/background-terminals.css +11 -11
- package/src/renderer/shared/constants/config.ts +1 -5
- package/src/renderer/shared/constants/models.test.ts +51 -0
- package/src/renderer/shared/constants/models.ts +139 -32
- package/src/renderer/shared/conversation/lifecycle.test.ts +91 -3
- package/src/renderer/shared/conversation/lifecycle.ts +104 -5
- package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
- package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
- package/src/renderer/shared/css/agent-observability.css +133 -0
- package/src/renderer/shared/css/chat-ui-cards.css +13 -13
- package/src/renderer/shared/css/code-review.css +63 -34
- package/src/renderer/shared/css/code-sessions.css +47 -18
- package/src/renderer/shared/css/collapsed-paste.css +1 -1
- package/src/renderer/shared/css/error-notice.css +1 -1
- package/src/renderer/shared/css/file-changes.css +165 -80
- package/src/renderer/shared/css/library.css +105 -10
- package/src/renderer/shared/css/management-views.css +1 -1
- package/src/renderer/shared/css/mcp-results.css +5 -5
- package/src/renderer/shared/css/model-selector.css +18 -18
- package/src/renderer/shared/css/mods.css +7 -7
- package/src/renderer/shared/css/notification-notice.css +2 -2
- package/src/renderer/shared/css/queued-messages.css +5 -5
- package/src/renderer/shared/css/settings/general.css +18 -13
- package/src/renderer/shared/css/settings/profile.css +5 -5
- package/src/renderer/shared/css/settings/theme.css +5 -5
- package/src/renderer/shared/css/slash-choice.css +2 -2
- package/src/renderer/shared/css/slash-suggestions.css +3 -3
- package/src/renderer/shared/css/sources-block.css +41 -2
- package/src/renderer/shared/css/tools-panel.css +2 -2
- package/src/renderer/shared/css/ui-tailwind.css +8 -0
- package/src/renderer/shared/css/veo-studio.css +2 -2
- package/src/renderer/shared/css/viewed-images.css +7 -7
- package/src/renderer/shared/platform.ts +2 -1
- package/src/renderer/shared/theme/themeManager.test.ts +17 -0
- package/src/renderer/shared/theme/themeManager.ts +21 -4
- package/src/renderer/shared/theme/themes.ts +54 -0
- package/src/renderer/shared/theme/tokens.css +6 -4
- package/src/renderer/shared/types.ts +1 -1
- package/src/renderer/shared/utils/agentActivity.test.ts +468 -2
- package/src/renderer/shared/utils/agentActivity.ts +602 -35
- package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
- package/src/renderer/shared/utils/artifactBrowser.ts +17 -19
- package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
- package/src/renderer/shared/utils/attachedDocument.ts +49 -0
- package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
- package/src/renderer/shared/utils/fileIcons.ts +149 -16
- package/src/renderer/shared/utils/markdown.tsx +72 -19
- package/src/renderer/shared/utils/markdown.webImages.test.tsx +16 -0
- package/src/renderer/shared/utils/mcpResults.test.tsx +29 -0
- package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
- package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
- package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
- package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
- package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
- package/src/renderer/shared/utils/workspaceDrag.ts +142 -0
- package/src/renderer/shared/utils/workspaceMedia.ts +10 -2
- package/src/renderer/src/App.tsx +14 -8
- package/src/renderer/src/agentProgress.ts +1 -0
- package/src/renderer/src/components/ScreenPicker.css +1 -1
- package/src/renderer/src/components/WorkspacePanel.tsx +6 -5
- package/src/renderer/src/css/app-shell.css +4 -4
- package/src/renderer/src/css/chat.css +1261 -241
- package/src/renderer/src/css/desktop-tools.css +11 -11
- package/src/renderer/src/css/sidebar-workspace.css +2 -2
- package/src/renderer/src/css/tool-surfaces.css +12 -12
- package/src/renderer/src/index.css +38 -20
- package/src/renderer/src/tauri.ts +22 -2
- package/src/renderer/src-web/App.tsx +14 -0
- package/src/renderer/src-web/agentProgress.ts +1 -0
- package/src/renderer/src-web/css/app-shell.css +4 -4
- package/src/renderer/src-web/css/chat.css +1278 -190
- package/src/renderer/src-web/css/mobile.css +29 -13
- package/src/renderer/src-web/css/settings/mobile.css +2 -2
- package/src/renderer/src-web/css/sidebar-workspace.css +1 -1
- package/src/renderer/src-web/index.css +38 -20
- package/src/renderer/src-web/tauri.ts +22 -2
- package/src/renderer/tests/browserArtifacts.browser.tsx +1 -1
- package/src/renderer/tests/library.browser.tsx +3 -0
- package/src/renderer/tests/liveVoice.browser.html +1 -0
- package/src/renderer/tests/workspaceDrop.browser.tsx +1 -1
- package/src-tauri/src/app/lifecycle.rs +1 -14
- package/src-tauri/src/background/headless.rs +14 -8
- package/src-tauri/src/commands/conversation.rs +38 -0
- package/src-tauri/src/native/mod.rs +0 -1
- package/src-tauri/src/native/system.rs +4 -47
- package/crates/mint-cli/src/interactive/chat_tui.rs +0 -8855
- package/crates/mint-core/src/agent/chat.rs +0 -4394
- package/crates/mint-core/src/browser/lifecycle.rs +0 -291
- package/crates/mint-core/src/browser/logging.rs +0 -20
- package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
- package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +0 -2
- package/out/web/assets/CalculationCard-CRjP3E1j.js +0 -1
- package/out/web/assets/CliSessionsView-C3Br2v5Y.css +0 -1
- package/out/web/assets/CodeReviewPage-CUJceQme.css +0 -1
- package/out/web/assets/CodeReviewPage-VCUgPla_.js +0 -2
- package/out/web/assets/ImageGenCard-BCXxkVJX.js +0 -1
- package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +0 -1
- package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
- package/out/web/assets/LibraryPage-WlviRdR8.js +0 -2
- package/out/web/assets/LinkedFoldersView-CKRgroWK.js +0 -1
- package/out/web/assets/McpServersView-D3wHnuHg.js +0 -1
- package/out/web/assets/MermaidCard-NqrHdyJW.js +0 -2
- package/out/web/assets/MintDashboard-B2DJsDDO.css +0 -1
- package/out/web/assets/MintDashboard-COw_xol7.js +0 -63
- package/out/web/assets/RewindModal-DempuDod.js +0 -1
- package/out/web/assets/SettingsWindow-2YP3yj7s.js +0 -4
- package/out/web/assets/SettingsWindow-Dz8LQVgD.css +0 -1
- package/out/web/assets/StockCard-BDMCe7mx.js +0 -1
- package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +0 -38
- package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +0 -1
- package/out/web/assets/UiMockupWidget-DD73QWg1.js +0 -1
- package/out/web/assets/WeatherCard-CPucIfq8.js +0 -1
- package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +0 -2
- package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +0 -1
- package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +0 -1
- package/out/web/assets/config-CvIO5hkn.js +0 -2
- package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +0 -1
- package/out/web/assets/index-BmpulIkg.js +0 -168
- package/out/web/assets/index-CkvBwhX_.css +0 -1
- package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +0 -1
- package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +0 -8
- package/shared-modules/libsecret/libsecret.json +0 -23
- package/shared-modules/libusb/libusb.json +0 -27
- package/shared-modules/lzo/lzo.json +0 -27
- package/src/renderer/src/components/BrowserShell.tsx +0 -108
- package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
- package/src/renderer/src/components/browser-shell.css +0 -185
- package/src-tauri/src/native/browser.rs +0 -252
|
@@ -447,7 +447,7 @@ impl Default for MintConfig {
|
|
|
447
447
|
local_openai_num_ctx: 32_768,
|
|
448
448
|
ollama_host: String::new(),
|
|
449
449
|
ollama_model: "llama3:latest".into(),
|
|
450
|
-
ollama_num_ctx:
|
|
450
|
+
ollama_num_ctx: 32_768,
|
|
451
451
|
nanobanana_model: "gemini-3.1-flash-image".into(),
|
|
452
452
|
image_gen_provider: "nanobanana".into(),
|
|
453
453
|
dalle_model: "gpt-image-1".into(),
|
|
@@ -773,53 +773,131 @@ impl MintConfig {
|
|
|
773
773
|
}
|
|
774
774
|
}
|
|
775
775
|
|
|
776
|
-
/// Returns
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
let m = model.to_ascii_lowercase();
|
|
776
|
+
/// Returns true if the model ID refers to a non-text media or embedding model
|
|
777
|
+
/// (e.g. image generation/editing, TTS, STT, embeddings, moderation, or live-only audio).
|
|
778
|
+
pub fn is_non_text_model(model: &str) -> bool {
|
|
779
|
+
let m = model.trim().to_ascii_lowercase();
|
|
780
|
+
if m.is_empty() {
|
|
781
|
+
return true;
|
|
782
|
+
}
|
|
783
|
+
m.contains("banana")
|
|
784
|
+
|| m.contains("imagen")
|
|
785
|
+
|| m.contains("image")
|
|
786
|
+
|| m.contains("dall-e")
|
|
787
|
+
|| m.contains("flux")
|
|
788
|
+
|| m.contains("sdxl")
|
|
789
|
+
|| m.contains("sd3")
|
|
790
|
+
|| m.contains("ideogram")
|
|
791
|
+
|| m.contains("veo-")
|
|
792
|
+
|| m.contains("whisper")
|
|
793
|
+
|| m.contains("tts")
|
|
794
|
+
|| m.contains("embed")
|
|
795
|
+
|| m.contains("aqa")
|
|
796
|
+
|| m.contains("moderation")
|
|
797
|
+
|| m.contains("native-audio")
|
|
798
|
+
|| m.contains("-live-")
|
|
799
|
+
|| m.ends_with("-live")
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/// Returns whether the provider's HTTP endpoint natively accepts a dedicated thinking/reasoning
|
|
803
|
+
/// payload parameter for this model (as opposed to using the prompt-based `<think>` CoT fallback).
|
|
804
|
+
pub fn has_native_thinking_api(provider: &str, model: &str) -> bool {
|
|
805
|
+
if Self::is_non_text_model(model) {
|
|
806
|
+
return false;
|
|
807
|
+
}
|
|
808
|
+
let p = provider.trim().to_ascii_lowercase();
|
|
809
|
+
let m = model.trim().to_ascii_lowercase();
|
|
780
810
|
if p == "gemini" {
|
|
781
811
|
return m.contains("2.5")
|
|
782
|
-
|| m.contains("2.0")
|
|
812
|
+
|| m.contains("2.0-flash-thinking")
|
|
783
813
|
|| m.contains("3.")
|
|
814
|
+
|| m.contains("gemini-3-")
|
|
815
|
+
|| m.ends_with("gemini-3")
|
|
816
|
+
|| m.contains("4.")
|
|
817
|
+
|| m.contains("gemini-4-")
|
|
818
|
+
|| m.contains("argon")
|
|
784
819
|
|| m.contains("thinking");
|
|
785
820
|
}
|
|
786
821
|
if p == "anthropic" {
|
|
787
822
|
return m.contains("3-7")
|
|
788
823
|
|| m.contains("3.7")
|
|
789
|
-
|| m.contains("sonnet-5")
|
|
790
|
-
|| m.contains("opus-5")
|
|
791
824
|
|| m.contains("sonnet-4")
|
|
792
|
-
|| m.contains("opus-4")
|
|
825
|
+
|| m.contains("opus-4")
|
|
826
|
+
|| m.contains("haiku-4")
|
|
827
|
+
|| m.contains("claude-4")
|
|
828
|
+
|| m.contains("sonnet-5")
|
|
829
|
+
|| m.contains("opus-5");
|
|
793
830
|
}
|
|
794
831
|
if p == "openai" || p == "local_openai" {
|
|
795
|
-
|
|
796
|
-
|
|
832
|
+
let slug = m.rsplit('/').next().unwrap_or(&m);
|
|
833
|
+
return slug.starts_with("o1")
|
|
834
|
+
|| slug.starts_with("o3")
|
|
835
|
+
|| slug.starts_with("o4")
|
|
797
836
|
|| m.contains("thinking")
|
|
798
837
|
|| m.contains("reason")
|
|
799
|
-
|| m.contains("gpt-5")
|
|
838
|
+
|| m.contains("gpt-5")
|
|
839
|
+
|| m.contains("r1")
|
|
840
|
+
|| m.contains("qwq");
|
|
800
841
|
}
|
|
801
842
|
if p == "deepseek" {
|
|
802
|
-
return m.contains("
|
|
843
|
+
return m.contains("flash")
|
|
844
|
+
|| m.contains("v4")
|
|
845
|
+
|| m.contains("reasoner")
|
|
846
|
+
|| m.contains("r1")
|
|
847
|
+
|| m.contains("thinking");
|
|
803
848
|
}
|
|
804
849
|
if p == "openrouter" {
|
|
805
850
|
return m.contains("o1")
|
|
806
851
|
|| m.contains("o3")
|
|
852
|
+
|| m.contains("o4")
|
|
853
|
+
|| m.contains("gpt-5")
|
|
807
854
|
|| m.contains("thinking")
|
|
808
855
|
|| m.contains("reason")
|
|
809
856
|
|| m.contains("r1")
|
|
810
857
|
|| m.contains("qwq")
|
|
811
|
-
|| m.contains("
|
|
812
|
-
|| m.contains("deepseek")
|
|
858
|
+
|| m.contains("deepseek-flash")
|
|
859
|
+
|| m.contains("deepseek-v4")
|
|
860
|
+
|| m.contains("gemini-2.5")
|
|
861
|
+
|| m.contains("gemini-3")
|
|
862
|
+
|| m.contains("claude-3-7")
|
|
863
|
+
|| m.contains("claude-3.7")
|
|
864
|
+
|| m.contains("claude-4")
|
|
865
|
+
|| m.contains("sonnet-4")
|
|
866
|
+
|| m.contains("opus-4")
|
|
867
|
+
|| m.contains("sonnet-5")
|
|
868
|
+
|| m.contains("opus-5");
|
|
813
869
|
}
|
|
814
870
|
if p == "ollama" {
|
|
815
871
|
return m.contains("r1")
|
|
816
872
|
|| m.contains("qwq")
|
|
873
|
+
|| m.contains("qwen3")
|
|
817
874
|
|| m.contains("thinking")
|
|
818
875
|
|| m.contains("deepseek");
|
|
819
876
|
}
|
|
820
877
|
false
|
|
821
878
|
}
|
|
822
879
|
|
|
880
|
+
/// Returns whether thinking/reasoning is supported by a given provider & model
|
|
881
|
+
/// (either via native provider API parameters or prompt-based `<think>` CoT fallback).
|
|
882
|
+
/// Only non-text models (image generation, TTS/STT, embeddings) return `false`.
|
|
883
|
+
pub fn is_thinking_supported_for_model(provider: &str, model: &str) -> bool {
|
|
884
|
+
if Self::is_non_text_model(model) {
|
|
885
|
+
return false;
|
|
886
|
+
}
|
|
887
|
+
let p = provider.trim().to_ascii_lowercase();
|
|
888
|
+
matches!(
|
|
889
|
+
p.as_str(),
|
|
890
|
+
"gemini"
|
|
891
|
+
| "anthropic"
|
|
892
|
+
| "openai"
|
|
893
|
+
| "local_openai"
|
|
894
|
+
| "deepseek"
|
|
895
|
+
| "openrouter"
|
|
896
|
+
| "ollama"
|
|
897
|
+
| "huggingface"
|
|
898
|
+
) || p.starts_with("custom:")
|
|
899
|
+
}
|
|
900
|
+
|
|
823
901
|
/// Returns whether the active model supports thinking/reasoning.
|
|
824
902
|
pub fn is_thinking_supported(&self) -> bool {
|
|
825
903
|
Self::is_thinking_supported_for_model(&self.ai_provider, self.active_model())
|
|
@@ -828,6 +906,9 @@ impl MintConfig {
|
|
|
828
906
|
/// Resolves thinking enabled state for a model.
|
|
829
907
|
pub fn resolved_thinking_enabled_for_model(&self, provider: &str, model: &str) -> bool {
|
|
830
908
|
let model_clean = model.trim();
|
|
909
|
+
if !Self::is_thinking_supported_for_model(provider, model_clean) {
|
|
910
|
+
return false;
|
|
911
|
+
}
|
|
831
912
|
if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
|
|
832
913
|
return cfg.enabled;
|
|
833
914
|
}
|
|
@@ -837,8 +918,8 @@ impl MintConfig {
|
|
|
837
918
|
return v.enabled;
|
|
838
919
|
}
|
|
839
920
|
}
|
|
840
|
-
// If not explicitly
|
|
841
|
-
if Self::
|
|
921
|
+
// If not explicitly overridden per-model, enable by default for models with native thinking API
|
|
922
|
+
if Self::has_native_thinking_api(provider, model_clean) {
|
|
842
923
|
self.thinking_enabled
|
|
843
924
|
} else {
|
|
844
925
|
false
|
|
@@ -1064,6 +1145,17 @@ fn is_test_environment() -> bool {
|
|
|
1064
1145
|
|
|
1065
1146
|
/// Returns the root configuration directory for Mint (`~/.config/mint`).
|
|
1066
1147
|
pub fn mint_config_dir() -> Option<PathBuf> {
|
|
1148
|
+
if let Ok(override_dir) = std::env::var("MINT_CONFIG_DIR") {
|
|
1149
|
+
return Some(PathBuf::from(override_dir));
|
|
1150
|
+
}
|
|
1151
|
+
if let Ok(override_path) = std::env::var("MINT_CONFIG_PATH") {
|
|
1152
|
+
if let Some(parent) = Path::new(&override_path).parent() {
|
|
1153
|
+
return Some(parent.to_path_buf());
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
if is_test_environment() {
|
|
1157
|
+
return Some(std::env::temp_dir().join("mint-test"));
|
|
1158
|
+
}
|
|
1067
1159
|
dirs::config_dir().map(|dir| dir.join("mint"))
|
|
1068
1160
|
}
|
|
1069
1161
|
|
|
@@ -1071,12 +1163,6 @@ pub fn config_path() -> Result<PathBuf, ConfigError> {
|
|
|
1071
1163
|
if let Ok(override_path) = std::env::var("MINT_CONFIG_PATH") {
|
|
1072
1164
|
return Ok(PathBuf::from(override_path));
|
|
1073
1165
|
}
|
|
1074
|
-
if is_test_environment() {
|
|
1075
|
-
let tmp = std::env::temp_dir()
|
|
1076
|
-
.join("mint-test")
|
|
1077
|
-
.join("mint-config.json");
|
|
1078
|
-
return Ok(tmp);
|
|
1079
|
-
}
|
|
1080
1166
|
mint_config_dir()
|
|
1081
1167
|
.map(|directory| directory.join("mint-config.json"))
|
|
1082
1168
|
.ok_or(ConfigError::ConfigDirectoryUnavailable)
|
|
@@ -1226,14 +1312,9 @@ fn default_sandbox_command() -> &'static str {
|
|
|
1226
1312
|
|
|
1227
1313
|
fn runtime_extra_defaults() -> BTreeMap<String, Value> {
|
|
1228
1314
|
serde_json::from_value(serde_json::json!({
|
|
1229
|
-
"automationBrowser": "chromium",
|
|
1230
|
-
"browserAutomationEnabled": true,
|
|
1231
|
-
"browserAgentMode": "headless",
|
|
1232
1315
|
"browserExecutable": "",
|
|
1233
1316
|
"browserViewportWidth": 1440,
|
|
1234
1317
|
"browserViewportHeight": 900,
|
|
1235
|
-
"browserDebugUrl": "http://127.0.0.1:9222/json/list",
|
|
1236
|
-
"browserExtensionContextUrl": "http://127.0.0.1:3212/context",
|
|
1237
1318
|
"proactiveInterval": 60,
|
|
1238
1319
|
"proactiveCooldown": 120,
|
|
1239
1320
|
"enableHeadlessTaskQueue": false,
|
|
@@ -1417,7 +1498,7 @@ mod tests {
|
|
|
1417
1498
|
// Default openai_model is a GPT-5 family model.
|
|
1418
1499
|
assert_eq!(window_for("openai"), 400_000);
|
|
1419
1500
|
assert_eq!(window_for("deepseek"), 128_000);
|
|
1420
|
-
assert_eq!(window_for("ollama"),
|
|
1501
|
+
assert_eq!(window_for("ollama"), 32_768); // default ollama_num_ctx
|
|
1421
1502
|
assert_eq!(window_for("local_openai"), 32_768); // default local_openai_num_ctx
|
|
1422
1503
|
assert_eq!(window_for("huggingface"), 128_000);
|
|
1423
1504
|
assert_eq!(window_for("openrouter"), 128_000); // default openrouter_num_ctx
|
|
@@ -1820,7 +1901,7 @@ mod tests {
|
|
|
1820
1901
|
fn test_thinking_configuration_and_resolution() {
|
|
1821
1902
|
let mut config = MintConfig::default();
|
|
1822
1903
|
|
|
1823
|
-
//
|
|
1904
|
+
// All text/chat models support thinking (via native API or prompt fallback)
|
|
1824
1905
|
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1825
1906
|
"anthropic",
|
|
1826
1907
|
"claude-3-7-sonnet"
|
|
@@ -1829,6 +1910,10 @@ mod tests {
|
|
|
1829
1910
|
"gemini",
|
|
1830
1911
|
"gemini-2.5-pro"
|
|
1831
1912
|
));
|
|
1913
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1914
|
+
"gemini",
|
|
1915
|
+
"gemini-3-flash-preview"
|
|
1916
|
+
));
|
|
1832
1917
|
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1833
1918
|
"openai", "o3-mini"
|
|
1834
1919
|
));
|
|
@@ -1836,15 +1921,60 @@ mod tests {
|
|
|
1836
1921
|
"deepseek",
|
|
1837
1922
|
"deepseek-reasoner"
|
|
1838
1923
|
));
|
|
1839
|
-
assert!(
|
|
1924
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1925
|
+
"deepseek",
|
|
1926
|
+
"deepseek-flash"
|
|
1927
|
+
));
|
|
1928
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1929
|
+
"deepseek",
|
|
1930
|
+
"deepseek-v4-pro"
|
|
1931
|
+
));
|
|
1932
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1840
1933
|
"openai", "gpt-4o"
|
|
1841
1934
|
));
|
|
1842
|
-
assert!(
|
|
1935
|
+
assert!(MintConfig::is_thinking_supported_for_model(
|
|
1843
1936
|
"anthropic",
|
|
1844
1937
|
"claude-3-5-haiku"
|
|
1845
1938
|
));
|
|
1846
1939
|
|
|
1847
|
-
//
|
|
1940
|
+
// Non-text models (image / audio / embedding) do NOT support thinking
|
|
1941
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1942
|
+
"gemini",
|
|
1943
|
+
"nano-banana-pro-preview"
|
|
1944
|
+
));
|
|
1945
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1946
|
+
"gemini",
|
|
1947
|
+
"gemini-nano-banana-2.1"
|
|
1948
|
+
));
|
|
1949
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1950
|
+
"gemini",
|
|
1951
|
+
"imagen-3.0-generate-002"
|
|
1952
|
+
));
|
|
1953
|
+
assert!(!MintConfig::is_thinking_supported_for_model(
|
|
1954
|
+
"openai",
|
|
1955
|
+
"text-embedding-3-small"
|
|
1956
|
+
));
|
|
1957
|
+
|
|
1958
|
+
// Native thinking API detection
|
|
1959
|
+
assert!(MintConfig::has_native_thinking_api(
|
|
1960
|
+
"deepseek",
|
|
1961
|
+
"deepseek-flash"
|
|
1962
|
+
));
|
|
1963
|
+
assert!(MintConfig::has_native_thinking_api(
|
|
1964
|
+
"deepseek",
|
|
1965
|
+
"deepseek-v4-pro"
|
|
1966
|
+
));
|
|
1967
|
+
assert!(!MintConfig::has_native_thinking_api(
|
|
1968
|
+
"deepseek",
|
|
1969
|
+
"deepseek-chat"
|
|
1970
|
+
));
|
|
1971
|
+
assert!(MintConfig::has_native_thinking_api(
|
|
1972
|
+
"gemini",
|
|
1973
|
+
"gemini-3-flash-preview"
|
|
1974
|
+
));
|
|
1975
|
+
assert!(!MintConfig::has_native_thinking_api("openai", "gpt-4o"));
|
|
1976
|
+
|
|
1977
|
+
// Global default resolution for native thinking model
|
|
1848
1978
|
config.ai_provider = "anthropic".into();
|
|
1849
1979
|
config.anthropic_model = "claude-3-7-sonnet".into();
|
|
1850
1980
|
let (enabled, effort) = config.resolved_thinking();
|
|
@@ -1862,11 +1992,23 @@ mod tests {
|
|
|
1862
1992
|
let (enabled, _) = config.resolved_thinking();
|
|
1863
1993
|
assert!(!enabled);
|
|
1864
1994
|
|
|
1865
|
-
//
|
|
1995
|
+
// Standard chat model without native thinking API defaults to false until toggled on
|
|
1866
1996
|
config.ai_provider = "openai".into();
|
|
1867
1997
|
config.openai_model = "gpt-4o".into();
|
|
1868
1998
|
let (enabled, _) = config.resolved_thinking();
|
|
1869
1999
|
assert!(!enabled);
|
|
2000
|
+
// Once user toggles it on, it enables thinking (via prompt fallback)
|
|
2001
|
+
config.set_model_thinking("gpt-4o", true, "high");
|
|
2002
|
+
let (enabled, effort) = config.resolved_thinking();
|
|
2003
|
+
assert!(enabled);
|
|
2004
|
+
assert_eq!(effort, "high");
|
|
2005
|
+
|
|
2006
|
+
// Non-text model always resolves enabled to false even if overridden
|
|
2007
|
+
config.ai_provider = "gemini".into();
|
|
2008
|
+
config.gemini_model = "nano-banana-pro-preview".into();
|
|
2009
|
+
config.set_model_thinking("nano-banana-pro-preview", true, "high");
|
|
2010
|
+
let (enabled, _) = config.resolved_thinking();
|
|
2011
|
+
assert!(!enabled);
|
|
1870
2012
|
}
|
|
1871
2013
|
|
|
1872
2014
|
#[test]
|
|
@@ -384,39 +384,33 @@ pub fn preview(manifest: &Value, source: &str) -> Result<Value, String> {
|
|
|
384
384
|
.snapshot()
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
///
|
|
388
|
-
pub fn
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
.map_err(|e| e.to_string())?;
|
|
394
|
-
if line.len() > 1024 * 1024 {
|
|
395
|
-
return Err("IPC request too large".into());
|
|
396
|
-
}
|
|
397
|
-
serde_json::from_str(&line).map_err(|e| e.to_string())
|
|
398
|
-
}
|
|
399
|
-
fn send(value: &Value) {
|
|
400
|
-
println!("{}", value);
|
|
401
|
-
let _ = io::stdout().flush();
|
|
402
|
-
}
|
|
387
|
+
/// Runs the worker exchange loop using custom reader and sender functions.
|
|
388
|
+
pub fn run_worker_loop<R, W>(read: R, send: W) -> Result<(), String>
|
|
389
|
+
where
|
|
390
|
+
R: Fn() -> Result<Value, String> + Clone + Send + Sync + 'static,
|
|
391
|
+
W: Fn(Value) + Clone + Send + Sync + 'static,
|
|
392
|
+
{
|
|
403
393
|
let init = read()?;
|
|
394
|
+
let host_send = send.clone();
|
|
395
|
+
let host_read = read.clone();
|
|
404
396
|
let engine = Engine::new(
|
|
405
397
|
init["compiled"].as_str().ok_or("Missing compiled source")?,
|
|
406
398
|
&init["state"],
|
|
407
|
-
|request| {
|
|
399
|
+
move |request| {
|
|
408
400
|
let request = serde_json::from_str::<Value>(&request).unwrap_or(Value::Null);
|
|
409
|
-
|
|
410
|
-
|
|
401
|
+
host_send(json!({"host":request}));
|
|
402
|
+
host_read()
|
|
403
|
+
.unwrap_or_else(|e| json!({"error":e}))
|
|
404
|
+
.to_string()
|
|
411
405
|
},
|
|
412
406
|
);
|
|
413
407
|
let engine = match engine {
|
|
414
408
|
Ok(e) => {
|
|
415
|
-
send(
|
|
409
|
+
send(json!({"ok":e.snapshot()?}));
|
|
416
410
|
e
|
|
417
411
|
}
|
|
418
412
|
Err(e) => {
|
|
419
|
-
send(
|
|
413
|
+
send(json!({"error":e}));
|
|
420
414
|
return Ok(());
|
|
421
415
|
}
|
|
422
416
|
};
|
|
@@ -430,9 +424,9 @@ pub fn worker_main() -> Result<(), String> {
|
|
|
430
424
|
break;
|
|
431
425
|
}
|
|
432
426
|
match engine.dispatch(kind, &request["payload"]) {
|
|
433
|
-
Ok(v) => send(
|
|
427
|
+
Ok(v) => send(json!({"ok":v})),
|
|
434
428
|
Err(e) => {
|
|
435
|
-
send(
|
|
429
|
+
send(json!({"error":e}));
|
|
436
430
|
break;
|
|
437
431
|
}
|
|
438
432
|
}
|
|
@@ -440,6 +434,26 @@ pub fn worker_main() -> Result<(), String> {
|
|
|
440
434
|
Ok(())
|
|
441
435
|
}
|
|
442
436
|
|
|
437
|
+
/// Newline-delimited IPC. The parent grants capabilities; this process has no OS SDK.
|
|
438
|
+
pub fn worker_main() -> Result<(), String> {
|
|
439
|
+
run_worker_loop(
|
|
440
|
+
|| {
|
|
441
|
+
let mut line = String::new();
|
|
442
|
+
io::stdin()
|
|
443
|
+
.read_line(&mut line)
|
|
444
|
+
.map_err(|e| e.to_string())?;
|
|
445
|
+
if line.len() > 1024 * 1024 {
|
|
446
|
+
return Err("IPC request too large".into());
|
|
447
|
+
}
|
|
448
|
+
serde_json::from_str(&line).map_err(|e| e.to_string())
|
|
449
|
+
},
|
|
450
|
+
|value| {
|
|
451
|
+
println!("{}", value);
|
|
452
|
+
let _ = io::stdout().flush();
|
|
453
|
+
},
|
|
454
|
+
)
|
|
455
|
+
}
|
|
456
|
+
|
|
443
457
|
pub fn pack(manifest: &Value, source: &str, readme: &str) -> Result<Vec<u8>, String> {
|
|
444
458
|
let m: Manifest = serde_json::from_value(manifest.clone()).map_err(|e| e.to_string())?;
|
|
445
459
|
compile(&m, source)?;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/core-Mi3s5D4_.js","assets/rolldown-runtime-CNOWq4Kh.js","assets/WorkspacePdfPreview-Bi8Zzyir.js","assets/jsx-runtime-DmUwWVTj.js","assets/index-BocxnrDG.js","assets/index-yeh_r55a.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{En as i,F as a,I as o,In as s,J as c,Jn as l,L as u,Qt as d,Wn as f,Xn as p,er as ee,g as m,h,j as g,nr as _}from"./index-BocxnrDG.js";import{N as v,P as y,b,c as x,d as S,l as C,m as w,p as T,s as E,x as D}from"./MintDashboard-C_UYPoNV.js";async function O(e,t,n={}){let r=n.openBrowser??(async e=>{await a.openExternal(e)}),i=n.startPreview??((e,t)=>o.startHtmlPreview(e,t));if(e.url){await r(e.url);return}let s=(e.workspacePath??t)?.trim();if(!s)throw Error(`Select a project before opening its preview in browser`);let c=e.path.replace(/\\/g,`/`);if(/^(\/|[a-z]:\/)/i.test(c)){let e=s.replace(/\\/g,`/`).replace(/\/+$/,``),t=`${e}/`;if(!(/^[a-z]:\//i.test(e)||e.startsWith(`//`)?c.toLowerCase().startsWith(t.toLowerCase()):c.startsWith(t)))throw Error(`This file is outside its source project`);c=c.slice(t.length)}await r((await i(s,c)).url)}var k=t((()=>{g()})),A=t((()=>{}));function j({path:e,root:t}){let[n,r]=(0,M.useState)(!1),[i,a]=(0,M.useState)(``),o=e.replace(/\\/g,`/`).split(`/`).pop()||e,s=async()=>{if(t&&!n){r(!0),a(``);try{let n=w(t,e),{invoke:r}=await h(async()=>{let{invoke:e}=await import(`./core-Mi3s5D4_.js`).then(e=>(e.a(),e.i));return{invoke:e}},__vite__mapDeps([0,1]));await r(`run_desktop_action`,{action:{type:`open_url`,target:n}})}catch(e){a(e instanceof Error?e.message:String(e))}finally{r(!1)}}};return(0,N.jsxs)(`section`,{className:`workspace-file-info`,"aria-label":`File information`,children:[(0,N.jsx)(f,{size:32,"aria-hidden":`true`}),(0,N.jsx)(`h2`,{children:o}),(0,N.jsx)(`p`,{children:`Preview is not available for this file type.`}),(0,N.jsxs)(`dl`,{children:[(0,N.jsx)(`dt`,{children:`File type`}),(0,N.jsx)(`dd`,{children:o.includes(`.`)?o.split(`.`).pop().toUpperCase():`File`}),(0,N.jsx)(`dt`,{children:`Path`}),(0,N.jsx)(`dd`,{children:e}),(0,N.jsx)(`dt`,{children:`Workspace`}),(0,N.jsx)(`dd`,{children:t||`Unavailable`})]}),(0,N.jsxs)(`button`,{type:`button`,disabled:!t||n,"aria-busy":n,onClick:()=>{s()},children:[(0,N.jsx)(_,{size:15,"aria-hidden":`true`}),n?`Opening…`:`Open with external app`]}),i&&(0,N.jsxs)(`p`,{className:`workspace-file-info-error`,role:`alert`,children:[`Could not open file: `,i]})]})}var M,N,P=t((()=>{M=e(n()),u(),S(),A(),N=r(),m()})),F=t((()=>{}));function I({kind:e,url:t,path:n,root:r,mimeType:i}){let a=(0,L.useRef)(null),[o,s]=(0,L.useState)(!1);return(0,L.useEffect)(()=>{let e=a.current;return()=>{e&&(e.pause(),e.removeAttribute(`src`),e.querySelector(`source`)?.removeAttribute(`src`),e.load())}},[t]),(0,R.jsx)(`section`,{className:`workspace-media-preview is-${e}`,"aria-label":`${e===`audio`?`Audio`:`Video`} preview`,children:o?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{role:`alert`,className:`workspace-media-error`,children:`This file could not be played in Mint. Open it with an external app instead.`}),(0,R.jsx)(j,{path:n,root:r})]}):e===`audio`?(0,R.jsx)(`audio`,{ref:a,controls:!0,preload:`metadata`,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})}):(0,R.jsx)(`video`,{ref:a,controls:!0,preload:`metadata`,playsInline:!0,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})})})}var L,R,z=t((()=>{L=e(n()),P(),F(),R=r()}));function te(e){switch(e){case`image`:return(0,H.jsx)(i,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`html`:return(0,H.jsx)(s,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`svg`:case`code`:return(0,H.jsx)(p,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`markdown`:case`pdf`:return(0,H.jsx)(l,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`audio`:return(0,H.jsx)(d,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`video`:return(0,H.jsx)(c,{size:13,strokeWidth:2.2,"aria-hidden":`true`});default:return(0,H.jsx)(f,{size:13,strokeWidth:2.2,"aria-hidden":`true`})}}function B({artifact:e,onClose:t,workspacePath:n}){let r=e?.path||``,o=(0,V.useMemo)(()=>{if(!r)return``;let e=r.replace(/\\/g,`/`).split(`/`);return e[e.length-1]||r},[r]),s=(0,V.useMemo)(()=>e?.type?e.type:E(r),[e,r]),c=s===`html`||s===`svg`||s===`markdown`,[l,u]=(0,V.useState)(s===`code`?`code`:`preview`),[d,f]=(0,V.useState)(`desktop`),[m,h]=(0,V.useState)(e?.content||``),[g,_]=(0,V.useState)(e?.url||``),[y,b]=(0,V.useState)(e?.url||``),[S,C]=(0,V.useState)(e?.byteLength),[w,k]=(0,V.useState)(!1),[A,M]=(0,V.useState)(null),[N,P]=(0,V.useState)(!1),[F,L]=(0,V.useState)(null),R=(0,V.useRef)(!1),z=(0,V.useRef)(e);z.current=e;let[B,W]=(0,V.useState)(!1),[G,K]=(0,V.useState)(null),[q,J]=(0,V.useState)(0),Y=(0,V.useRef)(0),X=e?.workspacePath??n,Z=(0,V.useMemo)(()=>x(r),[r]),Q=s===`pdf`||s===`audio`||s===`video`,ne=(0,V.useMemo)(()=>{if(s!==`image`)return`Image`;let e=r.split(`.`).pop()?.toUpperCase()||``;return e===`JPG`?`JPEG`:[`PNG`,`JPEG`,`WEBP`,`GIF`,`SVG`,`ICO`,`AVIF`,`BMP`,`TIFF`].includes(e)?e:`IMAGE`},[s,r]),re=(0,V.useMemo)(()=>!Z||Z===`plaintext`?`Code`:{javascript:`JavaScript`,typescript:`TypeScript`,python:`Python`,rust:`Rust`,json:`JSON`,html:`HTML`,css:`CSS`,cpp:`C++`,csharp:`C#`,php:`PHP`,ruby:`Ruby`,shell:`Shell`,bash:`Bash`,sql:`SQL`,yaml:`YAML`,xml:`XML`,toml:`TOML`,markdown:`Markdown`}[Z.toLowerCase()]||Z.charAt(0).toUpperCase()+Z.slice(1),[Z]),$=(0,V.useCallback)(async(t=!1)=>{let n=++Y.current;if(M(null),K(null),J(e=>e+1),r){if(t&&l===`preview`&&(s===`image`||s===`svg`)&&e?.url?.startsWith(`data:image/`)&&X){k(!0);try{let e=await a.readWorkspaceImage(r,X);Y.current===n&&_(e)}catch(e){Y.current===n&&M(e instanceof Error?e.message:String(e))}finally{Y.current===n&&k(!1)}}else if(Q){if(e?.url){b(e.url),k(!1);return}k(!0);try{let e=await a.readWorkspaceMedia(r,X);Y.current===n&&(b(e.url),C(e.byteLength))}catch(e){Y.current===n&&M(e instanceof Error?e.message:String(e))}finally{Y.current===n&&k(!1)}}else if(s===`file`||s===`image`||e?.url&&l===`preview`)k(!1),s===`image`&&!e?.url&&M(`No image preview URL is available`);else{k(!0);try{let e=await a.readWorkspaceFile(r,X);Y.current===n&&h(e)}catch(t){if(Y.current!==n)return;e?.content===void 0?M(t instanceof Error?t.message:`Unable to read file content`):h(e.content)}finally{Y.current===n&&k(!1)}}}},[r,X,e,s,l,Q]);(0,V.useEffect)(()=>{u(s===`code`?`code`:`preview`),L(null),h(e?.content??``),_(e?.url??``),b(e?.url??``),C(e?.byteLength),K(null),M(null)},[e,s]),(0,V.useEffect)(()=>(e?.content!==void 0&&(l===`preview`||!r)?(k(!1),M(null)):$(),()=>{Y.current+=1}),[e,l,r,$]);let ie=async()=>{if(r)try{await navigator.clipboard.writeText(r),W(!0),setTimeout(()=>W(!1),1800)}catch{}},ae=async()=>{if(e&&!R.current){R.current=!0,P(!0),L(null);try{await O(e,X)}catch(t){z.current===e&&L(t instanceof Error?t.message:String(t))}finally{R.current=!1,P(!1)}}};return e?(0,H.jsxs)(`aside`,{className:`artifact-preview-panel`,style:{display:`flex`,flexDirection:`column`,width:`var(--preview-width, 50%)`,minWidth:`280px`,maxWidth:`none`,height:`100%`,background:`var(--panel-bg, #1e1e20)`,color:`var(--text-main, #e8e8ea)`,position:`relative`,zIndex:10,overflow:`hidden`},children:[(0,H.jsxs)(`header`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid var(--border)`,background:`var(--surface-bg, #252527)`,gap:`8px`,flexShrink:0},children:[(0,H.jsxs)(`div`,{className:`artifact-preview-header-drag`,draggable:!!r,onDragStart:r?t=>{T(t.dataTransfer,{path:r,root:X,url:g||e?.url})}:void 0,style:{display:`flex`,alignItems:`center`,gap:`8px`,minWidth:0,cursor:r?`grab`:void 0},title:r?`${r} (Drag to chat)`:void 0,children:[(0,H.jsx)(`span`,{style:{display:`inline-flex`,alignItems:`center`,justifyContent:`center`,width:`24px`,height:`24px`,borderRadius:`var(--radius-xs, 4px)`,background:`color-mix(in srgb, var(--accent) 15%, transparent)`,color:`var(--interactive-fg)`,flexShrink:0},title:s.toUpperCase(),"aria-label":`${s} artifact`,children:te(s)}),(0,H.jsxs)(`div`,{style:{minWidth:0,display:`flex`,flexDirection:`column`},children:[(0,H.jsx)(`span`,{style:{fontWeight:600,fontSize:`0.86rem`,color:`var(--text-main)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:r,children:o}),(0,H.jsx)(`button`,{type:`button`,onClick:ie,style:{background:`none`,border:`none`,color:B?`var(--accent)`:`var(--text-muted)`,fontSize:`0.7rem`,padding:0,cursor:`pointer`,textAlign:`left`,display:`inline-flex`,alignItems:`center`,gap:`4px`},children:B?`Path Copied`:`Copy path`})]})]}),(0,H.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c?(0,H.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,H.jsx)(`button`,{type:`button`,onClick:()=>u(`preview`),style:{background:l===`preview`?`var(--accent)`:`transparent`,color:l===`preview`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Preview`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>u(`code`),style:{background:l===`code`?`var(--accent)`:`transparent`,color:l===`code`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Code`})]}):(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,padding:`3px 10px`,background:s===`image`||s===`code`?`color-mix(in srgb, var(--accent) 10%, transparent)`:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`9999px`,border:s===`image`||s===`code`?`1px solid color-mix(in srgb, var(--accent) 25%, transparent)`:`1px solid var(--border)`,color:s===`image`||s===`code`?`var(--accent)`:`var(--text-muted)`,fontSize:`0.72rem`,fontWeight:500,letterSpacing:`0.01em`},children:[s===`code`?(0,H.jsx)(p,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):s===`image`?(0,H.jsx)(i,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):(0,H.jsx)(ee,{size:12,strokeWidth:2.2,"aria-hidden":`true`}),(0,H.jsx)(`span`,{children:s===`code`?re:s===`image`?ne:s===`file`?`Details`:`Preview`})]}),s===`image`&&G&&(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,padding:`3px 9px`,borderRadius:`9999px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,border:`1px solid var(--border)`,fontSize:`0.7rem`,color:`var(--text-muted)`,fontFamily:`var(--font-mono, monospace)`,letterSpacing:`0.01em`,whiteSpace:`nowrap`},title:`Image dimensions (width × height)`,children:[G.width,` × `,G.height,` px`]})]}),l===`preview`&&s===`html`&&(0,H.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`desktop`),title:`Desktop 100%`,style:{background:d===`desktop`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`desktop`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Desktop`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`tablet`),title:`Tablet (768px)`,style:{background:d===`tablet`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`tablet`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Tablet`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`mobile`),title:`Mobile (375px)`,style:{background:d===`mobile`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`mobile`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Mobile`})]})]}),(0,H.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[!Q&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{$(!0)},disabled:w,title:`Reload content from file`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{animation:w?`spin 1s linear infinite`:`none`},children:[(0,H.jsx)(`polyline`,{points:`23 4 23 10 17 10`}),(0,H.jsx)(`polyline`,{points:`1 20 1 14 7 14`}),(0,H.jsx)(`path`,{d:`M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15`})]})}),s===`html`&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{ae()},disabled:N,"aria-label":`Open preview`,"aria-busy":N,title:N?`Opening preview…`:`Open preview`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,H.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,H.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(e?.url||y||m)&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{let t=e?.url||y||(m?`data:text/plain;charset=utf-8,${encodeURIComponent(m)}`:``);if(!t)return;let n=document.createElement(`a`);n.href=t,n.download=o||`download`,document.body.appendChild(n),n.click(),document.body.removeChild(n)},title:`Download ${o}`,"aria-label":`Download ${o}`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,H.jsx)(`polyline`,{points:`7 10 12 15 17 10`}),(0,H.jsx)(`line`,{x1:`12`,y1:`15`,x2:`12`,y2:`3`})]})}),(e?.url||y)&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{let t=e?.url||y;t&&window.open(t,`_blank`,`noopener,noreferrer`)},title:`Open in new window`,"aria-label":`Open in new window`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,H.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,H.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(0,H.jsx)(`button`,{type:`button`,onClick:t,title:`Close preview Panel`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,H.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})})]})]}),F&&(0,H.jsxs)(`div`,{role:`alert`,style:{padding:`8px 14px`,fontSize:`0.8rem`,color:`var(--status-error, #f87171)`,flexShrink:0},children:[`Could not open preview: `,F]}),(0,H.jsx)(`div`,{style:{flex:1,overflow:`auto`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`flex-start`,background:l===`preview`&&s===`html`?`var(--input-bg, #0a0a0b)`:`transparent`,padding:l===`preview`&&s===`html`?`16px`:`0`},children:A?(0,H.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--status-error, #f87171)`},children:[(0,H.jsx)(`p`,{style:{fontWeight:600,marginBottom:`8px`},children:`Error loading preview`}),(0,H.jsx)(`p`,{style:{fontSize:`0.8rem`,opacity:.8},children:A}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>{$(!0)},style:{marginTop:`12px`,padding:`4px 12px`,borderRadius:`var(--radius-xs, 4px)`,background:`var(--hover-delete-bg, rgba(239, 68, 68, 0.15))`,color:`var(--status-error, #f87171)`,border:`1px solid color-mix(in srgb, var(--status-error, #ef4444) 30%, transparent)`,cursor:`pointer`,fontSize:`0.78rem`},children:`Retry`})]}):s===`file`?(0,H.jsx)(j,{path:r,root:X},`${X}:${r}`):s===`pdf`&&(e.url||y)?(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`p`,{role:`status`,children:`Loading PDF viewer…`}),children:(0,H.jsx)(U,{url:e.url||y,path:r,root:X,byteLength:e.byteLength||S,range:e.range},e.url||y)}):(s===`audio`||s===`video`)&&(e.url||y)?(0,H.jsx)(I,{kind:s,url:e.url||y,path:r,root:X,mimeType:e.mimeType},e.url||y):l===`code`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,H.jsx)(v,{code:m,language:Z})}):s===`html`?(0,H.jsx)(`div`,{style:{width:d===`mobile`?`375px`:d===`tablet`?`768px`:`100%`,maxWidth:`100%`,height:`100%`,background:`#ffffff`,borderRadius:d===`desktop`?`0px`:`var(--radius-md, 8px)`,overflow:`hidden`,boxShadow:d===`desktop`?`none`:`var(--shadow-md, 0 10px 25px rgba(0,0,0,0.5))`,border:d===`desktop`?`none`:`1px solid var(--border)`,transition:`width 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:(0,H.jsx)(`iframe`,{title:o,src:e.url,srcDoc:e.url?void 0:m,sandbox:e.url?`allow-scripts allow-forms allow-modals allow-same-origin`:`allow-scripts allow-forms allow-modals`,style:{width:`100%`,height:`100%`,border:`none`,background:`#ffffff`}},q)}):s===`image`||s===`svg`&&e.url?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,padding:`24px`,display:`flex`,alignItems:`center`,justifyContent:`center`,overflow:`hidden`},children:(0,H.jsx)(`img`,{ref:e=>{e&&e.complete&&e.naturalWidth&&e.naturalHeight&&K(t=>t?.width===e.naturalWidth&&t?.height===e.naturalHeight?t:{width:e.naturalWidth,height:e.naturalHeight})},draggable:!0,onDragStart:t=>{T(t.dataTransfer,{path:r,root:X,url:g||e?.url})},src:g||e.url,alt:o,style:{width:`100%`,height:`100%`,objectFit:`contain`,cursor:`grab`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth&&t.naturalHeight&&K({width:t.naturalWidth,height:t.naturalHeight})},onError:()=>M(`Unable to load image. Reload the preview or check that the file is still available.`)},q)}):s===`svg`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`24px`,backgroundImage:`linear-gradient(45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(-45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%), linear-gradient(-45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%)`,backgroundSize:`20px 20px`,backgroundPosition:`0 0, 0 10px, 10px -10px, -10px 0px`,overflow:`auto`},children:(0,H.jsx)(`div`,{style:{maxWidth:`90%`,maxHeight:`90%`,display:`flex`,alignItems:`center`,justifyContent:`center`},dangerouslySetInnerHTML:{__html:m}})}):s===`markdown`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`20px 24px`,lineHeight:1.6,color:`var(--text-chat, var(--text-main))`},children:D(m)}):(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,H.jsx)(v,{code:m,language:Z})})})]}):null}var V,H,U,W=t((()=>{V=e(n()),u(),k(),g(),b(),y(),P(),z(),H=r(),C(),S(),m(),U=(0,V.lazy)(()=>h(()=>import(`./WorkspacePdfPreview-Bi8Zzyir.js`),__vite__mapDeps([2,1,3,4,5])))}));C(),W();export{B as ArtifactPreviewPanel,j as n,P as r,F as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-CNOWq4Kh.js";import{n as t,t as n}from"./jsx-runtime-DmUwWVTj.js";import{Hr as r,L as i}from"./index-BocxnrDG.js";function a({data:e}){let t=typeof e.result==`number`?Number.isInteger(e.result)?e.result.toLocaleString():e.result.toLocaleString(void 0,{maximumFractionDigits:6}):String(e.result),n={cardBg:`var(--bg-surface-soft)`,cardText:`var(--text-primary)`,cardBorder:`var(--border-subtle)`,cardShadow:`var(--shadow-md)`,labelColor:`var(--text-muted)`,exprBg:`var(--bg-surface-raised)`,exprBorder:`var(--border-subtle)`,exprText:`var(--text-secondary)`,dividerColor:`var(--text-muted)`,resultBg:`var(--bg-surface-raised)`,resultBorder:`var(--border-default)`,resultText:`var(--text-primary)`};return(0,o.jsxs)(`div`,{style:{background:n.cardBg,color:n.cardText,borderRadius:`var(--radius-xl, 18px)`,padding:`16px 20px`,margin:`12px 0`,boxShadow:n.cardShadow,border:`1px solid ${n.cardBorder}`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[(0,o.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,marginBottom:`12px`},children:[(0,o.jsx)(r,{size:16,strokeWidth:2,style:{opacity:.9,color:n.labelColor}}),(0,o.jsx)(`span`,{style:{fontSize:`11px`,fontWeight:700,letterSpacing:`0.8px`,color:n.labelColor},children:`CALCULATION`})]}),(0,o.jsx)(`div`,{style:{background:n.exprBg,border:`1px solid ${n.exprBorder}`,borderRadius:`var(--radius-sm, 8px)`,padding:`10px 14px`,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,fontSize:`14px`,color:n.exprText,letterSpacing:`0.3px`},children:e.expression}),(0,o.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,margin:`6px 0`,color:n.dividerColor,fontSize:`16px`,fontWeight:`bold`},children:`=`}),(0,o.jsx)(`div`,{style:{background:n.resultBg,border:`1px solid ${n.resultBorder}`,borderRadius:`var(--radius-md, 10px)`,padding:`12px 18px`},children:(0,o.jsx)(`div`,{style:{fontSize:`30px`,fontWeight:800,color:n.resultText,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,letterSpacing:`-0.5px`},children:t})})]})}var o;e((()=>{t(),i(),o=n()}))();export{a 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-header-controls{flex-wrap:wrap;flex:100%;align-items:center;gap:8px;min-width:0;display:flex}.code-header-controls .workspace-selector{max-width:100%}.code-header-controls .workspace-select-btn{min-height:36px}.code-show-all-btn{min-height:36px;margin-bottom:16px}.code-show-all-btn:focus-visible{outline:2px solid var(--interactive-fg,#a1a1aa);outline-offset:2px}.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;border-left:2px solid #0000;grid-template-columns:minmax(140px,200px) 1fr auto;align-items:center;gap:16px;padding:13px 18px;text-decoration:none;transition:background .15s,border-left-color .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:var(--bg-surface-raised,var(--surface-strong));border-left-color:var(--accent)}.code-session-row.is-active:hover{background:var(--bg-surface-hover,var(--surface-strong))}.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:.02em;color:var(--text-secondary,#cbd5e1);background:var(--bg-surface-soft,#ffffff0f);border:1px solid var(--border-default,#ffffff1f);border-radius:var(--radius-xs,4px);align-items:center;gap:5px;padding:2px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.65rem;font-weight:500;line-height:1;display:inline-flex}.code-active-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 6px var(--accent-glow,#10b98166);border-radius:50%;flex-shrink:0;display:inline-block}.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:var(--status-success-fg);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-session-prompt-symbol{color:var(--text-muted,#71717a);opacity:.75;margin-right:5px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-weight:600}.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{background:color-mix(in srgb, var(--bg-surface,#202632) 80%, transparent);border:1px solid var(--border-default,#ffffff1f);border-radius:var(--radius-xs,6px);color:var(--text-secondary,#cbd5e1);cursor:pointer;align-items:center;gap:5px;padding:3px 9px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;font-weight:500;transition:all .15s;display:inline-flex}.code-resume-chip:hover{background:var(--bg-surface-hover);border-color:var(--border-strong);color:var(--text-primary);transform:translateY(-.5px)}.code-icon-btn{color:var(--text-muted,#94a3b8);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-primary);background:var(--bg-surface-hover)}.code-icon-btn.destructive:hover{color:var(--hover-delete);background:var(--hover-delete-bg)}.code-open-arrow{color:var(--text-muted,#94a3b8);align-items:center;transition:transform .15s,color .15s;display:inline-flex}.code-session-row:hover .code-open-arrow{color:var(--text-primary);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{background:var(--bg-surface-subtle);border-bottom:1px solid var(--border,#ffffff0f);align-items:center;gap:6px;padding:10px 14px;display:flex}.code-terminal-dot{background:var(--border-strong);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{background:var(--bg-input);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);color:var(--interactive-fg);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}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{dt as i,ft as a}from"./config-CvIO5hkn.js";import{n as o,t as s}from"./SelectField-DXBQtrUK.js";import{n as c,r as l,t as u}from"./workspaces-SYPrmbgC.js";import{D as d,E as f,T as p,w as m}from"./MintDashboard-COw_xol7.js";var h=t((()=>{}));function g(e){let t=a(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<604800?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function _(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function v(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var y,b,x;t((()=>{o(),y=e(n()),i(),u(),p(),f(),h(),b=r(),x=y.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,recentWorkspacePaths:r,onSelectSession:i,onDeleteSession:o,onRenameSession:u,onSelectFolder:f,onRefreshSessions:p,onShowToast:h}){let[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(`workspace`),[T,E]=(0,y.useState)(`recent`),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(``),[j,M]=(0,y.useState)(()=>c(n));(0,y.useEffect)(()=>{M(c(n))},[n]);let N=j,P=v(N),F=(0,y.useMemo)(()=>l(r||[],j),[r,j]),I=(0,y.useRef)(p);(0,y.useEffect)(()=>{I.current=p},[p]),(0,y.useEffect)(()=>{I.current?.();let e=()=>{I.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let L=(0,y.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),R=L.filter(e=>N&&c(e.workspacePath)===N).length,z=L.length-R,B=C===`workspace`&&!x.trim()&&R===0&&z>0,V=(0,y.useMemo)(()=>L.filter(e=>{if(C===`workspace`&&(!N||c(e.workspacePath)!==N))return!1;if(!x.trim())return!0;let t=x.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(T===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=a(e.updatedAt||e.createdAt).getTime(),r=a(t.updatedAt||t.createdAt).getTime();return T===`oldest`?n-r:r-n}),[L,C,N,x,T]),H=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),h?.(`Copied: ${n}`)):h?.(`Resume command: ${n}`)},U=(e,t)=>{e.stopPropagation(),O(t.id),A(t.title)},W=e=>{if(e&&e.preventDefault(),!D)return;let t=k.trim();t&&(u(D,t),h?.(`Session renamed`)),O(null)},G=(e,t)=>{e.stopPropagation(),o(t.id)};return(0,b.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,b.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,b.jsxs)(`div`,{className:`code-header-main`,children:[(0,b.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,b.jsxs)(`h1`,{className:`code-header-title`,children:[(0,b.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,b.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,b.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,b.jsx)(`span`,{children:`Code sessions`})]}),(0,b.jsxs)(`span`,{className:`code-header-count`,children:[V.length,` `,V.length===1?`session`:`sessions`]})]}),(0,b.jsx)(`p`,{className:`code-header-subtitle`,children:C===`workspace`?N?(0,b.jsxs)(b.Fragment,{children:[`CLI sessions in `,(0,b.jsx)(`strong`,{title:N,children:P}),`.`]}):`Select a project above to view its CLI sessions.`:`CLI sessions across all repositories.`})]}),(0,b.jsxs)(`div`,{className:`code-header-controls`,children:[(0,b.jsx)(m,{currentPath:N,recentPaths:F,placement:`below`,onSelectWorkspace:async e=>{try{let t=e||await f?.();t&&(d.restore(t),M(c(t)),w(`workspace`))}catch(e){h?.(`Could not open folder: ${e instanceof Error?e.message:String(e)}`)}}}),(0,b.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`workspace`?`active`:``}`,onClick:()=>w(`workspace`),title:`Show sessions from the selected project`,children:`Current Project`}),(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`all`?`active`:``}`,onClick:()=>w(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,b.jsxs)(s,{fullWidth:!1,"aria-label":`Sort sessions`,className:`code-sort-select`,value:T,onValueChange:e=>E(e),title:`Sort sessions`,children:[(0,b.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,b.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,b.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),p&&(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:p,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,b.jsx)(`div`,{className:`code-controls-bar`,children:(0,b.jsxs)(`div`,{className:`code-search-box`,children:[(0,b.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,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:x,onChange:e=>S(e.target.value)})]})}),V.length===0?(0,b.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,b.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,b.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,b.jsx)(`p`,{className:`code-terminal-text`,children:x.trim()?`No terminal sessions match your query.`:C===`workspace`?N?`No CLI sessions found in ${P}.${z>0?` ${z} CLI ${z===1?`session`:`sessions`} outside this project.`:` Run Mint in this project directory to begin:`}`:`Select a project above, or switch to "All Repositories" to view your CLI sessions.`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),B&&(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn active code-show-all-btn`,onClick:()=>{S(``),w(`all`)},children:`Show all sessions`}),(0,b.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,b.jsx)(`span`,{children:`$ mint`}),(0,b.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),h?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,b.jsx)(`div`,{className:`code-sessions-list`,children:V.map(e=>{let n=e.id===t,r=v(e.workspacePath),a=D===e.id,o=e.id.replace(/^cli::/,``),s=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,b.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>i(e.id),children:[(0,b.jsxs)(`div`,{className:`code-row-meta`,children:[(0,b.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,b.jsx)(`span`,{className:`code-session-id`,title:e.id,children:s}),n&&(0,b.jsx)(`span`,{className:`code-active-badge`,children:`active`})]}),(0,b.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,b.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,b.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,b.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,b.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,b.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,b.jsx)(`span`,{children:e.gitBranch})]}),(0,b.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:r}),e.mainLanguage&&(0,b.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,b.jsx)(`div`,{className:`code-row-content`,children:a?(0,b.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(`input`,{type:`text`,autoFocus:!0,value:k,onChange:e=>A(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W(),e.key===`Escape`&&O(null)},style:{flex:1,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,color:`var(--text-primary)`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,b.jsx)(`button`,{type:`button`,onClick:W,style:{background:`var(--bg-surface-hover)`,color:`var(--text-primary)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,b.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,b.jsx)(`span`,{style:{color:`var(--interactive-fg)`,opacity:.8,marginRight:`4px`},children:`>`}),(0,b.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,b.jsxs)(`div`,{className:`code-row-actions`,children:[(0,b.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,_(e.totalBytes)]}),(0,b.jsx)(`span`,{className:`code-metric-time`,children:g(e.updatedAt||e.createdAt)}),(0,b.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>H(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,b.jsx)(`span`,{children:`$`}),(0,b.jsx)(`span`,{children:`resume`})]}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>U(t,e),title:`Rename session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.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,b.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,b.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>G(t,e),title:`Delete session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,b.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,b.jsx)(`span`,{className:`code-open-arrow`,children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{x as CliSessionsView,x as default};
|
|
1
|
+
import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{ft as i,pt as a}from"./config-CkRCdkxn.js";import{n as o,t as s}from"./SelectField-Cy6CghrU.js";import{n as c,r as l,t as u}from"./workspaces-SYPrmbgC.js";import{_ as d,g as f,h as p,v as m}from"./MintDashboard-C_UYPoNV.js";var h=t((()=>{}));function g(e){let t=a(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<604800?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function _(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function v(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var y,b,x;t((()=>{o(),y=e(n()),i(),u(),f(),d(),h(),b=r(),x=y.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,recentWorkspacePaths:r,onSelectSession:i,onDeleteSession:o,onRenameSession:u,onSelectFolder:d,onRefreshSessions:f,onShowToast:h}){let[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(`workspace`),[T,E]=(0,y.useState)(`recent`),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(``),[j,M]=(0,y.useState)(()=>c(n));(0,y.useEffect)(()=>{M(c(n))},[n]);let N=j,P=v(N),F=(0,y.useMemo)(()=>l(r||[],j),[r,j]),I=(0,y.useRef)(f);(0,y.useEffect)(()=>{I.current=f},[f]),(0,y.useEffect)(()=>{I.current?.();let e=()=>{I.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let L=(0,y.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),R=L.filter(e=>N&&c(e.workspacePath)===N).length,z=L.length-R,B=C===`workspace`&&!x.trim()&&R===0&&z>0,V=(0,y.useMemo)(()=>L.filter(e=>{if(C===`workspace`&&(!N||c(e.workspacePath)!==N))return!1;if(!x.trim())return!0;let t=x.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(T===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=a(e.updatedAt||e.createdAt).getTime(),r=a(t.updatedAt||t.createdAt).getTime();return T===`oldest`?n-r:r-n}),[L,C,N,x,T]),H=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),h?.(`Copied: ${n}`)):h?.(`Resume command: ${n}`)},U=(e,t)=>{e.stopPropagation(),O(t.id),A(t.title)},W=e=>{if(e&&e.preventDefault(),!D)return;let t=k.trim();t&&(u(D,t),h?.(`Session renamed`)),O(null)},G=(e,t)=>{e.stopPropagation(),o(t.id)};return(0,b.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,b.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,b.jsxs)(`div`,{className:`code-header-main`,children:[(0,b.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,b.jsxs)(`h1`,{className:`code-header-title`,children:[(0,b.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,b.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,b.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,b.jsx)(`span`,{children:`Code sessions`})]}),(0,b.jsxs)(`span`,{className:`code-header-count`,children:[V.length,` `,V.length===1?`session`:`sessions`]})]}),(0,b.jsx)(`p`,{className:`code-header-subtitle`,children:C===`workspace`?N?(0,b.jsxs)(b.Fragment,{children:[`CLI sessions in `,(0,b.jsx)(`strong`,{title:N,children:P}),`.`]}):`Select a project above to view its CLI sessions.`:`CLI sessions across all repositories.`})]}),(0,b.jsxs)(`div`,{className:`code-header-controls`,children:[(0,b.jsx)(p,{currentPath:N,recentPaths:F,placement:`below`,onSelectWorkspace:async e=>{try{let t=e||await d?.();t&&(m.restore(t),M(c(t)),w(`workspace`))}catch(e){h?.(`Could not open folder: ${e instanceof Error?e.message:String(e)}`)}}}),(0,b.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`workspace`?`active`:``}`,onClick:()=>w(`workspace`),title:`Show sessions from the selected project`,children:`Current Project`}),(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`all`?`active`:``}`,onClick:()=>w(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,b.jsxs)(s,{fullWidth:!1,"aria-label":`Sort sessions`,className:`code-sort-select`,value:T,onValueChange:e=>E(e),title:`Sort sessions`,children:[(0,b.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,b.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,b.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),f&&(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:f,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,b.jsx)(`div`,{className:`code-controls-bar`,children:(0,b.jsxs)(`div`,{className:`code-search-box`,children:[(0,b.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,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:x,onChange:e=>S(e.target.value)})]})}),V.length===0?(0,b.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,b.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,b.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,b.jsx)(`p`,{className:`code-terminal-text`,children:x.trim()?`No terminal sessions match your query.`:C===`workspace`?N?`No CLI sessions found in ${P}.${z>0?` ${z} CLI ${z===1?`session`:`sessions`} outside this project.`:` Run Mint in this project directory to begin:`}`:`Select a project above, or switch to "All Repositories" to view your CLI sessions.`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),B&&(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn active code-show-all-btn`,onClick:()=>{S(``),w(`all`)},children:`Show all sessions`}),(0,b.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,b.jsx)(`span`,{children:`$ mint`}),(0,b.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),h?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,b.jsx)(`div`,{className:`code-sessions-list`,children:V.map(e=>{let n=e.id===t,r=v(e.workspacePath),a=D===e.id,o=e.id.replace(/^cli::/,``),s=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,b.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>i(e.id),children:[(0,b.jsxs)(`div`,{className:`code-row-meta`,children:[(0,b.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,b.jsx)(`span`,{className:`code-session-id`,title:e.id,children:s}),n&&(0,b.jsxs)(`span`,{className:`code-active-badge`,children:[(0,b.jsx)(`span`,{className:`code-active-dot`,"aria-hidden":`true`}),(0,b.jsx)(`span`,{children:`active`})]})]}),(0,b.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,b.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,b.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,b.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,b.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,b.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,b.jsx)(`span`,{children:e.gitBranch})]}),(0,b.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:r}),e.mainLanguage&&(0,b.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,b.jsx)(`div`,{className:`code-row-content`,children:a?(0,b.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(`input`,{type:`text`,autoFocus:!0,value:k,onChange:e=>A(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W(),e.key===`Escape`&&O(null)},style:{flex:1,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,color:`var(--text-primary)`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,b.jsx)(`button`,{type:`button`,onClick:W,style:{background:`var(--bg-surface-hover)`,color:`var(--text-primary)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,b.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,b.jsx)(`span`,{className:`code-session-prompt-symbol`,children:`>`}),(0,b.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,b.jsxs)(`div`,{className:`code-row-actions`,children:[(0,b.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,_(e.totalBytes)]}),(0,b.jsx)(`span`,{className:`code-metric-time`,children:g(e.updatedAt||e.createdAt)}),(0,b.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>H(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,b.jsx)(`span`,{children:`$`}),(0,b.jsx)(`span`,{children:`resume`})]}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>U(t,e),title:`Rename session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.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,b.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,b.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>G(t,e),title:`Delete session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,b.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,b.jsx)(`span`,{className:`code-open-arrow`,children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{x as CliSessionsView,x as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.review-tabs{flex-wrap:wrap;gap:6px;padding:8px 16px;display:flex}.review-tabs button,.review-undo-button,.review-undo-actions button{border:1px solid var(--border,#34343a);border-radius:var(--radius-sm,8px);background:var(--bg-surface,#141518);color:var(--text-main,#f1f5f9);cursor:pointer;font:inherit;padding:6px 10px;font-size:.78rem}.review-tabs button[aria-selected=true]{color:var(--accent,#818cf8);border-color:var(--accent,#818cf8)}.review-tabs button:focus-visible,.review-undo-button:focus-visible,.review-undo-actions button:focus-visible{outline:2px solid var(--accent,#818cf8);outline-offset:2px}.review-undo-button:disabled,.review-undo-actions button:disabled{opacity:.5;cursor:not-allowed}.review-changes-panel{flex-direction:column;flex:1;min-height:0;display:flex}.review-history-panel{color:var(--text-main,#f1f5f9);padding:16px;font-size:.82rem;overflow:auto}.review-history-picker{flex-direction:column;gap:8px;display:flex}.review-history-picker select{border:1px solid var(--border,#34343a);border-radius:var(--radius-sm,8px);width:100%;min-width:0;color:var(--text-main,#f1f5f9);background:var(--bg-surface,#141518);padding:8px}.review-history-details{grid-template-columns:auto minmax(0,1fr);gap:10px 14px;display:grid}.review-history-details dt{color:var(--text-muted,#94a3b8)}.review-history-details dd{overflow-wrap:anywhere;margin:0}.review-feedback{overflow-wrap:anywhere;color:var(--text-main,#f1f5f9);margin:4px 16px;font-size:.8rem}.review-undo-dialog{border:1px solid var(--border,#34343a);border-radius:var(--radius-2xl,22px);background:var(--bg-surface,#141518);width:min(480px,100vw - 40px);max-height:calc(100vh - 40px);color:var(--text-main,#f1f5f9);padding:20px;font-size:.85rem;overflow:auto}.review-undo-dialog::backdrop{background:#00000080}.review-undo-dialog h3{margin-top:0}.review-undo-actions{justify-content:flex-end;gap:8px;display:flex}.code-review-file-bar{flex-wrap:wrap}.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;border-radius:var(--radius-2xs,4px);background:0 0;border:0;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:var(--bg-surface-hover)}.code-review-chevron-small{color:var(--text-muted,#94a3b8);font-size:.8rem}.code-review-branch-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-branch-stat-del{color:var(--status-error,#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{border-radius:var(--radius-xs,6px);width:28px;height:28px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;transition:all .15s;display:inline-flex}.code-review-icon-btn:hover,.code-review-close-btn:hover{color:var(--text-main,#f1f5f9);background:var(--bg-surface-hover)}.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;border-radius:var(--radius-2xs,4px);background:0 0;border:0;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:var(--bg-surface-soft)}.code-review-banner{border-radius:var(--radius-md,10px);background:var(--bg-surface-soft);border:1px solid var(--border-subtle);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:var(--text-secondary,#cbd5e1);align-items:center;gap:8px;font-size:.78rem;font-weight:500;display:flex}.code-review-banner-info-icon{color:var(--interactive-fg);flex-shrink:0}.code-review-pagination{align-items:center;gap:6px;display:flex}.code-review-page-arrow{background:var(--bg-surface-soft);border:1px solid var(--border-subtle);border-radius:var(--radius-xs,6px);width:24px;height:24px;color:var(--text-muted,#94a3b8);cursor:pointer;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){background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-page-arrow:disabled{opacity:.3;cursor:not-allowed}.code-review-split{border-top:1px solid var(--border-subtle);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:var(--border-subtle);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:var(--accent);box-shadow:0 0 8px var(--accent-glow);width:2px}.code-review-resizer-handle{border-radius:var(--radius-2xs,4px);background:var(--border-strong);z-index:2;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:var(--accent-hover);height:38px;box-shadow:0 0 6px var(--accent-glow)}.code-review-resizer.is-collapsed{cursor:pointer;flex:0 0 8px;margin:0}.code-review-resizer.is-collapsed .code-review-resizer-line{background:var(--border-default);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{background:var(--bg-surface-soft);border-bottom:1px solid var(--border-subtle);z-index:2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);align-items:center;gap:8px;padding:8px 16px;font-size:.78rem;display:flex;position:sticky;top:0}[data-surface=opaque] .code-review-file-bar{background:var(--bg-surface,#141518);-webkit-backdrop-filter:none}.code-review-file-bar-status{border-radius:var(--radius-2xs,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:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-bar-status.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.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-path[draggable=true]{cursor:grab;-webkit-user-select:none;user-select:none;transition:color .15s}.code-review-file-bar-path[draggable=true]:hover{color:var(--accent,#38bdf8)}.code-review-file-bar-path[draggable=true]:active{cursor:grabbing}.code-review-file-bar-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-file-bar-stat-del{color:var(--status-error,#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:color-mix(in srgb, var(--status-success,#2ea043) 20%, #0d1117);border-left:2px solid var(--diff-add-border,#10b981)}.code-review-line.is-del{background:color-mix(in srgb, var(--status-error,#f85149) 20%, #0d1117);border-left:2px solid var(--diff-del-border,#ef4444)}:root[data-theme=light] .code-review-line.is-add,.theme-light .code-review-line.is-add{background:color-mix(in srgb, var(--status-success,#22c55e) 14%, #fff)}:root[data-theme=light] .code-review-line.is-del,.theme-light .code-review-line.is-del{background:color-mix(in srgb, var(--status-error,#ef4444) 14%, #fff)}.code-review-gutter{text-align:right;width:38px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;opacity:.7;flex-shrink:0;padding-right:12px}.code-review-line.is-add .code-review-gutter{color:var(--diff-add-gutter,#34d399)}.code-review-line.is-del .code-review-gutter{color:var(--diff-del-gutter,#f87171)}.code-review-sign{text-align:center;width:14px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;flex-shrink:0;font-weight:600}.code-review-line.is-add .code-review-sign{color:var(--diff-add-border,#10b981)}.code-review-line.is-del .code-review-sign{color:var(--diff-del-border,#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-empty-diff,.code-review-empty-state{color:var(--text-muted,#94a3b8);padding:24px;font-size:.8rem}.code-review-tree-pane{border-left:1px solid var(--border-subtle);background:var(--bg-surface-soft);flex-direction:column;flex:none;min-width:0;display:flex;overflow:hidden}[data-surface=opaque] .code-review-tree-pane{background:var(--bg-surface-raised,var(--bg-surface,#141518))}.code-review-tree-collapse-btn{border-radius:var(--radius-2xs,4px);width:22px;height:22px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;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{background:var(--bg-surface-hover);color:var(--text-main,#f1f5f9)}.code-review-icon-btn.is-active{color:var(--interactive-fg);background:var(--accent-subtle)}.code-review-search-wrap{border-bottom:1px solid var(--border-subtle);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{background:var(--bg-input);border:1px solid var(--border-default);border-radius:var(--radius-sm,8px);width:100%;color:var(--text-main,#f1f5f9);outline:none;padding:5px 10px;font-size:.76rem;transition:border-color .15s,background .15s}.code-review-search-input:focus{border-color:var(--accent-border);background:var(--bg-surface-hover)}.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{border-radius:var(--radius-xs,6px);width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:6px;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{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-tree-folder-btn[draggable=true],.code-review-tree-file[draggable=true]{cursor:grab;-webkit-user-select:none;user-select:none}.code-review-tree-folder-btn[draggable=true]:active,.code-review-tree-file[draggable=true]:active{cursor:grabbing}.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:var(--status-warning);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{border-radius:var(--radius-sm,8px);width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;align-items:center;gap:6px;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{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-tree-file.is-selected{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--text-primary);box-shadow:var(--shadow-sm)}.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:var(--radius-2xs,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:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-status-icon.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.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{background:var(--bg-surface-soft);border:1px solid var(--border-default);border-radius:var(--radius-xs,6px);color:var(--text-main,#f1f5f9);cursor:pointer;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:var(--bg-surface-hover);border-color:var(--border-strong)}.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(--interactive-fg);flex-shrink:0}.code-review-branch-group .git-branch-dirty{background:var(--accent,#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{background:var(--bg-surface-soft);border:1px solid var(--border-default);border-radius:var(--radius-sm,8px);color:var(--text-secondary,#cbd5e1);cursor:pointer;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{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-scope-group{align-items:center;gap:4px;display:flex}.code-review-scope-btn{border-radius:var(--radius-xs,6px);background:var(--bg-surface-soft);border:1px solid var(--border-subtle);color:var(--text-muted,#94a3b8);cursor:pointer;padding:3px 8px;font-size:.74rem;transition:all .15s}.code-review-scope-btn:hover{color:var(--text-primary);background:var(--bg-surface-hover)}.code-review-scope-btn.is-active{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--interactive-fg);font-weight:600}
|