@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
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { createWorkspaceMediaReader } from '../shared/utils/workspaceMedia'
|
|
2
|
+
import { createWorkspaceImageReader } from '../shared/utils/workspaceImage'
|
|
1
3
|
import { createLibraryTransport } from '../shared/library/transport'
|
|
2
4
|
import { createSourcesTransport } from '../shared/conversation/sourcesTransport'
|
|
5
|
+
import { createExternalLinkInterceptor } from '../shared/utils/externalLinks'
|
|
3
6
|
export * from '../shared/types'
|
|
4
7
|
import type { MintPlatformApi } from '../shared/platform'
|
|
5
8
|
import { createConversationTransport } from '../shared/conversation/transport'
|
|
@@ -467,6 +470,17 @@ export const { sendChatMessage, streamChatMessage } = createConversationTranspor
|
|
|
467
470
|
ownerToken: getStoredAuthToken,
|
|
468
471
|
})
|
|
469
472
|
|
|
473
|
+
export async function speechRequest(request: import('../shared/speech/types').SpeechRequest): Promise<import('../shared/speech/types').SpeechReply> {
|
|
474
|
+
if (isTauriRuntime()) {
|
|
475
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
476
|
+
return invoke('speech_request', { request })
|
|
477
|
+
}
|
|
478
|
+
const response = await authFetch(`${getLocalApiBase()}/speech`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(request) })
|
|
479
|
+
const result = await response.json()
|
|
480
|
+
if (!response.ok) throw new Error(result.error || 'Speech request failed')
|
|
481
|
+
return result
|
|
482
|
+
}
|
|
483
|
+
|
|
470
484
|
export async function getTtsUrls(text: string): Promise<TtsUrl[]> {
|
|
471
485
|
if (typeof window === 'undefined') return []
|
|
472
486
|
if (!isTauriRuntime()) return []
|
|
@@ -652,6 +666,12 @@ export async function saveInteractionAgentActivity(
|
|
|
652
666
|
await invoke('save_interaction_agent_activity', { interactionId, activity })
|
|
653
667
|
}
|
|
654
668
|
|
|
669
|
+
export async function pendingCompanionChat(acknowledgedId?: string): Promise<string | null> {
|
|
670
|
+
if (!isTauriRuntime()) return null
|
|
671
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
672
|
+
return invoke<string | null>('pending_companion_chat', { acknowledgedId: acknowledgedId ?? null })
|
|
673
|
+
}
|
|
674
|
+
|
|
655
675
|
export async function listChatSessions(): Promise<ChatSession[]> {
|
|
656
676
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
657
677
|
const API_BASE = getApiBase();
|
|
@@ -1004,7 +1024,43 @@ export function convertFileSrc(filePath: string, protocol = 'asset'): string {
|
|
|
1004
1024
|
return `https://asset.localhost/${encodeURIComponent(path)}`;
|
|
1005
1025
|
}
|
|
1006
1026
|
|
|
1027
|
+
/**
|
|
1028
|
+
* Opens an external URL in the system's default browser (via Tauri desktop action in Tauri runtime,
|
|
1029
|
+
* or window.open in fallback browser environments).
|
|
1030
|
+
*/
|
|
1031
|
+
export async function openExternal(url: string): Promise<any> {
|
|
1032
|
+
if (isTauriRuntime()) {
|
|
1033
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1034
|
+
return invoke('run_desktop_action', { action: { type: 'open_url', target: url } })
|
|
1035
|
+
}
|
|
1036
|
+
if (typeof window !== 'undefined') {
|
|
1037
|
+
return window.open(url, '_blank', 'noopener,noreferrer')
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
let activeWebLinkInterceptorCleanup: (() => void) | null = null
|
|
1042
|
+
|
|
1043
|
+
const baseInstallExternalLinkInterceptor = createExternalLinkInterceptor(openExternal)
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* Global link interceptor: Catches clicks on anchor tags pointing to external URLs
|
|
1047
|
+
* and opens them via Tauri desktop actions when running in a Tauri webview.
|
|
1048
|
+
*/
|
|
1049
|
+
export const installExternalLinkInterceptor = (
|
|
1050
|
+
targetDocument: Document | null = typeof document !== 'undefined' ? document : null
|
|
1051
|
+
): () => void => {
|
|
1052
|
+
if (!targetDocument || !isTauriRuntime()) return () => {}
|
|
1053
|
+
return baseInstallExternalLinkInterceptor(targetDocument)
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1007
1056
|
export function installTauriAdapters() {
|
|
1057
|
+
if (typeof document !== 'undefined' && isTauriRuntime()) {
|
|
1058
|
+
if (activeWebLinkInterceptorCleanup) {
|
|
1059
|
+
activeWebLinkInterceptorCleanup()
|
|
1060
|
+
}
|
|
1061
|
+
activeWebLinkInterceptorCleanup = installExternalLinkInterceptor(document)
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1008
1064
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1009
1065
|
console.warn(`Not running inside Tauri. Connecting to local API server fallback at ${getApiBase()}.`);
|
|
1010
1066
|
const API_BASE = getApiBase();
|
|
@@ -1041,9 +1097,7 @@ export function installTauriAdapters() {
|
|
|
1041
1097
|
window.location.hash = '#/';
|
|
1042
1098
|
},
|
|
1043
1099
|
quitApp: () => undefined,
|
|
1044
|
-
openExternal:
|
|
1045
|
-
window.open(url, '_blank', 'noopener,noreferrer')
|
|
1046
|
-
},
|
|
1100
|
+
openExternal: (url: string) => openExternal(url),
|
|
1047
1101
|
openFolder: async () => ({ success: false, message: 'Opening local folders is only available in the desktop app.' }),
|
|
1048
1102
|
};
|
|
1049
1103
|
|
|
@@ -1226,6 +1280,7 @@ export function installTauriAdapters() {
|
|
|
1226
1280
|
clearAiNotifications: clearBrowserNotifications,
|
|
1227
1281
|
getTtsUrls: async () => [],
|
|
1228
1282
|
setAiState: () => {},
|
|
1283
|
+
openExternal: (url: string) => openExternal(url),
|
|
1229
1284
|
};
|
|
1230
1285
|
return;
|
|
1231
1286
|
}
|
|
@@ -1271,10 +1326,7 @@ export function installTauriAdapters() {
|
|
|
1271
1326
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1272
1327
|
return void invoke('exit_app')
|
|
1273
1328
|
},
|
|
1274
|
-
openExternal:
|
|
1275
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1276
|
-
return invoke('run_desktop_action', { action: { type: 'open_url', target: url } })
|
|
1277
|
-
},
|
|
1329
|
+
openExternal: (url: string) => openExternal(url),
|
|
1278
1330
|
openFolder: async (path) => {
|
|
1279
1331
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1280
1332
|
return invoke('open_folder', { path })
|
|
@@ -1416,6 +1468,7 @@ export function installTauriAdapters() {
|
|
|
1416
1468
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1417
1469
|
return void invoke('set_ai_state', { state })
|
|
1418
1470
|
},
|
|
1471
|
+
openExternal: (url: string) => openExternal(url),
|
|
1419
1472
|
}
|
|
1420
1473
|
}
|
|
1421
1474
|
|
|
@@ -2269,6 +2322,10 @@ export async function undoGitCheckpoint(
|
|
|
2269
2322
|
}
|
|
2270
2323
|
}
|
|
2271
2324
|
|
|
2325
|
+
export const readWorkspaceMedia = createWorkspaceMediaReader({ isNative: isTauriRuntime, apiBase: getLocalApiBase, fetch: authFetch, convertFileSrc })
|
|
2326
|
+
|
|
2327
|
+
export const readWorkspaceImage = createWorkspaceImageReader({ isNative: isTauriRuntime, apiBase: getLocalApiBase, fetch: authFetch })
|
|
2328
|
+
|
|
2272
2329
|
export const readWorkspaceFile = async (path: string, workspacePath?: string): Promise<string> => {
|
|
2273
2330
|
if (!isTauriRuntime()) {
|
|
2274
2331
|
try {
|
|
@@ -2325,14 +2382,14 @@ const _apiCheck: MintPlatformApi = {
|
|
|
2325
2382
|
detectSystemTools,
|
|
2326
2383
|
sendChatMessage,
|
|
2327
2384
|
streamChatMessage,
|
|
2328
|
-
getTtsUrls,
|
|
2385
|
+
getTtsUrls, speechRequest,
|
|
2329
2386
|
cancelChatMessage,
|
|
2330
2387
|
getRecentInteractions,
|
|
2331
2388
|
getConversationSnapshot,
|
|
2332
2389
|
getConversationChanges,
|
|
2333
2390
|
saveSystemInteraction,
|
|
2334
2391
|
saveInteractionAgentActivity,
|
|
2335
|
-
listChatSessions,
|
|
2392
|
+
listChatSessions, pendingCompanionChat,
|
|
2336
2393
|
updateChatSessionWorkspace,
|
|
2337
2394
|
deleteChatSession,
|
|
2338
2395
|
renameChatSession,
|
|
@@ -2374,7 +2431,8 @@ const _apiCheck: MintPlatformApi = {
|
|
|
2374
2431
|
listGitCheckpoints,
|
|
2375
2432
|
rollbackGitCheckpoint,
|
|
2376
2433
|
undoGitCheckpoint,
|
|
2377
|
-
readWorkspaceFile,
|
|
2434
|
+
readWorkspaceFile, readWorkspaceImage, readWorkspaceMedia,
|
|
2435
|
+
openExternal,
|
|
2378
2436
|
testMcpConnection,
|
|
2379
2437
|
}
|
|
2380
2438
|
|
|
@@ -2401,12 +2459,12 @@ export async function startHtmlPreview(root: string, relativePath: string, mintB
|
|
|
2401
2459
|
}
|
|
2402
2460
|
|
|
2403
2461
|
/** Loads artifacts by ID; no server-provided filesystem path is accepted. */
|
|
2404
|
-
export async function readMcpArtifact(id: string): Promise<string> {
|
|
2462
|
+
export async function readMcpArtifact(id: string, chatId?: string): Promise<string> {
|
|
2405
2463
|
if (isTauriRuntime()) {
|
|
2406
2464
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
2407
|
-
return invoke<string>('read_mcp_artifact', { id })
|
|
2465
|
+
return invoke<string>('read_mcp_artifact', { id, chatId })
|
|
2408
2466
|
}
|
|
2409
|
-
const response = await authFetch(`${getApiBase()}/mcp-artifacts/${encodeURIComponent(id)}`)
|
|
2467
|
+
const response = await authFetch(`${getApiBase()}/mcp-artifacts/${encodeURIComponent(id)}${chatId ? `?chatId=${encodeURIComponent(chatId)}` : ''}`)
|
|
2410
2468
|
if (!response.ok) throw new Error('Artifact unavailable')
|
|
2411
2469
|
return URL.createObjectURL(await response.blob())
|
|
2412
2470
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!doctype html><html data-theme="dark"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"></head><body><div id="root"></div><script type="module" src="./browserArtifacts.browser.tsx"></script></body></html>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { createRoot } from 'react-dom/client'
|
|
3
|
+
import ChatMessageItem from '../shared/components/chat/ChatMessageItem'
|
|
4
|
+
import { installRendererPlatform, type RendererAdapter } from '../shared/platform'
|
|
5
|
+
import { compactAgentProgressForPersistence, reduceLiveAgentProgress } from '../shared/agentProgress'
|
|
6
|
+
import type { AgentProgress } from '../shared/types'
|
|
7
|
+
import '../shared/theme/tokens.css'
|
|
8
|
+
if (new URLSearchParams(location.search).get('platform') === 'desktop') {
|
|
9
|
+
await import('../src/css/app-shell.css'); await import('../src/css/chat.css')
|
|
10
|
+
} else {
|
|
11
|
+
await import('../src-web/css/app-shell.css'); await import('../src-web/css/chat.css')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const canvas = document.createElement('canvas'); canvas.width = 960; canvas.height = 600
|
|
15
|
+
const ctx = canvas.getContext('2d')!
|
|
16
|
+
ctx.fillStyle = '#102a25'; ctx.fillRect(0, 0, 960, 600)
|
|
17
|
+
ctx.fillStyle = '#94dcc1'; ctx.font = '36px sans-serif'; ctx.fillText('Search results', 48, 80)
|
|
18
|
+
ctx.fillStyle = '#d8e6e0'; ctx.font = '25px sans-serif'; ctx.fillText('ทดสอบ Mint · Matching result', 48, 165)
|
|
19
|
+
ctx.strokeStyle = '#94dcc1'; ctx.strokeRect(48, 215, 864, 320)
|
|
20
|
+
const image = canvas.toDataURL('image/png')
|
|
21
|
+
installRendererPlatform({ readMcpArtifact: async (id, chat) => {
|
|
22
|
+
if (id !== 'browser-image' || chat !== 'browser-chat') throw new Error('Artifact unavailable')
|
|
23
|
+
return image
|
|
24
|
+
} } as RendererAdapter)
|
|
25
|
+
|
|
26
|
+
const artifacts: AgentProgress = { type: 'ToolArtifacts', data: { callId: 'capture', warnings: [], artifacts: [{ id: 'browser-image', name: 'result.png', mimeType: 'image/png', kind: 'image', size: 12000, chatId: 'browser-chat', callId: 'capture', server: 'browser', metadata: { url: 'http://localhost:3000/search', width: 960, height: 600, capturedAt: '2026-10-19T10:00:00Z' } }] } }
|
|
27
|
+
const original: AgentProgress[] = [
|
|
28
|
+
{ type: 'ToolEnd', data: { action: 'browser_screenshot', callId: 'capture', input: {}, result: 'Screenshot saved as an artifact.', status: 'success' } }, artifacts,
|
|
29
|
+
// Reopening the same image should not create another gallery card.
|
|
30
|
+
{ ...artifacts, data: { ...artifacts.data, callId: 'view-again' } },
|
|
31
|
+
{ type: 'RunCompleted', data: { summary: { outcome: 'UNVERIFIED' } as any } },
|
|
32
|
+
]
|
|
33
|
+
const saved = compactAgentProgressForPersistence(Array.from({ length: 45 }, (_, index): AgentProgress => ({ type: 'ToolEnd', data: { action: 'read_file', input: { path: `file-${index}` }, result: 'Read' } })).reduce(reduceLiveAgentProgress, original))
|
|
34
|
+
const noop = () => {}
|
|
35
|
+
function Fixture() {
|
|
36
|
+
const [other, setOther] = useState(false)
|
|
37
|
+
return <>
|
|
38
|
+
<style>{`*{box-sizing:border-box}body{margin:0;padding:20px;background:#101112;color:var(--text-main);font-family:Arial,sans-serif}.fixture{max-width:760px;margin:24px auto}.fixture-controls{display:flex;gap:8px;flex-wrap:wrap}.message-bubble{width:100%}#qa-results{font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere}.mcp-artifact>span{overflow-wrap:anywhere}`}</style>
|
|
39
|
+
<div className="fixture-controls"><button id="switch-chat" onClick={() => setOther(v => !v)}>Switch conversation</button></div>
|
|
40
|
+
<div className="fixture"><ChatMessageItem interaction={{ id: other ? 8 : 7, status: 'completed', aiText: 'Search finished. Visual review remains unverified.', userText: 'เปิดเว็บ กรอกคำค้น แล้วแคปผลให้ดู', createdAt: '2026-10-19T10:00:00Z', agentActivity: other ? [] : JSON.parse(JSON.stringify(saved)) }} copiedId={null} speakingText={null} agentActivitySnapshots={{}} thinkingExpanded={{}} onThinkingExpandedChange={noop} handleCopyMessage={noop} speak={noop} toggleActivity={noop} renderFileChanges={() => null} /></div>
|
|
41
|
+
<pre id="qa-results">Running…</pre>
|
|
42
|
+
</>
|
|
43
|
+
}
|
|
44
|
+
createRoot(document.getElementById('root')!).render(<Fixture />)
|
|
45
|
+
const delay = () => new Promise(resolve => setTimeout(resolve, 40))
|
|
46
|
+
async function waitFor(check: () => boolean, label: string) { for (let i = 0; i < 100; i++) { if (check()) return; await delay() } throw new Error(label) }
|
|
47
|
+
const results: string[] = []
|
|
48
|
+
function check(value: unknown, label: string) { if (!value) throw new Error(label); results.push(`PASS ${label}`) }
|
|
49
|
+
async function run() {
|
|
50
|
+
await waitFor(() => !!document.querySelector<HTMLImageElement>('.mcp-image-button img')?.naturalWidth, 'artifact image loads')
|
|
51
|
+
check(document.querySelectorAll('.mcp-image-button').length === 1, 'reopened artifact is shown once')
|
|
52
|
+
check(document.querySelector('[data-completion-status="unverified"]'), 'unverified state survives history serialization')
|
|
53
|
+
check(!document.querySelector('.agent-activity-toggle[aria-expanded="true"]'), 'image is visible with Activity collapsed')
|
|
54
|
+
const download = document.querySelector<HTMLAnchorElement>('a[download="result.png"]')
|
|
55
|
+
check(download?.href.startsWith('data:image/png'), 'original image has a download link')
|
|
56
|
+
document.querySelector<HTMLButtonElement>('.mcp-image-button')!.click()
|
|
57
|
+
await waitFor(() => !!document.querySelector('dialog[open]'), 'image expands')
|
|
58
|
+
check(document.querySelector('dialog[open] img'), 'expanded image is present')
|
|
59
|
+
document.querySelector<HTMLButtonElement>('dialog[open] button')!.click()
|
|
60
|
+
await waitFor(() => !document.querySelector('dialog[open]'), 'image closes')
|
|
61
|
+
document.querySelector<HTMLButtonElement>('#switch-chat')!.click()
|
|
62
|
+
await waitFor(() => !document.querySelector('.mcp-image-button'), 'other chat has no previous images')
|
|
63
|
+
document.querySelector<HTMLButtonElement>('#switch-chat')!.click()
|
|
64
|
+
await waitFor(() => !!document.querySelector<HTMLImageElement>('.mcp-image-button img')?.naturalWidth, 'saved image returns')
|
|
65
|
+
check(document.documentElement.scrollWidth <= innerWidth, 'cards fit the viewport')
|
|
66
|
+
document.getElementById('qa-results')!.textContent = results.join('\n') + '\nALL PASS'
|
|
67
|
+
}
|
|
68
|
+
run().catch(error => { document.getElementById('qa-results')!.textContent = `FAIL ${error.message}\n${results.join('\n')}` })
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!doctype html><html><head><meta charset="utf-8"><title>Chat Escape regression</title></head><body><div id="root"></div><pre id="result">RUNNING</pre><script type="module" src="./chatEscape.browser.tsx"></script></body></html>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { createRoot } from 'react-dom/client'
|
|
3
|
+
import ChatPanel from '../shared/components/chat/ChatPanel'
|
|
4
|
+
import { chatPanelFixture } from './chatPanelFixture'
|
|
5
|
+
import { installRendererPlatform } from '../shared/platform'
|
|
6
|
+
import * as webAdapter from '../src-web/tauri'
|
|
7
|
+
installRendererPlatform(webAdapter)
|
|
8
|
+
let cancellations = 0
|
|
9
|
+
const fixture = chatPanelFixture()
|
|
10
|
+
createRoot(document.getElementById('root')!).render(<>
|
|
11
|
+
<ChatPanel {...fixture as any} conversation={{ ...fixture.conversation, sending: true }} actions={{ ...fixture.actions, onCancelMessage: () => cancellations++ }} tools={{ ...fixture.tools, open: true }} />
|
|
12
|
+
<aside className="tool-surface-page"><button id="tool-control">Tool control</button></aside>
|
|
13
|
+
</>)
|
|
14
|
+
async function run() {
|
|
15
|
+
for (let i = 0; i < 100 && !document.getElementById('chat-input'); i++) await new Promise(resolve => setTimeout(resolve, 40))
|
|
16
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
17
|
+
const composer = document.getElementById('chat-input')!
|
|
18
|
+
composer.focus()
|
|
19
|
+
composer.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true, cancelable: true }))
|
|
20
|
+
if (cancellations !== 1) throw Error('Escape from chat must cancel while Tools is open')
|
|
21
|
+
document.getElementById('tool-control')!.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true, cancelable: true }))
|
|
22
|
+
if (cancellations !== 1) throw Error('Escape inside Tools must not cancel chat')
|
|
23
|
+
document.getElementById('result')!.textContent = JSON.stringify({ status: 'PASS', checks: ['chat Escape cancels with Tools open', 'Tools Escape leaves generation running'] })
|
|
24
|
+
}
|
|
25
|
+
run().catch(error => { document.getElementById('result')!.textContent = JSON.stringify({ status: 'FAIL', error: String(error) }) })
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<body><div id="root"></div><pre id="result">RUNNING</pre><script type="module">
|
|
3
3
|
import React, { useRef, useState } from 'react';
|
|
4
4
|
import { createRoot } from 'react-dom/client';
|
|
5
|
-
import { VirtualChatHistory } from '../shared/components/VirtualChatHistory';
|
|
5
|
+
import { VirtualChatHistory } from '../shared/components/chat/VirtualChatHistory';
|
|
6
6
|
const h = React.createElement;
|
|
7
7
|
const runtimeErrors = [];
|
|
8
8
|
window.addEventListener('error', event => runtimeErrors.push(event.message));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html><html><head><meta charset="utf-8"><title>Collapsed paste input</title></head><body><div id="root"></div><pre id="result">RUNNING</pre><script type="module">
|
|
2
2
|
import React, { useRef, useState } from 'react';
|
|
3
3
|
import { createRoot } from 'react-dom/client';
|
|
4
|
-
import { CollapsiblePasteInput } from '../shared/components/CollapsiblePasteInput';
|
|
4
|
+
import { CollapsiblePasteInput } from '../shared/components/chat/CollapsiblePasteInput';
|
|
5
5
|
const desktop = new URLSearchParams(location.search).get('surface') === 'desktop';
|
|
6
6
|
if (desktop) await import('../src/css/chat.css'); else await import('../src-web/css/chat.css');
|
|
7
7
|
const submitted = [];
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
<body><div id="menu-fixture"></div><pre id="result">RUNNING</pre><script type="module">
|
|
3
3
|
import React, { useRef, useState } from 'react';
|
|
4
4
|
import { createRoot } from 'react-dom/client';
|
|
5
|
-
import SlashSuggestions from '../shared/components/SlashSuggestions';
|
|
6
|
-
import SlashChoicePanel from '../shared/components/SlashChoicePanel';
|
|
7
|
-
import ModelSelectorPopover from '../shared/components/ModelSelectorPopover';
|
|
5
|
+
import SlashSuggestions from '../shared/components/chat/SlashSuggestions';
|
|
6
|
+
import SlashChoicePanel from '../shared/components/chat/SlashChoicePanel';
|
|
7
|
+
import ModelSelectorPopover from '../shared/components/chat/ModelSelectorPopover';
|
|
8
8
|
const params = new URLSearchParams(location.search);
|
|
9
9
|
const desktop = params.get('surface') === 'desktop';
|
|
10
10
|
await import('../shared/theme/tokens.css');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html><html><head><meta charset="utf-8"><title>Context compaction status</title></head><body style="background:#111;color:#eee;font-family:system-ui"><div id="root"></div><pre id="result">RUNNING</pre><script type="module">
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { createRoot } from 'react-dom/client';
|
|
4
|
-
import { ContextCompactionStatus } from '../shared/components/ContextCompactionStatus';
|
|
4
|
+
import { ContextCompactionStatus } from '../shared/components/chat/ContextCompactionStatus';
|
|
5
5
|
import '../shared/css/thinking-status.css';
|
|
6
6
|
document.documentElement.style.setProperty('--text-main','#eeeeee');
|
|
7
7
|
document.documentElement.style.setProperty('--text-muted','#71717a');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!doctype html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><title>Error recovery regression</title></head><body style="margin:0"><div id="root"></div><pre id="result">RUNNING</pre><script type="module">
|
|
2
|
-
import React from 'react';import {createRoot} from 'react-dom/client';import ChunkErrorBoundary from '../shared/components/ChunkErrorBoundary';
|
|
2
|
+
import React from 'react';import {createRoot} from 'react-dom/client';import ChunkErrorBoundary from '../shared/components/app/ChunkErrorBoundary';
|
|
3
3
|
const wait=ms=>new Promise(r=>setTimeout(r,ms)),results=[];const assert=(ok,msg)=>{if(!ok)throw Error(msg);results.push(msg)};
|
|
4
4
|
let fail=true,micRequests=0;Object.defineProperty(navigator,'mediaDevices',{configurable:true,value:{getUserMedia:async()=>{micRequests++;throw Error('Error page must not request microphone')}}});
|
|
5
5
|
function BrokenRoute(){if(fail)throw Error('Fixture route failed to render');return React.createElement('h1',null,'Recovered chat')}
|
|
Binary file
|
|
@@ -8,8 +8,7 @@ const results=[];
|
|
|
8
8
|
const wait=(ms=60)=>new Promise(resolve=>setTimeout(resolve,ms));
|
|
9
9
|
const assert=(ok,message)=>{if(!ok)throw new Error(message);results.push(message)};
|
|
10
10
|
try {
|
|
11
|
-
const {default:SelectField}=await import('../shared/components/SelectField');
|
|
12
|
-
const {default:GlideSelect}=await import('../shared/components/GlideSelect');
|
|
11
|
+
const {default:SelectField, GlideSelect}=await import('../shared/components/ui/SelectField');
|
|
13
12
|
const picks=[];
|
|
14
13
|
function Fixture(){
|
|
15
14
|
const [value,setValue]=React.useState('png');
|
|
@@ -5,7 +5,7 @@ import {createRoot} from 'react-dom/client';
|
|
|
5
5
|
import AudioTab from '../shared/components/Settings/AudioTab';
|
|
6
6
|
import {DEFAULT_CONFIG} from '../shared/constants/config';
|
|
7
7
|
import '../shared/theme/tokens.css';
|
|
8
|
-
import '../
|
|
8
|
+
import '../shared/css/settings/base.css';
|
|
9
9
|
import '../shared/css/settings/general.css';
|
|
10
10
|
import '../src-web/css/settings/mobile.css';
|
|
11
11
|
function App(){
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import {createRoot} from 'react-dom/client'
|
|
3
|
-
import LibraryPage from '../shared/components/LibraryPage'
|
|
3
|
+
import LibraryPage from '../shared/components/studio/LibraryPage'
|
|
4
4
|
import {installRendererPlatform,type RendererAdapter} from '../shared/platform'
|
|
5
5
|
import type {LibraryItem,LibraryQuery} from '../shared/types'
|
|
6
6
|
let failAction=false;let offline=false;let openChat='';let contentReads=0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><title>Live orb regression</title></head>
|
|
2
2
|
<body><button id="launcher">Live</button><div id="chat-host" style="position:absolute;left:80px;top:140px;width:260px;height:160px;transform:translateZ(0);overflow:hidden"><div id="root"></div></div><pre id="result">RUNNING</pre><script type="module">
|
|
3
3
|
import React from 'react';import {createRoot} from 'react-dom/client';
|
|
4
|
-
import GeminiLiveOverlay from '../shared/components/GeminiLiveOverlay';
|
|
4
|
+
import GeminiLiveOverlay from '../shared/components/chat/GeminiLiveOverlay';
|
|
5
5
|
import {VoicePoweredOrb} from '../shared/components/ui/voice-powered-orb';
|
|
6
6
|
import '@fontsource/prompt/400.css';import '@fontsource/prompt/500.css';
|
|
7
7
|
import '../shared/theme/tokens.css';import '../src-web/css/app-shell.css';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Small valid documents/media for the real browser decoders; no runtime mocks for rendering. */
|
|
2
|
+
export function samplePdf(): Uint8Array<ArrayBuffer> {
|
|
3
|
+
const objects = [
|
|
4
|
+
'<< /Type /Catalog /Pages 2 0 R >>',
|
|
5
|
+
'<< /Type /Pages /Kids [3 0 R 5 0 R] /Count 2 >>',
|
|
6
|
+
'<< /Type /Page /Parent 2 0 R /MediaBox [0 0 300 400] /Resources << /Font << /F1 7 0 R >> >> /Contents 4 0 R >>',
|
|
7
|
+
'',
|
|
8
|
+
'<< /Type /Page /Parent 2 0 R /MediaBox [0 0 300 400] /Resources << /Font << /F1 7 0 R >> >> /Contents 6 0 R >>',
|
|
9
|
+
'',
|
|
10
|
+
'<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>',
|
|
11
|
+
]
|
|
12
|
+
for (const [index, label] of [[3, 'Media PDF page one'], [5, 'Media PDF page two']] as const) {
|
|
13
|
+
const content = `BT /F1 18 Tf 35 300 Td (${label}) Tj ET`
|
|
14
|
+
objects[index] = `<< /Length ${content.length} >>\nstream\n${content}\nendstream`
|
|
15
|
+
}
|
|
16
|
+
let data = '%PDF-1.4\n'
|
|
17
|
+
const offsets = [0]
|
|
18
|
+
objects.forEach((object, index) => { offsets.push(data.length); data += `${index + 1} 0 obj\n${object}\nendobj\n` })
|
|
19
|
+
const crossref = data.length
|
|
20
|
+
data += `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`
|
|
21
|
+
data += offsets.slice(1).map(offset => `${String(offset).padStart(10, '0')} 00000 n \n`).join('')
|
|
22
|
+
data += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${crossref}\n%%EOF`
|
|
23
|
+
return new TextEncoder().encode(data)
|
|
24
|
+
}
|
|
25
|
+
export function sampleWav(): ArrayBuffer {
|
|
26
|
+
const samples = 8000, buffer = new ArrayBuffer(44 + samples * 2), view = new DataView(buffer)
|
|
27
|
+
const text = (offset: number, value: string) => [...value].forEach((letter, index) => view.setUint8(offset + index, letter.charCodeAt(0)))
|
|
28
|
+
text(0, 'RIFF'); view.setUint32(4, buffer.byteLength - 8, true); text(8, 'WAVE'); text(12, 'fmt ')
|
|
29
|
+
view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, 1, true); view.setUint32(24, 8000, true); view.setUint32(28, 16000, true); view.setUint16(32, 2, true); view.setUint16(34, 16, true); text(36, 'data'); view.setUint32(40, samples * 2, true)
|
|
30
|
+
for (let i = 0; i < samples; i++) view.setInt16(44 + i * 2, Math.sin(i * Math.PI * 2 * 220 / 8000) * 3000, true)
|
|
31
|
+
return buffer
|
|
32
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html><html><head><meta charset="utf-8"><title>Mod input synchronization</title></head><body><div id="root"></div><pre id="result">RUNNING</pre><script type="module">
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { createRoot } from 'react-dom/client';
|
|
4
|
-
import { ModUi } from '../shared/components/
|
|
4
|
+
import { ModUi } from '../shared/components/extensions/ModsPanel';
|
|
5
5
|
const root = createRoot(document.getElementById('root'));
|
|
6
6
|
const submitted = [];
|
|
7
7
|
const render = value => root.render(React.createElement(ModUi, { node: { type: 'input', label: 'Draft', action: 'save', value }, onAction: (action, value) => submitted.push([action, value]) }));
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
2
|
import { createRoot } from 'react-dom/client'
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import ToolSurfacePage from '../shared/components/workspace/ToolSurfacePage'
|
|
4
|
+
import ToolsPanelToggle from '../shared/components/workspace/ToolsPanelToggle'
|
|
5
|
+
import { useSessionSources } from '../shared/utils/useSessionSources'
|
|
6
|
+
import SessionSources from '../shared/components/workspace/SessionSources'
|
|
5
7
|
import { installRendererPlatform, installWorkspacePlatform, type RendererAdapter, type WorkspacePlatform } from '../shared/platform'
|
|
6
8
|
import type { ConversationSources } from '../shared/types'
|
|
7
9
|
import { sourceAttachments } from '../shared/utils/sourceAttachments'
|
|
@@ -30,9 +32,24 @@ installWorkspacePlatform({ getGitBranchInfo: async () => ({ isRepository: true,
|
|
|
30
32
|
|
|
31
33
|
function Fixture() {
|
|
32
34
|
const [chatId, setChatId] = useState('A')
|
|
35
|
+
const [open, setOpen] = useState(false)
|
|
36
|
+
const [selected, setSelected] = useState(false)
|
|
37
|
+
const session = useSessionSources(chatId, [], open)
|
|
38
|
+
const noop = () => {}
|
|
39
|
+
const close = () => { setOpen(false); requestAnimationFrame(() => document.querySelector<HTMLButtonElement>('.tools-panel-toggle')?.focus()) }
|
|
40
|
+
const desktop = location.pathname.includes('sessionSources')
|
|
41
|
+
|
|
33
42
|
return <>
|
|
34
|
-
<style>{`*{box-sizing:border-box}body{margin:0;background:#111113;color:#e8eaed;font-family:Arial,sans-serif;--text-main:#e8eaed;--text-secondary:#c5cad1;--text-muted:#8b939f;--bg-overlay:#111113;--surface-strong:#25262b;--border:#33353b;--accent:#7edbb5;--border-subtle:#27292d;--bg-surface-soft:#1a1b20;--bg-surface-hover:#22242a}.fixture-bar{display:flex;align-items:center;justify-content:flex-end;gap:12px;height:50px;padding:8px 16px;border-bottom:1px solid #33353b}#qa-results{position:fixed;bottom:6px;left:8px;max-width:calc(100vw - 16px);font-size:10px;white-space:pre-wrap;pointer-events:none}`}</style>
|
|
35
|
-
<header className="fixture-bar"><span>Session sources fixture</span><button id="switch-chat" onClick={() => setChatId(id => id === 'A' ? 'B' : 'A')}>Switch session</button><
|
|
43
|
+
<style>{`*{box-sizing:border-box}html,body,#root{width:100%;height:100%;overflow:hidden}.assistant-workspace{flex:1;min-width:0}body{margin:0;background:#111113;color:#e8eaed;font-family:Arial,sans-serif;--text-main:#e8eaed;--text-secondary:#c5cad1;--text-muted:#8b939f;--bg-overlay:#111113;--surface-strong:#25262b;--border:#33353b;--accent:#7edbb5;--border-subtle:#27292d;--bg-surface-soft:#1a1b20;--bg-surface-hover:#22242a}.fixture-bar{display:flex;align-items:center;justify-content:flex-end;gap:12px;height:50px;padding:8px 16px;border-bottom:1px solid #33353b}#qa-results{position:fixed;bottom:6px;left:8px;max-width:calc(100vw - 16px);font-size:10px;white-space:pre-wrap;pointer-events:none}`}</style>
|
|
44
|
+
<header className="fixture-bar"><span>Session sources fixture</span><button id="switch-chat" onClick={() => setChatId(id => id === 'A' ? 'B' : 'A')}>Switch session</button><ToolsPanelToggle open={open} count={0} onToggle={() => setOpen(v => !v)} /></header>
|
|
45
|
+
<div className={`app-body ${open ? 'tool-surface-active' : ''}`} style={{ position: 'relative', height: 'calc(100dvh - 50px)', display: 'flex' }}>
|
|
46
|
+
<main className="assistant-workspace"><h1>Conversation</h1><textarea aria-label="Message" defaultValue="Keep my draft" /></main>
|
|
47
|
+
{open && <ToolSurfacePage surfaces={selected ? [{ id: 'sources', kind: 'sources', title: 'Sources' }] : []} activeSurfaceId={selected ? 'sources' : null} terminalSize={440} desktopTools={desktop}
|
|
48
|
+
sourceCount={session.sources.length} onOpenSources={() => setSelected(true)}
|
|
49
|
+
sourcesContent={<SessionSources key={chatId} {...session} onRetry={session.retry} onOpenLibrary={url => { window.history.pushState({}, '', url); window.dispatchEvent(new PopStateEvent('popstate')); close() }} />}
|
|
50
|
+
onSelect={noop} onClose={() => setSelected(false)} onCloseAll={() => setSelected(false)} onDuplicate={noop} onRename={noop} onCloseOthers={noop} onResizeTerminal={noop} onResizePanel={noop}
|
|
51
|
+
onOpenTerminal={noop} onOpenBrowser={noop} onOpenReview={noop} onOpenFiles={noop} onOpenMods={noop} onOpenBackgroundTasks={noop} onModsPanelTarget={noop} onBackgroundPanelTarget={noop} onClosePanel={close} />}
|
|
52
|
+
</div>
|
|
36
53
|
<pre id="qa-results">Running…</pre>
|
|
37
54
|
</>
|
|
38
55
|
}
|
|
@@ -43,27 +60,50 @@ const results: string[] = []
|
|
|
43
60
|
const check = (condition: unknown, name: string) => { if (!condition) throw new Error(name); results.push(`PASS ${name}`) }
|
|
44
61
|
function click(selector: string) { const target = document.querySelector<HTMLElement>(selector); if (!target) throw new Error(`Missing ${selector}`); target.click() }
|
|
45
62
|
async function run() {
|
|
46
|
-
await waitFor(() => Boolean(document.querySelector('.
|
|
47
|
-
|
|
63
|
+
await waitFor(() => Boolean(document.querySelector('.tools-panel-toggle')), 'Tools trigger')
|
|
64
|
+
check(!document.querySelector('.session-sources-toggle'), 'standalone Sources button is removed')
|
|
65
|
+
click('.tools-panel-toggle')
|
|
66
|
+
await waitFor(() => document.querySelector('[aria-label="9 session sources"]'), 'Sources count')
|
|
67
|
+
check(true, 'Tools launcher shows the current session source count')
|
|
68
|
+
click('[title="Session sources"]')
|
|
48
69
|
await waitFor(() => Boolean(document.querySelector('.session-source-row')), 'Saved sources')
|
|
49
|
-
check(document.querySelectorAll('.session-source-row').length ===
|
|
70
|
+
check(document.querySelectorAll('.session-source-row').length === 9, 'all session sources are visible without expanding')
|
|
50
71
|
check(document.querySelector<HTMLAnchorElement>('.session-source-row[href^="/library"]')?.getAttribute('href') === '/library?item=reference-item', 'source image links to its Library original')
|
|
51
72
|
check(document.querySelector('.session-source-icon img'), 'sent image has a thumbnail')
|
|
52
73
|
check(preview[0].name === 'reference.png' && (preview[0].thumbnailDataUri?.length || 0) < 262144, 'thumbnail generation preserves name and bounds payload size')
|
|
53
74
|
check(document.querySelector('.session-sources')?.textContent?.includes('Math-Data-Science-Exam.pdf'), 'sent document appears with filename')
|
|
54
75
|
if (location.search.includes('preview')) { document.getElementById('qa-results')!.textContent = ''; return }
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
76
|
+
check(!document.querySelector('.session-sources-more'), 'Sources does not hide items behind Show more')
|
|
77
|
+
check([...document.querySelectorAll('.session-sources-group h3')].map(el => el.textContent).join('|') === 'Images1|Files6|Web searches2', 'group headings show their counts')
|
|
78
|
+
const search = document.querySelector<HTMLInputElement>('[aria-label="Search Sources"]')!
|
|
79
|
+
check(search, 'larger source collections offer search')
|
|
80
|
+
const enterSearch = async (value: string) => {
|
|
81
|
+
Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')!.set!.call(search, value)
|
|
82
|
+
search.dispatchEvent(new Event('input', { bubbles: true }))
|
|
83
|
+
await delay()
|
|
84
|
+
}
|
|
85
|
+
await enterSearch('LEAST_SQUARES')
|
|
86
|
+
check(document.querySelectorAll('.session-source-row').length === 1 && document.querySelector('.session-source-row')?.textContent?.includes('02_least_squares'), 'search filters names without case sensitivity')
|
|
87
|
+
await enterSearch('docs.example.com')
|
|
88
|
+
check(document.querySelectorAll('.session-source-row').length === 1, 'search filters domains')
|
|
89
|
+
await enterSearch('no-such-source')
|
|
90
|
+
check(document.querySelector('.session-sources-empty')?.textContent?.includes('No sources match'), 'unmatched search explains its empty result')
|
|
91
|
+
await enterSearch('')
|
|
92
|
+
check(document.querySelectorAll('.session-source-row').length === 9, 'clearing search restores every source')
|
|
93
|
+
const titleStyle = getComputedStyle(document.querySelector('.session-source-copy strong')!)
|
|
94
|
+
check(titleStyle.webkitLineClamp === '2' && titleStyle.whiteSpace === 'normal', 'source titles allow two lines')
|
|
58
95
|
check(document.querySelector<HTMLAnchorElement>('.session-source-row[href^="https:"]')?.href === 'https://example.com/regression', 'historical web searches link to source pages')
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
check(
|
|
96
|
+
document.getAnimations().forEach(animation => animation.finish())
|
|
97
|
+
await delay()
|
|
98
|
+
check(document.documentElement.scrollWidth <= innerWidth, 'Tools does not overflow the page')
|
|
99
|
+
const popover = document.querySelector<HTMLElement>('.tool-surface-sources')!
|
|
100
|
+
check(popover.getBoundingClientRect().right <= innerWidth && popover.getBoundingClientRect().left >= 0, 'Sources tool fits viewport')
|
|
101
|
+
check(getComputedStyle(popover).overflowY === 'auto', 'Sources tool can scroll')
|
|
62
102
|
fail = true; await waitFor(() => Boolean(document.querySelector('.session-sources-error')), 'Error state')
|
|
63
103
|
check(document.querySelectorAll('.session-source-row').length === 9, 'refresh error preserves known sources')
|
|
64
104
|
fail = false; click('.session-sources-error button'); await waitFor(() => !document.querySelector('.session-sources-error'), 'Retry')
|
|
65
105
|
check(true, 'retry recovers')
|
|
66
|
-
deferA = true; click('.
|
|
106
|
+
deferA = true; click('.tools-panel-toggle'); await delay(); click('.tools-panel-toggle'); await waitFor(() => Boolean(resolveA), 'Pending A request')
|
|
67
107
|
click('#switch-chat'); await waitFor(() => Boolean(document.querySelector('.session-sources-empty')), 'Empty B')
|
|
68
108
|
resolveA!(data); await delay()
|
|
69
109
|
check(document.querySelectorAll('.session-source-row').length === 0, 'late response cannot leak another session sources')
|
|
@@ -82,7 +122,14 @@ async function run() {
|
|
|
82
122
|
document.removeEventListener('click',suppressReload)
|
|
83
123
|
check(preventedByComponent && navigated, 'Library source navigation preserves the live application and composer')
|
|
84
124
|
window.removeEventListener('popstate',navigation)
|
|
85
|
-
await waitFor(()=>!document.querySelector('.
|
|
125
|
+
await waitFor(()=>!document.querySelector('.tool-surface-page'),'Source navigation closes Tools')
|
|
126
|
+
check(document.querySelector<HTMLTextAreaElement>('textarea')?.value === 'Keep my draft', 'Library navigation preserves the draft')
|
|
127
|
+
click('.tools-panel-toggle'); await waitFor(() => Boolean(document.querySelector('.tool-surface-sources')), 'Sources reopens')
|
|
128
|
+
document.querySelector<HTMLButtonElement>('[role="tab"]')!.focus()
|
|
129
|
+
document.activeElement!.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))
|
|
130
|
+
await waitFor(() => !document.querySelector('.tool-surface-page'), 'Escape closes Sources tool')
|
|
131
|
+
await waitFor(() => document.activeElement === document.querySelector('.tools-panel-toggle'), 'Escape restores focus to Tools')
|
|
132
|
+
check(true, 'Escape restores focus to Tools')
|
|
86
133
|
const iconFixture = document.createElement('div')
|
|
87
134
|
document.body.append(iconFixture)
|
|
88
135
|
const iconRoot = createRoot(iconFixture)
|
|
@@ -102,6 +149,20 @@ async function run() {
|
|
|
102
149
|
await waitFor(() => Boolean(iconFixture.querySelector('[href="https://example.com/with-icon"] .is-web svg')), 'Late favicon failure falls back')
|
|
103
150
|
check(Boolean(iconFixture.querySelector('[href="https://example.com/with-icon"]')), 'favicon failure preserves the source link')
|
|
104
151
|
iconRoot.unmount(); iconFixture.remove()
|
|
152
|
+
let openedArtifact: any = null
|
|
153
|
+
const artifactFixture = document.createElement('div')
|
|
154
|
+
document.body.append(artifactFixture)
|
|
155
|
+
const artifactRoot = createRoot(artifactFixture)
|
|
156
|
+
artifactRoot.render(<SessionSources sources={[
|
|
157
|
+
{ id: 'img-1', kind: 'image', name: 'photo.png', detail: 'Image', thumbnailDataUri: originalImage },
|
|
158
|
+
]} loading={false} error="" onRetry={() => {}} onOpenLibrary={() => {}} onOpenArtifact={art => { openedArtifact = art }} />)
|
|
159
|
+
await waitFor(() => Boolean(artifactFixture.querySelector('.session-source-row')), 'Image row ready')
|
|
160
|
+
const imgRow = artifactFixture.querySelector<HTMLAnchorElement>('.session-source-row')!
|
|
161
|
+
check(imgRow.getAttribute('title')?.includes('Open image preview in Tools'), 'image source row indicates tool preview')
|
|
162
|
+
imgRow.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, button: 0 }))
|
|
163
|
+
await waitFor(() => Boolean(openedArtifact), 'Image opens via onOpenArtifact')
|
|
164
|
+
check(openedArtifact?.type === 'image' && openedArtifact?.path === 'sources/img-1/photo.png', 'image opens as artifact preview')
|
|
165
|
+
artifactRoot.unmount(); artifactFixture.remove()
|
|
105
166
|
document.getElementById('qa-results')!.textContent = results.join('\n') + '\nALL PASSED'
|
|
106
167
|
}
|
|
107
168
|
run().catch(error => { document.getElementById('qa-results')!.textContent = results.join('\n') + `\nFAIL ${error.message}` })
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
2
|
import { createRoot } from 'react-dom/client'
|
|
3
|
-
import ToolSurfacePage, { type ToolSurface } from '../shared/components/ToolSurfacePage'
|
|
4
|
-
import ToolsPanelToggle from '../shared/components/ToolsPanelToggle'
|
|
5
|
-
import { ModsPanel } from '../shared/components/ModsPanel'
|
|
6
|
-
import { BackgroundTerminals } from '../shared/components/BackgroundTerminals'
|
|
3
|
+
import ToolSurfacePage, { type ToolSurface } from '../shared/components/workspace/ToolSurfacePage'
|
|
4
|
+
import ToolsPanelToggle from '../shared/components/workspace/ToolsPanelToggle'
|
|
5
|
+
import { ModsPanel } from '../shared/components/extensions/ModsPanel'
|
|
6
|
+
import { BackgroundTerminals } from '../shared/components/workspace/BackgroundTerminals'
|
|
7
7
|
import { installRendererPlatform, type RendererAdapter } from '../shared/platform'
|
|
8
8
|
import type { BackgroundJob } from '../shared/types'
|
|
9
9
|
|
|
@@ -51,7 +51,7 @@ function Fixture() {
|
|
|
51
51
|
<main className="assistant-workspace"><h1>Conversation</h1><p>{workspace}</p><div className="fixture-composer"><ModsPanel workspacePath={workspace} chatId="chat-a" panelTarget={modsTarget} onOpen={() => utility('mods')} /><textarea aria-label="Message" placeholder="Ask Mint…" /></div></main>
|
|
52
52
|
{open && <ToolSurfacePage surfaces={surfaces} activeSurfaceId={active} workspacePath={workspace} terminalSize={440} desktopTools={desktop} backgroundTaskCount={count}
|
|
53
53
|
onSelect={setActive} onClose={id => { setSurfaces(s => s.filter(v => v.id !== id)); setActive(null) }} onCloseAll={noop} onDuplicate={noop} onRename={noop} onCloseOthers={noop} onResizeTerminal={noop} onResizePanel={noop}
|
|
54
|
-
onOpenTerminal={noop} onOpenBrowser={noop} onOpenReview={noop} onOpenFiles={noop} onOpenMods={() => utility('mods')} onOpenBackgroundTasks={() => utility('background')} onModsPanelTarget={setModsTarget} onBackgroundPanelTarget={setTasksTarget} onClosePanel={() => setOpen(false)} />}
|
|
54
|
+
onOpenSources={noop} onOpenTerminal={noop} onOpenBrowser={noop} onOpenReview={noop} onOpenFiles={noop} onOpenMods={() => utility('mods')} onOpenBackgroundTasks={() => utility('background')} onModsPanelTarget={setModsTarget} onBackgroundPanelTarget={setTasksTarget} onClosePanel={() => setOpen(false)} />}
|
|
55
55
|
<BackgroundTerminals workspacePath={workspace} panelTarget={tasksTarget} onCountChange={setCount} />
|
|
56
56
|
</div>
|
|
57
57
|
<pre id="qa-results">Running…</pre>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
2
|
import { createRoot } from 'react-dom/client'
|
|
3
|
-
import ChatMessageItem from '../shared/components/ChatMessageItem'
|
|
4
|
-
import { ProgressActivity } from '../shared/components/
|
|
5
|
-
import ViewedImages from '../shared/components/ViewedImages'
|
|
3
|
+
import ChatMessageItem from '../shared/components/chat/ChatMessageItem'
|
|
4
|
+
import { ProgressActivity } from '../shared/components/activity/AgentActivityDrawer'
|
|
5
|
+
import ViewedImages from '../shared/components/activity/ViewedImages'
|
|
6
6
|
import type { AgentProgress } from '../shared/types'
|
|
7
7
|
import { compactAgentProgressForPersistence, reduceLiveAgentProgress } from '../shared/agentProgress'
|
|
8
8
|
import '../shared/theme/tokens.css'
|