@pheem49/mint 1.14.0 → 1.16.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 +1258 -35
- package/Cargo.toml +5 -2
- package/LICENSE +21 -654
- package/README.md +93 -756
- package/Release_Note.md +53 -446
- package/apps/mint-companion/src-tauri/Cargo.toml +20 -0
- package/apps/mint-companion/src-tauri/build.rs +3 -0
- package/apps/mint-companion/src-tauri/src/main.rs +468 -0
- package/apps/mint-companion/tsconfig.json +20 -0
- package/apps/mint-companion/vite.config.ts +3 -0
- package/components.json +19 -0
- package/crates/mint-cli/Cargo.toml +9 -1
- package/crates/mint-cli/src/agent/approval_prompts.rs +16 -3
- package/crates/mint-cli/src/agent/live_status.rs +545 -148
- package/crates/mint-cli/src/agent/markdown_render.rs +601 -61
- package/crates/mint-cli/src/agent.rs +723 -258
- package/crates/mint-cli/src/commands/agent.rs +83 -74
- package/crates/mint-cli/src/commands/eval.rs +9 -5
- package/crates/mint-cli/src/commands/git.rs +204 -0
- package/crates/mint-cli/src/commands/integrations.rs +35 -0
- package/crates/mint-cli/src/commands/knowledge.rs +13 -32
- package/crates/mint-cli/src/commands/mod.rs +81 -2
- package/crates/mint-cli/src/commands/tailnet_web.rs +235 -0
- package/crates/mint-cli/src/image.rs +32 -11
- package/crates/mint-cli/src/interactive/chat_tui.rs +7853 -0
- package/crates/mint-cli/src/interactive/command_ui.rs +477 -0
- package/crates/mint-cli/src/interactive/format.rs +8 -0
- package/crates/mint-cli/src/interactive/input_box.rs +94 -8
- package/crates/mint-cli/src/interactive/picker.rs +180 -37
- package/crates/mint-cli/src/interactive/resume_picker.rs +686 -0
- package/crates/mint-cli/src/interactive/slash_commands.rs +1071 -501
- package/crates/mint-cli/src/interactive/thought_viewer.rs +286 -0
- package/crates/mint-cli/src/interactive/tool_activity.rs +328 -0
- package/crates/mint-cli/src/interactive.rs +454 -166
- package/crates/mint-cli/src/main.rs +93 -26
- package/crates/mint-cli/src/markdown.rs +12 -5
- package/crates/mint-cli/src/mcp.rs +5 -0
- package/crates/mint-cli/src/mod_host.rs +6 -0
- package/crates/mint-cli/src/mods_cli.rs +62 -0
- package/crates/mint-cli/src/mods_ui.rs +187 -0
- package/crates/mint-cli/src/onboard.rs +37 -61
- package/crates/mint-cli/src/plugins_cli.rs +8 -5
- package/crates/mint-cli/src/setup.rs +10 -8
- package/crates/mint-cli/src/terminal_theme.rs +189 -0
- package/crates/mint-cli/src/updater.rs +112 -23
- package/crates/mint-cli/tests/library_intake.rs +77 -0
- package/crates/mint-cli/tests/mods_testing.rs +133 -0
- package/crates/mint-companion-protocol/Cargo.toml +10 -0
- package/crates/mint-companion-protocol/src/lib.rs +163 -0
- package/crates/mint-core/Cargo.toml +6 -3
- package/crates/mint-core/build.rs +26 -0
- package/crates/mint-core/src/agent/agent_loop.rs +1 -0
- package/crates/mint-core/src/agent/chat.rs +1003 -209
- package/crates/mint-core/src/agent/code_tools.rs +98 -2
- package/crates/mint-core/src/agent/memory/sources.rs +240 -0
- package/crates/mint-core/src/agent/memory.rs +805 -33
- package/crates/mint-core/src/agent/skill_inventory.rs +325 -0
- package/crates/mint-core/src/agent/skills.rs +437 -90
- package/crates/mint-core/src/agent.rs +1 -0
- package/crates/mint-core/src/api_server/routes/background_jobs.rs +310 -0
- package/crates/mint-core/src/api_server/routes/chat.rs +233 -190
- package/crates/mint-core/src/api_server/routes/html_preview.rs +77 -0
- package/crates/mint-core/src/api_server/routes/library.rs +97 -0
- package/crates/mint-core/src/api_server/routes/linked_folders.rs +118 -3
- package/crates/mint-core/src/api_server/routes/media_gen.rs +10 -57
- package/crates/mint-core/src/api_server/routes/misc.rs +114 -121
- package/crates/mint-core/src/api_server/routes/mod.rs +6 -0
- package/crates/mint-core/src/api_server/routes/mods.rs +31 -0
- package/crates/mint-core/src/api_server/routes/sessions.rs +85 -0
- package/crates/mint-core/src/api_server/routes/skills_subagents.rs +12 -42
- package/crates/mint-core/src/api_server/routes/slash.rs +50 -1
- package/crates/mint-core/src/api_server/routes/sources.rs +101 -0
- package/crates/mint-core/src/api_server.rs +140 -12
- package/crates/mint-core/src/avatar_bridge.rs +13 -2
- package/crates/mint-core/src/browser/cdp.rs +74 -83
- package/crates/mint-core/src/browser/evidence.rs +260 -0
- package/crates/mint-core/src/browser/input.rs +1 -1
- package/crates/mint-core/src/browser/interact.rs +98 -124
- package/crates/mint-core/src/browser/lifecycle.rs +75 -4
- package/crates/mint-core/src/browser/mod.rs +16 -2
- package/crates/mint-core/src/browser/navigate.rs +27 -19
- package/crates/mint-core/src/browser/observe.js +40 -0
- package/crates/mint-core/src/browser/session.rs +1610 -0
- package/crates/mint-core/src/companion.rs +716 -0
- package/crates/mint-core/src/cron/scheduler.rs +34 -2
- package/crates/mint-core/src/git/branches.rs +348 -0
- package/crates/mint-core/src/git/checkpoint.rs +40 -0
- package/crates/mint-core/src/git/diff.rs +206 -0
- package/crates/mint-core/src/git/mod.rs +10 -2
- package/crates/mint-core/src/integrations/channels.rs +88 -345
- package/crates/mint-core/src/integrations/mcp.rs +397 -50
- package/crates/mint-core/src/integrations/mcp_calls.rs +823 -0
- package/crates/mint-core/src/integrations/mcp_catalog.rs +267 -0
- package/crates/mint-core/src/integrations/mcp_device.rs +319 -0
- package/crates/mint-core/src/integrations/mcp_result.rs +356 -0
- package/crates/mint-core/src/integrations/webhooks.rs +539 -0
- package/crates/mint-core/src/integrations.rs +2 -0
- package/crates/mint-core/src/lib.rs +107 -40
- package/crates/mint-core/src/live_sync.rs +28 -9
- package/crates/mint-core/src/media/auto_shorts.rs +1 -0
- package/crates/mint-core/src/media/gemini_live.rs +145 -14
- package/crates/mint-core/src/media/image_models.rs +3 -27
- package/crates/mint-core/src/media/image_workflow.rs +216 -0
- package/crates/mint-core/src/media/library/intake.rs +144 -0
- package/crates/mint-core/src/media/library/migration.rs +56 -0
- package/crates/mint-core/src/media/library/removal.rs +55 -0
- package/crates/mint-core/src/media/library/tests.rs +730 -0
- package/crates/mint-core/src/media/library/thumbnails.rs +72 -0
- package/crates/mint-core/src/media/library.rs +545 -0
- package/crates/mint-core/src/media/mic_transcribe.rs +1 -0
- package/crates/mint-core/src/media/model_catalog.rs +375 -0
- package/crates/mint-core/src/media/pictures.rs +79 -222
- package/crates/mint-core/src/media/subtitle.rs +1 -0
- package/crates/mint-core/src/media/video_models.rs +3 -22
- package/crates/mint-core/src/media.rs +3 -0
- package/crates/mint-core/src/mods/manager.rs +1124 -0
- package/crates/mint-core/src/mods/mod.rs +569 -0
- package/crates/mint-core/src/mods/operations.rs +204 -0
- package/crates/mint-core/src/mods/session.rs +146 -0
- package/crates/mint-core/src/mods/slash.rs +59 -0
- package/crates/mint-core/src/mods/telemetry.rs +306 -0
- package/crates/mint-core/src/orchestration/approvals.rs +344 -0
- package/crates/mint-core/src/orchestration/context_render.rs +105 -0
- package/crates/mint-core/src/orchestration/mcp_review.rs +153 -0
- package/crates/mint-core/src/orchestration/memory_skill.rs +110 -33
- package/crates/mint-core/src/orchestration/mod.rs +3129 -481
- package/crates/mint-core/src/orchestration/mod_authoring_regressions.rs +209 -0
- package/crates/mint-core/src/orchestration/progress_clock.rs +80 -0
- package/crates/mint-core/src/orchestration/repeated_failures.rs +116 -0
- package/crates/mint-core/src/orchestration/review_regressions.rs +449 -0
- package/crates/mint-core/src/orchestration/run_control.rs +196 -0
- package/crates/mint-core/src/orchestration/tools/browser.rs +16 -139
- package/crates/mint-core/src/orchestration/tools/files.rs +161 -14
- package/crates/mint-core/src/orchestration/tools/media.rs +37 -41
- package/crates/mint-core/src/orchestration/tools/misc.rs +5 -3
- package/crates/mint-core/src/orchestration/tools/mod.rs +2 -0
- package/crates/mint-core/src/orchestration/tools/mods.rs +161 -0
- package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +303 -71
- package/crates/mint-core/src/orchestration/tools/shell.rs +95 -2
- package/crates/mint-core/src/orchestration/tools/web.rs +1 -1
- package/crates/mint-core/src/orchestration/workspace_helpers.rs +4 -1
- package/crates/mint-core/src/prompts/agent.rs +75 -31
- package/crates/mint-core/src/prompts/chat.rs +1 -1
- package/crates/mint-core/src/prompts/persona.rs +1 -1
- package/crates/mint-core/src/prompts/tool_catalog.rs +121 -27
- package/crates/mint-core/src/search/knowledge.rs +7 -1
- package/crates/mint-core/src/search/linked_folders/index.rs +896 -0
- package/crates/mint-core/src/search/linked_folders.rs +473 -131
- package/crates/mint-core/src/slash/catalog.rs +1 -1
- package/crates/mint-core/src/slash/mod.rs +644 -33
- package/crates/mint-core/src/slash/model_fetcher.rs +12 -3
- package/crates/mint-core/src/slash/models.rs +66 -10
- package/crates/mint-core/src/slash/mods.rs +155 -0
- package/crates/mint-core/src/system/bg_shell.rs +1129 -95
- package/crates/mint-core/src/system/config.rs +235 -10
- package/crates/mint-core/src/system/html_preview.rs +398 -0
- package/crates/mint-core/src/system/mint_web.rs +164 -0
- package/crates/mint-core/src/system/release_notes.rs +18 -0
- package/crates/mint-core/src/system/shell.rs +21 -6
- package/crates/mint-core/src/system/workspace.rs +292 -0
- package/crates/mint-core/src/system/workspace_history.rs +604 -0
- package/crates/mint-core/src/system.rs +5 -0
- package/crates/mint-core/tests/background_retention.rs +34 -0
- package/crates/mint-core/tests/background_shutdown.rs +24 -0
- package/crates/mint-core/tests/library_http.rs +209 -0
- package/crates/mint-core/tests/mcp_contract.rs +283 -0
- package/crates/mint-core/tests/mcp_stdio.rs +11 -10
- package/crates/mint-core/tests/media_model_catalog_http.rs +403 -0
- package/crates/mint-core/tests/memory_persistence.rs +39 -0
- package/crates/mint-core/tests/mods_http.rs +215 -0
- package/crates/mint-core/tests/terminal_shutdown.rs +109 -0
- package/crates/mint-mod-runtime/Cargo.toml +18 -0
- package/crates/mint-mod-runtime/src/lib.rs +507 -0
- package/crates/mint-mod-runtime/src/sdk.js +56 -0
- package/crates/mint-mod-runtime/src/test_sdk.js +32 -0
- package/crates/mint-mod-runtime/src/testing.rs +94 -0
- package/crates/mint-mod-runtime/tests/runtime.rs +156 -0
- package/docs/mods/AUTHORING.md +61 -0
- package/docs/mods/README.md +139 -0
- package/docs/mods/TESTING.md +56 -0
- package/docs/mods/mint-mods.d.ts +66 -0
- package/examples/device-mcp/README.md +22 -0
- package/examples/device-mcp/contract.md +49 -0
- package/examples/device-mcp/mock-device.mjs +66 -0
- package/examples/device-mcp/server.mjs +48 -0
- package/examples/device-mcp/server.test.mjs +78 -0
- package/examples/mods/task-checklist/README.md +1 -0
- package/examples/mods/task-checklist/main.ts +17 -0
- package/examples/mods/task-checklist/manifest.json +1 -0
- package/examples/mods/task-checklist/tests/checklist.test.ts +15 -0
- package/examples/mods/token-meter/README.md +1 -0
- package/examples/mods/token-meter/main.ts +8 -0
- package/examples/mods/token-meter/manifest.json +1 -0
- package/examples/mods/tool-guard/README.md +1 -0
- package/examples/mods/tool-guard/main.ts +9 -0
- package/examples/mods/tool-guard/manifest.json +1 -0
- package/out/web/assets/CliSessionsView-CtzUJpK_.css +1 -0
- package/out/web/assets/CliSessionsView-D7hw0Mgj.js +1 -0
- package/out/web/assets/CodeReviewPage-C7bEOJfd.js +4 -0
- package/out/web/assets/CodeReviewPage-Dte9uLiL.css +1 -0
- package/out/web/assets/CommandPalette-0RrF-AOT.js +1 -0
- package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +1 -0
- package/out/web/assets/ImageStudioPanel-D0lnhQV5.css +1 -0
- package/out/web/assets/LibraryPage--Qfisp6D.js +2 -0
- package/out/web/assets/LibraryPage-DAxUTAg7.css +1 -0
- package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +1 -0
- package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +1 -0
- package/out/web/assets/McpServersView-slfQJzNB.js +1 -0
- package/out/web/assets/MintDashboard-BSR5XpXh.js +25 -0
- package/out/web/assets/MintDashboard-CWUcCGhd.css +1 -0
- package/out/web/assets/PluginsView-l7LSm503.js +1 -0
- package/out/web/assets/ScheduledTasksView-CttmLbq1.js +1 -0
- package/out/web/assets/SettingsWindow-BCMLYvEV.js +4 -0
- package/out/web/assets/SettingsWindow-DcMVmU9u.css +1 -0
- package/out/web/assets/SkillsView-rNs1qr_U.js +2 -0
- package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +37 -0
- package/out/web/assets/ToolSurfacePage-CTfgggF2.css +1 -0
- package/out/web/assets/VeoStudioPanel-DOj7_WR3.css +1 -0
- package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +4 -0
- package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +1 -0
- package/out/web/assets/WorkspaceSelector-B2xIp04D.js +1 -0
- package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +1 -0
- package/out/web/assets/{abnfDiagram-VCTEODGH-DAOBA7ZG.js → abnfDiagram-VCTEODGH-CD0CjoGl.js} +1 -1
- package/out/web/assets/{architecture-7GRP2DOG-CgSwQOPQ.js → architecture-7GRP2DOG-RKV83OeZ.js} +1 -1
- package/out/web/assets/{architectureDiagram-5GKGNRK7-CYp3yupP.js → architectureDiagram-5GKGNRK7-nN_HAFct.js} +1 -1
- package/out/web/assets/{blockDiagram-NRAW4CY4-CyWybDWr.js → blockDiagram-NRAW4CY4-BrrqzHW5.js} +1 -1
- package/out/web/assets/{c4Diagram-UCG6FXSJ-BvY3U709.js → c4Diagram-UCG6FXSJ-DTdV8_zE.js} +1 -1
- package/out/web/assets/{chunk-75Z2AOVW-TLXCoZYv.js → chunk-75Z2AOVW-_M0z5olV.js} +1 -1
- package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +2 -0
- package/out/web/assets/{chunk-CLGD4ZFX-xjsKtNS7.js → chunk-CLGD4ZFX-D54yGvGS.js} +1 -1
- package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +2 -0
- package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +128 -0
- package/out/web/assets/{chunk-F27PBJKO-BFpgF55A.js → chunk-F27PBJKO-BqtWrnEO.js} +1 -1
- package/out/web/assets/{chunk-G27WJ6UU-DfF7qW-C.js → chunk-G27WJ6UU-Ckoq5mi2.js} +1 -1
- package/out/web/assets/{chunk-GMAD6QVW-C-558kh_.js → chunk-GMAD6QVW-BuhEcgHq.js} +1 -1
- package/out/web/assets/{chunk-JQ64N6SF-wJmeGKAw.js → chunk-JQ64N6SF-CF8T7GiZ.js} +1 -1
- package/out/web/assets/{chunk-LCL6LL3I-C1wHD8Ie.js → chunk-LCL6LL3I-BhXV9zyH.js} +1 -1
- package/out/web/assets/{chunk-OBVCFTLP-BsRTPBqs.js → chunk-OBVCFTLP-CRIkunUB.js} +1 -1
- package/out/web/assets/{chunk-P2QGCYS3-HZIiM7Ni.js → chunk-P2QGCYS3-UFEU6BxZ.js} +1 -1
- package/out/web/assets/{chunk-POPQ4Y6H-Dk9wvVb0.js → chunk-POPQ4Y6H-CQcrNbjr.js} +1 -1
- package/out/web/assets/{chunk-PWAF6VOD-BmjYLNbq.js → chunk-PWAF6VOD-Cc2uVDsG.js} +1 -1
- package/out/web/assets/{chunk-R7TYR2AO-CaHIf-lK.js → chunk-R7TYR2AO-DiCxzdAY.js} +1 -1
- package/out/web/assets/{chunk-RHFEMEQ7-_T561hOU.js → chunk-RHFEMEQ7-b7hnPmrR.js} +1 -1
- package/out/web/assets/{chunk-SVP7TREG-CM-GGYoY.js → chunk-SVP7TREG-Bu_yYb-V.js} +1 -1
- package/out/web/assets/{chunk-TEH6E4GO-K2A8Vg2C.js → chunk-TEH6E4GO-G4Cdlyrt.js} +1 -1
- package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +1 -0
- package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +1 -0
- package/out/web/assets/config-CnvCChUM.js +2 -0
- package/out/web/assets/config-DM6oIVO3.css +1 -0
- package/out/web/assets/core-DsKkQ7ig.js +1 -0
- package/out/web/assets/{cynefin-OW5HDTMX-ClzaB6cc.js → cynefin-OW5HDTMX-CnzQfOGp.js} +1 -1
- package/out/web/assets/{cynefinDiagram-5FMLGOSQ-D_JzZBzf.js → cynefinDiagram-5FMLGOSQ-DVtQnfpm.js} +1 -1
- package/out/web/assets/{dagre-3AP2YEHR-BDuUeMHj.js → dagre-3AP2YEHR-DG76_k5_.js} +1 -1
- package/out/web/assets/{diagram-S7CK7UJ4-DgtcfE8P.js → diagram-S7CK7UJ4-CaouUoze.js} +1 -1
- package/out/web/assets/{diagram-UQ7AKVKN-DTLoEYti.js → diagram-UQ7AKVKN-B4bEc26B.js} +1 -1
- package/out/web/assets/{diagram-VSXAHHWV-ChGl9pXz.js → diagram-VSXAHHWV-BJ86Ov2Y.js} +1 -1
- package/out/web/assets/{diagram-VX7I27RA-Be8DWz0S.js → diagram-VX7I27RA-7hH5IPYf.js} +1 -1
- package/out/web/assets/{diagram-Z3DM3KII-BMXjRTOF.js → diagram-Z3DM3KII-CCM4clo8.js} +1 -1
- package/out/web/assets/dist-js-BkYNznHX.js +1 -0
- package/out/web/assets/{ebnfDiagram-PWID7BFC-8Q9pl1CJ.js → ebnfDiagram-PWID7BFC-Da7WAM3k.js} +1 -1
- package/out/web/assets/{erDiagram-SSCWMZ5O-DjH8Lnkn.js → erDiagram-SSCWMZ5O-CzzmnZWT.js} +1 -1
- package/out/web/assets/event-Cdt7Byyj.js +1 -0
- package/out/web/assets/{eventmodeling-NTZA5JFV-BKUH_DOp.js → eventmodeling-NTZA5JFV-xcfsA0XD.js} +1 -1
- package/out/web/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
- package/out/web/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
- package/out/web/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
- package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +1 -0
- package/out/web/assets/{ganttDiagram-EL5Y4UJY-D7fZKJNM.js → ganttDiagram-EL5Y4UJY-B3ClFGmL.js} +1 -1
- package/out/web/assets/{gitGraph-4MIJSDKK-BypWaaBU.js → gitGraph-4MIJSDKK-BZ_y_cDU.js} +1 -1
- package/out/web/assets/{gitGraphDiagram-WWUBYQGX-DWiw_3bq.js → gitGraphDiagram-WWUBYQGX-drhRSYm3.js} +1 -1
- package/out/web/assets/index-BZ9xgmMP.css +1 -0
- package/out/web/assets/index-Ca8cCS4h.js +168 -0
- package/out/web/assets/{info-A6RAGUB7-KkAUxT4j.js → info-A6RAGUB7-B7I3K0F1.js} +1 -1
- package/out/web/assets/{infoDiagram-RXCK75RN-BNb6E48y.js → infoDiagram-RXCK75RN-deX_1MPh.js} +1 -1
- package/out/web/assets/{ishikawaDiagram-5VMMS53U-Caa-JoAK.js → ishikawaDiagram-5VMMS53U-s38yo28y.js} +1 -1
- package/out/web/assets/{journeyDiagram-EYS64GPL-DOrmFGz6.js → journeyDiagram-EYS64GPL-CZn2kB8b.js} +1 -1
- package/out/web/assets/jsx-runtime-DN4NhQUK.js +1 -0
- package/out/web/assets/{kanban-definition-3QL26DDD-BOWCYcK0.js → kanban-definition-3QL26DDD-DodjgySL.js} +1 -1
- package/out/web/assets/markdown-CMhYIcWB.js +39 -0
- package/out/web/assets/{mermaid-parser.core-BQqjCkS_.js → mermaid-parser.core-Whu2rlJC.js} +3 -3
- package/out/web/assets/mermaid.core-CKyPo8VH.js +11 -0
- package/out/web/assets/{mindmap-definition-FBJOCRG2-jTceWpr0.js → mindmap-definition-FBJOCRG2-260WBDxZ.js} +1 -1
- package/out/web/assets/modelManager-CUaGWMWu.js +2 -0
- package/out/web/assets/oauthManager-DlNhXJr6.js +1 -0
- package/out/web/assets/{packet-AYTQ26CC-CJ5RXgol.js → packet-AYTQ26CC-CEeIRKRG.js} +1 -1
- package/out/web/assets/{pegDiagram-XKGWAZYB-y8wMtd0y.js → pegDiagram-XKGWAZYB-BYadI-KO.js} +1 -1
- package/out/web/assets/{pie-WAS4IAKB-72fTBbl4.js → pie-WAS4IAKB-D8uf4dh5.js} +1 -1
- package/out/web/assets/{pieDiagram-E7YTZNPT-e0O02qWq.js → pieDiagram-E7YTZNPT-CjSDy4hO.js} +1 -1
- package/out/web/assets/{quadrantDiagram-AXDQQJYC-C9phYLom.js → quadrantDiagram-AXDQQJYC-B8D3gU5d.js} +1 -1
- package/out/web/assets/{radar-RG4KPBEZ-BAU2hzUT.js → radar-RG4KPBEZ-DZJxnokY.js} +1 -1
- package/out/web/assets/{railroad-74A4TZTK-B0bCAVHC.js → railroad-74A4TZTK-DBysUiUi.js} +1 -1
- package/out/web/assets/{railroad-abnf-HS5TGJTU-WhxO7ndE.js → railroad-abnf-HS5TGJTU-CHWxoJYg.js} +1 -1
- package/out/web/assets/{railroad-ebnf-LZEXJU2U-BkA0m7-F.js → railroad-ebnf-LZEXJU2U-DDv7X6bY.js} +1 -1
- package/out/web/assets/{railroad-peg-WCYAUIDC-BsVpHIaj.js → railroad-peg-WCYAUIDC-DpfcYYNJ.js} +1 -1
- package/out/web/assets/{railroadDiagram-O6MQD6OU-CyOLN65Q.js → railroadDiagram-O6MQD6OU-CYtyv0t3.js} +1 -1
- package/out/web/assets/{requirementDiagram-EFPCY7ZU-DQXJ7Dud.js → requirementDiagram-EFPCY7ZU-D2X-Ewik.js} +1 -1
- package/out/web/assets/{sankeyDiagram-P5KCCOFB-B2XLyIIc.js → sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js} +1 -1
- package/out/web/assets/{sequenceDiagram-WJ2MYXX4-DGQY4wwm.js → sequenceDiagram-WJ2MYXX4-BvFLKtPd.js} +1 -1
- package/out/web/assets/{stateDiagram-HBIQ2CUA-DHZpDwNy.js → stateDiagram-HBIQ2CUA-Bx0GWeaY.js} +1 -1
- package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +1 -0
- package/out/web/assets/studio-B1mk40wD.js +1 -0
- package/out/web/assets/{swimlanes-XN3QIQJK-Bn_jcZz-.js → swimlanes-XN3QIQJK-CCma0T7L.js} +1 -1
- package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +8 -0
- package/out/web/assets/{timeline-definition-24CTP7MA-CdTERuJZ.js → timeline-definition-24CTP7MA-iCRhhJ7C.js} +1 -1
- package/out/web/assets/{treeView-Q6P3EWNA-TKBKQG6R.js → treeView-Q6P3EWNA-DZ-y08qp.js} +1 -1
- package/out/web/assets/{treemap-WGGIJYW6-BP7gQoiC.js → treemap-WGGIJYW6-De0CxzMx.js} +1 -1
- package/out/web/assets/{vennDiagram-4TSXK5OY-BHUmxDuK.js → vennDiagram-4TSXK5OY-w_7aZ6xe.js} +1 -1
- package/out/web/assets/{wardley-WFR3VGLG-9bct5AAN.js → wardley-WFR3VGLG-DT0y0xJ4.js} +1 -1
- package/out/web/assets/{wardleyDiagram-VM6X3IG4-BfJwDDso.js → wardleyDiagram-VM6X3IG4-DAdXELbQ.js} +1 -1
- package/out/web/assets/window-BJCVtyET.js +1 -0
- package/out/web/assets/{xychartDiagram-S5SC5T6Z-Dqd9Mvpo.js → xychartDiagram-S5SC5T6Z-IZIXf3Vo.js} +1 -1
- package/out/web/index-web.html +4 -4
- package/out/web/index.html +4 -4
- package/package.json +80 -20
- package/shared-modules/.github/workflows/ci.yml +120 -0
- package/shared-modules/.github/workflows/update.yaml +28 -0
- package/slash-commands.json +16 -2
- package/src/bin/auto-build.js +66 -0
- package/src/bin/desktop.js +113 -0
- package/src/bin/desktop.test.js +113 -0
- package/src/bin/index.js +18 -25
- package/src/bin/index.test.js +89 -0
- package/src/bin/measure-effects.mjs +53 -0
- package/src/bin/package.test.js +28 -0
- package/src/bin/release-notes.test.js +84 -0
- package/src/bin/styles.test.js +20 -0
- package/src/bin/web.js +5 -0
- package/src/bin/web.test.js +39 -0
- package/src/renderer/index-web.html +1 -0
- package/src/renderer/index.html +1 -2
- package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/src/renderer/shared/agentProgress.ts +201 -3
- package/src/renderer/shared/components/AgentActivityDrawer.tsx +9 -8
- package/src/renderer/shared/components/AgentActivityTable.tsx +193 -133
- package/src/renderer/shared/components/ApprovalCard.test.tsx +24 -0
- package/src/renderer/shared/components/ApprovalCard.tsx +10 -3
- package/src/renderer/shared/components/ArtifactPreviewPanel.tsx +91 -40
- package/src/renderer/shared/components/AuthGate.tsx +79 -48
- package/src/renderer/shared/components/BackgroundTerminals.tsx +181 -0
- package/src/renderer/shared/components/CalculationCard.tsx +41 -15
- package/src/renderer/shared/components/ChatCodeBlock.tsx +8 -4
- package/src/renderer/shared/components/ChatMessageItem.test.tsx +68 -0
- package/src/renderer/shared/components/ChatMessageItem.tsx +52 -33
- package/src/renderer/shared/components/ChatPanel.test.tsx +21 -0
- package/src/renderer/shared/components/ChatPanel.tsx +676 -415
- package/src/renderer/shared/components/ChunkErrorBoundary.tsx +115 -64
- package/src/renderer/shared/components/CliSessionsView.test.tsx +125 -0
- package/src/renderer/shared/components/CliSessionsView.tsx +543 -0
- package/src/renderer/shared/components/CodeReviewPage.tsx +668 -0
- package/src/renderer/shared/components/CollapsiblePasteInput.tsx +90 -0
- package/src/renderer/shared/components/CommandPalette.tsx +8 -8
- package/src/renderer/shared/components/ContextCompactionStatus.tsx +17 -0
- package/src/renderer/shared/components/DashboardSidebar.tsx +853 -229
- package/src/renderer/shared/components/DesktopTitlebar.tsx +371 -0
- package/src/renderer/shared/components/DiffReviewModal.tsx +3 -3
- package/src/renderer/shared/components/ErrorNotice.tsx +29 -0
- package/src/renderer/shared/components/FormattedMessage.tsx +11 -0
- package/src/renderer/shared/components/GeminiLiveOverlay.css +86 -0
- package/src/renderer/shared/components/GeminiLiveOverlay.test.tsx +24 -0
- package/src/renderer/shared/components/GeminiLiveOverlay.tsx +85 -101
- package/src/renderer/shared/components/GitBranchSelector.tsx +442 -0
- package/src/renderer/shared/components/GlideSelect.css +138 -0
- package/src/renderer/shared/components/GlideSelect.d.ts +31 -0
- package/src/renderer/shared/components/GlideSelect.jsx +266 -0
- package/src/renderer/shared/components/ImageGenCard.tsx +31 -12
- package/src/renderer/shared/components/ImageSearchCard.tsx +76 -65
- package/src/renderer/shared/components/ImageStudioPanel.tsx +49 -49
- package/src/renderer/shared/components/InlineThoughtNote.tsx +27 -0
- package/src/renderer/shared/components/LibraryItemCard.tsx +72 -0
- package/src/renderer/shared/components/LibraryPage.tsx +165 -0
- package/src/renderer/shared/components/LibraryPreview.tsx +59 -0
- package/src/renderer/shared/components/LinkedFoldersView.tsx +365 -46
- package/src/renderer/shared/components/McpRegistryPicker.tsx +1 -1
- package/src/renderer/shared/components/McpServersView.tsx +51 -30
- package/src/renderer/shared/components/McpToolAllowlist.tsx +2 -4
- package/src/renderer/shared/components/McpToolResults.tsx +99 -0
- package/src/renderer/shared/components/MermaidCard.tsx +14 -8
- package/src/renderer/shared/components/MintDashboard.tsx +1002 -831
- package/src/renderer/shared/components/ModSessionControls.tsx +8 -0
- package/src/renderer/shared/components/ModUi.test.tsx +65 -0
- package/src/renderer/shared/components/ModUi.tsx +26 -0
- package/src/renderer/shared/components/ModelSelectorPopover.tsx +547 -219
- package/src/renderer/shared/components/ModsPanel.tsx +156 -0
- package/src/renderer/shared/components/PlanChecklistWidget.tsx +1 -1
- package/src/renderer/shared/components/PluginsView.tsx +1 -1
- package/src/renderer/shared/components/ProgressActivity.tsx +17 -0
- package/src/renderer/shared/components/ReviewHistory.tsx +42 -0
- package/src/renderer/shared/components/RewindModal.tsx +11 -18
- package/src/renderer/shared/components/RunSummaryDashboard.tsx +8 -14
- package/src/renderer/shared/components/ScheduledTasksView.tsx +11 -10
- package/src/renderer/shared/components/ScreenCaptureDialog.css +221 -0
- package/src/renderer/shared/components/ScreenCaptureDialog.tsx +199 -0
- package/src/renderer/shared/components/SelectField.test.tsx +27 -0
- package/src/renderer/shared/components/SelectField.tsx +38 -0
- package/src/renderer/shared/components/SessionSources.tsx +48 -0
- package/src/renderer/shared/components/SessionSourcesPopover.tsx +61 -0
- package/src/renderer/shared/components/Settings/AgentsTab.tsx +41 -45
- package/src/renderer/shared/components/Settings/AudioTab.tsx +16 -15
- package/src/renderer/shared/components/Settings/AutomationTab.tsx +10 -60
- package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +368 -0
- package/src/renderer/shared/components/Settings/GeneralTab.tsx +368 -113
- package/src/renderer/shared/components/Settings/MemoryTab.test.tsx +37 -0
- package/src/renderer/shared/components/Settings/MemoryTab.tsx +71 -31
- package/src/renderer/shared/components/Settings/NotificationsTab.test.tsx +15 -0
- package/src/renderer/shared/components/Settings/NotificationsTab.tsx +84 -0
- package/src/renderer/shared/components/Settings/PluginsTab.tsx +20 -12
- package/src/renderer/shared/components/Settings/ProfileTab.tsx +29 -5
- package/src/renderer/shared/components/Settings/SearchableModelCombobox.tsx +411 -0
- package/src/renderer/shared/components/Settings/ThemeTab.tsx +416 -165
- package/src/renderer/shared/components/SkillsView.tsx +41 -16
- package/src/renderer/shared/components/SlashChoicePanel.tsx +88 -0
- package/src/renderer/shared/components/SlashSuggestions.test.tsx +33 -0
- package/src/renderer/shared/components/SlashSuggestions.tsx +41 -12
- package/src/renderer/shared/components/SourcesBlock.tsx +55 -51
- package/src/renderer/shared/components/StockCard.tsx +58 -24
- package/src/renderer/shared/components/SubagentDagView.tsx +4 -4
- package/src/renderer/shared/components/TerminalDock.tsx +241 -0
- package/src/renderer/shared/components/ThinkingBlock.tsx +14 -8
- package/src/renderer/shared/components/ToolSurfacePage.test.tsx +32 -0
- package/src/renderer/shared/components/ToolSurfacePage.tsx +568 -0
- package/src/renderer/shared/components/ToolsPanelToggle.tsx +13 -0
- package/src/renderer/shared/components/UiFeatureCard.tsx +267 -0
- package/src/renderer/shared/components/UiGridCard.tsx +188 -0
- package/src/renderer/shared/components/UiMockupWidget.tsx +149 -0
- package/src/renderer/shared/components/VeoStudioPanel.tsx +22 -37
- package/src/renderer/shared/components/ViewedImages.tsx +36 -0
- package/src/renderer/shared/components/VirtualChatHistory.tsx +82 -0
- package/src/renderer/shared/components/VoicePill.css +85 -0
- package/src/renderer/shared/components/VoicePill.d.ts +12 -0
- package/src/renderer/shared/components/VoicePill.jsx +190 -0
- package/src/renderer/shared/components/VoicePill.test.tsx +22 -0
- package/src/renderer/shared/components/WeatherCard.tsx +3 -3
- package/src/renderer/shared/components/WorkspaceContextPopover.tsx +138 -0
- package/src/renderer/shared/components/WorkspacePaneResizer.tsx +92 -0
- package/src/renderer/shared/components/WorkspacePreviewActions.test.tsx +44 -0
- package/src/renderer/shared/components/WorkspacePreviewActions.tsx +19 -0
- package/src/renderer/shared/components/WorkspaceSelector.tsx +154 -0
- package/src/renderer/shared/components/background-terminals.css +292 -0
- package/src/renderer/shared/components/ui/README.md +52 -0
- package/src/renderer/shared/components/ui/button.tsx +37 -0
- package/src/renderer/shared/components/ui/demo.tsx +26 -0
- package/src/renderer/shared/components/ui/error-recovery.css +35 -0
- package/src/renderer/shared/components/ui/error-recovery.tsx +35 -0
- package/src/renderer/shared/components/ui/voice-powered-orb.css +6 -0
- package/src/renderer/shared/components/ui/voice-powered-orb.tsx +374 -0
- package/src/renderer/shared/components/workspace-selector.css +248 -0
- package/src/renderer/shared/constants/config.ts +57 -3
- package/src/renderer/shared/constants/models.ts +189 -2
- package/src/renderer/shared/constants/slashCommands.ts +1 -1
- package/src/renderer/shared/conversation/coordinator.test.ts +27 -0
- package/src/renderer/shared/conversation/coordinator.ts +82 -0
- package/src/renderer/shared/conversation/lifecycle.test.ts +362 -0
- package/src/renderer/shared/conversation/lifecycle.ts +418 -0
- package/src/renderer/shared/conversation/projectNavigation.test.ts +105 -0
- package/src/renderer/shared/conversation/projectNavigation.ts +39 -0
- package/src/renderer/shared/conversation/sourcesTransport.ts +27 -0
- package/src/renderer/shared/conversation/syncView.test.ts +13 -0
- package/src/renderer/shared/conversation/syncView.ts +6 -0
- package/src/renderer/shared/conversation/transport.test.ts +163 -0
- package/src/renderer/shared/conversation/transport.ts +159 -0
- package/src/renderer/shared/conversation/useConversationCoordinator.ts +64 -0
- package/src/renderer/shared/css/agent-observability.css +46 -15
- package/src/renderer/shared/css/auth-gate.css +114 -15
- package/src/renderer/shared/css/chat-ui-cards.css +495 -0
- package/src/renderer/shared/css/code-review.css +856 -0
- package/src/renderer/shared/css/code-sessions.css +479 -0
- package/src/renderer/shared/css/collapsed-paste.css +35 -0
- package/src/renderer/shared/css/effects.css +15 -0
- package/src/renderer/shared/css/error-notice.css +60 -0
- package/src/renderer/shared/css/file-changes.css +132 -0
- package/src/renderer/shared/css/image-studio.css +16 -16
- package/src/renderer/shared/css/library.css +476 -0
- package/src/renderer/shared/css/management-views.css +415 -27
- package/src/renderer/shared/css/mcp-results.css +11 -0
- package/src/renderer/shared/css/model-selector.css +543 -85
- package/src/renderer/shared/css/mods.css +77 -0
- package/src/renderer/shared/css/notification-notice.css +28 -0
- package/src/renderer/shared/css/session-sources-popover.css +9 -0
- package/src/renderer/shared/css/session-sources.css +23 -0
- package/src/renderer/shared/css/settings/agents.css +1 -1
- package/src/renderer/shared/css/settings/automation.css +13 -13
- package/src/renderer/shared/css/settings/general.css +526 -5
- package/src/renderer/shared/css/settings/memory.css +154 -0
- package/src/renderer/shared/css/settings/notifications.css +11 -0
- package/src/renderer/shared/css/settings/plugins.css +5 -5
- package/src/renderer/shared/css/settings/profile.css +331 -1
- package/src/renderer/shared/css/settings/theme.css +656 -3
- package/src/renderer/shared/css/slash-choice.css +95 -0
- package/src/renderer/shared/css/slash-suggestions.css +68 -0
- package/src/renderer/shared/css/sources-block.css +91 -0
- package/src/renderer/shared/css/thinking-status.css +46 -0
- package/src/renderer/shared/css/tools-panel.css +7 -0
- package/src/renderer/shared/css/ui-tailwind.css +19 -0
- package/src/renderer/shared/css/veo-studio.css +16 -15
- package/src/renderer/shared/css/viewed-images.css +15 -0
- package/src/renderer/shared/fonts.css +46 -0
- package/src/renderer/shared/fonts.ts +10 -37
- package/src/renderer/shared/lib/utils.ts +6 -0
- package/src/renderer/shared/library/controller.test.ts +61 -0
- package/src/renderer/shared/library/controller.ts +57 -0
- package/src/renderer/shared/library/transport.test.ts +26 -0
- package/src/renderer/shared/library/transport.ts +60 -0
- package/src/renderer/shared/library/useLibraryFile.ts +38 -0
- package/src/renderer/shared/mods.ts +58 -0
- package/src/renderer/shared/platform.test.ts +90 -0
- package/src/renderer/shared/platform.ts +219 -7
- package/src/renderer/shared/theme/themeManager.test.ts +43 -0
- package/src/renderer/shared/theme/themeManager.ts +157 -0
- package/src/renderer/shared/theme/themes.ts +116 -0
- package/src/renderer/shared/theme/tokens.css +318 -0
- package/src/renderer/shared/types.ts +137 -2
- package/src/renderer/shared/utils/agentActivity.test.ts +75 -0
- package/src/renderer/shared/utils/agentActivity.ts +168 -8
- package/src/renderer/shared/utils/approval.tsx +7 -0
- package/src/renderer/shared/utils/artifactBrowser.test.ts +80 -0
- package/src/renderer/shared/utils/artifactBrowser.ts +41 -0
- package/src/renderer/shared/utils/cardJson.test.ts +35 -0
- package/src/renderer/shared/utils/cardJson.ts +30 -0
- package/src/renderer/shared/utils/contextCompaction.test.tsx +48 -0
- package/src/renderer/shared/utils/contextCompaction.ts +21 -0
- package/src/renderer/shared/utils/effectVisibility.ts +9 -0
- package/src/renderer/shared/utils/fileIcons.ts +1 -1
- package/src/renderer/shared/utils/markdown.tsx +330 -81
- package/src/renderer/shared/utils/markdown.webImages.test.tsx +40 -0
- package/src/renderer/shared/utils/mcpResults.test.tsx +91 -0
- package/src/renderer/shared/utils/modViewport.ts +7 -0
- package/src/renderer/shared/utils/nativeRecordingSession.test.ts +61 -0
- package/src/renderer/shared/utils/nativeRecordingSession.ts +46 -0
- package/src/renderer/shared/utils/notificationSettings.test.ts +14 -0
- package/src/renderer/shared/utils/notificationSettings.ts +23 -0
- package/src/renderer/shared/utils/notifications.test.ts +51 -0
- package/src/renderer/shared/utils/notifications.ts +54 -0
- package/src/renderer/shared/utils/pastedText.test.ts +20 -0
- package/src/renderer/shared/utils/pastedText.ts +13 -0
- package/src/renderer/shared/utils/progressCache.test.ts +32 -0
- package/src/renderer/shared/utils/providers.ts +8 -3
- package/src/renderer/shared/utils/screenCapture.ts +43 -0
- package/src/renderer/shared/utils/sessionSources.test.ts +31 -0
- package/src/renderer/shared/utils/sessionSources.ts +34 -0
- package/src/renderer/shared/utils/slashCommandProcessor.ts +5 -2
- package/src/renderer/shared/utils/sourceAttachments.ts +28 -0
- package/src/renderer/shared/utils/speech.ts +51 -9
- package/src/renderer/shared/utils/syntaxHighlight.test.tsx +22 -0
- package/src/renderer/shared/utils/syntaxHighlight.tsx +26 -0
- package/src/renderer/shared/utils/ui.ts +4 -64
- package/src/renderer/shared/utils/useGeminiLiveVoice.ts +49 -5
- package/src/renderer/shared/utils/useLatestCallback.ts +9 -0
- package/src/renderer/shared/utils/useNativeVoiceInput.ts +80 -72
- package/src/renderer/shared/utils/useSessionSources.ts +33 -0
- package/src/renderer/shared/utils/viewedImages.ts +26 -0
- package/src/renderer/shared/utils/workspacePane.test.ts +33 -0
- package/src/renderer/shared/utils/workspacePane.ts +20 -0
- package/src/renderer/shared/utils/workspacePreview.test.ts +24 -0
- package/src/renderer/shared/utils/workspacePreview.ts +16 -0
- package/src/renderer/shared/utils/workspaceSnapshot.test.ts +49 -0
- package/src/renderer/shared/utils/workspaceSnapshot.ts +26 -0
- package/src/renderer/shared/utils/workspaces.ts +10 -0
- package/src/renderer/shared/workspaceUndo.ts +88 -0
- package/src/renderer/src/App.tsx +16 -1
- package/src/renderer/src/components/BrowserShell.tsx +108 -0
- package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +91 -0
- package/src/renderer/src/components/LiveTranslateControls.tsx +65 -0
- package/src/renderer/src/components/MintDashboard.tsx +4 -2
- package/src/renderer/src/components/PicturesLibrary.tsx +2 -287
- package/src/renderer/src/components/ScreenPicker.css +227 -0
- package/src/renderer/src/components/ScreenPicker.tsx +312 -526
- package/src/renderer/src/components/SettingsWindow.tsx +48 -5
- package/src/renderer/src/components/SpotlightWindow.tsx +1 -0
- package/src/renderer/src/components/WidgetWindow.tsx +27 -3
- package/src/renderer/src/components/WorkspacePanel.tsx +269 -61
- package/src/renderer/src/components/browser-shell.css +185 -0
- package/src/renderer/src/components/browser-suggestions-popup.css +55 -0
- package/src/renderer/src/components/liveTranslateFrames.test.ts +44 -0
- package/src/renderer/src/components/liveTranslateFrames.ts +45 -0
- package/src/renderer/src/components/liveTranslateLanguage.ts +6 -0
- package/src/renderer/src/css/app-shell.css +400 -204
- package/src/renderer/src/css/chat.css +1666 -594
- package/src/renderer/src/css/dashboard.css +11 -0
- package/src/renderer/src/css/desktop-tools.css +928 -0
- package/src/renderer/src/css/misc.css +5 -60
- package/src/renderer/src/css/pictures.css +2 -407
- package/src/renderer/src/css/settings/base.css +394 -157
- package/src/renderer/src/css/sidebar-workspace.css +1072 -376
- package/src/renderer/src/css/spotlight.css +15 -26
- package/src/renderer/src/css/tool-surfaces.css +784 -0
- package/src/renderer/src/css/widget.css +36 -8
- package/src/renderer/src/env.d.ts +4 -9
- package/src/renderer/src/hooks/useProviderModels.ts +2 -9
- package/src/renderer/src/index.css +53 -46
- package/src/renderer/src/main.tsx +12 -0
- package/src/renderer/src/proactiveSuggestions.ts +29 -0
- package/src/renderer/src/tauri.ts +302 -339
- package/src/renderer/src/voiceInput.ts +2 -1
- package/src/renderer/src-web/App.tsx +40 -0
- package/src/renderer/src-web/components/MintDashboard.tsx +4 -2
- package/src/renderer/src-web/components/PicturesLibrary.tsx +2 -284
- package/src/renderer/src-web/components/PullToRefresh.tsx +107 -0
- package/src/renderer/src-web/components/SettingsWindow.tsx +36 -5
- package/src/renderer/src-web/css/app-shell.css +188 -207
- package/src/renderer/src-web/css/chat.css +1236 -507
- package/src/renderer/src-web/css/dashboard.css +11 -0
- package/src/renderer/src-web/css/misc.css +3 -55
- package/src/renderer/src-web/css/mobile.css +679 -0
- package/src/renderer/src-web/css/pictures.css +2 -415
- package/src/renderer/src-web/css/pull-to-refresh.css +54 -0
- package/src/renderer/src-web/css/settings/base.css +353 -134
- package/src/renderer/src-web/css/settings/mobile.css +320 -0
- package/src/renderer/src-web/css/sidebar-workspace.css +546 -187
- package/src/renderer/src-web/css/spotlight.css +9 -26
- package/src/renderer/src-web/css/widget.css +1 -6
- package/src/renderer/src-web/env.d.ts +4 -12
- package/src/renderer/src-web/hooks/useProviderModels.ts +2 -9
- package/src/renderer/src-web/index.css +53 -96
- package/src/renderer/src-web/main.tsx +12 -0
- package/src/renderer/src-web/proactiveSuggestions.ts +3 -0
- package/src/renderer/src-web/tauri.ts +309 -364
- package/src/renderer/tests/backgroundTerminals.browser.html +81 -0
- package/src/renderer/tests/chatPanelFixture.ts +23 -0
- package/src/renderer/tests/chatPerformance.browser.html +71 -0
- package/src/renderer/tests/cliSessions.browser.html +82 -0
- package/src/renderer/tests/collapsedPaste.browser.html +70 -0
- package/src/renderer/tests/composerMenus.browser.html +116 -0
- package/src/renderer/tests/contextCompaction.browser.html +17 -0
- package/src/renderer/tests/conversationLifecycle.browser.html +70 -0
- package/src/renderer/tests/effectsPerformance.browser.html +13 -0
- package/src/renderer/tests/errorRecovery.browser.html +21 -0
- package/src/renderer/tests/glideSelect.browser.html +71 -0
- package/src/renderer/tests/glideSelect.preview.html +27 -0
- package/src/renderer/tests/library.browser.html +1 -0
- package/src/renderer/tests/library.browser.tsx +78 -0
- package/src/renderer/tests/liveOrb.browser.html +49 -0
- package/src/renderer/tests/liveVoice.browser.html +29 -0
- package/src/renderer/tests/modInput.browser.html +22 -0
- package/src/renderer/tests/sessionSources.browser.html +1 -0
- package/src/renderer/tests/sessionSources.browser.tsx +107 -0
- package/src/renderer/tests/skills.browser.html +24 -0
- package/src/renderer/tests/toolsPanel.browser.html +1 -0
- package/src/renderer/tests/toolsPanel.browser.tsx +113 -0
- package/src/renderer/tests/viewedImages.browser.html +1 -0
- package/src/renderer/tests/viewedImages.browser.tsx +93 -0
- package/src/renderer/tests/voicePill.browser.html +80 -0
- package/src/renderer/tests/voicePill.preview.html +34 -0
- package/src/renderer/tests/webSources.browser.html +1 -0
- package/src/renderer/tests/webSources.browser.tsx +98 -0
- package/src/renderer/tests/workspaceUndo.browser.html +92 -0
- package/src-tauri/Cargo.toml +40 -0
- package/src-tauri/build.rs +3 -0
- package/src-tauri/src/app/lifecycle.rs +277 -0
- package/src-tauri/src/app/mod.rs +4 -0
- package/src-tauri/src/app/shortcuts.rs +40 -0
- package/src-tauri/src/app/tray.rs +52 -0
- package/src-tauri/src/background/events.rs +70 -0
- package/src-tauri/src/background/headless.rs +230 -0
- package/src-tauri/src/background/mod.rs +4 -0
- package/src-tauri/src/background/proactive.rs +262 -0
- package/src-tauri/src/commands/approvals.rs +20 -0
- package/src-tauri/src/commands/auth.rs +127 -0
- package/src-tauri/src/commands/conversation.rs +642 -0
- package/src-tauri/src/commands/integrations.rs +157 -0
- package/src-tauri/src/commands/media.rs +179 -0
- package/src-tauri/src/commands/mod.rs +11 -0
- package/src-tauri/src/commands/mods.rs +6 -0
- package/src-tauri/src/commands/settings.rs +141 -0
- package/src-tauri/src/commands/voice.rs +153 -0
- package/src-tauri/src/commands/workspace.rs +501 -0
- package/src-tauri/src/lib.rs +10 -0
- package/src-tauri/src/main.rs +3 -0
- package/src-tauri/src/native/actions.rs +206 -0
- package/src-tauri/src/native/browser.rs +252 -0
- package/src-tauri/src/native/capture.rs +695 -0
- package/src-tauri/src/native/discord_rpc.rs +99 -0
- package/src-tauri/src/native/integrations.rs +126 -0
- package/src-tauri/src/native/mod.rs +12 -0
- package/src-tauri/src/native/notifications.rs +51 -0
- package/src-tauri/src/native/plugins.rs +14 -0
- package/src-tauri/src/native/system.rs +250 -0
- package/src-tauri/src/native/terminal.rs +201 -0
- package/src-tauri/src/native/updater.rs +148 -0
- package/src-tauri/src/native/windows.rs +143 -0
- package/tsconfig.json +2 -0
- package/vite.config.ts +4 -1
- package/vite.config.web.ts +5 -0
- package/.cargo/config.toml +0 -13
- package/.claude/settings.local.json +0 -182
- package/.codex +0 -0
- package/CLAUDE.md +0 -102
- package/out/web/Live2DCubismCore.js +0 -9
- package/out/web/assets/MintDashboard-DWSqucgb.js +0 -57
- package/out/web/assets/SettingsWindow-DFM2aj5B.js +0 -2
- package/out/web/assets/chunk-CKBBP62Z-nr1uKPj9.js +0 -2
- package/out/web/assets/chunk-DSNCTWBM-Dtj8Rqsd.js +0 -2
- package/out/web/assets/chunk-DU6HZSFF-2tv5K1wT.js +0 -128
- package/out/web/assets/classDiagram-DTDB5LWJ-BdSFArgw.js +0 -1
- package/out/web/assets/classDiagram-v2-JRS7N3AN-BdSFArgw.js +0 -1
- package/out/web/assets/core-DImejIUG.js +0 -1
- package/out/web/assets/dist-js-BxuKEVWM.js +0 -1
- package/out/web/assets/event-BNl8Zahw.js +0 -1
- package/out/web/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
- package/out/web/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
- package/out/web/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
- package/out/web/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
- package/out/web/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
- package/out/web/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
- package/out/web/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
- package/out/web/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
- package/out/web/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
- package/out/web/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
- package/out/web/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
- package/out/web/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
- package/out/web/assets/flowDiagram-A5DVABFB-BpnHUSU7.js +0 -1
- package/out/web/assets/index-CVRg270z.css +0 -1
- package/out/web/assets/index-DxZQr9yD.js +0 -10
- package/out/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/out/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/out/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/out/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/out/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/out/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/out/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/out/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/out/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/out/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/out/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/out/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/out/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/out/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/out/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/out/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/out/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/out/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/out/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/out/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/out/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/out/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/out/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/out/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/out/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/out/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/out/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/out/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/out/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/out/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/out/web/assets/kanit-latin-400-normal-BUlsQXH3.woff2 +0 -0
- package/out/web/assets/kanit-latin-400-normal-HVZWrfev.woff +0 -0
- package/out/web/assets/kanit-latin-500-normal-CX_4XcKi.woff2 +0 -0
- package/out/web/assets/kanit-latin-500-normal-qBha86O4.woff +0 -0
- package/out/web/assets/kanit-latin-600-normal-0lS78yAd.woff2 +0 -0
- package/out/web/assets/kanit-latin-600-normal-DlacpeTg.woff +0 -0
- package/out/web/assets/kanit-latin-ext-400-normal-B2xPf58u.woff2 +0 -0
- package/out/web/assets/kanit-latin-ext-400-normal-CHvNKHHD.woff +0 -0
- package/out/web/assets/kanit-latin-ext-500-normal-BFdWrG22.woff +0 -0
- package/out/web/assets/kanit-latin-ext-500-normal-EHs3suD6.woff2 +0 -0
- package/out/web/assets/kanit-latin-ext-600-normal-BBDzoLaj.woff +0 -0
- package/out/web/assets/kanit-latin-ext-600-normal-DAX3wtuq.woff2 +0 -0
- package/out/web/assets/kanit-thai-400-normal-D2nliXKa.woff +0 -0
- package/out/web/assets/kanit-thai-400-normal-D80Pglro.woff2 +0 -0
- package/out/web/assets/kanit-thai-500-normal-BB8gri04.woff2 +0 -0
- package/out/web/assets/kanit-thai-500-normal-Iy_w0a80.woff +0 -0
- package/out/web/assets/kanit-thai-600-normal-Bj6oiaDc.woff2 +0 -0
- package/out/web/assets/kanit-thai-600-normal-wbTlPO7I.woff +0 -0
- package/out/web/assets/kanit-vietnamese-400-normal-DRI8YWyb.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-400-normal-dow6Bnto.woff +0 -0
- package/out/web/assets/kanit-vietnamese-500-normal-BzTrpCM3.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-500-normal-T1ndT7MF.woff +0 -0
- package/out/web/assets/kanit-vietnamese-600-normal-Bi7fw3I4.woff2 +0 -0
- package/out/web/assets/kanit-vietnamese-600-normal-DXCRAa_8.woff +0 -0
- package/out/web/assets/mali-latin-400-normal-ByPcZ8Gx.woff +0 -0
- package/out/web/assets/mali-latin-400-normal-Cuc6Ykl8.woff2 +0 -0
- package/out/web/assets/mali-latin-500-normal-B01M-LP6.woff2 +0 -0
- package/out/web/assets/mali-latin-500-normal-Thgqw_9f.woff +0 -0
- package/out/web/assets/mali-latin-600-normal-B9TiUNpT.woff2 +0 -0
- package/out/web/assets/mali-latin-600-normal-CycpQCwU.woff +0 -0
- package/out/web/assets/mali-latin-ext-400-normal-DUVdJQO4.woff +0 -0
- package/out/web/assets/mali-latin-ext-400-normal-iCG1ALuJ.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-500-normal-BfJE4UMZ.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-500-normal-FoLEyOKS.woff +0 -0
- package/out/web/assets/mali-latin-ext-600-normal-BTvIfiCp.woff2 +0 -0
- package/out/web/assets/mali-latin-ext-600-normal-DAQcLVmD.woff +0 -0
- package/out/web/assets/mali-thai-400-normal-BO7A3bLZ.woff2 +0 -0
- package/out/web/assets/mali-thai-400-normal-CX9VrjTn.woff +0 -0
- package/out/web/assets/mali-thai-500-normal-Cph2qha9.woff +0 -0
- package/out/web/assets/mali-thai-500-normal-D89rMT77.woff2 +0 -0
- package/out/web/assets/mali-thai-600-normal-DPgXT6rZ.woff +0 -0
- package/out/web/assets/mali-thai-600-normal-DlTx3OsB.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-400-normal-DUKxzXaz.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-400-normal-gFDLvsOK.woff +0 -0
- package/out/web/assets/mali-vietnamese-500-normal--OY07q2c.woff +0 -0
- package/out/web/assets/mali-vietnamese-500-normal-KDrNRwfW.woff2 +0 -0
- package/out/web/assets/mali-vietnamese-600-normal-CtTMUU7T.woff +0 -0
- package/out/web/assets/mali-vietnamese-600-normal-DFlJr66u.woff2 +0 -0
- package/out/web/assets/mermaid.core-DYGGlqOf.js +0 -11
- package/out/web/assets/mitr-latin-400-normal-Cb18vPmZ.woff +0 -0
- package/out/web/assets/mitr-latin-400-normal-CwbkLQ4a.woff2 +0 -0
- package/out/web/assets/mitr-latin-500-normal-B4JOhzAi.woff +0 -0
- package/out/web/assets/mitr-latin-500-normal-BmClOow2.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-400-normal-B3CPG7Yo.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-400-normal-DTx65hiC.woff +0 -0
- package/out/web/assets/mitr-latin-ext-500-normal-B_Diajz1.woff2 +0 -0
- package/out/web/assets/mitr-latin-ext-500-normal-DYOsVaVT.woff +0 -0
- package/out/web/assets/mitr-thai-400-normal-CS4Do6aM.woff +0 -0
- package/out/web/assets/mitr-thai-400-normal-CXWaAdVj.woff2 +0 -0
- package/out/web/assets/mitr-thai-500-normal-CVdBrEVH.woff2 +0 -0
- package/out/web/assets/mitr-thai-500-normal-CW_B5D-i.woff +0 -0
- package/out/web/assets/mitr-vietnamese-400-normal-CPMGWyoC.woff2 +0 -0
- package/out/web/assets/mitr-vietnamese-400-normal-Z6XhIpdY.woff +0 -0
- package/out/web/assets/mitr-vietnamese-500-normal-CDrv0585.woff2 +0 -0
- package/out/web/assets/mitr-vietnamese-500-normal-CMQWyq-Z.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-400-normal-BaWBrqFP.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-400-normal-Dh_FJjOB.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-500-normal-BC04jsmm.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-500-normal-fyBKClF1.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-600-normal-CemcjnVR.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-600-normal-Dbc-dNO6.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-400-normal-B-1H0YkH.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-400-normal-nBP59pVw.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-500-normal-B-ZWb8SZ.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-500-normal-CrEHO7C8.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-600-normal-PkMZo0xa.woff +0 -0
- package/out/web/assets/noto-sans-thai-latin-ext-600-normal-maHHBsez.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-400-normal-BEOmKAI1.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-400-normal-Dxb_unuU.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-500-normal-BOGXO2tw.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-500-normal-CU_X86GQ.woff2 +0 -0
- package/out/web/assets/noto-sans-thai-thai-600-normal-CmgB8_JK.woff +0 -0
- package/out/web/assets/noto-sans-thai-thai-600-normal-Cs73sVjl.woff2 +0 -0
- package/out/web/assets/oauthManager-DNiwM8Rn.js +0 -2
- package/out/web/assets/oauthManager-DuamS1Av.css +0 -1
- package/out/web/assets/outfit-latin-300-normal-AWLfuCom.woff +0 -0
- package/out/web/assets/outfit-latin-300-normal-CRYTwY6m.woff2 +0 -0
- package/out/web/assets/outfit-latin-400-normal-BGsTXAXT.woff2 +0 -0
- package/out/web/assets/outfit-latin-400-normal-DMwTpYkH.woff +0 -0
- package/out/web/assets/outfit-latin-500-normal-ClnHRwRh.woff +0 -0
- package/out/web/assets/outfit-latin-500-normal-DKnIMDSk.woff2 +0 -0
- package/out/web/assets/outfit-latin-600-normal-B7SfZ07L.woff2 +0 -0
- package/out/web/assets/outfit-latin-600-normal-BEfTtDA7.woff +0 -0
- package/out/web/assets/outfit-latin-ext-300-normal-BYS6Dpvq.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-300-normal-CMIMshEd.woff +0 -0
- package/out/web/assets/outfit-latin-ext-400-normal-5tcqmc2S.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-400-normal-DHm7mdGe.woff +0 -0
- package/out/web/assets/outfit-latin-ext-500-normal-DrCvqoFD.woff +0 -0
- package/out/web/assets/outfit-latin-ext-500-normal-zeox_O30.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-600-normal-B85nYjL1.woff2 +0 -0
- package/out/web/assets/outfit-latin-ext-600-normal-CWJcPgd7.woff +0 -0
- package/out/web/assets/preload-helper-D0uHx7FM.js +0 -1
- package/out/web/assets/prompt-latin-400-normal-BQ9zjSN8.woff2 +0 -0
- package/out/web/assets/prompt-latin-400-normal-CxU4ec_r.woff +0 -0
- package/out/web/assets/prompt-latin-500-normal-B1edBDQ9.woff +0 -0
- package/out/web/assets/prompt-latin-500-normal-CxzxEHZc.woff2 +0 -0
- package/out/web/assets/prompt-latin-600-normal-CSDDLorv.woff +0 -0
- package/out/web/assets/prompt-latin-600-normal-hKZWXsc1.woff2 +0 -0
- package/out/web/assets/prompt-latin-ext-400-normal-1pHbN9uy.woff +0 -0
- package/out/web/assets/prompt-latin-ext-400-normal-DdSafGZ9.woff2 +0 -0
- package/out/web/assets/prompt-latin-ext-500-normal--EZ1um7s.woff2 +0 -0
- package/out/web/assets/prompt-latin-ext-500-normal-D-lI1EVT.woff +0 -0
- package/out/web/assets/prompt-latin-ext-600-normal-C8b50x67.woff +0 -0
- package/out/web/assets/prompt-latin-ext-600-normal-Cg9L7iJU.woff2 +0 -0
- package/out/web/assets/prompt-thai-400-normal-BrkKv8cO.woff2 +0 -0
- package/out/web/assets/prompt-thai-400-normal-DJypnfr3.woff +0 -0
- package/out/web/assets/prompt-thai-500-normal-C18pDUoL.woff2 +0 -0
- package/out/web/assets/prompt-thai-500-normal-D7YNqUJD.woff +0 -0
- package/out/web/assets/prompt-thai-600-normal-CYPViXds.woff +0 -0
- package/out/web/assets/prompt-thai-600-normal-MrdfU7zR.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-400-normal-BCPzsgPT.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-400-normal-D4pLyeNK.woff +0 -0
- package/out/web/assets/prompt-vietnamese-500-normal-DmzxmPwa.woff2 +0 -0
- package/out/web/assets/prompt-vietnamese-500-normal-w_sS_j2F.woff +0 -0
- package/out/web/assets/prompt-vietnamese-600-normal-1dyohtNh.woff +0 -0
- package/out/web/assets/prompt-vietnamese-600-normal-7QWjJBsF.woff2 +0 -0
- package/out/web/assets/sarabun-latin-400-normal-DmguIS-7.woff +0 -0
- package/out/web/assets/sarabun-latin-400-normal-URPBxl-K.woff2 +0 -0
- package/out/web/assets/sarabun-latin-500-normal-BjUTcdxu.woff2 +0 -0
- package/out/web/assets/sarabun-latin-500-normal-CJexTAnl.woff +0 -0
- package/out/web/assets/sarabun-latin-600-normal-9FonlkKx.woff +0 -0
- package/out/web/assets/sarabun-latin-600-normal-DMD3TROr.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-400-normal-BbP7GpLL.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-400-normal-BsmTn0SS.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-500-normal-Cot16Bd2.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-500-normal-DE1LysqI.woff2 +0 -0
- package/out/web/assets/sarabun-latin-ext-600-normal-0tXu9x_i.woff +0 -0
- package/out/web/assets/sarabun-latin-ext-600-normal-BRxjKUQ6.woff2 +0 -0
- package/out/web/assets/sarabun-thai-400-normal-C2DaJlKK.woff2 +0 -0
- package/out/web/assets/sarabun-thai-400-normal-CH-UbWgg.woff +0 -0
- package/out/web/assets/sarabun-thai-500-normal-BVssjame.woff2 +0 -0
- package/out/web/assets/sarabun-thai-500-normal-C3iDLEzi.woff +0 -0
- package/out/web/assets/sarabun-thai-600-normal-3dIAQ-_s.woff2 +0 -0
- package/out/web/assets/sarabun-thai-600-normal-DWKeTe6a.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-400-normal-DPfkSCMy.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-400-normal-igdrzAGY.woff2 +0 -0
- package/out/web/assets/sarabun-vietnamese-500-normal-CpRVvGRU.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-500-normal-Dpe7Br9m.woff2 +0 -0
- package/out/web/assets/sarabun-vietnamese-600-normal-BMbOgAW-.woff +0 -0
- package/out/web/assets/sarabun-vietnamese-600-normal-DkxrOlLB.woff2 +0 -0
- package/out/web/assets/stateDiagram-v2-4QOOHH4V-s6P9g2_b.js +0 -1
- package/out/web/assets/swimlanesDiagram-VK2B7HYN-CV9fOLrV.js +0 -8
- package/out/web/assets/tauri-CNrHQ2Gb.js +0 -3
- package/out/web/assets/window-DkIhgI7B.js +0 -1
- package/skills-lock.json +0 -41
- package/src/renderer/public/Live2DCubismCore.js +0 -9
- package/src/renderer/src/companionWidget.ts +0 -95
- package/src/renderer/src/components/Live2DStage.tsx +0 -389
- package/src/renderer/src/components/ModelPanel.tsx +0 -154
- package/src/renderer/src/css/model.css +0 -627
- package/src/renderer/src-web/companionWidget.ts +0 -37
- package/src/renderer/src-web/components/ModelPanel.tsx +0 -12
- package/src/renderer/src-web/css/model.css +0 -628
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { createLibraryTransport } from '../shared/library/transport'
|
|
2
|
+
import { createSourcesTransport } from '../shared/conversation/sourcesTransport'
|
|
1
3
|
export * from '../shared/types'
|
|
2
4
|
import type { MintPlatformApi } from '../shared/platform'
|
|
5
|
+
import { createConversationTransport } from '../shared/conversation/transport'
|
|
3
6
|
import type {
|
|
4
7
|
|
|
5
8
|
RuntimeStatus,
|
|
@@ -8,12 +11,13 @@ import type {
|
|
|
8
11
|
DocumentAttachment,
|
|
9
12
|
AgentProgress,
|
|
10
13
|
InteractionMemory,
|
|
14
|
+
ConversationSnapshot,
|
|
15
|
+
ConversationChanges,
|
|
11
16
|
ChatSession,
|
|
12
17
|
PictureEntry,
|
|
13
18
|
ImageGenRequest,
|
|
14
19
|
ImageGenProviders,
|
|
15
20
|
ImageGenResponse,
|
|
16
|
-
WorkspaceTreeEntry,
|
|
17
21
|
CodeEdit,
|
|
18
22
|
CodeEditProposal,
|
|
19
23
|
LearnedSkill,
|
|
@@ -22,14 +26,14 @@ import type {
|
|
|
22
26
|
CronJobDraft,
|
|
23
27
|
LinkedFolder,
|
|
24
28
|
LinkedFolderDraft,
|
|
29
|
+
LinkedFolderNote,
|
|
30
|
+
LinkedFolderStatus,
|
|
25
31
|
GitCheckpoint,
|
|
32
|
+
GitBranchInfo,
|
|
33
|
+
GitBranchChangeOutcome,
|
|
26
34
|
} from '../shared/types'
|
|
27
35
|
|
|
28
36
|
|
|
29
|
-
type DesktopStreamEvent =
|
|
30
|
-
| { type: 'chunk'; chunk: string }
|
|
31
|
-
| { type: 'progress'; progress: AgentProgress }
|
|
32
|
-
|
|
33
37
|
export type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
|
|
34
38
|
import type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
|
|
35
39
|
|
|
@@ -38,9 +42,13 @@ export const isTauriRuntime = () => (
|
|
|
38
42
|
typeof window !== 'undefined' && Boolean((window as any).__TAURI_INTERNALS__)
|
|
39
43
|
)
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
const WEB_SETTINGS_CHANGED_EVENT = 'mint:web-settings-changed'
|
|
46
|
+
|
|
47
|
+
function dispatchWebSettingsChanged(config: any) {
|
|
48
|
+
window.dispatchEvent(new CustomEvent(WEB_SETTINGS_CHANGED_EVENT, { detail: config }))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
import { sendBrowserNotification, clearBrowserNotifications, openNotificationChat } from '../shared/utils/notifications'
|
|
44
52
|
|
|
45
53
|
/**
|
|
46
54
|
* Root-relative: the web build's SPA fallback serves index-web.html at deep
|
|
@@ -398,9 +406,9 @@ export async function fetchProviderModels(
|
|
|
398
406
|
return invoke<string[]>('fetch_provider_models', { provider, apiKey, baseUrl })
|
|
399
407
|
}
|
|
400
408
|
|
|
401
|
-
/** Fetch
|
|
402
|
-
*
|
|
403
|
-
*
|
|
409
|
+
/** Fetch image model choices from the shared Rust catalog.
|
|
410
|
+
* Discovered models precede missing presets; blank overrides use the saved key.
|
|
411
|
+
* Provider discovery is cached for 1 hour on the Rust side. */
|
|
404
412
|
export async function fetchImageProviderModels(
|
|
405
413
|
provider: string,
|
|
406
414
|
apiKey: string = '',
|
|
@@ -417,9 +425,9 @@ export async function fetchImageProviderModels(
|
|
|
417
425
|
return invoke<string[]>('fetch_image_provider_models', { provider, apiKey: apiKey || '' })
|
|
418
426
|
}
|
|
419
427
|
|
|
420
|
-
/** Fetch
|
|
421
|
-
*
|
|
422
|
-
*
|
|
428
|
+
/** Fetch video model choices from the shared Rust catalog.
|
|
429
|
+
* Discovered models precede missing presets; blank overrides use the saved key.
|
|
430
|
+
* Provider discovery is cached for 1 hour on the Rust side. */
|
|
423
431
|
export async function fetchVideoProviderModels(
|
|
424
432
|
provider: string,
|
|
425
433
|
apiKey: string = '',
|
|
@@ -436,10 +444,9 @@ export async function fetchVideoProviderModels(
|
|
|
436
444
|
return invoke<string[]>('fetch_video_provider_models', { provider, apiKey: apiKey || '' })
|
|
437
445
|
}
|
|
438
446
|
|
|
439
|
-
/** Fetch
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
* Results are cached for 1 hour on the Rust side. */
|
|
447
|
+
/** Fetch Gemini Live model choices from the shared Rust catalog.
|
|
448
|
+
* Discovered models precede missing presets; blank overrides use the saved key.
|
|
449
|
+
* Provider discovery is cached for 1 hour on the Rust side. */
|
|
443
450
|
export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
|
|
444
451
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
445
452
|
const params = new URLSearchParams({ apiKey: apiKey || '' })
|
|
@@ -453,178 +460,12 @@ export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
|
|
|
453
460
|
return invoke<string[]>('fetch_gemini_live_models', { apiKey: apiKey || '' })
|
|
454
461
|
}
|
|
455
462
|
|
|
456
|
-
export
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
workspacePath?: string | null,
|
|
463
|
-
chatId?: string | null,
|
|
464
|
-
agentId?: string | null,
|
|
465
|
-
): Promise<ChatResponse> {
|
|
466
|
-
const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
|
|
467
|
-
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
468
|
-
const API_BASE = getApiBase();
|
|
469
|
-
try {
|
|
470
|
-
const res = await authFetch(`${API_BASE}/chat`, {
|
|
471
|
-
method: 'POST',
|
|
472
|
-
headers: { 'Content-Type': 'application/json' },
|
|
473
|
-
body: JSON.stringify({ message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId })
|
|
474
|
-
});
|
|
475
|
-
const data = await res.json().catch(() => null);
|
|
476
|
-
if (!res.ok) {
|
|
477
|
-
return {
|
|
478
|
-
provider: 'error',
|
|
479
|
-
model: 'error',
|
|
480
|
-
text: data?.text || data?.message || data?.status || `Local API returned HTTP ${res.status}`,
|
|
481
|
-
};
|
|
482
|
-
}
|
|
483
|
-
if (!data || typeof data.text !== 'string') {
|
|
484
|
-
return {
|
|
485
|
-
provider: 'error',
|
|
486
|
-
model: 'error',
|
|
487
|
-
text: 'Local API returned an invalid chat response.',
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
return data;
|
|
491
|
-
} catch (e) {
|
|
492
|
-
console.error("Failed to send chat message to local server:", e);
|
|
493
|
-
return { provider: 'error', model: 'error', text: `Failed to connect to Local API Server: ${e}` };
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
497
|
-
const response = await invoke<ChatResponse>('send_chat_message', {
|
|
498
|
-
request: { message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId },
|
|
499
|
-
})
|
|
500
|
-
if (imageDataUri) {
|
|
501
|
-
await invoke('save_pictures', {
|
|
502
|
-
images: imageDataUri.split(' '),
|
|
503
|
-
source: 'chat',
|
|
504
|
-
message: outgoingMessage,
|
|
505
|
-
})
|
|
506
|
-
}
|
|
507
|
-
if (videoDataUri) {
|
|
508
|
-
await invoke('save_pictures', {
|
|
509
|
-
images: videoDataUri.split(' '),
|
|
510
|
-
source: 'chat',
|
|
511
|
-
message: outgoingMessage,
|
|
512
|
-
})
|
|
513
|
-
}
|
|
514
|
-
return response
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
export async function streamChatMessage(
|
|
518
|
-
message: string,
|
|
519
|
-
onChunk: (chunk: string) => void,
|
|
520
|
-
imageDataUri?: string | null,
|
|
521
|
-
audioDataUri?: string | null,
|
|
522
|
-
videoDataUri?: string | null,
|
|
523
|
-
systemInstruction = '',
|
|
524
|
-
onProgress?: (progress: AgentProgress) => void,
|
|
525
|
-
documentAttachment?: DocumentAttachment | null,
|
|
526
|
-
workspacePath?: string | null,
|
|
527
|
-
chatId?: string | null,
|
|
528
|
-
agentId?: string | null,
|
|
529
|
-
// Unused on web (no plan-mode-approval UI here) — kept only so this positional
|
|
530
|
-
// arg list stays aligned with the desktop `tauri.ts`, since the shared
|
|
531
|
-
// `MintDashboard.tsx` call site passes the same argument list to both builds.
|
|
532
|
-
_planMode?: boolean,
|
|
533
|
-
pinnedMcpServer?: string | null,
|
|
534
|
-
// Web has no separate Tauri event bus for approvals (unlike desktop's
|
|
535
|
-
// global `listen('tool-approval-requested', ...)`), so the server sends
|
|
536
|
-
// an `approval-requested` event down this same ndjson stream instead —
|
|
537
|
-
// this callback is how the caller learns about it.
|
|
538
|
-
onApprovalRequested?: (payload: { token: string; approval: any }) => void,
|
|
539
|
-
): Promise<ChatResponse> {
|
|
540
|
-
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
541
|
-
const API_BASE = getApiBase();
|
|
542
|
-
const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri);
|
|
543
|
-
const res = await authFetch(`${API_BASE}/chat-stream`, {
|
|
544
|
-
method: 'POST',
|
|
545
|
-
headers: { 'Content-Type': 'application/json' },
|
|
546
|
-
body: JSON.stringify({ message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer })
|
|
547
|
-
});
|
|
548
|
-
if (!res.ok) {
|
|
549
|
-
const data = await res.json().catch(() => null);
|
|
550
|
-
throw new Error(data?.text || data?.message || `HTTP ${res.status}`);
|
|
551
|
-
}
|
|
552
|
-
const reader = res.body?.getReader();
|
|
553
|
-
if (!reader) {
|
|
554
|
-
throw new Error("No response body reader");
|
|
555
|
-
}
|
|
556
|
-
const decoder = new TextDecoder();
|
|
557
|
-
let buffer = '';
|
|
558
|
-
let finalResponse: ChatResponse | null = null;
|
|
559
|
-
while (true) {
|
|
560
|
-
const { value, done } = await reader.read();
|
|
561
|
-
if (done) break;
|
|
562
|
-
buffer += decoder.decode(value, { stream: true });
|
|
563
|
-
const lines = buffer.split('\n');
|
|
564
|
-
buffer = lines.pop() || '';
|
|
565
|
-
for (const line of lines) {
|
|
566
|
-
if (!line.trim()) continue;
|
|
567
|
-
try {
|
|
568
|
-
const event = JSON.parse(line);
|
|
569
|
-
if (event.type === 'chunk') {
|
|
570
|
-
onChunk(event.chunk);
|
|
571
|
-
} else if (event.type === 'progress') {
|
|
572
|
-
onProgress?.(event.progress);
|
|
573
|
-
} else if (event.type === 'done') {
|
|
574
|
-
finalResponse = event.response;
|
|
575
|
-
} else if (event.type === 'approval-requested') {
|
|
576
|
-
onApprovalRequested?.({ token: event.token, approval: event.approval });
|
|
577
|
-
}
|
|
578
|
-
} catch (e) {
|
|
579
|
-
console.error("Failed to parse stream line:", line, e);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
if (finalResponse) return finalResponse;
|
|
584
|
-
throw new Error("Stream closed without a final response");
|
|
585
|
-
}
|
|
586
|
-
const { invoke, Channel } = await import('@tauri-apps/api/core')
|
|
587
|
-
const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
|
|
588
|
-
const onEvent = new Channel<DesktopStreamEvent>()
|
|
589
|
-
onEvent.onmessage = (event) => {
|
|
590
|
-
if (event.type === 'chunk') onChunk(event.chunk)
|
|
591
|
-
else onProgress?.(event.progress)
|
|
592
|
-
}
|
|
593
|
-
const response = await invoke<ChatResponse>('stream_chat_message', {
|
|
594
|
-
request: { message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer },
|
|
595
|
-
onEvent,
|
|
596
|
-
})
|
|
597
|
-
if (imageDataUri) {
|
|
598
|
-
await invoke('save_pictures', {
|
|
599
|
-
images: imageDataUri.split(' '),
|
|
600
|
-
source: 'chat',
|
|
601
|
-
message: outgoingMessage,
|
|
602
|
-
})
|
|
603
|
-
}
|
|
604
|
-
if (videoDataUri) {
|
|
605
|
-
await invoke('save_pictures', {
|
|
606
|
-
images: videoDataUri.split(' '),
|
|
607
|
-
source: 'chat',
|
|
608
|
-
message: outgoingMessage,
|
|
609
|
-
})
|
|
610
|
-
}
|
|
611
|
-
return response
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
function withImagePlaceholder(message: string, imageDataUri?: string | null, videoDataUri?: string | null) {
|
|
615
|
-
let finalMessage = message
|
|
616
|
-
if (imageDataUri && !finalMessage.includes('[Image #1]')) {
|
|
617
|
-
const imageCount = imageDataUri.split(/\s+/).filter(Boolean).length
|
|
618
|
-
const markers = Array.from({ length: imageCount }, (_, index) => `[Image #${index + 1}]`).join(' ')
|
|
619
|
-
if (markers) finalMessage = `${finalMessage} ${markers}`
|
|
620
|
-
}
|
|
621
|
-
if (videoDataUri && !finalMessage.includes('[Video #1]')) {
|
|
622
|
-
const videoCount = videoDataUri.split(/\s+/).filter(Boolean).length
|
|
623
|
-
const markers = Array.from({ length: videoCount }, (_, index) => `[Video #${index + 1}]`).join(' ')
|
|
624
|
-
if (markers) finalMessage = `${finalMessage} ${markers}`
|
|
625
|
-
}
|
|
626
|
-
return finalMessage
|
|
627
|
-
}
|
|
463
|
+
export const { sendChatMessage, streamChatMessage } = createConversationTransport({
|
|
464
|
+
isNative: isTauriRuntime,
|
|
465
|
+
apiBase: getLocalApiBase,
|
|
466
|
+
fetch: authFetch,
|
|
467
|
+
ownerToken: getStoredAuthToken,
|
|
468
|
+
})
|
|
628
469
|
|
|
629
470
|
export async function getTtsUrls(text: string): Promise<TtsUrl[]> {
|
|
630
471
|
if (typeof window === 'undefined') return []
|
|
@@ -739,6 +580,29 @@ export async function getRecentInteractions(limit = 50, chatId?: string | null,
|
|
|
739
580
|
return invoke<InteractionMemory[]>('get_recent_interactions', { limit, chatId, workspacePath })
|
|
740
581
|
}
|
|
741
582
|
|
|
583
|
+
export async function getConversationSnapshot(chatId: string, beforeId?: number | null, limit = 50): Promise<ConversationSnapshot> {
|
|
584
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
585
|
+
const params = new URLSearchParams({ chatId, limit: String(limit) })
|
|
586
|
+
if (beforeId != null) params.set('beforeId', String(beforeId))
|
|
587
|
+
const response = await authFetch(`${getApiBase()}/conversation-snapshot?${params}`)
|
|
588
|
+
if (!response.ok) throw new Error(`Conversation snapshot failed: ${response.status}`)
|
|
589
|
+
return response.json()
|
|
590
|
+
}
|
|
591
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
592
|
+
return invoke<ConversationSnapshot>('get_conversation_snapshot', { chatId, beforeId, limit })
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
export async function getConversationChanges(chatId: string, after: number, limit = 100): Promise<ConversationChanges> {
|
|
596
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
597
|
+
const params = new URLSearchParams({ chatId, after: String(after), limit: String(limit) })
|
|
598
|
+
const response = await authFetch(`${getApiBase()}/conversation-changes?${params}`)
|
|
599
|
+
if (!response.ok) throw new Error(`Conversation changes failed: ${response.status}`)
|
|
600
|
+
return response.json()
|
|
601
|
+
}
|
|
602
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
603
|
+
return invoke<ConversationChanges>('get_conversation_changes', { chatId, after, limit })
|
|
604
|
+
}
|
|
605
|
+
|
|
742
606
|
export async function saveSystemInteraction(
|
|
743
607
|
chatId: string,
|
|
744
608
|
userText: string,
|
|
@@ -804,6 +668,23 @@ export async function listChatSessions(): Promise<ChatSession[]> {
|
|
|
804
668
|
return invoke<ChatSession[]>('list_chat_sessions')
|
|
805
669
|
}
|
|
806
670
|
|
|
671
|
+
export async function updateChatSessionWorkspace(chatId: string, workspacePath: string | null): Promise<void> {
|
|
672
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
673
|
+
const res = await authFetch(`${getApiBase()}/chat-sessions/workspace`, {
|
|
674
|
+
method: 'POST',
|
|
675
|
+
headers: { 'Content-Type': 'application/json' },
|
|
676
|
+
body: JSON.stringify({ chatId, workspacePath })
|
|
677
|
+
})
|
|
678
|
+
if (!res.ok) {
|
|
679
|
+
const data = await res.json().catch(() => null)
|
|
680
|
+
throw new Error(data?.error || `Could not save conversation workspace (HTTP ${res.status})`)
|
|
681
|
+
}
|
|
682
|
+
return
|
|
683
|
+
}
|
|
684
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
685
|
+
await invoke('update_chat_session_workspace', { chatId, workspacePath })
|
|
686
|
+
}
|
|
687
|
+
|
|
807
688
|
export async function deleteChatSession(chatId: string): Promise<number> {
|
|
808
689
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
809
690
|
const API_BASE = getApiBase();
|
|
@@ -1148,7 +1029,9 @@ export function installTauriAdapters() {
|
|
|
1148
1029
|
headers: { 'Content-Type': 'application/json' },
|
|
1149
1030
|
body: JSON.stringify(config)
|
|
1150
1031
|
});
|
|
1151
|
-
|
|
1032
|
+
const data = await res.json();
|
|
1033
|
+
if (res.ok) dispatchWebSettingsChanged(config)
|
|
1034
|
+
return data;
|
|
1152
1035
|
} catch (e) {
|
|
1153
1036
|
console.error("Failed to save settings to local server:", e);
|
|
1154
1037
|
return {};
|
|
@@ -1194,16 +1077,9 @@ export function installTauriAdapters() {
|
|
|
1194
1077
|
|
|
1195
1078
|
(window as any).widgetAPI = {
|
|
1196
1079
|
onStateChange: () => {},
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
onScreenshot: () => {},
|
|
1201
|
-
sendSelection: () => {},
|
|
1202
|
-
startContinuousTranslation: () => {},
|
|
1203
|
-
stopContinuousTranslation: () => {},
|
|
1204
|
-
onTranslationResult: () => {},
|
|
1205
|
-
closePicker: () => {},
|
|
1206
|
-
setOverlayInteractable: () => {},
|
|
1080
|
+
openChat: async () => {},
|
|
1081
|
+
setVisible: async () => {},
|
|
1082
|
+
startDragging: async () => {},
|
|
1207
1083
|
};
|
|
1208
1084
|
|
|
1209
1085
|
(window as any).api = {
|
|
@@ -1291,7 +1167,9 @@ export function installTauriAdapters() {
|
|
|
1291
1167
|
headers: { 'Content-Type': 'application/json' },
|
|
1292
1168
|
body: JSON.stringify(config)
|
|
1293
1169
|
});
|
|
1294
|
-
|
|
1170
|
+
const data = await res.json();
|
|
1171
|
+
if (res.ok) dispatchWebSettingsChanged(config)
|
|
1172
|
+
return data;
|
|
1295
1173
|
} catch (e) {
|
|
1296
1174
|
return {};
|
|
1297
1175
|
}
|
|
@@ -1301,10 +1179,12 @@ export function installTauriAdapters() {
|
|
|
1301
1179
|
window.history.replaceState(null, '', window.location.pathname + window.location.search)
|
|
1302
1180
|
}
|
|
1303
1181
|
},
|
|
1304
|
-
onSettingsChanged: () => {
|
|
1182
|
+
onSettingsChanged: (callback: (config: any) => void) => {
|
|
1183
|
+
window.addEventListener(WEB_SETTINGS_CHANGED_EVENT, (event) => {
|
|
1184
|
+
callback((event as CustomEvent).detail)
|
|
1185
|
+
})
|
|
1186
|
+
},
|
|
1305
1187
|
startVision: () => {},
|
|
1306
|
-
onVisionReady: async () => () => {},
|
|
1307
|
-
captureSilentScreen: async () => '',
|
|
1308
1188
|
getSmartContext: async () => {
|
|
1309
1189
|
try {
|
|
1310
1190
|
const res = await authFetch(`${API_BASE}/smart-context`);
|
|
@@ -1342,20 +1222,8 @@ export function installTauriAdapters() {
|
|
|
1342
1222
|
}
|
|
1343
1223
|
},
|
|
1344
1224
|
onSpotlightToChat: async () => () => {},
|
|
1345
|
-
notifyAiResponse:
|
|
1346
|
-
|
|
1347
|
-
let permission = Notification.permission
|
|
1348
|
-
if (permission === 'default') {
|
|
1349
|
-
permission = await Notification.requestPermission()
|
|
1350
|
-
}
|
|
1351
|
-
if (permission === 'granted') {
|
|
1352
|
-
lastAiNotification = new Notification('Mint Agent', { body: preview })
|
|
1353
|
-
}
|
|
1354
|
-
},
|
|
1355
|
-
clearAiNotifications: () => {
|
|
1356
|
-
lastAiNotification?.close()
|
|
1357
|
-
lastAiNotification = null
|
|
1358
|
-
},
|
|
1225
|
+
notifyAiResponse: (preview: string, chatId?: string) => sendBrowserNotification(preview, chatId, openNotificationChat),
|
|
1226
|
+
clearAiNotifications: clearBrowserNotifications,
|
|
1359
1227
|
getTtsUrls: async () => [],
|
|
1360
1228
|
setAiState: () => {},
|
|
1361
1229
|
};
|
|
@@ -1457,58 +1325,9 @@ export function installTauriAdapters() {
|
|
|
1457
1325
|
const { listen } = await import('@tauri-apps/api/event')
|
|
1458
1326
|
void listen<string>('widget-state', (event) => callback(event.payload))
|
|
1459
1327
|
},
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
onScreenshot: async (callback) => {
|
|
1464
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1465
|
-
try {
|
|
1466
|
-
const image = await captureSharedScreen()
|
|
1467
|
-
callback(image)
|
|
1468
|
-
} catch (reason) {
|
|
1469
|
-
console.warn('Screen share capture failed, falling back to native capture:', reason)
|
|
1470
|
-
void invoke<string>('capture_silent_screen').then(callback)
|
|
1471
|
-
}
|
|
1472
|
-
},
|
|
1473
|
-
sendSelection: async (image) => {
|
|
1474
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1475
|
-
return void invoke('submit_screen_selection', { image })
|
|
1476
|
-
},
|
|
1477
|
-
startContinuousTranslation: (rect) => {
|
|
1478
|
-
let translationTimer: ReturnType<typeof setInterval> | null = null
|
|
1479
|
-
const translate = async () => {
|
|
1480
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1481
|
-
void invoke<string>('translate_capture_region', { rect })
|
|
1482
|
-
.then((text) => window.dispatchEvent(new CustomEvent('mint-translation', { detail: text })))
|
|
1483
|
-
.catch((reason) => {
|
|
1484
|
-
window.dispatchEvent(new CustomEvent('mint-translation', { detail: String(reason) }))
|
|
1485
|
-
})
|
|
1486
|
-
}
|
|
1487
|
-
translate()
|
|
1488
|
-
translationTimer = setInterval(translate, 3000)
|
|
1489
|
-
|
|
1490
|
-
// Clean up helper attached to window if needed
|
|
1491
|
-
if ((window as any)._stopTranslate) (window as any)._stopTranslate()
|
|
1492
|
-
;(window as any)._stopTranslate = () => {
|
|
1493
|
-
if (translationTimer) clearInterval(translationTimer)
|
|
1494
|
-
}
|
|
1495
|
-
},
|
|
1496
|
-
stopContinuousTranslation: () => {
|
|
1497
|
-
if ((window as any)._stopTranslate) {
|
|
1498
|
-
(window as any)._stopTranslate()
|
|
1499
|
-
}
|
|
1500
|
-
},
|
|
1501
|
-
onTranslationResult: (callback) => {
|
|
1502
|
-
window.addEventListener('mint-translation', ((event: CustomEvent<string>) => {
|
|
1503
|
-
callback(event.detail)
|
|
1504
|
-
}) as EventListener)
|
|
1505
|
-
},
|
|
1506
|
-
closePicker: async () => {
|
|
1507
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1508
|
-
const { getCurrentWindow } = await import('@tauri-apps/api/window')
|
|
1509
|
-
return invoke('close_desktop_window', { label: getCurrentWindow().label })
|
|
1510
|
-
},
|
|
1511
|
-
setOverlayInteractable: () => {},
|
|
1328
|
+
openChat: async () => {},
|
|
1329
|
+
setVisible: async () => {},
|
|
1330
|
+
startDragging: async () => {},
|
|
1512
1331
|
}
|
|
1513
1332
|
|
|
1514
1333
|
window.api = {
|
|
@@ -1556,23 +1375,7 @@ export function installTauriAdapters() {
|
|
|
1556
1375
|
onSettingsChanged: settingsChanged,
|
|
1557
1376
|
startVision: async () => {
|
|
1558
1377
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1559
|
-
|
|
1560
|
-
const image = await captureSharedScreen()
|
|
1561
|
-
window.localStorage.setItem('mint:pending-screen-capture', image)
|
|
1562
|
-
} catch (reason) {
|
|
1563
|
-
console.warn('Screen share capture failed before opening picker:', reason)
|
|
1564
|
-
const image = await invoke<string>('capture_silent_screen')
|
|
1565
|
-
window.localStorage.setItem('mint:pending-screen-capture', image)
|
|
1566
|
-
}
|
|
1567
|
-
return invoke('start_screen_capture')
|
|
1568
|
-
},
|
|
1569
|
-
onVisionReady: async (callback) => {
|
|
1570
|
-
const { listen } = await import('@tauri-apps/api/event')
|
|
1571
|
-
return listen<string>('vision-ready', (event) => callback(event.payload))
|
|
1572
|
-
},
|
|
1573
|
-
captureSilentScreen: async () => {
|
|
1574
|
-
const { invoke } = await import('@tauri-apps/api/core')
|
|
1575
|
-
return invoke('capture_silent_screen')
|
|
1378
|
+
return invoke('start_live_translate')
|
|
1576
1379
|
},
|
|
1577
1380
|
getSmartContext: async () => {
|
|
1578
1381
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
@@ -1600,19 +1403,10 @@ export function installTauriAdapters() {
|
|
|
1600
1403
|
const { listen } = await import('@tauri-apps/api/event')
|
|
1601
1404
|
return listen<string>('spotlight-to-chat', (event) => callback(event.payload))
|
|
1602
1405
|
},
|
|
1603
|
-
notifyAiResponse: async (preview) => {
|
|
1604
|
-
const {
|
|
1605
|
-
|
|
1606
|
-
if (!granted) {
|
|
1607
|
-
granted = (await requestPermission()) === 'granted'
|
|
1608
|
-
}
|
|
1609
|
-
if (granted) {
|
|
1610
|
-
sendNotification({ title: 'Mint Agent', body: preview })
|
|
1611
|
-
}
|
|
1406
|
+
notifyAiResponse: async (preview, chatId) => {
|
|
1407
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1408
|
+
await invoke('send_mint_notification', { body: preview, chatId: chatId ?? null })
|
|
1612
1409
|
},
|
|
1613
|
-
// The plugin has no reliable cross-platform way to dismiss an
|
|
1614
|
-
// already-shown OS notification from JS — best-effort no-op; there's
|
|
1615
|
-
// simply nothing stale left for the next unfocused reply to build on.
|
|
1616
1410
|
clearAiNotifications: () => {},
|
|
1617
1411
|
getTtsUrls: async (text) => {
|
|
1618
1412
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
@@ -1625,51 +1419,14 @@ export function installTauriAdapters() {
|
|
|
1625
1419
|
}
|
|
1626
1420
|
}
|
|
1627
1421
|
|
|
1628
|
-
async function captureSharedScreen(): Promise<string> {
|
|
1629
|
-
// On Linux (especially under Wayland/WebKitGTK), getDisplayMedia often returns a black screen
|
|
1630
|
-
// or fails silently. Bypass it to force fallback to native screenshot commands.
|
|
1631
|
-
if (navigator.userAgent.toLowerCase().includes('linux')) {
|
|
1632
|
-
throw new Error('Linux detected, bypassing getDisplayMedia to use native screenshot tools')
|
|
1633
|
-
}
|
|
1634
|
-
|
|
1635
|
-
if (!navigator.mediaDevices?.getDisplayMedia) {
|
|
1636
|
-
throw new Error('getDisplayMedia is not available')
|
|
1637
|
-
}
|
|
1638
|
-
|
|
1639
|
-
const stream = await navigator.mediaDevices.getDisplayMedia({
|
|
1640
|
-
video: true,
|
|
1641
|
-
audio: false,
|
|
1642
|
-
})
|
|
1643
|
-
try {
|
|
1644
|
-
const video = document.createElement('video')
|
|
1645
|
-
video.srcObject = stream
|
|
1646
|
-
video.muted = true
|
|
1647
|
-
await video.play()
|
|
1648
|
-
await new Promise<void>((resolve) => {
|
|
1649
|
-
if (video.videoWidth > 0 && video.videoHeight > 0) {
|
|
1650
|
-
resolve()
|
|
1651
|
-
} else {
|
|
1652
|
-
video.onloadedmetadata = () => resolve()
|
|
1653
|
-
}
|
|
1654
|
-
})
|
|
1655
|
-
|
|
1656
|
-
const canvas = document.createElement('canvas')
|
|
1657
|
-
canvas.width = video.videoWidth || window.screen.width
|
|
1658
|
-
canvas.height = video.videoHeight || window.screen.height
|
|
1659
|
-
const context = canvas.getContext('2d')
|
|
1660
|
-
if (!context) throw new Error('Unable to create screen capture canvas')
|
|
1661
|
-
context.drawImage(video, 0, 0, canvas.width, canvas.height)
|
|
1662
|
-
return canvas.toDataURL('image/png')
|
|
1663
|
-
} finally {
|
|
1664
|
-
stream.getTracks().forEach((track) => track.stop())
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
|
|
1668
1422
|
export async function listLearnedSkills(workspacePath?: string): Promise<LearnedSkill[]> {
|
|
1669
1423
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1670
1424
|
try {
|
|
1671
1425
|
const API_BASE = getLocalApiBase()
|
|
1672
|
-
const
|
|
1426
|
+
const params = new URLSearchParams()
|
|
1427
|
+
if (workspacePath?.trim()) params.set('workspacePath', workspacePath)
|
|
1428
|
+
const suffix = params.size ? `?${params.toString()}` : ''
|
|
1429
|
+
const res = await authFetch(`${API_BASE}/learned-skills${suffix}`)
|
|
1673
1430
|
if (res.ok) {
|
|
1674
1431
|
return await res.json()
|
|
1675
1432
|
}
|
|
@@ -1789,19 +1546,20 @@ export async function deleteSubagent(sourcePath: string): Promise<void> {
|
|
|
1789
1546
|
|
|
1790
1547
|
export async function runSlashCommand(
|
|
1791
1548
|
input: string,
|
|
1792
|
-
cwd?: string | null
|
|
1549
|
+
cwd?: string | null,
|
|
1550
|
+
chatId?: string | null
|
|
1793
1551
|
): Promise<import('../shared/platform').SlashResponse> {
|
|
1794
1552
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1795
1553
|
const res = await authFetch(`${getLocalApiBase()}/slash`, {
|
|
1796
1554
|
method: 'POST',
|
|
1797
1555
|
headers: { 'Content-Type': 'application/json' },
|
|
1798
|
-
body: JSON.stringify({ input, cwd: cwd ?? null })
|
|
1556
|
+
body: JSON.stringify({ input, cwd: cwd ?? null, chat_id: chatId ?? null })
|
|
1799
1557
|
})
|
|
1800
1558
|
if (!res.ok) return { kind: 'not_handled' }
|
|
1801
1559
|
return res.json()
|
|
1802
1560
|
}
|
|
1803
1561
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1804
|
-
return invoke('run_slash_command', { input, cwd: cwd ?? null })
|
|
1562
|
+
return invoke('run_slash_command', { input, cwd: cwd ?? null, chatId: chatId ?? null })
|
|
1805
1563
|
}
|
|
1806
1564
|
|
|
1807
1565
|
export async function listCronJobs(): Promise<CronJob[]> {
|
|
@@ -1858,7 +1616,7 @@ export async function setCronJobEnabled(id: string, enabled: boolean): Promise<C
|
|
|
1858
1616
|
export async function listLinkedFolders(): Promise<Record<string, LinkedFolder>> {
|
|
1859
1617
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1860
1618
|
const res = await authFetch(`${getLocalApiBase()}/linked-folders`)
|
|
1861
|
-
if (!res.ok)
|
|
1619
|
+
if (!res.ok) throw new Error('Failed to load linked folders')
|
|
1862
1620
|
return res.json()
|
|
1863
1621
|
}
|
|
1864
1622
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
@@ -1894,38 +1652,160 @@ export async function removeLinkedFolder(name: string): Promise<void> {
|
|
|
1894
1652
|
await invoke('remove_linked_folder', { name })
|
|
1895
1653
|
}
|
|
1896
1654
|
|
|
1897
|
-
export async function
|
|
1655
|
+
export async function linkedFolderStatus(name: string): Promise<LinkedFolderStatus> {
|
|
1656
|
+
const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/status`)
|
|
1657
|
+
if (!res.ok) throw new Error('Failed to load folder status')
|
|
1658
|
+
return res.json()
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
export async function refreshLinkedFolder(name: string): Promise<LinkedFolderStatus> {
|
|
1662
|
+
const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/refresh`, { method: 'POST' })
|
|
1663
|
+
if (!res.ok) throw new Error('Failed to refresh folder')
|
|
1664
|
+
return res.json()
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
export async function listLinkedFolderNotes(name: string): Promise<LinkedFolderNote[]> {
|
|
1668
|
+
const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/notes`)
|
|
1669
|
+
if (!res.ok) throw new Error('Failed to load notes')
|
|
1670
|
+
return res.json()
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
export async function readLinkedFolderNote(name: string, id: string): Promise<string> {
|
|
1674
|
+
const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/notes/${encodeURIComponent(id)}`)
|
|
1675
|
+
if (!res.ok) throw new Error('Failed to read note')
|
|
1676
|
+
return (await res.json()).content
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
export async function openLinkedFolderNote(name: string, id: string): Promise<void> {
|
|
1680
|
+
if (!isTauriRuntime()) return
|
|
1681
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1682
|
+
await invoke('open_linked_folder_note', { name, id })
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
export async function getWorkspaceSnapshot(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1898
1686
|
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1899
1687
|
return {
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
kind: 'directory',
|
|
1903
|
-
children: [
|
|
1904
|
-
{ name: 'src', path: 'src', kind: 'directory', children: [] },
|
|
1905
|
-
{ name: 'package.json', path: 'package.json', kind: 'file', children: [] },
|
|
1906
|
-
],
|
|
1688
|
+
path: operation.root, revision: operation.revision,
|
|
1689
|
+
git: { isRepository: false, currentBranch: null, detachedHead: null, branches: [], remoteBranches: [], isDirty: false },
|
|
1690
|
+
tree: { name: 'Workspace', path: '.', kind: 'directory', children: [] },
|
|
1907
1691
|
}
|
|
1908
1692
|
}
|
|
1909
1693
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1910
|
-
return invoke
|
|
1694
|
+
return invoke('get_workspace_snapshot', { operation })
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
export async function getWorkspaceGitDiff(workspacePath: string): Promise<import('../shared/types').FileChange[]> {
|
|
1698
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1699
|
+
try {
|
|
1700
|
+
const res = await fetch(`/api/git/diff?workspace=${encodeURIComponent(workspacePath)}`)
|
|
1701
|
+
if (res.ok) {
|
|
1702
|
+
return (await res.json()) || []
|
|
1703
|
+
}
|
|
1704
|
+
} catch {
|
|
1705
|
+
// fallback
|
|
1706
|
+
}
|
|
1707
|
+
return []
|
|
1708
|
+
}
|
|
1709
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1710
|
+
return invoke<import('../shared/types').FileChange[]>('get_workspace_git_diff', { workspacePath })
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
export async function getGitBranchInfo(workspacePath: string): Promise<GitBranchInfo> {
|
|
1714
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1715
|
+
return { isRepository: false, currentBranch: null, detachedHead: null, branches: [], remoteBranches: [], isDirty: false }
|
|
1716
|
+
}
|
|
1717
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1718
|
+
return invoke<GitBranchInfo>('get_git_branch_info', { workspacePath })
|
|
1719
|
+
}
|
|
1720
|
+
|
|
1721
|
+
export async function switchGitBranch(
|
|
1722
|
+
workspacePath: string,
|
|
1723
|
+
branch: string,
|
|
1724
|
+
confirmedDirtyWorkspace = false,
|
|
1725
|
+
): Promise<GitBranchChangeOutcome> {
|
|
1726
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1727
|
+
throw new Error('Branch switching is only available in the desktop app.')
|
|
1728
|
+
}
|
|
1729
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1730
|
+
return invoke<GitBranchChangeOutcome>('switch_git_branch', { workspacePath, branch, confirmedDirtyWorkspace })
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
export async function createGitBranch(
|
|
1734
|
+
workspacePath: string,
|
|
1735
|
+
branch: string,
|
|
1736
|
+
confirmedDirtyWorkspace = false,
|
|
1737
|
+
): Promise<GitBranchChangeOutcome> {
|
|
1738
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1739
|
+
throw new Error('Branch creation is only available in the desktop app.')
|
|
1740
|
+
}
|
|
1741
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1742
|
+
return invoke<GitBranchChangeOutcome>('create_git_branch', { workspacePath, branch, confirmedDirtyWorkspace })
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
export async function checkoutRemoteGitBranch(
|
|
1746
|
+
workspacePath: string,
|
|
1747
|
+
remoteBranch: string,
|
|
1748
|
+
confirmedDirtyWorkspace = false,
|
|
1749
|
+
): Promise<GitBranchChangeOutcome> {
|
|
1750
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) {
|
|
1751
|
+
throw new Error('Remote branch checkout is only available in the desktop app.')
|
|
1752
|
+
}
|
|
1753
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1754
|
+
return invoke<GitBranchChangeOutcome>('checkout_remote_git_branch', { workspacePath, remoteBranch, confirmedDirtyWorkspace })
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
export async function getGitGraph(workspacePath: string): Promise<string[]> {
|
|
1758
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) return []
|
|
1759
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1760
|
+
return invoke<string[]>('get_git_graph', { workspacePath })
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
export async function createWorkspaceFile(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1764
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace files are only available in the desktop app.')
|
|
1765
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1766
|
+
return invoke('create_workspace_file', { operation })
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
export async function createWorkspaceFolder(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1770
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace folders are only available in the desktop app.')
|
|
1771
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1772
|
+
return invoke('create_workspace_folder', { operation })
|
|
1911
1773
|
}
|
|
1912
1774
|
|
|
1913
|
-
export async function
|
|
1914
|
-
if (typeof window === 'undefined' || !isTauriRuntime())
|
|
1775
|
+
export async function deleteWorkspaceItem(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1776
|
+
if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace files are only available in the desktop app.')
|
|
1915
1777
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1916
|
-
return invoke('
|
|
1778
|
+
return invoke('delete_workspace_item', { operation })
|
|
1917
1779
|
}
|
|
1918
1780
|
|
|
1919
|
-
export async function
|
|
1920
|
-
if (
|
|
1781
|
+
export async function moveWorkspaceItem(operation: import('../shared/types').WorkspaceOperation, destination: string): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1782
|
+
if (!isTauriRuntime()) throw new Error('Workspace file management is only available in the desktop app.')
|
|
1921
1783
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1922
|
-
return invoke('
|
|
1784
|
+
return invoke('move_workspace_item', { operation, destination })
|
|
1923
1785
|
}
|
|
1924
1786
|
|
|
1925
|
-
export async function
|
|
1926
|
-
if (
|
|
1787
|
+
export async function listWorkspaceHistory(root: string): Promise<import('../shared/types').WorkspaceHistoryEntry[]> {
|
|
1788
|
+
if (!isTauriRuntime()) {
|
|
1789
|
+
const response = await authFetch(`${getApiBase()}/workspace-history?root=${encodeURIComponent(root)}`)
|
|
1790
|
+
const data = await response.json()
|
|
1791
|
+
if (!response.ok) throw new Error(data.message || 'Failed to read workspace history.')
|
|
1792
|
+
return data
|
|
1793
|
+
}
|
|
1927
1794
|
const { invoke } = await import('@tauri-apps/api/core')
|
|
1928
|
-
return invoke('
|
|
1795
|
+
return invoke('list_workspace_history', { root })
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
export async function undoWorkspaceAction(root: string, revision: number, expectedId?: string): Promise<import('../shared/types').WorkspaceSnapshot> {
|
|
1799
|
+
if (!isTauriRuntime()) {
|
|
1800
|
+
const response = await authFetch(`${getApiBase()}/workspace-history/undo`, {
|
|
1801
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ root, revision, expectedId }),
|
|
1802
|
+
})
|
|
1803
|
+
const data = await response.json()
|
|
1804
|
+
if (!response.ok) throw new Error(data.message || 'Failed to undo workspace action.')
|
|
1805
|
+
return data
|
|
1806
|
+
}
|
|
1807
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
1808
|
+
return invoke('undo_workspace_action', { root, revision, expectedId })
|
|
1929
1809
|
}
|
|
1930
1810
|
|
|
1931
1811
|
export async function selectWorkspaceDirectory(): Promise<string | null> {
|
|
@@ -2412,8 +2292,28 @@ export const readWorkspaceFile = async (path: string, workspacePath?: string): P
|
|
|
2412
2292
|
return invoke('read_workspace_file', { path, workspacePath })
|
|
2413
2293
|
}
|
|
2414
2294
|
|
|
2295
|
+
export async function modsOperation(operation: import('../shared/mods').ModOperation): Promise<import('../shared/mods').ModResponse> {
|
|
2296
|
+
if (isTauriRuntime()) {
|
|
2297
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
2298
|
+
return invoke('mods_operation', { operation })
|
|
2299
|
+
}
|
|
2300
|
+
const res = await authFetch(`${getApiBase()}/mods`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(operation) })
|
|
2301
|
+
const value = await res.json()
|
|
2302
|
+
if (!res.ok) throw new Error(value.error || 'Mod operation failed')
|
|
2303
|
+
return value
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
export const { listLibrary, getLibraryItem, setLibraryTrashed, removeLibraryItem, readLibraryFile } = createLibraryTransport({ isNative: isTauriRuntime, apiBase: getApiBase, fetch: authFetch })
|
|
2307
|
+
|
|
2308
|
+
export const { getConversationSources, saveSourceAttachments } = createSourcesTransport({ isNative: isTauriRuntime, apiBase: getApiBase, fetch: authFetch })
|
|
2309
|
+
|
|
2415
2310
|
// Enforce compile-time check against the shared platform interface
|
|
2416
2311
|
const _apiCheck: MintPlatformApi = {
|
|
2312
|
+
listLibrary, getLibraryItem, setLibraryTrashed, removeLibraryItem, readLibraryFile,
|
|
2313
|
+
getConversationSources, saveSourceAttachments,
|
|
2314
|
+
modsOperation,
|
|
2315
|
+
readMcpArtifact,
|
|
2316
|
+
listBackgroundJobs, getBackgroundJob, stopBackgroundJob, deleteBackgroundJob,
|
|
2417
2317
|
runSlashCommand,
|
|
2418
2318
|
authRegister,
|
|
2419
2319
|
authLogin,
|
|
@@ -2428,9 +2328,12 @@ const _apiCheck: MintPlatformApi = {
|
|
|
2428
2328
|
getTtsUrls,
|
|
2429
2329
|
cancelChatMessage,
|
|
2430
2330
|
getRecentInteractions,
|
|
2331
|
+
getConversationSnapshot,
|
|
2332
|
+
getConversationChanges,
|
|
2431
2333
|
saveSystemInteraction,
|
|
2432
2334
|
saveInteractionAgentActivity,
|
|
2433
2335
|
listChatSessions,
|
|
2336
|
+
updateChatSessionWorkspace,
|
|
2434
2337
|
deleteChatSession,
|
|
2435
2338
|
renameChatSession,
|
|
2436
2339
|
getProfileValue,
|
|
@@ -2447,10 +2350,20 @@ const _apiCheck: MintPlatformApi = {
|
|
|
2447
2350
|
generateImages,
|
|
2448
2351
|
getImageGenProviders,
|
|
2449
2352
|
setDefaultImageProvider,
|
|
2450
|
-
|
|
2353
|
+
getWorkspaceSnapshot,
|
|
2354
|
+
getWorkspaceGitDiff,
|
|
2355
|
+
getGitBranchInfo,
|
|
2356
|
+
switchGitBranch,
|
|
2357
|
+
createGitBranch,
|
|
2358
|
+
checkoutRemoteGitBranch,
|
|
2359
|
+
getGitGraph,
|
|
2451
2360
|
createWorkspaceFile,
|
|
2452
2361
|
createWorkspaceFolder,
|
|
2453
2362
|
deleteWorkspaceItem,
|
|
2363
|
+
moveWorkspaceItem,
|
|
2364
|
+
listWorkspaceHistory,
|
|
2365
|
+
startHtmlPreview,
|
|
2366
|
+
undoWorkspaceAction,
|
|
2454
2367
|
selectWorkspaceDirectory,
|
|
2455
2368
|
selectLinkedFolderPath,
|
|
2456
2369
|
submitToolApproval,
|
|
@@ -2465,3 +2378,35 @@ const _apiCheck: MintPlatformApi = {
|
|
|
2465
2378
|
testMcpConnection,
|
|
2466
2379
|
}
|
|
2467
2380
|
|
|
2381
|
+
|
|
2382
|
+
async function backgroundRequest<T>(path: string, method = 'GET'): Promise<T> {
|
|
2383
|
+
const response = await authFetch(`${getLocalApiBase()}/background-jobs${path}`, { method })
|
|
2384
|
+
const value = await response.json()
|
|
2385
|
+
if (!response.ok) throw new Error(`${response.status}: ${value.message || 'Background terminal request failed'}`)
|
|
2386
|
+
return value as T
|
|
2387
|
+
}
|
|
2388
|
+
export async function listBackgroundJobs(workspace?: string): Promise<import('../shared/types').BackgroundJob[]> {
|
|
2389
|
+
const value = await backgroundRequest<{jobs: import('../shared/types').BackgroundJob[]}>(workspace ? `?workspace=${encodeURIComponent(workspace)}` : '')
|
|
2390
|
+
return value.jobs
|
|
2391
|
+
}
|
|
2392
|
+
export function getBackgroundJob(id: string) { return backgroundRequest<import('../shared/types').BackgroundJobOutput>(`/${encodeURIComponent(id)}`) }
|
|
2393
|
+
export function stopBackgroundJob(id: string) { return backgroundRequest<import('../shared/types').BackgroundJob>(`/${encodeURIComponent(id)}/stop`, 'POST') }
|
|
2394
|
+
export function deleteBackgroundJob(id: string) { return backgroundRequest<{deleted: boolean}>(`/${encodeURIComponent(id)}`, 'DELETE').then(() => undefined) }
|
|
2395
|
+
|
|
2396
|
+
export async function startHtmlPreview(root: string, relativePath: string, mintBrowser = false): Promise<{url: string; jobId: string}> {
|
|
2397
|
+
const response = await authFetch(`${getLocalApiBase()}/html-preview`, { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({root, relativePath, mintBrowser}) })
|
|
2398
|
+
const value = await response.json()
|
|
2399
|
+
if (!response.ok) throw new Error(value.message || 'Could not start HTML preview')
|
|
2400
|
+
return value
|
|
2401
|
+
}
|
|
2402
|
+
|
|
2403
|
+
/** Loads artifacts by ID; no server-provided filesystem path is accepted. */
|
|
2404
|
+
export async function readMcpArtifact(id: string): Promise<string> {
|
|
2405
|
+
if (isTauriRuntime()) {
|
|
2406
|
+
const { invoke } = await import('@tauri-apps/api/core')
|
|
2407
|
+
return invoke<string>('read_mcp_artifact', { id })
|
|
2408
|
+
}
|
|
2409
|
+
const response = await authFetch(`${getApiBase()}/mcp-artifacts/${encodeURIComponent(id)}`)
|
|
2410
|
+
if (!response.ok) throw new Error('Artifact unavailable')
|
|
2411
|
+
return URL.createObjectURL(await response.blob())
|
|
2412
|
+
}
|