@pheem49/mint 1.16.0 → 1.17.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 +1 -1
- package/README.md +1 -1
- package/Release_Note.md +71 -72
- package/apps/mint-companion/src-tauri/src/compact.rs +69 -0
- package/apps/mint-companion/src-tauri/src/main.rs +218 -11
- package/apps/mint-companion/vite.config.ts +2 -1
- package/crates/mint-cli/src/agent/live_status.rs +43 -2
- package/crates/mint-cli/src/agent.rs +178 -38
- package/crates/mint-cli/src/commands/agent.rs +225 -31
- package/crates/mint-cli/src/commands/browser.rs +127 -0
- package/crates/mint-cli/src/commands/config.rs +14 -1
- package/crates/mint-cli/src/commands/knowledge.rs +16 -2
- package/crates/mint-cli/src/commands/mod.rs +15 -1
- package/crates/mint-cli/src/commands/tailnet_web.rs +2 -7
- package/crates/mint-cli/src/companion_navigation.rs +268 -0
- package/crates/mint-cli/src/interactive/chat_tui.rs +1065 -63
- package/crates/mint-cli/src/interactive/command_ui.rs +39 -0
- package/crates/mint-cli/src/interactive/slash_commands.rs +114 -6
- package/crates/mint-cli/src/interactive/tool_activity.rs +375 -36
- package/crates/mint-cli/src/interactive.rs +37 -5
- package/crates/mint-cli/src/main.rs +23 -2
- package/crates/mint-cli/src/onboard.rs +3494 -1336
- package/crates/mint-cli/tests/mods_testing.rs +5 -1
- package/crates/mint-companion-protocol/src/lib.rs +113 -0
- package/crates/mint-core/src/agent/chat.rs +240 -1
- package/crates/mint-core/src/agent/memory.rs +73 -6
- package/crates/mint-core/src/agent/safety.rs +56 -4
- package/crates/mint-core/src/agent/skill_inventory.rs +3 -1
- package/crates/mint-core/src/agent/skills.rs +1 -0
- package/crates/mint-core/src/api_server/routes/auth.rs +1 -4
- package/crates/mint-core/src/api_server/routes/chat.rs +29 -15
- package/crates/mint-core/src/api_server/routes/misc.rs +116 -0
- package/crates/mint-core/src/api_server/routes/profile_oauth.rs +43 -26
- package/crates/mint-core/src/api_server/routes/sessions.rs +93 -76
- package/crates/mint-core/src/api_server/routes/skills_subagents.rs +11 -7
- package/crates/mint-core/src/api_server/routes/status_health.rs +18 -8
- package/crates/mint-core/src/api_server.rs +211 -65
- package/crates/mint-core/src/avatar_bridge.rs +5 -2
- package/crates/mint-core/src/browser/cdp.rs +82 -26
- package/crates/mint-core/src/browser/lifecycle.rs +143 -43
- package/crates/mint-core/src/browser/mod.rs +5 -4
- package/crates/mint-core/src/browser/navigate.rs +82 -9
- package/crates/mint-core/src/browser/runtime.rs +284 -0
- package/crates/mint-core/src/browser/session.rs +263 -7
- package/crates/mint-core/src/browser/workflow.rs +386 -0
- package/crates/mint-core/src/companion/navigation.rs +115 -0
- package/crates/mint-core/src/companion.rs +109 -1
- package/crates/mint-core/src/integrations/mcp_result.rs +45 -0
- package/crates/mint-core/src/lib.rs +10 -6
- package/crates/mint-core/src/media/image_proxy.rs +563 -0
- package/crates/mint-core/src/media/tool_images.rs +196 -0
- package/crates/mint-core/src/media/tts/playback.rs +609 -0
- package/crates/mint-core/src/media/tts.rs +1 -0
- package/crates/mint-core/src/media.rs +2 -0
- package/crates/mint-core/src/orchestration/context_render.rs +450 -33
- package/crates/mint-core/src/orchestration/decision_parsing.rs +5 -23
- package/crates/mint-core/src/orchestration/diagnostics.rs +307 -0
- package/crates/mint-core/src/orchestration/image_regressions.rs +379 -0
- package/crates/mint-core/src/orchestration/loop_guard.rs +334 -0
- package/crates/mint-core/src/orchestration/mod.rs +1104 -560
- package/crates/mint-core/src/orchestration/reliability.rs +541 -0
- package/crates/mint-core/src/orchestration/repeated_failures.rs +8 -0
- package/crates/mint-core/src/orchestration/review_regressions.rs +174 -28
- package/crates/mint-core/src/orchestration/tools/files.rs +31 -3
- package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +19 -4
- package/crates/mint-core/src/orchestration/tools/project.rs +1 -1
- package/crates/mint-core/src/orchestration/tools/shell.rs +29 -5
- package/crates/mint-core/src/orchestration/tools/web.rs +5 -1
- package/crates/mint-core/src/orchestration/trajectory_schema.rs +353 -0
- package/crates/mint-core/src/orchestration/truncation.rs +211 -0
- package/crates/mint-core/src/orchestration/verification.rs +36 -6
- package/crates/mint-core/src/orchestration/workspace_helpers.rs +54 -23
- package/crates/mint-core/src/prompts/agent.rs +31 -40
- package/crates/mint-core/src/prompts/tool_catalog.rs +134 -40
- package/crates/mint-core/src/search/web_search.rs +44 -3
- package/crates/mint-core/src/slash/mod.rs +464 -1
- package/crates/mint-core/src/swarm/batch.rs +643 -0
- package/crates/mint-core/src/swarm/dossier.rs +152 -0
- package/crates/mint-core/src/swarm/labels.rs +100 -0
- package/crates/mint-core/src/swarm/mod.rs +158 -0
- package/crates/mint-core/src/swarm/permissions.rs +167 -0
- package/crates/mint-core/src/system/auth.rs +156 -7
- package/crates/mint-core/src/system/bg_shell.rs +77 -9
- package/crates/mint-core/src/system/config.rs +92 -3
- package/crates/mint-core/src/system/mint_web.rs +33 -12
- package/crates/mint-core/src/system/shell.rs +179 -10
- package/crates/mint-core/src/system/workspace.rs +204 -0
- package/crates/mint-core/tests/background_retention.rs +1 -1
- package/crates/mint-core/tests/memory_persistence.rs +27 -0
- package/out/web/assets/ArtifactPreviewPanel-DAT_Y7i0.css +1 -0
- package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +2 -0
- package/out/web/assets/CalculationCard-CRjP3E1j.js +1 -0
- package/out/web/assets/{CliSessionsView-CtzUJpK_.css → CliSessionsView-C3Br2v5Y.css} +1 -1
- package/out/web/assets/CliSessionsView-MI8kXMAb.js +1 -0
- package/out/web/assets/CodeReviewPage-CUJceQme.css +1 -0
- package/out/web/assets/CodeReviewPage-VCUgPla_.js +2 -0
- package/out/web/assets/CommandPalette-BD8SlTE5.js +1 -0
- package/out/web/assets/ImageGenCard-BCXxkVJX.js +1 -0
- package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +1 -0
- package/out/web/assets/ImageStudioPanel-BP7N4rLr.js +1 -0
- package/out/web/assets/LibraryPage-WlviRdR8.js +2 -0
- package/out/web/assets/LinkedFoldersView-CKRgroWK.js +1 -0
- package/out/web/assets/McpRegistryPicker-CoS83vtc.js +1 -0
- package/out/web/assets/McpServersView-D3wHnuHg.js +1 -0
- package/out/web/assets/MermaidCard-NqrHdyJW.js +2 -0
- package/out/web/assets/MintDashboard-B2DJsDDO.css +1 -0
- package/out/web/assets/MintDashboard-COw_xol7.js +63 -0
- package/out/web/assets/PluginsView-jBYmcKh4.js +1 -0
- package/out/web/assets/RewindModal-DempuDod.js +1 -0
- package/out/web/assets/ScheduledTasksView-5uw9-V9H.js +1 -0
- package/out/web/assets/SelectField-DXBQtrUK.js +1 -0
- package/out/web/assets/SelectField-lFEkkWCU.css +1 -0
- package/out/web/assets/SettingsWindow-2YP3yj7s.js +4 -0
- package/out/web/assets/SettingsWindow-Dz8LQVgD.css +1 -0
- package/out/web/assets/SkillsView-C-gp9J7m.js +2 -0
- package/out/web/assets/StockCard-BDMCe7mx.js +1 -0
- package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +38 -0
- package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +1 -0
- package/out/web/assets/UiFeatureCard-6BwxTOCe.js +1 -0
- package/out/web/assets/UiGridCard-DvZcLNxb.js +1 -0
- package/out/web/assets/UiMockupWidget-DD73QWg1.js +1 -0
- package/out/web/assets/VeoStudioPanel-DfsOJKv0.js +4 -0
- package/out/web/assets/WeatherCard-CPucIfq8.js +1 -0
- package/out/web/assets/WorkspacePanel-BfHKkulU.js +1 -0
- package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +2 -0
- package/out/web/assets/abnfDiagram-VCTEODGH-BOo3Ckng.js +1 -0
- package/out/web/assets/architecture-7GRP2DOG-ZOwheW3n.js +1 -0
- package/out/web/assets/architectureDiagram-5GKGNRK7-DC2FDzVd.js +36 -0
- package/out/web/assets/{blockDiagram-NRAW4CY4-BrrqzHW5.js → blockDiagram-I7D4REHJ-BrKFWdAH.js} +4 -4
- package/out/web/assets/c4Diagram-7LVT6UL2-BHTHK1Yd.js +38 -0
- package/out/web/assets/chunk-2Q5K7J3B-D2JLPQzF.js +1 -0
- package/out/web/assets/{chunk-TEH6E4GO-G4Cdlyrt.js → chunk-4HAMMTFA-BYFkZwNj.js} +3 -3
- package/out/web/assets/{chunk-5VM5RSS4-BiPuE0io.js → chunk-5VM5RSS4-BZ2oBPYQ.js} +1 -1
- package/out/web/assets/chunk-75Z2AOVW-BSKfSKSA.js +2 -0
- package/out/web/assets/chunk-DU6HZSFF-vIhsiW6n.js +128 -0
- package/out/web/assets/chunk-F27PBJKO-BlYpW9xq.js +1 -0
- package/out/web/assets/chunk-FOHPRMQF-JXEeeJ9r.js +161 -0
- package/out/web/assets/{chunk-GMAD6QVW-BuhEcgHq.js → chunk-GMAD6QVW-BIBz_Ug5.js} +12 -12
- package/out/web/assets/chunk-GVQU2GXP-NPSHxeqC.js +1 -0
- package/out/web/assets/chunk-IMKFNOWR-YlJK8_Fp.js +231 -0
- package/out/web/assets/chunk-JWPE2WC7-BeEMUFDw.js +1 -0
- package/out/web/assets/chunk-L3NEJ4N5-DMYi4-af.js +1 -0
- package/out/web/assets/chunk-OSK3NFVY-Begd3-jA.js +10 -0
- package/out/web/assets/chunk-P2QGCYS3-D1I4xFHN.js +1 -0
- package/out/web/assets/chunk-POPQ4Y6H-CafZZzNE.js +1 -0
- package/out/web/assets/chunk-PWAF6VOD-Dwh6_Lnt.js +1 -0
- package/out/web/assets/chunk-SHT3W25Y-B0XrCSEb.js +168 -0
- package/out/web/assets/{chunk-SVP7TREG-Bu_yYb-V.js → chunk-SVP7TREG-CxLsddxC.js} +1 -1
- package/out/web/assets/{chunk-LCL6LL3I-BhXV9zyH.js → chunk-TICWLB2K-y156QInb.js} +4 -4
- package/out/web/assets/chunk-XXDRQBXY-B9YlhOkE.js +1 -0
- package/out/web/assets/chunk-Y2CYZVJY-BxCWjNVG.js +1 -0
- package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +1 -0
- package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +1 -0
- package/out/web/assets/config-CvIO5hkn.js +2 -0
- package/out/web/assets/config-DqXJXeZM.css +1 -0
- package/out/web/assets/core-Mi3s5D4_.js +1 -0
- package/out/web/assets/cose-bilkent-JH36ORCC-qlna31ty.js +1 -0
- package/out/web/assets/cynefin-OW5HDTMX-SMVvrLf-.js +1 -0
- package/out/web/assets/cynefinDiagram-5FMLGOSQ-rZznN24T.js +62 -0
- package/out/web/assets/cytoscape.esm-DWtAUG0r.js +321 -0
- package/out/web/assets/dagre-CnWJJM5f.js +1 -0
- package/out/web/assets/dagre-GXQ25YYZ-BOToydFu.js +4 -0
- package/out/web/assets/diagram-S7CK7UJ4-TMVaGQEJ.js +30 -0
- package/out/web/assets/diagram-UQ7AKVKN-C2JK-GP2.js +41 -0
- package/out/web/assets/{diagram-VSXAHHWV-BJ86Ov2Y.js → diagram-VSXAHHWV-Cw8VSi2K.js} +1 -1
- package/out/web/assets/diagram-VX7I27RA-DXp4fKk9.js +24 -0
- package/out/web/assets/diagram-Z3DM3KII-CzSicYiW.js +24 -0
- package/out/web/assets/dist-9ISJ7r-g.js +1 -0
- package/out/web/assets/dist-js-BV3mI7uw.js +1 -0
- package/out/web/assets/ebnfDiagram-PWID7BFC-Dqj-zqPu.js +1 -0
- package/out/web/assets/{erDiagram-SSCWMZ5O-CzzmnZWT.js → erDiagram-RLTQ6QDP-DZwFZAuD.js} +3 -3
- package/out/web/assets/event-D7D-EBy9.js +1 -0
- package/out/web/assets/eventmodeling-NTZA5JFV-C0O-Lvgp.js +1 -0
- package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +1 -0
- package/out/web/assets/ganttDiagram-EL5Y4UJY-Da4ULXTl.js +292 -0
- package/out/web/assets/gitGraph-4MIJSDKK-B9wNFZIP.js +1 -0
- package/out/web/assets/gitGraphDiagram-WWUBYQGX-RjrhB0MP.js +106 -0
- package/out/web/assets/graphlib-Bh9gHply.js +1 -0
- package/out/web/assets/index-BmpulIkg.js +168 -0
- package/out/web/assets/index-CkvBwhX_.css +1 -0
- package/out/web/assets/info-A6RAGUB7-B3dfCpeY.js +1 -0
- package/out/web/assets/infoDiagram-27XIBGKW-QVWkLVx7.js +2 -0
- package/out/web/assets/{ishikawaDiagram-5VMMS53U-s38yo28y.js → ishikawaDiagram-5VMMS53U-CLFNIRI9.js} +4 -4
- package/out/web/assets/journeyDiagram-3NMN7TZE-fgOQadYF.js +139 -0
- package/out/web/assets/jsx-runtime-DmUwWVTj.js +1 -0
- package/out/web/assets/{kanban-definition-3QL26DDD-DodjgySL.js → kanban-definition-UXKFOSKX-G3Q_9g9O.js} +6 -6
- package/out/web/assets/katex-MCdQaEAD.js +257 -0
- package/out/web/assets/mermaid-parser.core-v3Jm7nco.js +7 -0
- package/out/web/assets/mermaid.core-DTEjLUA1.js +44 -0
- package/out/web/assets/{mindmap-definition-FBJOCRG2-260WBDxZ.js → mindmap-definition-YA3MSWOX-C_D42_fF.js} +4 -4
- package/out/web/assets/modelManager-BPLycQrN.js +2 -0
- package/out/web/assets/oauthManager-BUK7ic7q.js +1 -0
- package/out/web/assets/packet-AYTQ26CC-B-R-SHlF.js +1 -0
- package/out/web/assets/pdf-Bcahc2yC.js +56 -0
- package/out/web/assets/pdf.worker.min-Dkey6ZUl.mjs +27 -0
- package/out/web/assets/pegDiagram-XKGWAZYB-Da2q_giz.js +1 -0
- package/out/web/assets/pie-WAS4IAKB-BC8F0N7-.js +1 -0
- package/out/web/assets/pieDiagram-E7YTZNPT-Iy9REJNC.js +39 -0
- package/out/web/assets/{quadrantDiagram-AXDQQJYC-B8D3gU5d.js → quadrantDiagram-AXDQQJYC-ztsiYw7h.js} +4 -4
- package/out/web/assets/radar-RG4KPBEZ-B_1P8Z_z.js +1 -0
- package/out/web/assets/railroad-74A4TZTK-DuTqczSo.js +1 -0
- package/out/web/assets/railroad-abnf-HS5TGJTU-Df29WLmp.js +1 -0
- package/out/web/assets/railroad-ebnf-LZEXJU2U-ePFMo-qp.js +1 -0
- package/out/web/assets/railroad-peg-WCYAUIDC-DYXLW4_E.js +1 -0
- package/out/web/assets/railroadDiagram-O6MQD6OU-LStnZf2S.js +1 -0
- package/out/web/assets/{requirementDiagram-EFPCY7ZU-D2X-Ewik.js → requirementDiagram-BXWQKSXE-DmzonMH-.js} +3 -3
- package/out/web/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
- package/out/web/assets/rough.esm-CNnFptCR.js +1 -0
- package/out/web/assets/sankeyDiagram-P5KCCOFB-B8vjmUU1.js +40 -0
- package/out/web/assets/sequenceDiagram-WJ2MYXX4-CTnplOAX.js +162 -0
- package/out/web/assets/sizeCapture-INFHLROL-C8Q8DbV5.js +1 -0
- package/out/web/assets/src-CRDfRlHM.js +1 -0
- package/out/web/assets/stateDiagram-D77RDMKH-BFrIaLdI.js +1 -0
- package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +1 -0
- package/out/web/assets/studio-BBZQ_-QK.js +1 -0
- package/out/web/assets/swimlanes-42K2YHIH-BXGngUNU.js +1 -0
- package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +8 -0
- package/out/web/assets/timeline-definition-24CTP7MA-CegH7n43.js +120 -0
- package/out/web/assets/treeView-Q6P3EWNA-DTpJv2Tw.js +1 -0
- package/out/web/assets/treemap-WGGIJYW6-i8M9iJU6.js +1 -0
- package/out/web/assets/vennDiagram-4TSXK5OY-Dpzo1S8U.js +34 -0
- package/out/web/assets/wardley-WFR3VGLG-BrNsgtfw.js +1 -0
- package/out/web/assets/{wardleyDiagram-VM6X3IG4-DAdXELbQ.js → wardleyDiagram-VM6X3IG4-lQ92LFE1.js} +35 -35
- package/out/web/assets/window-CkUOP7t0.js +1 -0
- package/out/web/assets/workspaces-SYPrmbgC.js +1 -0
- package/out/web/assets/{xychartDiagram-S5SC5T6Z-IZIXf3Vo.js → xychartDiagram-S5SC5T6Z-BaOaEoBd.js} +4 -4
- package/out/web/index-web.html +4 -4
- package/out/web/index.html +4 -4
- package/out/web/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/out/web/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/out/web/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/out/web/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/out/web/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/out/web/pdfjs/cmaps/LICENSE +36 -0
- package/out/web/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/Roman.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/out/web/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/V.bcmap +0 -0
- package/out/web/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/out/web/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/out/web/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
- package/out/web/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/out/web/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/out/web/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/out/web/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/out/web/pdfjs/wasm/LICENSE_JBIG2 +196 -0
- package/out/web/pdfjs/wasm/LICENSE_OPENJPEG +39 -0
- package/out/web/pdfjs/wasm/LICENSE_PDFJS_JBIG2 +13 -0
- package/out/web/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
- package/out/web/pdfjs/wasm/LICENSE_PDFJS_QCMS +19 -0
- package/out/web/pdfjs/wasm/LICENSE_QCMS +21 -0
- package/out/web/pdfjs/wasm/jbig2.wasm +0 -0
- package/out/web/pdfjs/wasm/jbig2_nowasm_fallback.js +15 -0
- package/out/web/pdfjs/wasm/openjpeg.wasm +0 -0
- package/out/web/pdfjs/wasm/openjpeg_nowasm_fallback.js +17 -0
- package/out/web/pdfjs/wasm/qcms_bg.wasm +0 -0
- package/out/web/pdfjs/wasm/quickjs-eval.js +16 -0
- package/out/web/pdfjs/wasm/quickjs-eval.wasm +0 -0
- package/package.json +6 -4
- package/slash-commands.json +8 -2
- package/src/bin/index.js +4 -1
- package/src/bin/pdfjs-assets.mjs +31 -0
- package/src/renderer/node_modules/.vite/vitest/CACHEDIR.TAG +3 -0
- package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/src/renderer/shared/agentProgress.ts +11 -2
- package/src/renderer/shared/components/Settings/AgentsTab.tsx +70 -6
- package/src/renderer/shared/components/Settings/AudioTab.tsx +1 -1
- package/src/renderer/shared/components/Settings/AutomationTab.tsx +57 -0
- package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +18 -12
- package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.test.tsx +65 -0
- package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.tsx +456 -0
- package/src/renderer/shared/components/Settings/GeneralTab.tsx +40 -82
- package/src/renderer/shared/components/Settings/PluginsTab.tsx +101 -24
- package/src/renderer/shared/components/Settings/ProfileTab.tsx +1 -1
- package/src/renderer/shared/components/Settings/SettingsWindow.tsx +796 -0
- package/src/renderer/shared/components/Settings/ThemeTab.tsx +13 -1
- package/src/renderer/shared/components/{AgentActivityDrawer.tsx → activity/AgentActivityDrawer.tsx} +77 -61
- package/src/renderer/shared/components/{AgentActivityTable.tsx → activity/AgentActivityTable.tsx} +46 -7
- package/src/renderer/shared/components/{McpToolResults.tsx → activity/McpToolResults.tsx} +32 -13
- package/src/renderer/shared/components/{PlanChecklistWidget.tsx → activity/PlanChecklistWidget.tsx} +2 -2
- package/src/renderer/shared/components/activity/RunSummaryDashboard.test.tsx +127 -0
- package/src/renderer/shared/components/activity/RunSummaryDashboard.tsx +222 -0
- package/src/renderer/shared/components/activity/SubagentDagView.test.ts +123 -0
- package/src/renderer/shared/components/{SubagentDagView.tsx → activity/SubagentDagView.tsx} +97 -43
- package/src/renderer/shared/components/activity/SubagentStatusStrip.test.tsx +82 -0
- package/src/renderer/shared/components/activity/SubagentStatusStrip.tsx +107 -0
- package/src/renderer/shared/components/activity/ViewedImages.tsx +140 -0
- package/src/renderer/shared/components/{AuthGate.tsx → app/AuthGate.tsx} +3 -3
- package/src/renderer/shared/components/{ChunkErrorBoundary.tsx → app/ChunkErrorBoundary.tsx} +10 -10
- package/src/renderer/shared/components/{CommandPalette.tsx → app/CommandPalette.tsx} +25 -25
- package/src/renderer/shared/components/{DashboardSidebar.tsx → app/DashboardSidebar.tsx} +7 -5
- package/src/renderer/shared/components/{DesktopTitlebar.tsx → app/DesktopTitlebar.tsx} +7 -24
- package/src/renderer/shared/components/{ErrorNotice.tsx → app/ErrorNotice.tsx} +1 -1
- package/src/renderer/shared/components/{MintDashboard.tsx → app/MintDashboard.tsx} +191 -212
- package/src/renderer/shared/components/{ModalErrorBoundary.tsx → app/ModalErrorBoundary.tsx} +5 -5
- package/src/renderer/shared/components/{CalculationCard.tsx → cards/CalculationCard.tsx} +13 -27
- package/src/renderer/shared/components/{ImageGenCard.tsx → cards/ImageGenCard.tsx} +9 -22
- package/src/renderer/shared/components/{ImageSearchCard.tsx → cards/ImageSearchCard.tsx} +9 -22
- package/src/renderer/shared/components/{MermaidCard.tsx → cards/MermaidCard.tsx} +37 -21
- package/src/renderer/shared/components/{StockCard.tsx → cards/StockCard.tsx} +15 -31
- package/src/renderer/shared/components/cards/ToolResultCards.tsx +86 -0
- package/src/renderer/shared/components/{UiFeatureCard.tsx → cards/UiFeatureCard.tsx} +6 -6
- package/src/renderer/shared/components/{UiGridCard.tsx → cards/UiGridCard.tsx} +3 -3
- package/src/renderer/shared/components/{WeatherCard.tsx → cards/WeatherCard.tsx} +1 -1
- package/src/renderer/shared/components/{ApprovalCard.test.tsx → chat/ApprovalCard.test.tsx} +1 -1
- package/src/renderer/shared/components/{ApprovalCard.tsx → chat/ApprovalCard.tsx} +5 -5
- package/src/renderer/shared/components/{ChatCodeBlock.tsx → chat/ChatCodeBlock.tsx} +1 -1
- package/src/renderer/shared/components/{ChatMessageItem.test.tsx → chat/ChatMessageItem.test.tsx} +92 -15
- package/src/renderer/shared/components/{ChatMessageItem.tsx → chat/ChatMessageItem.tsx} +73 -157
- package/src/renderer/shared/components/chat/ChatPanel.test.tsx +31 -0
- package/src/renderer/shared/components/{ChatPanel.tsx → chat/ChatPanel.tsx} +244 -493
- package/src/renderer/shared/components/{CollapsiblePasteInput.tsx → chat/CollapsiblePasteInput.tsx} +2 -2
- package/src/renderer/shared/components/{DiffReviewModal.tsx → chat/DiffReviewModal.tsx} +40 -40
- package/src/renderer/shared/components/{GeminiLiveOverlay.tsx → chat/GeminiLiveOverlay.tsx} +2 -2
- package/src/renderer/shared/components/{ModelSelectorPopover.tsx → chat/ModelSelectorPopover.tsx} +3 -3
- package/src/renderer/shared/components/chat/QueuedMessagesBanner.test.tsx +89 -0
- package/src/renderer/shared/components/chat/QueuedMessagesBanner.tsx +201 -0
- package/src/renderer/shared/components/{RewindModal.tsx → chat/RewindModal.tsx} +4 -4
- package/src/renderer/shared/components/{SlashChoicePanel.tsx → chat/SlashChoicePanel.tsx} +2 -2
- package/src/renderer/shared/components/{SlashSuggestions.tsx → chat/SlashSuggestions.tsx} +4 -4
- package/src/renderer/shared/components/{SourcesBlock.tsx → chat/SourcesBlock.tsx} +30 -37
- package/src/renderer/shared/components/{ThinkingBlock.tsx → chat/ThinkingBlock.tsx} +1 -1
- package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +86 -0
- package/src/renderer/shared/components/chat/TurnFileChanges.tsx +430 -0
- package/src/renderer/shared/components/{VoicePill.css → chat/VoicePill.css} +1 -1
- package/src/renderer/shared/components/{VoicePill.jsx → chat/VoicePill.jsx} +3 -2
- package/src/renderer/shared/components/{CliSessionsView.test.tsx → extensions/CliSessionsView.test.tsx} +2 -2
- package/src/renderer/shared/components/{CliSessionsView.tsx → extensions/CliSessionsView.tsx} +14 -12
- package/src/renderer/shared/components/{LinkedFoldersView.tsx → extensions/LinkedFoldersView.tsx} +3 -3
- package/src/renderer/shared/components/{McpRegistryPicker.tsx → extensions/McpRegistryPicker.tsx} +3 -3
- package/src/renderer/shared/components/{McpServersView.tsx → extensions/McpServersView.tsx} +105 -36
- package/src/renderer/shared/components/{McpToolAllowlist.tsx → extensions/McpToolAllowlist.tsx} +2 -2
- package/src/renderer/shared/components/{ModUi.test.tsx → extensions/ModUi.test.tsx} +9 -4
- package/src/renderer/shared/components/{ModsPanel.tsx → extensions/ModsPanel.tsx} +59 -7
- package/src/renderer/shared/components/{PluginsView.tsx → extensions/PluginsView.tsx} +6 -6
- package/src/renderer/shared/components/{ScheduledTasksView.tsx → extensions/ScheduledTasksView.tsx} +5 -5
- package/src/renderer/shared/components/extensions/SkillsView.test.tsx +31 -0
- package/src/renderer/shared/components/{SkillsView.tsx → extensions/SkillsView.tsx} +20 -4
- package/src/renderer/shared/components/{ImageStudioPanel.tsx → studio/ImageStudioPanel.tsx} +6 -6
- package/src/renderer/shared/components/{LibraryItemCard.tsx → studio/LibraryItemCard.tsx} +2 -2
- package/src/renderer/shared/components/{LibraryPage.tsx → studio/LibraryPage.tsx} +5 -5
- package/src/renderer/shared/components/{LibraryPreview.tsx → studio/LibraryPreview.tsx} +2 -2
- package/src/renderer/shared/components/{VeoStudioPanel.tsx → studio/VeoStudioPanel.tsx} +7 -7
- package/src/renderer/shared/components/{GlideSelect.css → ui/GlideSelect.css} +7 -6
- package/src/renderer/shared/components/ui/ProviderBrandIcon.test.tsx +67 -0
- package/src/renderer/shared/components/ui/ProviderBrandIcon.tsx +167 -0
- package/src/renderer/shared/components/ui/SelectField.tsx +506 -0
- package/src/renderer/shared/components/ui/error-recovery.css +10 -10
- package/src/renderer/shared/components/ui/error-recovery.tsx +1 -1
- package/src/renderer/shared/components/{ArtifactPreviewPanel.tsx → workspace/ArtifactPreviewPanel.tsx} +256 -112
- package/src/renderer/shared/components/workspace/BackgroundTerminals.test.tsx +63 -0
- package/src/renderer/shared/components/{BackgroundTerminals.tsx → workspace/BackgroundTerminals.tsx} +40 -9
- package/src/renderer/shared/components/{CodeReviewPage.tsx → workspace/CodeReviewPage.tsx} +47 -8
- package/src/renderer/shared/components/{GitBranchSelector.tsx → workspace/GitBranchSelector.tsx} +2 -2
- package/src/renderer/shared/components/workspace/SessionSources.tsx +113 -0
- package/src/renderer/shared/components/{TerminalDock.tsx → workspace/TerminalDock.tsx} +5 -2
- package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +68 -0
- package/src/renderer/shared/components/{ToolSurfacePage.tsx → workspace/ToolSurfacePage.tsx} +322 -71
- package/src/renderer/shared/components/{ToolsPanelToggle.tsx → workspace/ToolsPanelToggle.tsx} +1 -1
- package/src/renderer/shared/components/workspace/WorkspaceFileInfo.tsx +28 -0
- package/src/renderer/shared/components/workspace/WorkspaceMediaPreview.tsx +17 -0
- package/src/renderer/shared/components/{WorkspacePaneResizer.tsx → workspace/WorkspacePaneResizer.tsx} +1 -1
- package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +89 -0
- package/src/renderer/shared/components/{WorkspacePreviewActions.test.tsx → workspace/WorkspacePreviewActions.test.tsx} +48 -3
- package/src/renderer/shared/components/{WorkspacePreviewActions.tsx → workspace/WorkspacePreviewActions.tsx} +3 -3
- package/src/renderer/shared/components/{WorkspaceSelector.tsx → workspace/WorkspaceSelector.tsx} +99 -7
- package/src/renderer/shared/components/{workspace-selector.css → workspace/workspace-selector.css} +84 -2
- package/src/renderer/shared/constants/config.ts +7 -0
- package/src/renderer/shared/conversation/coordinator.test.ts +46 -0
- package/src/renderer/shared/conversation/coordinator.ts +50 -2
- package/src/renderer/shared/conversation/lifecycle.test.ts +163 -1
- package/src/renderer/shared/conversation/lifecycle.ts +164 -7
- package/src/renderer/shared/conversation/projectNavigation.test.ts +18 -0
- package/src/renderer/shared/conversation/projectNavigation.ts +11 -0
- package/src/renderer/shared/conversation/transport.test.ts +20 -0
- package/src/renderer/shared/conversation/transport.ts +51 -9
- package/src/renderer/shared/conversation/useConversationCoordinator.ts +42 -12
- package/src/renderer/shared/css/agent-observability.css +72 -11
- package/src/renderer/shared/css/chat-ui-cards.css +35 -35
- package/src/renderer/shared/css/code-review.css +86 -86
- package/src/renderer/shared/css/code-sessions.css +10 -10
- package/src/renderer/shared/css/file-changes.css +167 -5
- package/src/renderer/shared/css/management-views.css +78 -37
- package/src/renderer/shared/css/mcp-results.css +46 -3
- package/src/renderer/shared/css/queued-messages.css +221 -0
- package/src/renderer/shared/css/session-sources.css +12 -7
- package/src/renderer/shared/css/settings/agents.css +2 -2
- package/src/renderer/{src-web → shared}/css/settings/base.css +101 -107
- package/src/renderer/shared/css/settings/general.css +384 -92
- package/src/renderer/shared/css/settings/plugins.css +8 -8
- package/src/renderer/shared/css/settings/theme.css +44 -32
- package/src/renderer/shared/css/ui-tailwind.css +2 -2
- package/src/renderer/shared/css/viewed-images.css +89 -0
- package/src/renderer/shared/css/workspace-file-info.css +12 -0
- package/src/renderer/shared/css/workspace-media-preview.css +13 -0
- package/src/renderer/shared/env.d.ts +9 -0
- package/src/renderer/shared/platform.test.ts +143 -0
- package/src/renderer/shared/platform.ts +10 -4
- package/src/renderer/shared/speech/player.ts +160 -0
- package/src/renderer/shared/speech/types.ts +11 -0
- package/src/renderer/shared/theme/themeManager.test.ts +20 -0
- package/src/renderer/shared/theme/themeManager.ts +3 -1
- package/src/renderer/shared/theme/themes.ts +17 -4
- package/src/renderer/shared/theme/tokens.css +448 -51
- package/src/renderer/shared/types.ts +56 -1
- package/src/renderer/shared/utils/agentActivity.test.ts +165 -6
- package/src/renderer/shared/utils/agentActivity.ts +181 -31
- package/src/renderer/shared/utils/artifactBrowser.ts +1 -1
- package/src/renderer/shared/utils/artifacts.ts +55 -0
- package/src/renderer/shared/utils/contextCompaction.test.tsx +1 -1
- package/src/renderer/shared/utils/externalLinks.ts +91 -0
- package/src/renderer/shared/utils/lazyWithRetry.ts +13 -0
- package/src/renderer/shared/utils/markdown.tsx +169 -35
- package/src/renderer/shared/utils/markdown.webImages.test.tsx +124 -2
- package/src/renderer/shared/utils/mcpResults.test.tsx +24 -1
- package/src/renderer/shared/utils/pdfRange.ts +16 -0
- package/src/renderer/shared/utils/previewObjectUrls.ts +20 -0
- package/src/renderer/shared/utils/sessionSources.test.ts +41 -1
- package/src/renderer/shared/utils/sessionSources.ts +2 -0
- package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
- package/src/renderer/shared/utils/speech.ts +18 -4
- package/src/renderer/shared/utils/useNativeVoiceInput.ts +19 -5
- package/src/renderer/shared/utils/useSessionSources.ts +4 -0
- package/src/renderer/shared/utils/viewedImages.test.ts +129 -0
- package/src/renderer/shared/utils/viewedImages.ts +81 -10
- package/src/renderer/shared/utils/workspaceDrag.ts +30 -0
- package/src/renderer/shared/utils/workspaceImage.ts +17 -0
- package/src/renderer/shared/utils/workspaceListPreferences.test.ts +64 -0
- package/src/renderer/shared/utils/workspaceListPreferences.ts +54 -0
- package/src/renderer/shared/utils/workspaceMedia.ts +41 -0
- package/src/renderer/shared/utils/workspacePreview.test.ts +147 -2
- package/src/renderer/shared/utils/workspacePreview.ts +34 -3
- package/src/renderer/shared/utils/workspaces.ts +3 -2
- package/src/renderer/src/App.tsx +6 -8
- package/src/renderer/src/components/ChatPanel.tsx +1 -1
- package/src/renderer/src/components/DashboardSidebar.tsx +2 -2
- package/src/renderer/src/components/ImageStudioPanel.tsx +1 -1
- package/src/renderer/src/components/LiveTranslateControls.tsx +1 -1
- package/src/renderer/src/components/MintDashboard.tsx +1 -1
- package/src/renderer/src/components/ProactiveGlow.tsx +1 -1
- package/src/renderer/src/components/ScreenPicker.tsx +1 -1
- package/src/renderer/src/components/SettingsWindow.tsx +6 -830
- package/src/renderer/src/components/SpotlightWindow.tsx +4 -32
- package/src/renderer/src/components/VeoStudioPanel.tsx +1 -1
- package/src/renderer/src/components/WorkspacePanel.tsx +45 -12
- package/src/renderer/src/components/browser-shell.css +26 -26
- package/src/renderer/src/components/browser-suggestions-popup.css +8 -8
- package/src/renderer/src/css/app-shell.css +22 -102
- package/src/renderer/src/css/chat.css +221 -34
- package/src/renderer/src/css/desktop-tools.css +6 -337
- package/src/renderer/src/css/sidebar-workspace.css +20 -0
- package/src/renderer/src/css/spotlight.css +2 -2
- package/src/renderer/src/css/tool-surfaces.css +328 -58
- package/src/renderer/src/css/widget.css +6 -5
- package/src/renderer/src/env.d.ts +13 -0
- package/src/renderer/src/index.css +15 -63
- package/src/renderer/src/tauri.ts +77 -11
- package/src/renderer/src/voiceInput.ts +3 -1
- package/src/renderer/src-web/App.tsx +6 -8
- package/src/renderer/src-web/components/ChatPanel.tsx +1 -1
- package/src/renderer/src-web/components/DashboardSidebar.tsx +2 -2
- package/src/renderer/src-web/components/ImageStudioPanel.tsx +1 -1
- package/src/renderer/src-web/components/MintDashboard.tsx +1 -1
- package/src/renderer/src-web/components/SettingsWindow.tsx +6 -851
- package/src/renderer/src-web/components/VeoStudioPanel.tsx +1 -1
- package/src/renderer/src-web/css/app-shell.css +16 -100
- package/src/renderer/src-web/css/chat.css +221 -34
- package/src/renderer/src-web/css/sidebar-workspace.css +20 -0
- package/src/renderer/src-web/env.d.ts +14 -0
- package/src/renderer/src-web/index.css +15 -63
- package/src/renderer/src-web/tauri.ts +71 -13
- package/src/renderer/tests/browserArtifacts.browser.html +1 -0
- package/src/renderer/tests/browserArtifacts.browser.tsx +68 -0
- package/src/renderer/tests/chatEscape.browser.html +1 -0
- package/src/renderer/tests/chatEscape.browser.tsx +25 -0
- package/src/renderer/tests/chatPerformance.browser.html +1 -1
- package/src/renderer/tests/collapsedPaste.browser.html +1 -1
- package/src/renderer/tests/composerMenus.browser.html +3 -3
- package/src/renderer/tests/contextCompaction.browser.html +1 -1
- package/src/renderer/tests/errorRecovery.browser.html +1 -1
- package/src/renderer/tests/fixtures/preview.webm +0 -0
- package/src/renderer/tests/glideSelect.browser.html +1 -2
- package/src/renderer/tests/glideSelect.preview.html +1 -1
- package/src/renderer/tests/library.browser.tsx +1 -1
- package/src/renderer/tests/liveOrb.browser.html +1 -1
- package/src/renderer/tests/mediaFixtures.ts +32 -0
- package/src/renderer/tests/modInput.browser.html +1 -1
- package/src/renderer/tests/sessionSources.browser.tsx +76 -15
- package/src/renderer/tests/toolsPanel.browser.tsx +5 -5
- package/src/renderer/tests/viewedImages.browser.tsx +3 -3
- package/src/renderer/tests/voiceDictation.browser.html +101 -0
- package/src/renderer/tests/voicePill.browser.html +3 -3
- package/src/renderer/tests/voicePill.preview.html +1 -1
- package/src/renderer/tests/webSources.browser.tsx +2 -98
- package/src/renderer/tests/workspaceDrop.browser.html +1 -0
- package/src/renderer/tests/workspaceDrop.browser.tsx +183 -0
- package/src/renderer/tests/workspaceExpansion.browser.html +1 -0
- package/src/renderer/tests/workspaceExpansion.browser.tsx +66 -0
- package/src/renderer/tests/workspaceRemoval.browser.html +66 -0
- package/src/renderer/tests/workspaceUndo.browser.html +10 -2
- package/src-tauri/src/app/lifecycle.rs +44 -1
- package/src-tauri/src/commands/conversation.rs +99 -73
- package/src-tauri/src/commands/integrations.rs +7 -1
- package/src-tauri/src/commands/media.rs +7 -0
- package/src-tauri/src/commands/workspace.rs +38 -0
- package/tsconfig.json +15 -1
- package/vite.config.ts +2 -1
- package/vite.config.web.ts +2 -0
- package/out/web/assets/CliSessionsView-D7hw0Mgj.js +0 -1
- package/out/web/assets/CodeReviewPage-C7bEOJfd.js +0 -4
- package/out/web/assets/CodeReviewPage-Dte9uLiL.css +0 -1
- package/out/web/assets/CommandPalette-0RrF-AOT.js +0 -1
- package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +0 -1
- package/out/web/assets/LibraryPage--Qfisp6D.js +0 -2
- package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +0 -1
- package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +0 -1
- package/out/web/assets/McpServersView-slfQJzNB.js +0 -1
- package/out/web/assets/MintDashboard-BSR5XpXh.js +0 -25
- package/out/web/assets/MintDashboard-CWUcCGhd.css +0 -1
- package/out/web/assets/PluginsView-l7LSm503.js +0 -1
- package/out/web/assets/ScheduledTasksView-CttmLbq1.js +0 -1
- package/out/web/assets/SettingsWindow-BCMLYvEV.js +0 -4
- package/out/web/assets/SettingsWindow-DcMVmU9u.css +0 -1
- package/out/web/assets/SkillsView-rNs1qr_U.js +0 -2
- package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +0 -37
- package/out/web/assets/ToolSurfacePage-CTfgggF2.css +0 -1
- package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +0 -4
- package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +0 -1
- package/out/web/assets/WorkspaceSelector-B2xIp04D.js +0 -1
- package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +0 -1
- package/out/web/assets/abnfDiagram-VCTEODGH-CD0CjoGl.js +0 -1
- package/out/web/assets/architecture-7GRP2DOG-RKV83OeZ.js +0 -1
- package/out/web/assets/architectureDiagram-5GKGNRK7-nN_HAFct.js +0 -36
- package/out/web/assets/c4Diagram-UCG6FXSJ-DTdV8_zE.js +0 -38
- package/out/web/assets/chunk-2Q5K7J3B-Dmqrq8Tp.js +0 -1
- package/out/web/assets/chunk-75Z2AOVW-_M0z5olV.js +0 -2
- package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +0 -2
- package/out/web/assets/chunk-CLGD4ZFX-D54yGvGS.js +0 -1
- package/out/web/assets/chunk-CacB07dV.js +0 -1
- package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +0 -2
- package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +0 -128
- package/out/web/assets/chunk-F27PBJKO-BqtWrnEO.js +0 -1
- package/out/web/assets/chunk-FOHPRMQF-BaVC1uA7.js +0 -161
- package/out/web/assets/chunk-G27WJ6UU-Ckoq5mi2.js +0 -231
- package/out/web/assets/chunk-JQ64N6SF-CF8T7GiZ.js +0 -1
- package/out/web/assets/chunk-JWPE2WC7-BwtYOHqU.js +0 -1
- package/out/web/assets/chunk-LNGE3PJU-AdBoOWw2.js +0 -34
- package/out/web/assets/chunk-OBVCFTLP-CRIkunUB.js +0 -1
- package/out/web/assets/chunk-P2QGCYS3-UFEU6BxZ.js +0 -1
- package/out/web/assets/chunk-POPQ4Y6H-CQcrNbjr.js +0 -1
- package/out/web/assets/chunk-PWAF6VOD-Cc2uVDsG.js +0 -1
- package/out/web/assets/chunk-R7TYR2AO-DiCxzdAY.js +0 -10
- package/out/web/assets/chunk-RHFEMEQ7-b7hnPmrR.js +0 -168
- package/out/web/assets/chunk-XXDRQBXY-DnJkbUaw.js +0 -1
- package/out/web/assets/chunk-Y2CYZVJY-C9o-s6OY.js +0 -1
- package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +0 -1
- package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +0 -1
- package/out/web/assets/config-CnvCChUM.js +0 -2
- package/out/web/assets/config-DM6oIVO3.css +0 -1
- package/out/web/assets/core-DsKkQ7ig.js +0 -1
- package/out/web/assets/cose-bilkent-JH36ORCC--UN4aw5-.js +0 -1
- package/out/web/assets/cynefin-OW5HDTMX-CnzQfOGp.js +0 -1
- package/out/web/assets/cynefinDiagram-5FMLGOSQ-DVtQnfpm.js +0 -62
- package/out/web/assets/cytoscape.esm-Df1UN4Y1.js +0 -321
- package/out/web/assets/dagre-3AP2YEHR-DG76_k5_.js +0 -4
- package/out/web/assets/dagre-BWadQu2F.js +0 -1
- package/out/web/assets/diagram-S7CK7UJ4-CaouUoze.js +0 -30
- package/out/web/assets/diagram-UQ7AKVKN-B4bEc26B.js +0 -41
- package/out/web/assets/diagram-VX7I27RA-7hH5IPYf.js +0 -24
- package/out/web/assets/diagram-Z3DM3KII-CCM4clo8.js +0 -24
- package/out/web/assets/dist-BoTOASLF.js +0 -1
- package/out/web/assets/dist-js-BkYNznHX.js +0 -1
- package/out/web/assets/ebnfDiagram-PWID7BFC-Da7WAM3k.js +0 -1
- package/out/web/assets/event-Cdt7Byyj.js +0 -1
- package/out/web/assets/eventmodeling-NTZA5JFV-xcfsA0XD.js +0 -1
- package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +0 -1
- package/out/web/assets/ganttDiagram-EL5Y4UJY-B3ClFGmL.js +0 -292
- package/out/web/assets/gitGraph-4MIJSDKK-BZ_y_cDU.js +0 -1
- package/out/web/assets/gitGraphDiagram-WWUBYQGX-drhRSYm3.js +0 -106
- package/out/web/assets/graphlib-CTR5ZhLf.js +0 -1
- package/out/web/assets/index-BZ9xgmMP.css +0 -1
- package/out/web/assets/index-Ca8cCS4h.js +0 -168
- package/out/web/assets/info-A6RAGUB7-B7I3K0F1.js +0 -1
- package/out/web/assets/infoDiagram-RXCK75RN-deX_1MPh.js +0 -2
- package/out/web/assets/journeyDiagram-EYS64GPL-CZn2kB8b.js +0 -139
- package/out/web/assets/jsx-runtime-DN4NhQUK.js +0 -1
- package/out/web/assets/katex-O3jvqgnU.js +0 -257
- package/out/web/assets/markdown-CMhYIcWB.js +0 -39
- package/out/web/assets/mermaid-parser.core-Whu2rlJC.js +0 -7
- package/out/web/assets/mermaid.core-CKyPo8VH.js +0 -11
- package/out/web/assets/modelManager-CUaGWMWu.js +0 -2
- package/out/web/assets/oauthManager-DlNhXJr6.js +0 -1
- package/out/web/assets/packet-AYTQ26CC-CEeIRKRG.js +0 -1
- package/out/web/assets/pegDiagram-XKGWAZYB-BYadI-KO.js +0 -1
- package/out/web/assets/pie-WAS4IAKB-D8uf4dh5.js +0 -1
- package/out/web/assets/pieDiagram-E7YTZNPT-CjSDy4hO.js +0 -39
- package/out/web/assets/radar-RG4KPBEZ-DZJxnokY.js +0 -1
- package/out/web/assets/railroad-74A4TZTK-DBysUiUi.js +0 -1
- package/out/web/assets/railroad-abnf-HS5TGJTU-CHWxoJYg.js +0 -1
- package/out/web/assets/railroad-ebnf-LZEXJU2U-DDv7X6bY.js +0 -1
- package/out/web/assets/railroad-peg-WCYAUIDC-DpfcYYNJ.js +0 -1
- package/out/web/assets/railroadDiagram-O6MQD6OU-CYtyv0t3.js +0 -1
- package/out/web/assets/rough.esm-DFbTUy8a.js +0 -1
- package/out/web/assets/sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js +0 -40
- package/out/web/assets/sequenceDiagram-WJ2MYXX4-BvFLKtPd.js +0 -162
- package/out/web/assets/sizeCapture-X5ZJPWSS-DKeOCaN2.js +0 -1
- package/out/web/assets/src-DnfeXQPr.js +0 -1
- package/out/web/assets/stateDiagram-HBIQ2CUA-Bx0GWeaY.js +0 -1
- package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +0 -1
- package/out/web/assets/studio-B1mk40wD.js +0 -1
- package/out/web/assets/swimlanes-XN3QIQJK-CCma0T7L.js +0 -1
- package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +0 -8
- package/out/web/assets/timeline-definition-24CTP7MA-iCRhhJ7C.js +0 -120
- package/out/web/assets/treeView-Q6P3EWNA-DZ-y08qp.js +0 -1
- package/out/web/assets/treemap-WGGIJYW6-De0CxzMx.js +0 -1
- package/out/web/assets/vennDiagram-4TSXK5OY-w_7aZ6xe.js +0 -34
- package/out/web/assets/wardley-WFR3VGLG-DT0y0xJ4.js +0 -1
- package/out/web/assets/window-BJCVtyET.js +0 -1
- package/src/renderer/shared/components/ChatPanel.test.tsx +0 -21
- package/src/renderer/shared/components/FormattedMessage.tsx +0 -11
- package/src/renderer/shared/components/GlideSelect.d.ts +0 -31
- package/src/renderer/shared/components/GlideSelect.jsx +0 -266
- package/src/renderer/shared/components/InlineThoughtNote.tsx +0 -27
- package/src/renderer/shared/components/ModSessionControls.tsx +0 -8
- package/src/renderer/shared/components/ModUi.tsx +0 -26
- package/src/renderer/shared/components/ProgressActivity.tsx +0 -17
- package/src/renderer/shared/components/ReviewHistory.tsx +0 -42
- package/src/renderer/shared/components/RunSummaryDashboard.tsx +0 -143
- package/src/renderer/shared/components/SelectField.tsx +0 -38
- package/src/renderer/shared/components/SessionSources.tsx +0 -48
- package/src/renderer/shared/components/SessionSourcesPopover.tsx +0 -61
- package/src/renderer/shared/components/ToolSurfacePage.test.tsx +0 -32
- package/src/renderer/shared/components/ViewedImages.tsx +0 -36
- package/src/renderer/shared/components/WorkspaceContextPopover.tsx +0 -138
- package/src/renderer/shared/components/ui/demo.tsx +0 -26
- package/src/renderer/shared/css/session-sources-popover.css +0 -9
- package/src/renderer/src/components/CalculationCard.tsx +0 -3
- package/src/renderer/src/components/ImageGenCard.tsx +0 -2
- package/src/renderer/src/components/ImageSearchCard.tsx +0 -2
- package/src/renderer/src/components/MermaidCard.tsx +0 -1
- package/src/renderer/src/components/PicturesLibrary.tsx +0 -2
- package/src/renderer/src/components/Settings/AgentsTab.tsx +0 -4
- package/src/renderer/src/components/Settings/AudioTab.tsx +0 -3
- package/src/renderer/src/components/Settings/AutomationTab.tsx +0 -3
- package/src/renderer/src/components/Settings/GeneralTab.tsx +0 -3
- package/src/renderer/src/components/Settings/MemoryTab.tsx +0 -3
- package/src/renderer/src/components/Settings/PluginsTab.tsx +0 -3
- package/src/renderer/src/components/Settings/ProfileTab.tsx +0 -3
- package/src/renderer/src/components/Settings/ShortcutsTab.tsx +0 -3
- package/src/renderer/src/components/Settings/ThemeTab.tsx +0 -3
- package/src/renderer/src/components/StockCard.tsx +0 -3
- package/src/renderer/src/components/WeatherCard.tsx +0 -3
- package/src/renderer/src/css/pictures.css +0 -2
- package/src/renderer/src/css/settings/base.css +0 -1266
- package/src/renderer/src-web/components/PicturesLibrary.tsx +0 -2
- package/src/renderer/src-web/components/Settings/AgentsTab.tsx +0 -4
- package/src/renderer/src-web/components/Settings/AudioTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/AutomationTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/GeneralTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/MemoryTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/PluginsTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/ProfileTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +0 -3
- package/src/renderer/src-web/components/Settings/ThemeTab.tsx +0 -3
- package/src/renderer/src-web/css/pictures.css +0 -2
- package/src/renderer/src-web/css/spotlight.css +0 -102
- package/src/renderer/src-web/css/widget.css +0 -213
- /package/src/renderer/shared/components/{UiMockupWidget.tsx → cards/UiMockupWidget.tsx} +0 -0
- /package/src/renderer/shared/components/{ContextCompactionStatus.tsx → chat/ContextCompactionStatus.tsx} +0 -0
- /package/src/renderer/shared/components/{GeminiLiveOverlay.css → chat/GeminiLiveOverlay.css} +0 -0
- /package/src/renderer/shared/components/{GeminiLiveOverlay.test.tsx → chat/GeminiLiveOverlay.test.tsx} +0 -0
- /package/src/renderer/shared/components/{SlashSuggestions.test.tsx → chat/SlashSuggestions.test.tsx} +0 -0
- /package/src/renderer/shared/components/{VirtualChatHistory.tsx → chat/VirtualChatHistory.tsx} +0 -0
- /package/src/renderer/shared/components/{VoicePill.d.ts → chat/VoicePill.d.ts} +0 -0
- /package/src/renderer/shared/components/{VoicePill.test.tsx → chat/VoicePill.test.tsx} +0 -0
- /package/src/renderer/shared/components/{ScreenCaptureDialog.css → studio/ScreenCaptureDialog.css} +0 -0
- /package/src/renderer/shared/components/{ScreenCaptureDialog.tsx → studio/ScreenCaptureDialog.tsx} +0 -0
- /package/src/renderer/shared/components/{SelectField.test.tsx → ui/SelectField.test.tsx} +0 -0
- /package/src/renderer/shared/components/{background-terminals.css → workspace/background-terminals.css} +0 -0
|
@@ -36,6 +36,8 @@ pub(crate) const SHELL_COMMAND_TIMEOUT: Duration = Duration::from_secs(180);
|
|
|
36
36
|
pub(crate) struct CommandResult {
|
|
37
37
|
pub(crate) status_code: Option<i32>,
|
|
38
38
|
pub(crate) success: bool,
|
|
39
|
+
pub(crate) job_id: Option<String>,
|
|
40
|
+
pub(crate) cancelled: bool,
|
|
39
41
|
pub(crate) stdout: Vec<u8>,
|
|
40
42
|
pub(crate) stderr: Vec<u8>,
|
|
41
43
|
}
|
|
@@ -62,10 +64,20 @@ fn spawn_reader(
|
|
|
62
64
|
/// the same timeout/output-buffering behavior for `docker exec` instead of
|
|
63
65
|
/// duplicating it.
|
|
64
66
|
pub(crate) fn run_with_timeout(
|
|
67
|
+
cmd: Command,
|
|
68
|
+
timeout: Duration,
|
|
69
|
+
command: &str,
|
|
70
|
+
cwd: &Path,
|
|
71
|
+
) -> std::io::Result<CommandResult> {
|
|
72
|
+
run_with_timeout_cancellable(cmd, timeout, command, cwd, None)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn run_with_timeout_cancellable(
|
|
65
76
|
mut cmd: Command,
|
|
66
77
|
timeout: Duration,
|
|
67
78
|
command: &str,
|
|
68
79
|
cwd: &Path,
|
|
80
|
+
cancellation: Option<&tokio_util::sync::CancellationToken>,
|
|
69
81
|
) -> std::io::Result<CommandResult> {
|
|
70
82
|
cmd.stdin(Stdio::null())
|
|
71
83
|
.stdout(Stdio::piped())
|
|
@@ -82,12 +94,50 @@ pub(crate) fn run_with_timeout(
|
|
|
82
94
|
|
|
83
95
|
let deadline = Instant::now() + timeout;
|
|
84
96
|
loop {
|
|
97
|
+
if cancellation.is_some_and(|token| token.is_cancelled()) {
|
|
98
|
+
#[cfg(unix)]
|
|
99
|
+
unsafe {
|
|
100
|
+
libc::kill(-(child.id() as i32), libc::SIGTERM);
|
|
101
|
+
}
|
|
102
|
+
// Allow the browser helper to drop its separate Chrome runtime.
|
|
103
|
+
let grace = Instant::now() + Duration::from_millis(500);
|
|
104
|
+
while Instant::now() < grace {
|
|
105
|
+
if child.try_wait()?.is_some() {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
std::thread::sleep(Duration::from_millis(10));
|
|
109
|
+
}
|
|
110
|
+
#[cfg(unix)]
|
|
111
|
+
unsafe {
|
|
112
|
+
libc::kill(-(child.id() as i32), libc::SIGKILL);
|
|
113
|
+
}
|
|
114
|
+
#[cfg(windows)]
|
|
115
|
+
{
|
|
116
|
+
let _ = Command::new("taskkill")
|
|
117
|
+
.args(["/PID", &child.id().to_string(), "/T", "/F"])
|
|
118
|
+
.output();
|
|
119
|
+
}
|
|
120
|
+
let _ = child.kill();
|
|
121
|
+
let _ = child.wait();
|
|
122
|
+
let stdout = stdout_handle.join().unwrap_or_default();
|
|
123
|
+
let stderr = stderr_handle.join().unwrap_or_default();
|
|
124
|
+
return Ok(CommandResult {
|
|
125
|
+
status_code: None,
|
|
126
|
+
success: false,
|
|
127
|
+
job_id: None,
|
|
128
|
+
cancelled: true,
|
|
129
|
+
stdout,
|
|
130
|
+
stderr,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
85
133
|
if let Some(status) = child.try_wait()? {
|
|
86
134
|
let stdout = stdout_handle.join().unwrap_or_default();
|
|
87
135
|
let stderr = stderr_handle.join().unwrap_or_default();
|
|
88
136
|
return Ok(CommandResult {
|
|
89
137
|
status_code: status.code(),
|
|
90
138
|
success: status.success(),
|
|
139
|
+
job_id: None,
|
|
140
|
+
cancelled: false,
|
|
91
141
|
stdout,
|
|
92
142
|
stderr,
|
|
93
143
|
});
|
|
@@ -117,6 +167,8 @@ pub(crate) fn run_with_timeout(
|
|
|
117
167
|
return Ok(CommandResult {
|
|
118
168
|
status_code: None,
|
|
119
169
|
success: false,
|
|
170
|
+
job_id: Some(started.id),
|
|
171
|
+
cancelled: false,
|
|
120
172
|
stdout: Vec::new(),
|
|
121
173
|
stderr,
|
|
122
174
|
});
|
|
@@ -133,6 +185,8 @@ pub struct ShellOutput {
|
|
|
133
185
|
pub mode: String,
|
|
134
186
|
pub status: Option<i32>,
|
|
135
187
|
pub success: bool,
|
|
188
|
+
pub job_id: Option<String>,
|
|
189
|
+
pub cancelled: bool,
|
|
136
190
|
pub sandboxed: bool,
|
|
137
191
|
/// Set when a mutating/network command ran unconfined because sandboxing was
|
|
138
192
|
/// unavailable (rather than intentionally disabled via `sandboxMode: "off"`),
|
|
@@ -193,6 +247,23 @@ pub fn run_shell_command(
|
|
|
193
247
|
config: &MintConfig,
|
|
194
248
|
chat_id: Option<&str>,
|
|
195
249
|
) -> Result<ShellOutput, ShellError> {
|
|
250
|
+
run_shell_command_cancellable(command, cwd, approved, config, chat_id, None)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
pub fn run_shell_command_cancellable(
|
|
254
|
+
command: &str,
|
|
255
|
+
cwd: &Path,
|
|
256
|
+
approved: bool,
|
|
257
|
+
config: &MintConfig,
|
|
258
|
+
chat_id: Option<&str>,
|
|
259
|
+
cancellation: Option<&tokio_util::sync::CancellationToken>,
|
|
260
|
+
) -> Result<ShellOutput, ShellError> {
|
|
261
|
+
if cancellation.is_some_and(|token| token.is_cancelled()) {
|
|
262
|
+
return Err(ShellError::Execute(std::io::Error::new(
|
|
263
|
+
std::io::ErrorKind::Interrupted,
|
|
264
|
+
"Command cancelled before dispatch",
|
|
265
|
+
)));
|
|
266
|
+
}
|
|
196
267
|
if crate::bg_shell::is_shutting_down() {
|
|
197
268
|
return Err(ShellError::Execute(std::io::Error::other(
|
|
198
269
|
"Mint backend is shutting down",
|
|
@@ -245,7 +316,7 @@ pub fn run_shell_command(
|
|
|
245
316
|
let sandbox_mode = config.sandbox_mode.trim().to_ascii_lowercase();
|
|
246
317
|
let mut sandbox_warning = None;
|
|
247
318
|
if config.safety_enabled && sandbox_mode != "off" {
|
|
248
|
-
if let Some(output) = run_in_sandbox(&prepared_cmd, &cwd, config)? {
|
|
319
|
+
if let Some(output) = run_in_sandbox(&prepared_cmd, &cwd, config, cancellation)? {
|
|
249
320
|
return Ok(shell_output(
|
|
250
321
|
command,
|
|
251
322
|
cwd,
|
|
@@ -288,8 +359,10 @@ pub fn run_shell_command(
|
|
|
288
359
|
}
|
|
289
360
|
|
|
290
361
|
let mut cmd = shell_command(&prepared_cmd);
|
|
362
|
+
crate::browser::workflow::configure_shell(&mut cmd, config);
|
|
291
363
|
cmd.current_dir(&cwd);
|
|
292
|
-
let output =
|
|
364
|
+
let output =
|
|
365
|
+
run_with_timeout_cancellable(cmd, SHELL_COMMAND_TIMEOUT, command, &cwd, cancellation)?;
|
|
293
366
|
Ok(shell_output(
|
|
294
367
|
command,
|
|
295
368
|
cwd,
|
|
@@ -321,6 +394,7 @@ fn run_in_sandbox(
|
|
|
321
394
|
command: &str,
|
|
322
395
|
cwd: &Path,
|
|
323
396
|
config: &MintConfig,
|
|
397
|
+
cancellation: Option<&tokio_util::sync::CancellationToken>,
|
|
324
398
|
) -> Result<Option<CommandResult>, ShellError> {
|
|
325
399
|
#[cfg(target_os = "linux")]
|
|
326
400
|
{
|
|
@@ -331,21 +405,42 @@ fn run_in_sandbox(
|
|
|
331
405
|
return Ok(None);
|
|
332
406
|
}
|
|
333
407
|
let mut process = Command::new(sandbox);
|
|
408
|
+
crate::browser::workflow::configure_shell(&mut process, config);
|
|
334
409
|
// Own process group, same reasoning as `shell_command`'s: lets a
|
|
335
410
|
// timed-out or interrupted run be killed as a whole tree via
|
|
336
411
|
// `terminate_process_group` instead of just the `bwrap` wrapper.
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
.
|
|
340
|
-
.
|
|
341
|
-
|
|
412
|
+
let roots = writable_roots(config, cwd);
|
|
413
|
+
let has_tmp = roots
|
|
414
|
+
.iter()
|
|
415
|
+
.any(|r| r == Path::new("/tmp") || r == &std::env::temp_dir());
|
|
416
|
+
|
|
417
|
+
process.process_group(0).args([
|
|
418
|
+
"--die-with-parent",
|
|
419
|
+
"--ro-bind",
|
|
420
|
+
"/",
|
|
421
|
+
"/",
|
|
422
|
+
"--dev",
|
|
423
|
+
"/dev",
|
|
424
|
+
"--proc",
|
|
425
|
+
"/proc",
|
|
426
|
+
]);
|
|
427
|
+
if !has_tmp {
|
|
428
|
+
process.args(["--tmpfs", "/tmp"]);
|
|
429
|
+
}
|
|
430
|
+
for root in roots {
|
|
342
431
|
process.arg("--bind").arg(&root).arg(&root);
|
|
343
432
|
}
|
|
344
433
|
process
|
|
345
434
|
.arg("--chdir")
|
|
346
435
|
.arg(cwd)
|
|
347
436
|
.args(["bash", "-lc", command]);
|
|
348
|
-
let output =
|
|
437
|
+
let output = run_with_timeout_cancellable(
|
|
438
|
+
process,
|
|
439
|
+
SHELL_COMMAND_TIMEOUT,
|
|
440
|
+
command,
|
|
441
|
+
cwd,
|
|
442
|
+
cancellation,
|
|
443
|
+
)?;
|
|
349
444
|
Ok(Some(output))
|
|
350
445
|
}
|
|
351
446
|
|
|
@@ -358,19 +453,26 @@ fn run_in_sandbox(
|
|
|
358
453
|
return Ok(None);
|
|
359
454
|
}
|
|
360
455
|
let mut process = Command::new(sandbox);
|
|
456
|
+
crate::browser::workflow::configure_shell(&mut process, config);
|
|
361
457
|
process
|
|
362
458
|
.process_group(0)
|
|
363
459
|
.arg("-p")
|
|
364
460
|
.arg(mac_sandbox_profile(config, cwd))
|
|
365
461
|
.args(["bash", "-lc", command])
|
|
366
462
|
.current_dir(cwd);
|
|
367
|
-
let output =
|
|
463
|
+
let output = run_with_timeout_cancellable(
|
|
464
|
+
process,
|
|
465
|
+
SHELL_COMMAND_TIMEOUT,
|
|
466
|
+
command,
|
|
467
|
+
cwd,
|
|
468
|
+
cancellation,
|
|
469
|
+
)?;
|
|
368
470
|
return Ok(Some(output));
|
|
369
471
|
}
|
|
370
472
|
|
|
371
473
|
#[cfg(not(any(target_os = "linux", target_os = "macos")))]
|
|
372
474
|
{
|
|
373
|
-
let _ = (command, cwd, config);
|
|
475
|
+
let _ = (command, cwd, config, cancellation);
|
|
374
476
|
Ok(None)
|
|
375
477
|
}
|
|
376
478
|
}
|
|
@@ -438,6 +540,27 @@ pub(crate) fn writable_roots(config: &MintConfig, cwd: &Path) -> Vec<PathBuf> {
|
|
|
438
540
|
.filter(|root| root.exists())
|
|
439
541
|
.cloned()
|
|
440
542
|
.collect::<Vec<_>>();
|
|
543
|
+
let temp = std::env::temp_dir();
|
|
544
|
+
if temp.exists() && !roots.iter().any(|r| r == &temp) {
|
|
545
|
+
roots.push(temp.clone());
|
|
546
|
+
}
|
|
547
|
+
if let Ok(canonical_temp) = temp.canonicalize() {
|
|
548
|
+
if !roots.iter().any(|r| r == &canonical_temp) {
|
|
549
|
+
roots.push(canonical_temp);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
#[cfg(unix)]
|
|
553
|
+
{
|
|
554
|
+
let slash_tmp = PathBuf::from("/tmp");
|
|
555
|
+
if slash_tmp.exists() && !roots.iter().any(|r| r == &slash_tmp) {
|
|
556
|
+
roots.push(slash_tmp.clone());
|
|
557
|
+
}
|
|
558
|
+
if let Ok(canonical_slash_tmp) = slash_tmp.canonicalize() {
|
|
559
|
+
if !roots.iter().any(|r| r == &canonical_slash_tmp) {
|
|
560
|
+
roots.push(canonical_slash_tmp);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
441
564
|
if !roots.iter().any(|root| cwd.starts_with(root)) {
|
|
442
565
|
roots.push(cwd.to_path_buf());
|
|
443
566
|
}
|
|
@@ -525,6 +648,8 @@ fn shell_output(
|
|
|
525
648
|
mode: mode.into(),
|
|
526
649
|
status: output.status_code,
|
|
527
650
|
success: output.success,
|
|
651
|
+
job_id: output.job_id,
|
|
652
|
+
cancelled: output.cancelled,
|
|
528
653
|
sandboxed,
|
|
529
654
|
sandbox_warning,
|
|
530
655
|
stdout: String::from_utf8_lossy(&output.stdout).into_owned(),
|
|
@@ -534,6 +659,34 @@ fn shell_output(
|
|
|
534
659
|
|
|
535
660
|
#[cfg(test)]
|
|
536
661
|
mod tests {
|
|
662
|
+
#[test]
|
|
663
|
+
#[cfg(unix)]
|
|
664
|
+
fn cancellation_stops_the_foreground_process_group_and_preserves_partial_output() {
|
|
665
|
+
let token = tokio_util::sync::CancellationToken::new();
|
|
666
|
+
let cancel = token.clone();
|
|
667
|
+
let thread = std::thread::spawn(move || {
|
|
668
|
+
std::thread::sleep(std::time::Duration::from_millis(400));
|
|
669
|
+
cancel.cancel();
|
|
670
|
+
});
|
|
671
|
+
let mut config = local_config();
|
|
672
|
+
config.allowed_write_paths.push(std::env::temp_dir());
|
|
673
|
+
let started = std::time::Instant::now();
|
|
674
|
+
let result = super::run_shell_command_cancellable(
|
|
675
|
+
"printf started; sleep 5; printf should-not-run",
|
|
676
|
+
&std::env::temp_dir(),
|
|
677
|
+
true,
|
|
678
|
+
&config,
|
|
679
|
+
None,
|
|
680
|
+
Some(&token),
|
|
681
|
+
)
|
|
682
|
+
.unwrap();
|
|
683
|
+
thread.join().unwrap();
|
|
684
|
+
assert!(result.cancelled);
|
|
685
|
+
assert_eq!(result.status, None);
|
|
686
|
+
assert!(result.stdout.contains("started"));
|
|
687
|
+
assert!(!result.stdout.contains("should-not-run"));
|
|
688
|
+
assert!(started.elapsed() < std::time::Duration::from_secs(2));
|
|
689
|
+
}
|
|
537
690
|
use super::*;
|
|
538
691
|
|
|
539
692
|
fn local_config() -> MintConfig {
|
|
@@ -697,4 +850,20 @@ mod tests {
|
|
|
697
850
|
assert!(matches!(job.status, crate::bg_shell::JobStatus::Running));
|
|
698
851
|
let _ = crate::bg_shell::kill_job(&job.id);
|
|
699
852
|
}
|
|
853
|
+
|
|
854
|
+
#[test]
|
|
855
|
+
fn writable_roots_always_includes_temp_directory() {
|
|
856
|
+
let config = MintConfig {
|
|
857
|
+
allowed_write_paths: vec![],
|
|
858
|
+
..MintConfig::default()
|
|
859
|
+
};
|
|
860
|
+
let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
|
|
861
|
+
let roots = writable_roots(&config, &cwd);
|
|
862
|
+
let temp = std::env::temp_dir();
|
|
863
|
+
assert!(
|
|
864
|
+
roots
|
|
865
|
+
.iter()
|
|
866
|
+
.any(|r| r == &temp || (cfg!(unix) && r == Path::new("/tmp")))
|
|
867
|
+
);
|
|
868
|
+
}
|
|
700
869
|
}
|
|
@@ -5,6 +5,110 @@ use std::{
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
const MAX_DEPTH: usize = 9;
|
|
8
|
+
|
|
9
|
+
#[derive(Debug, Serialize)]
|
|
10
|
+
#[serde(rename_all = "camelCase")]
|
|
11
|
+
pub struct PreparedWorkspaceMedia {
|
|
12
|
+
pub path: PathBuf,
|
|
13
|
+
pub mime_type: &'static str,
|
|
14
|
+
pub byte_length: u64,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// Authorize one document/media file without reading its payload into memory.
|
|
18
|
+
pub fn prepare_media(
|
|
19
|
+
root: &Path,
|
|
20
|
+
relative: &str,
|
|
21
|
+
config: &crate::MintConfig,
|
|
22
|
+
) -> Result<PreparedWorkspaceMedia, String> {
|
|
23
|
+
let root = crate::assert_path_capability(root, crate::Capability::Read, config)
|
|
24
|
+
.map_err(|error| error.to_string())?;
|
|
25
|
+
let path = resolve(&root, relative)?;
|
|
26
|
+
let path = crate::assert_path_capability(&path, crate::Capability::Read, config)
|
|
27
|
+
.map_err(|error| error.to_string())?
|
|
28
|
+
.canonicalize()
|
|
29
|
+
.map_err(|error| error.to_string())?;
|
|
30
|
+
let extension = path
|
|
31
|
+
.extension()
|
|
32
|
+
.and_then(|value| value.to_str())
|
|
33
|
+
.unwrap_or_default()
|
|
34
|
+
.to_ascii_lowercase();
|
|
35
|
+
let mime_type = match extension.as_str() {
|
|
36
|
+
"pdf" => "application/pdf",
|
|
37
|
+
"mp3" => "audio/mpeg",
|
|
38
|
+
"wav" => "audio/wav",
|
|
39
|
+
"ogg" | "oga" | "opus" => "audio/ogg",
|
|
40
|
+
"flac" => "audio/flac",
|
|
41
|
+
"m4a" => "audio/mp4",
|
|
42
|
+
"aac" => "audio/aac",
|
|
43
|
+
"weba" => "audio/webm",
|
|
44
|
+
"mp4" | "m4v" => "video/mp4",
|
|
45
|
+
"webm" => "video/webm",
|
|
46
|
+
"ogv" => "video/ogg",
|
|
47
|
+
"mov" => "video/quicktime",
|
|
48
|
+
_ => {
|
|
49
|
+
return Err("Select a supported PDF, audio, or video file inside the workspace".into());
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
let metadata = fs::metadata(&path).map_err(|error| error.to_string())?;
|
|
53
|
+
if !metadata.is_file() {
|
|
54
|
+
return Err("Select a media file".into());
|
|
55
|
+
}
|
|
56
|
+
Ok(PreparedWorkspaceMedia {
|
|
57
|
+
path,
|
|
58
|
+
mime_type,
|
|
59
|
+
byte_length: metadata.len(),
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const MAX_PREVIEW_IMAGE_BYTES: u64 = 32 * 1024 * 1024;
|
|
64
|
+
|
|
65
|
+
/// Return image bytes over the existing IPC/API boundary, without a background service.
|
|
66
|
+
pub fn read_image(
|
|
67
|
+
root: &Path,
|
|
68
|
+
relative: &str,
|
|
69
|
+
config: &crate::MintConfig,
|
|
70
|
+
) -> Result<String, String> {
|
|
71
|
+
use base64::Engine;
|
|
72
|
+
use std::io::Read;
|
|
73
|
+
let root = crate::assert_path_capability(root, crate::Capability::Read, config)
|
|
74
|
+
.map_err(|error| error.to_string())?;
|
|
75
|
+
let path = resolve(&root, relative)?;
|
|
76
|
+
crate::assert_path_capability(&path, crate::Capability::Read, config)
|
|
77
|
+
.map_err(|error| error.to_string())?;
|
|
78
|
+
let extension = path
|
|
79
|
+
.extension()
|
|
80
|
+
.and_then(|value| value.to_str())
|
|
81
|
+
.unwrap_or_default()
|
|
82
|
+
.to_ascii_lowercase();
|
|
83
|
+
let mime = match extension.as_str() {
|
|
84
|
+
"png" => "image/png",
|
|
85
|
+
"jpg" | "jpeg" => "image/jpeg",
|
|
86
|
+
"gif" => "image/gif",
|
|
87
|
+
"webp" => "image/webp",
|
|
88
|
+
"ico" => "image/x-icon",
|
|
89
|
+
"svg" => "image/svg+xml",
|
|
90
|
+
_ => return Err("Select a supported image file inside the workspace".into()),
|
|
91
|
+
};
|
|
92
|
+
let file = fs::File::open(&path).map_err(|error| error.to_string())?;
|
|
93
|
+
let metadata = file.metadata().map_err(|error| error.to_string())?;
|
|
94
|
+
if !metadata.is_file() {
|
|
95
|
+
return Err("Select an image file".into());
|
|
96
|
+
}
|
|
97
|
+
if metadata.len() > MAX_PREVIEW_IMAGE_BYTES {
|
|
98
|
+
return Err("Image preview supports files up to 32 MiB".into());
|
|
99
|
+
}
|
|
100
|
+
let mut bytes = Vec::new();
|
|
101
|
+
file.take(MAX_PREVIEW_IMAGE_BYTES + 1)
|
|
102
|
+
.read_to_end(&mut bytes)
|
|
103
|
+
.map_err(|error| error.to_string())?;
|
|
104
|
+
if bytes.len() as u64 > MAX_PREVIEW_IMAGE_BYTES {
|
|
105
|
+
return Err("Image preview supports files up to 32 MiB".into());
|
|
106
|
+
}
|
|
107
|
+
Ok(format!(
|
|
108
|
+
"data:{mime};base64,{}",
|
|
109
|
+
base64::engine::general_purpose::STANDARD.encode(bytes)
|
|
110
|
+
))
|
|
111
|
+
}
|
|
8
112
|
const MAX_CHILDREN: usize = 400;
|
|
9
113
|
const COLLAPSED: &[&str] = &[
|
|
10
114
|
".git",
|
|
@@ -204,6 +308,106 @@ mod tests {
|
|
|
204
308
|
root
|
|
205
309
|
}
|
|
206
310
|
|
|
311
|
+
#[test]
|
|
312
|
+
fn workspace_media_prepares_scoped_files_without_reading_large_payloads() {
|
|
313
|
+
let root = root();
|
|
314
|
+
let config = crate::MintConfig {
|
|
315
|
+
allowed_read_paths: vec![root.clone()],
|
|
316
|
+
..Default::default()
|
|
317
|
+
};
|
|
318
|
+
for (name, mime) in [
|
|
319
|
+
("book.PDF", "application/pdf"),
|
|
320
|
+
("song.mp3", "audio/mpeg"),
|
|
321
|
+
("clip.webm", "video/webm"),
|
|
322
|
+
] {
|
|
323
|
+
fs::write(root.join(name), [0_u8, 255, 128]).unwrap();
|
|
324
|
+
let media = prepare_media(&root, name, &config).unwrap();
|
|
325
|
+
assert_eq!(media.mime_type, mime);
|
|
326
|
+
assert_eq!(media.byte_length, 3);
|
|
327
|
+
assert_eq!(media.path, root.join(name).canonicalize().unwrap());
|
|
328
|
+
}
|
|
329
|
+
fs::File::create(root.join("large.mp4"))
|
|
330
|
+
.unwrap()
|
|
331
|
+
.set_len(1024 * 1024 * 1024)
|
|
332
|
+
.unwrap();
|
|
333
|
+
assert_eq!(
|
|
334
|
+
prepare_media(&root, "large.mp4", &config)
|
|
335
|
+
.unwrap()
|
|
336
|
+
.byte_length,
|
|
337
|
+
1024 * 1024 * 1024
|
|
338
|
+
);
|
|
339
|
+
fs::write(root.join("private.txt"), "not media").unwrap();
|
|
340
|
+
assert!(prepare_media(&root, "private.txt", &config).is_err());
|
|
341
|
+
assert!(prepare_media(&root, "../book.PDF", &config).is_err());
|
|
342
|
+
fs::remove_dir_all(root).unwrap();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
#[cfg(unix)]
|
|
346
|
+
#[test]
|
|
347
|
+
fn workspace_media_rejects_links_outside_the_selected_root() {
|
|
348
|
+
let root = root();
|
|
349
|
+
let outside =
|
|
350
|
+
std::env::temp_dir().join(format!("mint-outside-media-{}.mp4", uuid::Uuid::new_v4()));
|
|
351
|
+
fs::write(&outside, [1_u8]).unwrap();
|
|
352
|
+
std::os::unix::fs::symlink(&outside, root.join("escape.mp4")).unwrap();
|
|
353
|
+
let config = crate::MintConfig {
|
|
354
|
+
allowed_read_paths: vec![root.clone()],
|
|
355
|
+
..Default::default()
|
|
356
|
+
};
|
|
357
|
+
assert!(prepare_media(&root, "escape.mp4", &config).is_err());
|
|
358
|
+
fs::remove_file(outside).unwrap();
|
|
359
|
+
fs::remove_dir_all(root).unwrap();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
#[test]
|
|
363
|
+
fn workspace_image_reads_binary_data_directly_and_rejects_unsupported_or_oversized_files() {
|
|
364
|
+
let root = root();
|
|
365
|
+
let config = crate::MintConfig {
|
|
366
|
+
allowed_read_paths: vec![root.clone()],
|
|
367
|
+
..Default::default()
|
|
368
|
+
};
|
|
369
|
+
fs::write(root.join("photo.PNG"), [0_u8, 255, 128, 1]).unwrap();
|
|
370
|
+
assert_eq!(
|
|
371
|
+
read_image(&root, "photo.PNG", &config).unwrap(),
|
|
372
|
+
"data:image/png;base64,AP+AAQ=="
|
|
373
|
+
);
|
|
374
|
+
fs::write(root.join("icon.svg"), "<svg/>").unwrap();
|
|
375
|
+
assert_eq!(
|
|
376
|
+
read_image(&root, "icon.svg", &config).unwrap(),
|
|
377
|
+
"data:image/svg+xml;base64,PHN2Zy8+"
|
|
378
|
+
);
|
|
379
|
+
fs::write(root.join("notes.txt"), "hello").unwrap();
|
|
380
|
+
assert!(read_image(&root, "notes.txt", &config).is_err());
|
|
381
|
+
assert!(read_image(&root, "../photo.PNG", &config).is_err());
|
|
382
|
+
assert!(read_image(&root, root.join("photo.PNG").to_str().unwrap(), &config).is_err());
|
|
383
|
+
let large = fs::File::create(root.join("large.png")).unwrap();
|
|
384
|
+
large.set_len(MAX_PREVIEW_IMAGE_BYTES + 1).unwrap();
|
|
385
|
+
assert!(
|
|
386
|
+
read_image(&root, "large.png", &config)
|
|
387
|
+
.unwrap_err()
|
|
388
|
+
.contains("32 MiB")
|
|
389
|
+
);
|
|
390
|
+
fs::remove_dir_all(root).unwrap();
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
#[cfg(unix)]
|
|
394
|
+
#[test]
|
|
395
|
+
fn workspace_image_rejects_symlinks_outside_its_source_root() {
|
|
396
|
+
let root = root();
|
|
397
|
+
let other = root
|
|
398
|
+
.join("../")
|
|
399
|
+
.join(format!("mint-outside-{}.png", uuid::Uuid::new_v4()));
|
|
400
|
+
fs::write(&other, [1_u8, 2, 3]).unwrap();
|
|
401
|
+
std::os::unix::fs::symlink(&other, root.join("escape.png")).unwrap();
|
|
402
|
+
let config = crate::MintConfig {
|
|
403
|
+
allowed_read_paths: vec![root.clone()],
|
|
404
|
+
..Default::default()
|
|
405
|
+
};
|
|
406
|
+
assert!(read_image(&root, "escape.png", &config).is_err());
|
|
407
|
+
fs::remove_file(other).unwrap();
|
|
408
|
+
fs::remove_dir_all(root).unwrap();
|
|
409
|
+
}
|
|
410
|
+
|
|
207
411
|
#[test]
|
|
208
412
|
fn interface_workspace_operations_return_snapshots_and_advance_revision() {
|
|
209
413
|
let root = root();
|
|
@@ -20,7 +20,7 @@ fn retains_latest_hundred_finished_jobs_without_evicting_active_jobs() {
|
|
|
20
20
|
.id,
|
|
21
21
|
);
|
|
22
22
|
}
|
|
23
|
-
let deadline = Instant::now() + Duration::from_secs(
|
|
23
|
+
let deadline = Instant::now() + Duration::from_secs(30);
|
|
24
24
|
while bg_shell::running_count() > 1 && Instant::now() < deadline {
|
|
25
25
|
std::thread::sleep(Duration::from_millis(20));
|
|
26
26
|
}
|
|
@@ -85,6 +85,33 @@ fn stores_and_reads_interaction_agent_activity() {
|
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
#[test]
|
|
89
|
+
fn exports_trajectory_json_from_agent_activity() {
|
|
90
|
+
let store = store("trajectory-export");
|
|
91
|
+
let interaction_id = store
|
|
92
|
+
.add_interaction_with_metadata(
|
|
93
|
+
"Write hello world",
|
|
94
|
+
"Done",
|
|
95
|
+
"anthropic",
|
|
96
|
+
"claude-3-7-sonnet",
|
|
97
|
+
)
|
|
98
|
+
.unwrap();
|
|
99
|
+
store
|
|
100
|
+
.set_interaction_agent_activity_json(
|
|
101
|
+
interaction_id,
|
|
102
|
+
r#"[{"type":"Thought","data":{"thought":"inspect code"}},{"type":"ToolEnd","data":{"action":"write_file","input":{"path":"src/main.rs"},"result":"Written successfully","elapsed_ms":45,"status":"success"}},{"type":"RunCompleted","data":{"summary":{"runId":"run-999","task":"Write hello world","outcome":"SUCCESS","totalTokens":500,"toolCallsCount":1,"filesChanged":["src/main.rs"],"filesCreated":["src/main.rs"],"durationSecs":1.2,"toolTimeline":[],"retriesCount":0}}}]"#,
|
|
103
|
+
)
|
|
104
|
+
.unwrap();
|
|
105
|
+
|
|
106
|
+
let trajectory_json = store
|
|
107
|
+
.export_trajectory_json("default", Some("run-999"))
|
|
108
|
+
.unwrap();
|
|
109
|
+
assert!(trajectory_json.contains("\"schemaVersion\": \"1.0\""));
|
|
110
|
+
assert!(trajectory_json.contains("\"runId\": \"run-999\""));
|
|
111
|
+
assert!(trajectory_json.contains("\"outcome\": \"SUCCESS\""));
|
|
112
|
+
assert!(trajectory_json.contains("\"action\": \"write_file\""));
|
|
113
|
+
}
|
|
114
|
+
|
|
88
115
|
#[test]
|
|
89
116
|
fn preserves_chat_history_when_store_is_reopened() {
|
|
90
117
|
let path = test_path("reopen-history", "sqlite");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.workspace-file-info{width:100%;color:var(--text-main);padding:32px 20px}.workspace-file-info>svg{color:var(--accent)}.workspace-file-info h2{overflow-wrap:anywhere;margin:16px 0 8px;font-size:16px}.workspace-file-info p{color:var(--text-muted);font-size:12px;line-height:1.6}.workspace-file-info dl{margin:24px 0;font-size:12px}.workspace-file-info dt{color:var(--text-muted);margin-top:14px}.workspace-file-info dd{overflow-wrap:anywhere;margin:4px 0 0}.workspace-file-info button{border:1px solid var(--border);border-radius:var(--radius-sm,6px);background:var(--surface-bg);min-height:36px;color:var(--accent);font:inherit;cursor:pointer;align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:inline-flex}.workspace-file-info button:hover:not(:disabled){background:var(--surface-strong)}.workspace-file-info button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.workspace-file-info button:disabled{opacity:.5;cursor:default}.workspace-file-info .workspace-file-info-error{color:var(--status-error)}.workspace-pdf-preview{width:100%;height:100%;min-height:0;color:var(--text-main);flex-direction:column;display:flex}.workspace-pdf-controls{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;justify-content:center;align-items:center;gap:8px;padding:10px;font-size:12px;display:flex}.workspace-pdf-controls button,.workspace-pdf-pages>button{border:1px solid var(--border);border-radius:var(--radius-xs,6px);background:var(--surface-bg);min-height:30px;color:var(--text-main);font:inherit;cursor:pointer;padding:4px 8px}.workspace-pdf-controls button:disabled{opacity:.4;cursor:default}.workspace-pdf-controls button:hover:not(:disabled){color:var(--accent);background:var(--surface-strong)}.workspace-pdf-controls button:focus-visible,.workspace-pdf-pages>button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.workspace-pdf-pages{flex:1;min-height:0;padding:16px;overflow:auto}.workspace-pdf-pages canvas{margin-inline:auto;display:block}.workspace-pdf-pages>p{color:var(--text-muted);font-size:12px}.workspace-media-preview{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;min-height:180px;padding:20px;display:flex;overflow:auto}.workspace-media-preview audio{width:100%}.workspace-media-preview video{object-fit:contain;width:100%;max-height:100%}.workspace-media-preview .workspace-media-error,.workspace-pdf-pages .workspace-media-error{color:var(--status-error);font-size:12px;line-height:1.6}
|
|
@@ -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-Dx_lkjNu.js","assets/jsx-runtime-DmUwWVTj.js","assets/index-BmpulIkg.js","assets/index-CkvBwhX_.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{An as i,Bn as a,F as o,Hn as s,I as c,J as l,Jn as u,Kn as d,L as f,Rn as p,Xt as m,g as h,h as g,j as _,wn as v}from"./index-BmpulIkg.js";import{C as y,M as b,O as x,_ as S,j as C,k as w,v as T,x as E,y as D}from"./MintDashboard-COw_xol7.js";async function O(e,t,n={desktop:o.isTauriRuntime(),startPreview:(e,t,n)=>c.startHtmlPreview(e,t,n),openMintBrowser:async e=>{let{invoke:t}=await g(async()=>{let{invoke:e}=await import(`./core-Mi3s5D4_.js`).then(e=>(e.a(),e.i));return{invoke:e}},__vite__mapDeps([0,1]));await t(`open_mint_browser`,{url:e})}}){if(n.desktop&&e.url){await n.openMintBrowser(e.url);return}let r=(e.workspacePath??t)?.trim();if(!r)throw Error(`Select a project before opening its preview in Mint Browser`);let i=e.path.replace(/\\/g,`/`);if(/^(\/|[a-z]:\/)/i.test(i)){let e=r.replace(/\\/g,`/`).replace(/\/+$/,``),t=`${e}/`;if(!(/^[a-z]:\//i.test(e)||e.startsWith(`//`)?i.toLowerCase().startsWith(t.toLowerCase()):i.startsWith(t)))throw Error(`This file is outside its source project`);i=i.slice(t.length)}let a=await n.startPreview(r,i,!n.desktop);n.desktop&&await n.openMintBrowser(a.url)}var k=t((()=>{_(),h()})),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=y(t,e),{invoke:r}=await g(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)(p,{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)(u,{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()),f(),E(),A(),N=r(),h()})),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 B(e){switch(e){case`image`:return(0,U.jsx)(v,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`html`:return(0,U.jsx)(i,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`svg`:case`code`:return(0,U.jsx)(s,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`markdown`:case`pdf`:return(0,U.jsx)(a,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`audio`:return(0,U.jsx)(m,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`video`:return(0,U.jsx)(l,{size:13,strokeWidth:2.2,"aria-hidden":`true`});default:return(0,U.jsx)(p,{size:13,strokeWidth:2.2,"aria-hidden":`true`})}}function V({artifact:e,onClose:t,workspacePath:n}){let r=e?.path||``,i=(0,H.useMemo)(()=>{if(!r)return``;let e=r.replace(/\\/g,`/`).split(`/`);return e[e.length-1]||r},[r]),a=(0,H.useMemo)(()=>e?.type?e.type:S(r),[e,r]),c=a===`html`||a===`svg`||a===`markdown`,[l,u]=(0,H.useState)(a===`code`?`code`:`preview`),[f,p]=(0,H.useState)(`desktop`),[m,h]=(0,H.useState)(e?.content||``),[g,_]=(0,H.useState)(e?.url||``),[y,b]=(0,H.useState)(!1),[x,E]=(0,H.useState)(null),[D,k]=(0,H.useState)(!1),[A,M]=(0,H.useState)(null),N=(0,H.useRef)(!1),P=(0,H.useRef)(e);P.current=e;let[F,L]=(0,H.useState)(!1),[R,z]=(0,H.useState)(null),[V,G]=(0,H.useState)(0),K=(0,H.useRef)(0),q=e?.workspacePath??n,J=(0,H.useMemo)(()=>T(r),[r]),Y=a===`pdf`||a===`audio`||a===`video`,X=(0,H.useMemo)(()=>{if(a!==`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`},[a,r]),Z=(0,H.useMemo)(()=>!J||J===`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`}[J.toLowerCase()]||J.charAt(0).toUpperCase()+J.slice(1),[J]),Q=(0,H.useCallback)(async(t=!1)=>{let n=++K.current;if(E(null),z(null),G(e=>e+1),r){if(t&&l===`preview`&&(a===`image`||a===`svg`)&&e?.url?.startsWith(`data:image/`)&&q){b(!0);try{let e=await o.readWorkspaceImage(r,q);K.current===n&&_(e)}catch(e){K.current===n&&E(e instanceof Error?e.message:String(e))}finally{K.current===n&&b(!1)}}else if(Y||a===`file`||a===`image`||e?.url&&l===`preview`)b(!1),Y&&!e?.url&&E(`No media preview source is available`),a===`image`&&!e?.url&&E(`No image preview URL is available`);else{b(!0);try{let e=await o.readWorkspaceFile(r,q);K.current===n&&h(e)}catch(t){if(K.current!==n)return;e?.content===void 0?E(t instanceof Error?t.message:`Unable to read file content`):h(e.content)}finally{K.current===n&&b(!1)}}}},[r,q,e,a,l,Y]);(0,H.useEffect)(()=>{u(a===`code`?`code`:`preview`),M(null),h(e?.content??``),_(e?.url??``),z(null),E(null)},[e,a]),(0,H.useEffect)(()=>(e?.content!==void 0&&(l===`preview`||!r)?(b(!1),E(null)):Q(),()=>{K.current+=1}),[e,l,r,Q]);let $=async()=>{if(r)try{await navigator.clipboard.writeText(r),L(!0),setTimeout(()=>L(!1),1800)}catch{}},ee=async()=>{if(e&&!N.current){N.current=!0,k(!0),M(null);try{await O(e,q)}catch(t){P.current===e&&M(t instanceof Error?t.message:String(t))}finally{N.current=!1,k(!1)}}};return e?(0,U.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,U.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,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,minWidth:0},children:[(0,U.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:a.toUpperCase(),"aria-label":`${a} artifact`,children:B(a)}),(0,U.jsxs)(`div`,{style:{minWidth:0,display:`flex`,flexDirection:`column`},children:[(0,U.jsx)(`span`,{style:{fontWeight:600,fontSize:`0.86rem`,color:`var(--text-main)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:r,children:i}),(0,U.jsx)(`button`,{type:`button`,onClick:$,style:{background:`none`,border:`none`,color:F?`var(--accent)`:`var(--text-muted)`,fontSize:`0.7rem`,padding:0,cursor:`pointer`,textAlign:`left`,display:`inline-flex`,alignItems:`center`,gap:`4px`},children:F?`Path Copied`:`Copy path`})]})]}),(0,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c?(0,U.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,U.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,U.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,U.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,U.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,padding:`3px 10px`,background:a===`image`||a===`code`?`color-mix(in srgb, var(--accent) 10%, transparent)`:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`9999px`,border:a===`image`||a===`code`?`1px solid color-mix(in srgb, var(--accent) 25%, transparent)`:`1px solid var(--border)`,color:a===`image`||a===`code`?`var(--accent)`:`var(--text-muted)`,fontSize:`0.72rem`,fontWeight:500,letterSpacing:`0.01em`},children:[a===`code`?(0,U.jsx)(s,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):a===`image`?(0,U.jsx)(v,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):(0,U.jsx)(d,{size:12,strokeWidth:2.2,"aria-hidden":`true`}),(0,U.jsx)(`span`,{children:a===`code`?Z:a===`image`?X:a===`file`?`Details`:`Preview`})]}),a===`image`&&R&&(0,U.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:[R.width,` × `,R.height,` px`]})]}),l===`preview`&&a===`html`&&(0,U.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,U.jsx)(`button`,{type:`button`,onClick:()=>p(`desktop`),title:`Desktop 100%`,style:{background:f===`desktop`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`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,U.jsx)(`button`,{type:`button`,onClick:()=>p(`tablet`),title:`Tablet (768px)`,style:{background:f===`tablet`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`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,U.jsx)(`button`,{type:`button`,onClick:()=>p(`mobile`),title:`Mobile (375px)`,style:{background:f===`mobile`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`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,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[!Y&&(0,U.jsx)(`button`,{type:`button`,onClick:()=>{Q(!0)},disabled:y,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,U.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{animation:y?`spin 1s linear infinite`:`none`},children:[(0,U.jsx)(`polyline`,{points:`23 4 23 10 17 10`}),(0,U.jsx)(`polyline`,{points:`1 20 1 14 7 14`}),(0,U.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`})]})}),a===`html`&&(0,U.jsx)(`button`,{type:`button`,onClick:()=>{ee()},disabled:D,"aria-label":`Open in Mint Browser (Mint Auto)`,"aria-busy":D,title:D?`Opening Mint Browser…`:`Open in Mint Browser (Mint Auto)`,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,U.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,U.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,U.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,U.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(0,U.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,U.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,U.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,U.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})})]})]}),A&&(0,U.jsxs)(`div`,{role:`alert`,style:{padding:`8px 14px`,fontSize:`0.8rem`,color:`var(--status-error, #f87171)`,flexShrink:0},children:[`Could not open Mint Browser: `,A]}),(0,U.jsx)(`div`,{style:{flex:1,overflow:`auto`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`flex-start`,background:l===`preview`&&a===`html`?`var(--input-bg, #0a0a0b)`:`transparent`,padding:l===`preview`&&a===`html`?`16px`:`0`},children:x?(0,U.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--status-error, #f87171)`},children:[(0,U.jsx)(`p`,{style:{fontWeight:600,marginBottom:`8px`},children:`Error loading preview`}),(0,U.jsx)(`p`,{style:{fontSize:`0.8rem`,opacity:.8},children:x}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{Q(!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`})]}):a===`file`?(0,U.jsx)(j,{path:r,root:q},`${q}:${r}`):a===`pdf`&&e.url?(0,U.jsx)(H.Suspense,{fallback:(0,U.jsx)(`p`,{role:`status`,children:`Loading PDF viewer…`}),children:(0,U.jsx)(W,{url:e.url,path:r,root:q,byteLength:e.byteLength,range:e.range},e.url)}):(a===`audio`||a===`video`)&&e.url?(0,U.jsx)(I,{kind:a,url:e.url,path:r,root:q,mimeType:e.mimeType},e.url):l===`code`?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,U.jsx)(C,{code:m,language:J})}):a===`html`?(0,U.jsx)(`div`,{style:{width:f===`mobile`?`375px`:f===`tablet`?`768px`:`100%`,maxWidth:`100%`,height:`100%`,background:`#ffffff`,borderRadius:f===`desktop`?`0px`:`var(--radius-md, 8px)`,overflow:`hidden`,boxShadow:f===`desktop`?`none`:`var(--shadow-md, 0 10px 25px rgba(0,0,0,0.5))`,border:f===`desktop`?`none`:`1px solid var(--border)`,transition:`width 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:(0,U.jsx)(`iframe`,{title:i,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`}},V)}):a===`image`||a===`svg`&&e.url?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,padding:`24px`,display:`flex`,alignItems:`center`,justifyContent:`center`,overflow:`hidden`},children:(0,U.jsx)(`img`,{ref:e=>{e&&e.complete&&e.naturalWidth&&e.naturalHeight&&z(t=>t?.width===e.naturalWidth&&t?.height===e.naturalHeight?t:{width:e.naturalWidth,height:e.naturalHeight})},src:g||e.url,alt:i,style:{width:`100%`,height:`100%`,objectFit:`contain`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth&&t.naturalHeight&&z({width:t.naturalWidth,height:t.naturalHeight})},onError:()=>E(`Unable to load image. Reload the preview or check that the file is still available.`)},V)}):a===`svg`?(0,U.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,U.jsx)(`div`,{style:{maxWidth:`90%`,maxHeight:`90%`,display:`flex`,alignItems:`center`,justifyContent:`center`},dangerouslySetInnerHTML:{__html:m}})}):a===`markdown`?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`20px 24px`,lineHeight:1.6,color:`var(--text-chat, var(--text-main))`},children:w(m)}):(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,U.jsx)(C,{code:m,language:J})})})]}):null}var H,U,W,G=t((()=>{H=e(n()),f(),k(),_(),x(),b(),P(),z(),U=r(),D(),h(),W=(0,H.lazy)(()=>g(()=>import(`./WorkspacePdfPreview-Dx_lkjNu.js`),__vite__mapDeps([2,1,3,4,5])))}));D(),G();export{V 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{L as r,Pr as i}from"./index-BmpulIkg.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:`12px`,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)(i,{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:`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:`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(),r(),o=n()}))();export{a as default};
|