From d9c487dd540979e8fb8f49b8e105ce264a06b8e6 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 20 Jan 2026 10:09:35 +0700 Subject: [PATCH] feat: add Tauri desktop app support and terminal management --- .gitignore | 2 + .tool-versions | 1 + package-lock.json | 282 +- package.json | 5 +- .../assets/images/favicon-dark-attention.svg | 4 +- .../assets/images/favicon-dark-running.svg | 4 +- packages/app/assets/images/favicon-dark.svg | 4 +- .../assets/images/favicon-light-attention.svg | 4 +- .../assets/images/favicon-light-running.svg | 4 +- packages/app/assets/images/favicon-light.svg | 4 +- packages/app/assets/images/icon.png | Bin 58444 -> 63241 bytes packages/app/package.json | 2 + packages/app/src/app/_layout.tsx | 10 +- .../src/app/agent/[serverId]/[agentId].tsx | 146 +- packages/app/src/app/index.tsx | 23 +- packages/app/src/app/settings.tsx | 49 + .../app/src/components/agent-input-area.tsx | 96 +- packages/app/src/components/agent-list.tsx | 3 +- .../app/src/components/agent-stream-view.tsx | 34 +- packages/app/src/components/diff-viewer.tsx | 4 +- .../app/src/components/explorer-sidebar.tsx | 13 +- .../app/src/components/file-explorer-pane.tsx | 82 +- .../src/components/headers/screen-header.tsx | 8 +- packages/app/src/components/message-input.tsx | 39 +- packages/app/src/components/message.tsx | 40 +- .../app/src/components/sliding-sidebar.tsx | 11 +- .../app/src/components/tool-call-details.tsx | 12 +- .../app/src/components/tool-call-sheet.tsx | 4 +- packages/app/src/constants/layout.ts | 42 + packages/app/src/contexts/session-context.tsx | 73 - .../app/src/hooks/use-agent-form-state.ts | 456 +- packages/app/src/hooks/use-dictation.ts | 96 +- packages/app/src/stores/panel-store.ts | 2 +- packages/app/src/stores/session-store.ts | 6 - packages/app/src/utils/shorten-path.ts | 10 + packages/app/src/utils/tauri-window.ts | 104 + .../app/src/utils/tool-call-parsers.test.ts | 153 +- packages/app/src/utils/tool-call-parsers.ts | 130 +- packages/desktop/package-lock.json | 233 + packages/desktop/package.json | 14 + packages/desktop/src-tauri/.gitignore | 4 + packages/desktop/src-tauri/Cargo.lock | 4952 +++++++++++++++++ packages/desktop/src-tauri/Cargo.toml | 29 + packages/desktop/src-tauri/build.rs | 3 + .../src-tauri/capabilities/default.json | 13 + packages/desktop/src-tauri/icons/128x128.png | Bin 0 -> 7046 bytes .../desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 14779 bytes packages/desktop/src-tauri/icons/32x32.png | Bin 0 -> 1629 bytes packages/desktop/src-tauri/icons/64x64.png | Bin 0 -> 3381 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 5762 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 7789 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 8309 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 16590 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 1448 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 18278 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 2209 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 3764 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 4891 bytes .../desktop/src-tauri/icons/StoreLogo.png | Bin 0 -> 2586 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2257 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 9024 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2179 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2178 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 5882 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2094 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4775 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 12181 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4568 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7398 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 19059 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 6939 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10006 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 26352 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 9394 bytes .../android/values/ic_launcher_background.xml | 4 + packages/desktop/src-tauri/icons/icon.icns | Bin 0 -> 172864 bytes packages/desktop/src-tauri/icons/icon.ico | Bin 0 -> 27641 bytes packages/desktop/src-tauri/icons/icon.png | Bin 0 -> 32164 bytes .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 873 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 1920 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 1920 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 3093 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 1332 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 2952 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 2952 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 4679 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 1920 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 4269 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 4269 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 6555 bytes .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 64573 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 6555 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 10053 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 3949 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 8322 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 9251 bytes packages/desktop/src-tauri/src/lib.rs | 72 + packages/desktop/src-tauri/src/main.rs | 6 + packages/desktop/src-tauri/tauri.conf.json | 41 + packages/server/package.json | 2 + .../server/src/client/daemon-client-v2.ts | 206 +- .../src/server/agent/agent-mcp.e2e.test.ts | 50 +- packages/server/src/server/bootstrap.ts | 46 +- .../src/server/client-activity.e2e.test.ts | 1 - packages/server/src/server/config.ts | 21 - .../src/server/daemon-client-v2.e2e.test.ts | 32 +- .../daemon-e2e/file-download.e2e.test.ts | 18 +- .../server/daemon-e2e/terminal.e2e.test.ts | 232 + packages/server/src/server/index.ts | 8 +- packages/server/src/server/session.ts | 345 +- .../server/test-utils/daemon-test-context.ts | 1 - .../src/server/test-utils/paseo-daemon.ts | 24 - .../server/src/server/websocket-server.ts | 7 +- packages/server/src/shared/messages.ts | 165 +- packages/server/src/tasks/cli.ts | 169 +- packages/server/src/tasks/task-store.test.ts | 55 + packages/server/src/tasks/task-store.ts | 6 +- packages/server/src/tasks/types.ts | 1 + .../src/terminal/terminal-manager.test.ts | 172 + .../server/src/terminal/terminal-manager.ts | 88 + packages/server/src/terminal/terminal.test.ts | 565 ++ packages/server/src/terminal/terminal.ts | 276 + .../src/utils/tool-call-parsers.test.ts | 107 + .../server/src/utils/tool-call-parsers.ts | 20 +- 125 files changed, 8906 insertions(+), 1049 deletions(-) create mode 100644 .tool-versions create mode 100644 packages/app/src/utils/shorten-path.ts create mode 100644 packages/app/src/utils/tauri-window.ts create mode 100644 packages/desktop/package-lock.json create mode 100644 packages/desktop/package.json create mode 100644 packages/desktop/src-tauri/.gitignore create mode 100644 packages/desktop/src-tauri/Cargo.lock create mode 100644 packages/desktop/src-tauri/Cargo.toml create mode 100644 packages/desktop/src-tauri/build.rs create mode 100644 packages/desktop/src-tauri/capabilities/default.json create mode 100644 packages/desktop/src-tauri/icons/128x128.png create mode 100644 packages/desktop/src-tauri/icons/128x128@2x.png create mode 100644 packages/desktop/src-tauri/icons/32x32.png create mode 100644 packages/desktop/src-tauri/icons/64x64.png create mode 100644 packages/desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 packages/desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 packages/desktop/src-tauri/icons/StoreLogo.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 packages/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 packages/desktop/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 packages/desktop/src-tauri/icons/icon.icns create mode 100644 packages/desktop/src-tauri/icons/icon.ico create mode 100644 packages/desktop/src-tauri/icons/icon.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 packages/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 packages/desktop/src-tauri/src/lib.rs create mode 100644 packages/desktop/src-tauri/src/main.rs create mode 100644 packages/desktop/src-tauri/tauri.conf.json create mode 100644 packages/server/src/server/daemon-e2e/terminal.e2e.test.ts create mode 100644 packages/server/src/terminal/terminal-manager.test.ts create mode 100644 packages/server/src/terminal/terminal-manager.ts create mode 100644 packages/server/src/terminal/terminal.test.ts create mode 100644 packages/server/src/terminal/terminal.ts create mode 100644 packages/server/src/utils/tool-call-parsers.test.ts diff --git a/.gitignore b/.gitignore index ba43b497f..3f4bb5edc 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,5 @@ CLAUDE.local.md # Task CLI .tasks/ + +.debug.conversations/ diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..ee114d2f1 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +rust 1.85.1 diff --git a/package-lock.json b/package-lock.json index d37d15f25..4efeeea29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "packages/server", "packages/app", "packages/relay", - "packages/website" + "packages/website", + "packages/desktop" ], "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.11" @@ -6313,6 +6314,10 @@ "resolved": "packages/app", "link": true }, + "node_modules/@paseo/desktop": { + "resolved": "packages/desktop", + "link": true + }, "node_modules/@paseo/relay": { "resolved": "packages/relay", "link": true @@ -8410,6 +8415,233 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@tauri-apps/api": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", + "integrity": "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.9.6.tgz", + "integrity": "sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.9.6", + "@tauri-apps/cli-darwin-x64": "2.9.6", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.9.6", + "@tauri-apps/cli-linux-arm64-gnu": "2.9.6", + "@tauri-apps/cli-linux-arm64-musl": "2.9.6", + "@tauri-apps/cli-linux-riscv64-gnu": "2.9.6", + "@tauri-apps/cli-linux-x64-gnu": "2.9.6", + "@tauri-apps/cli-linux-x64-musl": "2.9.6", + "@tauri-apps/cli-win32-arm64-msvc": "2.9.6", + "@tauri-apps/cli-win32-ia32-msvc": "2.9.6", + "@tauri-apps/cli-win32-x64-msvc": "2.9.6" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.9.6.tgz", + "integrity": "sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.9.6.tgz", + "integrity": "sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.9.6.tgz", + "integrity": "sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.9.6.tgz", + "integrity": "sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.9.6.tgz", + "integrity": "sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.9.6.tgz", + "integrity": "sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.9.6.tgz", + "integrity": "sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.9.6.tgz", + "integrity": "sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.9.6.tgz", + "integrity": "sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.9.6.tgz", + "integrity": "sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.6.tgz", + "integrity": "sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -9507,6 +9739,15 @@ "node": ">=10.0.0" } }, + "node_modules/@xterm/headless": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/headless/-/headless-6.0.0.tgz", + "integrity": "sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw==", + "license": "MIT", + "workspaces": [ + "addons/*" + ] + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -17994,9 +18235,7 @@ "version": "2.23.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -19886,6 +20125,20 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, + "node_modules/react-native-webview": { + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz", + "integrity": "sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-worklets": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", @@ -24597,6 +24850,7 @@ "@react-navigation/elements": "^2.6.3", "@react-navigation/native": "^7.1.8", "@tanstack/react-query": "^5.90.11", + "@tauri-apps/api": "^2.9.1", "buffer": "^6.0.3", "expo": "^54.0.18", "expo-audio": "~1.0.13", @@ -24639,6 +24893,7 @@ "react-native-svg": "^15.14.0", "react-native-unistyles": "^3.0.15", "react-native-web": "~0.21.0", + "react-native-webview": "^13.16.0", "react-native-worklets": "0.5.1", "zod": "^3.23.8", "zustand": "^5.0.9" @@ -24675,6 +24930,13 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "packages/desktop": { + "name": "@paseo/desktop", + "version": "1.0.0", + "devDependencies": { + "@tauri-apps/cli": "^2.9.6" + } + }, "packages/relay": { "name": "@paseo/relay", "version": "0.1.0", @@ -24706,11 +24968,13 @@ "@modelcontextprotocol/sdk": "^1.20.1", "@opencode-ai/sdk": "^1.1.12", "@openrouter/ai-sdk-provider": "^1.2.0", + "@xterm/headless": "^6.0.0", "ai": "^5.0.76", "dotenv": "^17.2.3", "express": "^4.18.2", "express-basic-auth": "^1.2.1", "mnemonic-id": "^3.2.7", + "node-pty": "^1.0.0", "openai": "^4.20.0", "pino": "^10.2.0", "pino-pretty": "^13.1.3", @@ -24931,6 +25195,16 @@ "node": ">= 0.6" } }, + "packages/server/node_modules/node-pty": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", + "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.17.0" + } + }, "packages/server/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", diff --git a/package.json b/package.json index 342728ad9..b1bc64523 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "packages/server", "packages/app", "packages/relay", - "packages/website" + "packages/website", + "packages/desktop" ], "scripts": { "dev": "NODE_ENV=development tsx packages/server/scripts/dev-runner.ts", @@ -21,6 +22,8 @@ "android:dev-release": "ANDROID_VARIANT=devRelease npm run android --workspace=@paseo/app", "ios": "npm run ios --workspace=@paseo/app", "web": "npm run web --workspace=@paseo/app", + "desktop": "npm run dev --workspace=@paseo/desktop", + "desktop:build": "npm run build --workspace=@paseo/desktop", "postinstall": "patch-package" }, "devDependencies": { diff --git a/packages/app/assets/images/favicon-dark-attention.svg b/packages/app/assets/images/favicon-dark-attention.svg index 1fdc70a29..87e684ddc 100644 --- a/packages/app/assets/images/favicon-dark-attention.svg +++ b/packages/app/assets/images/favicon-dark-attention.svg @@ -1,5 +1,5 @@ - - + + diff --git a/packages/app/assets/images/favicon-dark-running.svg b/packages/app/assets/images/favicon-dark-running.svg index f5a9a9cca..a1e4d95d4 100644 --- a/packages/app/assets/images/favicon-dark-running.svg +++ b/packages/app/assets/images/favicon-dark-running.svg @@ -1,5 +1,5 @@ - - + + diff --git a/packages/app/assets/images/favicon-dark.svg b/packages/app/assets/images/favicon-dark.svg index cc4ac3ecc..0ef308b97 100644 --- a/packages/app/assets/images/favicon-dark.svg +++ b/packages/app/assets/images/favicon-dark.svg @@ -1,4 +1,4 @@ - - + + diff --git a/packages/app/assets/images/favicon-light-attention.svg b/packages/app/assets/images/favicon-light-attention.svg index 1fdc70a29..87e684ddc 100644 --- a/packages/app/assets/images/favicon-light-attention.svg +++ b/packages/app/assets/images/favicon-light-attention.svg @@ -1,5 +1,5 @@ - - + + diff --git a/packages/app/assets/images/favicon-light-running.svg b/packages/app/assets/images/favicon-light-running.svg index f5a9a9cca..a1e4d95d4 100644 --- a/packages/app/assets/images/favicon-light-running.svg +++ b/packages/app/assets/images/favicon-light-running.svg @@ -1,5 +1,5 @@ - - + + diff --git a/packages/app/assets/images/favicon-light.svg b/packages/app/assets/images/favicon-light.svg index cc4ac3ecc..0ef308b97 100644 --- a/packages/app/assets/images/favicon-light.svg +++ b/packages/app/assets/images/favicon-light.svg @@ -1,4 +1,4 @@ - - + + diff --git a/packages/app/assets/images/icon.png b/packages/app/assets/images/icon.png index d0e4e3fe0a4f72f896579529b6de0cd581a30af7..fcdf57e9aabae1aefa59ba096d1e0d18b644a329 100644 GIT binary patch literal 63241 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 literal 58444 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 B_QU`H diff --git a/packages/app/package.json b/packages/app/package.json index 08b1bd1c9..27a5dc466 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -36,6 +36,7 @@ "@react-navigation/elements": "^2.6.3", "@react-navigation/native": "^7.1.8", "@tanstack/react-query": "^5.90.11", + "@tauri-apps/api": "^2.9.1", "buffer": "^6.0.3", "expo": "^54.0.18", "expo-audio": "~1.0.13", @@ -78,6 +79,7 @@ "react-native-svg": "^15.14.0", "react-native-unistyles": "^3.0.15", "react-native-web": "~0.21.0", + "react-native-webview": "^13.16.0", "react-native-worklets": "0.5.1", "zod": "^3.23.8", "zustand": "^5.0.9" diff --git a/packages/app/src/app/_layout.tsx b/packages/app/src/app/_layout.tsx index 6d2e3428e..1ae6acd5d 100644 --- a/packages/app/src/app/_layout.tsx +++ b/packages/app/src/app/_layout.tsx @@ -28,6 +28,8 @@ import { HorizontalScrollProvider, useHorizontalScrollOptional, } from "@/contexts/horizontal-scroll-context"; +import { getIsTauriMac } from "@/constants/layout"; +import { useTrafficLightPadding } from "@/utils/tauri-window"; function QueryProvider({ children }: { children: ReactNode }) { const [queryClient] = useState( @@ -152,11 +154,17 @@ function AppContainer({ children, selectedAgentId }: AppContainerProps) { [isMobile, isOpen, windowWidth, translateX, backdropOpacity, animateToOpen, animateToClose, openAgentList, isGesturing, horizontalScroll?.isAnyScrolledRight, touchStartX] ); + // When sidebar is collapsed on desktop Tauri macOS, add left padding for traffic lights + const trafficLightPadding = useTrafficLightPadding(); + const needsTrafficLightPadding = !isMobile && !isOpen && getIsTauriMac(); + const content = ( {!isMobile && } - {children} + + {children} + {isMobile && } diff --git a/packages/app/src/app/agent/[serverId]/[agentId].tsx b/packages/app/src/app/agent/[serverId]/[agentId].tsx index 041154201..bf39ae491 100644 --- a/packages/app/src/app/agent/[serverId]/[agentId].tsx +++ b/packages/app/src/app/agent/[serverId]/[agentId].tsx @@ -30,8 +30,6 @@ import { GitBranch, Folder, RotateCcw, - Users, - ChevronRight, PlusIcon, PanelRight, } from "lucide-react-native"; @@ -51,7 +49,6 @@ import { useDaemonConnections } from "@/contexts/daemon-connections-context"; import type { ConnectionStatus } from "@/contexts/daemon-connections-context"; import { formatConnectionStatus } from "@/utils/daemons"; import { useSessionStore } from "@/stores/session-store"; -import type { Agent } from "@/stores/session-store"; import type { StreamItem } from "@/types/stream"; import { buildAgentNavigationKey, @@ -61,6 +58,7 @@ import { } from "@/utils/navigation-timing"; import { extractAgentModel } from "@/utils/extract-agent-model"; import { startPerfMonitor } from "@/utils/perf-monitor"; +import { shortenPath } from "@/utils/shorten-path"; const DROPDOWN_WIDTH = 220; const EMPTY_STREAM_ITEMS: StreamItem[] = []; @@ -294,35 +292,6 @@ function AgentScreenContent({ : undefined ); - // Select the agents Map directly - this is a stable reference that only changes when agents are added/removed - const allAgents = useSessionStore( - (state) => state.sessions[serverId]?.agents - ); - - // Derive child agents in useMemo to avoid creating new references on every store update - // This prevents infinite loops caused by useShallow not doing deep equality on object arrays - const childAgents = useMemo(() => { - if (!resolvedAgentId || !allAgents) return []; - const children: Array<{ - id: string; - title: string | null; - createdAt: Date; - status: Agent["status"]; - }> = []; - for (const [id, a] of allAgents) { - if (a.parentAgentId === resolvedAgentId) { - children.push({ - id, - title: a.title, - createdAt: a.createdAt, - status: a.status, - }); - } - } - children.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); - return children; - }, [allAgents, resolvedAgentId]); - // Select only the specific stream tail - use stable empty array to avoid infinite loop const streamItemsRaw = useSessionStore((state) => resolvedAgentId @@ -613,20 +582,6 @@ function AgentScreenContent({ router.push({ pathname: "/", params }); }, [agent, agentModel, handleCloseMenu, router, serverId]); - const handleNavigateToChildAgent = useCallback( - (childAgentId: string) => { - handleCloseMenu(); - router.push({ - pathname: "/agent/[serverId]/[agentId]", - params: { - serverId: serverId, - agentId: childAgentId, - }, - }); - }, - [handleCloseMenu, router, serverId] - ); - if (!agent) { return ( @@ -736,7 +691,7 @@ function AgentScreenContent({ numberOfLines={2} ellipsizeMode="middle" > - {agent.cwd} + {shortenPath(agent.cwd)} @@ -784,50 +739,6 @@ function AgentScreenContent({ - {/* Sub-Agents Section */} - - - - Sub-Agents - - {childAgents.length === 0 ? ( - No sub-agents - ) : ( - 3} - > - {childAgents.map((child) => ( - handleNavigateToChildAgent(child.id)} - style={styles.menuSubAgentItem} - > - - {child.title || "Untitled Agent"} - - - {child.status === "running" ? ( - - ) : null} - - - - ))} - - )} - - - - View Changes @@ -1108,57 +1019,4 @@ const styles = StyleSheet.create((theme) => ({ color: theme.colors.foreground, fontWeight: theme.fontWeight.normal, }, - menuSubAgentsSection: { - gap: theme.spacing[2], - }, - menuSubAgentsHeader: { - flexDirection: "row", - alignItems: "center", - gap: theme.spacing[2], - paddingHorizontal: theme.spacing[3], - paddingVertical: theme.spacing[2], - }, - menuSubAgentsLabel: { - fontSize: theme.fontSize.xs, - color: theme.colors.foregroundMuted, - letterSpacing: 0.5, - textTransform: "uppercase", - }, - menuSubAgentsEmpty: { - fontSize: theme.fontSize.base, - color: theme.colors.foregroundMuted, - paddingHorizontal: theme.spacing[3], - paddingVertical: theme.spacing[3], - }, - menuSubAgentsList: { - maxHeight: (theme.spacing[2] * 2 + theme.fontSize.base) * 3, - }, - menuSubAgentsListContent: { - gap: theme.spacing[1], - }, - menuSubAgentItem: { - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", - paddingVertical: theme.spacing[3], - paddingHorizontal: theme.spacing[3], - borderRadius: theme.borderRadius.md, - }, - menuSubAgentText: { - fontSize: theme.fontSize.base, - color: theme.colors.foreground, - flex: 1, - marginRight: theme.spacing[2], - }, - menuSubAgentMeta: { - flexDirection: "row", - alignItems: "center", - gap: theme.spacing[1], - }, - menuSubAgentDot: { - width: 6, - height: 6, - borderRadius: 999, - backgroundColor: "#3b82f6", - }, })); diff --git a/packages/app/src/app/index.tsx b/packages/app/src/app/index.tsx index 09e46b23a..3ae0c8c91 100644 --- a/packages/app/src/app/index.tsx +++ b/packages/app/src/app/index.tsx @@ -106,7 +106,7 @@ export default function HomeScreen() { const resolvedModel = getParamValue(params.model); const resolvedWorkingDir = getParamValue(params.workingDir); - const initialValues = useMemo(() => { + const initialValues = useMemo((): CreateAgentInitialValues => { const values: CreateAgentInitialValues = {}; if (resolvedWorkingDir) { values.workingDir = resolvedWorkingDir; @@ -117,8 +117,12 @@ export default function HomeScreen() { if (resolvedMode) { values.modeId = resolvedMode; } + if (resolvedModel) { + values.model = resolvedModel; + } return values; - }, [resolvedMode, resolvedProvider, resolvedWorkingDir]); + }, [resolvedMode, resolvedModel, resolvedProvider, resolvedWorkingDir]); + const { selectedServerId, setSelectedServerIdFromUser, @@ -143,21 +147,6 @@ export default function HomeScreen() { isVisible: true, isCreateFlow: true, }); - const hasAppliedModelParamRef = useRef(false); - useEffect(() => { - if (!resolvedModel || hasAppliedModelParamRef.current) { - return; - } - if (availableModels.length === 0) { - return; - } - const isValidModel = availableModels.some((model) => model.id === resolvedModel); - hasAppliedModelParamRef.current = true; - if (!isValidModel) { - return; - } - setModelFromUser(resolvedModel); - }, [availableModels, resolvedModel, setModelFromUser]); const hostEntry = selectedServerId ? connectionStates.get(selectedServerId) : undefined; diff --git a/packages/app/src/app/settings.tsx b/packages/app/src/app/settings.tsx index 917291845..340777ac9 100644 --- a/packages/app/src/app/settings.tsx +++ b/packages/app/src/app/settings.tsx @@ -340,6 +340,37 @@ const styles = StyleSheet.create((theme) => ({ themeToggleTextActive: { color: theme.colors.foreground, }, + // Dev section + devCard: { + backgroundColor: theme.colors.surface2, + borderRadius: theme.borderRadius.lg, + borderWidth: 1, + borderColor: theme.colors.border, + overflow: "hidden", + }, + devButton: { + flexDirection: "row", + alignItems: "center", + gap: theme.spacing[3], + paddingVertical: theme.spacing[4], + paddingHorizontal: theme.spacing[4], + }, + devButtonBorder: { + borderTopWidth: 1, + borderTopColor: theme.colors.border, + }, + devButtonContent: { + flex: 1, + }, + devButtonTitle: { + color: theme.colors.foreground, + fontSize: theme.fontSize.base, + }, + devButtonDescription: { + color: theme.colors.foregroundMuted, + fontSize: theme.fontSize.sm, + marginTop: 2, + }, })); type DaemonTestState = { @@ -760,6 +791,24 @@ export default function SettingsScreen() { + {/* Developer */} + + Developer + + router.push("/audio-test")} + > + + Audio Test + + Test audio recording and playback + + + + + + {/* Footer */} diff --git a/packages/app/src/components/agent-input-area.tsx b/packages/app/src/components/agent-input-area.tsx index 8856717e4..529b6bfc3 100644 --- a/packages/app/src/components/agent-input-area.tsx +++ b/packages/app/src/components/agent-input-area.tsx @@ -101,10 +101,6 @@ export function AgentInputArea({ const setQueuedMessages = useSessionStore((state) => state.setQueuedMessages); - // Noop fallback for sendAgentAudio (required by MessageInput) - const noopSendAgentAudio = useCallback(async () => {}, []); - const sendAgentAudio = methods?.sendAgentAudio ?? noopSendAgentAudio; - const { startRealtime, stopRealtime, isRealtimeMode } = useRealtime(); const [internalInput, setInternalInput] = useState(""); @@ -448,52 +444,47 @@ export function AgentInputArea({ ] ); - const rightContent = ( - <> - - {isRealtimeMode ? ( - - ) : ( - - )} - - {isAgentRunning && ( - - {isCancellingAgent ? ( - - ) : ( - - )} - + const rightContent = isAgentRunning ? ( + + {isCancellingAgent ? ( + + ) : ( + )} - + + ) : ( + + {isRealtimeMode ? ( + + ) : ( + + )} + ); const leftContent = ; @@ -574,7 +565,6 @@ export function AgentInputArea({ onPickImages={handlePickImage} onRemoveImage={handleRemoveImage} client={client} - sendAgentAudio={sendAgentAudio} placeholder="Message agent..." autoFocus={autoFocus} disabled={isRealtimeMode} @@ -630,10 +620,10 @@ const styles = StyleSheet.create(((theme: Theme) => ({ backgroundColor: theme.colors.palette.blue[600], }, cancelButton: { - width: BUTTON_SIZE, - height: BUTTON_SIZE, + width: 34, + height: 34, borderRadius: theme.borderRadius.full, - backgroundColor: theme.colors.palette.red[500], + backgroundColor: theme.colors.palette.red[600], alignItems: "center", justifyContent: "center", }, diff --git a/packages/app/src/components/agent-list.tsx b/packages/app/src/components/agent-list.tsx index e4e86fa7d..d9132c510 100644 --- a/packages/app/src/components/agent-list.tsx +++ b/packages/app/src/components/agent-list.tsx @@ -11,6 +11,7 @@ import { useCallback, useState, type ReactElement } from "react"; import { router, usePathname } from "expo-router"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { formatTimeAgo } from "@/utils/time"; +import { shortenPath } from "@/utils/shorten-path"; import { type AggregatedAgent } from "@/hooks/use-aggregated-agents"; import { useSessionStore } from "@/stores/session-store"; import { @@ -144,7 +145,7 @@ export function AgentList({ - {agent.cwd.replace(/^\/(?:Users|home)\/[^/]+/, "~")} · {timeAgo} + {shortenPath(agent.cwd)} · {timeAgo} )} diff --git a/packages/app/src/components/agent-stream-view.tsx b/packages/app/src/components/agent-stream-view.tsx index cf21c52ba..83526b410 100644 --- a/packages/app/src/components/agent-stream-view.tsx +++ b/packages/app/src/components/agent-stream-view.tsx @@ -495,12 +495,6 @@ export function AgentStreamView({ ) : null} - {showWorkingIndicator ? ( - - - - ) : null} - {hasHeadItems ? [...streamHead].reverse().map((item, index) => { const rendered = renderStreamItemContent(item, index); @@ -511,6 +505,12 @@ export function AgentStreamView({ ) : null; }) : null} + + {showWorkingIndicator ? ( + + + + ) : null} ); @@ -555,10 +555,12 @@ export function AgentStreamView({ } ListHeaderComponent={listHeaderComponent} extraData={flatListExtraData} - maintainVisibleContentPosition={{ - minIndexForVisible: 0, - autoscrollToTopThreshold: 40, - }} + maintainVisibleContentPosition={ + // Disable when streaming and user is at bottom - we handle auto-scroll ourselves + agent.status === "running" && isNearBottom + ? undefined + : { minIndexForVisible: 0, autoscrollToTopThreshold: 40 } + } initialNumToRender={12} windowSize={10} inverted @@ -777,8 +779,8 @@ function PermissionRequestCard({ }, [request]); const toolCallDisplay = useMemo( - () => parseToolCallDisplay(request.input, null), - [request.input] + () => parseToolCallDisplay(request.name ?? "unknown", request.input, null), + [request.name, request.input] ); const markdownStyles = useMemo(() => createMarkdownStyles(theme), [theme]); @@ -792,7 +794,7 @@ function PermissionRequestCard({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -806,7 +808,6 @@ function PermissionRequestCard({ {children} @@ -821,7 +822,6 @@ function PermissionRequestCard({ {node.content} @@ -833,7 +833,7 @@ function PermissionRequestCard({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -847,7 +847,6 @@ function PermissionRequestCard({ {node.content} @@ -893,7 +892,6 @@ function PermissionRequestCard({ {bullet} {children} diff --git a/packages/app/src/components/diff-viewer.tsx b/packages/app/src/components/diff-viewer.tsx index 5e8cb3b3a..629418ef1 100644 --- a/packages/app/src/components/diff-viewer.tsx +++ b/packages/app/src/components/diff-viewer.tsx @@ -117,13 +117,13 @@ const styles = StyleSheet.create((theme) => ({ backgroundColor: "rgba(46, 160, 67, 0.15)", }, addText: { - color: theme.colors.palette.green[800], + color: theme.colors.foreground, }, removeLine: { backgroundColor: "rgba(248, 81, 73, 0.1)", }, removeText: { - color: theme.colors.palette.red[800], + color: theme.colors.foreground, }, addHighlight: { backgroundColor: "rgba(46, 160, 67, 0.4)", diff --git a/packages/app/src/components/explorer-sidebar.tsx b/packages/app/src/components/explorer-sidebar.tsx index e16d9acaf..f247da106 100644 --- a/packages/app/src/components/explorer-sidebar.tsx +++ b/packages/app/src/components/explorer-sidebar.tsx @@ -14,14 +14,13 @@ import { MIN_EXPLORER_SIDEBAR_WIDTH, MAX_EXPLORER_SIDEBAR_WIDTH, type ViewMode, + type ExplorerTab, } from "@/stores/panel-store"; import { useExplorerSidebarAnimation } from "@/contexts/explorer-sidebar-animation-context"; import { HEADER_INNER_HEIGHT } from "@/constants/layout"; import { GitDiffPane } from "./git-diff-pane"; import { FileExplorerPane } from "./file-explorer-pane"; -type ExplorerTab = "changes" | "files"; - interface ExplorerSidebarProps { serverId: string; agentId: string; @@ -309,13 +308,11 @@ function SidebarContent({ {/* Content based on active tab */} - {activeTab === "changes" ? ( + {activeTab === "changes" && ( - ) : ( - + )} + {activeTab === "files" && ( + )} diff --git a/packages/app/src/components/file-explorer-pane.tsx b/packages/app/src/components/file-explorer-pane.tsx index 4617b1c66..4b685dacb 100644 --- a/packages/app/src/components/file-explorer-pane.tsx +++ b/packages/app/src/components/file-explorer-pane.tsx @@ -130,7 +130,6 @@ export function FileExplorerPane({ return sorted; }, [rawEntries, sortOption]); const showInitialListLoading = isListingLoading && entries.length === 0; - const showListLoadingBanner = isListingLoading && entries.length > 0; const isPreviewLoading = Boolean( isExplorerLoading && pendingRequest?.mode === "file" && @@ -585,14 +584,9 @@ export function FileExplorerPane({ {renderEntryIcon(displayKind, theme.colors)} - - - {item.name} - - - {formatFileSize({ size: item.size })} · {formatTimeAgo(new Date(item.modifiedAt))} - - + + {item.name} + handleOpenMenu(item, event)} @@ -642,17 +636,9 @@ export function FileExplorerPane({ - {showListLoadingBanner && ( - - - - Loading {formatDirectoryLabel(activePath)}... - - - )} ); - }, [activePath, currentSortLabel, explorerState?.history?.length, handleNavigateBack, handleSortCycle, showListLoadingBanner, theme.colors.mutedForeground]); + }, [activePath, currentSortLabel, explorerState?.history?.length, handleNavigateBack, handleSortCycle]); // Watch for completed file previews and process queue useEffect(() => { @@ -789,6 +775,15 @@ export function FileExplorerPane({ ]} onLayout={handleMenuLayout} > + + + {formatFileSize({ size: menuEntry.size })} + + + {formatTimeAgo(new Date(menuEntry.modifiedAt))} + + + { @@ -866,7 +861,7 @@ export function FileExplorerPane({ ) : ( Binary preview unavailable - + {formatFileSize({ size: preview.size })} @@ -1035,17 +1030,6 @@ const styles = StyleSheet.create((theme) => ({ fontSize: theme.fontSize.lg, color: theme.colors.foreground, }, - loadingBanner: { - flexDirection: "row", - alignItems: "center", - gap: theme.spacing[2], - paddingVertical: theme.spacing[2], - paddingHorizontal: theme.spacing[3], - }, - loadingBannerText: { - color: theme.colors.foregroundMuted, - fontSize: theme.fontSize.sm, - }, sortButton: { flexDirection: "row", alignItems: "center", @@ -1114,8 +1098,8 @@ const styles = StyleSheet.create((theme) => ({ flexDirection: "row", alignItems: "center", justifyContent: "space-between", - paddingVertical: theme.spacing[2], - paddingHorizontal: theme.spacing[3], + paddingVertical: theme.spacing[1], + paddingLeft: theme.spacing[2], borderRadius: theme.borderRadius.md, borderWidth: theme.borderWidth[1], borderColor: theme.colors.border, @@ -1128,24 +1112,16 @@ const styles = StyleSheet.create((theme) => ({ flex: 1, flexDirection: "row", alignItems: "center", - columnGap: theme.spacing[2], - marginRight: theme.spacing[3], + gap: theme.spacing[2], + minWidth: 0, }, entryIcon: { - width: 28, - alignItems: "center", - }, - entryTextContainer: { - flex: 1, + flexShrink: 0, }, entryName: { + flex: 1, color: theme.colors.foreground, - fontSize: theme.fontSize.base, - }, - entryMeta: { - color: theme.colors.foregroundMuted, - fontSize: theme.fontSize.xs, - marginTop: theme.spacing[1], + fontSize: theme.fontSize.sm, }, menuButton: { width: 36, @@ -1168,6 +1144,22 @@ const styles = StyleSheet.create((theme) => ({ backgroundColor: theme.colors.surface2, padding: theme.spacing[1], }, + entryMenuHeader: { + flexDirection: "row", + justifyContent: "space-between", + paddingVertical: theme.spacing[2], + paddingHorizontal: theme.spacing[3], + }, + entryMenuMeta: { + color: theme.colors.foregroundMuted, + fontSize: theme.fontSize.xs, + }, + entryMenuDivider: { + height: 1, + backgroundColor: theme.colors.border, + marginHorizontal: theme.spacing[2], + marginVertical: theme.spacing[1], + }, entryMenuItem: { paddingVertical: theme.spacing[2], paddingHorizontal: theme.spacing[3], diff --git a/packages/app/src/components/headers/screen-header.tsx b/packages/app/src/components/headers/screen-header.tsx index 486241e02..232d35b70 100644 --- a/packages/app/src/components/headers/screen-header.tsx +++ b/packages/app/src/components/headers/screen-header.tsx @@ -3,6 +3,7 @@ import { View, type StyleProp, type ViewStyle } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { StyleSheet, UnistylesRuntime } from "react-native-unistyles"; import { HEADER_INNER_HEIGHT } from "@/constants/layout"; +import { useTauriDragHandlers } from "@/utils/tauri-window"; interface ScreenHeaderProps { left?: ReactNode; @@ -21,10 +22,14 @@ export function ScreenHeader({ left, right, leftStyle, rightStyle }: ScreenHeade // Only add extra padding on mobile for better touch targets; on desktop, only use safe area insets const topPadding = isMobile ? 8 : 0; + // On Tauri macOS, enable window dragging and double-click to maximize + // Left padding for traffic lights is handled by _layout.tsx when sidebar is collapsed + const dragHandlers = useTauriDragHandlers(); + return ( - + {left} {right} @@ -46,6 +51,7 @@ const styles = StyleSheet.create((theme) => ({ paddingHorizontal: theme.spacing[2], borderBottomWidth: theme.borderWidth[1], borderBottomColor: theme.colors.border, + userSelect: "none", }, left: { flex: 1, diff --git a/packages/app/src/components/message-input.tsx b/packages/app/src/components/message-input.tsx index 6a837d91f..90f2a47d3 100644 --- a/packages/app/src/components/message-input.tsx +++ b/packages/app/src/components/message-input.tsx @@ -27,7 +27,6 @@ import Animated, { import { useDictation } from "@/hooks/use-dictation"; import { DictationOverlay } from "./dictation-controls"; import type { DaemonClientV2 } from "@server/client/daemon-client-v2"; -import type { SessionContextValue } from "@/contexts/session-context"; import { usePanelStore } from "@/stores/panel-store"; export interface ImageAttachment { @@ -52,7 +51,6 @@ export interface MessageInputProps { onPickImages?: () => void; onRemoveImage?: (index: number) => void; client: DaemonClientV2 | null; - sendAgentAudio: SessionContextValue["sendAgentAudio"]; placeholder?: string; autoFocus?: boolean; disabled?: boolean; @@ -104,7 +102,6 @@ export const MessageInput = forwardRef( onPickImages, onRemoveImage, client, - sendAgentAudio, placeholder = "Message...", autoFocus = false, disabled = false, @@ -200,9 +197,7 @@ export const MessageInput = forwardRef( retryFailedDictation, discardFailedDictation, } = useDictation({ - sendAgentAudio, client, - mode: "transcribe_only", onTranscript: handleDictationTranscript, onError: handleDictationError, canStart: canStartDictation, @@ -538,8 +533,23 @@ export const MessageInput = forwardRef( {leftContent} - {/* Right: send/queue button, voice button, rightContent slot */} + {/* Right: voice button, contextual button (realtime/send/cancel) */} + + {isDictating ? ( + + ) : ( + + )} + {shouldShowSendButton && ( ( )} - - {isDictating ? ( - - ) : ( - - )} - - {rightContent} + {!shouldShowSendButton && rightContent} diff --git a/packages/app/src/components/message.tsx b/packages/app/src/components/message.tsx index a4fafd74a..162662566 100644 --- a/packages/app/src/components/message.tsx +++ b/packages/app/src/components/message.tsx @@ -387,16 +387,21 @@ const expandableBadgeStylesheet = StyleSheet.create((theme) => ({ flexShrink: 0, }, detailWrapper: { - marginTop: theme.spacing[2], - borderRadius: theme.borderRadius.md, + borderBottomLeftRadius: theme.borderRadius.lg, + borderBottomRightRadius: theme.borderRadius.lg, borderWidth: theme.borderWidth[1], - borderColor: theme.colors.border, + borderTopWidth: 0, + borderColor: theme.colors.borderAccent, backgroundColor: theme.colors.surface0, padding: theme.spacing[2], gap: theme.spacing[2], flexShrink: 1, minWidth: 0, }, + pressableExpanded: { + borderBottomLeftRadius: 0, + borderBottomRightRadius: 0, + }, })); function isLikelyPathToken(value: string): boolean { @@ -511,7 +516,7 @@ export const AssistantMessage = memo(function AssistantMessage({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -525,7 +530,6 @@ export const AssistantMessage = memo(function AssistantMessage({ {children} @@ -540,7 +544,6 @@ export const AssistantMessage = memo(function AssistantMessage({ {node.content} @@ -552,7 +555,7 @@ export const AssistantMessage = memo(function AssistantMessage({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -576,7 +579,6 @@ export const AssistantMessage = memo(function AssistantMessage({ inheritedStyles, assistantMessageStylesheet.markdownCodeInline, ]} - selectable > {content} @@ -1153,6 +1155,7 @@ const ExpandableBadge = memo(function ExpandableBadge({ pressed && hasDetails ? expandableBadgeStylesheet.pressablePressed : null, + isExpanded && expandableBadgeStylesheet.pressableExpanded, ]} > @@ -1181,12 +1184,12 @@ const ExpandableBadge = memo(function ExpandableBadge({ /> ) : null} - {detailContent ? ( - - {detailContent} - - ) : null} + {detailContent ? ( + + {detailContent} + + ) : null} ); }); @@ -1226,7 +1229,7 @@ export const AgentThoughtMessage = memo(function AgentThoughtMessage({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -1240,7 +1243,6 @@ export const AgentThoughtMessage = memo(function AgentThoughtMessage({ {children} @@ -1255,7 +1257,6 @@ export const AgentThoughtMessage = memo(function AgentThoughtMessage({ {node.content} @@ -1267,7 +1268,7 @@ export const AgentThoughtMessage = memo(function AgentThoughtMessage({ styles: any, inheritedStyles: any = {} ) => ( - + {node.content} ), @@ -1281,7 +1282,6 @@ export const AgentThoughtMessage = memo(function AgentThoughtMessage({ {node.content} @@ -1432,7 +1432,7 @@ export const ToolCall = memo(function ToolCall({ args !== undefined || result !== undefined || error !== undefined; // Parse tool call details for inline rendering - const { display, errorText } = useToolCallDetails({ args, result, error }); + const { display, errorText } = useToolCallDetails({ toolName, args, result, error }); const handleToggle = useCallback(() => { if (!isMobile && isPerfLoggingEnabled()) { @@ -1498,7 +1498,7 @@ export const ToolCall = memo(function ToolCall({ return ( - {/* Header: New Agent button */} - + {/* Header: New Agent button - top padding area is draggable on Tauri */} + [ styles.newAgentButton, @@ -316,6 +322,7 @@ const styles = StyleSheet.create((theme) => ({ paddingHorizontal: theme.spacing[4], paddingTop: theme.spacing[4], paddingBottom: theme.spacing[2], + userSelect: "none", }, newAgentButton: { flexDirection: "row", diff --git a/packages/app/src/components/tool-call-details.tsx b/packages/app/src/components/tool-call-details.tsx index 0686a5557..87022ef32 100644 --- a/packages/app/src/components/tool-call-details.tsx +++ b/packages/app/src/components/tool-call-details.tsx @@ -7,6 +7,7 @@ import { getNowMs, isPerfLoggingEnabled, perfLog } from "@/utils/perf"; import { parseToolCallDisplay, buildLineDiff, + parseUnifiedDiff, type ToolCallDisplay, } from "@/utils/tool-call-parsers"; import { DiffViewer } from "./diff-viewer"; @@ -14,6 +15,7 @@ import { DiffViewer } from "./diff-viewer"; // ---- Types ---- export interface ToolCallDetailsData { + toolName: string; args?: unknown; result?: unknown; error?: unknown; @@ -139,6 +141,10 @@ export function ToolCallDetailsContent({ // Compute diff lines for edit type const diffLines = useMemo(() => { if (display.type !== "edit") return undefined; + // Use pre-computed unified diff if available (e.g., from apply_patch) + if (display.unifiedDiff) { + return parseUnifiedDiff(display.unifiedDiff); + } return buildLineDiff(display.oldString, display.newString); }, [display]); @@ -304,12 +310,12 @@ export function ToolCallDetailsContent({ // ---- Hook for parsing tool call data ---- export function useToolCallDetails(data: ToolCallDetailsData) { - const { args, result, error } = data; + const { toolName, args, result, error } = data; return useMemo(() => { const shouldLog = isPerfLoggingEnabled(); const startMs = shouldLog ? getNowMs() : 0; - const display = parseToolCallDisplay(args, result); + const display = parseToolCallDisplay(toolName, args, result); const errorText = error !== undefined ? formatValue(error) : undefined; if (shouldLog) { const durationMs = getNowMs() - startMs; @@ -329,7 +335,7 @@ export function useToolCallDetails(data: ToolCallDetailsData) { } } return { display, errorText }; - }, [args, result, error]); + }, [toolName, args, result, error]); } // ---- Styles ---- diff --git a/packages/app/src/components/tool-call-sheet.tsx b/packages/app/src/components/tool-call-sheet.tsx index e0abf535b..e03895aed 100644 --- a/packages/app/src/components/tool-call-sheet.tsx +++ b/packages/app/src/components/tool-call-sheet.tsx @@ -144,7 +144,7 @@ function ToolCallSheetContent({ data, onClose }: ToolCallSheetContentProps) { ? toolKindIcons[kind.toLowerCase()] || Wrench : Wrench; - const { display, errorText } = useToolCallDetails({ args, result, error }); + const { display, errorText } = useToolCallDetails({ toolName, args, result, error }); return ( @@ -153,7 +153,7 @@ function ToolCallSheetContent({ data, onClose }: ToolCallSheetContentProps) { - {toolName} + {display.toolName} diff --git a/packages/app/src/constants/layout.ts b/packages/app/src/constants/layout.ts index d31bcebf9..744901763 100644 --- a/packages/app/src/constants/layout.ts +++ b/packages/app/src/constants/layout.ts @@ -1,3 +1,5 @@ +import { Platform } from "react-native"; + export const FOOTER_HEIGHT = 75; // Shared header inner height (excluding safe area insets and border) @@ -7,3 +9,43 @@ export const HEADER_INNER_HEIGHT = 48; // Max width for chat content (stream view, input area, new agent form) export const MAX_CONTENT_WIDTH = 820; + +// Tauri desktop app constants for macOS traffic light buttons +// These buttons (close/minimize/maximize) overlay the top-left corner +export const TAURI_TRAFFIC_LIGHT_WIDTH = 78; +export const TAURI_TRAFFIC_LIGHT_HEIGHT = 56; + +// Check if running in Tauri desktop app on macOS +function isTauriMac(): boolean { + if (Platform.OS !== "web") return false; + if (typeof window === "undefined") return false; + if (!("__TAURI__" in window)) return false; + // Check for macOS via user agent + const ua = navigator.userAgent; + return ua.includes("Mac OS") || ua.includes("Macintosh"); +} + +// Cached result - only cache true, keep checking if false (in case __TAURI__ loads later) +let _isTauriMacCached: boolean | null = null; + +export function getIsTauriMac(): boolean { + if (_isTauriMacCached === true) { + return true; + } + const result = isTauriMac(); + if (result) { + _isTauriMacCached = true; + } + return result; +} + +// Get traffic light padding values (only non-zero on Tauri macOS) +export function getTrafficLightPadding(): { left: number; top: number } { + if (!getIsTauriMac()) { + return { left: 0, top: 0 }; + } + return { + left: TAURI_TRAFFIC_LIGHT_WIDTH, + top: TAURI_TRAFFIC_LIGHT_HEIGHT, + }; +} diff --git a/packages/app/src/contexts/session-context.tsx b/packages/app/src/contexts/session-context.tsx index 5ace09f1d..be3c72a25 100644 --- a/packages/app/src/contexts/session-context.tsx +++ b/packages/app/src/contexts/session-context.tsx @@ -352,12 +352,6 @@ export interface SessionContextValue { message: string, images?: Array<{ uri: string; mimeType?: string }> ) => Promise; - sendAgentAudio: ( - agentId: string | undefined, - audioBlob: Blob, - requestId?: string, - options?: { mode?: "transcribe_only" | "auto_run" } - ) => Promise; deleteAgent: (agentId: string) => void; createAgent: (options: { config: any; @@ -1972,69 +1966,6 @@ export function SessionProvider({ [client] ); - const sendAgentAudio = useCallback( - async ( - agentId: string | undefined, - audioBlob: Blob, - requestId?: string, - options?: { mode?: "transcribe_only" | "auto_run" } - ) => { - try { - if (!client) { - throw new Error("Daemon client unavailable"); - } - if (!client.isConnected) { - throw new Error("Daemon client is disconnected"); - } - const resolvedRequestId = requestId ?? generateMessageId(); - const arrayBuffer = await audioBlob.arrayBuffer(); - const bytes = new Uint8Array(arrayBuffer); - let binary = ""; - for (let i = 0; i < bytes.length; i++) { - binary += String.fromCharCode(bytes[i]); - } - const base64Audio = btoa(binary); - - const deriveFormat = (mimeType: string | undefined): string => { - if (!mimeType || mimeType.length === 0) { - return "webm"; - } - const slashIndex = mimeType.indexOf("/"); - let formatPart = - slashIndex >= 0 ? mimeType.slice(slashIndex + 1) : mimeType; - const semicolonIndex = formatPart.indexOf(";"); - if (semicolonIndex >= 0) { - formatPart = formatPart.slice(0, semicolonIndex); - } - return formatPart.trim().length > 0 ? formatPart.trim() : "webm"; - }; - - const format = deriveFormat(audioBlob.type); - await client.sendAgentAudio({ - ...(agentId ? { agentId } : {}), - audio: base64Audio, - format, - isLast: true, - requestId: resolvedRequestId, - ...(options?.mode ? { mode: options.mode } : {}), - }); - - console.log( - "[Session] Sent audio:", - agentId ?? "(no agent)", - format, - audioBlob.size, - "bytes", - `(requestId: ${resolvedRequestId})` - ); - } catch (error) { - console.error("[Session] Failed to send audio:", error); - throw error; - } - }, - [client] - ); - const createAgent = useCallback( async ({ config, @@ -2344,7 +2275,6 @@ export function SessionProvider({ cancelAgentRun, deleteAgent, sendAgentMessage, - sendAgentAudio, createAgent, setAgentMode, respondToPermission, @@ -2368,7 +2298,6 @@ export function SessionProvider({ cancelAgentRun, deleteAgent, sendAgentMessage, - sendAgentAudio, createAgent, setAgentMode, respondToPermission, @@ -2394,7 +2323,6 @@ export function SessionProvider({ refreshSession, cancelAgentRun, sendAgentMessage, - sendAgentAudio, deleteAgent, createAgent, setAgentMode, @@ -2415,7 +2343,6 @@ export function SessionProvider({ refreshSession, cancelAgentRun, sendAgentMessage, - sendAgentAudio, deleteAgent, createAgent, setAgentMode, diff --git a/packages/app/src/hooks/use-agent-form-state.ts b/packages/app/src/hooks/use-agent-form-state.ts index 0c3bb299d..88850ea61 100644 --- a/packages/app/src/hooks/use-agent-form-state.ts +++ b/packages/app/src/hooks/use-agent-form-state.ts @@ -8,20 +8,47 @@ import type { AgentModelDefinition, AgentProvider, } from "@server/server/agent/agent-sdk-types"; -import type { ProviderModelState } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store"; -import { useFormPreferences } from "./use-form-preferences"; +import { useFormPreferences, type FormPreferences } from "./use-form-preferences"; -export type CreateAgentInitialValues = { - workingDir?: string; +// Explicit overrides from URL params or "New Agent" button +export interface FormInitialValues { + serverId?: string | null; provider?: AgentProvider; modeId?: string | null; model?: string | null; + workingDir?: string; +} + +// Tracks which fields the user has explicitly modified in this session +interface UserModifiedFields { + serverId: boolean; + provider: boolean; + modeId: boolean; + model: boolean; + workingDir: boolean; +} + +const INITIAL_USER_MODIFIED: UserModifiedFields = { + serverId: false, + provider: false, + modeId: false, + model: false, + workingDir: false, }; +// Internal form state +interface FormState { + serverId: string | null; + provider: AgentProvider; + modeId: string; + model: string; + workingDir: string; +} + type UseAgentFormStateOptions = { initialServerId?: string | null; - initialValues?: CreateAgentInitialValues; + initialValues?: FormInitialValues; isVisible?: boolean; isCreateFlow?: boolean; isTargetDaemonReady?: boolean; @@ -66,6 +93,106 @@ const DEFAULT_PROVIDER: AgentProvider = fallbackDefinition?.id ?? "claude"; const DEFAULT_MODE_FOR_DEFAULT_PROVIDER = fallbackDefinition?.defaultModeId ?? ""; +/** + * Pure function that resolves form state from multiple data sources. + * Priority: explicit (URL params) > preferences > provider defaults > fallback + * + * Only resolves fields that haven't been user-modified. + */ +function resolveFormState( + initialValues: FormInitialValues | undefined, + preferences: FormPreferences | null, + availableModels: AgentModelDefinition[] | null, + userModified: UserModifiedFields, + currentState: FormState +): FormState { + // Start with current state - we only update non-user-modified fields + const result = { ...currentState }; + + // 1. Resolve provider first (other fields depend on it) + if (!userModified.provider) { + if (initialValues?.provider && providerDefinitionMap.has(initialValues.provider)) { + result.provider = initialValues.provider; + } else if ( + preferences?.provider && + providerDefinitionMap.has(preferences.provider as AgentProvider) + ) { + result.provider = preferences.provider as AgentProvider; + } + // else keep current (initialized to DEFAULT_PROVIDER) + } + + const providerDef = providerDefinitionMap.get(result.provider); + const providerPrefs = preferences?.providerPreferences?.[result.provider]; + + // 2. Resolve modeId (depends on provider) + if (!userModified.modeId) { + const validModeIds = providerDef?.modes.map((m) => m.id) ?? []; + + if ( + typeof initialValues?.modeId === "string" && + initialValues.modeId.length > 0 && + validModeIds.includes(initialValues.modeId) + ) { + result.modeId = initialValues.modeId; + } else if ( + providerPrefs?.mode && + validModeIds.includes(providerPrefs.mode) + ) { + result.modeId = providerPrefs.mode; + } else { + result.modeId = providerDef?.defaultModeId ?? validModeIds[0] ?? ""; + } + } + + // 3. Resolve model (depends on provider + availableModels) + if (!userModified.model) { + const isValidModel = (m: string) => + availableModels?.some((am) => am.id === m) ?? false; + + if ( + typeof initialValues?.model === "string" && + initialValues.model.length > 0 + ) { + // If models aren't loaded yet, trust the initial value + // It will be validated once models load + if (!availableModels || isValidModel(initialValues.model)) { + result.model = initialValues.model; + } else if (providerPrefs?.model && isValidModel(providerPrefs.model)) { + result.model = providerPrefs.model; + } else { + result.model = ""; + } + } else if (providerPrefs?.model && isValidModel(providerPrefs.model)) { + result.model = providerPrefs.model; + } else { + result.model = ""; + } + } + + // 4. Resolve serverId (independent) + if (!userModified.serverId) { + if (initialValues?.serverId !== undefined) { + result.serverId = initialValues.serverId; + } else if (preferences?.serverId) { + result.serverId = preferences.serverId; + } + // else keep current + } + + // 5. Resolve workingDir (independent) + if (!userModified.workingDir) { + if (initialValues?.workingDir !== undefined) { + result.workingDir = initialValues.workingDir; + } else if (preferences?.workingDir) { + result.workingDir = preferences.workingDir; + } + // else keep current (empty string) + } + + return result; +} + export function useAgentFormState( options: UseAgentFormStateOptions = {} ): UseAgentFormStateResult { @@ -80,29 +207,36 @@ export function useAgentFormState( const { preferences, isLoading: isPreferencesLoading, - getProviderPreferences, updatePreferences, updateProviderPreferences, } = useFormPreferences(); - const [selectedServerId, setSelectedServerId] = useState( - initialServerId - ); - const [workingDir, setWorkingDir] = useState(""); - const [selectedProvider, setSelectedProvider] = - useState(DEFAULT_PROVIDER); - const [selectedMode, setSelectedMode] = useState( - DEFAULT_MODE_FOR_DEFAULT_PROVIDER - ); - const [selectedModel, setSelectedModel] = useState(""); + // Track which fields the user has explicitly modified + const [userModified, setUserModified] = useState(INITIAL_USER_MODIFIED); - const hasHydratedRef = useRef(false); - const hasAppliedInitialValuesRef = useRef(false); - const providerModelRequestTimersRef = useRef< - Map> - >(new Map()); + // Form state + const [formState, setFormState] = useState(() => ({ + serverId: initialServerId, + provider: DEFAULT_PROVIDER, + modeId: DEFAULT_MODE_FOR_DEFAULT_PROVIDER, + model: "", + workingDir: "", + })); + + // Track if we've done initial resolution (to avoid flickering) + const hasResolvedRef = useRef(false); + + // Reset user modifications when form becomes invisible + useEffect(() => { + if (!isVisible) { + setUserModified(INITIAL_USER_MODIFIED); + hasResolvedRef.current = false; + } + }, [isVisible]); + + // Get session state for provider models const sessionState = useSessionStore((state) => - selectedServerId ? state.sessions[selectedServerId] : undefined + formState.serverId ? state.sessions[formState.serverId] : undefined ); const providerModels = sessionState?.providerModels; const requestProviderModels = sessionState?.methods?.requestProviderModels; @@ -111,9 +245,73 @@ export function useAgentFormState( [] ); + // Get available models for current provider + const modelState = providerModels?.get(formState.provider); + const availableModels = modelState?.models ?? null; + + // Combine initialValues with initialServerId for resolution + const combinedInitialValues = useMemo((): FormInitialValues | undefined => { + if (!initialValues && initialServerId === null) { + return undefined; + } + return { + ...initialValues, + serverId: initialValues?.serverId ?? initialServerId, + }; + }, [initialValues, initialServerId]); + + // Resolve form state when data sources change + useEffect(() => { + if (!isVisible || !isCreateFlow) { + return; + } + + // Wait for preferences to load before first resolution + if (isPreferencesLoading && !hasResolvedRef.current) { + return; + } + + const resolved = resolveFormState( + combinedInitialValues, + preferences, + availableModels, + userModified, + formState + ); + + // Only update if something changed + if ( + resolved.serverId !== formState.serverId || + resolved.provider !== formState.provider || + resolved.modeId !== formState.modeId || + resolved.model !== formState.model || + resolved.workingDir !== formState.workingDir + ) { + setFormState(resolved); + } + + hasResolvedRef.current = true; + }, [ + isVisible, + isCreateFlow, + isPreferencesLoading, + combinedInitialValues, + preferences, + availableModels, + userModified, + formState, + ]); + + // Provider model request timers + const providerModelRequestTimersRef = useRef< + Map> + >(new Map()); + + // User setters - mark fields as modified and persist to preferences const setSelectedServerIdFromUser = useCallback( (value: string | null) => { - setSelectedServerId(value); + setFormState((prev) => ({ ...prev, serverId: value })); + setUserModified((prev) => ({ ...prev, serverId: true })); void updatePreferences({ serverId: value ?? undefined }); }, [updatePreferences] @@ -121,124 +319,86 @@ export function useAgentFormState( const setProviderFromUser = useCallback( (provider: AgentProvider) => { - setSelectedProvider(provider); + setFormState((prev) => ({ ...prev, provider })); + setUserModified((prev) => ({ ...prev, provider: true })); void updatePreferences({ provider }); - // Restore per-provider preferences if available - const providerPrefs = getProviderPreferences(provider); + // When provider changes, reset mode and model to provider defaults + // (unless user has explicitly set them) const providerDef = providerDefinitionMap.get(provider); + const providerPrefs = preferences?.providerPreferences?.[provider]; - setSelectedModel(providerPrefs?.model ?? ""); - setSelectedMode(providerPrefs?.mode ?? providerDef?.defaultModeId ?? ""); + setFormState((prev) => ({ + ...prev, + provider, + modeId: providerPrefs?.mode ?? providerDef?.defaultModeId ?? "", + model: providerPrefs?.model ?? "", + })); }, - [getProviderPreferences, updatePreferences] + [preferences?.providerPreferences, updatePreferences] ); const setModeFromUser = useCallback( (modeId: string) => { - setSelectedMode(modeId); - void updateProviderPreferences(selectedProvider, { mode: modeId }); + setFormState((prev) => ({ ...prev, modeId })); + setUserModified((prev) => ({ ...prev, modeId: true })); + void updateProviderPreferences(formState.provider, { mode: modeId }); }, - [selectedProvider, updateProviderPreferences] + [formState.provider, updateProviderPreferences] ); const setModelFromUser = useCallback( (modelId: string) => { - setSelectedModel(modelId); - void updateProviderPreferences(selectedProvider, { model: modelId }); + setFormState((prev) => ({ ...prev, model: modelId })); + setUserModified((prev) => ({ ...prev, model: true })); + void updateProviderPreferences(formState.provider, { model: modelId }); }, - [selectedProvider, updateProviderPreferences] + [formState.provider, updateProviderPreferences] ); + const setWorkingDir = useCallback((value: string) => { + setFormState((prev) => ({ ...prev, workingDir: value })); + }, []); + const setWorkingDirFromUser = useCallback( (value: string) => { - setWorkingDir(value); + setFormState((prev) => ({ ...prev, workingDir: value })); + setUserModified((prev) => ({ ...prev, workingDir: true })); void updatePreferences({ workingDir: value }); }, [updatePreferences] ); - const applyInitialValues = useCallback(() => { - if (!isCreateFlow || !initialValues) { - return; - } - - if (Object.prototype.hasOwnProperty.call(initialValues, "workingDir")) { - setWorkingDir(initialValues.workingDir ?? ""); - } - - if (initialValues.provider && providerDefinitionMap.has(initialValues.provider)) { - setSelectedProvider(initialValues.provider); - } - - if (typeof initialValues.modeId === "string" && initialValues.modeId.length > 0) { - setSelectedMode(initialValues.modeId); - } - - if (typeof initialValues.model === "string" && initialValues.model.length > 0) { - setSelectedModel(initialValues.model); - } - }, [initialValues, isCreateFlow]); - - useEffect(() => { - if (!isVisible) { - hasAppliedInitialValuesRef.current = false; - return; - } - if (hasAppliedInitialValuesRef.current) { - return; - } - applyInitialValues(); - hasAppliedInitialValuesRef.current = true; - }, [applyInitialValues, isVisible]); + const setSelectedServerId = useCallback((value: string | null) => { + setFormState((prev) => ({ ...prev, serverId: value })); + }, []); const refreshProviderModels = useCallback(() => { if (!requestProviderModels) { return; } - const trimmed = workingDir.trim(); - requestProviderModels(selectedProvider, { + const trimmed = formState.workingDir.trim(); + requestProviderModels(formState.provider, { cwd: trimmed.length > 0 ? trimmed : undefined, }); - }, [requestProviderModels, selectedProvider, workingDir]); - - // Hydrate form state from preferences once loaded - useEffect(() => { - if (isPreferencesLoading || hasHydratedRef.current) return; - hasHydratedRef.current = true; - - const activeProvider = - preferences.provider && - providerDefinitionMap.has(preferences.provider as AgentProvider) - ? (preferences.provider as AgentProvider) - : DEFAULT_PROVIDER; - - const providerPrefs = preferences.providerPreferences?.[activeProvider]; - const providerDef = providerDefinitionMap.get(activeProvider); - - setSelectedProvider(activeProvider); - if (preferences.workingDir) setWorkingDir(preferences.workingDir); - setSelectedMode(providerPrefs?.mode ?? providerDef?.defaultModeId ?? ""); - if (providerPrefs?.model) setSelectedModel(providerPrefs.model); - if (preferences.serverId) setSelectedServerId(preferences.serverId); - }, [isPreferencesLoading, preferences]); + }, [requestProviderModels, formState.provider, formState.workingDir]); const persistFormPreferences = useCallback(async () => { await updatePreferences({ - workingDir, - provider: selectedProvider, - serverId: selectedServerId ?? undefined, + workingDir: formState.workingDir, + provider: formState.provider, + serverId: formState.serverId ?? undefined, }); - await updateProviderPreferences(selectedProvider, { - mode: selectedMode, - model: selectedModel, + await updateProviderPreferences(formState.provider, { + mode: formState.modeId, + model: formState.model, }); }, [ - selectedMode, - selectedModel, - selectedProvider, - selectedServerId, - workingDir, + formState.modeId, + formState.model, + formState.provider, + formState.serverId, + formState.workingDir, updatePreferences, updateProviderPreferences, ]); @@ -270,7 +430,7 @@ export function useAgentFormState( return; } - const currentState = sessionState.providerModels?.get(selectedProvider); + const currentState = sessionState.providerModels?.get(formState.provider); if (currentState?.models?.length || currentState?.isLoading) { clearQueuedProviderModelRequest(serverId); return; @@ -279,7 +439,7 @@ export function useAgentFormState( const delayMs = options?.delayMs ?? 0; const trigger = () => { providerModelRequestTimersRef.current.delete(serverId); - sessionState.methods?.requestProviderModels(selectedProvider, { + sessionState.methods?.requestProviderModels(formState.provider, { ...(options?.cwd ? { cwd: options.cwd } : {}), }); }; @@ -290,7 +450,7 @@ export function useAgentFormState( trigger(); } }, - [clearQueuedProviderModelRequest, getSessionState, selectedProvider] + [clearQueuedProviderModelRequest, getSessionState, formState.provider] ); useEffect(() => { @@ -303,74 +463,53 @@ export function useAgentFormState( }, []); useEffect(() => { - if (!isVisible || !isTargetDaemonReady || !selectedServerId) { - clearQueuedProviderModelRequest(selectedServerId); + if (!isVisible || !isTargetDaemonReady || !formState.serverId) { + clearQueuedProviderModelRequest(formState.serverId); return; } - const trimmed = workingDir.trim(); - queueProviderModelFetch(selectedServerId, { + const trimmed = formState.workingDir.trim(); + queueProviderModelFetch(formState.serverId, { cwd: trimmed.length > 0 ? trimmed : undefined, delayMs: 180, }); return () => { - clearQueuedProviderModelRequest(selectedServerId); + clearQueuedProviderModelRequest(formState.serverId); }; }, [ clearQueuedProviderModelRequest, isTargetDaemonReady, isVisible, queueProviderModelFetch, - selectedServerId, - workingDir, + formState.serverId, + formState.workingDir, ]); - const agentDefinition = providerDefinitionMap.get(selectedProvider); + const agentDefinition = providerDefinitionMap.get(formState.provider); const modeOptions = agentDefinition?.modes ?? []; - const modelState = providerModels?.get(selectedProvider); - const availableModels = modelState?.models ?? []; const isModelLoading = modelState?.isLoading ?? false; const modelError = modelState?.error ?? null; - useEffect(() => { - if (!agentDefinition) { - return; - } - - if (modeOptions.length === 0) { - if (selectedMode !== "") { - setSelectedMode(""); - } - return; - } - - const availableModeIds = modeOptions.map((mode) => mode.id); - if (!availableModeIds.includes(selectedMode)) { - const fallbackModeId = agentDefinition.defaultModeId ?? availableModeIds[0]; - setSelectedMode(fallbackModeId); - } - }, [agentDefinition, modeOptions, selectedMode]); - - const workingDirIsEmpty = !workingDir.trim(); + const workingDirIsEmpty = !formState.workingDir.trim(); return useMemo( () => ({ - selectedServerId, + selectedServerId: formState.serverId, setSelectedServerId, setSelectedServerIdFromUser, - selectedProvider, + selectedProvider: formState.provider, setProviderFromUser, - selectedMode, + selectedMode: formState.modeId, setModeFromUser, - selectedModel, + selectedModel: formState.model, setModelFromUser, - workingDir, + workingDir: formState.workingDir, setWorkingDir, setWorkingDirFromUser, providerDefinitions, providerDefinitionMap, agentDefinition, modeOptions, - availableModels, + availableModels: availableModels ?? [], isModelLoading, modelError, refreshProviderModels, @@ -380,26 +519,31 @@ export function useAgentFormState( persistFormPreferences, }), [ - agentDefinition, - availableModels, - isModelLoading, - modelError, - modeOptions, - queueProviderModelFetch, - clearQueuedProviderModelRequest, - refreshProviderModels, - selectedMode, - selectedModel, - selectedProvider, - selectedServerId, + formState.serverId, + formState.provider, + formState.modeId, + formState.model, + formState.workingDir, + setSelectedServerId, setSelectedServerIdFromUser, setProviderFromUser, setModeFromUser, setModelFromUser, + setWorkingDir, setWorkingDirFromUser, - workingDir, + agentDefinition, + modeOptions, + availableModels, + isModelLoading, + modelError, + refreshProviderModels, + queueProviderModelFetch, + clearQueuedProviderModelRequest, workingDirIsEmpty, persistFormPreferences, ] ); } + +// Re-export for backwards compatibility +export type CreateAgentInitialValues = FormInitialValues; diff --git a/packages/app/src/hooks/use-dictation.ts b/packages/app/src/hooks/use-dictation.ts index 045aa9204..6ce2696ed 100644 --- a/packages/app/src/hooks/use-dictation.ts +++ b/packages/app/src/hooks/use-dictation.ts @@ -1,7 +1,6 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { useMutation } from "@tanstack/react-query"; -import type { SessionContextValue } from "@/contexts/session-context"; import { useAudioRecorder } from "@/hooks/use-audio-recorder"; import type { DaemonClientV2 } from "@server/client/daemon-client-v2"; import type { TranscriptionResultMessage } from "@server/shared/messages"; @@ -33,10 +32,7 @@ export type DictationOutcome = | { type: "failure"; requestId: string; errorMessage: string; timestamp: number }; export type UseDictationOptions = { - agentId?: string; - sendAgentAudio: SessionContextValue["sendAgentAudio"]; client: DaemonClientV2 | null; - mode?: "transcribe_only" | "auto_run"; onTranscript: (text: string, meta: { requestId: string }) => void; onError?: (error: Error) => void; onRetryAttempt?: (info: DictationRetryInfo) => void; @@ -121,6 +117,16 @@ type CapturedAudioPayload = { type TranscriptionPayload = TranscriptionResultMessage["payload"]; +const blobToBase64 = async (blob: Blob): Promise => { + const arrayBuffer = await blob.arrayBuffer(); + const bytes = new Uint8Array(arrayBuffer); + let binary = ""; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +}; + const deriveFormatFromMime = (mimeType?: string): string => { if (!mimeType || mimeType.length === 0) { return "webm"; @@ -144,10 +150,7 @@ const buildCapturedAudioPayload = (blob: Blob, durationSeconds: number): Capture export function useDictation(options: UseDictationOptions): UseDictationResult { const { - agentId, - sendAgentAudio, client, - mode = "transcribe_only", onTranscript, onError, onRetryAttempt, @@ -172,7 +175,7 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { const maxRetryAttempts = MAX_AUTO_RETRY_ATTEMPTS; const transcriptionMutation = useMutation({ - mutationFn: async (requestId: string): Promise => { + mutationFn: async (): Promise => { const capturedAudio = pendingAudioRef.current; if (!capturedAudio) { throw new Error("No recorded audio available for transcription"); @@ -199,9 +202,7 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { } console.info("[useDictation] sending transcription request", { - requestId, attempt, - agentId, size: capturedAudio.sizeBytes, durationSeconds: capturedAudio.durationSeconds, }); @@ -210,20 +211,12 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setRetryAttempt(attempt); try { - const transcriptionPromise = client.waitForTranscriptionResult( - requestId, - TRANSCRIPTION_TIMEOUT_MS - ); - try { - await sendAgentAudio(agentId, capturedAudio.blob, requestId, { - mode, - }); - } catch (error) { - transcriptionPromise.catch(() => {}); - throw new DictationAttemptError("dispatch", toError(error)); - } - - return await transcriptionPromise; + const base64Audio = await blobToBase64(capturedAudio.blob); + return await client.transcribeAudio({ + audio: base64Audio, + format: capturedAudio.format, + timeout: TRANSCRIPTION_TIMEOUT_MS, + }); } catch (error) { const normalized = toError(error); const reason: DictationRetryReason = isTimeoutError(normalized) @@ -256,7 +249,6 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setRetryInfo(info); onRetryAttemptRef.current?.(info); console.warn("[useDictation] retry scheduled", { - requestId, attempt: nextAttempt, maxAttempts: MAX_AUTO_RETRY_ATTEMPTS, reason: attemptError.reason, @@ -383,12 +375,13 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { }, []); const transmitDictation = useCallback( - async (requestId: string) => runTranscription(requestId), + async () => runTranscription(), [runTranscription] ); const handleTranscriptionSuccess = useCallback( - (transcription: TranscriptionPayload, requestId: string) => { + (transcription: TranscriptionPayload) => { + const requestId = transcription.requestId; pendingRequestIdRef.current = null; setPendingRequestId(null); setIsProcessing(false); @@ -409,16 +402,15 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { requestId, textLength: transcriptText.length, }); - onTranscriptRef.current?.(transcriptText, { - requestId: transcription.requestId ?? requestId, - }); + onTranscriptRef.current?.(transcriptText, { requestId }); }, [onTranscriptRef] ); const handleDictationFailure = useCallback( - (failure: unknown, requestId: string | null) => { + (failure: unknown) => { const normalized = toError(failure); + const failureId = generateMessageId(); pendingRequestIdRef.current = null; setPendingRequestId(null); setIsProcessing(false); @@ -431,16 +423,14 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { if (capturedAudio) { setStatus("failed"); setFailedRecording({ - requestId: requestId ?? generateMessageId(), + requestId: failureId, durationSeconds: capturedAudio.durationSeconds, sizeBytes: capturedAudio.sizeBytes, format: capturedAudio.format, recordedAt: capturedAudio.recordedAt, errorMessage: normalized.message, }); - if (requestId) { - onPermanentFailureRef.current?.(normalized, { requestId }); - } + onPermanentFailureRef.current?.(normalized, { requestId: failureId }); } else { setStatus("idle"); } @@ -448,7 +438,7 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setRetryAttempt(0); setLastOutcome({ type: "failure", - requestId: requestId ?? generateMessageId(), + requestId: failureId, errorMessage: normalized.message, timestamp: Date.now(), }); @@ -571,7 +561,6 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setRetryAttempt(0); setLastOutcome(null); - let requestId: string | null = null; try { const audioData = await stopRecorder(); const recordedDurationSeconds = durationRef.current; @@ -581,21 +570,15 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setIsRecording(false); setVolume(0); - requestId = generateMessageId(); - pendingRequestIdRef.current = requestId; - setPendingRequestId(requestId); - - const transcription = await transmitDictation(requestId); - handleTranscriptionSuccess(transcription, requestId); + const transcription = await transmitDictation(); + handleTranscriptionSuccess(transcription); } catch (err) { resetTranscriptionMutation(); - handleDictationFailure(err, requestId); + handleDictationFailure(err); } }, [ - agentId, canConfirm, isProcessing, - mode, handleDictationFailure, handleTranscriptionSuccess, resetTranscriptionMutation, @@ -615,16 +598,12 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { setIsProcessing(true); setLastOutcome(null); - const requestId = generateMessageId(); - pendingRequestIdRef.current = requestId; - setPendingRequestId(requestId); - try { - const transcription = await transmitDictation(requestId); - handleTranscriptionSuccess(transcription, requestId); + const transcription = await transmitDictation(); + handleTranscriptionSuccess(transcription); } catch (err) { resetTranscriptionMutation(); - handleDictationFailure(err, requestId); + handleDictationFailure(err); } }, [ handleDictationFailure, @@ -687,17 +666,6 @@ export function useDictation(options: UseDictationOptions): UseDictationResult { } }, [autoStopWhenHidden?.isVisible]); - useEffect(() => { - pendingRequestIdRef.current = null; - setPendingRequestId(null); - setIsProcessing(false); - pendingAudioRef.current = null; - setStatus("idle"); - setRetryAttempt(0); - setRetryInfo(null); - setFailedRecording(null); - resetTranscriptionMutation(); - }, [agentId, resetTranscriptionMutation]); useEffect(() => { return () => { diff --git a/packages/app/src/stores/panel-store.ts b/packages/app/src/stores/panel-store.ts index 3f073ec85..53479a13a 100644 --- a/packages/app/src/stores/panel-store.ts +++ b/packages/app/src/stores/panel-store.ts @@ -27,7 +27,7 @@ interface DesktopSidebarState { fileExplorerOpen: boolean; } -type ExplorerTab = "changes" | "files"; +export type ExplorerTab = "changes" | "files"; export type ViewMode = "list" | "grid"; export type SortOption = "name" | "modified" | "size"; diff --git a/packages/app/src/stores/session-store.ts b/packages/app/src/stores/session-store.ts index d3e815bc8..3cbfe6aec 100644 --- a/packages/app/src/stores/session-store.ts +++ b/packages/app/src/stores/session-store.ts @@ -182,12 +182,6 @@ export interface SessionState { message: string, images?: Array<{ uri: string; mimeType?: string }> ) => Promise; - sendAgentAudio: ( - agentId: string | undefined, - audioBlob: Blob, - requestId?: string, - options?: { mode?: "transcribe_only" | "auto_run" } - ) => Promise; deleteAgent: (agentId: string) => void; createAgent: (options: { config: any; diff --git a/packages/app/src/utils/shorten-path.ts b/packages/app/src/utils/shorten-path.ts new file mode 100644 index 000000000..8b0e68ab3 --- /dev/null +++ b/packages/app/src/utils/shorten-path.ts @@ -0,0 +1,10 @@ +/** + * Shortens a file path by replacing the home directory prefix with ~. + * Handles both macOS (/Users/username) and Linux (/home/username) paths. + */ +export function shortenPath(path: string | undefined | null): string { + if (!path) { + return ""; + } + return path.replace(/^\/(?:Users|home)\/[^/]+/, "~"); +} diff --git a/packages/app/src/utils/tauri-window.ts b/packages/app/src/utils/tauri-window.ts new file mode 100644 index 000000000..118bf1a99 --- /dev/null +++ b/packages/app/src/utils/tauri-window.ts @@ -0,0 +1,104 @@ +import { Platform } from "react-native"; +import { useState, useEffect } from "react"; +import { getIsTauriMac, TAURI_TRAFFIC_LIGHT_WIDTH, TAURI_TRAFFIC_LIGHT_HEIGHT } from "@/constants/layout"; + +let tauriWindow: any = null; + +async function getTauriWindow() { + if (tauriWindow) return tauriWindow; + if (!getIsTauriMac()) return null; + + try { + const { getCurrentWindow } = await import("@tauri-apps/api/window"); + tauriWindow = getCurrentWindow(); + return tauriWindow; + } catch { + return null; + } +} + +export async function startDragging() { + const win = await getTauriWindow(); + if (win) { + await win.startDragging(); + } +} + +export async function toggleMaximize() { + const win = await getTauriWindow(); + if (win) { + await win.toggleMaximize(); + } +} + +// Returns event handlers for drag region behavior +export function useTauriDragHandlers() { + if (Platform.OS !== "web" || !getIsTauriMac()) { + return {}; + } + + return { + onMouseDown: (e: React.MouseEvent) => { + // Only handle left click, ignore if clicking on interactive elements + if (e.button !== 0) return; + const target = e.target as HTMLElement; + if (target.closest("button, a, input, [role='button']")) return; + + // Prevent text selection when dragging + e.preventDefault(); + + // Start dragging on mouse down + startDragging(); + }, + onDoubleClick: (e: React.MouseEvent) => { + // Ignore if clicking on interactive elements + const target = e.target as HTMLElement; + if (target.closest("button, a, input, [role='button']")) return; + + e.preventDefault(); + toggleMaximize(); + }, + }; +} + +// Hook that returns traffic light padding, accounting for fullscreen state +// In fullscreen, traffic lights are hidden so no padding is needed +export function useTrafficLightPadding(): { left: number; top: number } { + const [isFullscreen, setIsFullscreen] = useState(false); + + useEffect(() => { + if (Platform.OS !== "web" || !getIsTauriMac()) return; + + let unlisten: (() => void) | undefined; + + async function setup() { + const win = await getTauriWindow(); + if (!win) return; + + // Check initial fullscreen state + const fullscreen = await win.isFullscreen(); + setIsFullscreen(fullscreen); + + // Listen for resize events which include fullscreen changes + unlisten = await win.onResized(async () => { + const fs = await win.isFullscreen(); + setIsFullscreen(fs); + }); + } + + setup(); + + return () => { + unlisten?.(); + }; + }, []); + + if (!getIsTauriMac() || isFullscreen) { + return { left: 0, top: 0 }; + } + + return { + left: TAURI_TRAFFIC_LIGHT_WIDTH, + top: TAURI_TRAFFIC_LIGHT_HEIGHT, + }; +} diff --git a/packages/app/src/utils/tool-call-parsers.test.ts b/packages/app/src/utils/tool-call-parsers.test.ts index 5dd33ccf4..57619fd27 100644 --- a/packages/app/src/utils/tool-call-parsers.test.ts +++ b/packages/app/src/utils/tool-call-parsers.test.ts @@ -42,8 +42,9 @@ describe("parseToolCallDisplay", () => { const input = { command: "pwd", description: "Print working directory" }; const result = { type: "command", command: "pwd", output: "/some/path" }; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("Bash", input, result); expect(display.type).toBe("shell"); + expect(display.toolName).toBe("Shell"); if (display.type === "shell") { expect(display.command).toBe("pwd"); expect(display.output).toBe("/some/path"); @@ -55,8 +56,9 @@ describe("parseToolCallDisplay", () => { const input = { command: "pwd", description: "Print working directory" }; const result = undefined; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("Bash", input, result); expect(display.type).toBe("shell"); + expect(display.toolName).toBe("Shell"); if (display.type === "shell") { expect(display.command).toBe("pwd"); expect(display.output).toBe(""); @@ -67,19 +69,44 @@ describe("parseToolCallDisplay", () => { const input = { command: ["git", "status"] }; const result = { type: "command", output: "On branch main" }; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("shell", input, result); expect(display.type).toBe("shell"); + expect(display.toolName).toBe("Shell"); if (display.type === "shell") { expect(display.command).toBe("git status"); expect(display.output).toBe("On branch main"); } }); + test("normalizes tool names - shell to Shell", () => { + const input = { command: "pwd" }; + const display = parseToolCallDisplay("shell", input, undefined); + expect(display.toolName).toBe("Shell"); + }); + + test("normalizes tool names - Bash to Shell", () => { + const input = { command: "pwd" }; + const display = parseToolCallDisplay("Bash", input, undefined); + expect(display.toolName).toBe("Shell"); + }); + + test("normalizes tool names - read_file to Read", () => { + const input = { file_path: "/some/file.txt" }; + const display = parseToolCallDisplay("read_file", input, undefined); + expect(display.toolName).toBe("Read"); + }); + + test("preserves unknown tool names", () => { + const input = { some_arg: "value" }; + const display = parseToolCallDisplay("MyCustomTool", input, undefined); + expect(display.toolName).toBe("MyCustomTool"); + }); + test("parses non-command tool call into generic type", () => { const input = { file_path: "/some/file.txt" }; const result = { content: "file contents here", lineCount: 42 }; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("SomeTool", input, result); expect(display.type).toBe("generic"); if (display.type === "generic") { expect(display.input).toContainEqual({ key: "file_path", value: "/some/file.txt" }); @@ -92,12 +119,12 @@ describe("parseToolCallDisplay", () => { const input = { file_path: "/some/file.txt", content: "new content" }; const result = { type: "file_write", filePath: "/some/file.txt" }; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("Write", input, result); expect(display.type).toBe("generic"); }); test("handles undefined input and result gracefully", () => { - const display: ToolCallDisplay = parseToolCallDisplay(undefined, undefined); + const display: ToolCallDisplay = parseToolCallDisplay("unknown", undefined, undefined); expect(display.type).toBe("generic"); if (display.type === "generic") { expect(display.input).toEqual([]); @@ -116,7 +143,7 @@ describe("parseToolCallDisplay", () => { filePath: "/some/file.txt", }; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("Edit", input, result); expect(display.type).toBe("edit"); if (display.type === "edit") { expect(display.filePath).toBe("/some/file.txt"); @@ -133,7 +160,7 @@ describe("parseToolCallDisplay", () => { }; const result = undefined; - const display: ToolCallDisplay = parseToolCallDisplay(input, result); + const display: ToolCallDisplay = parseToolCallDisplay("Edit", input, result); expect(display.type).toBe("edit"); if (display.type === "edit") { expect(display.filePath).toBe("/some/file.txt"); @@ -149,7 +176,7 @@ describe("parseToolCallDisplay", () => { new_string: "new content", }; - const display: ToolCallDisplay = parseToolCallDisplay(input, undefined); + const display: ToolCallDisplay = parseToolCallDisplay("Edit", input, undefined); expect(display.type).toBe("edit"); if (display.type === "edit") { expect(display.filePath).toBe("/some/file.txt"); @@ -158,3 +185,111 @@ describe("parseToolCallDisplay", () => { } }); }); + +describe("parseToolCallDisplay - apply_patch (Codex)", () => { + test("parses apply_patch into edit type with unified diff", () => { + const input = { + files: [ + { + path: "/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md", + kind: "update", + }, + ], + }; + const result = { + files: [ + { + path: "/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md", + patch: "@@ -15,3 +15,2 @@\n-This task defines the **design philosophy**\n+This task defines the **updated philosophy**", + kind: "update", + }, + ], + message: "Success. Updated the following files:\nM .tasks/578561c8.md", + success: true, + }; + + const display = parseToolCallDisplay("apply_patch", input, result); + expect(display.type).toBe("edit"); + expect(display.toolName).toBe("Edit"); + if (display.type === "edit") { + expect(display.filePath).toBe("/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md"); + expect(display.unifiedDiff).toBe("@@ -15,3 +15,2 @@\n-This task defines the **design philosophy**\n+This task defines the **updated philosophy**"); + expect(display.oldString).toBe(""); + expect(display.newString).toBe(""); + } + }); + + test("parses pending apply_patch (no result yet)", () => { + const input = { + files: [ + { + path: "/some/file.txt", + kind: "create", + }, + ], + }; + + const display = parseToolCallDisplay("apply_patch", input, undefined); + expect(display.type).toBe("edit"); + expect(display.toolName).toBe("Edit"); + if (display.type === "edit") { + expect(display.filePath).toBe("/some/file.txt"); + expect(display.unifiedDiff).toBeUndefined(); + } + }); + + test("handles apply_patch with multiple files (uses first file)", () => { + const input = { + files: [ + { path: "/first/file.txt", kind: "update" }, + { path: "/second/file.txt", kind: "create" }, + ], + }; + const result = { + files: [ + { path: "/first/file.txt", patch: "@@ -1 +1 @@\n-old\n+new", kind: "update" }, + { path: "/second/file.txt", patch: "@@ -0,0 +1 @@\n+content", kind: "create" }, + ], + success: true, + }; + + const display = parseToolCallDisplay("apply_patch", input, result); + expect(display.type).toBe("edit"); + if (display.type === "edit") { + expect(display.filePath).toBe("/first/file.txt"); + expect(display.unifiedDiff).toBe("@@ -1 +1 @@\n-old\n+new"); + } + }); +}); + +describe("parseToolCallDisplay - read_file (Codex)", () => { + test("parses Codex read_file into read type", () => { + const input = { + path: "/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md", + }; + const result = { + type: "read_file", + path: "/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md", + content: "260 - Source: `**bold**|`\n261 - Action: `Shift+ArrowLeft`", + }; + + const display = parseToolCallDisplay("read_file", input, result); + expect(display.type).toBe("read"); + expect(display.toolName).toBe("Read"); + if (display.type === "read") { + expect(display.filePath).toBe("/Users/moboudra/dev/blankpage/editor/.tasks/578561c8.md"); + expect(display.content).toBe("260 - Source: `**bold**|`\n261 - Action: `Shift+ArrowLeft`"); + } + }); + + test("Codex read_file falls through to generic when result is missing", () => { + const input = { + path: "/some/file.txt", + }; + + const display = parseToolCallDisplay("read_file", input, undefined); + // Without result, it can't match the schema so falls through to generic + expect(display.type).toBe("generic"); + expect(display.toolName).toBe("Read"); + }); +}); diff --git a/packages/app/src/utils/tool-call-parsers.ts b/packages/app/src/utils/tool-call-parsers.ts index 0eeea0678..4a1db371d 100644 --- a/packages/app/src/utils/tool-call-parsers.ts +++ b/packages/app/src/utils/tool-call-parsers.ts @@ -270,7 +270,7 @@ export function buildLineDiff(originalText: string, updatedText: string): DiffLi return diff; } -function parseUnifiedDiff(diffText?: string): DiffLine[] { +export function parseUnifiedDiff(diffText?: string): DiffLine[] { if (!diffText) { return []; } @@ -1023,7 +1023,7 @@ const EditToolCallSchema = z input: EditInputSchema, result: z.unknown(), }) - .transform((data): { type: "edit"; filePath: string; oldString: string; newString: string } => { + .transform((data): { type: "edit"; filePath: string; oldString: string; newString: string; unifiedDiff?: string } => { const filePath = data.input.file_path; const oldString = "old_string" in data.input ? (data.input as { old_string: string }).old_string @@ -1040,6 +1040,52 @@ const EditToolCallSchema = z }; }); +// Codex apply_patch input: { files: [{ path: string, kind: string }] } +const ApplyPatchInputSchema = z.object({ + files: z.array(z.object({ + path: z.string(), + kind: z.string().optional(), + })).min(1), +}).passthrough(); + +// Codex apply_patch result: { files: [{ path: string, patch: string, kind: string }], message: string, success: boolean } +const ApplyPatchResultSchema = z.object({ + files: z.array(z.object({ + path: z.string(), + patch: z.string().optional(), + kind: z.string().optional(), + })).optional(), + message: z.string().optional(), + success: z.boolean().optional(), +}).passthrough(); + +// Apply patch tool call display schema - transforms to edit type with unified diff +const ApplyPatchToolCallSchema = z + .object({ + input: ApplyPatchInputSchema, + result: z.unknown(), + }) + .transform((data): { type: "edit"; filePath: string; oldString: string; newString: string; unifiedDiff?: string } => { + const firstFile = data.input.files[0]; + const filePath = firstFile.path; + + // Try to get the patch from the result + const resultParsed = ApplyPatchResultSchema.safeParse(data.result); + let unifiedDiff: string | undefined; + if (resultParsed.success && resultParsed.data.files) { + const resultFile = resultParsed.data.files.find(f => f.path === filePath) ?? resultParsed.data.files[0]; + unifiedDiff = resultFile?.patch; + } + + return { + type: "edit", + filePath, + oldString: "", + newString: "", + unifiedDiff, + }; + }); + // Read input: { file_path: string, offset?: number, limit?: number } const ReadInputSchema = z.object({ file_path: z.string(), @@ -1054,7 +1100,7 @@ const ReadResultSchema = z.object({ content: z.string(), }).passthrough(); -// Read tool call display schema +// Read tool call display schema (Claude) const ReadToolCallSchema = z .object({ input: ReadInputSchema, @@ -1068,6 +1114,30 @@ const ReadToolCallSchema = z limit: data.input.limit, })); +// Codex read_file input: { path: string } +const CodexReadInputSchema = z.object({ + path: z.string(), +}).passthrough(); + +// Codex read_file result: { type: "read_file", path: string, content: string } +const CodexReadResultSchema = z.object({ + type: z.literal("read_file"), + path: z.string(), + content: z.string(), +}).passthrough(); + +// Codex read_file tool call display schema +const CodexReadToolCallSchema = z + .object({ + input: CodexReadInputSchema, + result: CodexReadResultSchema, + }) + .transform((data): { type: "read"; filePath: string; content: string; offset?: number; limit?: number } => ({ + type: "read", + filePath: data.input.path, + content: data.result.content, + })); + // Generic tool call display schema (fallback) const GenericToolCallSchema = z .object({ @@ -1085,12 +1155,60 @@ const GenericToolCallSchema = z }; }); -const ToolCallDisplaySchema = z.union([ShellToolCallSchema, EditToolCallSchema, ReadToolCallSchema, GenericToolCallSchema]); +// Normalizes tool names for consistent display across agents +const TOOL_NAME_MAP: Record = { + shell: "Shell", + Bash: "Shell", + read_file: "Read", + apply_patch: "Edit", +}; + +const ToolCallDisplaySchema = z + .object({ + toolName: z.string(), + input: z.unknown(), + result: z.unknown(), + }) + .transform((data) => { + const normalizedToolName = TOOL_NAME_MAP[data.toolName] ?? data.toolName; + + // Try each schema in order + const shellParsed = ShellToolCallSchema.safeParse({ input: data.input, result: data.result }); + if (shellParsed.success) { + return { ...shellParsed.data, toolName: normalizedToolName }; + } + + const editParsed = EditToolCallSchema.safeParse({ input: data.input, result: data.result }); + if (editParsed.success) { + return { ...editParsed.data, toolName: normalizedToolName }; + } + + // Codex apply_patch - try before read since it also uses files array + const applyPatchParsed = ApplyPatchToolCallSchema.safeParse({ input: data.input, result: data.result }); + if (applyPatchParsed.success) { + return { ...applyPatchParsed.data, toolName: normalizedToolName }; + } + + const readParsed = ReadToolCallSchema.safeParse({ input: data.input, result: data.result }); + if (readParsed.success) { + return { ...readParsed.data, toolName: normalizedToolName }; + } + + // Codex read_file + const codexReadParsed = CodexReadToolCallSchema.safeParse({ input: data.input, result: data.result }); + if (codexReadParsed.success) { + return { ...codexReadParsed.data, toolName: normalizedToolName }; + } + + // Fallback to generic + const genericParsed = GenericToolCallSchema.parse({ input: data.input, result: data.result }); + return { ...genericParsed, toolName: normalizedToolName }; + }); export type ToolCallDisplay = z.infer; -export function parseToolCallDisplay(input: unknown, result: unknown): ToolCallDisplay { - return ToolCallDisplaySchema.parse({ input, result }); +export function parseToolCallDisplay(toolName: string, input: unknown, result: unknown): ToolCallDisplay { + return ToolCallDisplaySchema.parse({ toolName, input, result }); } // ---- Principal Parameter Extraction ---- diff --git a/packages/desktop/package-lock.json b/packages/desktop/package-lock.json new file mode 100644 index 000000000..cbab34ec4 --- /dev/null +++ b/packages/desktop/package-lock.json @@ -0,0 +1,233 @@ +{ + "name": "desktop", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "desktop", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@tauri-apps/cli": "^2.9.6" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.9.6.tgz", + "integrity": "sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.9.6", + "@tauri-apps/cli-darwin-x64": "2.9.6", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.9.6", + "@tauri-apps/cli-linux-arm64-gnu": "2.9.6", + "@tauri-apps/cli-linux-arm64-musl": "2.9.6", + "@tauri-apps/cli-linux-riscv64-gnu": "2.9.6", + "@tauri-apps/cli-linux-x64-gnu": "2.9.6", + "@tauri-apps/cli-linux-x64-musl": "2.9.6", + "@tauri-apps/cli-win32-arm64-msvc": "2.9.6", + "@tauri-apps/cli-win32-ia32-msvc": "2.9.6", + "@tauri-apps/cli-win32-x64-msvc": "2.9.6" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.9.6.tgz", + "integrity": "sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.9.6.tgz", + "integrity": "sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.9.6.tgz", + "integrity": "sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.9.6.tgz", + "integrity": "sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.9.6.tgz", + "integrity": "sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.9.6.tgz", + "integrity": "sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.9.6.tgz", + "integrity": "sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.9.6.tgz", + "integrity": "sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.9.6.tgz", + "integrity": "sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.9.6.tgz", + "integrity": "sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.6.tgz", + "integrity": "sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/packages/desktop/package.json b/packages/desktop/package.json new file mode 100644 index 000000000..dcb4b6cab --- /dev/null +++ b/packages/desktop/package.json @@ -0,0 +1,14 @@ +{ + "name": "@paseo/desktop", + "version": "1.0.0", + "private": true, + "description": "Paseo desktop app (Tauri wrapper)", + "scripts": { + "dev": "tauri dev", + "build": "tauri build", + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.9.6" + } +} diff --git a/packages/desktop/src-tauri/.gitignore b/packages/desktop/src-tauri/.gitignore new file mode 100644 index 000000000..502406b4e --- /dev/null +++ b/packages/desktop/src-tauri/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +/gen/schemas diff --git a/packages/desktop/src-tauri/Cargo.lock b/packages/desktop/src-tauri/Cargo.lock new file mode 100644 index 000000000..9a24f402e --- /dev/null +++ b/packages/desktop/src-tauri/Cargo.lock @@ -0,0 +1,4952 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "byte-unit" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" +dependencies = [ + "rust_decimal", + "schemars 1.2.0", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.10.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.11+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.114", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.114", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.11+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" + +[[package]] +name = "flate2" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.10.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.10.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 2.13.0", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.10.0", + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "value-bag", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-javascript-core", + "objc2-security", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paseo" +version = "0.1.0" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-log", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.114", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +dependencies = [ + "bitflags 2.10.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.11+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.114", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.11+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-log" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" +dependencies = [ + "android_logger", + "byte-unit", + "fern", + "log", + "objc2", + "objc2-foundation", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "tauri-runtime" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.11+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.11+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "time" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" + +[[package]] +name = "time-macros" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.114", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zmij" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2" diff --git a/packages/desktop/src-tauri/Cargo.toml b/packages/desktop/src-tauri/Cargo.toml new file mode 100644 index 000000000..ad189adee --- /dev/null +++ b/packages/desktop/src-tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "paseo" +version = "0.1.0" +description = "Paseo Desktop" +authors = ["moboudra"] +license = "MIT" +repository = "https://github.com/moboudra/paseo" +edition = "2021" +rust-version = "1.77.2" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +name = "paseo_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[[bin]] +name = "Paseo" +path = "src/main.rs" + +[build-dependencies] +tauri-build = { version = "2.5.3", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +log = "0.4" +tauri = { version = "2.9.5", features = [] } +tauri-plugin-log = "2" diff --git a/packages/desktop/src-tauri/build.rs b/packages/desktop/src-tauri/build.rs new file mode 100644 index 000000000..795b9b7c8 --- /dev/null +++ b/packages/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/packages/desktop/src-tauri/capabilities/default.json b/packages/desktop/src-tauri/capabilities/default.json new file mode 100644 index 000000000..2dee8d1b9 --- /dev/null +++ b/packages/desktop/src-tauri/capabilities/default.json @@ -0,0 +1,13 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "enables the default permissions", + "windows": [ + "main" + ], + "permissions": [ + "core:default", + "core:window:allow-start-dragging", + "core:window:allow-toggle-maximize" + ] +} diff --git a/packages/desktop/src-tauri/icons/128x128.png b/packages/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd7a1a50a3d398df6d38b70e6dc8beaea6fae0b GIT binary patch literal 7046 zcmV;18+qi3P)!QC~1;Fj#}-%qFC zIklax?w;B1nc3Z`bLwm|(mh@G)|K~4bu*38rAN2M5;Pc~F&Yfe7!3w!j0OW#X%s@U zF^p*q&8iZk8uus$f19iQfE{qKPEEl&wdB2Cc``s#aQ$(i*QfU8Ox~Q{oB#1?D&Abfn@f6gj^MS%m~i~)&5ykKyf+{6 z=2PDM!?CV)#{d#t+VK#3cW$@Z|-V6OtWPRG)83% z(H!#DPWI*z!F%1kIkr{|AhE>{T)~?+c(ae=M>j_M$2e#K?pj0^rE1%B}6 zikQT3WgiQ-}%v z^=5x>eprr+SSW*0Skaz=AKJ%q@$!*z9zmI5qWA3C)1SOIcI;U5`|rP-zyA7bLT>HW ztt&Bu48d2txp;_XnM4C+c${fj``vRhcRk`kc!)R6G}D;1*IwJKy6UQCfdv*YGt4l9 znQXGje5n8f{Px>#=DY8{Gar8Vp?Ue`m(4TJJY!ya?KSi7zyG$mUUPGEXJ&+M0ZkSQ zFoK~WRJL6bK;i_1?}a?YzC=01>eHu>88T#u89aEfnPQ45%DT>HpM7Q?e)wT?(@i&- z#~**Zt1yD-@{c#?@#YsHW3gfe&_y0FpoUyQMJ*3n_R1Qf7RFswEG1 z&nEu4=bmf!-g|HV--vjK6()M3Rpc=PQ+5Pn%$PCeqKhsvXP$Yc89jP*8&%Vlr9e|k zpZ^4JE@HWTnGSX>48X46XP>|+{d_kLVT%)O*h@tXFmS&UG62|sRIuYdqC1gPon|=7Z%Oh0A!IN zz@m#TYF>He6@THQcCY>V0}ni4Zoc_u^YOLq~%T)i10j|IP zdb8!0Tl%|?o$O+Oop##ETyez}vDch`{`t*D8*OB^*=8Fv-+c3>W(1*yd`Yu2ZbOA zpR;wezGLfdUW14SAAGPc8FZ~A<5JQ9bdm2r@x&7y)i~5<{oR{$oAJ@YNCqe-sD|k+ zj>?n)7@Kdtxleo+I7}EAgvAHdJNDRPOGIQsY)!o;<4`exJMX;HEWiBnX8rZoHzP-m zEV-0%#Dw^~k7@xy++l|ua`Q^6RPWIZzxe zc4m@w&Ub7K0fxBeo_owf3oT^!-+zDe=bwL;cC_nS@&p*DoWl=4-2ZH!Pff_0@rNVuwk*GU?(OTcmuL40GZ~QXC8CkefO25 zfe0OCp9oDv{otjDAv+io*fgvtC$N}@{%0(+%rYgB8(vfq29W00Uw z`fD?A;6UH+m(k}k^5jzAy%e ze&K}|`f34pGS1Q$)&LWM8lH60NwGkc>7cn~)m2P^C|z*D1tUeOb|#4)FTM0qo9|?C zZ+0|9fAh^ZP5=J=eU-rfT?n8ul6e2H!w&N&|BiB58w`*F`GW|Ad1sq#HYWoxK<7yG z$RkjrC?jAJD&d@S&M5_?TudO>6)CXYcH6aqlN$_BCiFY?)KmMJK2Z#y-3~qwWguoX zAfWX8e*5j`Tl>0Kl*F-r=T%o-Wma5q#S$Ym7@*7n157;e#IaU2(Ym~?ZaawtOMkDu z_A2f6C`q7fCD|tgv4j&e7@!OZFx6C3CF*v>e^nr}Akf54zTkoj%pQB}F@ZV?yND3I zSFc_^*d(u|1G+l>P@hC%k-cVDyay6ZZFSq%n=VT7bzS?$3+VFGkL zM&XS&-dNi0af3`IGMA%3tp)=)EO3(|Rjd}!tIc?XsR<7Yv5YbbVUFpho6ekd)>$1= z6%=c+xKWin;m^oUsKrqB5o5y*H#C3z@rTclQ8s~80g=O1R#~OPc?C6*0O0#cyIY<@ zt%eZ8FTVJ~Y`^{Xv1&=L6ECo184U(-ER-z#IFJXiTI(U8hs04r!!Dyxuala#^UgcB zQDF@Rh+qIJbin%KcGb)?&s-O!-xB*+``>)?jZ+nfnU6g3NYkT7j}BuH)jgVQi+Qx6*VNyO;VsE*aB6T01%iU46*sB#net>A*tqZWeZo^ zYk`=z+;WR~Rk#{T>@xVeDu*ru_B%_aG0RpvT(o$T=t8kz}$1s zT}pSWcPUV_%!aq#ddmqCX?GE?&od%e2}(!}1GNdR1XD5VuDkA97b>jo7(hFoOkLOR z)@PPlYN@(fEd4GLRb9JV%sODe05k8r^VWR^QOy|Oop;{xZ2=`>MC~G_jn#`^&F|p% zA_Ztb5tUdf$pFzQQb{Ah>=HM7R)cYBmJ$ZQLR*(OLy)vFY=L?(1jEdE>7|z@eukQa zI0lB9l!2`J273yT%##snf>tOupBjDo{)EM(b{1X$QsDO6Z})v`*Fsja8I*nlb&B8u zGtM~U1PrQYA?+P^mf{wrl!Y^n86=kQoRqeaX8=Y*M%0KABm5GzJj>T>3Rh8jh0h#k z2hbo22KeWne^R%U%ab8gvj8se;DZnPeGS4%q9QI#3t?>run9@!64}OUt+iIE9gaPC zW|B^hKKf`sM^e%v%jfD=OLUEnUOZ$}ZJ>718f&a!R$FZ~f2U15?X-T7h=t&L#1zOJ zLY;j2>8IxV@4s)eON82GZHbEjWE8^yaSRLt+;GDUZFVs!akRqOVv8*%=zU-h)@9J3 zL1wefHuI~NQ9D|fteBu?48Wp&{`u$T)mLBj7s-ym*$gntEVKCFOVXgAlU)K+L6|3> ze6rLkF6+h*x(+Igax;1xgc(@>UU=b!OaCXf07JtN1iQqXvIXLrSzL0-CB8j${PD*- zfv66J1L%PvR#K$RWhALkl+RGmiOvPHf9Royd>wk+amShIr=LFa#t)Jxpqa{Ec6lazmowC@kljO)=@b%1$KKpauz`v zdQJt7qJXh*njCQkB%JaWI}8IT!E&XQR`OjyHHRqYA*2tPXOGoM;l8yuX0H;ra$QWR1b!1X3Pq{_MvT)=JI!}%$1JJcF9FI8Sh&HX^?GB=kJ@%OI?oqAdLdQWVsPC4b2zTuYE8kgI4)KN$IfKIsVOuvCf zmr3{oE^QVzKq29PsO`OZWhIA1*gKi@FBl-o9nxzAbr7fQ@Nd8UHWFXAlQP)ph>!#{g(G{qCb0v`(c%nY zek-;Q7(~?bhq{I0FFx*S7hBBR@MDo6eiCRwD_BMNfJ|LAgfj5(gRv=i_^?eO_mWsT zA=@~p78`(gK{?`7pCeM2W*3V1z}^r)&fc+`V!G7MQ%^nR6JJbJ*G3@ybXfe@D}ptlcUViwr71GSr?+$mn;9*FXC?HZUSP3EtF8&cq?Gqigph7D!P z%xO_;tFkBq5Zj@yph~7tPhLM@Aea+%_|rh%j*) zcslKZiZHa3AdDme)ubSOzGP$Bk!t&~-+WHC?i58B4=in3<) z+VJ7SeK*cF=7bqw=(yZDC0B3{brF|3un(IAcSsWDNo8u`fDBTH&~8#-NAH1KsQY+W zwA&a7?yU0 z0_KyR4iifE2XIk8qBIO(f+}EQ{BgTq1S69NogLMXQVfADgQ|2v<9eNlCTALCnJHb& zGjS4N#sy~ZKoCjUKDJoY13&-#^ZsHhn2TuFKt*{7n`WlES9l9nkFzfsMg`5f*c zX<<fVhHvjkpl@l1naGGQeEK zlEqJ~LdV~QcdPD&gn~(BGe!MQU5@}3FnHYWtP2UCorazioaqve>{yo`l@8_aCYx;H zCy*q;y9xw}_%6dx5{PR`1-aZQ#SU;6mA>Xe=mc|r_0?A;i$5IDu>(@LsBygpbv;y+ zm?`T_=iC^8Xq9%hOHaP{-g~L)@ksWx7c?%~XSaNH8E6v6h-fm3<7)mzZ0Z2O=v~B; zq~X4xi@*Hx%LEK-gEqLnNEBCK%m%JN2Gun^>kQ}IZ~*z%alHUlB5o2&v)Kg@fTm4J z;#${tF&zs|I2tTnF@-p&m_acp@%OkWrk-=Ft+w(dTiD{aeSg#lo`HQ}l?xsxQuyej zkLFewlA8p;N;WC8Y0@BREC4>g4V1{@PdgC#EI7s|1aQ?R+J{DPU<60X#Su$JA90MR z)^Z{~6JI~6*|hG3$^jXSJKUmfC4ik2nG{hoDVsE~u!v49XOK1d{C0Y{E2W&j?0gW$ zrI%jXcd1-9g?2CSw2q8PA{Is;25VTN*u)39BnlXpi6q8A?P2?b<0>770aVHrhprLu zDF@Qj!r?vO6_9Bw-55>}w=-@ODn^u(lBRrtD3L0Q9|ZHV%Pxzx_(d$5T_BmlqFy?m z|6_0HTx1vVW%FP^aDUb?551o&1L)y-h@|@eN;-kb2;&;0N6$6aT>kNJ&p!LC5BrMf zGT_kl5RzRFC`1Zb67gX!xrZ(zR>T5GBEvasq}hQQ{Ct8yNyOK4L41r;SA$AZ&&8o4 z?hilwkO*!-yh?#4!M%udz#=9LMF^M*TL_8!1OrGPYk{K{ReBrmg(KrsjT~q3n;_bW zF>51zHiO-E+iiZ(D318y>v2*_wGOS!jR6Q(vLgxDxa#K6<(0Nk5h3j(T__G^MiDoz z=t5ovhAZjn;1_WxnQGvkJ@?#mZHT3RlY@Ytk93GLAnhCpBoyDN=82`bsQ^{&#x;N- z`2nc5J%u4+1TmRX#_hE6xRh}*51%8+1PD3K-4nQk{Q-z%Tl^v%p<=p-ltcV&x82sa zQL24hZ85JzPzJ`9D;a}@1S_COB&#e}?eesRBQ`1r%u04~lDo&V5qQG>P$*Z$C%g|{ zz=2dG!K5WVZXr-_n$F}MsznU0QPNQUTeUla+Nc~2C@{Q|h|hZjugGx>qjkJbf+?x# zLJVEkvLWihg9n>yuDPaWXA~FnYyg2VrCsAv1GrC!-7MBwwU3L76xxO*#v%8whP7XH24I0W_=$!ME;S(WNv?mj`T^R+N9+PGCqc3b@X-2A zsGlvuN#?*NklJynGr6$*C870>JMO6Y5%swzg(BWuB3_b#gbs2C@;-LOCO!rnMWRW> z7chgZA`C&hm}@~ul0Jmp$AyXcE`=-vfiO60P5fLLK*kkfku+}?qNUepfnt|Qn;dEs zbT2A|(YMw=62U^~->Mt!Wvc5PWz>T=g{P&?k8WqtetUB4lZrCW&B(Z_ec-LxwD#q=CNY>>g&Az;X9M^3cAfTq8{(=&0=98g)8X zVJJQ9`dPF~tpdaZ9Pmd0+)UO*+jaI1J43~t3c^G&fp!)Xb%5m#W==wf(#^E*<|5?HB)ZU>`e3)JwytLA`K!|}ueI=7Tl9&VS2|IeHIS5hJ# zCo(Br~zp+kwB_2QnjbBI>Z?QDydrd$ai z(Xn-VJb@^YsZL?QtM(xaE~XLV$lc=qbkTtDwjyrV#C3I}!11_x`_u z{&%{Ag%k`hXZeuiV#$fAY#Fwh3 zg~(zq-Jb>sY7IokpWeLH(k+>wg!1u+4IAdi&Z!VqmT%g0Z>f$rV=}BpxCc-$J70Nx zorw50cz0b2DW4h%yd>)sGVMkPfCwfT1D6k-98ULcFB)mv1N7%npZ=`t?CM}>)8hVJ zn`YBCrMMuUA<=GrZ}tz2iDK3#b;A%;1CznaYXCSHb+QYT+aCoSh2dHIkO)D_7itN!3XMPLb&fah4w#{(k|t46pwN8Yd?#canmo=DGC^q>WmaSixsH#s!626> zLFA2Cgu0T~D)Xj_x}P(7=MMfBl41dcGO~wRwV~eR=uDJmcau{^QCKwN`-2-0lcy~k zT|T2q&tL{(_Egmnqyf&QUZ4(unQ9EtWVb+NJ6*p@7{K23BP~_XEzi<25iDF@P5wWy zD^fzRGI#(r0z@6vW;O0Qos{_a)@xc)+hoN6#_BWIH(-LM_M(I3fJX|vq}joC-~CR! z<89OrT8s|tw9$DnfC;#4Yyc167D$EGYPOxXeg3G{Gc|@_Yejs<(%yU_t>{nd1wWHq4K*?0F4sEAy)FcQe+l4S+MbTE-fPYx zYc$IY)F#Ucoh3MLU{D~gGEY12B%=^R2SU2T%=p00sF3ZI+0FAvMkt1UBs=LP|~_~_PHf(8RL kMuPzwqrm`;(Iv>j(R*#H0l07*qoM6N<$f(LLuLI3~& literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/128x128@2x.png b/packages/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0404f4091d8b1b9a327623227073200ae89329 GIT binary patch literal 14779 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 b7rp1-29N8?#OLbh00000NkvXXu0mjfs9qnx literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/64x64.png b/packages/desktop/src-tauri/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e23ce418f37cf383d52ca3fbdc51e9cca3a25c GIT binary patch literal 3381 zcmV-54a)L~P)>pnZx|I&h}1 zDMm#=4Y;5Jij+uSQBi3sMWZmx?ERd%-|KnT`|9w3T~G4M%)9mc`uF!c=N6ei`6#Nu zy)mCohEe8IUQFaN68=3UC$T~i#L;6dfVls+)H(JSk7{{Te1e(&&7(aYeIHU(S!lj_ zyFihn@xOU=yGPe})X<|UCyC|{dGsHTmUuMXqty{}&)EWEzUDEf<{pjmsB;ScJCP%b zhXo!D_GnusA;dBSI811eM-v?vDD?$%G6q4-O^W-6ZxM-9aUqc=*zvF@JbKPQR^lH| z%X~Z@H;F{T{uRYyvEyL{F=uW^e9iat=%7c-{oke8Sb$7Mnm_71Jav@x89jP5bpS>% zx~8nG;GR?J1n|Bd&5Uw~ScK-~^Xr`lrDYz*#CYSzjZORZ?ajI8o@**qs$}-=-D|%1 z;tTWHXP=o}yLSC9<)R`}Qc`j}guvVnd-PY2cKE+bQwcyP7y1FOBvYmk^R;T#GB3UK zlIhi}m$ioQIC$`&S+;DMnKEUHdHwa*O=)SVwFa(DXEn!Q;0~2Mn(fiw!|@;%p?y-_ zid;00wmU75nz>Gu5kCH&v@v zwdV+a3W8^!eYP1maG^1Ll?MA9>^v%RIu7MeN_d-^`jd%UpHU zRpy2pZZI1+ZVb+04Ol?8Zr#k9HET@Wx^)9#7GPBOsD{g5*y)P1fwy9|d-v|;zT>$9 z%xvAd)y$bQr@TV>?KjH^401gTAviSMtXVVj?6c1X0g~eg;k@(Cv+1%yg9e2XLLywe z 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 A$p8QV literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/Square142x142Logo.png b/packages/desktop/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1d3a54528be57b7e8fa1656fe383743f1883b8 GIT binary patch literal 7789 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/Square150x150Logo.png b/packages/desktop/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8391af43d6cdecff1c8962cbde474ef11e9a355f GIT binary patch literal 8309 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/Square284x284Logo.png b/packages/desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6273e28cea0965a6d4bd538f9376395658b35a27 GIT binary patch literal 16590 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

S@*gQhR)zz zpSq+;{hE{(EAKWYz{;?87JTm}kIo#7!DG$2Q|PdiuP}$caeh;sq1C7PiHjSi5?v&k zMO%7Wm;tV+2X3+58)Ux(vY3=tjqC}swNw8v_a;x>qO`K@L^XRbP8uVRCl8T|%LWviZ`M1L)2kt?fs0N0M^(k<#7SEAlXD!1AA!Q(Y_aM0iqYHH-k)Ug})9>tNi8 z10wqJHCazqO-zT=zp#w4EovpdXqoCBdRt6s95`$TES!E%JLG1ZrDsDuXBtC3;Ii#V z;P~y#;O{SF*C##BjNE{aXBEDeNhC*IL2E}m5FsKJwS4-Ft199zLv%$HLhcC$A_OvB zQ*;&q!cu)!$LYBP7~Y!MC&JRNQ$nxjv-(#tJX^F}0UTXyyz(e!Xe5H#s?Xy^<3#-g z7Zj8U$c_ZRz=%Rx8oWQftOD4r*6ON+TUbpp1EFGgIz1orkIQV#^c$0gL>B%wXGpj> z4As(@oK9y36BMz;dO}A8GT$#d)lmj5u_gbzzU6Mq|PDIEbn3NnyNvT**~W+rG}Yz8q-`dy1nkT~#t zlrrwVXW)qlGP{30nqvy@!gN1qWSs3xyX+3=hV1~fnTB+xEhK4t-vN5)t#068L(~d8u^z_1ny_ViD8h2+l6;s(vRtyMfRM58>#YTFTJdQ8a3Swg^%aA zZ==?I6!Iv-A^>vuANNTAuAI662klhGn2gh>zq1@~$3zow{mOCvMTbqiw*m{-fNxs+ zUrkfZ3{tTnJL?{ce%u; zEsGupM@vskr0CmZ+5L3Na_DXg)r8?4;%JbqC-G$0XN!azzdQhgkg0<}0D53Rp+ybr z@WurDIAaQY5wJ)@Sx?Q4+aADBLPN|q<mfKxXec@q#HX zt>G&wE0pi6H^={S%aV{1y5De_j*+E6G~ABte%-vvG)x0mbV5oac@)A496Ao3krg@f~=1%MclH=*0Iu{HKMYb0z?rm+EgLb_fWHf+t3%dXWNvd)houz3(Rj#e;&)PVCkZqtET(4*e zb7gqZa$(sBZ}8R`{6*K}me2&WtMP_-*X6YT9}Z!kiB6zY+96|y+Xq?U8+dNzZ@j}a zBWC`-9SO(b=!}hn41=II0L);a4=n$8J7CwErILa#pII5>8*0oDuWX#+8{Y&N(rkm~ zt#djK-%++pW|~Rh-l*e7A-u42n zBi?qZMw#SLKofVw2wU%opXI}GQCz#4k|3A0<-uGg>A%7|Md6i=>3|Eh{rx=Uf#k^k zEmm%R6~IkDVe_l9wMP%mf!6om>87^;NJV>BeBT%hi~2Jw^M(w}ROsz`Kvq~C2}55W zg~Cu1xHdJOHYmjfEdxI;9cy2J2LF`TpkjgTtD(vDq{vJgI8#k)oRuP6Z8e0V!L;SsZ5ReY|GVjvw$gx~ekYFhBI$(s&1249WB#H<1a32*xVJ$l4RWo{oh zcXP+zk5|E?#1xSw@Bx8J02)n^BK&ue*}OR0re05+VK{o(W~rcIFq%SG?|yh1iMG5` zs-rW2y&4*&03UReM1Rl61B;R>eOC^4ucnUGCrBdP@bMjzE!TO4%RX4rs%us@5u_ne zHE7P>@~Cie;YEhpPK=n5=dH(Xi@|yq73gO5G|T}Th$a{mqGNG}yMMRxRzw&m$_!C4 zROXC|w!_Tvh`k8>O5lxZF9D1fQy5ewZU$7-PeNPZGn^az;%0-in;xFADl^X9QI(U6 z&Y=l54e)l{A(sX6U=dsbDTGa+fUR*f1pyAB0wzXtTTxkKEud)10*h>VAJyyrwgTk7qw)4T0iQ6aMZ`$$NB+!{V1D3!ue+F58qZ#{d++( ze?=rmK5%%131ia=F#KL~fCnDdNTXDK0Gq-K9cueDNXW&XWR^39ZSW}@3}wvPak6;R z?Sf;HGwE!-rPd(RXqfBRXMZf^#)}R9RnapWKw>Pvg3Az=nwNCOH-Wx-xHIT&IbSN* zPj9YhR*i)sTn0dR!TF=&^Nik50@7cUVJO6>|4@8h7)?f?NEX!FP7%;~wqJ)l{|rat z?@=peuk7G6%E@dc&hqavlfB)lHsJjb$ge-cIQ~xIbHFNwUr(*{?Sld5J;) zK;cMRWgv$f?OGJPxHy911;auWxDF)bw$-i`DmqO?Z0)dX*<5-*mKLtCq;y+G3oaT> zu+2`y`!%z;v$~^zjwqB}MSk*;YaNLBY}5@91z*v0l3_*@%cox_QZY(D^l|OuYq+Dj zdETr8ADVZN(He%IvajinDJ%xgJ|9or722lB*?7+==$oZz@OAo+BD?(oh3hIFSF3oq z-p@*Fc@E)qnLa=fQDV1mJ6!^ckyap9_AuZ&m{eUq4i;qJg7bSBpn7K(u7c#~<>B3{ z{q*Ogf1ji|yO9+`g9|#$kP^qY@1A#11CB|&kI6lTu(dqvcD$e7k{M?#N~SBlPwud0 ztRzsXaYJ$Z*0 z=Wz8x$a%Y9=^c|#M%3S&Z!wONP^hCy=?e6)8{ijo#~23MS}3KWuOGQ94Fw6aV#VCb9AwvI746hWr0vT~nF{RJ*xY%9E{QPdJ^6Cjv=qC_O9C!2nMR!1yk z?%z+P=@EYyi3bLgYlaJxC&J)|J$@ndnaLL=*#;x@%Wd9OPcGl}`+MOK;8I!J?R{xz z5x8f)dD`7s7Wv zob6eQ+v@>Ti$etoBFL>M=61_)pQ$tF-`Dh(m!FcLM>OMh1wvhQmjMWOoT_aMA7B^5 z?$-}yL2$|U!rNLa$jZW<^^Lnu-f$gKBukY50HbEu zWZ!#-%oe~7b(#Kx9LmBt+a+n|!#LE1e8V1!3p6cqZ71B89~lahupP8XgQdDQ;z+pd z+Wv;G@k+*DKNw~{M z#{$W*bO3e3aR6C}AB&-?0{1E8fw*-i;BAl8FVn4gQS)r3XFekLhundY$qjE5V?zWc z{y(X%-QfLH3;VKKCX0Y2>TJy*d6J%#+uAmE(f77R=Hbi0B&GW6AwL+!ng6^_d>~4=jc-x{_D2Guo_U5@=eN9HEHlFW!2*}9dxfTH_u27I zoV`v%LbWgZsvjz&cm%`X8=BD9R|;;}|IL%1xuMfo*xlV7P= z7yNb^?5I5F)T=5tB_d<-NcI8vm)4f4C*08sfw-~|Rw$4ic?X^aco0Qs7w_4&)53o{ z1IUI_^4q@oL{pGqPpd*!35oL0_r)NGY)}$FNyiWzECEWi*pe5keF<$~k;Umn%kMwN zAlF7jc`n_-oPA^{c{Ug%qU|JU{3FAe??v);?A5&Q(7os0jebMzA2 zsEqmIvzC1t`u1%HZ%`3^!LUB86^c=ZJASlKk`!(&o9-?EI`=mU$=ly?^aT6$ zfbt27n}{spy64ZD4K{|q&N6BbCPPUrNK10R>4lTfL455RkS41w`&+-o=U!8R#dgBB zZ5$J*Eet~nc;6rYntr(Y{W~enG!gAO)lyxbOX4=4Y-NXdMuT~7lu)E?i_VwW(33L| zIT3#zBFj2I@?HM3T-5Rvmbx~Y<}6N-IwqUkRcc7gQVPAB;IL2+Ciu6lQUuFhY9Rh?HsC7B35@>h!EI=r3kR)%RW(|?pT6bP zH7o^EmaCK+BiO1duVKa|K*10QfChZu&w)0gqs?5_e7=QDN^zG1Vmlz0RFoYQz>yZK zmcxma=pB$sXEpjp2xy;qiuj1GO<&S;CYzTUIY5L+adHj$%@9OpMe*E2MO0N67lN7t zW~l>md5|Pp6VU()W!bne__$3|5eCCX5c+u9>mJahv16=(|Bkd_`|$gIX>r*~jyj61 zN$|5@nbvp+?yzZu_fG*h-5G0YY~4zUK>C`DFj?+MMq{NusmFx#H5fwM_|F21jS2)p zrQN_ri+X^wO~89#a?(X_Tfmb~sd2Qq|qKMZ_$SCvP%Ik6bYgb|7^l1Hzi|7KaPw{;V&J}QL~HkI>IbfzavKZ9AHF&O3W!wzUcTv}^8Iw7nkv^PwU%{{2}^~`C;R2!6a0TRar<{LLG>M`ZX3s zfa}tN6@+K`)57e1U;l-`J4!Z_q!|Y*03|qj(^*S?kMqOt<=-}DQ->ZWbHuxx*PNy# zS>$5e7MskbSZDpFXLt4 z*5xf}AekqSfq_%M>x2n{Xx7~rxWsx;nC3_t!AC?Ii6uT0ub|K(Y)Ms7j|vY)LMQ^6 zw60~Y4r;aa7EqOS!b+tKUOV?A%l}>muxi$K5ft#SlLUxgcsXMa*N*+SFr6Wt19Y1# z=3WIxNhSHJx!joK=}lEe5b*)CJ!@YHfy*xxHV1RhyR5F(Xl7nEBnP-_lUKHym@ux-c0aYw5&nu`Wy11B=4*L`__EEK=y;DxDwl@Bct<2K;^ZI}@J> zr+^~f^~jWNHsUl@5Yv6(xC&O5XcqyMpgjqCIn%eiK}@+BWusu`w4~|;ZELJZ5iQ;N1Ex?eT1TWAx>lJY|Pw;_iMiUi~BI; zEBF-=v_0Zs6yo~~WpRnPPhH_6Ulo7t^OE^)6sg^(zg{pz1?F=2dpGytc zz-i8D!+T2%na{>_SZbnemw{vpCSWl?V>U?I8e(&`kJ=%6T3j>Mui<$9i6<)Aq|lVA zc*zKQIwE7N;Psx@AeaU;@!1BwVsAQJE$ze+Pjso4Uh+Y_&0TBtF($qIBt;wQIedA%BHbjMe;*^X5MU^QAp(ae;x_I| zl`1(@*~_1RUPUh%Gl6$s+!eaJ_9#J2*08h%q=1P~N9-96;Ye9yY$0>>xj7rvO38IG zTL<}R_=bW&$ED;ha79zfO`@n4W!@Am@j{Z)e+HuupOKXxx25HbXgNlsKdY_Ym#SenQP-yHZEOHTwsOjE-Qj>Um}BC%EEpk_TXZ ze*csCqoa)=CbC2#2gM^NUJ{Zxlw#DDon%N-G2pJ7E*^7-po30LAIXlm_@?pN+(-cj zU%ElHzKD zIF@LMwgQ0ANmp6#@(Pj654(YL)(0~)XhIo_Qpv%?j0$koy$nJwX#LZ8`a@VH?)+2| zC{%3JYh6ajjX%{T_hFWR+g@J(Xt_9aUL9um%9BW?){S`e) zI{j^x$gxDElX#(~84bl%NEPb5f{-5rPY?kTZ6JP(nFXdLVPBw60=9)_SEi{q26WwFpec>E4G-~_& zWAq)=ynCOo0{#+SG}CTZ;93;s(&}2@tN#c)*iobBM%`BVo3chWDn=k`Xw?5d?4}jzTM}+JRDSLBxoeEL)POe$RyA)0sVx00!@P~9C z?ia8yI`8M?KFIeMd;qzDzE^ECe|3FwOq?lSC78}o1g}4sG)Y{U0rqZ=rR#pqQWZak z?vZT>jBai#b|3k>lMb&k!33nO7&)g55JL;-cBOK%0+*hLG;S@po8X9J5aZL?LQ#m0 zZYmMOiOH=KRokZQW7-O^klRV@PRlzm(t5aN33!&PEidBBV!UhYkPVP`wAx3 z{{Y0_?wxTezMh=iq2U!Ll`R$$Lkw`Oh7&>Z( z{=%jmLqH-m%Km|K6-_Y;r2NVYVc=SoCq^Y8=GOnow=CZ%88kQb(Fkol6>36pz$WLX zilDa-(hUCCAuj66DiN}kAMNT$N8=?RuBbCSmVa-m%2u!v%*MNbdjS#L0D^f9t-jiX znu=k5D`{-C-;G0AtnzuBBuY_Pt^gjB*U z=XT@1BRwK_WeC(X6Oi4g-`IN-zTj^!w9Vo5bJz@&fWfkWgVTbQMF=vkjp`C!Y3)E} zg}_K^YF)9s`Bw{cDsFOc<0w>kHGv&BhN&;VUFC*-dcp5x3C!Y->g<)Om8&n}TWb83 z$wwJ;2FV+O=$j7$7t6vIOf9V34bPws4S+~FEqTT856~yCp_Y9+Uq zF4P;E5X7n~j=E9}srB(Zm3tv2F6{3#a zHUe8PuJ&<4$-kpuWrQYjqrHQ8B5~vuO@kP6`xQ}Y)N07^859IWceLkftpn#w#f1Gq zfr7*&o-0P-8i&IpB*ePN+`24+CikUW94pBc&EO_aU!&zyNNioL37p!E1bf3Khe{Db z2Thbl)w!BZO}sHuLo(T$VzM3k;fYU;ZXpPBznqqi7IX2hB*Qq~lc|If#)?m#9@qkq zvgBed2ASJYpCB5yBT}0L?m?o-Tc)?GBTK7*M9>*+0_oGj^r2HaoGn=);7>h-&DC)C zo`BEFS+KrK*L!B~41~Yd(f_g1BA3!Wi~nPuekKR{u}bt3JKpu<9g?kXc{4Wl#)Bc^wVyowL?@h2Kw<__4U$VQpU? z&W`%fG7vsU6val1=CW)gd0=D9TPBNOcw?T-=U8RRLAd4C?jQ$042n3o4j0D8-*lbH4L0anZ00&$rcbZ0w=2t_~!tqbS^4Xnty`Lb`;5w z$~0v zzA-OLU};6Md=o zw_RfC&Q;89u3`I;z%>>PA+5w0POEtktXt&yZPW(5pP>*xna_Xj<@ko}f!9nQY2XP_ zX6`#_X@us-P^@CIF!Mu#v<*SElJh(FfE9J!f6lK(QkrY9jOM*9;EJtL+8Ma@6&d{V z)Ssh4=c$p_%KH!S^(wN-u$sn#glMD^0lXmbxp%=uf$WM3ler`y;1mOagizx7LkZ~5 zrN_0ZeMA_g@z-9#$olZ%P=@nK{X)dl#f9Kmotbvf+@AUi4`AH4y_u2%<6;%eo#;-8 z_Y;G^G|O?rQA|n+EdA9o7$U~R3Ve`g64Od!`pJ0-N4Ih#E#YU|+|W+>*vE zhP)&(kG*bf&3x5hASFvUgh*tMvDasUE;&nVS;FK`opVxR^SIO0EGiXfw#rb&ThwO@ z-_nE8++w_A@o!k{FcnpGw9L7rnqTUOY)EN)aN5219==wtb64=@6&SqAOlou zN-w@OnM7!_>?l(W6Bjk|71o2hWHrU_g=dxV?m*H`2uWS4zHIZDnJgT?T)c&cW5|uP zYIs;7a!0wzTtWzZs+hv%vp}H0K3gN6Q2}nwgzKkDgf{eI#sy}wK9{j?hXsMS-zM2c zhyYFWvNdu9ZSQX8eaT`&jSO*Y2QcsZEjo{fcCS+Z)T{(VqN%nuZ97bxPUYk4mZ0D7yOce4(%&~U%_qzpe2o#bj`>|845ZOJe zp=a7|^fV4{ZcQ$0URXq)Y#~bTHgzhkrg@biYh9jI+>q+~N1(3(L6Q4+%lf|3%;>P| zLx#N2HB~VsdZHrA>w{NR;WtMQfS6`BNzhohBe2V`ZYV4D!n0V8m_D%3Z;$S6?~C24 zWPYmWP7jOAD?e(EC|ahE+GuS%V>t}@)pb_Vh0uyH%pyc(BfJy%Z{U`L#3CfH zIkv^$v3mXj>VZp~@JDM0P|pl5t4txz^JgW6pFW~p1)hq%!DIcOL1Sw)?=E>1)3v*z z5(IZZQrs1gC%!U6oEW9TGHr^Zd>+heH?nZ4)^*R>e-mo2n?=ZUTLQUcvEzT61k#j( z!pT~Ai+Tsb_$U4~1?`U0Vn6J?c(bU^Ua)+rmpiVnu$Re(0&N>^_C|b|X{N*VGEghr zXBR@_P4z!7=g;#@bGDz_fT{bFO1g)rcm>CZpg6bc8)BA@KQj)_E5}ql-*pDOcLYtk z!ke5oSDd@*@e*PGolL2+i%Ks!tuVSiDa-q#3p3>7buSTGBN$+wj8N{UH|7~qK- zb-R9qotOBf!+ zOjXjU5WosJN3)Bpvw*})=RM80L%6PaWj@;#*1uQeaS2)nE^yq@b3ySxZQ~eB!Xjt! ziyF*-0P#iU-5JyOpT`*$H6pOpn4CUb_cfaH`1=nb1?rZZ;SjvOC1En3p5lAJsQM3q zwtn|F#G!&~j9(%oqU2X5cnA!4Ni%lRgQZ9TR{y}Wf5W8%6iOMxjHnW>VtB!0GgQv$ zFI|mE_p}Xc4@w8>D;U*H!d4nn(VJ2E*`0#ahcE#;B{D zDRd}13_L!a{RZ*NMxp6<0X*M6MMLvOhi6hZfnez&KSO+g2A?Bo-8Rzkbjq{~n;|y!zF3BzGm9ONG0NZsTH_&$g7;4e@0)7`TxqA^Z^zC1|H0`?Sc~!wo3)||p^o-(b zbA=5}CIRzTuIfKfFZs0AMLZSlFeTAA<|qHf7=T!n=G-~;?-{Jsa`-VFdQjfbsN&GV zKzS(iYtfc#D#ZX z*)d}#u0qzj(GH5c%A4!u)#tr6eHETBh)Fc0#Z?(}WUwVUSR)JNSvAEpu(NAS*KKqUgJcc(vSh`^ zH(&$Jd+Yp>1Tl#^es~bF7299+9h1h}OqdWPZS+BVULCfvbl<-20&v3>n44X_1fOM#3M{#nn#-0;lf6>g`Y}S)-ZCiKh}~EE z5WVI%iM?@8gMJYPim@=r?@@vc-^)q8;)w2VR-v`?^e8RqdwKDAjR(p8gt$4dA^bu^ zLw#+C$XFK$OBzxi&-rP;0>we>ibnnJtUS3?(_-`RpTI_XB=k}Y1#?qUljfY>a zB>cWm)&NdGUjWMUz5RY>YpZa~mXQHnEsgcelvm~C<;+tvOsThjGK2Kftf5;L{-E?{ zd}DcT`!@U3(A?Rgk9-tprz^|Sdq@(B$l5tqX6f7H<%zrlyST^Lo?}QfFwV-O04v1B z^Y!2h#xkN~|BUs4so*gm`@XrkdGmv9uH4e&+>SdJWcE*jvfnSol;XePGWqo~D&i+6 zbnAUeR)P(R?WF(Kxb>KPC3gO>I~j%dt`19UMp&Jgz^>hrdiC2g6^#F;q%fai=Z0n3 zJe&{?Y(_Fl|TWKwc(UE;X=Y4yqx3=MBCu^7i^DP79Ke=$;CZ6c# z@7=0YVZra+^{c#oGSSTifv@z|)EvhEiMZ}F1&C((Yf(ir8QTHOiLG;+SL!+!hl@(F z*ug3hscF&a&z?1eIUHfGYIwZuwIjR^_K3QyjJB83ZoOZt*~I6K?IeeG(BIigx|~cR zdu>V$ImXzv&CP3gB>fDESASG~W39MM5dYezeZSO{5M5Y|oWxaRRyQ%x-W5(=W*AIz zqf?_;?x3ZNQr1Yw&DABURa&svc!In@1qaN@PKp0Wb-fZ%sEWVL5t5V}Y{Ee+!443* zShI1JDp_8&4r#~$rM-sMTy^RBI4m4J$ouh#0ZH9aLj_s2!_nlL#H!C~R4u2b9Ef>q zk8rQsd34Y>Eo2;AC8H+fx}x*mOeYFmLZILzH^oJ5Beeu}o5SmqBK2|y2{bY6On*xo zG|pwLh_7?a5jGA{mI|U46{a>oE#V{v%>Q`1xTFF ziKE(oWFnih($gFZu7zoYLnR_+XM6!xVwW8wI|FYya_R?Xq{M~!pE%}g1VaEoaN7F{* zkL(f)NUp3mxaQWlMsLE8dmY!DtLafKkUU0kxY>n$y0}YeG5jdG0lPi*oyq}O=eEps z7kx6VDpc1e?WOnr%B93+sVS{8?gG7$MDs(nzb~*3RW&du3jb>Dq4W8UfBt%=EV(VS zJ3}lywSr#$Y?8f_2YLnrY+}KDHDuCyvDisY1JlZl$liP@NpNw|g{wIukB(A$a$-W4 qDSSQyc>Ets^#flEz?Jzfyr|~&$E2(#9{8RDurHE|5;bCm-~I=;d4SP&{&Nwooh%aiAsfaRSXi?tvcxHWndu{eP9xo&P@U!+_Ywh*@_w{chZ6zap zSu&_>(NCJ}fST3kuLU0ytn3pIKr@0T?3`_ND5TmH{Jr1`!QZHJWHcH{Q9f_ASS+-; zxyj=m2td7pe-`{whoPC(s80MOxL&X~gc4){Ab=!GK$FSD?|U%w3Bf-Io)`SLie*uB zCV-~DsU|WDK$8SXPfw?qm>61FS)snZKI-V`;AcMBVAxH74V_EB6Z|_c71i88_(yQ0 z+z3qp{NTX@%FfQVI%#TZimIxr=+>=Un)VwT8+!r&Q}DNtSJ4I1sNSb$vzgAHKTl7e zKBaf>-qE#d*LXf7BZHEXlK7+U?ryqx@ghx6Pwxh9Q59Sh><8Hm>cTO5A)lL@%j5Oy z*QvI)mhRlSL&?d>6dxZ?LqkIp8yial0|OKi62hPW--e`B9Rzzy=UYWLObl%g9Xdqe z;o&^@?AbFO9UL53>(0(j3JncqYaBg#l)AdQ$j{G@!Lh#A2v;wwZn%GYn9FxTt>oIg7aj2$*P3F zNl8hezkknGfzS}b(b18!A}uY=0$`yK z?tuO+rk1`bFE6(Oee&c96%-WE=;$ctZ)0Pl7KCyHAj}KU`}gltWMm|-AuW-f*aLTL z@v-!qudgqamX^}e(h}XhdzaTvpFT~uZ{MaLZ3W& zlHVch^71mr23%qn7=*G2LT={g=TlEl4+R7S(BsFCxrm^If}EY5wQmax3wazK9%jF~ zxVW&Opt`y`t2Em-ox;Mxc*HFvOXtGE0v8MfNmNu6&CJYjG=t!l#Kc6l5K1bjrKN>~ z^2Li6R9|1u+Uje$!8VmZPEJldqH2Kz6NIX19ROojbGQz3l>gr0LK7HbO5vla>;X{7L)rlGo zj*E+<+1Xi2NJyah`FXoHmtBpa87LS`(}Dbd;=07E!^ zGhx#Rtg4N`w4&?$dIU$I%!-dp_y|5m>jSgdQgLxH-MDeXDrlsu?DS!>_30EGFIykk z>?I zJN&|&kd4_sNKxZv7J;@?TVQCA5|9R^1remXOX-sC?jaqzrMu4l&;7YMJP&ih z?9Hxkul3gYs;RDkiAIJ70)a4<6lJwRAh5uHzbHt+Uyj=Ulz~7B97?iMy1vUNrl{?D zTMwT#n60HtzsqWAe`K{)Y+;c3&iehJ^=Ao6>Pp8;vE!e7m0`CCjBhM9<*|85Gr6jm z#VXZ_#r~!TPm7l)*G_+zPIT<<{xmEaJq8AKp8BYlc;1-#V@}>;O+L0a$f>ERaoFk` zYlNhyr^96cAOF|q|L;pMbUd<{$6g@nUgmk9f#le6_By|%cX^QYj92-Jc(iBn zOj3E;TN4v{eQNPcP-%YoTHPW- z??rd+$<5C2rt?FLJfcx-iR^bidC!LO3%s9roS(LkP|ysoc5?Z3`VmIXmnIW zr{2a{5x0UM8VE-&!`pk>d)+C82vf%t(DUv?>Pm4>G2Y$fxw&Z4ZI6!n>F!qk_c}8O zZj4FUwfHS{;O;}39sHMuIbIzdWBBdQ5QFv+6Jt(O52q9Vh8>RN0HoD z^`3}DpI*z$^iW|i3=GVLhNO+*ol!$(rdSm+9NtuY!H;>bq?MGF(I3hpGa(SYUGHkN zoUHinLw3^aRX+B2O-AAZul*s}-49VViuG4Bb22(Qo=4qkiK^g#*61Ju=7{$6?^BnH zwQ;B^nRe2e#ZJlX6=iZN_^g;Kb@7-Bs_fBhvzof)V`^b* zRF%k;_+`1p#YBPKSb?P+q5OJ0reYPFsvcY^cSNXD9NcX0gX)DG(p7YH*pEF8MX#3i z5ssWkrPy>VlD&vf1+W(?l9bFKi^1tePct&eO7b&~nR4M=Iu;daAJMf27sKW`KL#z% zPJsCvpgTKYx2(|l_dJKRzu=mhLF8+z4|$Qgj_7m1&t{qAvm>;pIm?FSy{)^uv@)Ya zZlm9R8Ea`-8Doi~rJiCxgrstBOIwpAPHF6qS(=Vx32@#&go2GJ8?BsKe!4`=NJkYG zAxh9booPfwz#;PUH`qiL`Th`9kw0=)&U;irM|G0DUXg+O$M)ZMeUq>gPSWa?!3cz= zBsc@fZY^@6&%S!~dO9kNTCrATHZ#hXmn_C5L{R0b^+{I!)Q}6{G#U7xi)OR6}j{TAd|FwvAkKvUx_ zTRUKX_tUNdz1#l!aQ?&2-&&>JgJ#Kw#4rJBwcBP^T7WeB^&Y;jz@ z^NPMvlMBaqhG43E9NF-0hAXGn(LxHQ;3_wH(&j11iQS<3yY1+Y;Uq>Co9TSHi+*DB zp{M)Hoq`03Bn^rCz9({+0U@`ZPICI*N+j|TwiXedG94$$Dl2K(Mn1L_s(pq2bMYcF zjp)^sOp$Su%kLGJHl;8m%*>9zuP?Xn?k`5UY!@mGc^qaKev0}1zJDpn`E0b6MzB36 z=IatQ?0Vm5J_~Xx($`pOyU6f0{R)>p^dZBUX^_glGBe;}`1hp5qvFYO=SBx5=PnTn z+wWDeOjEa^hMGSQ%Iki6l%#?#ne8{rj=wFsLp`!7dQC75<_mWT5{0{$$7kHxRYYpf zWnxoReWa%KrAR$`8lhI`!l&(*+m&?_NzRQ+yMlkkL1Jwe2O}QnnBH1&H#x6QgTC$> z;@98X&w9{*yKVFwzk;3SV{|-mlFY~|L$nlQQf0TREYr?s`!OIO4m2DF{~l3sMb(7w{iW`(a*%{ zpw}0}U=T^)Pwr6)Y6lvzUHvMf;jhfu_H0ck2741(8Hg@VouL`aBAG0{_T=;{xRr|@ zkphf8)&)(G|3Xuv*eg-gT-#0rNF@S%iC|7# zdTMGHI`94@VL03}o3}J-Pu}w@;+^QKb`2nt>rD#&4Vc}Ym&}gX`?1}~)TTW;<#|-q z^n*TLNIG8RkVVHLP29inzGZDKxA;dGy6)(U*!$CaNCVq>Y4nORPoPypOhnVbl=D`c z;E%8P%*t)vC%=c9&&rtB3ELI4LAT*~@BRMmK1bjTcU? z_`#^2Km}!_9iJ^nvATqE?gC8Fg-PQBwTv3BcbMId7yXy`>H5%CX;8pGy=uQh0E()V z=U;1I+i4S7M<9oyeBnHqExz;9E_;}1DMpVC1*CxU2)wr2(d^ZUmc5YU=B4>7JP(08JlFS&(jUSU>yewZ9+{)%hKjMYx4piu zm6ZcolO?-rj$zkd{8^L<*6E${*vKHrR7SoGy0e)W}OTp8z>IP-%j3~ zA$|ZMyfHTC@Hu}4;RsRbvu+V(Z#KKN3$D6_(Y`%x-irTvI;L6SeTddr<0!_4dpq;j zvj>&G>_i}!;+84H$qIV2;@a6k>>3yRV-()F-S^kG*T^x!j;uI=<)NWSYdr$AhbceL z^Cj+rjZDvpZwgd?vNAfX%D?{=bc+lZwYoSDb~SpUK*~5NG{LvWb&~?QANCSVem{Vv zeND&S26K{qcd?tuWHk?ZZg{%eN?`gV$*+?y2^;^Yz8!U(4ReMhK zW9UlZ`_2}tW%)Y_U^~IOLU`<_XbNKVDP{Z@Cqz%*biO{H?&OAH@nGHyd9Nh1*M}#q zr6XcD`<$-J3x}Ixj`$_ltB^h`@B}p8R~N=AQ{a0dBOdkeVLRqAgAGr+!;nR97f>K) zBi!g<)dq3W~I9x;bt2Qdb9V6mA%Z@T9A7Ni<@`kM zV3Gs1K@-tGik{RbpU3C^TF94+@wkwUK+`#igG*9OHSriGn>mCe$=j~QFcu(f%Nj2B zXQ^ne01zr{o~J4To~a>0>_U-L{8PP-W}UDbh(C5HOfce?-=-f6ZzNX%C5Et!ulv39 zW~q!0)sYHU2Seb))!TkN#3o(%l_`s?qY-OQR0)hM9BtWVbj?TZd*f-gQL2X_g)Hv#waCjiR8NEzuC{$Dx)Z zYk(5qr0=r060cfY|HkHpFEM0jOX7o6(b~v_lAFa>sKbYjWeR($5+={ZmL~0bmyX;b z2%Z8xGu5o))6TqE@|Q~&cKu3jVFmjR2Q8@?Xb3m``;*?F#bzF(QCcB^TFGjLs^7A{ zQ(y=Jb!z0dfGg$v0Q+H9dN<3w6I97iHny(5A575~P!L3j+3Rrbt&uCNZRsOn!yL(3 zfjUJ7?5O1<;}-Nt(Zcgy^IOF02z$*?-K0bYW_Mw5lFV3@rR5io+kb02XT8{hw6tyT z`C{^IYlqcs|9B|Ty}!wD5azK&wmac5TWp0mv$7I@>wAJ@*=j`)_=82YAaw1w42rTw zkRsVQKqNMydG~ZCvrrMs_Bvpu6TB1*hL0t{ld(yWRE_{c4_lSLwXFUVP^%b}KMUch zJn3iwVS|={HRZxoGw41dQpSY9<8~|Q*$uKS-_*9|h&G|=kRxz|ZT!B~?dCYAT6u8C zlv`A(+s4A^(@!-cG`AZ{r2REX`nCjx#<1T08<^-LPXMq~4NV(ZB$r(J52p*FmT;y_ zztxoJt0l?KFgEv3Sg+8GTe1+aO!*(61*cIzT+M2XpW$b8656$*8`r{UxQ!tLX^~=*e z6NcBCDmC$GoW(`SyJsb!6AJ0je9ea_yM+zj0c$?vMsTNvwYF>rOv|Fuj3rZ|p2Y^h z(=jaK9|Y=Qc9vkoq&Ec4v34Pz4lELQxjw3MpIL4(-ion*LMsC?;TgF;T$Y1N+cGCEJ=|hGvSm3ZJ@b&qY z>5YochGco74?H76iy&ObWIkL+FFIHI6wcQM2eS}0j@pyPl?hVNv}o^}u%Oq+zj9l@ zl+@QTEg~TYO3YadT4T6HJVOBVw?QLShS#!S|CBJ!SbNUDUqx83*TrfKB2vwhrWY^P zzOPJMhV=Pr5bzMJ0@pipN8?mCE-+!9(WPJ6Le*vrj=S3D?FZTC5b8v>`(h7KZnUxu z0_$TxWE>IYoS*2;d(DrQrMiheGNIHw+W<T-pqg+s;<(QULbZ+@Zw zP4y#zh|gnb3Ns``e8d<N}b{vSUKB2@4sw?X9SyT$S9keI#5d2-sdZTSieLePF|s z4dH0OhnX@b&l^`z5h9>|7MOUvSax&v7(^`x6bGXi6!#!C*3ex)feD?9p+O|6X^rh= zEFl=ED43;Isk{xF0J=FX#Fe)_-R!>AJ|*cC*xdH7b(A1Ms8C)lghMYo^r%+BPkSC& zFf#H#f;5&PIEjuKzD`qYy5`o4NtVP`tHgFGT1`dq??EwgB|jOWw_*?appweTU#B9K zajwP6m`Ka8W|tFKuUy{sgY!~q+)e2rh3=nvS9pz%hPYk;)<~q5wn;@Hnp4?Z92rx1 za-(`~8u_YS*bM+*MuBJS(&N9l_?6Zn3X3wfvN;miFzH7=_=9EZAs);H+d?N{Tw1A#l;ld9z$gkoG}_e zUX9&_fyT9H=3iyTi`e*)q@ACkyx;wmm4AJ1l>ncJ(}ZO&(=-0=Py+mgE+k5f#bQF9{?>M_dUbxYi2{me~p-;GRtmE>AL?E8GZNIX9zizuMvy4VfC zE7%j5wzjNg{Oirp;-s%@wTw1fj3hl4g@_(V%R)u0*8QbK#c`(a>nEppaW?gIJH^9? z)r;%u=FR9zgVIHf5RPA6yB-o?^RPPQ`PHaG;Pv>u>NzRCq#Js49_YN%IDWCmw^-cu zh6LRZHN32*Zum_yXu5!NdDrei z`mdeC85OQ;I%`C3$LaitPtIsg!$^&;f9?lLjw0ytx-m1jMRMLLwchPZeFBVz6{C)%NVxvVjoShkY3<_wXAYMe-vlw{r zaE;g!cU|Fy)o3WbQ`}Y28>JE$)4tAWVggQ3Zg*DcE=L6m&nj3&an~*;G|{&p|+yD@?K zwu`P?s5SNya6hsP6x=&;D$kaMKCHewBRD6Fc~?jLd7u=&;=QE0!inyNWg4$tJnfM* z%Z#n7#bUMT4xl50p6WB|9+`Kp*2*CU9!ezUcs#aw}|aT?CJodD0#iR6a%wieP`3gR0o!HxBP$PuI(H3!NH4QP48oOVxj+ngJQtC`rXEo++*U6 zC*<>1*Kp-;sov_>VD~`IiUK^mnqTEcnHDb?x#41KYd(LS?~>D^BfiB6$v@>}3D(v4 z{OhpZ+q&}^0*C&C3l@b1!~dprSpH-}2nCKJvp8z|m&NBk3`=Av01*|s?$vU6@nORB zt|d!x;#Tkqu9o0<#C-C6Yf#kD%x?e7r3qmOJQ31a(@>6S;PpIH4mwwi^-CIZAhjf=3;YP^W5|etSeNq!=(!`TLLnyY`nPf7y!&+;DR%}-n zv3;X+>p?LSa#SB*dFjmrmT=L|Xlh189&Zd02Tz^mTT}D`__xEK`=bdRYd1(kaY$n3 z;iL9KWkvDMIIEe#_+3)U!>#Rnp_rv~`?meQ?|wx}wjof!3H8o>et!6wNm-bxdDi7$ zl;QK8>lKwQL;H?$y1m-o7Zi5fkjZcHy+i`FbmiCgj!p_q4H zK>~|#$VX`IsC3P{O@BYPWden59aNQHOFX}EbFwn(f7-#k*5;Gy^EXhC5LVo!AGdY~ zv{V5?ZC`DSYZDSN9tn&9uFs~6{@X89-qzv#rP-DzfD*9uR|a3m1qM{Bc>)=U=d0P{ zxH0ZQ2_z-qbFxKzs+iF^I1i^Z$~K$fB!0HFRYkXnjj{xix6=V32Y2~?rs8X z;XHo>F4gG0;{E9kVEUUV6z)haXbU?Vw+*uL}r(C|kdD&Mpqs2fQB%t+XRwt+I3@D@ zMX@0_NZ4x9*(>c-Ve3lPgiLnSNQ?z^64nvPN&QJ*B(QNETIuzMp=A0V-Ep=wg(!PDNLbM%flA!y10cK*o4AFr8bLv+jdO4lgBtIi zzf(fD=mv)tX?A*Vu+BdxNIaC9xc3t-sWEZxrNAQnC^X5dIf;Q5-`y1{K$yBcAq__< zE)q&1fo&A0nFoIY>p|xlo54bfb-3)p=XUY{BQqJigNYpfx#Q46;Dj&@Ea5u zeiaYbN8}!Y(Lz^OTZgFb$?$~X4C{pv0LYqe-lv)F84^^sRZ&(vWa!$c%l~u>V2Sk8 z+0Bk=8Tg>7hAUB{ojbx515HT~WXODg@|ZN@>G?D$l>zHU-=abuE8p*O_dgY0`1R>h z=Usa*l2DT3w;=dEHq7-5aVuQ%A1b(T44ZkSj}J#R8RImlxlH=%IJY9wGXOB;cP~H$ zUjIb5!3cQ`W)DaEkDN^N#zYiuSX~L^V!pMkJd&KuSb81la4VbrF_?Q}w(D4H^faCY z4wSdb+L9c%o+cls<(3}bvEH`988h~x`7$+k<@yDuWo&CV$2_4+ytAiGbcd`oI_Gy| zMvkzAjHe7nT7lVO3xgO^>b~NLI3(?%Ii(~L_O#ybW~i;8OL02SMI9<0(bR_uhW=n! zy;DLE3?=EAI_-R2_p{|YC_~#_Ru?&7;Ginp+1QbzRNc0C%Y#Ym9rYWVV zEA(==g%41mk!iuhqlUn+1P(;bcu!|;U4No<#-BisuR8(M-yDtxZH6G1yqU zS9`{nfj0SMSX4HMON8{()xKr;5I`?{Y2FafJQd2PhAy{uP)Vo) zYqeghLeVHB0^2Rqc>8^Gw_gO(-<+2#X3uKC;`yWlmHvAQu!PJ|^3y=9Fm>q?fbCFa zFKa1Krf?86yQun5&r|pn4#P$nj4nQ0^W2GncCr|)bwRH6sJhK2)ztf|?GbuBuCwaCa3A~->qYZY zZHzRy0ig8qT5zj8Z=P0>2-dH(wlVG>_W2PA5yn0n=qv_;$r;i&Q6SBcLP1efpGv=- zeP9$Z$BN5A5_?@Ju?v_);b^dRkp7(NX8J3`Wf^d!M% z_@BBOr~GC)$D;#e4jLq)pcvFMFtsfobzj{%SlW~bhEvFF#|sPJdyHU~5Thjb2LX3!9j?fD71nrbE$F(pGTgNEfjl`? z7%-5=OW%byX#{V%Z;5Mag*6(lwhLqn)(=~wWl=Tw09s`SQ_S1h}#X?>adXv-~D%nsVc9R$i9 z$dA>{(;zG$HzixA_LJbCVhDa4)Q78(mPh8U;g*bj6ZP(?`|QVpd;tw*c<>-)Mg*cS z7lT%ku=-eWzu?JG;i z8JzwNByCK+~J)N>fMIX)bCrf z;U@S4U}{1@dk`1OLS{6?{WCYx{YzSKBp9mK!6ep1De`eh|Irl8k47@KQZ`6reTr=K zQf1U|(UVw$Qh+^7gTs9bXwwiC0Ug3rP?T^IibhW0&5}n)PPPBrjfQinI2FYa%(%)2 zX=gVCejLYXw-*3Y={Xi`oEJc04-^~FefNq%qTW!j3(>aje`r#U^!r9E_GGw)-$}#b z0<@Q=YXdC(C8Rb0T5CDsk9kj1@3JPc;z~kX6StR;yn+sH7FsO)2%5{?HKx?Gt|lOJ zqewj26vOY6c)7E74ozrFl6if3#+)2&xV6}`uWr9kPQLRxK&>r8%o~|jpgysAlYR0l z+k4rem~zBxB2E&OQ{N;SrILn@7;%cDPe!GNoKPW?ybyr}S#M3T5NJ%rZZI~C9Y;4d zW4r;i1vYtCOxXoM6kdsGlE;PtI-Q`5I~b2piyH!2H1)|E#%~4LiB`&SV(4VBpul)i z8~%QNwC(2O%rN=S$h;gEOlXgo&|ipX!nkm@WuZJ;7V8@P*rGKXmh;v+63#fYgMYt5 zYkg%WPIVGFWx&{_rT+TWPIJ4It%!cnxYyD9aBi3&3`LQ%S2Hpn%?YowobC>?I&JdF5h3DW zwq(@ME{pN_r)&heAN!&idBSr|&~t^Bsat^*%*lx z4vv!psevFOwJOeA;m2uy%~ij>EOlyM35GE{LOkd(H$lK3mXJ75$c@mKp9{LzKW@ng zT>P&OcRtSU3j1wD5P#g2GU?zqIR@yhNat5SogRPSR((fJ`b_-hJq^$|YCLP=gt=G8 zrVgmp{a?ajYLPG>BCs4#%G2rzZ6^}UHUVYAP8QQi+DmPc{olLPTarEh z06-BLuvUp4vY7^vOJUF=wHYL(UF?6(mfu@8jgHcTNaH zsQ64mZF#6nEb9b#(B^5WGPsU9Ek8#Deuj;c+p1wd*e=q#5nx?r#XoEXVt5fHMkM1! z5}BTZEc1_$qp=Yf(oYzwF`b(4rz*a_s4kjim>w|JwxXQhk%FMrz4ABQM2EB+{O}}Q z{;~N7S>!bP??5yJ-y!90D!~Jb0E3!d=@7T-`?4*}+m92uSqxci{&ksG(_ZGb0pQwk zw69f9OU_MeA3zg~aXsq|(^L^r19FNZ$lCy3oJ5E6pF?x~I(&S<&H(A3X&&F{K4V^L5_#5S2yaV${BSa}K}K+f#>nSEN}nYKK&%L- za_~gxUC4bPB7;oHPZ}^4I*t8uvTXG9vzOF2hDk!M9M@eRn$B~r_JNuZq0oTBR+O?s z`^))YC)NB1b4~!yk!{OoUw8bM9j>6adDv#1OqSF=Ms7PMWI}-v1aBBPdP+u6q%d!h zt7WQ3+|^{Jvb>jvx1CJGcm!|x2H_)6Nc<-&$Hp4!sR9sC0n z1)H&?oN;8nJOb2;X~tNEzxJF7WZ(dBY!9M`Uq<1ml4sCzBaYunZT3mGzv!1gUD1T* z`y|5jmpr>NS`-qfCTcKk{PJxcF3q|O&|)6S&z4w`V@C=QzQs6>eFuGrq-&6_nX*NR zUhEBLKch=NtSX{{TG$gP>EjnJEBR1IQ!d3z*(L4%$(R=OY6o1xzyaP#F&!Xw!C@z!8$fA-y=`yG-?G=%q_v{~ zaRHvd05a}+dWUt}Cq?-LDpTj>$c~DfpqKjzUn{~0^RqcnA52t>u04OGu&NiSr)Jc1 z@K$EUP#3}UGnJDYOX*#qPwf%>Iu?PMiNo@_7xy6OAi{*~>*$%^f5{x1p+s4K$1)@V z2|gHm%cn1jIbC((g+a6_%)!KZAa=Ms$Nk;ekdwC4Z_wS==!i%C|M^JvABZ~9MBI(5J_Wo_!~1WXXAX3dNR786>G~+J(pfl z+FiS&K^LCf6^W_SbQPstYuYw=#7vD#A^|tAKZ^SEJ|jcJBkpiO)L^&?KAYo{Ftd>q z&-1TAs$_to3!jK?`-KKG7G~yy1k60`H@*I?E*YbYsG*Tl?TR$-gU1mmG`VmBnRM_!(%tnWL0>lxV`Fp+$~0q1mJ^P!X@gv@Fu> z{<$(8%x;pD5ulhX)SkaJpY?iWFvs4DSAyh3lLZ92bx00e^P7ExVbk#v=(Bu;@zg|a zy#q*j*5&+hDA)sX?4$m>9;siiGTNrcl=&>jZ`+?;gAX&Df|FXk_1V5H#G~po109>5-3&uYSZUp$0rT`LGPPy9 zMk^xz33Luff9=GEHC21Fwx?Ejv;M(C;Fj93MSjwHrMXwx%XgG$kzO4n&fl-`F}Zt zbru@!;6pwM;;x6hD5?wn=Y}>CZW)lLbRfgBvu1{{XYs5zD;zJOw_(Q(cuY(m15<%u z(@0q*WSo9JY&Oy4Q-}of^;wAD^}IpWu)K@Q{QYyif|It;=k{@>CBM(k&DfW5P|*m2 zc?!@iw$z$Dc9i#$*A{;`Av10PPK2scQS=@Pp`iICm9Id5I}SkP?|hL3GUS6vOMw)aDn+x_ zG~87@@U}oRWbw`F4C_8z08*8mI39I9ia&`!E00MaRb;NFfA@uOPzWe8+fX%28NH#P zR7^mzm4?FWzz+nSa>vmlv5OKHXzmx^8+e(Miy`{?!7ax`&cu#kxu7&S)DeZQp&~BM z^36rr*+O&P{h2_^G)+w;(I39u`Di4l$@~TKp{$uk ziQZ)Dh?TV z%Z!WrNT3M~VHZTBmvIp5nE=kDYW%oCohL0AJ_j@DFG#3Syv3rmO++w&Tj~xWbu7h6 zl1QzU@6Rz z)}fyd2>flW@#TCH3h6P3Wyk`d2?@wq8|ryUx5p=an9=e9rQKHl=&3M1DQHoVQ&BK2 zynTYdB*Zbg2l3x%SoIKGK>j>1pJWmg7EW#M(mh-FLyj%4Q6Z~NZsIgrDK-*?aK;ny zM~BiE8{JO`IZEs0>-9sa!MEXJ_;|g(zR;m#-l)(?4NR_fW+Br=+#GJp&{WN++&Fc- zD~){OIpV4?a%46bN#7QZ!*zf#vzX z-0!KmGF-TxWwJb~ft3sd`Na9k!*VzMZkFsaSS|iAxb8pajl@kZ0i4#g9!vk@`2(oo zKch-sa{MT4QS_iNIX2N+H#ag4>%pysZ3N8;Rq(jJIyi2fRD|>_xS#d-11?xRrZg?| zA^5<+-a3C<@KWY|3Z=fPGOBG{+N2e9_%?J~!0azF*9caQWEZ0EW4;&EA}nNovj}FrW=+R7rNDw4nJI*Q~1@NDJ-><$Iu}*%kZ(!zE z1g6y0z>TlfB9ED$H&Jps{Du2;XQ91-61mYyf->9c<+w%3Y1R%UubG%|$kQS>%hNDI z#zZiQoZ|=cyD(`^g6u_S4e;*}erVF(xDoUFU`iL=)Y-q2YK}dtD0fYnBgJ2aZ#m0pdbe z-mpMAjqQwuki|cM@Z~6G8qG!zdh5hJ1&PUj72w9{xkP0fvUf= z^G)t;4X8@qz{EYmKodse5Z<~!U-`AQhC@7jI%0o#yJPR@&bc2q@ypxTBB&I{b+1XH zod;#Lg@i5Mocuxed0svPN)x%R4ok_!xt(8#fu76qiCyG#IC-?5*A0~z>vnHuAtbIdX^@t(w5uqh`A z5jjsfubmP2V@EF4Vru;*{cnzcj?3sXPpflx{|zgMbmK+?o;ng{tLSO_tV#(mfPmq= z-tIS{aN2Dh#()=%uXPjK`kBVchdvTv^}iI$lt`NOrP5K?5qvmAT5scTUMWKS8X#{S zsWI?0S;b8TA6@~81x;rSoqD$P_7N7_cGKfK1c5QFuH21!%uW`*QZPp1E&LMkyj_mb zYdiH+xP;%uHYAM9xZQ1as10r|U|Q=UgiQCVR@N?(u`0r9KGklh7+!f8rx^Q>({s(^ zj@xxJ{GNUrjGQi9gi=eq4vmDUTck*M>mFS-G5+B90C!d+#LI5y5>b}WBnR}%ymbO= z1F31j?y%}EhL%zEzYUIyeLG8=Xb|WdoMr1qMls8rTzM{>+~9IsFQ8_)z-{l+NGt)V zWW`<$-6kMO_~dbg*Fc9VM>_Cdw38HNS_VizJ{JO@YCXL+W^({t3eo(V&e2p}*dlj) z4Q7LBsI*?MU?@sFxt=1+hgw&DHqADGd8&~ctFbi$buqwHz+=LM5XTKa>=Dsz)~$ZG zU>AU=901b^`k}EqszYD31?Y3lJ&XLu^BF8Y5E_=)V^`T6%k))z^#@q6HJUS zSM#%#=0??ejoXohTJppPP321MctFq~a#&8ytX=g%K(07*XQ|XD(oE$)-#tYGvn%&A zdOvzj3#+JXc);Y?Pu@Bjy%ajIv`rx;4G5-V%J8>1_7RPu;pO>}y_B`K%3(jp6IC*R zvVNRKEKmOD^0E{r_8YSCw>4cQC5|yv79wI%@wb;sd$oEYzg|vX zUnV~ip8Z7wGE+NZe5E>)R)cyDnS>pbKC8c06$Kg^G(@7b2W?YL^<9MGYT60R$kk4; z#ji9|njzjVC;tWVQ2j*>i08j^sb+NkYd!k?s;?Xcw?ekD50H9hfc&KE{3E3v0TPdV z?7vIRj6ZAk3J(@Cvw7V?AWfGLi=AH4N;HGG&X^mPRW8K^oe=2lfUSS+)U?ce3L+OG z5aB_?eB((iR@vyhlAhOe*r102nPU7e7TFO-hK^g>n3Q5}XaW00*AP5Kxa^gg{m;Lb z&Yk2mVJU|q*3_`Ux`7Ts;FEo`A#3W%vSY6=?|8!wGQY0_j`0;HMD?&B419@LKBBkf z9-=?}%UVI_<3*N6T{nsL&AvT2D?G0*6tEUVdbO@%rB$bFg+_1)&>CG8p zb-D0tN}3;Dc#x$$N9Z(d+6_f3I;2C1?Q4KVy2=O0FvH(>oxp1M!HXK;F-o0TWvLLQrHJ(=$Q`cX=@y z6v)}0ESzU)>< z+kHYmt)YP_^ZBQvva#aGB+8Dls+vM_iz}jG+gd3Q=ePhYIU%LymCLs#>il&vEn13tkNHR<4dQvymp_$l*P-HPyPq{r*N1 z3zT;A1{{`^WHPP}dm=~?b?NA7uu)6?3ZWWAsqshs9HOMlCF*gP6>f4Bm z>K+A*m~A5K|nOg23mbGq*YN zZ9x*O-4tB1!6$w9IiLm28E*ogT9u)5ItKMRhQ$-Im*rz7aPSYE#`gr*OooFPq>ftX ztM_Y-&#GxKXKIxG5QntWicPf3=iPL zzxyQ>hP3-Sg@zbC1RM|2b6KR43X!Nve~}{*R>xXccZU;*%r{0j>a_qSVrrMLd3rc} znQWRA@*ET3kka;Zxp9QhP~8~XU4Hcw6+dHOH@I#(bC!l=O=cR=_7kzgv9=v%jh^Uy zHfjjL#Fnf%doq)Ufj4YYk{9Cr#ZE4)@9U=ET`Krc)j8*LhT-GGjj zp<-ce`*F`=JTY8Po*homK1NDty2*ZX`Mct=*x$XJAeSD!E9%hqu|4oYzItzct@j(D zL9fr4-w1RjF8wsMFu6mnaK76R&K0IzI_iWrq$b=g=-CoH^Vc!RJipJfF=RkvSqB0_ zAI@BKvsM4#{IvZ2ynZ&8ONQ>20i>HYGy(y2zt{^MPguxo8}$g7D7-#e6m)t3bXTS2 zdIx&Z<60TvWqAUN(g zz><Ol>Q&<4WP)(s48k(VW${N(Fz+GCYTD2iWGS zB|PX$9EGsi-X?_Cv{78^yXd9hKxPcmhdW+a4Q;q(%)De7#2=TT*j zT*!Ncr8SNLW|y&zKC3V4jV8cO!!^zN4audLp(3JE|xS)4inC*X}WdVAAiBxi=s@F2kq8uTS!n z-Aq$}u0bl~W+Bj2^86hloW?Ekbhrw>kQ%h8jI9x$(WD$F{s11E@{U-=)ztw)lIbU0 z9I~MjSOX)>42^GxNDzq|i^>!#KKOko%Cq|CcaafqZAgLIdOy@^tX%wB@tLf=;7B`d z4FHp|+qf*WEv=6InhX}M2bG3(s^26JC?H3$>TYAvWk#Rzron+lQ(S%dTMX=WeKKnM za@RLT^@{&GUq8=|qN38NhBF7f8Bft^Qv@kF*DD_AGBqd*y-P)K%x3?YU&_>dDS4`H zj4QQ}WDrVQGS}#AjGwP9oqi$U@U%LX1EhL_csok$_hv>)mW|r^EhgqHI_#fSlQw_7 zjelvfX}wt~oOc}EY5RqZ2caPO2R7xsa#)^`Rl0>8BL!ZSgpPpS74bqF6muKnUBWt* zKg3EpoA>wQO^T@a!igwGnws$aU_Zr-SOvo)k;oaf?eRLmeE+|0VL*F( zf`1pnWl$!q(~^!e65&UWycez)&miJ3O5-M!)!#2vQn!*YpcG`|9!-%;2ZkVjl3l~X zu*nWSQt|>bEv{Am@A+7+_4vNvLH8TxvA2#M9PHz3%8>2CP^5*={%YzWm|6i1y&A{O z>B3bFl(6xeQedSfO8Dp2KwL6lyO1w2g{JM!%oTpJO4_cPkIpA&El;fVz5{DuF9a$P z=Y13(>c80pQLyj?xBM+qA-)Xkjl^7J6LSbt<%I4$c1Fvxbw1x1{{)1HpT9twz2Tl& z8D+bY=g2NEr`v+-Mv&m~e~P}s?~w@|6h+{FnS~4=q;9AZs~I z-`U0t0ncEsReY+%uEU?FTa_4Lth@!4|cKufDV zij#kd+L)ZsfBIQTyDHywt5(ykBMGG^3-f|lbILrbfZOe^PT2D4-W=N{*WE47*vzX+ z%X+jfVuR6>HMLT%2Nz5@kR~oH$Nzl7KcQ0{t3xlYJ{>B!(edQG)>-e%-y8y-Jn>^; z`4`@6%zuMfYITJv4SIAP}sO@*wi zN%Qtdu_?TlWfe5fD(yeDW0eKt=H}8#r8-jLz`gV4e~uXM)rdGAp*uCT_0yas4V=er zE$sQRDM2>Jvpaifh_7y?rRkI#yV+hp{%}(-BHJs|C&lL;XV~3@(x8Ii;K@ru9Xge5 zo4=+hcCi*Rn{6zrecZIQbc0o!$NC4r{r5ak>}$$596Q2zuaR_W+15K~Xk-hANg%?*Kd{@Nc`0JVwv2QZ75y3BF#O*-~#`@y%YCj%UI zwJi9yI>-^Y$KG#B-~U$2t%ilnrk#n_!81kc_9@Mr$=TkzV4D|kFO%;hhkdakVfOcX zlvf_^X*O`0eg zr*Cso%X;B5vDg=p+ALe^y_PLjxVAuzljE(#d3}y+aR;S@B(=0XOnu?kjbTlvPOCob zlojs#RDGdnVmNUB?XqW2ETeNPGbN^8w`4Kh<}p?EsIb?p>K@@eHWBApvR9>Sxw4(F zF@Nf$s;gI)SRG|-o1wb!b3uv6jOk9E{G!epv(8`E+1Szax5?DO=t!LP!|`7Zj0{xSTC_=cC+anrBmLM zE?Z}E-1I71Wzq{gJ|abE-tA`>+^=*8Ylj(VZ~l~S(y@ncn$P^_`kuVjm$`C88SgAR z_)2(4IBYtj=nRnanpp~Oh zEYDf(6UI|CF05R7L|gmh-xW6RcTuXvesQbzWL0Ae&Fw$7S*6BPyBE)j5;>odI`6W)>S6Qd^lxPw)L63@uCctnT_Z}!yX%A6 z%Bk#6RNgqZo=7!5DbNtz_Wz!nk;x>hg~zw=v&+t6-SEF9?#8Bo*vIjT1+_{uSE=3N z+rLgBD>61`cA;T=sH)h7scV-Cg#gou@1Z7^gKM{iMO-~%e?BL4#)o*Zb)t#~)@oa6 zPF8w%>|)KuSq|YzXPtB|hv}MjmRBuRQP&6dal@V#FJWad)lB%P@O?G-Fqx>05xKUk ozym#io8)klWJyll{GVOyplR+8(?e3g^K%$HUHx3vIVCg!00W#csQ>@~ literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/Square44x44Logo.png b/packages/desktop/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1942533c3e4a212ec058ba371846497b979f8059 GIT binary patch literal 2209 zcmV;S2wwMzP)b^}g5lE&V#*;qZh2q&<;d-tZTTenifh7G+&C@CqS6DLm4^5x6vTOLMRX62<_wEq43n|nKU>|n4k zJ}f!p{rmT{WXTe0*|H^b7~r7g*|TTUx^?Tm`Y%^V5kAV`v8liEnrMx*YuC=)JAV8) zA7M};00MeEefpI8^yxz@SFWUphzR=h=@U(uFo6~?Ud-PT*B1gcDgh>cfMa80&ApmhWF&*0HER})88e0_hZPASuv85&mS0+Nad9QUhIBe; z066%(di81s4Liur&Zg$gn=@#kT2))XUcxzO$q-6|_r*tR(3m=PDxEubjsap4YuB!= zRsZ%HF+O;cn>(-6Wkyqe7F(!N32>{QY zJ)@&XkD8T1U$m5z6gqR}3>6j@asma)_yg?;1~5R}xpRlEUAsmdI&`3V_3F{tvuDja z2pWij(BjUWJG~;Ll~$)upQa&0hVXfEax&Y(qD70$cjDsWcv8p&j~qGTn92s!Fgju2 z$&)8j`}XaPE3>AK2+PnoBH*rFyUcR|Dt*9Zc{Xm`I0h@v-o1NgRuFvml~?-(ESc7@ zVZ&H^03i7QGHD(ff9`x zHRAJEuU>sk{i372b{z=`36z?e%IAob$moz1pDtL`obk)5&(e-VAlb6C^^QUL4)Y+ z+qc~J(4j*na>71f6Cp=B%w8G{L8t;C&>(gp0A`&i_H#lbEdTuZ^I7wl9G;IJJ({;y zX#4l?=RhGFRZs?ojPLu}aeMrwlpwyucu9DqV1kbp6clinhJS9{xG_C=@PLDhw6SBy zGB-gBcmSMl-@cs{0nGv|yaQGZ2@*C2I2V8HD>0Tm-7iZ1;H|XFB{Yz6Hu)b;MhYA3vTpZrtcp7LYw%nv$LNJ)M_^ z(HY4K!l^Xmwp=s_4>#JjCO)u!fW;0PU@U%iUE!qHOd#*fLkP& z6D<(oguC#`@TC9+KP~B{_*(EB{5^2sfZ;llcNiHO5+0!z-h~f`K?YH9aarqWZe65+ z{~E4mEcN;G=cz}J9^4Oh06NvJTbEwG ze92iFGC-_A0L=p5pGs~^UBX@jG=&t&8^Fs;moBmMm(&knknF(lz;!Gwcq^Peb?Ovr zP|`~$pIU`dRvRTZ1hABc1oGnzV8cAs=BQU zg8T`$2J6uk!W{je)Ec5OD1t`Mo;^8#ux^*E4UQj$6DP0&64$cJ2+#yWw#5Zk*vqX* zmkN;K*~_g~7l!lh-MdrAjvd)eAt>Cud6T^XLbyE-4xvf)6j&0Z5NHK#EolF!B+pV* z_9|!x;$1aLtoDL7^4MfuudYz9Ghry5$dZsH2`FM~pVzYOf4 z!*ww^LrMHM`YCf;bM|+w?SMaJoPK+O4v9*>(^bTZfAJ@ye5*wN9=PEH!~gHcqWv9L jRf;avFu009KQ8|Uupf5?>BuLH00000NkvXXu0mjf9;PZ& literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/Square71x71Logo.png b/packages/desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7a25884cfc276841578f3b76d3250b64af53276b GIT binary patch literal 3764 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/StoreLogo.png b/packages/desktop/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..37804fead0656797487b988eaa33562054aad265 GIT binary patch literal 2586 zcmV+#3gz{QP)@&> z*4U%5yZbVq@t(`wyKi^z)6M=eaJYTud{3X58z<4Vkfd)52YoR%AoFq2cAQ2n#^Evi zvl0ftH_vruL%&N0&A|A741G$0mq0*boX(&EhI$$LgQ0SUvZoV}w}x&R+GFT%hF*Hc z4F>@Nhy>^SFNP)=$|k>U1Jqy^!~tn3xz#i9{I=OF}|| zJ*I(H!VW(foO|01{o>(0oE#8+xW@tU#pxu8=HlYw#(IdHV;ewn#eOlhXfA0c{ zkB?6a4T*=RVTP7@13<{92^{;5;}hXXnotnKhYy$e^XE&(j7hORefm_kY}q1<7A=x{ z_wId<^9Cq@(m*q4;+3J&hW@R*$9lBEOM@Mg`Wh+6sB{Mn8YIh>EpwUk`UxPjXU{J6 z>eZ8>Lx)PXY}w@a@#EGEGi1o{v!)hucq0YeH}ntXJ>+xpBZit8iuVIiO%y6rNbcUf zE15HA{vHLsewAIjc3D%ZRH>5Gs#Qxup^)qFfaU$3J$uUe^XJpT)RZ^;xV>{8uaO84 zS)4o}$(a;w*sx(1#FsB$>~-hPouym1ZqlbuAE{HPj#R8zQ5Gy%U;zT+;VEqIQ zcqLt|STR|$WQh$1+@}wOF=NIInLK&2J?GsY(2Vl-FGuk2xQ_85jVLCSUWE!3EUD9O z+O)~_3nUFwFo-Wac>X2zhY4Xjb>)~#EzX3ZMg z4}Ev-+Ew!B&+nEo+~ZxY(LV2`Cal0fU=R=_L~TSJ+NV#S?4UZZ)@2c^KIi$WRjcfg zZ>Y^$wQA*-Jb-D@qJ{M6(L>6YFYhMWl)%J#5(^dY2t%17B^;yz6D3QQbO9hmoVab< zw$ij|Q=4ZP@X3=W$tFD2?&HUgrF-}8Qm|k_d;RLwD_beRJhdBnhSG;4Ko1-^;7^9k z6BawAeJC&xE%sopckkZzJZsjh(yUoCY1pu#G;Z8j+P80S>!~hXx>&}pUcDO8hjh|K zgW%~5#$>s^~R2hb~Vn%2H!(=r`pnawZULi&W zL_b=(bg2|ATGTQKvkH)Q^X5%k&Qle)Y178qKcxsj$BrEq@1EKZp+t=+7Fk{AyvE{f{v^4xdOBN0GGM>}*ZhcRfYI-x0-~J|(-qjZZQE?sOOzQm zZk)aU;ll?hQ>Kg@K780l94cLWNhSaC-MV#c z;YdY|w8xJh@8&9m#S#;J(#N!E)2vx(*#03PdGqGArM9|>%a_}42^zf5oL|2~!z>|j4G6T0pp=i4=J%;i&6o*#omw52 zjy0rmM9L&IoRmi7dG_p?{SHlVf6tyhiL?!q8i@!NX~vP;+8Ah)I{J^?U7kF7+yw@GSEs8m3t>7i#~!ES2543w_8dVFJ9c%R7h1PKbtpi zwizB<_BQISty{NRhSYh{s+JtuCk=-tiBfb1T(wu;;I)!-9r77}7httsdE05IlP+S1e49LfCY(D< z_ZcGXP*Hwt-@e_h%6s!kq~#wP8JqGVIY#x{DE3a2w?7$LqrAuZc1dp=8e}M|s?0mr z1`Ly-l`B`;bLIzR@<Ymc}v;y+x9L@M?umKurdwRX0KL**J_HV`yF~p=h?{ECW06sC^F{eO3 z4EXa)g0qA5t9<{3gRQC@>GTT+JGR%Iy~4lC_kUAjA|>u0`Kcx*oqp$l(GNbU|Ikl0 w{&)0Oqxf_-DP2H}msEariq=H_Z+|@dFBrOF?r$dirvLx|07*qoM6N<$g4tLAGXMYp literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/packages/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..2ffbf24b6 --- /dev/null +++ b/packages/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2481390b00efd4ae0496c317f5035c1cebdacd7f GIT binary patch literal 2257 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 FV1nx#J|_SG literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..def890fc37a79b00179877650de2f681a1f004ea GIT binary patch literal 2178 zcmV-|2z~d7P)hC{xj&CLU}H zAkxPx%2O1spI2*~I$SOn)z;R&!?4@!=4UlEHFg;HXqXDD!Td-?#r0XjVL|g3HS<+^ zA$;R-I-Sfsgy_(r0|f^MQ&m+JJ%9e3Uc7k0i{M#xbv4hkA%sUW8?5LL4cRh(mT>qH z%B>yt2Ss0M=7Wt;p_%X5vnOR`Wzm2E1E^K2R?PVI>(}YTi4%0{)G4}o^Cr&^3JRh( zZ*2R&?3t_RD=ec0^E4!YmgxTeqlf+qTrc zeR~QG4W*$&hti-ygQ%pWgzn$J&ycd|7uY*gQHi2LEkI2}c|c4QWzvM(8#*Z|Dg5%x znKLwL(jFMco?AS3D0&ubrsmuzC^5U&d z=JPi~ycdE17{i7QqmYoduMZqJz|7-+FjZb&PPw_c)Td7$+P{B43k-`KK75!aPMpY& z4nb`=wV4-N0{B%?uU@_Qx2&v;ofZRH1w4=s5Sbo5dc>AlvSbNkAJ6yh-OJX&T+Fc< zVtx9o)7C25?9eF2vuDp(x_b~KU|EaS}t@Q-&GnVFgN z`0-<&gQ(P^MGF=JkqL8PA^H8F7Pxlp8p8tubm`LNZQ4}PMX(Ph%!1$@o)r`n(8-f0 z`C0GYz1g8*CA^m)fL|$50xp0+qOh=#UcY|Lf1`{5u6y+8!N1Trn1B||Ldds!_Uz#~ z(0XEGB0r0XiJ_G%S8_;RxNxCi87o4#8zVq*aWQAz=;&w~HEI-RWH4J%QNbkyVm@+! zL>{xVU%GUO9zJ|XojP^mL^po?cv`Vy1$FJ()z}9)1Uci?t5^PuPo7Ns_U)@u z-v+C1zf+%nUX)~#E|rNYyvPkH|6(W7~u_W{RzPCx|< z=CQ`?*|WJkk#~Lj_6?j5fKf1y4Uw3@JhWF@TFUQ`*p41ON@K>1p&>(t(ABF~`MU`d zCNRFiwBQ-qjf#pgvbRL1ty{NJ>(;Fq{}?Dwtb|sl)x-rR#*G`t(F5b)!GjzMrF;P9 z;lx+2T%nB{HyS$PI`-5On_h`E>d6Wg}<=EDvBYNnT)3oDlwT`}S?tEHoM$8_TePkDNb$ zp68{erqcTL>y1o1bLLDcDk`Gn$mkeIW`L#~dIHj!lVpTY3C&~RJRBY#&YA>9 z@g7dOY15{6zQ>Vr$BrG0dCZ$JV+My?SYY$!&4x1YEy`}d#^Q<18iXVSVo{h@&I41Y zPBmI55CZ1M-yjKvaC&GM{sZQbaUsmSdGq)TEzH9=kO#1jl;MFm&^WvgGSD1K1&mp< zW>LR>{TNnK_dpOZfRX|w^PxkBjIIUZJRBYxh82Ku_|cp>b2tx3Gt7_X{T^ss^>m1n zbW^EDG3J71;jl9 zb3ccpTFoO468WZ%NxijDux=`4D9YBghf8UgyK&GkHbt=|&W$G4xpU|EhzYA80|WE0 zN_KWOYgv+^H3shETIe^&H~G?^r=V^hR!Fb0eGJ5r)FUbAKm zdG}E9y)a%+pGX>8I6Won-jJonmPb!SUou8fw5~{9W{n}$BTNGCfD;@S&k@^^p-~n9 zM!v8umS`Z-$euqc`rg!9wAI{=)V=yhb8}Y-;gA9k10l6dn>HMQkV)Yy$OZmjW23oS zswhFxUnbwQ-CmE?JA{NCR}!WffH07*qoM6N<$ Ef+bHHq5uE@ literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..050a5949960a47049c04ee9c4427967e61eb4ac8 GIT binary patch literal 5882 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 YHzh7$= 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 B5wZXP literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..be486bf3e72bc9a49039028e2ce016c0f57d63b1 GIT binary patch literal 12181 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 Hqu~Dod&#@P literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..0f40806fafbaa062a2ff71c2545f7c56c8daae35 GIT binary patch literal 4568 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 HwqgGTPD42Q literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..30449a4f039a4e66021546a535bb583c6757fba6 GIT binary patch literal 19059 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 W_;KsrE`l;Ch@+jG?Gx*(ss90oLJ{o% literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/packages/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e15ca4d56371c1e0efc1747f23d6a69b3c41c7d0 GIT binary patch literal 6939 zcmV+$8|37PP)}92JbN@e#xk0Tf3BP#h6JaYO*c5k~}291%cqL;%GR z0Tf3Z5kPT700l<37MhC@&3MtdxQ60rCkfQ6P3DD#Jum{OdgJRhUgX`Q3M+qfMkSH$ zxymwtMn%kwGrB|oMXA$L^VSi;)0Cq#A~^!5CFZarf+tF&W(H6MPm@2#Tm(*3Y0U

#x7euwlc@-FM$@uD||zE1g{F)`GTDu2})p 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 dW3Iqwl&O(Vr$z@0E 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 + + #fff + \ No newline at end of file diff --git a/packages/desktop/src-tauri/icons/icon.icns b/packages/desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..ef142f824980f3edd8f98b6d6c34d777858cc104 GIT binary patch literal 172864 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�(? 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..787d776b90f78535961d525afc8e30112c8e4b0d GIT binary patch literal 873 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb73ffa187a9468e440146c06b4defb47257f6eb GIT binary patch literal 1332 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 JPDHLkV1oJwEz1A^ literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bc28ce3e3792652ffdf41f8c85ddf9fc093eac83 GIT binary patch literal 1920 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 P00000NkvXXu0mjf4bVH* literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2300e5b7df54fd01e3df01f269adaef71cfa8410 GIT binary patch literal 4269 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 P00000NkvXXu0mjf4bVH* literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..506498926fdee7303d5cd6c0d82c2f510ed86bf3 GIT binary patch literal 6555 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 N002ovPDHLkV1o6RxzYdt literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-512@2x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..db7297ea07c7807601ed7f8596e97598adf03319 GIT binary patch literal 64573 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..506498926fdee7303d5cd6c0d82c2f510ed86bf3 GIT binary patch literal 6555 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 N002ovPDHLkV1o6RxzYdt literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4366ab7023a8652461fbf6ce3076b3ce64c64abe GIT binary patch literal 10053 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 Hu0mjf{05j7 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c7afe7f8fa1576b481ab3878fc21729b67ca0aac GIT binary patch literal 8322 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 M07*qoM6N<$f|rQRXaE2J literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/packages/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0d555db0863a60006787be71f04f759385084de8 GIT binary patch literal 9251 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 FV1kvZ$Uy)A literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs new file mode 100644 index 000000000..9990c6c61 --- /dev/null +++ b/packages/desktop/src-tauri/src/lib.rs @@ -0,0 +1,72 @@ +use std::sync::atomic::{AtomicU64, Ordering}; +use tauri::menu::{Menu, MenuItemBuilder, Submenu}; +use tauri::Manager; +use tauri::WebviewWindow; + +// Store zoom as u64 bits (f64 * 100 as integer for atomic ops) +static ZOOM_LEVEL: AtomicU64 = AtomicU64::new(100); + +fn get_zoom_factor() -> f64 { + ZOOM_LEVEL.load(Ordering::Relaxed) as f64 / 100.0 +} + +fn set_zoom_factor(webview: &WebviewWindow, factor: f64) { + let clamped = factor.clamp(0.5, 3.0); + ZOOM_LEVEL.store((clamped * 100.0) as u64, Ordering::Relaxed); + let _ = webview.set_zoom(clamped); +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .setup(|app| { + if cfg!(debug_assertions) { + app.handle().plugin( + tauri_plugin_log::Builder::default() + .level(log::LevelFilter::Info) + .build(), + )?; + } + + // Build the View menu with zoom controls + let zoom_in = MenuItemBuilder::with_id("zoom_in", "Zoom In") + .accelerator("CmdOrCtrl+=") + .build(app)?; + let zoom_out = MenuItemBuilder::with_id("zoom_out", "Zoom Out") + .accelerator("CmdOrCtrl+-") + .build(app)?; + let zoom_reset = MenuItemBuilder::with_id("zoom_reset", "Actual Size") + .accelerator("CmdOrCtrl+0") + .build(app)?; + + let view_menu = Submenu::with_items( + app, + "View", + true, + &[&zoom_in, &zoom_out, &zoom_reset], + )?; + + let menu = Menu::with_items(app, &[&view_menu])?; + app.set_menu(menu)?; + + let window = app.get_webview_window("main").unwrap(); + let window_clone = window.clone(); + + app.on_menu_event(move |_app, event| { + let id = event.id().as_ref(); + if id == "zoom_in" { + let current = get_zoom_factor(); + set_zoom_factor(&window_clone, current + 0.1); + } else if id == "zoom_out" { + let current = get_zoom_factor(); + set_zoom_factor(&window_clone, current - 0.1); + } else if id == "zoom_reset" { + set_zoom_factor(&window_clone, 1.0); + } + }); + + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/packages/desktop/src-tauri/src/main.rs b/packages/desktop/src-tauri/src/main.rs new file mode 100644 index 000000000..fc1caf371 --- /dev/null +++ b/packages/desktop/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + paseo_lib::run(); +} diff --git a/packages/desktop/src-tauri/tauri.conf.json b/packages/desktop/src-tauri/tauri.conf.json new file mode 100644 index 000000000..848b97460 --- /dev/null +++ b/packages/desktop/src-tauri/tauri.conf.json @@ -0,0 +1,41 @@ +{ + "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", + "productName": "Paseo", + "version": "0.1.0", + "identifier": "dev.paseo.desktop", + "build": { + "frontendDist": "../../app/dist", + "devUrl": "http://localhost:8081" + }, + "app": { + "withGlobalTauri": true, + "windows": [ + { + "title": "Paseo", + "width": 1200, + "height": 800, + "minWidth": 800, + "minHeight": 600, + "resizable": true, + "fullscreen": false, + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "trafficLightPosition": { "x": 16, "y": 22 } + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/packages/server/package.json b/packages/server/package.json index ba4540299..9fb248dcb 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -33,11 +33,13 @@ "@modelcontextprotocol/sdk": "^1.20.1", "@opencode-ai/sdk": "^1.1.12", "@openrouter/ai-sdk-provider": "^1.2.0", + "@xterm/headless": "^6.0.0", "ai": "^5.0.76", "dotenv": "^17.2.3", "express": "^4.18.2", "express-basic-auth": "^1.2.1", "mnemonic-id": "^3.2.7", + "node-pty": "^1.0.0", "openai": "^4.20.0", "pino": "^10.2.0", "pino-pretty": "^13.1.3", diff --git a/packages/server/src/client/daemon-client-v2.ts b/packages/server/src/client/daemon-client-v2.ts index 3ca26ff98..34b1638a7 100644 --- a/packages/server/src/client/daemon-client-v2.ts +++ b/packages/server/src/client/daemon-client-v2.ts @@ -24,7 +24,12 @@ import type { ListCommandsResponse, ListConversationsResponseMessage, ListProviderModelsResponseMessage, - SendAgentAudio, + ListTerminalsResponse, + CreateTerminalResponse, + SubscribeTerminalResponse, + TerminalOutput, + KillTerminalResponse, + TerminalInput, SendAgentMessage, SessionInboundMessage, SessionOutboundMessage, @@ -137,7 +142,11 @@ export type DaemonClientV2Config = { export type SendMessageOptions = Pick; -export type SendAgentAudioOptions = Omit; +export type TranscribeAudioOptions = { + audio: string; // base64 encoded + format: string; + timeout?: number; +}; type AgentConfigOverrides = Partial>; @@ -164,6 +173,11 @@ type ListProviderModelsPayload = ListProviderModelsResponseMessage["payload"]; type ListCommandsPayload = ListCommandsResponse["payload"]; type TranscriptionResultPayload = TranscriptionResultMessage["payload"]; type AgentPermissionResolvedPayload = AgentPermissionResolvedMessage["payload"]; +type ListTerminalsPayload = ListTerminalsResponse["payload"]; +type CreateTerminalPayload = CreateTerminalResponse["payload"]; +type SubscribeTerminalPayload = SubscribeTerminalResponse["payload"]; +type TerminalOutputPayload = TerminalOutput["payload"]; +type KillTerminalPayload = KillTerminalResponse["payload"]; type AgentCreateFailedStatusPayload = z.infer< typeof AgentCreateFailedStatusPayloadSchema @@ -811,28 +825,13 @@ export class DaemonClientV2 { await this.sendAgentMessage(agentId, text, options); } - async sendAgentAudio(options: SendAgentAudioOptions): Promise { - const requestId = options.requestId ?? this.createRequestId(); - const message = SessionInboundMessageSchema.parse({ - type: "send_agent_audio", - ...(options.agentId ? { agentId: options.agentId } : {}), - audio: options.audio, - format: options.format, - isLast: options.isLast, - requestId, - ...(options.mode ? { mode: options.mode } : {}), - }); - this.sendSessionMessage(message); - } - - async waitForTranscriptionResult( - requestId: string, - timeout = 120000 + async transcribeAudio( + options: TranscribeAudioOptions ): Promise { - if (!requestId) { - throw new Error("requestId is required"); - } - return this.waitFor( + const requestId = this.createRequestId(); + const timeout = options.timeout ?? 120000; + + const responsePromise = this.waitFor( (msg) => { if (msg.type !== "transcription_result") { return null; @@ -845,6 +844,16 @@ export class DaemonClientV2 { timeout, { skipQueue: true } ); + + const message = SessionInboundMessageSchema.parse({ + type: "transcribe_audio_request", + audio: options.audio, + format: options.format, + requestId, + }); + this.sendSessionMessage(message); + + return responsePromise; } async cancelAgent(agentId: string): Promise { @@ -1399,6 +1408,157 @@ export class DaemonClientV2 { ); } + // ============================================================================ + // Terminals + // ============================================================================ + + async listTerminals( + cwd: string, + requestId?: string + ): Promise { + const resolvedRequestId = this.createRequestId(requestId); + const message = SessionInboundMessageSchema.parse({ + type: "list_terminals_request", + cwd, + requestId: resolvedRequestId, + }); + const response = this.waitFor( + (msg) => { + if (msg.type !== "list_terminals_response") { + return null; + } + if (msg.payload.requestId !== resolvedRequestId) { + return null; + } + return msg.payload; + }, + 10000, + { skipQueue: true } + ); + this.sendSessionMessage(message); + return response; + } + + async createTerminal( + cwd: string, + name?: string, + requestId?: string + ): Promise { + const resolvedRequestId = this.createRequestId(requestId); + const message = SessionInboundMessageSchema.parse({ + type: "create_terminal_request", + cwd, + name, + requestId: resolvedRequestId, + }); + const response = this.waitFor( + (msg) => { + if (msg.type !== "create_terminal_response") { + return null; + } + if (msg.payload.requestId !== resolvedRequestId) { + return null; + } + return msg.payload; + }, + 10000, + { skipQueue: true } + ); + this.sendSessionMessage(message); + return response; + } + + async subscribeTerminal( + terminalId: string, + requestId?: string + ): Promise { + const resolvedRequestId = this.createRequestId(requestId); + const message = SessionInboundMessageSchema.parse({ + type: "subscribe_terminal_request", + terminalId, + requestId: resolvedRequestId, + }); + const response = this.waitFor( + (msg) => { + if (msg.type !== "subscribe_terminal_response") { + return null; + } + if (msg.payload.requestId !== resolvedRequestId) { + return null; + } + return msg.payload; + }, + 10000, + { skipQueue: true } + ); + this.sendSessionMessage(message); + return response; + } + + unsubscribeTerminal(terminalId: string): void { + this.sendSessionMessage({ + type: "unsubscribe_terminal_request", + terminalId, + }); + } + + sendTerminalInput( + terminalId: string, + message: TerminalInput["message"] + ): void { + this.sendSessionMessage({ + type: "terminal_input", + terminalId, + message, + }); + } + + async killTerminal( + terminalId: string, + requestId?: string + ): Promise { + const resolvedRequestId = this.createRequestId(requestId); + const message = SessionInboundMessageSchema.parse({ + type: "kill_terminal_request", + terminalId, + requestId: resolvedRequestId, + }); + const response = this.waitFor( + (msg) => { + if (msg.type !== "kill_terminal_response") { + return null; + } + if (msg.payload.requestId !== resolvedRequestId) { + return null; + } + return msg.payload; + }, + 10000, + { skipQueue: true } + ); + this.sendSessionMessage(message); + return response; + } + + async waitForTerminalOutput( + terminalId: string, + timeout = 5000 + ): Promise { + return this.waitFor( + (msg) => { + if (msg.type !== "terminal_output") { + return null; + } + if (msg.payload.terminalId !== terminalId) { + return null; + } + return msg.payload; + }, + timeout, + { skipQueue: true } + ); + } + // ============================================================================ // Internals // ============================================================================ diff --git a/packages/server/src/server/agent/agent-mcp.e2e.test.ts b/packages/server/src/server/agent/agent-mcp.e2e.test.ts index fb1b65266..4e916f922 100644 --- a/packages/server/src/server/agent/agent-mcp.e2e.test.ts +++ b/packages/server/src/server/agent/agent-mcp.e2e.test.ts @@ -91,17 +91,6 @@ describe("agent MCP end-to-end", () => { const staticDir = await mkdtemp(path.join(os.tmpdir(), "paseo-static-")); const agentCwd = await mkdtemp(path.join(os.tmpdir(), "paseo-agent-cwd-")); const port = await getAvailablePort(); - const basicUsers = { test: "pass" }; - const [agentMcpUser, agentMcpPassword] = - Object.entries(basicUsers)[0] ?? []; - const agentMcpAuthHeader = - agentMcpUser && agentMcpPassword - ? `Basic ${Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64")}` - : undefined; - const agentMcpBearerToken = - agentMcpUser && agentMcpPassword - ? Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64") - : undefined; const daemonConfig: PaseoDaemonConfig = { listen: `${port}`, @@ -109,21 +98,12 @@ describe("agent MCP end-to-end", () => { corsAllowedOrigins: [], agentMcpRoute: "/mcp/agents", agentMcpAllowedHosts: [`127.0.0.1:${port}`, `localhost:${port}`], - auth: { - basicUsers, - agentMcpAuthHeader, - agentMcpBearerToken, - realm: "Voice Assistant", - }, staticDir, mcpDebug: false, agentClients: {}, agentRegistryPath: path.join(paseoHome, "agents.json"), agentControlMcp: { url: `http://127.0.0.1:${port}/mcp/agents`, - ...(agentMcpAuthHeader - ? { headers: { Authorization: agentMcpAuthHeader } } - : {}), }, }; @@ -140,10 +120,7 @@ describe("agent MCP end-to-end", () => { await daemon.start(); const transport = new StreamableHTTPClientTransport( - new URL(`http://127.0.0.1:${port}/mcp/agents`), - agentMcpAuthHeader - ? { requestInit: { headers: { Authorization: agentMcpAuthHeader } } } - : undefined + new URL(`http://127.0.0.1:${port}/mcp/agents`) ); const client = (await experimental_createMCPClient({ transport, @@ -247,17 +224,6 @@ describe("agent MCP end-to-end", () => { const staticDir = await mkdtemp(path.join(os.tmpdir(), "paseo-static-")); const agentCwd = await mkdtemp(path.join(os.tmpdir(), "paseo-agent-cwd-")); const port = await getAvailablePort(); - const basicUsers = { test: "pass" }; - const [agentMcpUser, agentMcpPassword] = - Object.entries(basicUsers)[0] ?? []; - const agentMcpAuthHeader = - agentMcpUser && agentMcpPassword - ? `Basic ${Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64")}` - : undefined; - const agentMcpBearerToken = - agentMcpUser && agentMcpPassword - ? Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64") - : undefined; const daemonConfig: PaseoDaemonConfig = { listen: `${port}`, @@ -265,21 +231,12 @@ describe("agent MCP end-to-end", () => { corsAllowedOrigins: [], agentMcpRoute: "/mcp/agents", agentMcpAllowedHosts: [`127.0.0.1:${port}`, `localhost:${port}`], - auth: { - basicUsers, - agentMcpAuthHeader, - agentMcpBearerToken, - realm: "Voice Assistant", - }, staticDir, mcpDebug: false, agentClients: {}, agentRegistryPath: path.join(paseoHome, "agents.json"), agentControlMcp: { url: `http://127.0.0.1:${port}/mcp/agents`, - ...(agentMcpAuthHeader - ? { headers: { Authorization: agentMcpAuthHeader } } - : {}), }, }; @@ -296,10 +253,7 @@ describe("agent MCP end-to-end", () => { await daemon.start(); const transport = new StreamableHTTPClientTransport( - new URL(`http://127.0.0.1:${port}/mcp/agents`), - agentMcpAuthHeader - ? { requestInit: { headers: { Authorization: agentMcpAuthHeader } } } - : undefined + new URL(`http://127.0.0.1:${port}/mcp/agents`) ); const client = (await experimental_createMCPClient({ transport, diff --git a/packages/server/src/server/bootstrap.ts b/packages/server/src/server/bootstrap.ts index 07e498135..993ca4b14 100644 --- a/packages/server/src/server/bootstrap.ts +++ b/packages/server/src/server/bootstrap.ts @@ -1,5 +1,4 @@ import express from "express"; -import basicAuth from "express-basic-auth"; import { createServer as createHTTPServer } from "http"; import { createReadStream, unlinkSync, existsSync } from "fs"; import { stat } from "fs/promises"; @@ -49,6 +48,7 @@ import { initializeTitleGenerator } from "../services/agent-title-generator.js"; import { attachAgentRegistryPersistence } from "./persistence-hooks.js"; import { createAgentMcpServer } from "./agent/mcp-server.js"; import { createAllClients, shutdownProviders } from "./agent/provider-registry.js"; +import { createTerminalManager, type TerminalManager } from "../terminal/terminal-manager.js"; import type { AgentClient, AgentControlMcpConfig, @@ -57,13 +57,6 @@ import type { type AgentMcpTransportMap = Map; -export type PaseoAuthConfig = { - basicUsers: Record; - realm?: string; - agentMcpBearerToken?: string; - agentMcpAuthHeader?: string; -}; - export type PaseoOpenAIConfig = { apiKey?: string; stt?: Partial & { apiKey?: string }; @@ -76,7 +69,6 @@ export type PaseoDaemonConfig = { corsAllowedOrigins: string[]; agentMcpRoute: string; agentMcpAllowedHosts: string[]; - auth: PaseoAuthConfig; staticDir: string; mcpDebug: boolean; agentClients: Partial>; @@ -90,6 +82,7 @@ export interface PaseoDaemon { config: PaseoDaemonConfig; agentManager: AgentManager; agentRegistry: AgentRegistry; + terminalManager: TerminalManager; start(): Promise; stop(): Promise; } @@ -101,13 +94,9 @@ export async function createPaseoDaemon( const logger = rootLogger.child({ module: "bootstrap" }); const agentMcpRoute = config.agentMcpRoute; - const basicAuthUsers = config.auth.basicUsers; const staticDir = config.staticDir; - const authRealm = config.auth.realm ?? "Voice Assistant"; const downloadTokenTtlMs = config.downloadTokenTtlMs ?? 60000; - const agentMcpBearerToken = config.auth.agentMcpBearerToken; - const downloadTokenStore = new DownloadTokenStore({ ttlMs: downloadTokenTtlMs }); const listenTarget = parseListenString(config.listen); @@ -142,31 +131,9 @@ export async function createPaseoDaemon( next(); }); - // Serve static files from public directory (no auth required for APK downloads) + // Serve static files from public directory app.use("/public", express.static(staticDir)); - // Basic authentication (skip for /public routes) - const basicAuthMiddleware = basicAuth({ - users: basicAuthUsers, - challenge: true, - realm: authRealm, - }); - app.use((req, res, next) => { - if (req.path === "/api/files/download") { - return next(); - } - if (agentMcpBearerToken && req.path.startsWith(agentMcpRoute)) { - const authHeader = req.header("authorization") ?? ""; - if (authHeader.startsWith("Bearer ")) { - const token = authHeader.slice("Bearer ".length).trim(); - if (token === agentMcpBearerToken) { - return next(); - } - } - } - return basicAuthMiddleware(req, res, next); - }); - // Middleware app.use(express.json()); @@ -260,6 +227,8 @@ export async function createPaseoDaemon( logger, }); + const terminalManager = createTerminalManager(); + attachAgentRegistryPersistence(logger, agentManager, agentRegistry); const persistedRecords = await agentRegistry.list(); logger.info( @@ -425,7 +394,8 @@ export async function createPaseoDaemon( agentMcpHeaders: config.agentControlMcp.headers, }, { allowedOrigins }, - { stt: sttService, tts: ttsService } + { stt: sttService, tts: ttsService }, + terminalManager ); const start = async () => { @@ -464,6 +434,7 @@ export async function createPaseoDaemon( const stop = async () => { await closeAllAgents(logger, agentManager); await shutdownProviders(logger); + terminalManager.killAll(); await wsServer.close(); await new Promise((resolve) => { httpServer.close(() => resolve()); @@ -478,6 +449,7 @@ export async function createPaseoDaemon( config, agentManager, agentRegistry, + terminalManager, start, stop, }; diff --git a/packages/server/src/server/client-activity.e2e.test.ts b/packages/server/src/server/client-activity.e2e.test.ts index 24845be05..c6f37d022 100644 --- a/packages/server/src/server/client-activity.e2e.test.ts +++ b/packages/server/src/server/client-activity.e2e.test.ts @@ -49,7 +49,6 @@ describe("client activity tracking", () => { async function createClient(): Promise { const client = new DaemonClient({ url: `ws://127.0.0.1:${daemon.port}/ws`, - authHeader: daemon.agentMcpAuthHeader, messageQueueLimit: null, }); await client.connect(); diff --git a/packages/server/src/server/config.ts b/packages/server/src/server/config.ts index 3e1dbe298..b76babf1b 100644 --- a/packages/server/src/server/config.ts +++ b/packages/server/src/server/config.ts @@ -6,7 +6,6 @@ import type { TTSConfig } from "./agent/tts-openai.js"; import { loadPersistedConfig } from "./persisted-config.js"; const DEFAULT_LISTEN = "127.0.0.1:6767"; -const DEFAULT_BASIC_AUTH_USERS = { mo: "bo" } as const; const DEFAULT_AGENT_MCP_ROUTE = "/mcp/agents"; function parseOpenAIConfig(env: NodeJS.ProcessEnv) { @@ -68,17 +67,6 @@ export function loadConfig( const listen = env.PASEO_LISTEN ?? persisted.listen ?? DEFAULT_LISTEN; const mcpListen = getListenForMcp(listen); - const basicUsers = DEFAULT_BASIC_AUTH_USERS; - const [agentMcpUser, agentMcpPassword] = Object.entries(basicUsers)[0] ?? []; - const agentMcpAuthHeader = - agentMcpUser && agentMcpPassword - ? `Basic ${Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64")}` - : undefined; - const agentMcpBearerToken = - agentMcpUser && agentMcpPassword - ? Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64") - : undefined; - const envCorsOrigins = env.PASEO_CORS_ORIGINS ? env.PASEO_CORS_ORIGINS.split(",").map((s) => s.trim()) : []; @@ -89,18 +77,9 @@ export function loadConfig( corsAllowedOrigins: [...persisted.cors.allowedOrigins, ...envCorsOrigins], agentMcpRoute: DEFAULT_AGENT_MCP_ROUTE, agentMcpAllowedHosts: [mcpListen, `localhost:${mcpListen.split(":")[1]}`], - auth: { - basicUsers, - agentMcpAuthHeader, - agentMcpBearerToken, - realm: "Voice Assistant", - }, mcpDebug: env.MCP_DEBUG === "1", agentControlMcp: { url: `http://${mcpListen}${DEFAULT_AGENT_MCP_ROUTE}`, - ...(agentMcpAuthHeader - ? { headers: { Authorization: agentMcpAuthHeader } } - : {}), }, agentRegistryPath: path.join(paseoHome, "agents.json"), staticDir: "public", diff --git a/packages/server/src/server/daemon-client-v2.e2e.test.ts b/packages/server/src/server/daemon-client-v2.e2e.test.ts index 6735b3a90..9eb4bfce0 100644 --- a/packages/server/src/server/daemon-client-v2.e2e.test.ts +++ b/packages/server/src/server/daemon-client-v2.e2e.test.ts @@ -9,6 +9,7 @@ import { createDaemonTestContext, type DaemonTestContext, } from "./test-utils/index.js"; +import { getFullAccessConfig, getAskModeConfig } from "./daemon-e2e/agent-configs.js"; const defaultEnvPath = path.resolve(process.cwd(), ".env"); const fallbackEnvPath = path.resolve(process.cwd(), "packages", "server", ".env"); @@ -26,10 +27,6 @@ function tmpCwd(): string { return mkdtempSync(path.join(tmpdir(), "daemon-client-v2-")); } -// Use gpt-5.1-codex-mini with low reasoning effort for faster test execution -const CODEX_TEST_MODEL = "gpt-5.1-codex-mini"; -const CODEX_TEST_REASONING_EFFORT = "low"; - function waitForSignal( timeoutMs: number, setup: ( @@ -155,9 +152,7 @@ describe("daemon client v2 E2E", () => { }); const agent = await ctx.client.createAgent({ - provider: "codex", model: CODEX_TEST_MODEL, reasoningEffort: CODEX_TEST_REASONING_EFFORT, - model: CODEX_TEST_MODEL, - reasoningEffort: CODEX_TEST_REASONING_EFFORT, + ...getFullAccessConfig("codex"), cwd, title: "Daemon Client V2", requestId: createRequestId, @@ -198,9 +193,7 @@ describe("daemon client v2 E2E", () => { }); const failResult = await ctx.client.createAgentExpectFail({ - provider: "codex", model: CODEX_TEST_MODEL, reasoningEffort: CODEX_TEST_REASONING_EFFORT, - model: CODEX_TEST_MODEL, - reasoningEffort: CODEX_TEST_REASONING_EFFORT, + ...getFullAccessConfig("codex"), cwd: "/this/path/does/not/exist/12345", title: "Should Fail", requestId: failRequestId, @@ -409,12 +402,9 @@ describe("daemon client v2 E2E", () => { const filePath = path.join(cwd, "permission.txt"); const agent = await ctx.client.createAgent({ - provider: "codex", model: CODEX_TEST_MODEL, reasoningEffort: CODEX_TEST_REASONING_EFFORT, - model: CODEX_TEST_MODEL, - reasoningEffort: CODEX_TEST_REASONING_EFFORT, + ...getAskModeConfig("codex"), cwd, title: "Permission Test", - modeId: "auto", }); const permissionRequestPromise = waitForSignal(60000, (resolve) => { @@ -485,9 +475,7 @@ describe("daemon client v2 E2E", () => { async () => { const cwd = tmpCwd(); const agent = await ctx.client.createAgent({ - provider: "codex", model: CODEX_TEST_MODEL, reasoningEffort: CODEX_TEST_REASONING_EFFORT, - model: CODEX_TEST_MODEL, - reasoningEffort: CODEX_TEST_REASONING_EFFORT, + ...getFullAccessConfig("codex"), cwd, title: "Raw Events Test", }); @@ -668,9 +656,7 @@ describe("daemon client v2 E2E", () => { writeFileSync(downloadFile, downloadContents, "utf-8"); const agent = await ctx.client.createAgent({ - provider: "codex", model: CODEX_TEST_MODEL, reasoningEffort: CODEX_TEST_REASONING_EFFORT, - model: CODEX_TEST_MODEL, - reasoningEffort: CODEX_TEST_REASONING_EFFORT, + ...getFullAccessConfig("codex"), cwd, title: "Git/File Test", }); @@ -871,12 +857,8 @@ describe("daemon client v2 E2E", () => { expect(tokenMessage.payload.agentId).toBe(agent.id); expect(tokenMessage.payload.requestId).toBe(tokenRequestId); - const authHeader = ctx.daemon.agentMcpAuthHeader; - expect(authHeader).toBeTruthy(); - const response = await fetch( - `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}`, - { headers: { Authorization: authHeader! } } + `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}` ); expect(response.status).toBe(200); diff --git a/packages/server/src/server/daemon-e2e/file-download.e2e.test.ts b/packages/server/src/server/daemon-e2e/file-download.e2e.test.ts index b94128e96..d2c34b97c 100644 --- a/packages/server/src/server/daemon-e2e/file-download.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/file-download.e2e.test.ts @@ -54,12 +54,8 @@ describe("daemon E2E", () => { expect(tokenResponse.token).toBeTruthy(); expect(tokenResponse.fileName).toBe("download.txt"); - const authHeader = ctx.daemon.agentMcpAuthHeader; - expect(authHeader).toBeTruthy(); - const response = await fetch( - `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}`, - { headers: { Authorization: authHeader! } } + `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}` ); expect(response.status).toBe(200); @@ -80,12 +76,8 @@ describe("daemon E2E", () => { test( "rejects invalid token", async () => { - const authHeader = ctx.daemon.agentMcpAuthHeader; - expect(authHeader).toBeTruthy(); - const response = await fetch( - `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=invalid-token`, - { headers: { Authorization: authHeader! } } + `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=invalid-token` ); expect(response.status).toBe(403); @@ -119,12 +111,8 @@ describe("daemon E2E", () => { await new Promise((resolve) => setTimeout(resolve, 150)); - const authHeader = ctx.daemon.agentMcpAuthHeader; - expect(authHeader).toBeTruthy(); - const response = await fetch( - `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}`, - { headers: { Authorization: authHeader! } } + `http://127.0.0.1:${ctx.daemon.port}/api/files/download?token=${tokenResponse.token}` ); expect(response.status).toBe(403); diff --git a/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts b/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts new file mode 100644 index 000000000..da04265f7 --- /dev/null +++ b/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts @@ -0,0 +1,232 @@ +import { describe, test, expect, beforeEach, afterEach } from "vitest"; +import { mkdtempSync, rmSync } from "fs"; +import { tmpdir } from "os"; +import path from "path"; +import { + createDaemonTestContext, + type DaemonTestContext, +} from "../test-utils/index.js"; + +function tmpCwd(): string { + return mkdtempSync(path.join(tmpdir(), "daemon-terminal-e2e-")); +} + +describe("daemon E2E terminal", () => { + let ctx: DaemonTestContext; + + beforeEach(async () => { + ctx = await createDaemonTestContext(); + }); + + afterEach(async () => { + await ctx.cleanup(); + }, 60000); + + test( + "lists terminals for a directory (auto-creates first)", + async () => { + const cwd = tmpCwd(); + + const result = await ctx.client.listTerminals(cwd); + + expect(result.cwd).toBe(cwd); + expect(result.terminals).toHaveLength(1); + expect(result.terminals[0].name).toBe("Terminal 1"); + expect(result.terminals[0].id).toBeTruthy(); + + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); + + test( + "creates additional terminal with custom name", + async () => { + const cwd = tmpCwd(); + + // First call auto-creates Terminal 1 + await ctx.client.listTerminals(cwd); + + // Create a second terminal with custom name + const result = await ctx.client.createTerminal(cwd, "Dev Server"); + + expect(result.error).toBeNull(); + expect(result.terminal).toBeTruthy(); + expect(result.terminal!.name).toBe("Dev Server"); + expect(result.terminal!.cwd).toBe(cwd); + + // Verify list now shows two terminals + const list = await ctx.client.listTerminals(cwd); + expect(list.terminals).toHaveLength(2); + + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); + + test( + "subscribes to terminal and receives state", + async () => { + const cwd = tmpCwd(); + + // Get terminal (auto-creates) + const list = await ctx.client.listTerminals(cwd); + const terminalId = list.terminals[0].id; + + // Subscribe to terminal + const subscribeResult = await ctx.client.subscribeTerminal(terminalId); + + expect(subscribeResult.error).toBeNull(); + expect(subscribeResult.terminalId).toBe(terminalId); + expect(subscribeResult.state).toBeTruthy(); + expect(subscribeResult.state!.rows).toBeGreaterThan(0); + expect(subscribeResult.state!.cols).toBeGreaterThan(0); + expect(subscribeResult.state!.grid).toBeTruthy(); + expect(subscribeResult.state!.cursor).toBeTruthy(); + + // Unsubscribe + ctx.client.unsubscribeTerminal(terminalId); + + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); + + test( + "sends input to terminal and receives output", + async () => { + const cwd = tmpCwd(); + + // Get terminal + const list = await ctx.client.listTerminals(cwd); + const terminalId = list.terminals[0].id; + + // Subscribe to terminal + await ctx.client.subscribeTerminal(terminalId); + + // Send input + ctx.client.sendTerminalInput(terminalId, { type: "input", data: "echo hello\r" }); + + // Wait for output containing "hello" - may need multiple updates + let foundHello = false; + const start = Date.now(); + const timeout = 10000; + + while (!foundHello && Date.now() - start < timeout) { + try { + const output = await ctx.client.waitForTerminalOutput(terminalId, 2000); + expect(output.terminalId).toBe(terminalId); + expect(output.state).toBeTruthy(); + + // Extract text from grid + const gridText = output.state.grid + .map((row) => row.map((cell) => cell.char).join("").trimEnd()) + .filter((line) => line.length > 0) + .join("\n"); + + if (gridText.includes("hello")) { + foundHello = true; + } + } catch { + // Timeout waiting for output, try again + } + } + + expect(foundHello).toBe(true); + + // Cleanup + ctx.client.unsubscribeTerminal(terminalId); + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); + + test( + "kills terminal", + async () => { + const cwd = tmpCwd(); + + // Create terminal + const createResult = await ctx.client.createTerminal(cwd, "To Kill"); + expect(createResult.terminal).toBeTruthy(); + const terminalId = createResult.terminal!.id; + + // Kill terminal + const killResult = await ctx.client.killTerminal(terminalId); + expect(killResult.success).toBe(true); + expect(killResult.terminalId).toBe(terminalId); + + // Verify terminal is gone by trying to subscribe + const subscribeResult = await ctx.client.subscribeTerminal(terminalId); + expect(subscribeResult.error).toBe("Terminal not found"); + + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); + + test( + "returns error for relative path", + async () => { + // Try to list terminals with relative path + const list = await ctx.client.listTerminals("relative/path"); + + // Should return empty terminals (error case) + expect(list.terminals).toHaveLength(0); + }, + 30000 + ); + + test( + "preserves color mode in terminal output (fgMode/bgMode)", + async () => { + const cwd = tmpCwd(); + + // Get terminal + const list = await ctx.client.listTerminals(cwd); + const terminalId = list.terminals[0].id; + + // Subscribe to terminal + await ctx.client.subscribeTerminal(terminalId); + + // Send printf with ANSI red color (mode 1) + ctx.client.sendTerminalInput(terminalId, { + type: "input", + data: "printf '\\033[31mRED\\033[0m\\n'\r", + }); + + // Wait for output with colored text + let foundColoredCell = false; + const start = Date.now(); + const timeout = 10000; + + while (!foundColoredCell && Date.now() - start < timeout) { + try { + const output = await ctx.client.waitForTerminalOutput(terminalId, 2000); + + // Look for a cell with fgMode set + for (const row of output.state.grid) { + for (const cell of row) { + if (cell.fgMode !== undefined && cell.fgMode > 0) { + foundColoredCell = true; + // Verify the mode is correct (1 = 16 ANSI colors) + expect(cell.fgMode).toBe(1); + expect(cell.fg).toBe(1); // ANSI red + break; + } + } + if (foundColoredCell) break; + } + } catch { + // Timeout waiting for output, try again + } + } + + expect(foundColoredCell).toBe(true); + + ctx.client.unsubscribeTerminal(terminalId); + rmSync(cwd, { recursive: true, force: true }); + }, + 30000 + ); +}); diff --git a/packages/server/src/server/index.ts b/packages/server/src/server/index.ts index 596be907a..e23ca7ced 100644 --- a/packages/server/src/server/index.ts +++ b/packages/server/src/server/index.ts @@ -19,8 +19,14 @@ async function main() { await daemon.start(); + let shuttingDown = false; const handleShutdown = async (signal: string) => { - logger.info(`${signal} received, shutting down gracefully...`); + if (shuttingDown) { + logger.info("Forcing exit..."); + process.exit(1); + } + shuttingDown = true; + logger.info(`${signal} received, shutting down gracefully... (press Ctrl+C again to force exit)`); const forceExit = setTimeout(() => { logger.warn("Forcing shutdown - HTTP server didn't close in time"); diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index 3cd86cbe5..a41d1bb4d 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -19,7 +19,14 @@ import { type FileExplorerRequest, type FileDownloadTokenRequest, type GitSetupOptions, + type ListTerminalsRequest, + type CreateTerminalRequest, + type SubscribeTerminalRequest, + type UnsubscribeTerminalRequest, + type TerminalInput, + type KillTerminalRequest, } from "./messages.js"; +import type { TerminalManager } from "../terminal/terminal-manager.js"; import { parseAndHighlightDiff, type ParsedDiffFile } from "./utils/diff-highlighter.js"; import { getSystemPrompt } from "./agent/system-prompt.js"; import { getAllTools } from "./agent/llm-openai.js"; @@ -252,6 +259,8 @@ export class Session { lastActivityAt: Date; appVisible: boolean; } | null = null; + private readonly terminalManager: TerminalManager | null; + private terminalSubscriptions: Map void> = new Map(); constructor( clientId: string, @@ -264,6 +273,7 @@ export class Session { agentMcpConfig: AgentMcpClientConfig, stt: OpenAISTT | null, tts: OpenAITTS | null, + terminalManager: TerminalManager | null, options?: { conversationId?: string; initialMessages?: ModelMessage[]; @@ -277,6 +287,7 @@ export class Session { this.agentManager = agentManager; this.agentRegistry = agentRegistry; this.agentMcpConfig = agentMcpConfig; + this.terminalManager = terminalManager; this.abortController = new AbortController(); this.sessionLogger = logger.child({ module: "session", @@ -777,8 +788,8 @@ export class Session { ); break; - case "send_agent_audio": - await this.handleSendAgentAudio(msg); + case "transcribe_audio_request": + await this.handleTranscribeAudio(msg); break; case "create_agent_request": @@ -856,6 +867,30 @@ export class Session { case "register_push_token": this.handleRegisterPushToken(msg.token); break; + + case "list_terminals_request": + await this.handleListTerminalsRequest(msg); + break; + + case "create_terminal_request": + await this.handleCreateTerminalRequest(msg); + break; + + case "subscribe_terminal_request": + await this.handleSubscribeTerminalRequest(msg); + break; + + case "unsubscribe_terminal_request": + this.handleUnsubscribeTerminalRequest(msg); + break; + + case "terminal_input": + this.handleTerminalInput(msg); + break; + + case "kill_terminal_request": + await this.handleKillTerminalRequest(msg); + break; } } catch (error: any) { this.sessionLogger.error( @@ -1112,65 +1147,28 @@ export class Session { } /** - * Handle audio message to agent (transcribe then send) + * Handle audio transcription request */ - private async handleSendAgentAudio( - msg: Extract + private async handleTranscribeAudio( + msg: Extract ): Promise { - const { agentId, audio, format, isLast, requestId, mode } = msg; - const shouldAutoRun = mode === "auto_run"; + const { audio, format, requestId } = msg; - // agentId is required for auto_run mode - if (shouldAutoRun && !agentId) { - this.sessionLogger.error("agentId is required for auto_run mode"); - return; - } - - // Use placeholder for logging when agentId is not provided - const logAgentId = agentId ?? "transcription"; - - // Decode base64 const audioBuffer = Buffer.from(audio, "base64"); - // For now, we'll process each audio segment immediately - // In the future, we might want to buffer chunks similar to realtime audio - if (!isLast) { - this.sessionLogger.debug( - { agentId: logAgentId }, - `Buffering agent audio chunk for agent ${logAgentId}` - ); - // TODO: Implement buffering if needed - return; - } - - this.sessionLogger.debug( - { agentId: logAgentId }, - `Transcribing audio for agent ${logAgentId}` - ); + this.sessionLogger.debug({ requestId }, "Transcribing audio"); try { - // Transcribe the audio const result = await this.sttManager.transcribe(audioBuffer, format, { - agentId: logAgentId, requestId, - label: shouldAutoRun ? "dictation:auto_run" : "dictation", + label: "dictation", }); - const transcriptText = result.text.trim(); - if (!transcriptText) { - this.sessionLogger.debug( - { agentId: logAgentId }, - `Empty transcription for agent ${logAgentId}, ignoring` - ); - return; - } - this.sessionLogger.info( - { agentId: logAgentId, transcriptText }, - `Transcribed audio for agent ${logAgentId}` + { requestId, textLength: result.text.length }, + "Transcription complete" ); - // Emit transcription result to client with requestId this.emit({ type: "transcription_result", payload: { @@ -1185,67 +1183,15 @@ export class Session { debugRecordingPath: result.debugRecordingPath, }, }); - - if (!shouldAutoRun) { - this.sessionLogger.info( - { agentId: logAgentId, requestId }, - `Completed transcription for agent ${logAgentId} (requestId: ${requestId})` - ); - return; - } - - // At this point, agentId is guaranteed to be defined (validated at function start) - const validAgentId = agentId!; - - try { - await this.ensureAgentLoaded(validAgentId); - } catch (error) { - this.handleAgentRunError( - validAgentId, - error, - "Failed to initialize agent before sending audio prompt" - ); - return; - } - - try { - await this.interruptAgentIfRunning(validAgentId); - } catch (error) { - this.handleAgentRunError( - validAgentId, - error, - "Failed to interrupt running agent before sending audio prompt" - ); - return; - } - - try { - this.agentManager.recordUserMessage(validAgentId, transcriptText); - } catch (recordError) { - this.sessionLogger.error( - { err: recordError, agentId: validAgentId }, - `Failed to record transcribed user message for agent ${validAgentId}` - ); - } - - // Send transcribed text to agent - this.startAgentStream(validAgentId, transcriptText); - this.sessionLogger.info( - { agentId: validAgentId }, - `Sent transcribed text to agent ${validAgentId}` - ); } catch (error: any) { - this.sessionLogger.error( - { err: error, agentId: logAgentId }, - `Failed to process audio for agent ${logAgentId}` - ); + this.sessionLogger.error({ err: error, requestId }, "Transcription failed"); this.emit({ type: "activity_log", payload: { id: uuidv4(), timestamp: new Date(), type: "error", - content: `Failed to process audio for agent: ${error.message}`, + content: `Transcription failed: ${error.message}`, }, }); throw error; @@ -3493,5 +3439,202 @@ export class Session { this.agentTools = null; } + // Unsubscribe from all terminals + for (const unsubscribe of this.terminalSubscriptions.values()) { + unsubscribe(); + } + this.terminalSubscriptions.clear(); + } + + // ============================================================================ + // Terminal Handlers + // ============================================================================ + + private async handleListTerminalsRequest(msg: ListTerminalsRequest): Promise { + if (!this.terminalManager) { + this.emit({ + type: "list_terminals_response", + payload: { + cwd: msg.cwd, + terminals: [], + requestId: msg.requestId, + }, + }); + return; + } + + try { + const terminals = await this.terminalManager.getTerminals(msg.cwd); + this.emit({ + type: "list_terminals_response", + payload: { + cwd: msg.cwd, + terminals: terminals.map((t) => ({ id: t.id, name: t.name })), + requestId: msg.requestId, + }, + }); + } catch (error: any) { + this.sessionLogger.error({ err: error, cwd: msg.cwd }, "Failed to list terminals"); + this.emit({ + type: "list_terminals_response", + payload: { + cwd: msg.cwd, + terminals: [], + requestId: msg.requestId, + }, + }); + } + } + + private async handleCreateTerminalRequest(msg: CreateTerminalRequest): Promise { + if (!this.terminalManager) { + this.emit({ + type: "create_terminal_response", + payload: { + terminal: null, + error: "Terminal manager not available", + requestId: msg.requestId, + }, + }); + return; + } + + try { + const session = await this.terminalManager.createTerminal({ + cwd: msg.cwd, + name: msg.name, + }); + this.emit({ + type: "create_terminal_response", + payload: { + terminal: { id: session.id, name: session.name, cwd: session.cwd }, + error: null, + requestId: msg.requestId, + }, + }); + } catch (error: any) { + this.sessionLogger.error({ err: error, cwd: msg.cwd }, "Failed to create terminal"); + this.emit({ + type: "create_terminal_response", + payload: { + terminal: null, + error: error.message, + requestId: msg.requestId, + }, + }); + } + } + + private async handleSubscribeTerminalRequest(msg: SubscribeTerminalRequest): Promise { + if (!this.terminalManager) { + this.emit({ + type: "subscribe_terminal_response", + payload: { + terminalId: msg.terminalId, + state: null, + error: "Terminal manager not available", + requestId: msg.requestId, + }, + }); + return; + } + + const session = this.terminalManager.getTerminal(msg.terminalId); + if (!session) { + this.emit({ + type: "subscribe_terminal_response", + payload: { + terminalId: msg.terminalId, + state: null, + error: "Terminal not found", + requestId: msg.requestId, + }, + }); + return; + } + + // Unsubscribe from previous subscription if any + const existing = this.terminalSubscriptions.get(msg.terminalId); + if (existing) { + existing(); + } + + // Subscribe to terminal updates + const unsubscribe = session.subscribe((serverMsg) => { + if (serverMsg.type === "full") { + this.emit({ + type: "terminal_output", + payload: { + terminalId: msg.terminalId, + state: serverMsg.state, + }, + }); + } + }); + this.terminalSubscriptions.set(msg.terminalId, unsubscribe); + + // Send initial state + this.emit({ + type: "subscribe_terminal_response", + payload: { + terminalId: msg.terminalId, + state: session.getState(), + error: null, + requestId: msg.requestId, + }, + }); + } + + private handleUnsubscribeTerminalRequest(msg: UnsubscribeTerminalRequest): void { + const unsubscribe = this.terminalSubscriptions.get(msg.terminalId); + if (unsubscribe) { + unsubscribe(); + this.terminalSubscriptions.delete(msg.terminalId); + } + } + + private handleTerminalInput(msg: TerminalInput): void { + if (!this.terminalManager) { + return; + } + + const session = this.terminalManager.getTerminal(msg.terminalId); + if (!session) { + this.sessionLogger.warn({ terminalId: msg.terminalId }, "Terminal not found for input"); + return; + } + + session.send(msg.message); + } + + private async handleKillTerminalRequest(msg: KillTerminalRequest): Promise { + if (!this.terminalManager) { + this.emit({ + type: "kill_terminal_response", + payload: { + terminalId: msg.terminalId, + success: false, + requestId: msg.requestId, + }, + }); + return; + } + + // Unsubscribe first + const unsubscribe = this.terminalSubscriptions.get(msg.terminalId); + if (unsubscribe) { + unsubscribe(); + this.terminalSubscriptions.delete(msg.terminalId); + } + + this.terminalManager.killTerminal(msg.terminalId); + this.emit({ + type: "kill_terminal_response", + payload: { + terminalId: msg.terminalId, + success: true, + requestId: msg.requestId, + }, + }); } } diff --git a/packages/server/src/server/test-utils/daemon-test-context.ts b/packages/server/src/server/test-utils/daemon-test-context.ts index 16db24ce3..714745162 100644 --- a/packages/server/src/server/test-utils/daemon-test-context.ts +++ b/packages/server/src/server/test-utils/daemon-test-context.ts @@ -37,7 +37,6 @@ export async function createDaemonTestContext( const daemon = await createTestPaseoDaemon(options); const client = new DaemonClient({ url: `ws://127.0.0.1:${daemon.port}/ws`, - authHeader: daemon.agentMcpAuthHeader, }); await client.connect(); diff --git a/packages/server/src/server/test-utils/paseo-daemon.ts b/packages/server/src/server/test-utils/paseo-daemon.ts index d5d865c3e..6a3b953aa 100644 --- a/packages/server/src/server/test-utils/paseo-daemon.ts +++ b/packages/server/src/server/test-utils/paseo-daemon.ts @@ -7,7 +7,6 @@ import pino from "pino"; import { createPaseoDaemon, type PaseoDaemonConfig } from "../bootstrap.js"; type TestPaseoDaemonOptions = { - basicUsers?: Record; downloadTokenTtlMs?: number; corsAllowedOrigins?: string[]; listen?: string; @@ -19,8 +18,6 @@ export type TestPaseoDaemon = { port: number; paseoHome: string; staticDir: string; - agentMcpAuthHeader?: string; - agentMcpBearerToken?: string; close: () => Promise; }; @@ -42,16 +39,6 @@ async function getAvailablePort(): Promise { export async function createTestPaseoDaemon( options: TestPaseoDaemonOptions = {} ): Promise { - const basicUsers = options.basicUsers ?? { test: "pass" }; - const [agentMcpUser, agentMcpPassword] = Object.entries(basicUsers)[0] ?? []; - const agentMcpAuthHeader = - agentMcpUser && agentMcpPassword - ? `Basic ${Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64")}` - : undefined; - const agentMcpBearerToken = - agentMcpUser && agentMcpPassword - ? Buffer.from(`${agentMcpUser}:${agentMcpPassword}`).toString("base64") - : undefined; const openaiApiKey = process.env.OPENAI_API_KEY; const maxAttempts = 5; let lastError: unknown; @@ -68,21 +55,12 @@ export async function createTestPaseoDaemon( corsAllowedOrigins: options.corsAllowedOrigins ?? [], agentMcpRoute: "/mcp/agents", agentMcpAllowedHosts: [`127.0.0.1:${port}`, `localhost:${port}`, `${listenHost}:${port}`], - auth: { - basicUsers, - agentMcpAuthHeader, - agentMcpBearerToken, - realm: "Voice Assistant", - }, staticDir, mcpDebug: false, agentClients: {}, agentRegistryPath: path.join(paseoHome, "agents.json"), agentControlMcp: { url: `http://127.0.0.1:${port}/mcp/agents`, - ...(agentMcpAuthHeader - ? { headers: { Authorization: agentMcpAuthHeader } } - : {}), }, openai: openaiApiKey ? { apiKey: openaiApiKey } : undefined, downloadTokenTtlMs: options.downloadTokenTtlMs, @@ -106,8 +84,6 @@ export async function createTestPaseoDaemon( port, paseoHome, staticDir, - agentMcpAuthHeader, - agentMcpBearerToken, close, }; } catch (error) { diff --git a/packages/server/src/server/websocket-server.ts b/packages/server/src/server/websocket-server.ts index e30d351af..a9f7364e7 100644 --- a/packages/server/src/server/websocket-server.ts +++ b/packages/server/src/server/websocket-server.ts @@ -18,6 +18,7 @@ import { PushTokenStore } from "./push/token-store.js"; import { PushService } from "./push/push-service.js"; import type { OpenAISTT } from "./agent/stt-openai.js"; import type { OpenAITTS } from "./agent/tts-openai.js"; +import type { TerminalManager } from "../terminal/terminal-manager.js"; import type pino from "pino"; type AgentMcpClientConfig = { @@ -47,6 +48,7 @@ export class VoiceAssistantWebSocketServer { private readonly agentMcpConfig: AgentMcpClientConfig; private readonly stt: OpenAISTT | null; private readonly tts: OpenAITTS | null; + private readonly terminalManager: TerminalManager | null; constructor( server: HTTPServer, @@ -56,7 +58,8 @@ export class VoiceAssistantWebSocketServer { downloadTokenStore: DownloadTokenStore, agentMcpConfig: AgentMcpClientConfig, wsConfig: WebSocketServerConfig, - speech?: { stt: OpenAISTT | null; tts: OpenAITTS | null } + speech?: { stt: OpenAISTT | null; tts: OpenAITTS | null }, + terminalManager?: TerminalManager | null ) { this.logger = logger.child({ module: "websocket-server" }); this.agentManager = agentManager; @@ -64,6 +67,7 @@ export class VoiceAssistantWebSocketServer { this.downloadTokenStore = downloadTokenStore; this.stt = speech?.stt ?? null; this.tts = speech?.tts ?? null; + this.terminalManager = terminalManager ?? null; const pushLogger = this.logger.child({ module: "push" }); this.pushTokenStore = new PushTokenStore(pushLogger); @@ -140,6 +144,7 @@ export class VoiceAssistantWebSocketServer { this.agentMcpConfig, this.stt, this.tts, + this.terminalManager, { conversationId, initialMessages: initialMessages || undefined, diff --git a/packages/server/src/shared/messages.ts b/packages/server/src/shared/messages.ts index f8b67721b..88a681b37 100644 --- a/packages/server/src/shared/messages.ts +++ b/packages/server/src/shared/messages.ts @@ -318,16 +318,11 @@ export const SendAgentMessageSchema = z.object({ })).optional(), }); -export const SendAgentAudioSchema = z.object({ - type: z.literal("send_agent_audio"), - agentId: z.string().optional(), // Required for auto_run mode, optional for transcribe_only +export const TranscribeAudioRequestSchema = z.object({ + type: z.literal("transcribe_audio_request"), audio: z.string(), // base64 encoded format: z.string(), - isLast: z.boolean(), - requestId: z.string(), // Client-provided ID for tracking transcription - mode: z - .enum(["transcribe_only", "auto_run"]) - .optional(), + requestId: z.string(), }); const GitSetupOptionsSchema = z.object({ @@ -528,6 +523,58 @@ export const RegisterPushTokenMessageSchema = z.object({ token: z.string(), }); +// ============================================================================ +// Terminal Messages +// ============================================================================ + +export const ListTerminalsRequestSchema = z.object({ + type: z.literal("list_terminals_request"), + cwd: z.string(), + requestId: z.string(), +}); + +export const CreateTerminalRequestSchema = z.object({ + type: z.literal("create_terminal_request"), + cwd: z.string(), + name: z.string().optional(), + requestId: z.string(), +}); + +export const SubscribeTerminalRequestSchema = z.object({ + type: z.literal("subscribe_terminal_request"), + terminalId: z.string(), + requestId: z.string(), +}); + +export const UnsubscribeTerminalRequestSchema = z.object({ + type: z.literal("unsubscribe_terminal_request"), + terminalId: z.string(), +}); + +const TerminalClientMessageSchema = z.discriminatedUnion("type", [ + z.object({ type: z.literal("input"), data: z.string() }), + z.object({ type: z.literal("resize"), rows: z.number(), cols: z.number() }), + z.object({ + type: z.literal("mouse"), + row: z.number(), + col: z.number(), + button: z.number(), + action: z.enum(["down", "up", "move"]), + }), +]); + +export const TerminalInputSchema = z.object({ + type: z.literal("terminal_input"), + terminalId: z.string(), + message: TerminalClientMessageSchema, +}); + +export const KillTerminalRequestSchema = z.object({ + type: z.literal("kill_terminal_request"), + terminalId: z.string(), + requestId: z.string(), +}); + export const SessionInboundMessageSchema = z.discriminatedUnion("type", [ UserTextMessageSchema, RealtimeAudioChunkMessageSchema, @@ -539,7 +586,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [ DeleteAgentRequestMessageSchema, SetRealtimeModeMessageSchema, SendAgentMessageSchema, - SendAgentAudioSchema, + TranscribeAudioRequestSchema, CreateAgentRequestMessageSchema, ListProviderModelsRequestMessageSchema, ResumeAgentRequestMessageSchema, @@ -558,6 +605,12 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [ ClientHeartbeatMessageSchema, ListCommandsRequestSchema, RegisterPushTokenMessageSchema, + ListTerminalsRequestSchema, + CreateTerminalRequestSchema, + SubscribeTerminalRequestSchema, + UnsubscribeTerminalRequestSchema, + TerminalInputSchema, + KillTerminalRequestSchema, ]); export type SessionInboundMessage = z.infer; @@ -884,6 +937,80 @@ export const ListCommandsResponseSchema = z.object({ }), }); +// ============================================================================ +// Terminal Outbound Messages +// ============================================================================ + +const TerminalInfoSchema = z.object({ + id: z.string(), + name: z.string(), + cwd: z.string(), +}); + +const TerminalCellSchema = z.object({ + char: z.string(), + fg: z.number().optional(), + bg: z.number().optional(), + fgMode: z.number().optional(), + bgMode: z.number().optional(), + bold: z.boolean().optional(), + italic: z.boolean().optional(), + underline: z.boolean().optional(), +}); + +const TerminalStateSchema = z.object({ + rows: z.number(), + cols: z.number(), + grid: z.array(z.array(TerminalCellSchema)), + scrollback: z.array(z.array(TerminalCellSchema)), + cursor: z.object({ row: z.number(), col: z.number() }), +}); + +export const ListTerminalsResponseSchema = z.object({ + type: z.literal("list_terminals_response"), + payload: z.object({ + cwd: z.string(), + terminals: z.array(TerminalInfoSchema.omit({ cwd: true })), + requestId: z.string(), + }), +}); + +export const CreateTerminalResponseSchema = z.object({ + type: z.literal("create_terminal_response"), + payload: z.object({ + terminal: TerminalInfoSchema.nullable(), + error: z.string().nullable(), + requestId: z.string(), + }), +}); + +export const SubscribeTerminalResponseSchema = z.object({ + type: z.literal("subscribe_terminal_response"), + payload: z.object({ + terminalId: z.string(), + state: TerminalStateSchema.nullable(), + error: z.string().nullable(), + requestId: z.string(), + }), +}); + +export const TerminalOutputSchema = z.object({ + type: z.literal("terminal_output"), + payload: z.object({ + terminalId: z.string(), + state: TerminalStateSchema, + }), +}); + +export const KillTerminalResponseSchema = z.object({ + type: z.literal("kill_terminal_response"), + payload: z.object({ + terminalId: z.string(), + success: z.boolean(), + requestId: z.string(), + }), +}); + export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [ ActivityLogMessageSchema, AssistantChunkMessageSchema, @@ -910,6 +1037,11 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [ GitRepoInfoResponseSchema, ListProviderModelsResponseMessageSchema, ListCommandsResponseSchema, + ListTerminalsResponseSchema, + CreateTerminalResponseSchema, + SubscribeTerminalResponseSchema, + TerminalOutputSchema, + KillTerminalResponseSchema, ]); export type SessionOutboundMessage = z.infer< @@ -948,7 +1080,7 @@ export type ActivityLogPayload = z.infer; export type UserTextMessage = z.infer; export type RealtimeAudioChunkMessage = z.infer; export type SendAgentMessage = z.infer; -export type SendAgentAudio = z.infer; +export type TranscribeAudioRequest = z.infer; export type CreateAgentRequestMessage = z.infer; export type ListProviderModelsRequestMessage = z.infer< typeof ListProviderModelsRequestMessageSchema @@ -974,6 +1106,19 @@ export type ListCommandsRequest = z.infer; export type ListCommandsResponse = z.infer; export type RegisterPushTokenMessage = z.infer; +// Terminal message types +export type ListTerminalsRequest = z.infer; +export type ListTerminalsResponse = z.infer; +export type CreateTerminalRequest = z.infer; +export type CreateTerminalResponse = z.infer; +export type SubscribeTerminalRequest = z.infer; +export type SubscribeTerminalResponse = z.infer; +export type UnsubscribeTerminalRequest = z.infer; +export type TerminalInput = z.infer; +export type TerminalOutput = z.infer; +export type KillTerminalRequest = z.infer; +export type KillTerminalResponse = z.infer; + // ============================================================================ // WebSocket Level Messages (wraps session messages) // ============================================================================ diff --git a/packages/server/src/tasks/cli.ts b/packages/server/src/tasks/cli.ts index 04e0c56b3..c1057fb23 100644 --- a/packages/server/src/tasks/cli.ts +++ b/packages/server/src/tasks/cli.ts @@ -609,11 +609,28 @@ program interface AgentConfig { cli: "claude" | "codex"; model?: string; + effort?: string; } -function getAgentConfig(model: ModelName): AgentConfig { +// Parse model string like "gpt-5.2-xhigh" into model and effort +function parseModelString(modelStr: string): { model: string; effort?: string } { + // GPT models with effort: gpt-5.2-low, gpt-5.2-medium, gpt-5.2-high, gpt-5.2-xhigh + const effortLevels = ["low", "medium", "high", "xhigh"]; + for (const effort of effortLevels) { + if (modelStr.endsWith(`-${effort}`)) { + return { + model: modelStr.slice(0, -(effort.length + 1)), + effort, + }; + } + } + return { model: modelStr }; +} + +function getAgentConfig(modelStr: string): AgentConfig { + const { model, effort } = parseModelString(modelStr); if (model.startsWith("gpt-")) { - return { cli: "codex", model }; + return { cli: "codex", model, effort }; } // Claude CLI accepts aliases directly: haiku, sonnet, opus return { cli: "claude", model }; @@ -621,10 +638,10 @@ function getAgentConfig(model: ModelName): AgentConfig { function runAgentWithModel( prompt: string, - model: ModelName, + modelStr: string, logFile: string ): { success: boolean; output: string } { - const config = getAgentConfig(model); + const config = getAgentConfig(modelStr); let args: string[]; if (config.cli === "claude") { @@ -634,12 +651,13 @@ function runAgentWithModel( } args.push("-p", prompt); } else { + const effort = config.effort ?? "medium"; args = [ "exec", "--dangerously-bypass-approvals-and-sandbox", "--skip-git-repo-check", "-c", - "model_reasoning_effort=\"medium\"", + `model_reasoning_effort="${effort}"`, ]; if (config.model) { args.push("--model", config.model); @@ -686,28 +704,9 @@ async function buildTaskContext(task: Task, scopeId?: string): Promise { } } - let acceptanceCriteriaText = ""; - if (task.acceptanceCriteria.length > 0) { - acceptanceCriteriaText = "\n## Acceptance Criteria\n\n"; - for (const criterion of task.acceptanceCriteria) { - acceptanceCriteriaText += `- [ ] ${criterion}\n`; - } - } - - let notesText = ""; - if (task.notes.length > 0) { - notesText = "\n## Notes\n"; - for (const note of task.notes) { - notesText += `\n**${note.timestamp}**\n${note.content}\n`; - } - } - return `Working directory: ${process.cwd()} ${scopeContext}${parentContext} -# Task: ${task.title} - -${task.body || "(no body)"} -${acceptanceCriteriaText}${notesText}`; +${task.raw}`; } function makePlannerPrompt(task: Task, context: string, reason: string): string { @@ -917,36 +916,30 @@ You are a WORKER agent implementing this task. Current iteration: ${iteration} -IMPORTANT RULES: -- You CANNOT mark this task as done (task close is forbidden for you) +## How to Work + +Make MEANINGFUL progress toward the acceptance criteria: +- If the task can be completed in one iteration, do it all +- If it's too large, make the largest meaningful chunk of progress you can +- Read the notes from previous iterations - don't repeat work, BUILD on it +- A judge will verify your work against the acceptance criteria and leave feedback + +The judge's feedback (in notes) tells you exactly what's still failing. Address it. + +## Rules + +- You CANNOT mark this task as done (a judge verifies completion) - You MUST add a note documenting what you did: \`task note ${task.id} "WORKER: what you did"\` -- You CAN use \`task show ${task.id}\` to see full context -- You CAN use \`task children ${task.id}\` to see subtasks +- You CAN use \`task show ${task.id}\` to refresh context -Focus on implementing the task. The acceptance criteria will be verified by a separate judge agent. - -When you've done your best work, add a note explaining what you did and exit. +When you've made meaningful progress, add a note explaining what you did and exit. `; } function makeJudgePrompt(task: Task): string { - let criteriaText = ""; - if (task.acceptanceCriteria.length > 0) { - criteriaText = "## Acceptance Criteria to Verify\n\n"; - for (let i = 0; i < task.acceptanceCriteria.length; i++) { - criteriaText += `${i + 1}. ${task.acceptanceCriteria[i]}\n`; - } - } else { - criteriaText = "No explicit acceptance criteria defined. Verify the task is reasonably complete based on the title and body.\n"; - } - return `You are a JUDGE agent. Your ONLY job is to verify if acceptance criteria are met. -# Task: ${task.title} - -${task.body || "(no body)"} - -${criteriaText} +${task.raw} ## Your Instructions @@ -954,6 +947,28 @@ ${criteriaText} 2. You may run commands to check (e.g., \`npm run test\`, \`npm run typecheck\`, check file existence, run the code) 3. After checking all criteria, output your verdict +## FAIL EARLY for NOT_DONE + +For large tasks, the worker may yield after implementing incremental progress. Don't waste time +checking every criterion if it's obvious the task isn't complete. + +**Fail early strategy:** +- Start with a quick smoke test (e.g., does \`npm run typecheck\` or \`npm test\` pass?) +- If the smoke test fails badly, you can immediately return NOT_DONE +- If you find ANY failing criterion, you can immediately return NOT_DONE +- No need to check all criteria if you already know the verdict is NOT_DONE + +**Example:** If you run \`npm test\` and see 15 failures, don't methodically check each acceptance +criterion - just note the failures and return NOT_DONE. + +## For DONE: Full Verification Required + +Unlike NOT_DONE, you CANNOT shortcut DONE. To mark something DONE: +- You MUST verify EVERY acceptance criterion explicitly +- You MUST run the actual commands to check (not assume from context) +- You MUST confirm each criterion passes before concluding DONE +- No shortcuts, no assumptions, no "it probably works" + ## CRITICAL: No Excuses Policy You are evaluating RESULTS, not effort or intent. The following are NOT acceptable reasons to mark something DONE: @@ -977,18 +992,38 @@ After verifying, you MUST leave feedback for the worker by adding a note. The wo this note in the next iteration - it's their ONLY way to know what went wrong and what's missing. \`\`\` -task note ${task.id} "JUDGE: [verdict] - [specific feedback for the worker]" +task note ${task.id} "JUDGE: [verdict] - [observed facts only]" \`\`\` -Your feedback should tell the worker exactly what to fix: -- Which specific tests failed and with what error messages -- Which files or commands still need attention -- What's missing from the acceptance criteria +**CRITICAL: State ONLY observed facts. Do NOT provide solutions or debugging advice.** -BAD: "tests failed" (useless - worker doesn't know which ones) -GOOD: "3 tests fail: codex-mcp-agent.test.ts 'Session not found', opencode-agent.test.ts timeout after 60s, tool-calls.e2e.test.ts shell assertion" +You are a verification agent, not a debugging assistant. The worker has access to the task body +which contains the full context and instructions. Your job is to report WHAT failed, not HOW to fix it. -The worker cannot see your output - only the notes you leave. +DO: +- State which tests failed and their error messages +- State which commands returned non-zero exit codes +- State which files are missing or have wrong content +- Quote exact error output + +DO NOT: +- Suggest fixes or solutions +- Explain why something might have failed +- Offer debugging strategies +- Recommend approaches or alternatives + +BAD: "3 tests fail - try mocking the database connection" +BAD: "typecheck fails - you need to add the missing type annotation" +GOOD: "3 tests fail: auth.test.ts:42 'expected 200, got 401', user.test.ts:15 'timeout after 5000ms'" +GOOD: "npm run typecheck exit 1: src/api.ts:23 - Property 'foo' does not exist on type 'Bar'" + +For non-test criteria, state observable facts about the code: +GOOD: "validateUser() in auth.ts:45-72 duplicates validateAdmin() in admin.ts:23-50 (criterion: no code duplication)" +GOOD: "processOrder() is 187 lines (criterion: functions under 50 lines)" +GOOD: "UserService calls database directly at line 34 (criterion: all DB access via repository layer)" +GOOD: "auth module exports JWT secret at line 12 (criterion: secrets not exported from modules)" + +The worker has the task body with full instructions. Just tell them what's broken. ## Output Format - CRITICAL @@ -1030,26 +1065,29 @@ program .description("Run agent loop on tasks with planner/worker/judge") .option("--plan", "Enable planner agent") .option("--planner ", "Planner model (default: gpt-5.2)", "gpt-5.2") - .option("--judge ", "Judge model (default: haiku)", "haiku") + .option("--worker-model ", "Worker model (default: sonnet). For GPT models, append effort: gpt-5.2-high", "sonnet") + .option("--judge-model ", "Judge model (default: haiku)", "haiku") .option("--max-iterations ", "Max worker/judge iterations per task (0 = no limit)", "0") .option("-w, --watch", "Keep running and wait for new tasks") .action(async (scopeId: string | undefined, opts) => { const enablePlanner = opts.plan; - const plannerModel = opts.planner as ModelName; - const judgeModel = opts.judge as ModelName; + const plannerModel = opts.planner as string; + const baseWorkerModel = opts.workerModel as string; + const judgeModel = opts.judgeModel as string; const maxIterations = parseInt(opts.maxIterations, 10); const watchMode = opts.watch; const logFile = getLogFile(); process.stdout.write("Task Runner started (planner/worker/judge loop)\n"); process.stdout.write(`Planner: ${enablePlanner ? plannerModel : "disabled"}\n`); + process.stdout.write(`Worker: ${baseWorkerModel}\n`); process.stdout.write(`Judge: ${judgeModel}\n`); process.stdout.write(`Max iterations: ${maxIterations === 0 ? "unlimited" : maxIterations}\n`); if (scopeId) process.stdout.write(`Scope: ${scopeId}\n`); process.stdout.write(`Log: ${logFile}\n`); process.stdout.write("\n"); - log(logFile, `Started with planner=${enablePlanner ? plannerModel : "disabled"} judge=${judgeModel} maxIter=${maxIterations} scope=${scopeId || "all"}`); + log(logFile, `Started with planner=${enablePlanner ? plannerModel : "disabled"} worker=${baseWorkerModel} judge=${judgeModel} maxIter=${maxIterations} scope=${scopeId || "all"}`); const runPlanner = async (task: Task, reason: string): Promise => { log(logFile, `[PLANNER] Running ${plannerModel} (${reason})...`); @@ -1113,13 +1151,12 @@ program } const task = ready[0]; - const baseModel = ( - task.assignee === "codex" ? "gpt-5.2-codex" : - task.assignee ? task.assignee : - "sonnet" - ) as ModelName; - let workerModel = baseModel; - const canUpgrade = baseModel === "sonnet"; // Only upgrade if starting from sonnet + // CLI --worker-model takes precedence, then task assignee, then default + let workerModel = baseWorkerModel; + if (!workerModel && task.assignee) { + workerModel = task.assignee === "codex" ? "gpt-5.2-codex" : task.assignee; + } + const canUpgrade = workerModel === "sonnet"; // Only upgrade if starting from sonnet log(logFile, `\n=== Starting task: ${task.id} - ${task.title} ===`); await store.start(task.id); diff --git a/packages/server/src/tasks/task-store.test.ts b/packages/server/src/tasks/task-store.test.ts index f7519a1d2..01f974a05 100644 --- a/packages/server/src/tasks/task-store.test.ts +++ b/packages/server/src/tasks/task-store.test.ts @@ -103,6 +103,20 @@ describe("FileTaskStore", () => { expect(task.created >= before).toBe(true); expect(task.created <= after).toBe(true); }); + + it("returns task with raw content", async () => { + const task = await store.create("Test task", { + body: "Task body here", + acceptanceCriteria: ["criterion 1", "criterion 2"], + }); + + expect(task.raw).toContain("---"); + expect(task.raw).toContain("title: Test task"); + expect(task.raw).toContain("Task body here"); + expect(task.raw).toContain("## Acceptance Criteria"); + expect(task.raw).toContain("criterion 1"); + expect(task.raw).toContain("criterion 2"); + }); }); describe("get", () => { @@ -125,6 +139,24 @@ describe("FileTaskStore", () => { expect(retrieved?.assignee).toBe("codex"); }); + + it("returns raw content matching the file", async () => { + const created = await store.create("Task with body", { + body: "Some body content", + acceptanceCriteria: ["test passes", "lint passes"], + }); + await store.addNote(created.id, "A note was added"); + + const retrieved = await store.get(created.id); + + expect(retrieved?.raw).toContain("title: Task with body"); + expect(retrieved?.raw).toContain("Some body content"); + expect(retrieved?.raw).toContain("## Acceptance Criteria"); + expect(retrieved?.raw).toContain("test passes"); + expect(retrieved?.raw).toContain("lint passes"); + expect(retrieved?.raw).toContain("## Notes"); + expect(retrieved?.raw).toContain("A note was added"); + }); }); describe("list", () => { @@ -935,6 +967,29 @@ describe("FileTaskStore", () => { expect(retrieved?.priority).toBe(3); }); + + it("persists raw content across store instances", async () => { + const task = await store.create("Task with everything", { + body: "Detailed body", + acceptanceCriteria: ["tests pass", "build succeeds"], + assignee: "claude", + priority: 1, + }); + await store.addNote(task.id, "Implementation note"); + + const store2 = new FileTaskStore(tempDir); + const retrieved = await store2.get(task.id); + + expect(retrieved?.raw).toContain("title: Task with everything"); + expect(retrieved?.raw).toContain("Detailed body"); + expect(retrieved?.raw).toContain("## Acceptance Criteria"); + expect(retrieved?.raw).toContain("tests pass"); + expect(retrieved?.raw).toContain("build succeeds"); + expect(retrieved?.raw).toContain("## Notes"); + expect(retrieved?.raw).toContain("Implementation note"); + expect(retrieved?.raw).toContain("assignee: claude"); + expect(retrieved?.raw).toContain("priority: 1"); + }); }); describe("parent-child hierarchy", () => { diff --git a/packages/server/src/tasks/task-store.ts b/packages/server/src/tasks/task-store.ts index cecbe4744..26cc920d4 100644 --- a/packages/server/src/tasks/task-store.ts +++ b/packages/server/src/tasks/task-store.ts @@ -155,6 +155,7 @@ function parseTask(content: string): Task { created: getValue("created") || new Date().toISOString(), assignee: assignee || undefined, priority, + raw: content, }; } @@ -387,10 +388,13 @@ export class FileTaskStore implements TaskStore { created: new Date().toISOString(), assignee: opts?.assignee, priority: opts?.priority, + raw: "", // will be set after serialization }; await this.writeTask(task); - return task; + // Re-read to get the raw content + const saved = await this.get(task.id); + return saved!; } async update( diff --git a/packages/server/src/tasks/types.ts b/packages/server/src/tasks/types.ts index 1a9d1c0b1..18d288587 100644 --- a/packages/server/src/tasks/types.ts +++ b/packages/server/src/tasks/types.ts @@ -25,6 +25,7 @@ export interface Task { created: string; // ISO date assignee?: AgentType; // optional agent override priority?: number; // lower number = higher priority (1 is highest), tasks with priority sort before those without + raw: string; // the raw markdown file content } export interface CreateTaskOptions { diff --git a/packages/server/src/terminal/terminal-manager.test.ts b/packages/server/src/terminal/terminal-manager.test.ts new file mode 100644 index 000000000..5b9e27926 --- /dev/null +++ b/packages/server/src/terminal/terminal-manager.test.ts @@ -0,0 +1,172 @@ +import { describe, it, expect, afterEach } from "vitest"; +import { createTerminalManager, type TerminalManager } from "./terminal-manager.js"; + +describe("TerminalManager", () => { + let manager: TerminalManager; + + afterEach(() => { + if (manager) { + manager.killAll(); + } + }); + + describe("getTerminals", () => { + it("auto-creates first terminal for new cwd", async () => { + manager = createTerminalManager(); + const terminals = await manager.getTerminals("/tmp"); + + expect(terminals.length).toBe(1); + expect(terminals[0].name).toBe("Terminal 1"); + expect(terminals[0].cwd).toBe("/tmp"); + }); + + it("returns existing terminals on subsequent calls", async () => { + manager = createTerminalManager(); + const first = await manager.getTerminals("/tmp"); + const second = await manager.getTerminals("/tmp"); + + expect(first).toBe(second); + expect(first.length).toBe(1); + }); + + it("throws for relative paths", async () => { + manager = createTerminalManager(); + await expect(manager.getTerminals("tmp")).rejects.toThrow("cwd must be absolute path"); + }); + + it("creates separate terminals for different cwds", async () => { + manager = createTerminalManager(); + const tmpTerminals = await manager.getTerminals("/tmp"); + const homeTerminals = await manager.getTerminals("/home"); + + expect(tmpTerminals.length).toBe(1); + expect(homeTerminals.length).toBe(1); + expect(tmpTerminals[0].id).not.toBe(homeTerminals[0].id); + }); + }); + + describe("createTerminal", () => { + it("creates additional terminal with auto-incrementing name", async () => { + manager = createTerminalManager(); + await manager.getTerminals("/tmp"); + const second = await manager.createTerminal({ cwd: "/tmp" }); + + expect(second.name).toBe("Terminal 2"); + + const terminals = await manager.getTerminals("/tmp"); + expect(terminals.length).toBe(2); + }); + + it("uses custom name when provided", async () => { + manager = createTerminalManager(); + const session = await manager.createTerminal({ cwd: "/tmp", name: "Dev Server" }); + + expect(session.name).toBe("Dev Server"); + }); + + it("creates first terminal if none exist", async () => { + manager = createTerminalManager(); + const session = await manager.createTerminal({ cwd: "/tmp" }); + + expect(session.name).toBe("Terminal 1"); + + const terminals = await manager.getTerminals("/tmp"); + expect(terminals.length).toBe(1); + expect(terminals[0].id).toBe(session.id); + }); + + it("throws for relative paths", async () => { + manager = createTerminalManager(); + await expect(manager.createTerminal({ cwd: "tmp" })).rejects.toThrow("cwd must be absolute path"); + }); + }); + + describe("getTerminal", () => { + it("returns terminal by id", async () => { + manager = createTerminalManager(); + const terminals = await manager.getTerminals("/tmp"); + const found = manager.getTerminal(terminals[0].id); + + expect(found).toBe(terminals[0]); + }); + + it("returns undefined for unknown id", () => { + manager = createTerminalManager(); + const found = manager.getTerminal("unknown-id"); + + expect(found).toBeUndefined(); + }); + }); + + describe("killTerminal", () => { + it("removes terminal from manager", async () => { + manager = createTerminalManager(); + const terminals = await manager.getTerminals("/tmp"); + const id = terminals[0].id; + + manager.killTerminal(id); + + expect(manager.getTerminal(id)).toBeUndefined(); + }); + + it("removes cwd entry when last terminal is killed", async () => { + manager = createTerminalManager(); + const terminals = await manager.getTerminals("/tmp"); + + manager.killTerminal(terminals[0].id); + + expect(manager.listDirectories()).not.toContain("/tmp"); + }); + + it("keeps cwd entry when other terminals remain", async () => { + manager = createTerminalManager(); + await manager.getTerminals("/tmp"); + const second = await manager.createTerminal({ cwd: "/tmp" }); + + const terminals = await manager.getTerminals("/tmp"); + manager.killTerminal(terminals[0].id); + + expect(manager.listDirectories()).toContain("/tmp"); + const remaining = await manager.getTerminals("/tmp"); + expect(remaining.length).toBe(1); + expect(remaining[0].id).toBe(second.id); + }); + + it("is no-op for unknown id", () => { + manager = createTerminalManager(); + expect(() => manager.killTerminal("unknown-id")).not.toThrow(); + }); + }); + + describe("listDirectories", () => { + it("returns empty array initially", () => { + manager = createTerminalManager(); + expect(manager.listDirectories()).toEqual([]); + }); + + it("returns all cwds with active terminals", async () => { + manager = createTerminalManager(); + await manager.getTerminals("/tmp"); + await manager.getTerminals("/home"); + + const dirs = manager.listDirectories(); + expect(dirs).toContain("/tmp"); + expect(dirs).toContain("/home"); + expect(dirs.length).toBe(2); + }); + }); + + describe("killAll", () => { + it("kills all terminals and clears state", async () => { + manager = createTerminalManager(); + const tmpTerminals = await manager.getTerminals("/tmp"); + const homeTerminals = await manager.getTerminals("/home"); + + manager.killAll(); + + expect(manager.listDirectories()).toEqual([]); + expect(manager.getTerminal(tmpTerminals[0].id)).toBeUndefined(); + expect(manager.getTerminal(homeTerminals[0].id)).toBeUndefined(); + }); + }); +}); diff --git a/packages/server/src/terminal/terminal-manager.ts b/packages/server/src/terminal/terminal-manager.ts new file mode 100644 index 000000000..1fe8847a7 --- /dev/null +++ b/packages/server/src/terminal/terminal-manager.ts @@ -0,0 +1,88 @@ +import { createTerminal, type TerminalSession } from "./terminal.js"; + +export interface TerminalManager { + getTerminals(cwd: string): Promise; + createTerminal(options: { cwd: string; name?: string }): Promise; + getTerminal(id: string): TerminalSession | undefined; + killTerminal(id: string): void; + listDirectories(): string[]; + killAll(): void; +} + +export function createTerminalManager(): TerminalManager { + const terminalsByCwd = new Map(); + const terminalsById = new Map(); + + function assertAbsolutePath(cwd: string): void { + if (!cwd.startsWith("/")) { + throw new Error("cwd must be absolute path"); + } + } + + return { + async getTerminals(cwd: string): Promise { + assertAbsolutePath(cwd); + + let terminals = terminalsByCwd.get(cwd); + if (!terminals || terminals.length === 0) { + const session = await createTerminal({ cwd, name: "Terminal 1" }); + terminals = [session]; + terminalsByCwd.set(cwd, terminals); + terminalsById.set(session.id, session); + } + return terminals; + }, + + async createTerminal(options: { cwd: string; name?: string }): Promise { + assertAbsolutePath(options.cwd); + + const terminals = terminalsByCwd.get(options.cwd) ?? []; + const defaultName = `Terminal ${terminals.length + 1}`; + const session = await createTerminal({ + cwd: options.cwd, + name: options.name ?? defaultName, + }); + + terminals.push(session); + terminalsByCwd.set(options.cwd, terminals); + terminalsById.set(session.id, session); + + return session; + }, + + getTerminal(id: string): TerminalSession | undefined { + return terminalsById.get(id); + }, + + killTerminal(id: string): void { + const session = terminalsById.get(id); + if (!session) return; + + session.kill(); + terminalsById.delete(id); + + const terminals = terminalsByCwd.get(session.cwd); + if (terminals) { + const index = terminals.indexOf(session); + if (index !== -1) { + terminals.splice(index, 1); + } + if (terminals.length === 0) { + terminalsByCwd.delete(session.cwd); + } + } + }, + + listDirectories(): string[] { + return Array.from(terminalsByCwd.keys()); + }, + + killAll(): void { + for (const session of terminalsById.values()) { + session.kill(); + } + terminalsByCwd.clear(); + terminalsById.clear(); + }, + }; +} diff --git a/packages/server/src/terminal/terminal.test.ts b/packages/server/src/terminal/terminal.test.ts new file mode 100644 index 000000000..d47eef735 --- /dev/null +++ b/packages/server/src/terminal/terminal.test.ts @@ -0,0 +1,565 @@ +import { describe, it, expect, afterEach } from "vitest"; +import { createTerminal, type TerminalSession } from "./terminal.js"; + +// Extract text from a single row +function getRowText(state: ReturnType, rowIndex: number): string { + return state.grid[rowIndex].map((cell) => cell.char).join("").trimEnd(); +} + +// Extract all visible lines as array (trimmed, empty lines included) +function getLines(state: ReturnType): string[] { + return state.grid.map((row) => row.map((cell) => cell.char).join("").trimEnd()); +} + +// Wait for terminal state to match expected lines +async function waitForLines( + session: TerminalSession, + expectedLines: string[], + timeoutMs = 5000 +): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + const lines = getLines(session.getState()); + let matches = true; + for (let i = 0; i < expectedLines.length; i++) { + if (lines[i] !== expectedLines[i]) { + matches = false; + break; + } + } + if (matches) { + return; + } + await new Promise((resolve) => setTimeout(resolve, 50)); + } + const actual = getLines(session.getState()).slice(0, expectedLines.length); + throw new Error( + `Timeout waiting for expected lines.\nExpected:\n${JSON.stringify(expectedLines, null, 2)}\nActual:\n${JSON.stringify(actual, null, 2)}` + ); +} + +describe("Terminal", () => { + const sessions: TerminalSession[] = []; + + afterEach(async () => { + for (const session of sessions) { + session.kill(); + } + sessions.length = 0; + }); + + function trackSession(session: TerminalSession): TerminalSession { + sessions.push(session); + return session; + } + + describe("createTerminal", () => { + it("creates a terminal session with an id, name, and cwd", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + expect(session.id).toBeDefined(); + expect(typeof session.id).toBe("string"); + expect(session.id.length).toBeGreaterThan(0); + expect(session.name).toBe("Terminal"); + expect(session.cwd).toBe("/tmp"); + }); + + it("uses custom name when provided", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + name: "Dev Server", + }) + ); + + expect(session.name).toBe("Dev Server"); + }); + + it("uses default shell if not specified", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + }) + ); + + expect(session.id).toBeDefined(); + }); + + it("uses default rows and cols", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + const state = session.getState(); + expect(state.rows).toBe(24); + expect(state.cols).toBe(80); + }); + + it("respects custom rows and cols", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + rows: 40, + cols: 120, + }) + ); + + const state = session.getState(); + expect(state.rows).toBe(40); + expect(state.cols).toBe(120); + }); + }); + + describe("send input", () => { + it("executes a simple echo command", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + // Wait for initial prompt, then send command + await waitForLines(session, ["$"]); + + session.send({ type: "input", data: "echo hello\r" }); + + // After running "echo hello", terminal should show: + // Line 0: "$ echo hello" + // Line 1: "hello" + // Line 2: "$" + await waitForLines(session, ["$ echo hello", "hello", "$"]); + + const state = session.getState(); + expect(getRowText(state, 0)).toBe("$ echo hello"); + expect(getRowText(state, 1)).toBe("hello"); + expect(getRowText(state, 2)).toBe("$"); + }); + + it("executes multiple commands sequentially", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + session.send({ type: "input", data: "echo first\r" }); + await waitForLines(session, ["$ echo first", "first", "$"]); + + session.send({ type: "input", data: "echo second\r" }); + await waitForLines(session, [ + "$ echo first", + "first", + "$ echo second", + "second", + "$", + ]); + + const state = session.getState(); + expect(getRowText(state, 0)).toBe("$ echo first"); + expect(getRowText(state, 1)).toBe("first"); + expect(getRowText(state, 2)).toBe("$ echo second"); + expect(getRowText(state, 3)).toBe("second"); + expect(getRowText(state, 4)).toBe("$"); + }); + + it("captures output from pwd in specified cwd", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + session.send({ type: "input", data: "pwd\r" }); + + await waitForLines(session, ["$ pwd", "/tmp", "$"]); + + const state = session.getState(); + expect(getRowText(state, 0)).toBe("$ pwd"); + expect(getRowText(state, 1)).toBe("/tmp"); + expect(getRowText(state, 2)).toBe("$"); + }); + }); + + describe("colors", () => { + it("captures ANSI 16 color codes (mode 1)", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ ", TERM: "xterm-256color" }, + }) + ); + + await waitForLines(session, ["$"]); + + // \033[31m = ANSI red (color 1) + session.send({ type: "input", data: "printf '\\033[31mRED\\033[0m'\r" }); + + await waitForLines(session, ["$ printf '\\033[31mRED\\033[0m'", "RED$"]); + + const state = session.getState(); + const outputRow = state.grid[1]; + + expect(outputRow[0].char).toBe("R"); + expect(outputRow[0].fg).toBe(1); // ANSI red = 1 + expect(outputRow[0].fgMode).toBe(1); // Mode 1 = 16 ANSI colors + + // The "$" after RED should have default color + expect(outputRow[3].char).toBe("$"); + expect(outputRow[3].fg).toBe(undefined); + expect(outputRow[3].fgMode).toBe(undefined); + }); + + it("captures 256 color codes (mode 2)", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ ", TERM: "xterm-256color" }, + }) + ); + + await waitForLines(session, ["$"]); + + // \033[38;5;208m = 256-color orange (color 208) + session.send({ type: "input", data: "printf '\\033[38;5;208mORG\\033[0m'\r" }); + + await waitForLines(session, ["$ printf '\\033[38;5;208mORG\\033[0m'", "ORG$"]); + + const state = session.getState(); + const outputRow = state.grid[1]; + + // Check O cell + expect(outputRow[0].char).toBe("O"); + expect(outputRow[0].fg).toBe(208); // 256-color index + expect(outputRow[0].fgMode).toBe(2); // Mode 2 = 256 colors + }); + + it("captures true color RGB (mode 3)", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ ", TERM: "xterm-256color" }, + }) + ); + + await waitForLines(session, ["$"]); + + // \033[38;2;255;128;64m = true color RGB(255, 128, 64) + session.send({ type: "input", data: "printf '\\033[38;2;255;128;64mRGB\\033[0m'\r" }); + + await waitForLines(session, ["$ printf '\\033[38;2;255;128;64mRGB\\033[0m'", "RGB$"]); + + const state = session.getState(); + const outputRow = state.grid[1]; + + // Check R cell + expect(outputRow[0].char).toBe("R"); + expect(outputRow[0].fgMode).toBe(3); // Mode 3 = true color + + // The color value should be packed RGB: (255 << 16) | (128 << 8) | 64 + const expectedPacked = (255 << 16) | (128 << 8) | 64; + expect(outputRow[0].fg).toBe(expectedPacked); + }); + + it("captures background colors", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ ", TERM: "xterm-256color" }, + }) + ); + + await waitForLines(session, ["$"]); + + // \033[41m = ANSI red background + session.send({ type: "input", data: "printf '\\033[41mBG\\033[0m'\r" }); + + await waitForLines(session, ["$ printf '\\033[41mBG\\033[0m'", "BG$"]); + + const state = session.getState(); + const outputRow = state.grid[1]; + + expect(outputRow[0].char).toBe("B"); + expect(outputRow[0].bg).toBe(1); // ANSI red = 1 + expect(outputRow[0].bgMode).toBe(1); // Mode 1 = 16 ANSI colors + }); + }); + + describe("resize", () => { + it("updates terminal dimensions on resize", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + rows: 24, + cols: 80, + }) + ); + + session.send({ type: "resize", rows: 40, cols: 120 }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + const state = session.getState(); + expect(state.rows).toBe(40); + expect(state.cols).toBe(120); + }); + + it("grid reflects new dimensions after resize", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + rows: 24, + cols: 80, + }) + ); + + session.send({ type: "resize", rows: 10, cols: 40 }); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const state = session.getState(); + expect(state.grid.length).toBe(10); + expect(state.grid[0].length).toBe(40); + }); + }); + + describe("subscribe", () => { + it("receives full state on initial subscription", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + const messages: Array<{ type: string }> = []; + const unsubscribe = session.subscribe((msg) => { + messages.push(msg); + }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + expect(messages.length).toBeGreaterThan(0); + expect(messages[0].type).toBe("full"); + + unsubscribe(); + }); + + it("receives messages on updates", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + const messages: Array<{ type: string }> = []; + const unsubscribe = session.subscribe((msg) => { + messages.push(msg); + }); + + messages.length = 0; + + session.send({ type: "input", data: "echo test\r" }); + + await waitForLines(session, ["$ echo test", "test", "$"]); + + expect(messages.length).toBeGreaterThan(0); + + unsubscribe(); + }); + + it("unsubscribe stops receiving messages", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + const messages: Array<{ type: string }> = []; + const unsubscribe = session.subscribe((msg) => { + messages.push(msg); + }); + + unsubscribe(); + messages.length = 0; + + session.send({ type: "input", data: "echo after\r" }); + await new Promise((resolve) => setTimeout(resolve, 200)); + + expect(messages.length).toBe(0); + }); + }); + + describe("getState", () => { + it("returns current terminal state with grid", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + rows: 24, + cols: 80, + }) + ); + + const state = session.getState(); + + expect(state.rows).toBe(24); + expect(state.cols).toBe(80); + expect(state.grid).toBeDefined(); + expect(state.grid.length).toBe(24); + expect(state.grid[0].length).toBe(80); + expect(state.cursor).toBeDefined(); + expect(typeof state.cursor.row).toBe("number"); + expect(typeof state.cursor.col).toBe("number"); + }); + + it("grid cells have char and color attributes", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + const state = session.getState(); + // First cell should be "$" + expect(state.grid[0][0].char).toBe("$"); + expect(state.grid[0][0]).toHaveProperty("fg"); + expect(state.grid[0][0]).toHaveProperty("bg"); + }); + }); + + describe("scrollback", () => { + it("preserves scrollback buffer", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + rows: 5, + cols: 80, + }) + ); + + await waitForLines(session, ["$"]); + + // seq 1 20 produces 20 lines of output + // With 5 rows, we expect lines to scroll into scrollback + session.send({ type: "input", data: "seq 1 20\r" }); + + // Wait for command to finish - final prompt appears after "20" + // In a 5-row terminal, we'll see the last lines plus prompt + // The visible area will show something like: 17, 18, 19, 20, $ + await waitForLines(session, ["17", "18", "19", "20", "$"]); + + const state = session.getState(); + + // Scrollback should contain the earlier output + expect(state.scrollback.length).toBeGreaterThan(0); + + const scrollbackText = state.scrollback + .map((row) => row.map((cell) => cell.char).join("").trimEnd()) + .filter((line) => line.length > 0); + + // The scrollback should contain the command and early numbers + expect(scrollbackText).toContain("$ seq 1 20"); + expect(scrollbackText).toContain("1"); + expect(scrollbackText).toContain("2"); + expect(scrollbackText).toContain("3"); + }); + }); + + describe("kill", () => { + it("terminates the shell process", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + await waitForLines(session, ["$"]); + + session.kill(); + + // Should not throw when trying to get state after kill + const state = session.getState(); + expect(state).toBeDefined(); + }); + + it("send after kill is a no-op", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + session.kill(); + + // Should not throw + session.send({ type: "input", data: "echo test\r" }); + }); + }); + + describe("mouse events", () => { + it("accepts mouse events without throwing", async () => { + const session = trackSession( + await createTerminal({ + cwd: "/tmp", + shell: "/bin/sh", + env: { PS1: "$ " }, + }) + ); + + // Should not throw + session.send({ type: "mouse", row: 0, col: 0, button: 0, action: "down" }); + session.send({ type: "mouse", row: 0, col: 0, button: 0, action: "up" }); + }); + }); +}); diff --git a/packages/server/src/terminal/terminal.ts b/packages/server/src/terminal/terminal.ts new file mode 100644 index 000000000..2394dbb22 --- /dev/null +++ b/packages/server/src/terminal/terminal.ts @@ -0,0 +1,276 @@ +import * as pty from "node-pty"; +import xterm, { type Terminal as TerminalType } from "@xterm/headless"; +import { randomUUID } from "crypto"; + +const { Terminal } = xterm; + +export interface Cell { + char: string; + fg: number | undefined; + bg: number | undefined; + fgMode?: number; // 0=default, 1=16 ANSI, 2=256, 3=RGB + bgMode?: number; + bold?: boolean; + italic?: boolean; + underline?: boolean; +} + +export interface Pos { + row: number; + col: number; +} + +export interface TerminalState { + rows: number; + cols: number; + grid: Cell[][]; + scrollback: Cell[][]; + cursor: Pos; +} + +export interface CellChange { + row: number; + col: number; + cell: Cell; +} + +export type ClientMessage = + | { type: "input"; data: string } + | { type: "resize"; rows: number; cols: number } + | { type: "mouse"; row: number; col: number; button: number; action: "down" | "up" | "move" }; + +export type ServerMessage = + | { type: "full"; state: TerminalState } + | { type: "diff"; changes: CellChange[]; cursor: Pos }; + +export interface TerminalSession { + id: string; + name: string; + cwd: string; + send(msg: ClientMessage): void; + subscribe(listener: (msg: ServerMessage) => void): () => void; + getState(): TerminalState; + kill(): void; +} + +export interface CreateTerminalOptions { + cwd: string; + shell?: string; + env?: Record; + rows?: number; + cols?: number; + name?: string; +} + +function extractCell(terminal: TerminalType, row: number, col: number): Cell { + const buffer = terminal.buffer.active; + const line = buffer.getLine(row); + if (!line) { + return { char: " ", fg: undefined, bg: undefined }; + } + + const cell = line.getCell(col); + if (!cell) { + return { char: " ", fg: undefined, bg: undefined }; + } + + // Color modes from xterm.js: 0=DEFAULT, 1=16 colors (ANSI), 2=256 colors, 3=RGB + // getFgColorMode() returns packed value with mode in upper byte (e.g. 0x01000000 for mode 1) + const fgModeRaw = cell.getFgColorMode(); + const bgModeRaw = cell.getBgColorMode(); + const fgMode = fgModeRaw >> 24; + const bgMode = bgModeRaw >> 24; + + // Only return color if not default (mode 0) + const fg = fgMode !== 0 ? cell.getFgColor() : undefined; + const bg = bgMode !== 0 ? cell.getBgColor() : undefined; + + return { + char: cell.getChars() || " ", + fg, + bg, + fgMode: fgMode !== 0 ? fgMode : undefined, + bgMode: bgMode !== 0 ? bgMode : undefined, + bold: cell.isBold() !== 0, + italic: cell.isItalic() !== 0, + underline: cell.isUnderline() !== 0, + }; +} + +function extractGrid(terminal: TerminalType): Cell[][] { + const grid: Cell[][] = []; + const buffer = terminal.buffer.active; + // Visible viewport starts at baseY + const baseY = buffer.baseY; + + for (let row = 0; row < terminal.rows; row++) { + const rowCells: Cell[] = []; + for (let col = 0; col < terminal.cols; col++) { + rowCells.push(extractCell(terminal, baseY + row, col)); + } + grid.push(rowCells); + } + + return grid; +} + +function extractScrollback(terminal: TerminalType): Cell[][] { + const scrollback: Cell[][] = []; + const buffer = terminal.buffer.active; + // baseY is the first row of the visible viewport (0-indexed) + // Lines 0 to baseY-1 are in scrollback, lines baseY onwards are visible + const scrollbackLines = buffer.baseY; + + for (let row = 0; row < scrollbackLines; row++) { + const rowCells: Cell[] = []; + const line = buffer.getLine(row); + for (let col = 0; col < terminal.cols; col++) { + if (line) { + const cell = line.getCell(col); + if (cell) { + const fgModeRaw = cell.getFgColorMode(); + const bgModeRaw = cell.getBgColorMode(); + const fgMode = fgModeRaw >> 24; + const bgMode = bgModeRaw >> 24; + const fg = fgMode !== 0 ? cell.getFgColor() : undefined; + const bg = bgMode !== 0 ? cell.getBgColor() : undefined; + rowCells.push({ + char: cell.getChars() || " ", + fg, + bg, + fgMode: fgMode !== 0 ? fgMode : undefined, + bgMode: bgMode !== 0 ? bgMode : undefined, + bold: cell.isBold() !== 0, + italic: cell.isItalic() !== 0, + underline: cell.isUnderline() !== 0, + }); + } else { + rowCells.push({ char: " ", fg: undefined, bg: undefined }); + } + } else { + rowCells.push({ char: " ", fg: undefined, bg: undefined }); + } + } + scrollback.push(rowCells); + } + + return scrollback; +} + +export async function createTerminal(options: CreateTerminalOptions): Promise { + const { + cwd, + shell = process.env.SHELL || "/bin/sh", + env = {}, + rows = 24, + cols = 80, + name = "Terminal", + } = options; + + const id = randomUUID(); + const listeners = new Set<(msg: ServerMessage) => void>(); + let killed = false; + + // Create xterm.js headless terminal + const terminal = new Terminal({ + rows, + cols, + scrollback: 1000, + allowProposedApi: true, + }); + + // Create PTY + const ptyProcess = pty.spawn(shell, [], { + name: "xterm-256color", + cols, + rows, + cwd, + env: { + ...process.env, + ...env, + TERM: "xterm-256color", + }, + }); + + // Pipe PTY output to terminal emulator + ptyProcess.onData((data) => { + if (killed) return; + terminal.write(data, () => { + // Notify listeners of changes + const state = getState(); + for (const listener of listeners) { + listener({ type: "full", state }); + } + }); + }); + + ptyProcess.onExit(() => { + killed = true; + }); + + function getState(): TerminalState { + return { + rows: terminal.rows, + cols: terminal.cols, + grid: extractGrid(terminal), + scrollback: extractScrollback(terminal), + cursor: { + row: terminal.buffer.active.cursorY, + col: terminal.buffer.active.cursorX, + }, + }; + } + + function send(msg: ClientMessage): void { + if (killed) return; + + switch (msg.type) { + case "input": + ptyProcess.write(msg.data); + break; + case "resize": + terminal.resize(msg.cols, msg.rows); + ptyProcess.resize(msg.cols, msg.rows); + break; + case "mouse": + // Mouse events can be sent as escape sequences if terminal supports it + // For now, we'll just ignore them - can be implemented later + break; + } + } + + function subscribe(listener: (msg: ServerMessage) => void): () => void { + listeners.add(listener); + + // Send initial full state + queueMicrotask(() => { + if (listeners.has(listener)) { + listener({ type: "full", state: getState() }); + } + }); + + return () => { + listeners.delete(listener); + }; + } + + function kill(): void { + if (killed) return; + killed = true; + ptyProcess.kill(); + terminal.dispose(); + } + + // Small delay to let shell initialize + await new Promise((resolve) => setTimeout(resolve, 50)); + + return { + id, + name, + cwd, + send, + subscribe, + getState, + kill, + }; +} diff --git a/packages/server/src/utils/tool-call-parsers.test.ts b/packages/server/src/utils/tool-call-parsers.test.ts new file mode 100644 index 000000000..45ad7141e --- /dev/null +++ b/packages/server/src/utils/tool-call-parsers.test.ts @@ -0,0 +1,107 @@ +import { describe, expect, test } from "vitest"; +import { + stripShellWrapperPrefix, + extractPrincipalParam, + stripCwdPrefix, +} from "./tool-call-parsers.js"; + +describe("stripShellWrapperPrefix", () => { + test("strips /bin/zsh -lc cd path && prefix", () => { + const command = "/bin/zsh -lc cd /Users/moboudra/dev/blankpage/editor && npm run format"; + expect(stripShellWrapperPrefix(command)).toBe("npm run format"); + }); + + test("strips /bin/zsh -c cd path && prefix", () => { + const command = "/bin/zsh -c cd /path/to/project && git status"; + expect(stripShellWrapperPrefix(command)).toBe("git status"); + }); + + test("strips /bin/bash -lc cd path && prefix", () => { + const command = "/bin/bash -lc cd /home/user/project && npm test"; + expect(stripShellWrapperPrefix(command)).toBe("npm test"); + }); + + test("strips /bin/sh -c cd path && prefix", () => { + const command = "/bin/sh -c cd /tmp && ls -la"; + expect(stripShellWrapperPrefix(command)).toBe("ls -la"); + }); + + test("returns command unchanged when no prefix", () => { + const command = "npm run build"; + expect(stripShellWrapperPrefix(command)).toBe("npm run build"); + }); + + test("returns command unchanged for partial match", () => { + const command = "/bin/zsh -lc npm run build"; + expect(stripShellWrapperPrefix(command)).toBe("/bin/zsh -lc npm run build"); + }); + + test("handles paths with spaces in quotes", () => { + // The regex matches \S+ for the path, so quoted paths won't fully match + // This is acceptable - quoted paths are edge cases + const command = '/bin/zsh -lc cd "/path with spaces" && npm test'; + // Won't strip because the path pattern expects non-whitespace + expect(stripShellWrapperPrefix(command)).toBe('/bin/zsh -lc cd "/path with spaces" && npm test'); + }); +}); + +describe("extractPrincipalParam", () => { + test("extracts and strips shell wrapper from command string", () => { + const args = { command: "/bin/zsh -lc cd /Users/dev/project && npm run format" }; + expect(extractPrincipalParam(args)).toBe("npm run format"); + }); + + test("extracts and strips shell wrapper from command array", () => { + const args = { command: ["/bin/bash", "-lc", "cd /path && git status"] }; + // Array is joined with spaces first: "/bin/bash -lc cd /path && git status" + // Then shell wrapper is stripped + expect(extractPrincipalParam(args)).toBe("git status"); + }); + + test("extracts plain command without shell wrapper", () => { + const args = { command: "npm run build" }; + expect(extractPrincipalParam(args)).toBe("npm run build"); + }); + + test("extracts file_path and strips cwd", () => { + const args = { file_path: "/Users/dev/project/src/file.ts" }; + expect(extractPrincipalParam(args, "/Users/dev/project")).toBe("src/file.ts"); + }); + + test("extracts pattern without modification", () => { + const args = { pattern: "*.ts" }; + expect(extractPrincipalParam(args)).toBe("*.ts"); + }); + + test("extracts query without modification", () => { + const args = { query: "search term" }; + expect(extractPrincipalParam(args)).toBe("search term"); + }); + + test("extracts url without modification", () => { + const args = { url: "https://example.com" }; + expect(extractPrincipalParam(args)).toBe("https://example.com"); + }); + + test("returns undefined for empty object", () => { + expect(extractPrincipalParam({})).toBeUndefined(); + }); +}); + +describe("stripCwdPrefix", () => { + test("strips cwd prefix from file path", () => { + expect(stripCwdPrefix("/Users/dev/project/src/file.ts", "/Users/dev/project")).toBe("src/file.ts"); + }); + + test("returns . for exact cwd match", () => { + expect(stripCwdPrefix("/Users/dev/project", "/Users/dev/project")).toBe("."); + }); + + test("returns path unchanged when no cwd prefix", () => { + expect(stripCwdPrefix("/other/path/file.ts", "/Users/dev/project")).toBe("/other/path/file.ts"); + }); + + test("returns path unchanged when no cwd provided", () => { + expect(stripCwdPrefix("/Users/dev/project/file.ts")).toBe("/Users/dev/project/file.ts"); + }); +}); diff --git a/packages/server/src/utils/tool-call-parsers.ts b/packages/server/src/utils/tool-call-parsers.ts index c5ee84c74..eb80781e7 100644 --- a/packages/server/src/utils/tool-call-parsers.ts +++ b/packages/server/src/utils/tool-call-parsers.ts @@ -18,9 +18,9 @@ const PrincipalParamSchema = z.union([ z.object({ filePath: z.string() }).transform((d) => ({ type: "path" as const, value: d.filePath })), z.object({ path: z.string() }).transform((d) => ({ type: "path" as const, value: d.path })), // Command as string - z.object({ command: z.string() }).transform((d) => ({ type: "text" as const, value: d.command })), + z.object({ command: z.string() }).transform((d) => ({ type: "command" as const, value: d.command })), // Command as array (Codex sends this) - z.object({ command: z.array(z.string()).nonempty() }).transform((d) => ({ type: "text" as const, value: d.command.join(" ") })), + z.object({ command: z.array(z.string()).nonempty() }).transform((d) => ({ type: "command" as const, value: d.command.join(" ") })), // Other text params z.object({ pattern: z.string() }).transform((d) => ({ type: "text" as const, value: d.pattern })), z.object({ query: z.string() }).transform((d) => ({ type: "text" as const, value: d.query })), @@ -53,6 +53,14 @@ export function stripCwdPrefix(filePath: string, cwd?: string): string { return filePath; } +// Strips shell wrapper prefixes like "/bin/zsh -lc cd /path && " from commands +// This is used for display purposes to show the actual command being run +const SHELL_WRAPPER_PATTERN = /^\/bin\/(?:zsh|bash|sh)\s+(?:-[a-zA-Z]+\s+)?cd\s+\S+\s+&&\s+/; + +export function stripShellWrapperPrefix(command: string): string { + return command.replace(SHELL_WRAPPER_PATTERN, ""); +} + export function extractPrincipalParam(args: unknown, cwd?: string): string | undefined { const parsed = PrincipalParamSchema.safeParse(args); if (!parsed.success) { @@ -60,7 +68,13 @@ export function extractPrincipalParam(args: unknown, cwd?: string): string | und } const { type, value } = parsed.data; - return type === "path" ? stripCwdPrefix(value, cwd) : value; + if (type === "path") { + return stripCwdPrefix(value, cwd); + } + if (type === "command") { + return stripShellWrapperPrefix(value); + } + return value; } // ---- TodoWrite Extraction ----