├── .github └── workflows │ └── main.yml ├── .gitignore ├── .hintrc ├── .prettierrc.json ├── .vscode └── extensions.json ├── README.md ├── SECURITY.md ├── index.html ├── itos.code-workspace ├── license.md ├── package-lock.json ├── package.json ├── public ├── tauri.svg └── vite.svg ├── src-tauri ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── build.rs ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ └── main.rs └── tauri.conf.json ├── src ├── App.css ├── App.tsx ├── assets │ ├── app-icon.png │ └── itos_textlogo.png ├── atoms │ ├── settingsState.ts │ ├── showErrorState.ts │ └── timelineState.ts ├── components │ ├── SidePanel │ │ ├── EditColumnsMenu │ │ │ └── EditColumnsMenu.tsx │ │ ├── ExpandMenuHeader.tsx │ │ ├── InformationMenu │ │ │ └── informationMenu.tsx │ │ ├── SettingsMenu │ │ │ └── SettingsMenu.tsx │ │ └── SidePanel.tsx │ ├── TimeLine │ │ ├── ColumnPane │ │ │ ├── Body.tsx │ │ │ ├── Header.tsx │ │ │ ├── InputBox.tsx │ │ │ └── Pane.tsx │ │ └── TimeLine.tsx │ └── UI │ │ ├── BlankContents.tsx │ │ ├── CodeBlock.tsx │ │ ├── ConversationEdit.tsx │ │ ├── ShowError.tsx │ │ └── Spacer.tsx ├── i18n │ ├── configs.ts │ ├── en.json │ └── ja.json ├── main.tsx ├── styles.css ├── types │ └── types.ts ├── utils │ ├── config.ts │ ├── datetime.ts │ ├── files.ts │ └── theme.ts └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | release: 10 | permissions: 11 | contents: write 12 | strategy: 13 | fail-fast: false 14 | matrix: 15 | platform: [macos-latest, ubuntu-20.04, windows-latest] 16 | runs-on: ${{ matrix.platform }} 17 | 18 | steps: 19 | - name: Checkout repository 20 | uses: actions/checkout@v3 21 | 22 | - name: Install dependencies (ubuntu only) 23 | if: matrix.platform == 'ubuntu-20.04' 24 | # You can remove libayatana-appindicator3-dev if you don't use the system tray feature. 25 | run: | 26 | sudo apt-get update 27 | sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev 28 | 29 | - name: Rust setup 30 | uses: dtolnay/rust-toolchain@stable 31 | 32 | - name: Rust cache 33 | uses: swatinem/rust-cache@v2 34 | with: 35 | workspaces: './src-tauri -> target' 36 | 37 | - name: Sync node version and setup cache 38 | uses: actions/setup-node@v3 39 | with: 40 | node-version: 'lts/*' 41 | cache: 'npm' # Set this to npm, yarn or pnpm. 42 | 43 | - name: Install frontend dependencies 44 | # If you don't have `beforeBuildCommand` configured you may want to build your frontend here too. 45 | run: npm install # Change this to npm, yarn or pnpm. 46 | 47 | - name: Build the app 48 | uses: tauri-apps/tauri-action@v0 49 | 50 | env: 51 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 53 | TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} 54 | with: 55 | tagName: ${{ github.ref_name }} # This only works if your workflow triggers on new tags. 56 | releaseName: 'itos v__VERSION__' # tauri-action replaces \_\_VERSION\_\_ with the app version. 57 | releaseBody: 'See the assets to download and install this version.' 58 | releaseDraft: true 59 | prerelease: false 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "development" 4 | ], 5 | "hints": { 6 | "compat-api/css": [ 7 | "default", 8 | { 9 | "ignore": [ 10 | "user-select" 11 | ] 12 | } 13 | ] 14 | } 15 | } -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![License](https://img.shields.io/github/license/Mikoshiba-Kyu/Tauri-itos) 2 | ![Downloads](https://img.shields.io/github/downloads/Mikoshiba-Kyu/Tauri-itos/total) 3 | ![Size](https://img.shields.io/github/languages/code-size/Mikoshiba-Kyu/Tauri-itos) 4 | ![AllContributors](https://img.shields.io/github/all-contributors/Mikoshiba-Kyu/Tauri-itos/main) 5 | 6 | ![Tauri](https://img.shields.io/badge/Tauri-565656?logo=tauri&style=flat") 7 | ![TypeScript](https://img.shields.io/badge/TypeScript-565656?logo=typescript&style=flat") 8 | ![Rust](https://img.shields.io/badge/Rust-565656?logo=rust&style=flat") 9 | ![React](https://img.shields.io/badge/React-565656?logo=react&style=flat") 10 | ![MUI](https://img.shields.io/badge/MUI-565656?logo=mui&style=flat") 11 | ![Vite](https://img.shields.io/badge/Vite-565656?logo=vite&style=flat") 12 | ![Vitest](https://img.shields.io/badge/Vitest-565656?logo=vitest&style=flat") 13 | ![Github Actions](https://img.shields.io/badge/GithubActions-565656?logo=githubactions&style=flat") 14 | ![npm](https://img.shields.io/badge/npm-565656?logo=npm&style=flat") 15 | 16 | # itos powered by GPT 17 | 18 | 19 | 20 | itos (イートス) is a desktop client application that allows you to manage multiple threads of ChatGPT conversations. 21 | Just set the API KEY for ChatGPT to get started right away. 22 | itos is a multi-platform application that runs on Windows, MacOS, and Linux. 23 | 24 | ## Overview 25 | 26 | ![overview_fixes](https://github.com/Mikoshiba-Kyu/Tauri-itos/assets/40236427/ab0b28a6-fb50-4fba-b4e7-965939804d1f) 27 | 28 | ## Features 29 | 30 | - Multiple conversations can be arranged on the screen. Individual conversations can be easily displayed, hidden, and rearranged. 31 | 32 | - Each conversation can have its own prompt. This allows you to give instructions to ChatGPT. 33 | 34 | - You can set icon files for yourself and for the assistant for each conversation. This can be used for character-based conversations, etc. 35 | 36 | - Switch between English and Japanese, change color themes. These screen display customizations are supported. 37 | 38 | ## Usage 39 | 40 | 1. Open the settings screen from the "Settings" icon on the left side of the screen. 41 | 2. Setup API and Model for ChatGPT. 42 | 3. Create a new conversation from the "New Conversation" icon on the left side of the screen. 43 | 4. Expand the top of the conversation pane you created and have a conversation with ChatGPT. 44 | 45 | ## Development 46 | 47 | 1. Clone repository your locally and Run `npm i`. 48 | 49 | 1. Start the VSCode workspace with `itos.code-workspace`. 50 | 51 | > ※ Once Tauri supports builds for Windows from Linux, it will be possible to migrate to DevContainer and Docker. 52 | 53 | 1. `npm run tauri dev` command can be used to test launch. 54 | 55 | 1. If you need a local build, you can use the `npm run tauri build` command. 56 | 57 | ## Postscript 58 | 59 | If my product could be a great experience for you, 60 | Please buy me a hot cup of coffee. Thank you. 61 | 62 | 63 | [Buy me a coffee](https://www.buymeacoffee.com/mikoshibakyu) 64 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | itos powered by GPT 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /itos.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": {}, 8 | "extensions": { 9 | "recommendations": [ 10 | "esbenp.prettier-vscode", 11 | "dbaeumer.vscode-eslint", 12 | "tauri-apps.tauri-vscode", 13 | "rust-lang.rust-analyzer", 14 | "gruntfuggly.todo-tree", 15 | "github.vscode-github-actions" 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 御子柴きゅう 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "itos", 3 | "private": true, 4 | "version": "1.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview", 10 | "tauri": "tauri" 11 | }, 12 | "dependencies": { 13 | "@dnd-kit/core": "^6.0.8", 14 | "@dnd-kit/sortable": "^7.0.2", 15 | "@emotion/react": "^11.10.6", 16 | "@emotion/styled": "^11.10.6", 17 | "@fontsource/roboto": "^4.5.8", 18 | "@mui/icons-material": "^5.11.11", 19 | "@mui/material": "^5.11.14", 20 | "@tauri-apps/api": "^1.4.0", 21 | "@types/react-syntax-highlighter": "^15.5.7", 22 | "dayjs": "^1.11.9", 23 | "i18next": "^23.2.11", 24 | "openai": "^4.25.0", 25 | "react": "^18.2.0", 26 | "react-dom": "^18.2.0", 27 | "react-i18next": "^13.0.2", 28 | "react-markdown": "^8.0.7", 29 | "react-rnd": "^10.4.1", 30 | "react-syntax-highlighter": "^15.5.0", 31 | "recoil": "^0.7.7", 32 | "uuid": "^9.0.0" 33 | }, 34 | "devDependencies": { 35 | "@tauri-apps/cli": "^1.5.6", 36 | "@types/node": "^18.7.10", 37 | "@types/react": "^18.0.15", 38 | "@types/react-dom": "^18.0.6", 39 | "@types/uuid": "^9.0.2", 40 | "@vitejs/plugin-react": "^3.0.0", 41 | "typescript": "^4.6.4", 42 | "vite": "^4.5.3" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /public/tauri.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | -------------------------------------------------------------------------------- /src-tauri/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.20.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.0.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "alloc-no-stdlib" 31 | version = "2.0.4" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 34 | 35 | [[package]] 36 | name = "alloc-stdlib" 37 | version = "0.2.2" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 40 | dependencies = [ 41 | "alloc-no-stdlib", 42 | ] 43 | 44 | [[package]] 45 | name = "android-tzdata" 46 | version = "0.1.1" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 49 | 50 | [[package]] 51 | name = "android_system_properties" 52 | version = "0.1.5" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 55 | dependencies = [ 56 | "libc", 57 | ] 58 | 59 | [[package]] 60 | name = "anyhow" 61 | version = "1.0.72" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" 64 | 65 | [[package]] 66 | name = "atk" 67 | version = "0.15.1" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" 70 | dependencies = [ 71 | "atk-sys", 72 | "bitflags 1.3.2", 73 | "glib", 74 | "libc", 75 | ] 76 | 77 | [[package]] 78 | name = "atk-sys" 79 | version = "0.15.1" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" 82 | dependencies = [ 83 | "glib-sys", 84 | "gobject-sys", 85 | "libc", 86 | "system-deps 6.1.1", 87 | ] 88 | 89 | [[package]] 90 | name = "autocfg" 91 | version = "1.1.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 94 | 95 | [[package]] 96 | name = "backtrace" 97 | version = "0.3.68" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" 100 | dependencies = [ 101 | "addr2line", 102 | "cc", 103 | "cfg-if", 104 | "libc", 105 | "miniz_oxide", 106 | "object", 107 | "rustc-demangle", 108 | ] 109 | 110 | [[package]] 111 | name = "base64" 112 | version = "0.13.1" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 115 | 116 | [[package]] 117 | name = "base64" 118 | version = "0.21.2" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" 121 | 122 | [[package]] 123 | name = "bitflags" 124 | version = "1.3.2" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 127 | 128 | [[package]] 129 | name = "bitflags" 130 | version = "2.4.2" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" 133 | 134 | [[package]] 135 | name = "block" 136 | version = "0.1.6" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 139 | 140 | [[package]] 141 | name = "block-buffer" 142 | version = "0.10.4" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 145 | dependencies = [ 146 | "generic-array", 147 | ] 148 | 149 | [[package]] 150 | name = "brotli" 151 | version = "3.3.4" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 154 | dependencies = [ 155 | "alloc-no-stdlib", 156 | "alloc-stdlib", 157 | "brotli-decompressor", 158 | ] 159 | 160 | [[package]] 161 | name = "brotli-decompressor" 162 | version = "2.3.4" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" 165 | dependencies = [ 166 | "alloc-no-stdlib", 167 | "alloc-stdlib", 168 | ] 169 | 170 | [[package]] 171 | name = "bstr" 172 | version = "1.6.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" 175 | dependencies = [ 176 | "memchr", 177 | "serde", 178 | ] 179 | 180 | [[package]] 181 | name = "bumpalo" 182 | version = "3.13.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" 185 | 186 | [[package]] 187 | name = "bytemuck" 188 | version = "1.13.1" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" 191 | 192 | [[package]] 193 | name = "byteorder" 194 | version = "1.4.3" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 197 | 198 | [[package]] 199 | name = "bytes" 200 | version = "1.4.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 203 | dependencies = [ 204 | "serde", 205 | ] 206 | 207 | [[package]] 208 | name = "cairo-rs" 209 | version = "0.15.12" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" 212 | dependencies = [ 213 | "bitflags 1.3.2", 214 | "cairo-sys-rs", 215 | "glib", 216 | "libc", 217 | "thiserror", 218 | ] 219 | 220 | [[package]] 221 | name = "cairo-sys-rs" 222 | version = "0.15.1" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" 225 | dependencies = [ 226 | "glib-sys", 227 | "libc", 228 | "system-deps 6.1.1", 229 | ] 230 | 231 | [[package]] 232 | name = "cargo_toml" 233 | version = "0.15.3" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" 236 | dependencies = [ 237 | "serde", 238 | "toml 0.7.6", 239 | ] 240 | 241 | [[package]] 242 | name = "cc" 243 | version = "1.0.79" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 246 | 247 | [[package]] 248 | name = "cesu8" 249 | version = "1.1.0" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 252 | 253 | [[package]] 254 | name = "cfb" 255 | version = "0.7.3" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" 258 | dependencies = [ 259 | "byteorder", 260 | "fnv", 261 | "uuid", 262 | ] 263 | 264 | [[package]] 265 | name = "cfg-expr" 266 | version = "0.9.1" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" 269 | dependencies = [ 270 | "smallvec", 271 | ] 272 | 273 | [[package]] 274 | name = "cfg-expr" 275 | version = "0.15.3" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" 278 | dependencies = [ 279 | "smallvec", 280 | "target-lexicon", 281 | ] 282 | 283 | [[package]] 284 | name = "cfg-if" 285 | version = "1.0.0" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 288 | 289 | [[package]] 290 | name = "chrono" 291 | version = "0.4.26" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" 294 | dependencies = [ 295 | "android-tzdata", 296 | "iana-time-zone", 297 | "num-traits", 298 | "serde", 299 | "winapi", 300 | ] 301 | 302 | [[package]] 303 | name = "cocoa" 304 | version = "0.24.1" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 307 | dependencies = [ 308 | "bitflags 1.3.2", 309 | "block", 310 | "cocoa-foundation", 311 | "core-foundation", 312 | "core-graphics", 313 | "foreign-types", 314 | "libc", 315 | "objc", 316 | ] 317 | 318 | [[package]] 319 | name = "cocoa-foundation" 320 | version = "0.1.1" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" 323 | dependencies = [ 324 | "bitflags 1.3.2", 325 | "block", 326 | "core-foundation", 327 | "core-graphics-types", 328 | "foreign-types", 329 | "libc", 330 | "objc", 331 | ] 332 | 333 | [[package]] 334 | name = "color_quant" 335 | version = "1.1.0" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 338 | 339 | [[package]] 340 | name = "combine" 341 | version = "4.6.6" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 344 | dependencies = [ 345 | "bytes", 346 | "memchr", 347 | ] 348 | 349 | [[package]] 350 | name = "convert_case" 351 | version = "0.4.0" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 354 | 355 | [[package]] 356 | name = "core-foundation" 357 | version = "0.9.3" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 360 | dependencies = [ 361 | "core-foundation-sys", 362 | "libc", 363 | ] 364 | 365 | [[package]] 366 | name = "core-foundation-sys" 367 | version = "0.8.4" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 370 | 371 | [[package]] 372 | name = "core-graphics" 373 | version = "0.22.3" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 376 | dependencies = [ 377 | "bitflags 1.3.2", 378 | "core-foundation", 379 | "core-graphics-types", 380 | "foreign-types", 381 | "libc", 382 | ] 383 | 384 | [[package]] 385 | name = "core-graphics-types" 386 | version = "0.1.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" 389 | dependencies = [ 390 | "bitflags 1.3.2", 391 | "core-foundation", 392 | "libc", 393 | ] 394 | 395 | [[package]] 396 | name = "cpufeatures" 397 | version = "0.2.9" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" 400 | dependencies = [ 401 | "libc", 402 | ] 403 | 404 | [[package]] 405 | name = "crc32fast" 406 | version = "1.3.2" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 409 | dependencies = [ 410 | "cfg-if", 411 | ] 412 | 413 | [[package]] 414 | name = "crossbeam-channel" 415 | version = "0.5.8" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" 418 | dependencies = [ 419 | "cfg-if", 420 | "crossbeam-utils", 421 | ] 422 | 423 | [[package]] 424 | name = "crossbeam-utils" 425 | version = "0.8.16" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 428 | dependencies = [ 429 | "cfg-if", 430 | ] 431 | 432 | [[package]] 433 | name = "crypto-common" 434 | version = "0.1.6" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 437 | dependencies = [ 438 | "generic-array", 439 | "typenum", 440 | ] 441 | 442 | [[package]] 443 | name = "cssparser" 444 | version = "0.27.2" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 447 | dependencies = [ 448 | "cssparser-macros", 449 | "dtoa-short", 450 | "itoa 0.4.8", 451 | "matches", 452 | "phf 0.8.0", 453 | "proc-macro2", 454 | "quote", 455 | "smallvec", 456 | "syn 1.0.109", 457 | ] 458 | 459 | [[package]] 460 | name = "cssparser-macros" 461 | version = "0.6.1" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 464 | dependencies = [ 465 | "quote", 466 | "syn 2.0.26", 467 | ] 468 | 469 | [[package]] 470 | name = "ctor" 471 | version = "0.1.26" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 474 | dependencies = [ 475 | "quote", 476 | "syn 1.0.109", 477 | ] 478 | 479 | [[package]] 480 | name = "darling" 481 | version = "0.20.3" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" 484 | dependencies = [ 485 | "darling_core", 486 | "darling_macro", 487 | ] 488 | 489 | [[package]] 490 | name = "darling_core" 491 | version = "0.20.3" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" 494 | dependencies = [ 495 | "fnv", 496 | "ident_case", 497 | "proc-macro2", 498 | "quote", 499 | "strsim", 500 | "syn 2.0.26", 501 | ] 502 | 503 | [[package]] 504 | name = "darling_macro" 505 | version = "0.20.3" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" 508 | dependencies = [ 509 | "darling_core", 510 | "quote", 511 | "syn 2.0.26", 512 | ] 513 | 514 | [[package]] 515 | name = "derive_more" 516 | version = "0.99.17" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 519 | dependencies = [ 520 | "convert_case", 521 | "proc-macro2", 522 | "quote", 523 | "rustc_version", 524 | "syn 1.0.109", 525 | ] 526 | 527 | [[package]] 528 | name = "digest" 529 | version = "0.10.7" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 532 | dependencies = [ 533 | "block-buffer", 534 | "crypto-common", 535 | ] 536 | 537 | [[package]] 538 | name = "dirs-next" 539 | version = "2.0.0" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 542 | dependencies = [ 543 | "cfg-if", 544 | "dirs-sys-next", 545 | ] 546 | 547 | [[package]] 548 | name = "dirs-sys-next" 549 | version = "0.1.2" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 552 | dependencies = [ 553 | "libc", 554 | "redox_users", 555 | "winapi", 556 | ] 557 | 558 | [[package]] 559 | name = "dispatch" 560 | version = "0.2.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 563 | 564 | [[package]] 565 | name = "dtoa" 566 | version = "1.0.9" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 569 | 570 | [[package]] 571 | name = "dtoa-short" 572 | version = "0.3.4" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" 575 | dependencies = [ 576 | "dtoa", 577 | ] 578 | 579 | [[package]] 580 | name = "dunce" 581 | version = "1.0.4" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" 584 | 585 | [[package]] 586 | name = "embed-resource" 587 | version = "2.2.0" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" 590 | dependencies = [ 591 | "cc", 592 | "rustc_version", 593 | "toml 0.7.6", 594 | "vswhom", 595 | "winreg 0.11.0", 596 | ] 597 | 598 | [[package]] 599 | name = "embed_plist" 600 | version = "1.2.2" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" 603 | 604 | [[package]] 605 | name = "encoding_rs" 606 | version = "0.8.32" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 609 | dependencies = [ 610 | "cfg-if", 611 | ] 612 | 613 | [[package]] 614 | name = "equivalent" 615 | version = "1.0.1" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 618 | 619 | [[package]] 620 | name = "errno" 621 | version = "0.3.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" 624 | dependencies = [ 625 | "errno-dragonfly", 626 | "libc", 627 | "windows-sys 0.48.0", 628 | ] 629 | 630 | [[package]] 631 | name = "errno-dragonfly" 632 | version = "0.1.2" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 635 | dependencies = [ 636 | "cc", 637 | "libc", 638 | ] 639 | 640 | [[package]] 641 | name = "fastrand" 642 | version = "1.9.0" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 645 | dependencies = [ 646 | "instant", 647 | ] 648 | 649 | [[package]] 650 | name = "fdeflate" 651 | version = "0.3.0" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" 654 | dependencies = [ 655 | "simd-adler32", 656 | ] 657 | 658 | [[package]] 659 | name = "field-offset" 660 | version = "0.3.6" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" 663 | dependencies = [ 664 | "memoffset", 665 | "rustc_version", 666 | ] 667 | 668 | [[package]] 669 | name = "filetime" 670 | version = "0.2.21" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" 673 | dependencies = [ 674 | "cfg-if", 675 | "libc", 676 | "redox_syscall 0.2.16", 677 | "windows-sys 0.48.0", 678 | ] 679 | 680 | [[package]] 681 | name = "flate2" 682 | version = "1.0.26" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" 685 | dependencies = [ 686 | "crc32fast", 687 | "miniz_oxide", 688 | ] 689 | 690 | [[package]] 691 | name = "fnv" 692 | version = "1.0.7" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 695 | 696 | [[package]] 697 | name = "foreign-types" 698 | version = "0.3.2" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 701 | dependencies = [ 702 | "foreign-types-shared", 703 | ] 704 | 705 | [[package]] 706 | name = "foreign-types-shared" 707 | version = "0.1.1" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 710 | 711 | [[package]] 712 | name = "form_urlencoded" 713 | version = "1.2.0" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 716 | dependencies = [ 717 | "percent-encoding", 718 | ] 719 | 720 | [[package]] 721 | name = "futf" 722 | version = "0.1.5" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 725 | dependencies = [ 726 | "mac", 727 | "new_debug_unreachable", 728 | ] 729 | 730 | [[package]] 731 | name = "futures-channel" 732 | version = "0.3.28" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" 735 | dependencies = [ 736 | "futures-core", 737 | ] 738 | 739 | [[package]] 740 | name = "futures-core" 741 | version = "0.3.28" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 744 | 745 | [[package]] 746 | name = "futures-executor" 747 | version = "0.3.28" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" 750 | dependencies = [ 751 | "futures-core", 752 | "futures-task", 753 | "futures-util", 754 | ] 755 | 756 | [[package]] 757 | name = "futures-io" 758 | version = "0.3.28" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" 761 | 762 | [[package]] 763 | name = "futures-macro" 764 | version = "0.3.28" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" 767 | dependencies = [ 768 | "proc-macro2", 769 | "quote", 770 | "syn 2.0.26", 771 | ] 772 | 773 | [[package]] 774 | name = "futures-sink" 775 | version = "0.3.28" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 778 | 779 | [[package]] 780 | name = "futures-task" 781 | version = "0.3.28" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" 784 | 785 | [[package]] 786 | name = "futures-util" 787 | version = "0.3.28" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" 790 | dependencies = [ 791 | "futures-core", 792 | "futures-io", 793 | "futures-macro", 794 | "futures-sink", 795 | "futures-task", 796 | "memchr", 797 | "pin-project-lite", 798 | "pin-utils", 799 | "slab", 800 | ] 801 | 802 | [[package]] 803 | name = "fxhash" 804 | version = "0.2.1" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 807 | dependencies = [ 808 | "byteorder", 809 | ] 810 | 811 | [[package]] 812 | name = "gdk" 813 | version = "0.15.4" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" 816 | dependencies = [ 817 | "bitflags 1.3.2", 818 | "cairo-rs", 819 | "gdk-pixbuf", 820 | "gdk-sys", 821 | "gio", 822 | "glib", 823 | "libc", 824 | "pango", 825 | ] 826 | 827 | [[package]] 828 | name = "gdk-pixbuf" 829 | version = "0.15.11" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" 832 | dependencies = [ 833 | "bitflags 1.3.2", 834 | "gdk-pixbuf-sys", 835 | "gio", 836 | "glib", 837 | "libc", 838 | ] 839 | 840 | [[package]] 841 | name = "gdk-pixbuf-sys" 842 | version = "0.15.10" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" 845 | dependencies = [ 846 | "gio-sys", 847 | "glib-sys", 848 | "gobject-sys", 849 | "libc", 850 | "system-deps 6.1.1", 851 | ] 852 | 853 | [[package]] 854 | name = "gdk-sys" 855 | version = "0.15.1" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" 858 | dependencies = [ 859 | "cairo-sys-rs", 860 | "gdk-pixbuf-sys", 861 | "gio-sys", 862 | "glib-sys", 863 | "gobject-sys", 864 | "libc", 865 | "pango-sys", 866 | "pkg-config", 867 | "system-deps 6.1.1", 868 | ] 869 | 870 | [[package]] 871 | name = "gdkwayland-sys" 872 | version = "0.15.3" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" 875 | dependencies = [ 876 | "gdk-sys", 877 | "glib-sys", 878 | "gobject-sys", 879 | "libc", 880 | "pkg-config", 881 | "system-deps 6.1.1", 882 | ] 883 | 884 | [[package]] 885 | name = "gdkx11-sys" 886 | version = "0.15.1" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" 889 | dependencies = [ 890 | "gdk-sys", 891 | "glib-sys", 892 | "libc", 893 | "system-deps 6.1.1", 894 | "x11", 895 | ] 896 | 897 | [[package]] 898 | name = "generator" 899 | version = "0.7.5" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" 902 | dependencies = [ 903 | "cc", 904 | "libc", 905 | "log", 906 | "rustversion", 907 | "windows 0.48.0", 908 | ] 909 | 910 | [[package]] 911 | name = "generic-array" 912 | version = "0.14.7" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 915 | dependencies = [ 916 | "typenum", 917 | "version_check", 918 | ] 919 | 920 | [[package]] 921 | name = "getrandom" 922 | version = "0.1.16" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 925 | dependencies = [ 926 | "cfg-if", 927 | "libc", 928 | "wasi 0.9.0+wasi-snapshot-preview1", 929 | ] 930 | 931 | [[package]] 932 | name = "getrandom" 933 | version = "0.2.10" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" 936 | dependencies = [ 937 | "cfg-if", 938 | "libc", 939 | "wasi 0.11.0+wasi-snapshot-preview1", 940 | ] 941 | 942 | [[package]] 943 | name = "gimli" 944 | version = "0.27.3" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" 947 | 948 | [[package]] 949 | name = "gio" 950 | version = "0.15.12" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" 953 | dependencies = [ 954 | "bitflags 1.3.2", 955 | "futures-channel", 956 | "futures-core", 957 | "futures-io", 958 | "gio-sys", 959 | "glib", 960 | "libc", 961 | "once_cell", 962 | "thiserror", 963 | ] 964 | 965 | [[package]] 966 | name = "gio-sys" 967 | version = "0.15.10" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" 970 | dependencies = [ 971 | "glib-sys", 972 | "gobject-sys", 973 | "libc", 974 | "system-deps 6.1.1", 975 | "winapi", 976 | ] 977 | 978 | [[package]] 979 | name = "glib" 980 | version = "0.15.12" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" 983 | dependencies = [ 984 | "bitflags 1.3.2", 985 | "futures-channel", 986 | "futures-core", 987 | "futures-executor", 988 | "futures-task", 989 | "glib-macros", 990 | "glib-sys", 991 | "gobject-sys", 992 | "libc", 993 | "once_cell", 994 | "smallvec", 995 | "thiserror", 996 | ] 997 | 998 | [[package]] 999 | name = "glib-macros" 1000 | version = "0.15.13" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" 1003 | dependencies = [ 1004 | "anyhow", 1005 | "heck 0.4.1", 1006 | "proc-macro-crate", 1007 | "proc-macro-error", 1008 | "proc-macro2", 1009 | "quote", 1010 | "syn 1.0.109", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "glib-sys" 1015 | version = "0.15.10" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" 1018 | dependencies = [ 1019 | "libc", 1020 | "system-deps 6.1.1", 1021 | ] 1022 | 1023 | [[package]] 1024 | name = "glob" 1025 | version = "0.3.1" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 1028 | 1029 | [[package]] 1030 | name = "globset" 1031 | version = "0.4.11" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" 1034 | dependencies = [ 1035 | "aho-corasick", 1036 | "bstr", 1037 | "fnv", 1038 | "log", 1039 | "regex", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "gobject-sys" 1044 | version = "0.15.10" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" 1047 | dependencies = [ 1048 | "glib-sys", 1049 | "libc", 1050 | "system-deps 6.1.1", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "gtk" 1055 | version = "0.15.5" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" 1058 | dependencies = [ 1059 | "atk", 1060 | "bitflags 1.3.2", 1061 | "cairo-rs", 1062 | "field-offset", 1063 | "futures-channel", 1064 | "gdk", 1065 | "gdk-pixbuf", 1066 | "gio", 1067 | "glib", 1068 | "gtk-sys", 1069 | "gtk3-macros", 1070 | "libc", 1071 | "once_cell", 1072 | "pango", 1073 | "pkg-config", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "gtk-sys" 1078 | version = "0.15.3" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" 1081 | dependencies = [ 1082 | "atk-sys", 1083 | "cairo-sys-rs", 1084 | "gdk-pixbuf-sys", 1085 | "gdk-sys", 1086 | "gio-sys", 1087 | "glib-sys", 1088 | "gobject-sys", 1089 | "libc", 1090 | "pango-sys", 1091 | "system-deps 6.1.1", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "gtk3-macros" 1096 | version = "0.15.6" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" 1099 | dependencies = [ 1100 | "anyhow", 1101 | "proc-macro-crate", 1102 | "proc-macro-error", 1103 | "proc-macro2", 1104 | "quote", 1105 | "syn 1.0.109", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "h2" 1110 | version = "0.3.26" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 1113 | dependencies = [ 1114 | "bytes", 1115 | "fnv", 1116 | "futures-core", 1117 | "futures-sink", 1118 | "futures-util", 1119 | "http", 1120 | "indexmap 2.0.0", 1121 | "slab", 1122 | "tokio", 1123 | "tokio-util", 1124 | "tracing", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "hashbrown" 1129 | version = "0.12.3" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1132 | 1133 | [[package]] 1134 | name = "hashbrown" 1135 | version = "0.14.0" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" 1138 | 1139 | [[package]] 1140 | name = "heck" 1141 | version = "0.3.3" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1144 | dependencies = [ 1145 | "unicode-segmentation", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "heck" 1150 | version = "0.4.1" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1153 | 1154 | [[package]] 1155 | name = "hermit-abi" 1156 | version = "0.3.2" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" 1159 | 1160 | [[package]] 1161 | name = "hex" 1162 | version = "0.4.3" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1165 | 1166 | [[package]] 1167 | name = "html5ever" 1168 | version = "0.25.2" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" 1171 | dependencies = [ 1172 | "log", 1173 | "mac", 1174 | "markup5ever", 1175 | "proc-macro2", 1176 | "quote", 1177 | "syn 1.0.109", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "http" 1182 | version = "0.2.9" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 1185 | dependencies = [ 1186 | "bytes", 1187 | "fnv", 1188 | "itoa 1.0.9", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "http-body" 1193 | version = "0.4.5" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1196 | dependencies = [ 1197 | "bytes", 1198 | "http", 1199 | "pin-project-lite", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "http-range" 1204 | version = "0.1.5" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1207 | 1208 | [[package]] 1209 | name = "httparse" 1210 | version = "1.8.0" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1213 | 1214 | [[package]] 1215 | name = "httpdate" 1216 | version = "1.0.2" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1219 | 1220 | [[package]] 1221 | name = "hyper" 1222 | version = "0.14.27" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 1225 | dependencies = [ 1226 | "bytes", 1227 | "futures-channel", 1228 | "futures-core", 1229 | "futures-util", 1230 | "h2", 1231 | "http", 1232 | "http-body", 1233 | "httparse", 1234 | "httpdate", 1235 | "itoa 1.0.9", 1236 | "pin-project-lite", 1237 | "socket2", 1238 | "tokio", 1239 | "tower-service", 1240 | "tracing", 1241 | "want", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "hyper-tls" 1246 | version = "0.5.0" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1249 | dependencies = [ 1250 | "bytes", 1251 | "hyper", 1252 | "native-tls", 1253 | "tokio", 1254 | "tokio-native-tls", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "iana-time-zone" 1259 | version = "0.1.57" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" 1262 | dependencies = [ 1263 | "android_system_properties", 1264 | "core-foundation-sys", 1265 | "iana-time-zone-haiku", 1266 | "js-sys", 1267 | "wasm-bindgen", 1268 | "windows 0.48.0", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "iana-time-zone-haiku" 1273 | version = "0.1.2" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1276 | dependencies = [ 1277 | "cc", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "ico" 1282 | version = "0.3.0" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" 1285 | dependencies = [ 1286 | "byteorder", 1287 | "png", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "ident_case" 1292 | version = "1.0.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1295 | 1296 | [[package]] 1297 | name = "idna" 1298 | version = "0.4.0" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 1301 | dependencies = [ 1302 | "unicode-bidi", 1303 | "unicode-normalization", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "ignore" 1308 | version = "0.4.20" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" 1311 | dependencies = [ 1312 | "globset", 1313 | "lazy_static", 1314 | "log", 1315 | "memchr", 1316 | "regex", 1317 | "same-file", 1318 | "thread_local", 1319 | "walkdir", 1320 | "winapi-util", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "image" 1325 | version = "0.24.6" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" 1328 | dependencies = [ 1329 | "bytemuck", 1330 | "byteorder", 1331 | "color_quant", 1332 | "num-rational", 1333 | "num-traits", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "indexmap" 1338 | version = "1.9.3" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1341 | dependencies = [ 1342 | "autocfg", 1343 | "hashbrown 0.12.3", 1344 | "serde", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "indexmap" 1349 | version = "2.0.0" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" 1352 | dependencies = [ 1353 | "equivalent", 1354 | "hashbrown 0.14.0", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "infer" 1359 | version = "0.12.0" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" 1362 | dependencies = [ 1363 | "cfb", 1364 | ] 1365 | 1366 | [[package]] 1367 | name = "instant" 1368 | version = "0.1.12" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1371 | dependencies = [ 1372 | "cfg-if", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "io-lifetimes" 1377 | version = "1.0.11" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" 1380 | dependencies = [ 1381 | "hermit-abi", 1382 | "libc", 1383 | "windows-sys 0.48.0", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "ipnet" 1388 | version = "2.8.0" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" 1391 | 1392 | [[package]] 1393 | name = "itoa" 1394 | version = "0.4.8" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1397 | 1398 | [[package]] 1399 | name = "itoa" 1400 | version = "1.0.9" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1403 | 1404 | [[package]] 1405 | name = "itos" 1406 | version = "0.0.0" 1407 | dependencies = [ 1408 | "serde", 1409 | "serde_json", 1410 | "tauri", 1411 | "tauri-build", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "javascriptcore-rs" 1416 | version = "0.16.0" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" 1419 | dependencies = [ 1420 | "bitflags 1.3.2", 1421 | "glib", 1422 | "javascriptcore-rs-sys", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "javascriptcore-rs-sys" 1427 | version = "0.4.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" 1430 | dependencies = [ 1431 | "glib-sys", 1432 | "gobject-sys", 1433 | "libc", 1434 | "system-deps 5.0.0", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "jni" 1439 | version = "0.20.0" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" 1442 | dependencies = [ 1443 | "cesu8", 1444 | "combine", 1445 | "jni-sys", 1446 | "log", 1447 | "thiserror", 1448 | "walkdir", 1449 | ] 1450 | 1451 | [[package]] 1452 | name = "jni-sys" 1453 | version = "0.3.0" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1456 | 1457 | [[package]] 1458 | name = "js-sys" 1459 | version = "0.3.64" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" 1462 | dependencies = [ 1463 | "wasm-bindgen", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "json-patch" 1468 | version = "1.0.0" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" 1471 | dependencies = [ 1472 | "serde", 1473 | "serde_json", 1474 | "thiserror", 1475 | "treediff", 1476 | ] 1477 | 1478 | [[package]] 1479 | name = "kuchiki" 1480 | version = "0.8.1" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" 1483 | dependencies = [ 1484 | "cssparser", 1485 | "html5ever", 1486 | "matches", 1487 | "selectors", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "lazy_static" 1492 | version = "1.4.0" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1495 | 1496 | [[package]] 1497 | name = "libc" 1498 | version = "0.2.153" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 1501 | 1502 | [[package]] 1503 | name = "line-wrap" 1504 | version = "0.1.1" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 1507 | dependencies = [ 1508 | "safemem", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "linux-raw-sys" 1513 | version = "0.3.8" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" 1516 | 1517 | [[package]] 1518 | name = "lock_api" 1519 | version = "0.4.10" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" 1522 | dependencies = [ 1523 | "autocfg", 1524 | "scopeguard", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "log" 1529 | version = "0.4.19" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" 1532 | 1533 | [[package]] 1534 | name = "loom" 1535 | version = "0.5.6" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1538 | dependencies = [ 1539 | "cfg-if", 1540 | "generator", 1541 | "scoped-tls", 1542 | "serde", 1543 | "serde_json", 1544 | "tracing", 1545 | "tracing-subscriber", 1546 | ] 1547 | 1548 | [[package]] 1549 | name = "mac" 1550 | version = "0.1.1" 1551 | source = "registry+https://github.com/rust-lang/crates.io-index" 1552 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1553 | 1554 | [[package]] 1555 | name = "malloc_buf" 1556 | version = "0.0.6" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1559 | dependencies = [ 1560 | "libc", 1561 | ] 1562 | 1563 | [[package]] 1564 | name = "markup5ever" 1565 | version = "0.10.1" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" 1568 | dependencies = [ 1569 | "log", 1570 | "phf 0.8.0", 1571 | "phf_codegen", 1572 | "string_cache", 1573 | "string_cache_codegen", 1574 | "tendril", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "matchers" 1579 | version = "0.1.0" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1582 | dependencies = [ 1583 | "regex-automata 0.1.10", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "matches" 1588 | version = "0.1.10" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 1591 | 1592 | [[package]] 1593 | name = "memchr" 1594 | version = "2.5.0" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1597 | 1598 | [[package]] 1599 | name = "memoffset" 1600 | version = "0.9.0" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 1603 | dependencies = [ 1604 | "autocfg", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "mime" 1609 | version = "0.3.17" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1612 | 1613 | [[package]] 1614 | name = "minisign-verify" 1615 | version = "0.2.1" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" 1618 | 1619 | [[package]] 1620 | name = "miniz_oxide" 1621 | version = "0.7.1" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1624 | dependencies = [ 1625 | "adler", 1626 | "simd-adler32", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "mio" 1631 | version = "0.8.11" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1634 | dependencies = [ 1635 | "libc", 1636 | "wasi 0.11.0+wasi-snapshot-preview1", 1637 | "windows-sys 0.48.0", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "native-tls" 1642 | version = "0.2.11" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1645 | dependencies = [ 1646 | "lazy_static", 1647 | "libc", 1648 | "log", 1649 | "openssl", 1650 | "openssl-probe", 1651 | "openssl-sys", 1652 | "schannel", 1653 | "security-framework", 1654 | "security-framework-sys", 1655 | "tempfile", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "ndk" 1660 | version = "0.6.0" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" 1663 | dependencies = [ 1664 | "bitflags 1.3.2", 1665 | "jni-sys", 1666 | "ndk-sys", 1667 | "num_enum", 1668 | "thiserror", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "ndk-context" 1673 | version = "0.1.1" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1676 | 1677 | [[package]] 1678 | name = "ndk-sys" 1679 | version = "0.3.0" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" 1682 | dependencies = [ 1683 | "jni-sys", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "new_debug_unreachable" 1688 | version = "1.0.4" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 1691 | 1692 | [[package]] 1693 | name = "nodrop" 1694 | version = "0.1.14" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1697 | 1698 | [[package]] 1699 | name = "nu-ansi-term" 1700 | version = "0.46.0" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1703 | dependencies = [ 1704 | "overload", 1705 | "winapi", 1706 | ] 1707 | 1708 | [[package]] 1709 | name = "num-integer" 1710 | version = "0.1.45" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1713 | dependencies = [ 1714 | "autocfg", 1715 | "num-traits", 1716 | ] 1717 | 1718 | [[package]] 1719 | name = "num-rational" 1720 | version = "0.4.1" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 1723 | dependencies = [ 1724 | "autocfg", 1725 | "num-integer", 1726 | "num-traits", 1727 | ] 1728 | 1729 | [[package]] 1730 | name = "num-traits" 1731 | version = "0.2.15" 1732 | source = "registry+https://github.com/rust-lang/crates.io-index" 1733 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1734 | dependencies = [ 1735 | "autocfg", 1736 | ] 1737 | 1738 | [[package]] 1739 | name = "num_cpus" 1740 | version = "1.16.0" 1741 | source = "registry+https://github.com/rust-lang/crates.io-index" 1742 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1743 | dependencies = [ 1744 | "hermit-abi", 1745 | "libc", 1746 | ] 1747 | 1748 | [[package]] 1749 | name = "num_enum" 1750 | version = "0.5.11" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" 1753 | dependencies = [ 1754 | "num_enum_derive", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "num_enum_derive" 1759 | version = "0.5.11" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" 1762 | dependencies = [ 1763 | "proc-macro-crate", 1764 | "proc-macro2", 1765 | "quote", 1766 | "syn 1.0.109", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "objc" 1771 | version = "0.2.7" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1774 | dependencies = [ 1775 | "malloc_buf", 1776 | "objc_exception", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "objc-foundation" 1781 | version = "0.1.1" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1784 | dependencies = [ 1785 | "block", 1786 | "objc", 1787 | "objc_id", 1788 | ] 1789 | 1790 | [[package]] 1791 | name = "objc_exception" 1792 | version = "0.1.2" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 1795 | dependencies = [ 1796 | "cc", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "objc_id" 1801 | version = "0.1.1" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1804 | dependencies = [ 1805 | "objc", 1806 | ] 1807 | 1808 | [[package]] 1809 | name = "object" 1810 | version = "0.31.1" 1811 | source = "registry+https://github.com/rust-lang/crates.io-index" 1812 | checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" 1813 | dependencies = [ 1814 | "memchr", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "once_cell" 1819 | version = "1.18.0" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 1822 | 1823 | [[package]] 1824 | name = "open" 1825 | version = "3.2.0" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" 1828 | dependencies = [ 1829 | "pathdiff", 1830 | "windows-sys 0.42.0", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "openssl" 1835 | version = "0.10.63" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" 1838 | dependencies = [ 1839 | "bitflags 2.4.2", 1840 | "cfg-if", 1841 | "foreign-types", 1842 | "libc", 1843 | "once_cell", 1844 | "openssl-macros", 1845 | "openssl-sys", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "openssl-macros" 1850 | version = "0.1.1" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1853 | dependencies = [ 1854 | "proc-macro2", 1855 | "quote", 1856 | "syn 2.0.26", 1857 | ] 1858 | 1859 | [[package]] 1860 | name = "openssl-probe" 1861 | version = "0.1.5" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1864 | 1865 | [[package]] 1866 | name = "openssl-sys" 1867 | version = "0.9.99" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" 1870 | dependencies = [ 1871 | "cc", 1872 | "libc", 1873 | "pkg-config", 1874 | "vcpkg", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "overload" 1879 | version = "0.1.1" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1882 | 1883 | [[package]] 1884 | name = "pango" 1885 | version = "0.15.10" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" 1888 | dependencies = [ 1889 | "bitflags 1.3.2", 1890 | "glib", 1891 | "libc", 1892 | "once_cell", 1893 | "pango-sys", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "pango-sys" 1898 | version = "0.15.10" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" 1901 | dependencies = [ 1902 | "glib-sys", 1903 | "gobject-sys", 1904 | "libc", 1905 | "system-deps 6.1.1", 1906 | ] 1907 | 1908 | [[package]] 1909 | name = "parking_lot" 1910 | version = "0.12.1" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1913 | dependencies = [ 1914 | "lock_api", 1915 | "parking_lot_core", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "parking_lot_core" 1920 | version = "0.9.8" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" 1923 | dependencies = [ 1924 | "cfg-if", 1925 | "libc", 1926 | "redox_syscall 0.3.5", 1927 | "smallvec", 1928 | "windows-targets", 1929 | ] 1930 | 1931 | [[package]] 1932 | name = "pathdiff" 1933 | version = "0.2.1" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 1936 | 1937 | [[package]] 1938 | name = "percent-encoding" 1939 | version = "2.3.0" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 1942 | 1943 | [[package]] 1944 | name = "phf" 1945 | version = "0.8.0" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1948 | dependencies = [ 1949 | "phf_macros 0.8.0", 1950 | "phf_shared 0.8.0", 1951 | "proc-macro-hack", 1952 | ] 1953 | 1954 | [[package]] 1955 | name = "phf" 1956 | version = "0.10.1" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1959 | dependencies = [ 1960 | "phf_macros 0.10.0", 1961 | "phf_shared 0.10.0", 1962 | "proc-macro-hack", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "phf_codegen" 1967 | version = "0.8.0" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1970 | dependencies = [ 1971 | "phf_generator 0.8.0", 1972 | "phf_shared 0.8.0", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "phf_generator" 1977 | version = "0.8.0" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1980 | dependencies = [ 1981 | "phf_shared 0.8.0", 1982 | "rand 0.7.3", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "phf_generator" 1987 | version = "0.10.0" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1990 | dependencies = [ 1991 | "phf_shared 0.10.0", 1992 | "rand 0.8.5", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "phf_macros" 1997 | version = "0.8.0" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 2000 | dependencies = [ 2001 | "phf_generator 0.8.0", 2002 | "phf_shared 0.8.0", 2003 | "proc-macro-hack", 2004 | "proc-macro2", 2005 | "quote", 2006 | "syn 1.0.109", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "phf_macros" 2011 | version = "0.10.0" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 2014 | dependencies = [ 2015 | "phf_generator 0.10.0", 2016 | "phf_shared 0.10.0", 2017 | "proc-macro-hack", 2018 | "proc-macro2", 2019 | "quote", 2020 | "syn 1.0.109", 2021 | ] 2022 | 2023 | [[package]] 2024 | name = "phf_shared" 2025 | version = "0.8.0" 2026 | source = "registry+https://github.com/rust-lang/crates.io-index" 2027 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 2028 | dependencies = [ 2029 | "siphasher", 2030 | ] 2031 | 2032 | [[package]] 2033 | name = "phf_shared" 2034 | version = "0.10.0" 2035 | source = "registry+https://github.com/rust-lang/crates.io-index" 2036 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 2037 | dependencies = [ 2038 | "siphasher", 2039 | ] 2040 | 2041 | [[package]] 2042 | name = "pin-project-lite" 2043 | version = "0.2.10" 2044 | source = "registry+https://github.com/rust-lang/crates.io-index" 2045 | checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" 2046 | 2047 | [[package]] 2048 | name = "pin-utils" 2049 | version = "0.1.0" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2052 | 2053 | [[package]] 2054 | name = "pkg-config" 2055 | version = "0.3.27" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 2058 | 2059 | [[package]] 2060 | name = "plist" 2061 | version = "1.5.0" 2062 | source = "registry+https://github.com/rust-lang/crates.io-index" 2063 | checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" 2064 | dependencies = [ 2065 | "base64 0.21.2", 2066 | "indexmap 1.9.3", 2067 | "line-wrap", 2068 | "quick-xml", 2069 | "serde", 2070 | "time", 2071 | ] 2072 | 2073 | [[package]] 2074 | name = "png" 2075 | version = "0.17.9" 2076 | source = "registry+https://github.com/rust-lang/crates.io-index" 2077 | checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" 2078 | dependencies = [ 2079 | "bitflags 1.3.2", 2080 | "crc32fast", 2081 | "fdeflate", 2082 | "flate2", 2083 | "miniz_oxide", 2084 | ] 2085 | 2086 | [[package]] 2087 | name = "ppv-lite86" 2088 | version = "0.2.17" 2089 | source = "registry+https://github.com/rust-lang/crates.io-index" 2090 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2091 | 2092 | [[package]] 2093 | name = "precomputed-hash" 2094 | version = "0.1.1" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2097 | 2098 | [[package]] 2099 | name = "proc-macro-crate" 2100 | version = "1.3.1" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 2103 | dependencies = [ 2104 | "once_cell", 2105 | "toml_edit", 2106 | ] 2107 | 2108 | [[package]] 2109 | name = "proc-macro-error" 2110 | version = "1.0.4" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2113 | dependencies = [ 2114 | "proc-macro-error-attr", 2115 | "proc-macro2", 2116 | "quote", 2117 | "syn 1.0.109", 2118 | "version_check", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "proc-macro-error-attr" 2123 | version = "1.0.4" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2126 | dependencies = [ 2127 | "proc-macro2", 2128 | "quote", 2129 | "version_check", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "proc-macro-hack" 2134 | version = "0.5.20+deprecated" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 2137 | 2138 | [[package]] 2139 | name = "proc-macro2" 2140 | version = "1.0.65" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "92de25114670a878b1261c79c9f8f729fb97e95bac93f6312f583c60dd6a1dfe" 2143 | dependencies = [ 2144 | "unicode-ident", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "quick-xml" 2149 | version = "0.29.0" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" 2152 | dependencies = [ 2153 | "memchr", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "quote" 2158 | version = "1.0.30" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "5907a1b7c277254a8b15170f6e7c97cfa60ee7872a3217663bb81151e48184bb" 2161 | dependencies = [ 2162 | "proc-macro2", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "rand" 2167 | version = "0.7.3" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2170 | dependencies = [ 2171 | "getrandom 0.1.16", 2172 | "libc", 2173 | "rand_chacha 0.2.2", 2174 | "rand_core 0.5.1", 2175 | "rand_hc", 2176 | "rand_pcg", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "rand" 2181 | version = "0.8.5" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2184 | dependencies = [ 2185 | "libc", 2186 | "rand_chacha 0.3.1", 2187 | "rand_core 0.6.4", 2188 | ] 2189 | 2190 | [[package]] 2191 | name = "rand_chacha" 2192 | version = "0.2.2" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2195 | dependencies = [ 2196 | "ppv-lite86", 2197 | "rand_core 0.5.1", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "rand_chacha" 2202 | version = "0.3.1" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2205 | dependencies = [ 2206 | "ppv-lite86", 2207 | "rand_core 0.6.4", 2208 | ] 2209 | 2210 | [[package]] 2211 | name = "rand_core" 2212 | version = "0.5.1" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2215 | dependencies = [ 2216 | "getrandom 0.1.16", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "rand_core" 2221 | version = "0.6.4" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2224 | dependencies = [ 2225 | "getrandom 0.2.10", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "rand_hc" 2230 | version = "0.2.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2233 | dependencies = [ 2234 | "rand_core 0.5.1", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "rand_pcg" 2239 | version = "0.2.1" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2242 | dependencies = [ 2243 | "rand_core 0.5.1", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "raw-window-handle" 2248 | version = "0.5.2" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" 2251 | 2252 | [[package]] 2253 | name = "redox_syscall" 2254 | version = "0.2.16" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2257 | dependencies = [ 2258 | "bitflags 1.3.2", 2259 | ] 2260 | 2261 | [[package]] 2262 | name = "redox_syscall" 2263 | version = "0.3.5" 2264 | source = "registry+https://github.com/rust-lang/crates.io-index" 2265 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 2266 | dependencies = [ 2267 | "bitflags 1.3.2", 2268 | ] 2269 | 2270 | [[package]] 2271 | name = "redox_users" 2272 | version = "0.4.3" 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" 2274 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2275 | dependencies = [ 2276 | "getrandom 0.2.10", 2277 | "redox_syscall 0.2.16", 2278 | "thiserror", 2279 | ] 2280 | 2281 | [[package]] 2282 | name = "regex" 2283 | version = "1.9.1" 2284 | source = "registry+https://github.com/rust-lang/crates.io-index" 2285 | checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" 2286 | dependencies = [ 2287 | "aho-corasick", 2288 | "memchr", 2289 | "regex-automata 0.3.3", 2290 | "regex-syntax 0.7.4", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "regex-automata" 2295 | version = "0.1.10" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2298 | dependencies = [ 2299 | "regex-syntax 0.6.29", 2300 | ] 2301 | 2302 | [[package]] 2303 | name = "regex-automata" 2304 | version = "0.3.3" 2305 | source = "registry+https://github.com/rust-lang/crates.io-index" 2306 | checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" 2307 | dependencies = [ 2308 | "aho-corasick", 2309 | "memchr", 2310 | "regex-syntax 0.7.4", 2311 | ] 2312 | 2313 | [[package]] 2314 | name = "regex-syntax" 2315 | version = "0.6.29" 2316 | source = "registry+https://github.com/rust-lang/crates.io-index" 2317 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 2318 | 2319 | [[package]] 2320 | name = "regex-syntax" 2321 | version = "0.7.4" 2322 | source = "registry+https://github.com/rust-lang/crates.io-index" 2323 | checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" 2324 | 2325 | [[package]] 2326 | name = "reqwest" 2327 | version = "0.11.18" 2328 | source = "registry+https://github.com/rust-lang/crates.io-index" 2329 | checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" 2330 | dependencies = [ 2331 | "base64 0.21.2", 2332 | "bytes", 2333 | "encoding_rs", 2334 | "futures-core", 2335 | "futures-util", 2336 | "h2", 2337 | "http", 2338 | "http-body", 2339 | "hyper", 2340 | "hyper-tls", 2341 | "ipnet", 2342 | "js-sys", 2343 | "log", 2344 | "mime", 2345 | "native-tls", 2346 | "once_cell", 2347 | "percent-encoding", 2348 | "pin-project-lite", 2349 | "serde", 2350 | "serde_json", 2351 | "serde_urlencoded", 2352 | "tokio", 2353 | "tokio-native-tls", 2354 | "tokio-util", 2355 | "tower-service", 2356 | "url", 2357 | "wasm-bindgen", 2358 | "wasm-bindgen-futures", 2359 | "wasm-streams", 2360 | "web-sys", 2361 | "winreg 0.10.1", 2362 | ] 2363 | 2364 | [[package]] 2365 | name = "rfd" 2366 | version = "0.10.0" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" 2369 | dependencies = [ 2370 | "block", 2371 | "dispatch", 2372 | "glib-sys", 2373 | "gobject-sys", 2374 | "gtk-sys", 2375 | "js-sys", 2376 | "lazy_static", 2377 | "log", 2378 | "objc", 2379 | "objc-foundation", 2380 | "objc_id", 2381 | "raw-window-handle", 2382 | "wasm-bindgen", 2383 | "wasm-bindgen-futures", 2384 | "web-sys", 2385 | "windows 0.37.0", 2386 | ] 2387 | 2388 | [[package]] 2389 | name = "rustc-demangle" 2390 | version = "0.1.23" 2391 | source = "registry+https://github.com/rust-lang/crates.io-index" 2392 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 2393 | 2394 | [[package]] 2395 | name = "rustc_version" 2396 | version = "0.4.0" 2397 | source = "registry+https://github.com/rust-lang/crates.io-index" 2398 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2399 | dependencies = [ 2400 | "semver", 2401 | ] 2402 | 2403 | [[package]] 2404 | name = "rustix" 2405 | version = "0.37.27" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" 2408 | dependencies = [ 2409 | "bitflags 1.3.2", 2410 | "errno", 2411 | "io-lifetimes", 2412 | "libc", 2413 | "linux-raw-sys", 2414 | "windows-sys 0.48.0", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "rustversion" 2419 | version = "1.0.14" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 2422 | 2423 | [[package]] 2424 | name = "ryu" 2425 | version = "1.0.15" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 2428 | 2429 | [[package]] 2430 | name = "safemem" 2431 | version = "0.3.3" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2434 | 2435 | [[package]] 2436 | name = "same-file" 2437 | version = "1.0.6" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2440 | dependencies = [ 2441 | "winapi-util", 2442 | ] 2443 | 2444 | [[package]] 2445 | name = "schannel" 2446 | version = "0.1.22" 2447 | source = "registry+https://github.com/rust-lang/crates.io-index" 2448 | checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" 2449 | dependencies = [ 2450 | "windows-sys 0.48.0", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "scoped-tls" 2455 | version = "1.0.1" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2458 | 2459 | [[package]] 2460 | name = "scopeguard" 2461 | version = "1.1.0" 2462 | source = "registry+https://github.com/rust-lang/crates.io-index" 2463 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2464 | 2465 | [[package]] 2466 | name = "security-framework" 2467 | version = "2.9.1" 2468 | source = "registry+https://github.com/rust-lang/crates.io-index" 2469 | checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" 2470 | dependencies = [ 2471 | "bitflags 1.3.2", 2472 | "core-foundation", 2473 | "core-foundation-sys", 2474 | "libc", 2475 | "security-framework-sys", 2476 | ] 2477 | 2478 | [[package]] 2479 | name = "security-framework-sys" 2480 | version = "2.9.0" 2481 | source = "registry+https://github.com/rust-lang/crates.io-index" 2482 | checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" 2483 | dependencies = [ 2484 | "core-foundation-sys", 2485 | "libc", 2486 | ] 2487 | 2488 | [[package]] 2489 | name = "selectors" 2490 | version = "0.22.0" 2491 | source = "registry+https://github.com/rust-lang/crates.io-index" 2492 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2493 | dependencies = [ 2494 | "bitflags 1.3.2", 2495 | "cssparser", 2496 | "derive_more", 2497 | "fxhash", 2498 | "log", 2499 | "matches", 2500 | "phf 0.8.0", 2501 | "phf_codegen", 2502 | "precomputed-hash", 2503 | "servo_arc", 2504 | "smallvec", 2505 | "thin-slice", 2506 | ] 2507 | 2508 | [[package]] 2509 | name = "semver" 2510 | version = "1.0.18" 2511 | source = "registry+https://github.com/rust-lang/crates.io-index" 2512 | checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" 2513 | dependencies = [ 2514 | "serde", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "serde" 2519 | version = "1.0.171" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" 2522 | dependencies = [ 2523 | "serde_derive", 2524 | ] 2525 | 2526 | [[package]] 2527 | name = "serde_derive" 2528 | version = "1.0.171" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" 2531 | dependencies = [ 2532 | "proc-macro2", 2533 | "quote", 2534 | "syn 2.0.26", 2535 | ] 2536 | 2537 | [[package]] 2538 | name = "serde_json" 2539 | version = "1.0.103" 2540 | source = "registry+https://github.com/rust-lang/crates.io-index" 2541 | checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" 2542 | dependencies = [ 2543 | "itoa 1.0.9", 2544 | "ryu", 2545 | "serde", 2546 | ] 2547 | 2548 | [[package]] 2549 | name = "serde_repr" 2550 | version = "0.1.14" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "1d89a8107374290037607734c0b73a85db7ed80cae314b3c5791f192a496e731" 2553 | dependencies = [ 2554 | "proc-macro2", 2555 | "quote", 2556 | "syn 2.0.26", 2557 | ] 2558 | 2559 | [[package]] 2560 | name = "serde_spanned" 2561 | version = "0.6.3" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" 2564 | dependencies = [ 2565 | "serde", 2566 | ] 2567 | 2568 | [[package]] 2569 | name = "serde_urlencoded" 2570 | version = "0.7.1" 2571 | source = "registry+https://github.com/rust-lang/crates.io-index" 2572 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2573 | dependencies = [ 2574 | "form_urlencoded", 2575 | "itoa 1.0.9", 2576 | "ryu", 2577 | "serde", 2578 | ] 2579 | 2580 | [[package]] 2581 | name = "serde_with" 2582 | version = "3.0.0" 2583 | source = "registry+https://github.com/rust-lang/crates.io-index" 2584 | checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" 2585 | dependencies = [ 2586 | "base64 0.21.2", 2587 | "chrono", 2588 | "hex", 2589 | "indexmap 1.9.3", 2590 | "serde", 2591 | "serde_json", 2592 | "serde_with_macros", 2593 | "time", 2594 | ] 2595 | 2596 | [[package]] 2597 | name = "serde_with_macros" 2598 | version = "3.0.0" 2599 | source = "registry+https://github.com/rust-lang/crates.io-index" 2600 | checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" 2601 | dependencies = [ 2602 | "darling", 2603 | "proc-macro2", 2604 | "quote", 2605 | "syn 2.0.26", 2606 | ] 2607 | 2608 | [[package]] 2609 | name = "serialize-to-javascript" 2610 | version = "0.1.1" 2611 | source = "registry+https://github.com/rust-lang/crates.io-index" 2612 | checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 2613 | dependencies = [ 2614 | "serde", 2615 | "serde_json", 2616 | "serialize-to-javascript-impl", 2617 | ] 2618 | 2619 | [[package]] 2620 | name = "serialize-to-javascript-impl" 2621 | version = "0.1.1" 2622 | source = "registry+https://github.com/rust-lang/crates.io-index" 2623 | checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 2624 | dependencies = [ 2625 | "proc-macro2", 2626 | "quote", 2627 | "syn 1.0.109", 2628 | ] 2629 | 2630 | [[package]] 2631 | name = "servo_arc" 2632 | version = "0.1.1" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2635 | dependencies = [ 2636 | "nodrop", 2637 | "stable_deref_trait", 2638 | ] 2639 | 2640 | [[package]] 2641 | name = "sha2" 2642 | version = "0.10.7" 2643 | source = "registry+https://github.com/rust-lang/crates.io-index" 2644 | checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" 2645 | dependencies = [ 2646 | "cfg-if", 2647 | "cpufeatures", 2648 | "digest", 2649 | ] 2650 | 2651 | [[package]] 2652 | name = "sharded-slab" 2653 | version = "0.1.4" 2654 | source = "registry+https://github.com/rust-lang/crates.io-index" 2655 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2656 | dependencies = [ 2657 | "lazy_static", 2658 | ] 2659 | 2660 | [[package]] 2661 | name = "simd-adler32" 2662 | version = "0.3.5" 2663 | source = "registry+https://github.com/rust-lang/crates.io-index" 2664 | checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" 2665 | 2666 | [[package]] 2667 | name = "siphasher" 2668 | version = "0.3.10" 2669 | source = "registry+https://github.com/rust-lang/crates.io-index" 2670 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 2671 | 2672 | [[package]] 2673 | name = "slab" 2674 | version = "0.4.8" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 2677 | dependencies = [ 2678 | "autocfg", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "smallvec" 2683 | version = "1.11.0" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" 2686 | 2687 | [[package]] 2688 | name = "socket2" 2689 | version = "0.4.9" 2690 | source = "registry+https://github.com/rust-lang/crates.io-index" 2691 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 2692 | dependencies = [ 2693 | "libc", 2694 | "winapi", 2695 | ] 2696 | 2697 | [[package]] 2698 | name = "soup2" 2699 | version = "0.2.1" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" 2702 | dependencies = [ 2703 | "bitflags 1.3.2", 2704 | "gio", 2705 | "glib", 2706 | "libc", 2707 | "once_cell", 2708 | "soup2-sys", 2709 | ] 2710 | 2711 | [[package]] 2712 | name = "soup2-sys" 2713 | version = "0.2.0" 2714 | source = "registry+https://github.com/rust-lang/crates.io-index" 2715 | checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" 2716 | dependencies = [ 2717 | "bitflags 1.3.2", 2718 | "gio-sys", 2719 | "glib-sys", 2720 | "gobject-sys", 2721 | "libc", 2722 | "system-deps 5.0.0", 2723 | ] 2724 | 2725 | [[package]] 2726 | name = "stable_deref_trait" 2727 | version = "1.2.0" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2730 | 2731 | [[package]] 2732 | name = "state" 2733 | version = "0.5.3" 2734 | source = "registry+https://github.com/rust-lang/crates.io-index" 2735 | checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" 2736 | dependencies = [ 2737 | "loom", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "string_cache" 2742 | version = "0.8.7" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 2745 | dependencies = [ 2746 | "new_debug_unreachable", 2747 | "once_cell", 2748 | "parking_lot", 2749 | "phf_shared 0.10.0", 2750 | "precomputed-hash", 2751 | "serde", 2752 | ] 2753 | 2754 | [[package]] 2755 | name = "string_cache_codegen" 2756 | version = "0.5.2" 2757 | source = "registry+https://github.com/rust-lang/crates.io-index" 2758 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2759 | dependencies = [ 2760 | "phf_generator 0.10.0", 2761 | "phf_shared 0.10.0", 2762 | "proc-macro2", 2763 | "quote", 2764 | ] 2765 | 2766 | [[package]] 2767 | name = "strsim" 2768 | version = "0.10.0" 2769 | source = "registry+https://github.com/rust-lang/crates.io-index" 2770 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2771 | 2772 | [[package]] 2773 | name = "syn" 2774 | version = "1.0.109" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2777 | dependencies = [ 2778 | "proc-macro2", 2779 | "quote", 2780 | "unicode-ident", 2781 | ] 2782 | 2783 | [[package]] 2784 | name = "syn" 2785 | version = "2.0.26" 2786 | source = "registry+https://github.com/rust-lang/crates.io-index" 2787 | checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" 2788 | dependencies = [ 2789 | "proc-macro2", 2790 | "quote", 2791 | "unicode-ident", 2792 | ] 2793 | 2794 | [[package]] 2795 | name = "system-deps" 2796 | version = "5.0.0" 2797 | source = "registry+https://github.com/rust-lang/crates.io-index" 2798 | checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" 2799 | dependencies = [ 2800 | "cfg-expr 0.9.1", 2801 | "heck 0.3.3", 2802 | "pkg-config", 2803 | "toml 0.5.11", 2804 | "version-compare 0.0.11", 2805 | ] 2806 | 2807 | [[package]] 2808 | name = "system-deps" 2809 | version = "6.1.1" 2810 | source = "registry+https://github.com/rust-lang/crates.io-index" 2811 | checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" 2812 | dependencies = [ 2813 | "cfg-expr 0.15.3", 2814 | "heck 0.4.1", 2815 | "pkg-config", 2816 | "toml 0.7.6", 2817 | "version-compare 0.1.1", 2818 | ] 2819 | 2820 | [[package]] 2821 | name = "tao" 2822 | version = "0.16.2" 2823 | source = "registry+https://github.com/rust-lang/crates.io-index" 2824 | checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" 2825 | dependencies = [ 2826 | "bitflags 1.3.2", 2827 | "cairo-rs", 2828 | "cc", 2829 | "cocoa", 2830 | "core-foundation", 2831 | "core-graphics", 2832 | "crossbeam-channel", 2833 | "dispatch", 2834 | "gdk", 2835 | "gdk-pixbuf", 2836 | "gdk-sys", 2837 | "gdkwayland-sys", 2838 | "gdkx11-sys", 2839 | "gio", 2840 | "glib", 2841 | "glib-sys", 2842 | "gtk", 2843 | "image", 2844 | "instant", 2845 | "jni", 2846 | "lazy_static", 2847 | "libc", 2848 | "log", 2849 | "ndk", 2850 | "ndk-context", 2851 | "ndk-sys", 2852 | "objc", 2853 | "once_cell", 2854 | "parking_lot", 2855 | "png", 2856 | "raw-window-handle", 2857 | "scopeguard", 2858 | "serde", 2859 | "tao-macros", 2860 | "unicode-segmentation", 2861 | "uuid", 2862 | "windows 0.39.0", 2863 | "windows-implement", 2864 | "x11-dl", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "tao-macros" 2869 | version = "0.1.1" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" 2872 | dependencies = [ 2873 | "proc-macro2", 2874 | "quote", 2875 | "syn 1.0.109", 2876 | ] 2877 | 2878 | [[package]] 2879 | name = "tar" 2880 | version = "0.4.39" 2881 | source = "registry+https://github.com/rust-lang/crates.io-index" 2882 | checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" 2883 | dependencies = [ 2884 | "filetime", 2885 | "libc", 2886 | "xattr", 2887 | ] 2888 | 2889 | [[package]] 2890 | name = "target-lexicon" 2891 | version = "0.12.9" 2892 | source = "registry+https://github.com/rust-lang/crates.io-index" 2893 | checksum = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0" 2894 | 2895 | [[package]] 2896 | name = "tauri" 2897 | version = "1.4.1" 2898 | source = "registry+https://github.com/rust-lang/crates.io-index" 2899 | checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" 2900 | dependencies = [ 2901 | "anyhow", 2902 | "base64 0.21.2", 2903 | "bytes", 2904 | "cocoa", 2905 | "dirs-next", 2906 | "embed_plist", 2907 | "encoding_rs", 2908 | "flate2", 2909 | "futures-util", 2910 | "glib", 2911 | "glob", 2912 | "gtk", 2913 | "heck 0.4.1", 2914 | "http", 2915 | "ignore", 2916 | "minisign-verify", 2917 | "objc", 2918 | "once_cell", 2919 | "open", 2920 | "percent-encoding", 2921 | "rand 0.8.5", 2922 | "raw-window-handle", 2923 | "regex", 2924 | "reqwest", 2925 | "rfd", 2926 | "semver", 2927 | "serde", 2928 | "serde_json", 2929 | "serde_repr", 2930 | "serialize-to-javascript", 2931 | "state", 2932 | "tar", 2933 | "tauri-macros", 2934 | "tauri-runtime", 2935 | "tauri-runtime-wry", 2936 | "tauri-utils", 2937 | "tempfile", 2938 | "thiserror", 2939 | "time", 2940 | "tokio", 2941 | "url", 2942 | "uuid", 2943 | "webkit2gtk", 2944 | "webview2-com", 2945 | "windows 0.39.0", 2946 | "zip", 2947 | ] 2948 | 2949 | [[package]] 2950 | name = "tauri-build" 2951 | version = "1.4.0" 2952 | source = "registry+https://github.com/rust-lang/crates.io-index" 2953 | checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" 2954 | dependencies = [ 2955 | "anyhow", 2956 | "cargo_toml", 2957 | "heck 0.4.1", 2958 | "json-patch", 2959 | "semver", 2960 | "serde", 2961 | "serde_json", 2962 | "tauri-utils", 2963 | "tauri-winres", 2964 | ] 2965 | 2966 | [[package]] 2967 | name = "tauri-codegen" 2968 | version = "1.4.0" 2969 | source = "registry+https://github.com/rust-lang/crates.io-index" 2970 | checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" 2971 | dependencies = [ 2972 | "base64 0.21.2", 2973 | "brotli", 2974 | "ico", 2975 | "json-patch", 2976 | "plist", 2977 | "png", 2978 | "proc-macro2", 2979 | "quote", 2980 | "regex", 2981 | "semver", 2982 | "serde", 2983 | "serde_json", 2984 | "sha2", 2985 | "tauri-utils", 2986 | "thiserror", 2987 | "time", 2988 | "uuid", 2989 | "walkdir", 2990 | ] 2991 | 2992 | [[package]] 2993 | name = "tauri-macros" 2994 | version = "1.4.0" 2995 | source = "registry+https://github.com/rust-lang/crates.io-index" 2996 | checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" 2997 | dependencies = [ 2998 | "heck 0.4.1", 2999 | "proc-macro2", 3000 | "quote", 3001 | "syn 1.0.109", 3002 | "tauri-codegen", 3003 | "tauri-utils", 3004 | ] 3005 | 3006 | [[package]] 3007 | name = "tauri-runtime" 3008 | version = "0.14.0" 3009 | source = "registry+https://github.com/rust-lang/crates.io-index" 3010 | checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" 3011 | dependencies = [ 3012 | "gtk", 3013 | "http", 3014 | "http-range", 3015 | "rand 0.8.5", 3016 | "raw-window-handle", 3017 | "serde", 3018 | "serde_json", 3019 | "tauri-utils", 3020 | "thiserror", 3021 | "url", 3022 | "uuid", 3023 | "webview2-com", 3024 | "windows 0.39.0", 3025 | ] 3026 | 3027 | [[package]] 3028 | name = "tauri-runtime-wry" 3029 | version = "0.14.0" 3030 | source = "registry+https://github.com/rust-lang/crates.io-index" 3031 | checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" 3032 | dependencies = [ 3033 | "cocoa", 3034 | "gtk", 3035 | "percent-encoding", 3036 | "rand 0.8.5", 3037 | "raw-window-handle", 3038 | "tauri-runtime", 3039 | "tauri-utils", 3040 | "uuid", 3041 | "webkit2gtk", 3042 | "webview2-com", 3043 | "windows 0.39.0", 3044 | "wry", 3045 | ] 3046 | 3047 | [[package]] 3048 | name = "tauri-utils" 3049 | version = "1.4.0" 3050 | source = "registry+https://github.com/rust-lang/crates.io-index" 3051 | checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" 3052 | dependencies = [ 3053 | "brotli", 3054 | "ctor", 3055 | "dunce", 3056 | "glob", 3057 | "heck 0.4.1", 3058 | "html5ever", 3059 | "infer", 3060 | "json-patch", 3061 | "kuchiki", 3062 | "memchr", 3063 | "phf 0.10.1", 3064 | "proc-macro2", 3065 | "quote", 3066 | "semver", 3067 | "serde", 3068 | "serde_json", 3069 | "serde_with", 3070 | "thiserror", 3071 | "url", 3072 | "walkdir", 3073 | "windows 0.39.0", 3074 | ] 3075 | 3076 | [[package]] 3077 | name = "tauri-winres" 3078 | version = "0.1.1" 3079 | source = "registry+https://github.com/rust-lang/crates.io-index" 3080 | checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" 3081 | dependencies = [ 3082 | "embed-resource", 3083 | "toml 0.7.6", 3084 | ] 3085 | 3086 | [[package]] 3087 | name = "tempfile" 3088 | version = "3.6.0" 3089 | source = "registry+https://github.com/rust-lang/crates.io-index" 3090 | checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" 3091 | dependencies = [ 3092 | "autocfg", 3093 | "cfg-if", 3094 | "fastrand", 3095 | "redox_syscall 0.3.5", 3096 | "rustix", 3097 | "windows-sys 0.48.0", 3098 | ] 3099 | 3100 | [[package]] 3101 | name = "tendril" 3102 | version = "0.4.3" 3103 | source = "registry+https://github.com/rust-lang/crates.io-index" 3104 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 3105 | dependencies = [ 3106 | "futf", 3107 | "mac", 3108 | "utf-8", 3109 | ] 3110 | 3111 | [[package]] 3112 | name = "thin-slice" 3113 | version = "0.1.1" 3114 | source = "registry+https://github.com/rust-lang/crates.io-index" 3115 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 3116 | 3117 | [[package]] 3118 | name = "thiserror" 3119 | version = "1.0.43" 3120 | source = "registry+https://github.com/rust-lang/crates.io-index" 3121 | checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" 3122 | dependencies = [ 3123 | "thiserror-impl", 3124 | ] 3125 | 3126 | [[package]] 3127 | name = "thiserror-impl" 3128 | version = "1.0.43" 3129 | source = "registry+https://github.com/rust-lang/crates.io-index" 3130 | checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" 3131 | dependencies = [ 3132 | "proc-macro2", 3133 | "quote", 3134 | "syn 2.0.26", 3135 | ] 3136 | 3137 | [[package]] 3138 | name = "thread_local" 3139 | version = "1.1.7" 3140 | source = "registry+https://github.com/rust-lang/crates.io-index" 3141 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 3142 | dependencies = [ 3143 | "cfg-if", 3144 | "once_cell", 3145 | ] 3146 | 3147 | [[package]] 3148 | name = "time" 3149 | version = "0.3.23" 3150 | source = "registry+https://github.com/rust-lang/crates.io-index" 3151 | checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" 3152 | dependencies = [ 3153 | "itoa 1.0.9", 3154 | "serde", 3155 | "time-core", 3156 | "time-macros", 3157 | ] 3158 | 3159 | [[package]] 3160 | name = "time-core" 3161 | version = "0.1.1" 3162 | source = "registry+https://github.com/rust-lang/crates.io-index" 3163 | checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" 3164 | 3165 | [[package]] 3166 | name = "time-macros" 3167 | version = "0.2.10" 3168 | source = "registry+https://github.com/rust-lang/crates.io-index" 3169 | checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" 3170 | dependencies = [ 3171 | "time-core", 3172 | ] 3173 | 3174 | [[package]] 3175 | name = "tinyvec" 3176 | version = "1.6.0" 3177 | source = "registry+https://github.com/rust-lang/crates.io-index" 3178 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3179 | dependencies = [ 3180 | "tinyvec_macros", 3181 | ] 3182 | 3183 | [[package]] 3184 | name = "tinyvec_macros" 3185 | version = "0.1.1" 3186 | source = "registry+https://github.com/rust-lang/crates.io-index" 3187 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3188 | 3189 | [[package]] 3190 | name = "tokio" 3191 | version = "1.29.1" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" 3194 | dependencies = [ 3195 | "autocfg", 3196 | "backtrace", 3197 | "bytes", 3198 | "libc", 3199 | "mio", 3200 | "num_cpus", 3201 | "pin-project-lite", 3202 | "socket2", 3203 | "windows-sys 0.48.0", 3204 | ] 3205 | 3206 | [[package]] 3207 | name = "tokio-native-tls" 3208 | version = "0.3.1" 3209 | source = "registry+https://github.com/rust-lang/crates.io-index" 3210 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 3211 | dependencies = [ 3212 | "native-tls", 3213 | "tokio", 3214 | ] 3215 | 3216 | [[package]] 3217 | name = "tokio-util" 3218 | version = "0.7.8" 3219 | source = "registry+https://github.com/rust-lang/crates.io-index" 3220 | checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" 3221 | dependencies = [ 3222 | "bytes", 3223 | "futures-core", 3224 | "futures-sink", 3225 | "pin-project-lite", 3226 | "tokio", 3227 | "tracing", 3228 | ] 3229 | 3230 | [[package]] 3231 | name = "toml" 3232 | version = "0.5.11" 3233 | source = "registry+https://github.com/rust-lang/crates.io-index" 3234 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 3235 | dependencies = [ 3236 | "serde", 3237 | ] 3238 | 3239 | [[package]] 3240 | name = "toml" 3241 | version = "0.7.6" 3242 | source = "registry+https://github.com/rust-lang/crates.io-index" 3243 | checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" 3244 | dependencies = [ 3245 | "serde", 3246 | "serde_spanned", 3247 | "toml_datetime", 3248 | "toml_edit", 3249 | ] 3250 | 3251 | [[package]] 3252 | name = "toml_datetime" 3253 | version = "0.6.3" 3254 | source = "registry+https://github.com/rust-lang/crates.io-index" 3255 | checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 3256 | dependencies = [ 3257 | "serde", 3258 | ] 3259 | 3260 | [[package]] 3261 | name = "toml_edit" 3262 | version = "0.19.14" 3263 | source = "registry+https://github.com/rust-lang/crates.io-index" 3264 | checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" 3265 | dependencies = [ 3266 | "indexmap 2.0.0", 3267 | "serde", 3268 | "serde_spanned", 3269 | "toml_datetime", 3270 | "winnow", 3271 | ] 3272 | 3273 | [[package]] 3274 | name = "tower-service" 3275 | version = "0.3.2" 3276 | source = "registry+https://github.com/rust-lang/crates.io-index" 3277 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3278 | 3279 | [[package]] 3280 | name = "tracing" 3281 | version = "0.1.37" 3282 | source = "registry+https://github.com/rust-lang/crates.io-index" 3283 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3284 | dependencies = [ 3285 | "cfg-if", 3286 | "pin-project-lite", 3287 | "tracing-attributes", 3288 | "tracing-core", 3289 | ] 3290 | 3291 | [[package]] 3292 | name = "tracing-attributes" 3293 | version = "0.1.26" 3294 | source = "registry+https://github.com/rust-lang/crates.io-index" 3295 | checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" 3296 | dependencies = [ 3297 | "proc-macro2", 3298 | "quote", 3299 | "syn 2.0.26", 3300 | ] 3301 | 3302 | [[package]] 3303 | name = "tracing-core" 3304 | version = "0.1.31" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" 3307 | dependencies = [ 3308 | "once_cell", 3309 | "valuable", 3310 | ] 3311 | 3312 | [[package]] 3313 | name = "tracing-log" 3314 | version = "0.1.3" 3315 | source = "registry+https://github.com/rust-lang/crates.io-index" 3316 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3317 | dependencies = [ 3318 | "lazy_static", 3319 | "log", 3320 | "tracing-core", 3321 | ] 3322 | 3323 | [[package]] 3324 | name = "tracing-subscriber" 3325 | version = "0.3.17" 3326 | source = "registry+https://github.com/rust-lang/crates.io-index" 3327 | checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" 3328 | dependencies = [ 3329 | "matchers", 3330 | "nu-ansi-term", 3331 | "once_cell", 3332 | "regex", 3333 | "sharded-slab", 3334 | "smallvec", 3335 | "thread_local", 3336 | "tracing", 3337 | "tracing-core", 3338 | "tracing-log", 3339 | ] 3340 | 3341 | [[package]] 3342 | name = "treediff" 3343 | version = "4.0.2" 3344 | source = "registry+https://github.com/rust-lang/crates.io-index" 3345 | checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" 3346 | dependencies = [ 3347 | "serde_json", 3348 | ] 3349 | 3350 | [[package]] 3351 | name = "try-lock" 3352 | version = "0.2.4" 3353 | source = "registry+https://github.com/rust-lang/crates.io-index" 3354 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 3355 | 3356 | [[package]] 3357 | name = "typenum" 3358 | version = "1.16.0" 3359 | source = "registry+https://github.com/rust-lang/crates.io-index" 3360 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 3361 | 3362 | [[package]] 3363 | name = "unicode-bidi" 3364 | version = "0.3.13" 3365 | source = "registry+https://github.com/rust-lang/crates.io-index" 3366 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 3367 | 3368 | [[package]] 3369 | name = "unicode-ident" 3370 | version = "1.0.11" 3371 | source = "registry+https://github.com/rust-lang/crates.io-index" 3372 | checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" 3373 | 3374 | [[package]] 3375 | name = "unicode-normalization" 3376 | version = "0.1.22" 3377 | source = "registry+https://github.com/rust-lang/crates.io-index" 3378 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3379 | dependencies = [ 3380 | "tinyvec", 3381 | ] 3382 | 3383 | [[package]] 3384 | name = "unicode-segmentation" 3385 | version = "1.10.1" 3386 | source = "registry+https://github.com/rust-lang/crates.io-index" 3387 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 3388 | 3389 | [[package]] 3390 | name = "url" 3391 | version = "2.4.0" 3392 | source = "registry+https://github.com/rust-lang/crates.io-index" 3393 | checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" 3394 | dependencies = [ 3395 | "form_urlencoded", 3396 | "idna", 3397 | "percent-encoding", 3398 | "serde", 3399 | ] 3400 | 3401 | [[package]] 3402 | name = "utf-8" 3403 | version = "0.7.6" 3404 | source = "registry+https://github.com/rust-lang/crates.io-index" 3405 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3406 | 3407 | [[package]] 3408 | name = "uuid" 3409 | version = "1.4.0" 3410 | source = "registry+https://github.com/rust-lang/crates.io-index" 3411 | checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" 3412 | dependencies = [ 3413 | "getrandom 0.2.10", 3414 | ] 3415 | 3416 | [[package]] 3417 | name = "valuable" 3418 | version = "0.1.0" 3419 | source = "registry+https://github.com/rust-lang/crates.io-index" 3420 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3421 | 3422 | [[package]] 3423 | name = "vcpkg" 3424 | version = "0.2.15" 3425 | source = "registry+https://github.com/rust-lang/crates.io-index" 3426 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3427 | 3428 | [[package]] 3429 | name = "version-compare" 3430 | version = "0.0.11" 3431 | source = "registry+https://github.com/rust-lang/crates.io-index" 3432 | checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" 3433 | 3434 | [[package]] 3435 | name = "version-compare" 3436 | version = "0.1.1" 3437 | source = "registry+https://github.com/rust-lang/crates.io-index" 3438 | checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" 3439 | 3440 | [[package]] 3441 | name = "version_check" 3442 | version = "0.9.4" 3443 | source = "registry+https://github.com/rust-lang/crates.io-index" 3444 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3445 | 3446 | [[package]] 3447 | name = "vswhom" 3448 | version = "0.1.0" 3449 | source = "registry+https://github.com/rust-lang/crates.io-index" 3450 | checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" 3451 | dependencies = [ 3452 | "libc", 3453 | "vswhom-sys", 3454 | ] 3455 | 3456 | [[package]] 3457 | name = "vswhom-sys" 3458 | version = "0.1.2" 3459 | source = "registry+https://github.com/rust-lang/crates.io-index" 3460 | checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" 3461 | dependencies = [ 3462 | "cc", 3463 | "libc", 3464 | ] 3465 | 3466 | [[package]] 3467 | name = "walkdir" 3468 | version = "2.3.3" 3469 | source = "registry+https://github.com/rust-lang/crates.io-index" 3470 | checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" 3471 | dependencies = [ 3472 | "same-file", 3473 | "winapi-util", 3474 | ] 3475 | 3476 | [[package]] 3477 | name = "want" 3478 | version = "0.3.1" 3479 | source = "registry+https://github.com/rust-lang/crates.io-index" 3480 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3481 | dependencies = [ 3482 | "try-lock", 3483 | ] 3484 | 3485 | [[package]] 3486 | name = "wasi" 3487 | version = "0.9.0+wasi-snapshot-preview1" 3488 | source = "registry+https://github.com/rust-lang/crates.io-index" 3489 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3490 | 3491 | [[package]] 3492 | name = "wasi" 3493 | version = "0.11.0+wasi-snapshot-preview1" 3494 | source = "registry+https://github.com/rust-lang/crates.io-index" 3495 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3496 | 3497 | [[package]] 3498 | name = "wasm-bindgen" 3499 | version = "0.2.87" 3500 | source = "registry+https://github.com/rust-lang/crates.io-index" 3501 | checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" 3502 | dependencies = [ 3503 | "cfg-if", 3504 | "wasm-bindgen-macro", 3505 | ] 3506 | 3507 | [[package]] 3508 | name = "wasm-bindgen-backend" 3509 | version = "0.2.87" 3510 | source = "registry+https://github.com/rust-lang/crates.io-index" 3511 | checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" 3512 | dependencies = [ 3513 | "bumpalo", 3514 | "log", 3515 | "once_cell", 3516 | "proc-macro2", 3517 | "quote", 3518 | "syn 2.0.26", 3519 | "wasm-bindgen-shared", 3520 | ] 3521 | 3522 | [[package]] 3523 | name = "wasm-bindgen-futures" 3524 | version = "0.4.37" 3525 | source = "registry+https://github.com/rust-lang/crates.io-index" 3526 | checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" 3527 | dependencies = [ 3528 | "cfg-if", 3529 | "js-sys", 3530 | "wasm-bindgen", 3531 | "web-sys", 3532 | ] 3533 | 3534 | [[package]] 3535 | name = "wasm-bindgen-macro" 3536 | version = "0.2.87" 3537 | source = "registry+https://github.com/rust-lang/crates.io-index" 3538 | checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" 3539 | dependencies = [ 3540 | "quote", 3541 | "wasm-bindgen-macro-support", 3542 | ] 3543 | 3544 | [[package]] 3545 | name = "wasm-bindgen-macro-support" 3546 | version = "0.2.87" 3547 | source = "registry+https://github.com/rust-lang/crates.io-index" 3548 | checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" 3549 | dependencies = [ 3550 | "proc-macro2", 3551 | "quote", 3552 | "syn 2.0.26", 3553 | "wasm-bindgen-backend", 3554 | "wasm-bindgen-shared", 3555 | ] 3556 | 3557 | [[package]] 3558 | name = "wasm-bindgen-shared" 3559 | version = "0.2.87" 3560 | source = "registry+https://github.com/rust-lang/crates.io-index" 3561 | checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" 3562 | 3563 | [[package]] 3564 | name = "wasm-streams" 3565 | version = "0.2.3" 3566 | source = "registry+https://github.com/rust-lang/crates.io-index" 3567 | checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" 3568 | dependencies = [ 3569 | "futures-util", 3570 | "js-sys", 3571 | "wasm-bindgen", 3572 | "wasm-bindgen-futures", 3573 | "web-sys", 3574 | ] 3575 | 3576 | [[package]] 3577 | name = "web-sys" 3578 | version = "0.3.64" 3579 | source = "registry+https://github.com/rust-lang/crates.io-index" 3580 | checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" 3581 | dependencies = [ 3582 | "js-sys", 3583 | "wasm-bindgen", 3584 | ] 3585 | 3586 | [[package]] 3587 | name = "webkit2gtk" 3588 | version = "0.18.2" 3589 | source = "registry+https://github.com/rust-lang/crates.io-index" 3590 | checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" 3591 | dependencies = [ 3592 | "bitflags 1.3.2", 3593 | "cairo-rs", 3594 | "gdk", 3595 | "gdk-sys", 3596 | "gio", 3597 | "gio-sys", 3598 | "glib", 3599 | "glib-sys", 3600 | "gobject-sys", 3601 | "gtk", 3602 | "gtk-sys", 3603 | "javascriptcore-rs", 3604 | "libc", 3605 | "once_cell", 3606 | "soup2", 3607 | "webkit2gtk-sys", 3608 | ] 3609 | 3610 | [[package]] 3611 | name = "webkit2gtk-sys" 3612 | version = "0.18.0" 3613 | source = "registry+https://github.com/rust-lang/crates.io-index" 3614 | checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" 3615 | dependencies = [ 3616 | "atk-sys", 3617 | "bitflags 1.3.2", 3618 | "cairo-sys-rs", 3619 | "gdk-pixbuf-sys", 3620 | "gdk-sys", 3621 | "gio-sys", 3622 | "glib-sys", 3623 | "gobject-sys", 3624 | "gtk-sys", 3625 | "javascriptcore-rs-sys", 3626 | "libc", 3627 | "pango-sys", 3628 | "pkg-config", 3629 | "soup2-sys", 3630 | "system-deps 6.1.1", 3631 | ] 3632 | 3633 | [[package]] 3634 | name = "webview2-com" 3635 | version = "0.19.1" 3636 | source = "registry+https://github.com/rust-lang/crates.io-index" 3637 | checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" 3638 | dependencies = [ 3639 | "webview2-com-macros", 3640 | "webview2-com-sys", 3641 | "windows 0.39.0", 3642 | "windows-implement", 3643 | ] 3644 | 3645 | [[package]] 3646 | name = "webview2-com-macros" 3647 | version = "0.6.0" 3648 | source = "registry+https://github.com/rust-lang/crates.io-index" 3649 | checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" 3650 | dependencies = [ 3651 | "proc-macro2", 3652 | "quote", 3653 | "syn 1.0.109", 3654 | ] 3655 | 3656 | [[package]] 3657 | name = "webview2-com-sys" 3658 | version = "0.19.0" 3659 | source = "registry+https://github.com/rust-lang/crates.io-index" 3660 | checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" 3661 | dependencies = [ 3662 | "regex", 3663 | "serde", 3664 | "serde_json", 3665 | "thiserror", 3666 | "windows 0.39.0", 3667 | "windows-bindgen", 3668 | "windows-metadata", 3669 | ] 3670 | 3671 | [[package]] 3672 | name = "winapi" 3673 | version = "0.3.9" 3674 | source = "registry+https://github.com/rust-lang/crates.io-index" 3675 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3676 | dependencies = [ 3677 | "winapi-i686-pc-windows-gnu", 3678 | "winapi-x86_64-pc-windows-gnu", 3679 | ] 3680 | 3681 | [[package]] 3682 | name = "winapi-i686-pc-windows-gnu" 3683 | version = "0.4.0" 3684 | source = "registry+https://github.com/rust-lang/crates.io-index" 3685 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3686 | 3687 | [[package]] 3688 | name = "winapi-util" 3689 | version = "0.1.5" 3690 | source = "registry+https://github.com/rust-lang/crates.io-index" 3691 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3692 | dependencies = [ 3693 | "winapi", 3694 | ] 3695 | 3696 | [[package]] 3697 | name = "winapi-x86_64-pc-windows-gnu" 3698 | version = "0.4.0" 3699 | source = "registry+https://github.com/rust-lang/crates.io-index" 3700 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3701 | 3702 | [[package]] 3703 | name = "windows" 3704 | version = "0.37.0" 3705 | source = "registry+https://github.com/rust-lang/crates.io-index" 3706 | checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" 3707 | dependencies = [ 3708 | "windows_aarch64_msvc 0.37.0", 3709 | "windows_i686_gnu 0.37.0", 3710 | "windows_i686_msvc 0.37.0", 3711 | "windows_x86_64_gnu 0.37.0", 3712 | "windows_x86_64_msvc 0.37.0", 3713 | ] 3714 | 3715 | [[package]] 3716 | name = "windows" 3717 | version = "0.39.0" 3718 | source = "registry+https://github.com/rust-lang/crates.io-index" 3719 | checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" 3720 | dependencies = [ 3721 | "windows-implement", 3722 | "windows_aarch64_msvc 0.39.0", 3723 | "windows_i686_gnu 0.39.0", 3724 | "windows_i686_msvc 0.39.0", 3725 | "windows_x86_64_gnu 0.39.0", 3726 | "windows_x86_64_msvc 0.39.0", 3727 | ] 3728 | 3729 | [[package]] 3730 | name = "windows" 3731 | version = "0.48.0" 3732 | source = "registry+https://github.com/rust-lang/crates.io-index" 3733 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 3734 | dependencies = [ 3735 | "windows-targets", 3736 | ] 3737 | 3738 | [[package]] 3739 | name = "windows-bindgen" 3740 | version = "0.39.0" 3741 | source = "registry+https://github.com/rust-lang/crates.io-index" 3742 | checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" 3743 | dependencies = [ 3744 | "windows-metadata", 3745 | "windows-tokens", 3746 | ] 3747 | 3748 | [[package]] 3749 | name = "windows-implement" 3750 | version = "0.39.0" 3751 | source = "registry+https://github.com/rust-lang/crates.io-index" 3752 | checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" 3753 | dependencies = [ 3754 | "syn 1.0.109", 3755 | "windows-tokens", 3756 | ] 3757 | 3758 | [[package]] 3759 | name = "windows-metadata" 3760 | version = "0.39.0" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" 3763 | 3764 | [[package]] 3765 | name = "windows-sys" 3766 | version = "0.42.0" 3767 | source = "registry+https://github.com/rust-lang/crates.io-index" 3768 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 3769 | dependencies = [ 3770 | "windows_aarch64_gnullvm 0.42.2", 3771 | "windows_aarch64_msvc 0.42.2", 3772 | "windows_i686_gnu 0.42.2", 3773 | "windows_i686_msvc 0.42.2", 3774 | "windows_x86_64_gnu 0.42.2", 3775 | "windows_x86_64_gnullvm 0.42.2", 3776 | "windows_x86_64_msvc 0.42.2", 3777 | ] 3778 | 3779 | [[package]] 3780 | name = "windows-sys" 3781 | version = "0.48.0" 3782 | source = "registry+https://github.com/rust-lang/crates.io-index" 3783 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3784 | dependencies = [ 3785 | "windows-targets", 3786 | ] 3787 | 3788 | [[package]] 3789 | name = "windows-targets" 3790 | version = "0.48.1" 3791 | source = "registry+https://github.com/rust-lang/crates.io-index" 3792 | checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" 3793 | dependencies = [ 3794 | "windows_aarch64_gnullvm 0.48.0", 3795 | "windows_aarch64_msvc 0.48.0", 3796 | "windows_i686_gnu 0.48.0", 3797 | "windows_i686_msvc 0.48.0", 3798 | "windows_x86_64_gnu 0.48.0", 3799 | "windows_x86_64_gnullvm 0.48.0", 3800 | "windows_x86_64_msvc 0.48.0", 3801 | ] 3802 | 3803 | [[package]] 3804 | name = "windows-tokens" 3805 | version = "0.39.0" 3806 | source = "registry+https://github.com/rust-lang/crates.io-index" 3807 | checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" 3808 | 3809 | [[package]] 3810 | name = "windows_aarch64_gnullvm" 3811 | version = "0.42.2" 3812 | source = "registry+https://github.com/rust-lang/crates.io-index" 3813 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3814 | 3815 | [[package]] 3816 | name = "windows_aarch64_gnullvm" 3817 | version = "0.48.0" 3818 | source = "registry+https://github.com/rust-lang/crates.io-index" 3819 | checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" 3820 | 3821 | [[package]] 3822 | name = "windows_aarch64_msvc" 3823 | version = "0.37.0" 3824 | source = "registry+https://github.com/rust-lang/crates.io-index" 3825 | checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" 3826 | 3827 | [[package]] 3828 | name = "windows_aarch64_msvc" 3829 | version = "0.39.0" 3830 | source = "registry+https://github.com/rust-lang/crates.io-index" 3831 | checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" 3832 | 3833 | [[package]] 3834 | name = "windows_aarch64_msvc" 3835 | version = "0.42.2" 3836 | source = "registry+https://github.com/rust-lang/crates.io-index" 3837 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3838 | 3839 | [[package]] 3840 | name = "windows_aarch64_msvc" 3841 | version = "0.48.0" 3842 | source = "registry+https://github.com/rust-lang/crates.io-index" 3843 | checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" 3844 | 3845 | [[package]] 3846 | name = "windows_i686_gnu" 3847 | version = "0.37.0" 3848 | source = "registry+https://github.com/rust-lang/crates.io-index" 3849 | checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" 3850 | 3851 | [[package]] 3852 | name = "windows_i686_gnu" 3853 | version = "0.39.0" 3854 | source = "registry+https://github.com/rust-lang/crates.io-index" 3855 | checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" 3856 | 3857 | [[package]] 3858 | name = "windows_i686_gnu" 3859 | version = "0.42.2" 3860 | source = "registry+https://github.com/rust-lang/crates.io-index" 3861 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3862 | 3863 | [[package]] 3864 | name = "windows_i686_gnu" 3865 | version = "0.48.0" 3866 | source = "registry+https://github.com/rust-lang/crates.io-index" 3867 | checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" 3868 | 3869 | [[package]] 3870 | name = "windows_i686_msvc" 3871 | version = "0.37.0" 3872 | source = "registry+https://github.com/rust-lang/crates.io-index" 3873 | checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" 3874 | 3875 | [[package]] 3876 | name = "windows_i686_msvc" 3877 | version = "0.39.0" 3878 | source = "registry+https://github.com/rust-lang/crates.io-index" 3879 | checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" 3880 | 3881 | [[package]] 3882 | name = "windows_i686_msvc" 3883 | version = "0.42.2" 3884 | source = "registry+https://github.com/rust-lang/crates.io-index" 3885 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3886 | 3887 | [[package]] 3888 | name = "windows_i686_msvc" 3889 | version = "0.48.0" 3890 | source = "registry+https://github.com/rust-lang/crates.io-index" 3891 | checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" 3892 | 3893 | [[package]] 3894 | name = "windows_x86_64_gnu" 3895 | version = "0.37.0" 3896 | source = "registry+https://github.com/rust-lang/crates.io-index" 3897 | checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" 3898 | 3899 | [[package]] 3900 | name = "windows_x86_64_gnu" 3901 | version = "0.39.0" 3902 | source = "registry+https://github.com/rust-lang/crates.io-index" 3903 | checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" 3904 | 3905 | [[package]] 3906 | name = "windows_x86_64_gnu" 3907 | version = "0.42.2" 3908 | source = "registry+https://github.com/rust-lang/crates.io-index" 3909 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3910 | 3911 | [[package]] 3912 | name = "windows_x86_64_gnu" 3913 | version = "0.48.0" 3914 | source = "registry+https://github.com/rust-lang/crates.io-index" 3915 | checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" 3916 | 3917 | [[package]] 3918 | name = "windows_x86_64_gnullvm" 3919 | version = "0.42.2" 3920 | source = "registry+https://github.com/rust-lang/crates.io-index" 3921 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3922 | 3923 | [[package]] 3924 | name = "windows_x86_64_gnullvm" 3925 | version = "0.48.0" 3926 | source = "registry+https://github.com/rust-lang/crates.io-index" 3927 | checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" 3928 | 3929 | [[package]] 3930 | name = "windows_x86_64_msvc" 3931 | version = "0.37.0" 3932 | source = "registry+https://github.com/rust-lang/crates.io-index" 3933 | checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" 3934 | 3935 | [[package]] 3936 | name = "windows_x86_64_msvc" 3937 | version = "0.39.0" 3938 | source = "registry+https://github.com/rust-lang/crates.io-index" 3939 | checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" 3940 | 3941 | [[package]] 3942 | name = "windows_x86_64_msvc" 3943 | version = "0.42.2" 3944 | source = "registry+https://github.com/rust-lang/crates.io-index" 3945 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3946 | 3947 | [[package]] 3948 | name = "windows_x86_64_msvc" 3949 | version = "0.48.0" 3950 | source = "registry+https://github.com/rust-lang/crates.io-index" 3951 | checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" 3952 | 3953 | [[package]] 3954 | name = "winnow" 3955 | version = "0.5.0" 3956 | source = "registry+https://github.com/rust-lang/crates.io-index" 3957 | checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" 3958 | dependencies = [ 3959 | "memchr", 3960 | ] 3961 | 3962 | [[package]] 3963 | name = "winreg" 3964 | version = "0.10.1" 3965 | source = "registry+https://github.com/rust-lang/crates.io-index" 3966 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 3967 | dependencies = [ 3968 | "winapi", 3969 | ] 3970 | 3971 | [[package]] 3972 | name = "winreg" 3973 | version = "0.11.0" 3974 | source = "registry+https://github.com/rust-lang/crates.io-index" 3975 | checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" 3976 | dependencies = [ 3977 | "cfg-if", 3978 | "winapi", 3979 | ] 3980 | 3981 | [[package]] 3982 | name = "wry" 3983 | version = "0.24.3" 3984 | source = "registry+https://github.com/rust-lang/crates.io-index" 3985 | checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" 3986 | dependencies = [ 3987 | "base64 0.13.1", 3988 | "block", 3989 | "cocoa", 3990 | "core-graphics", 3991 | "crossbeam-channel", 3992 | "dunce", 3993 | "gdk", 3994 | "gio", 3995 | "glib", 3996 | "gtk", 3997 | "html5ever", 3998 | "http", 3999 | "kuchiki", 4000 | "libc", 4001 | "log", 4002 | "objc", 4003 | "objc_id", 4004 | "once_cell", 4005 | "serde", 4006 | "serde_json", 4007 | "sha2", 4008 | "soup2", 4009 | "tao", 4010 | "thiserror", 4011 | "url", 4012 | "webkit2gtk", 4013 | "webkit2gtk-sys", 4014 | "webview2-com", 4015 | "windows 0.39.0", 4016 | "windows-implement", 4017 | ] 4018 | 4019 | [[package]] 4020 | name = "x11" 4021 | version = "2.21.0" 4022 | source = "registry+https://github.com/rust-lang/crates.io-index" 4023 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 4024 | dependencies = [ 4025 | "libc", 4026 | "pkg-config", 4027 | ] 4028 | 4029 | [[package]] 4030 | name = "x11-dl" 4031 | version = "2.21.0" 4032 | source = "registry+https://github.com/rust-lang/crates.io-index" 4033 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 4034 | dependencies = [ 4035 | "libc", 4036 | "once_cell", 4037 | "pkg-config", 4038 | ] 4039 | 4040 | [[package]] 4041 | name = "xattr" 4042 | version = "0.2.3" 4043 | source = "registry+https://github.com/rust-lang/crates.io-index" 4044 | checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" 4045 | dependencies = [ 4046 | "libc", 4047 | ] 4048 | 4049 | [[package]] 4050 | name = "zip" 4051 | version = "0.6.6" 4052 | source = "registry+https://github.com/rust-lang/crates.io-index" 4053 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 4054 | dependencies = [ 4055 | "byteorder", 4056 | "crc32fast", 4057 | "crossbeam-utils", 4058 | ] 4059 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "itos" 3 | version = "0.0.0" 4 | description = "A Tauri App" 5 | authors = ["you"] 6 | license = "" 7 | repository = "" 8 | edition = "2021" 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [build-dependencies] 13 | tauri-build = { version = "1.2", features = [] } 14 | 15 | [dependencies] 16 | tauri = { version = "1.2", features = [ "updater", "fs-remove-file", "fs-copy-file", "dialog-open", "fs-create-dir", "fs-exists", "fs-read-dir", "fs-read-file", "fs-write-file", "path-all", "protocol-asset", "shell-open"] } 17 | serde = { version = "1.0", features = ["derive"] } 18 | serde_json = "1.0" 19 | 20 | [features] 21 | # this feature is used for production builds or when `devPath` points to the filesystem 22 | # DO NOT REMOVE!! 23 | custom-protocol = ["tauri/custom-protocol"] 24 | 25 | [profile.release.package.wry] 26 | #debug = true 27 | #debug-assertions = true 28 | -------------------------------------------------------------------------------- /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | // Prevents additional console window on Windows in release, DO NOT REMOVE!! 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command 5 | #[tauri::command] 6 | fn greet(name: &str) -> String { 7 | format!("Hello, {}! You've been greeted from Rust!", name) 8 | } 9 | 10 | fn main() { 11 | tauri::Builder::default() 12 | .invoke_handler(tauri::generate_handler![greet]) 13 | .run(tauri::generate_context!()) 14 | .expect("error while running tauri application"); 15 | } 16 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "npm run dev", 4 | "beforeBuildCommand": "npm run build", 5 | "devPath": "http://localhost:1420", 6 | "distDir": "../dist", 7 | "withGlobalTauri": false 8 | }, 9 | "package": { 10 | "productName": "itos", 11 | "version": "1.0.0" 12 | }, 13 | "tauri": { 14 | "allowlist": { 15 | "path": { 16 | "all": true 17 | }, 18 | "fs": { 19 | "exists": true, 20 | "createDir": true, 21 | "copyFile": true, 22 | "removeFile": true, 23 | "writeFile": true, 24 | "readFile": true, 25 | "readDir": true, 26 | "scope": [ 27 | "$APPLOCALDATA/*", 28 | "$APPLOCALDATA/data/*", 29 | "$APPLOCALDATA/Prompt/*", 30 | "$APPLOCALDATA/Talkroom/*", 31 | "$APPLOCALDATA/Avatar/*" 32 | ] 33 | }, 34 | "dialog": { 35 | "all": false, 36 | "ask": false, 37 | "confirm": false, 38 | "message": false, 39 | "open": true, 40 | "save": false 41 | }, 42 | "shell": { 43 | "all": false, 44 | "open": true 45 | }, 46 | "protocol": { 47 | "asset": true, 48 | "assetScope": ["$APPLOCALDATA/data/*"] 49 | } 50 | }, 51 | "bundle": { 52 | "active": true, 53 | "icon": [ 54 | "icons/32x32.png", 55 | "icons/128x128.png", 56 | "icons/128x128@2x.png", 57 | "icons/icon.icns", 58 | "icons/icon.ico" 59 | ], 60 | "identifier": "itos", 61 | "targets": "all" 62 | }, 63 | "security": { 64 | "csp": "default-src 'self'; img-src 'self' https://asset.localhost; style-src 'self' fonts.googleapis.com 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='; font-src fonts.gstatic.com; connect-src 'self' https://api.openai.com; asset: https://asset.localhost;" 65 | }, 66 | "updater": { 67 | "active": true, 68 | "endpoints": [ 69 | "https://gist.githubusercontent.com/Mikoshiba-Kyu/4b7ae30abb9e20b098d01ba986abf1c3/raw" 70 | ], 71 | "dialog": true, 72 | "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDIxRjBFQUIzMTc1NUE3M0QKUldROXAxVVhzK3J3SVE5ZXhVNy8weVpmYS93bC9vdTBsV2JjNnJmUzhMbkxiUTZ0dXA2ZWFtN04K", 73 | "windows": { 74 | "installMode": "passive" 75 | } 76 | }, 77 | "windows": [ 78 | { 79 | "fullscreen": false, 80 | "resizable": true, 81 | "title": "itos powered by GPT", 82 | "width": 800, 83 | "height": 600 84 | } 85 | ] 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .logo.vite:hover { 2 | filter: drop-shadow(0 0 2em #747bff); 3 | } 4 | 5 | .logo.react:hover { 6 | filter: drop-shadow(0 0 2em #61dafb); 7 | } 8 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useRecoilValue } from 'recoil' 2 | import { settingsState } from './atoms/settingsState' 3 | import CssBaseline from '@mui/material/CssBaseline' 4 | import { Box } from '@mui/material' 5 | import { ThemeProvider } from '@mui/material/styles' 6 | import SidePanel from './components/SidePanel/SidePanel' 7 | import { theme } from './utils/theme' 8 | import TimeLine from './components/TimeLine/TimeLine' 9 | import ShowError from './components/UI/ShowError' 10 | import './i18n/configs' 11 | 12 | const App = () => { 13 | const settings = useRecoilValue(settingsState) 14 | 15 | // Do not show right-click menus on applications. 16 | const handleContextMenu = ( 17 | e: React.MouseEvent 18 | ) => { 19 | e.preventDefault() 20 | } 21 | 22 | return ( 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | ) 32 | } 33 | 34 | export default App 35 | -------------------------------------------------------------------------------- /src/assets/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src/assets/app-icon.png -------------------------------------------------------------------------------- /src/assets/itos_textlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mikoshiba-Kyu/Tauri-itos/054489c4ee770bc7fd57270c37eb20baf7dffcbb/src/assets/itos_textlogo.png -------------------------------------------------------------------------------- /src/atoms/settingsState.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'recoil' 2 | import { loadConfig } from '../utils/config' 3 | import type { ConfigFile } from '../types/types' 4 | 5 | export const settingsState = atom({ 6 | key: 'UserConfig', 7 | default: loadConfig(), 8 | }) 9 | -------------------------------------------------------------------------------- /src/atoms/showErrorState.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'recoil' 2 | 3 | export const showErrorState = atom({ 4 | key: 'ShowError', 5 | default: '', 6 | }) 7 | -------------------------------------------------------------------------------- /src/atoms/timelineState.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'recoil' 2 | import { Timeline } from '../types/types' 3 | import { loadTextFileInDataDir } from '../utils/files' 4 | 5 | const setDefaultValue = async (): Promise => { 6 | const result = await loadTextFileInDataDir('Timeline.json') 7 | return result as Timeline 8 | } 9 | 10 | export const timelineState = atom({ 11 | key: 'TimelineState', 12 | default: setDefaultValue(), 13 | }) 14 | -------------------------------------------------------------------------------- /src/components/SidePanel/EditColumnsMenu/EditColumnsMenu.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | import { 3 | Box, 4 | FormLabel, 5 | List, 6 | ListItem, 7 | ListItemText, 8 | Typography, 9 | Checkbox, 10 | ListItemIcon, 11 | ListItemButton, 12 | Menu, 13 | MenuItem, 14 | IconButton, 15 | Tooltip, 16 | } from '@mui/material' 17 | import { useRecoilState } from 'recoil' 18 | import { timelineState } from '../../../atoms/timelineState' 19 | import MoreVertIcon from '@mui/icons-material/MoreVert' 20 | import { Spacer } from '../../UI/Spacer' 21 | import { saveTextFileInDataDir } from '../../../utils/files' 22 | import { t } from 'i18next' 23 | import { ConversationFile, TimelineData } from '../../../types/types' 24 | import { 25 | loadTextFileInDataDir, 26 | deleteFileInDataDir, 27 | } from '../../../utils/files' 28 | import Body from '../../TimeLine/ColumnPane/Body' 29 | 30 | const style = { 31 | width: '100%', 32 | flexGrow: 1, 33 | display: 'flex', 34 | flexDirection: 'column', 35 | padding: '1rem', 36 | overflowY: 'auto', 37 | } 38 | 39 | const conversationListStyle = { 40 | height: '16rem', 41 | overflowY: 'auto', 42 | border: '1px solid', 43 | borderColor: 'timelineBorder.primary', 44 | borderRadius: '4px', 45 | } 46 | 47 | const conversationPreviewStyle = { 48 | flexGrow: 1, 49 | display: 'flex', 50 | border: '1px solid', 51 | borderColor: 'timelineBorder.primary', 52 | borderRadius: '4px', 53 | overflowY: 'auto', 54 | } 55 | 56 | const EditColumnsMenu = () => { 57 | const [timeline, setTimeline] = useRecoilState(timelineState) 58 | 59 | const [selectedId, setSelectedId] = useState() 60 | const [conversationFile, setConversationFile] = useState< 61 | ConversationFile | undefined 62 | >(undefined) 63 | const [anchorEl, setAnchorEl] = useState(null) 64 | const menuOpen = Boolean(anchorEl) 65 | 66 | const handleListItemClick = async (id: string) => { 67 | setSelectedId(id) 68 | 69 | const setData = async () => { 70 | const textObject = await loadTextFileInDataDir(`${id}.json`) 71 | const result: ConversationFile = textObject as ConversationFile 72 | setConversationFile(result) 73 | } 74 | setData() 75 | } 76 | 77 | const handleCheck = async ( 78 | event: React.ChangeEvent, 79 | id: string 80 | ) => { 81 | const newTimeline = timeline.map((timelineData: TimelineData) => { 82 | if (timelineData.id === id) { 83 | return { 84 | ...timelineData, 85 | visible: event.target.checked, 86 | } 87 | } else { 88 | return timelineData 89 | } 90 | }) 91 | 92 | setTimeline(newTimeline) 93 | await saveTextFileInDataDir('Timeline.json', JSON.stringify(newTimeline)) 94 | } 95 | 96 | const handleDelete = async () => { 97 | const deletedTimeline = timeline.filter( 98 | (timelineData: TimelineData) => timelineData.id !== selectedId 99 | ) 100 | 101 | await saveTextFileInDataDir( 102 | 'Timeline.json', 103 | JSON.stringify(deletedTimeline) 104 | ) 105 | 106 | await deleteFileInDataDir(`${selectedId}.json`) 107 | 108 | setTimeline(deletedTimeline) 109 | setSelectedId(undefined) 110 | handleMenuClose() 111 | } 112 | 113 | const handleMenuOpen = (event: React.MouseEvent, id: string) => { 114 | setSelectedId(id) 115 | setAnchorEl(event.currentTarget) 116 | } 117 | 118 | const handleMenuClose = () => { 119 | setAnchorEl(null) 120 | } 121 | 122 | return ( 123 | 124 | 125 | 126 | {t('editColumns.conversationList')} 127 | 128 | 129 | 130 | {timeline.map((timelineData: TimelineData) => { 131 | return ( 132 | 137 | handleListItemClick(timelineData.id)} 143 | > 144 | 145 | 150 | 151 | 154 | 155 | handleCheck(event, timelineData.id)} 158 | tabIndex={-1} 159 | disableRipple 160 | inputProps={{ 'aria-labelledby': timelineData.id }} 161 | /> 162 | 163 | 164 | handleMenuOpen(event, timelineData.id)} 166 | > 167 | 168 | 169 | 184 | handleDelete()}> 185 | {t('editColumns.deleteConversation')} 186 | 187 | 188 | 189 | 190 | ) 191 | })} 192 | 193 | 194 | 195 | 196 | 197 | 198 | {t('editColumns.conversationPreview')} 199 | 200 | 201 | 202 | 203 | {selectedId !== undefined && ( 204 | 209 | )} 210 | 211 | 212 | ) 213 | } 214 | 215 | export default EditColumnsMenu 216 | -------------------------------------------------------------------------------- /src/components/SidePanel/ExpandMenuHeader.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Typography, Grid, IconButton } from '@mui/material' 2 | import CloseIcon from '@mui/icons-material/Close' 3 | 4 | interface Props { 5 | title: string 6 | setExpandMenu: (value: string) => void 7 | } 8 | 9 | const style: object = { 10 | width: '100%', 11 | height: '--expand-menu-header-height', 12 | padding: '1rem', 13 | } 14 | 15 | const ExpandMenuHeader = (props: Props) => { 16 | const { title, setExpandMenu } = props 17 | 18 | return ( 19 | 20 | 21 | {title} 22 | setExpandMenu('')}> 23 | 24 | 25 | 26 | 27 | ) 28 | } 29 | 30 | export default ExpandMenuHeader 31 | -------------------------------------------------------------------------------- /src/components/SidePanel/InformationMenu/informationMenu.tsx: -------------------------------------------------------------------------------- 1 | import { Stack, Grid, Typography, Link, Box } from '@mui/material' 2 | import AppIcon from '../../../assets/app-icon.png' 3 | import AppLogo from '../../../assets/itos_textlogo.png' 4 | import { Spacer } from '../../UI/Spacer' 5 | 6 | const style = { 7 | width: '100%', 8 | flexGrow: 1, 9 | padding: '1rem', 10 | overflowY: 'auto', 11 | } 12 | 13 | const InformationMenu = () => { 14 | return ( 15 | 16 | 17 | 18 | {`application 24 | 25 | 26 | {`application 32 | 33 | 34 | 35 | Version 1.0.0 36 | 37 | 38 | 39 | 40 | itos is a desktop client application that allows you to manage multiple 41 | threads of ChatGPT conversations. 42 | 43 | 44 | Just set the API KEY for ChatGPT to get started right away. 45 | 46 | 47 | itos is a multi-platform application that runs on Windows, MacOS, and 48 | Linux. 49 | 50 | 51 | 52 | 53 | 54 | Multiple conversations can be arranged on the screen. 55 | 56 | 57 | Individual conversations can be easily displayed, hidden, and 58 | rearranged. 59 | 60 | 61 | Each conversation can have its own prompt. 62 | 63 | 64 | This allows you to give instructions to ChatGPT. 65 | 66 | 67 | You can set icon files for yourself and for the assistant for each 68 | conversation. 69 | 70 | 71 | This can be used for character-based conversations, etc. 72 | 73 | 74 | Switch between English and Japanese, change color themes. 75 | 76 | 77 | These screen display customizations are supported. 78 | 79 | 80 | 81 | 82 | Github Repository 83 | 88 | Tauri-itos 89 | 90 | 91 | 92 | Author: Mikoshiba-Kyu 93 | 94 | 99 | X 100 | 101 |  /  102 | 107 | Bluesky 108 | 109 | 110 | 111 | ) 112 | } 113 | 114 | export default InformationMenu 115 | -------------------------------------------------------------------------------- /src/components/SidePanel/SettingsMenu/SettingsMenu.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { useRecoilState } from 'recoil' 3 | import { settingsState } from '../../../atoms/settingsState' 4 | import { 5 | Stack, 6 | RadioGroup, 7 | FormControl, 8 | FormControlLabel, 9 | FormLabel, 10 | TextField, 11 | Typography, 12 | Radio, 13 | Avatar, 14 | Select, 15 | MenuItem, 16 | } from '@mui/material' 17 | import PersonIcon from '@mui/icons-material/Person' 18 | import { Spacer } from '../../UI/Spacer' 19 | import { saveConfig } from '../../../utils/config' 20 | import { useTranslation } from 'react-i18next' 21 | import { t } from 'i18next' 22 | import { convertFileSrc } from '@tauri-apps/api/tauri' 23 | import { open } from '@tauri-apps/api/dialog' 24 | import { copyFile } from '@tauri-apps/api/fs' 25 | import { basename } from '@tauri-apps/api/path' 26 | import { getDataDirPath } from '../../../utils/files' 27 | 28 | const style = { 29 | width: '100%', 30 | flexGrow: 1, 31 | padding: '1rem', 32 | overflowY: 'auto', 33 | } 34 | 35 | const SettingsMenu = () => { 36 | const [settings, setSettings] = useRecoilState(settingsState) 37 | const { i18n } = useTranslation() 38 | 39 | const [dataDirPath, setDataDirPath] = useState('') 40 | useEffect(() => { 41 | ;(async () => { 42 | const result = await getDataDirPath() 43 | setDataDirPath(result) 44 | })() 45 | }, []) 46 | 47 | // Theme 48 | const handleThemeChange = 49 | () => (event: React.ChangeEvent) => { 50 | const value = (event.target as HTMLInputElement).value 51 | 52 | setSettings({ ...settings, ...{ theme: value } }) 53 | ;(async () => { 54 | await saveConfig({ theme: value }) 55 | })() 56 | } 57 | 58 | // Language 59 | const handleLanguageChange = 60 | () => (event: React.ChangeEvent) => { 61 | const value = (event.target as HTMLInputElement).value 62 | 63 | i18n.changeLanguage(value) 64 | 65 | setSettings({ ...settings, ...{ language: value } }) 66 | ;(async () => { 67 | await saveConfig({ language: value }) 68 | })() 69 | } 70 | 71 | // ChatGPT API Key 72 | const handleAPIKeyChange = 73 | () => (event: React.ChangeEvent) => { 74 | const value = (event.target as HTMLInputElement).value 75 | 76 | setSettings({ ...settings, ...{ apiKey: value } }) 77 | ;(async () => { 78 | await saveConfig({ apiKey: value }) 79 | })() 80 | } 81 | 82 | // ChatGPT Model 83 | const handleModelChange = (event: any) => { 84 | const value = event.target.value 85 | setSettings({ ...settings, ...{ model: value } }) 86 | ;(async () => { 87 | await saveConfig({ model: value }) 88 | })() 89 | } 90 | 91 | // Timeline Sort 92 | const handleTimelineSortChange = 93 | () => (event: React.ChangeEvent) => { 94 | const value = (event.target as HTMLInputElement).value 95 | 96 | setSettings({ ...settings, ...{ timelineSort: value } }) 97 | ;(async () => { 98 | await saveConfig({ timelineSort: value }) 99 | })() 100 | } 101 | 102 | const handleClickAvatar = async (): Promise => { 103 | const result: string | string[] | null = await open({ 104 | multiple: false, 105 | filters: [ 106 | { 107 | name: 'Images', 108 | extensions: ['png', 'jpg', 'jpeg', 'gif', 'bmp'], 109 | }, 110 | ], 111 | }) 112 | 113 | if (!result) return 114 | 115 | const filePath = result as string 116 | 117 | // 画像ファイル以外の時は処理を終了する 118 | const pattern = /.*\.(png|jpg|jpeg|gif|bmp)$/ 119 | if (!pattern.test(filePath)) return 120 | 121 | // 選択されたファイルをdataにコピーする 122 | const fileName = await basename(filePath) 123 | await copyFile(filePath, `${dataDirPath}${fileName}`) 124 | 125 | // atomsとファイルのUserIconFileNameを更新する 126 | setSettings({ ...settings, ...{ userIconFileName: fileName } }) 127 | ;(async () => { 128 | await saveConfig({ userIconFileName: fileName }) 129 | })() 130 | } 131 | 132 | return ( 133 | 134 | 135 | 136 | {t('settings.userAvatar')} 137 | 138 | 139 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | {t('settings.theme')} 161 | 162 | 163 | settings.theme ?? 'dark'} 166 | onChange={handleThemeChange()} 167 | > 168 | } 171 | label={t('settings.light')} 172 | /> 173 | } 176 | label={t('settings.dark')} 177 | /> 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | {t('settings.language')} 186 | 187 | 188 | settings.language ?? 'en'} 191 | onChange={handleLanguageChange()} 192 | > 193 | } 196 | label={t('settings.english')} 197 | /> 198 | } 201 | label={t('settings.japanese')} 202 | /> 203 | 204 | 205 | 206 | 207 | 208 | 216 | 217 | 218 | 219 | 220 | 221 | ChatGPT Model 222 | 223 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | {t('settings.timelineSortOrder')} 239 | 240 | 241 | 242 | settings.timelineSort ?? 'desc'} 245 | onChange={handleTimelineSortChange()} 246 | > 247 | } 250 | label={t('settings.ascending')} 251 | /> 252 | } 255 | label={t('settings.descending')} 256 | /> 257 | 258 | 259 | 260 | ) 261 | } 262 | 263 | export default SettingsMenu 264 | -------------------------------------------------------------------------------- /src/components/SidePanel/SidePanel.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | import { Box, Drawer, IconButton, Modal, Tooltip, Avatar } from '@mui/material' 3 | import DriveFileRenameOutlineIcon from '@mui/icons-material/DriveFileRenameOutline' 4 | import ViewWeekIcon from '@mui/icons-material/ViewWeek' 5 | import SettingsIcon from '@mui/icons-material/Settings' 6 | import InfoIcon from '@mui/icons-material/Info' 7 | import ExpandMenuHeader from './ExpandMenuHeader' 8 | import SettingsMenu from './SettingsMenu/SettingsMenu' 9 | import { t } from 'i18next' 10 | import EditColumnsMenu from './EditColumnsMenu/EditColumnsMenu' 11 | import ConversationEdit from '../UI/ConversationEdit' 12 | import InformationMenu from './InformationMenu/informationMenu' 13 | 14 | const SidePanel = () => { 15 | const [expandMenu, setExpandMenu] = useState('') 16 | 17 | const drawerWidth = expandMenu === '' ? 'var(--menu-closed-width)' : '600px' 18 | const expandMenuWidth = expandMenu === '' ? '0px' : '540px' 19 | 20 | return ( 21 | 26 | 42 | 52 | 53 | 55 | expandMenu === 'newTalk' 56 | ? setExpandMenu('') 57 | : setExpandMenu('newTalk') 58 | } 59 | sx={{ alignItems: 'center' }} 60 | > 61 | 70 | 71 | 72 | 73 | 74 | 76 | expandMenu === 'columnSettings' 77 | ? setExpandMenu('') 78 | : setExpandMenu('columnSettings') 79 | } 80 | > 81 | 90 | 91 | 92 | 93 | 94 | 96 | expandMenu === 'settings' 97 | ? setExpandMenu('') 98 | : setExpandMenu('settings') 99 | } 100 | > 101 | 110 | 111 | 112 | 113 | 114 | 116 | expandMenu === 'info' 117 | ? setExpandMenu('') 118 | : setExpandMenu('info') 119 | } 120 | > 121 | 128 | 129 | 130 | 131 | 132 | 140 | {expandMenu === 'newTalk' ? ( 141 | <> 142 | 146 | setExpandMenu('')} 149 | /> 150 | 151 | ) : expandMenu === 'columnSettings' ? ( 152 | <> 153 | 157 | 158 | 159 | ) : expandMenu === 'settings' ? ( 160 | <> 161 | 165 | 166 | 167 | ) : expandMenu === 'info' ? ( 168 | <> 169 | 173 | 174 | 175 | ) : null} 176 | 177 | 178 | 179 | ) 180 | } 181 | 182 | export default SidePanel 183 | -------------------------------------------------------------------------------- /src/components/TimeLine/ColumnPane/Body.tsx: -------------------------------------------------------------------------------- 1 | import { useRecoilValue } from 'recoil' 2 | import { settingsState } from '../../../atoms/settingsState' 3 | import { Box, Typography, Grid, Avatar, CircularProgress } from '@mui/material' 4 | import PersonIcon from '@mui/icons-material/Person' 5 | import SpokeIcon from '@mui/icons-material/Spoke' 6 | import { ConversationFile, ConversationData } from '../../../types/types' 7 | import BlankContents from '../../UI/BlankContents' 8 | import { t } from 'i18next' 9 | import { getDataDirPath } from '../../../utils/files' 10 | import { useEffect, useState } from 'react' 11 | import { convertFileSrc } from '@tauri-apps/api/tauri' 12 | import { Spacer } from '../../UI/Spacer' 13 | import ReactMarkdown from 'react-markdown' 14 | import CodeBlock from '../../UI/CodeBlock' 15 | 16 | export interface Props { 17 | conversationFile?: ConversationFile 18 | scrollRef?: React.RefObject 19 | isPreview?: boolean 20 | isProgress: boolean 21 | } 22 | 23 | export interface MessageAvatarProps { 24 | conversationData: ConversationData 25 | } 26 | 27 | const style = { 28 | flexGrow: 1, 29 | width: '100%', 30 | overflowY: 'auto', 31 | } 32 | 33 | // TODO: カラーにテーマを適用する 34 | const cardStyle = { 35 | width: '100%', 36 | paddingTop: '1rem', 37 | paddingLeft: '1rem', 38 | paddingRight: '1rem', 39 | borderBottom: '1px solid', 40 | borderBottomColor: 'timelineBorder.primary', 41 | } 42 | 43 | const Body = (props: Props) => { 44 | const { conversationFile, scrollRef, isPreview, isProgress } = props 45 | 46 | const [dataDirPath, setDataDirPath] = useState('') 47 | useEffect(() => { 48 | ;(async () => { 49 | const result = await getDataDirPath() 50 | setDataDirPath(result) 51 | })() 52 | }, []) 53 | 54 | const settings = useRecoilValue(settingsState) 55 | 56 | if ( 57 | !conversationFile || 58 | Object.keys(conversationFile.conversations).length <= 1 59 | ) { 60 | return 61 | } 62 | 63 | // talkFileを画面表示用に整形する 64 | const displayTalks: ConversationData[] = 65 | conversationFile.conversations.filter( 66 | (conversationData: ConversationData) => 67 | conversationData.message.role !== 'system' 68 | ) 69 | settings.timelineSort !== 'asc' && displayTalks.reverse() 70 | 71 | // Set Avatar 72 | const MessageAvatar = (props: MessageAvatarProps) => { 73 | const { conversationData } = props 74 | { 75 | return conversationData.message.role === 'user' ? ( 76 | 80 | 81 | 82 | ) : ( 83 | 89 | 90 | 91 | ) 92 | } 93 | } 94 | 95 | return ( 96 | 97 | {isProgress && ( 98 | 111 | 112 | 113 | )} 114 | 115 | {displayTalks.map((conversationData: ConversationData, index) => { 116 | return ( 117 | 118 | 119 | 120 | 121 | 122 | 123 | 131 | 137 | 138 | 139 | 140 | 141 | 142 | 146 | {conversationData.timestamp ?? ''} 147 | 148 | 155 | {conversationData.model ?? ''} 156 | 157 | 158 | 159 | 160 | 161 | ) 162 | })} 163 | 164 | ) 165 | } 166 | export default Body 167 | -------------------------------------------------------------------------------- /src/components/TimeLine/ColumnPane/Header.tsx: -------------------------------------------------------------------------------- 1 | import { useRecoilState } from 'recoil' 2 | import { timelineState } from '../../../atoms/timelineState' 3 | import { 4 | Box, 5 | Grid, 6 | Typography, 7 | IconButton, 8 | Tooltip, 9 | Dialog, 10 | DialogTitle, 11 | } from '@mui/material' 12 | import { ConversationFile, TimelineData } from '../../../types/types' 13 | import DragIndicatorIcon from '@mui/icons-material/DragIndicator' 14 | import SettingsIcon from '@mui/icons-material/Settings' 15 | import CloseIcon from '@mui/icons-material/Close' 16 | import { t } from 'i18next' 17 | import { saveTextFileInDataDir } from '../../../utils/files' 18 | import { useState } from 'react' 19 | import ConversationEdit from '../../UI/ConversationEdit' 20 | 21 | export interface Props { 22 | conversationFile?: ConversationFile 23 | setConversationFile: (value: ConversationFile) => void 24 | listeners: any 25 | columnWidth: string 26 | } 27 | 28 | const style = { 29 | height: 'var(--column-header-height)', 30 | width: '100%', 31 | display: 'flex', 32 | } 33 | 34 | const Header = (props: Props) => { 35 | const { conversationFile, setConversationFile, listeners, columnWidth } = 36 | props 37 | if (!conversationFile) return null 38 | 39 | const [timeline, setTimeline] = useRecoilState(timelineState) 40 | const [conversationEditOpen, setConversationEditOpen] = useState(false) 41 | 42 | const getTotalTokenCount = () => { 43 | const keys = Object.keys(conversationFile.conversations) 44 | const lastKey: any = keys[keys.length - 1] 45 | return conversationFile.conversations[lastKey].totalTokens 46 | } 47 | 48 | const handleConversationEditOpen = () => { 49 | setConversationEditOpen(true) 50 | } 51 | 52 | const handleHideColumns = async () => { 53 | const newTimeline = timeline.map((timelineData: TimelineData) => { 54 | if (timelineData.id === conversationFile.id) { 55 | return { 56 | ...timelineData, 57 | visible: false, 58 | } 59 | } else { 60 | return timelineData 61 | } 62 | }) 63 | 64 | await saveTextFileInDataDir('Timeline.json', JSON.stringify(newTimeline)) 65 | 66 | setTimeline(newTimeline) 67 | } 68 | 69 | return ( 70 | 71 | 72 | 78 | 79 | 88 | 89 | 94 | 95 | 96 | 104 | 105 | 114 | {conversationFile.name} 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 127 | 128 | 129 | setConversationEditOpen(false)} 131 | open={conversationEditOpen} 132 | > 133 | 134 | {t('editConversations.editConversations')} 135 | 136 | 137 | setConversationEditOpen(false)} 142 | /> 143 | 144 | 145 | 146 | 147 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 167 | {`Total Tokens : ${getTotalTokenCount() ?? '-'}`} 168 | 169 | 170 | 171 | 172 | 173 | ) 174 | } 175 | 176 | export default Header 177 | -------------------------------------------------------------------------------- /src/components/TimeLine/ColumnPane/InputBox.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | import { flushSync } from 'react-dom' 3 | import { useRecoilValue, useRecoilState } from 'recoil' 4 | import { showErrorState } from '../../../atoms/showErrorState' 5 | import { settingsState } from '../../../atoms/settingsState' 6 | import { saveTextFileInDataDir } from '../../../utils/files' 7 | import { t } from 'i18next' 8 | import { ChatCompletionRequestMessage, Configuration, OpenAIApi } from 'openai' 9 | import { 10 | Accordion, 11 | AccordionSummary, 12 | AccordionDetails, 13 | Box, 14 | FormControl, 15 | FormLabel, 16 | Typography, 17 | TextField, 18 | Button, 19 | Grid, 20 | } from '@mui/material' 21 | import ExpandMoreIcon from '@mui/icons-material/ExpandMore' 22 | import { ConversationFile, ConversationData } from '../../../types/types' 23 | import { getDataTimeNow } from '../../../utils/datetime' 24 | 25 | export interface Props { 26 | conversationFile: ConversationFile 27 | setConversationFile: (conversationFile: ConversationFile) => void 28 | scrollRef: React.RefObject 29 | isAccordionOpen: boolean 30 | setIsAccordionOpen: (value: boolean) => void 31 | setIsProgress: (value: boolean) => void 32 | } 33 | 34 | const adjustScroll = ( 35 | scrollRef: React.RefObject, 36 | timelineSort?: string 37 | ) => { 38 | setTimeout(() => { 39 | if (scrollRef.current) { 40 | let element 41 | timelineSort !== 'asc' 42 | ? (element = scrollRef.current.firstElementChild as HTMLElement) 43 | : (element = scrollRef.current.lastElementChild as HTMLElement) 44 | 45 | element.scrollIntoView({ 46 | behavior: 'smooth', 47 | block: 'end', 48 | }) 49 | } 50 | }, 0) 51 | } 52 | 53 | const inputStyle: object = { 54 | width: '100%', 55 | height: 'var(--column-open-input-height)', 56 | } 57 | 58 | const InputBox = (props: Props) => { 59 | const { 60 | conversationFile, 61 | setConversationFile, 62 | scrollRef, 63 | setIsAccordionOpen, 64 | setIsProgress, 65 | } = props 66 | 67 | const [messageValue, setMessageValue] = useState('') 68 | const settings = useRecoilValue(settingsState) 69 | const [showError, setShowError] = useRecoilState(showErrorState) 70 | 71 | const handleClickSend = async () => { 72 | // Handling of blanks, as they may be called from shortcut keys. 73 | if (messageValue === '') return 74 | 75 | flushSync(async () => { 76 | // ChatGPTが設定されていなければ処理を終了する 77 | const apiKey = settings.apiKey 78 | if (!apiKey) { 79 | setShowError(t('error.chatGPTApiKeyIsNotSet')) 80 | return 81 | } 82 | 83 | const model = settings.model 84 | if (!model) { 85 | setShowError(t('error.chatGPTModelIsNotSet')) 86 | return 87 | } 88 | 89 | // 現在の conversationFile をロールバック用に取得する 90 | const baseData: ConversationFile = conversationFile 91 | 92 | // ユーザーの発言を追記した ConversationData を作成する 93 | const userConversationData: ConversationData = { 94 | number: 0, //TODO: 実際の番号を算出する。beforeData内の最後の番号 + 1 95 | timestamp: getDataTimeNow(), 96 | message: { role: 'user', content: messageValue }, 97 | } 98 | 99 | // ユーザーの発言を追記した ConversationFile を作成する 100 | const addedUserConversationFile: ConversationFile = { 101 | ...conversationFile, 102 | conversations: [ 103 | ...conversationFile.conversations, 104 | userConversationData, 105 | ], 106 | } 107 | 108 | setConversationFile(addedUserConversationFile) 109 | 110 | setMessageValue('') 111 | adjustScroll(scrollRef, settings.timelineSort) 112 | 113 | // sendDataにmessagesのオブジェクトをセットする 114 | const sendData: { role: string; content: string }[] = [ 115 | ...addedUserConversationFile.conversations.map( 116 | (conversationData: ConversationData) => { 117 | return conversationData.message 118 | } 119 | ), 120 | ] 121 | 122 | // OpenAIのAPIを叩く 123 | setIsProgress(true) 124 | const configuration = new Configuration({ apiKey }) 125 | configuration.baseOptions.headers = { 126 | Authorization: `Bearer ${apiKey}`, 127 | } 128 | const openai = new OpenAIApi(configuration) 129 | 130 | try { 131 | const response = await openai.createChatCompletion({ 132 | model, 133 | messages: sendData as ChatCompletionRequestMessage[], 134 | }) 135 | 136 | const res: any | undefined = response.data 137 | if (!res) { 138 | setShowError(t('error.chatGPTNotResponse')) 139 | return 140 | } 141 | 142 | // response から ConversationData を作成する 143 | const resConversationData: ConversationData = { 144 | number: 0, //TODO: 実際の番号を算出する。beforeData内の最後の番号 + 1 145 | timestamp: getDataTimeNow(), 146 | model: res.model, 147 | promptTokens: res.usage.prompt_tokens, 148 | completionTokens: res.usage.completion_tokens, 149 | totalTokens: res.usage.total_tokens, 150 | message: res.choices[0].message, 151 | } 152 | 153 | // response から ConversationFile を作成する 154 | const addedResConversationFile = { 155 | ...conversationFile, 156 | conversations: [ 157 | ...addedUserConversationFile.conversations, 158 | resConversationData, 159 | ], 160 | } 161 | setConversationFile(addedResConversationFile) 162 | adjustScroll(scrollRef, settings.timelineSort) 163 | setIsProgress(false) 164 | 165 | // ConversationFile を更新する 166 | const fileName = `${addedResConversationFile.id}.json` 167 | await saveTextFileInDataDir( 168 | fileName, 169 | JSON.stringify(addedResConversationFile, null, 2) 170 | ) 171 | } catch (err) { 172 | setConversationFile(baseData) 173 | setIsProgress(false) 174 | setShowError(t('error.chatGPTUnknownError')) 175 | } 176 | }) 177 | } 178 | 179 | return ( 180 | 183 | setIsAccordionOpen(expanded) 184 | } 185 | > 186 | 189 | } 190 | aria-controls="panel1a-content" 191 | sx={{ minHeight: 'var(--column-close-input-height)' }} 192 | > 193 | 194 | 195 | 196 | 197 | 198 | {t('timeline.enterMessage')} 199 | 200 | 201 | 202 | 203 | ) => { 211 | setMessageValue(event.target.value) 212 | }} 213 | onKeyDown={(event: React.KeyboardEvent) => { 214 | if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) { 215 | handleClickSend() 216 | } 217 | }} 218 | sx={{ 219 | '& .MuiOutlinedInput-root': { 220 | '& > fieldset': { borderColor: 'inputOutline.primary' }, 221 | }, 222 | }} 223 | /> 224 | 225 | 230 | 231 | {`${t('timeline.send')} : Ctrl+Enter`} 235 | 236 | 237 | 244 | 245 | 246 | 247 | 248 | 249 | ) 250 | } 251 | 252 | export default InputBox 253 | -------------------------------------------------------------------------------- /src/components/TimeLine/ColumnPane/Pane.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState } from 'react' 2 | import { useRecoilState } from 'recoil' 3 | import { timelineState } from '../../../atoms/timelineState' 4 | import { Box } from '@mui/material' 5 | import Header from './Header' 6 | import Body from './Body' 7 | import { ConversationFile, Timeline, TimelineData } from '../../../types/types' 8 | import { 9 | loadTextFileInDataDir, 10 | saveTextFileInDataDir, 11 | } from '../../../utils/files' 12 | import { Rnd, RndResizeCallback } from 'react-rnd' 13 | import InputBox from './InputBox' 14 | import { useSortable } from '@dnd-kit/sortable' 15 | import { CSS } from '@dnd-kit/utilities' 16 | 17 | export interface Props { 18 | id: string 19 | } 20 | 21 | const style = { 22 | display: 'flex', 23 | flexDirection: 'column', 24 | height: '100%', 25 | borderRightWidth: '4px', 26 | borderRightStyle: 'solid', 27 | borderRightColor: 'timelineBorder.primary', 28 | } 29 | 30 | const resizeHandleClasses = { 31 | right: 'right-resize-handle', 32 | } 33 | 34 | const Pane = (props: Props) => { 35 | const { id } = props 36 | 37 | const scrollRef = useRef(null) 38 | 39 | const [timeline, setTimeline] = useRecoilState(timelineState) 40 | 41 | const [conversationFile, setConversationFile] = useState< 42 | ConversationFile | undefined 43 | >(undefined) 44 | const [columnWidth, setColumnWidth] = useState( 45 | timeline.find((timelineData: TimelineData) => timelineData.id === id)! 46 | .columnWidth 47 | ) 48 | const [isAccordionOpen, setIsAccordionOpen] = useState(false) 49 | const [isProgress, setIsProgress] = useState(false) 50 | 51 | const { attributes, listeners, setNodeRef, transform } = useSortable({ 52 | id: id, 53 | }) 54 | 55 | const dragstyle = { 56 | transform: CSS.Transform.toString(transform), 57 | } 58 | 59 | const handleResize: RndResizeCallback = async (_, __, elementRef) => { 60 | const newWidth: string = elementRef.style.width 61 | setColumnWidth(newWidth) 62 | 63 | const newTimeline: Timeline = timeline.map((timelineData: TimelineData) => { 64 | if (timelineData.id === id) { 65 | return { ...timelineData, columnWidth: newWidth } 66 | } else { 67 | return timelineData 68 | } 69 | }) 70 | setTimeline(newTimeline) 71 | } 72 | 73 | // レンダリング時に対応するIDのトークファイルからデータを取得する 74 | useEffect(() => { 75 | const setData = async () => { 76 | const textObject = await loadTextFileInDataDir(`${id}.json`) 77 | const result: ConversationFile = textObject as ConversationFile 78 | setConversationFile(result) 79 | } 80 | setData() 81 | }, [id]) 82 | 83 | // debounce で columnWidth をファイルに保存する 84 | useEffect(() => { 85 | const timer = setTimeout(async () => { 86 | const newTimeline: Timeline = timeline.map( 87 | (timelineData: TimelineData) => { 88 | if (timelineData.id === id) { 89 | return { ...timelineData, columnWidth: columnWidth } 90 | } else { 91 | return timelineData 92 | } 93 | } 94 | ) 95 | await saveTextFileInDataDir( 96 | 'Timeline.json', 97 | JSON.stringify(newTimeline, null, 2) 98 | ) 99 | }, 500) 100 | return () => clearTimeout(timer) 101 | }, [columnWidth]) 102 | 103 | if (!conversationFile) return null 104 | 105 | return ( 106 | 107 | 131 | 132 |
138 | 146 | 151 |
152 |
153 |
154 | ) 155 | } 156 | 157 | export default Pane 158 | -------------------------------------------------------------------------------- /src/components/TimeLine/TimeLine.tsx: -------------------------------------------------------------------------------- 1 | import { useRecoilState } from 'recoil' 2 | import { timelineState } from '../../atoms/timelineState' 3 | import Pane from './ColumnPane/Pane' 4 | import { Box } from '@mui/material' 5 | import BlankContents from '../UI/BlankContents' 6 | import { t } from 'i18next' 7 | import { 8 | DndContext, 9 | closestCenter, 10 | KeyboardSensor, 11 | PointerSensor, 12 | useSensor, 13 | useSensors, 14 | DragEndEvent, 15 | } from '@dnd-kit/core' 16 | import { 17 | arrayMove, 18 | horizontalListSortingStrategy, 19 | SortableContext, 20 | sortableKeyboardCoordinates, 21 | } from '@dnd-kit/sortable' 22 | import { TimelineData } from '../../types/types' 23 | 24 | const TimeLine = () => { 25 | const [timeline, setTimeline] = useRecoilState(timelineState) 26 | 27 | const sensors = useSensors( 28 | useSensor(PointerSensor), 29 | useSensor(KeyboardSensor, { 30 | coordinateGetter: sortableKeyboardCoordinates, 31 | }) 32 | ) 33 | 34 | const handleDragEnd = (event: DragEndEvent) => { 35 | const { active, over } = event 36 | 37 | if (!over) { 38 | return 39 | } 40 | 41 | if (active.id !== over.id) { 42 | const oldIndex = timeline.findIndex( 43 | (v: TimelineData) => v.id === active.id 44 | ) 45 | const newIndex = timeline.findIndex((v: TimelineData) => v.id === over.id) 46 | setTimeline(arrayMove(timeline, oldIndex, newIndex)) 47 | } 48 | } 49 | 50 | const visibleColumnCount: number = timeline.filter( 51 | (timelineData: TimelineData) => timelineData.visible 52 | ).length 53 | 54 | return ( 55 | 61 | {!timeline || visibleColumnCount === 0 ? ( 62 | 63 | ) : ( 64 | 69 | 73 | {timeline.map( 74 | (item: TimelineData) => item.visible && 75 | )} 76 | 77 | 78 | )} 79 | 80 | ) 81 | } 82 | export default TimeLine 83 | -------------------------------------------------------------------------------- /src/components/UI/BlankContents.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Grid, Typography } from '@mui/material' 2 | import SmsOutlinedIcon from '@mui/icons-material/SmsOutlined' 3 | 4 | interface Props { 5 | message: string 6 | } 7 | 8 | const style = { 9 | flexGrow: 1, 10 | width: '100%', 11 | } 12 | 13 | const BlankContents = (props: Props) => { 14 | const { message } = props 15 | 16 | return ( 17 | 24 | 30 | {message} 31 | 32 | ) 33 | } 34 | 35 | export default BlankContents 36 | -------------------------------------------------------------------------------- /src/components/UI/CodeBlock.tsx: -------------------------------------------------------------------------------- 1 | import { CodeComponent } from 'react-markdown/lib/ast-to-react' 2 | import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' 3 | import { nord } from 'react-syntax-highlighter/dist/cjs/styles/prism' 4 | 5 | const CodeBlock: CodeComponent = ({ inline, className, children }) => { 6 | if (inline) { 7 | return {children} 8 | } 9 | const match = /language-(\w+)/.exec(className || '') 10 | const lang = match && match[1] ? match[1] : '' 11 | return ( 12 | 17 | ) 18 | } 19 | 20 | export default CodeBlock 21 | -------------------------------------------------------------------------------- /src/components/UI/ConversationEdit.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { useRecoilState } from 'recoil' 3 | import { timelineState } from '../../atoms/timelineState' 4 | import { 5 | Avatar, 6 | Button, 7 | FormControl, 8 | FormLabel, 9 | Stack, 10 | TextField, 11 | Typography, 12 | Menu, 13 | MenuItem, 14 | } from '@mui/material' 15 | import SpokeIcon from '@mui/icons-material/Spoke' 16 | import { open } from '@tauri-apps/api/dialog' 17 | import { copyFile } from '@tauri-apps/api/fs' 18 | import { basename } from '@tauri-apps/api/path' 19 | import { convertFileSrc } from '@tauri-apps/api/tauri' 20 | import { 21 | ConversationFile, 22 | ConversationData, 23 | TimelineData, 24 | } from '../../types/types' 25 | import { saveTextFileInDataDir, getDataDirPath } from '../../utils/files' 26 | import { t } from 'i18next' 27 | import { Spacer } from '../UI/Spacer' 28 | import { v4 as uuidv4 } from 'uuid' 29 | import { getDataTimeNow } from '../../utils/datetime' 30 | 31 | const style = { 32 | flexGrow: 1, 33 | padding: '1rem', 34 | overflowY: 'auto', 35 | } 36 | 37 | interface Props { 38 | editMode: 'new' | 'edit' 39 | conversationFile?: ConversationFile 40 | setConversationFile?: (value: ConversationFile) => void 41 | handleClose?: () => void 42 | } 43 | 44 | const ConversationEdit = (props: Props) => { 45 | const { editMode, conversationFile, setConversationFile, handleClose } = props 46 | 47 | const [titleVal, setTitleValue] = useState( 48 | conversationFile ? conversationFile.name : '' 49 | ) 50 | const [promptVal, setPromptValue] = useState( 51 | conversationFile ? conversationFile.conversations[0].message.content : '' 52 | ) 53 | const [avaterFileName, setAvatarFileName] = useState( 54 | conversationFile ? conversationFile.assistantIconFileName : '' 55 | ) 56 | const [titleError, setTitleError] = useState(false) 57 | const [timeline, setTimeline] = useRecoilState(timelineState) 58 | const [dataDirPath, setDataDirPath] = useState('') 59 | const [anchorEl, setAnchorEl] = useState(null) 60 | const menuOpen = Boolean(anchorEl) 61 | 62 | // レンダリング時にデータディレクトリのパスを取得する 63 | useEffect(() => { 64 | ;(async () => { 65 | const result = await getDataDirPath() 66 | setDataDirPath(result) 67 | })() 68 | }, []) 69 | 70 | // 指定されたタイトルが既に存在するかチェックする 71 | const checkTitle = (checkedValue: string): boolean => { 72 | return timeline.some((data: TimelineData) => data.name === checkedValue) 73 | } 74 | 75 | const avatarSelect = async (): Promise => { 76 | setAnchorEl(null) 77 | 78 | const result: string | string[] | null = await open({ 79 | multiple: false, 80 | filters: [ 81 | { 82 | name: 'Images', 83 | extensions: ['png', 'jpg', 'jpeg', 'gif', 'bmp'], 84 | }, 85 | ], 86 | }) 87 | 88 | if (!result) return 89 | 90 | const filePath = result as string 91 | 92 | // 画像ファイル以外の時は処理を終了する 93 | const pattern = /.*\.(png|jpg|jpeg|gif|bmp)$/ 94 | if (!pattern.test(filePath)) return 95 | 96 | // 選択されたファイルをdataにコピーする 97 | const rsultFileName = await basename(filePath) 98 | await copyFile(filePath, `${dataDirPath}${rsultFileName}`) 99 | 100 | setAvatarFileName(rsultFileName) 101 | } 102 | 103 | const avatarDelete = () => { 104 | setAnchorEl(null) 105 | setAvatarFileName('') 106 | } 107 | 108 | const handleMenuOpen = (event: React.MouseEvent) => { 109 | setAnchorEl(event.currentTarget) 110 | } 111 | 112 | const handleSubmit = async () => { 113 | let editConversations: ConversationData[] 114 | let newConversationFile: ConversationFile 115 | 116 | if (editMode === 'new') { 117 | const id = uuidv4() 118 | const name = titleVal 119 | const conversations: ConversationData[] = [ 120 | { 121 | number: 0, 122 | timestamp: getDataTimeNow(), 123 | model: '', 124 | promptTokens: 0, 125 | completionTokens: 0, 126 | totalTokens: 0, 127 | message: { role: 'system', content: promptVal }, 128 | }, 129 | ] 130 | 131 | newConversationFile = { 132 | id, 133 | name, 134 | assistantIconFileName: avaterFileName, 135 | conversations, 136 | } 137 | } else { 138 | editConversations = conversationFile!.conversations.map( 139 | (conversation: ConversationData, index: number) => { 140 | if (index === 0) { 141 | return { 142 | ...conversation, 143 | message: { 144 | ...conversation.message, 145 | content: promptVal, 146 | }, 147 | } 148 | } else { 149 | return conversation 150 | } 151 | } 152 | ) 153 | 154 | newConversationFile = { 155 | id: conversationFile!.id, 156 | name: titleVal, 157 | assistantIconFileName: avaterFileName, 158 | conversations: editConversations, 159 | } 160 | 161 | // editModeの場合は atoms も更新する 162 | setConversationFile!(newConversationFile) 163 | } 164 | 165 | // トークファイルを新規、または上書き保存する 166 | await saveTextFileInDataDir( 167 | `${newConversationFile.id}.json`, 168 | JSON.stringify(newConversationFile, null, 2) 169 | ) 170 | 171 | // timeline の atoms を更新する 172 | let newTimeline: TimelineData[] 173 | if (editMode === 'new') { 174 | newTimeline = [ 175 | { 176 | id: newConversationFile.id, 177 | name: newConversationFile.name, 178 | visible: true, 179 | columnWidth: '400px', 180 | }, 181 | ...timeline, 182 | ] 183 | } else { 184 | // timelineの中のidがnewConversationFile.idと一致するもののnameを更新する 185 | newTimeline = timeline.map((timelineData: TimelineData) => { 186 | if (timelineData.id === newConversationFile.id) { 187 | return { 188 | ...timelineData, 189 | name: newConversationFile.name, 190 | } 191 | } else { 192 | return timelineData 193 | } 194 | }) 195 | } 196 | 197 | setTimeline(newTimeline) 198 | 199 | await saveTextFileInDataDir( 200 | 'Timeline.json', 201 | JSON.stringify(newTimeline, null, 2) 202 | ) 203 | 204 | handleClose!() 205 | } 206 | 207 | return ( 208 | 209 | 210 | 211 | 212 | {t('editConversations.enterTitle')} 213 | 214 | 215 | 216 | 217 | ) => { 226 | setTitleValue(event.target.value) 227 | setTitleError(checkTitle(event.target.value)) 228 | }} 229 | /> 230 | 231 | 232 | 233 | 234 | 235 | 236 | {t('editConversations.assistantAvatar')} 237 | 238 | 239 | 240 | handleMenuOpen(event)} 252 | > 253 | 261 | 262 | setAnchorEl(null)} 266 | anchorOrigin={{ 267 | vertical: 'bottom', 268 | horizontal: 'left', 269 | }} 270 | transformOrigin={{ 271 | vertical: 'top', 272 | horizontal: 'left', 273 | }} 274 | > 275 | 276 | {t('editConversations.iconSelect')} 277 | 278 | 279 | {t('editConversations.iconDelete')} 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | {t('editConversations.enterPrompt')} 290 | 291 | 292 | 293 | 294 | ) => { 302 | setPromptValue(event.target.value) 303 | }} 304 | sx={{ 305 | '& .MuiOutlinedInput-root': { 306 | '& > fieldset': { borderColor: 'inputOutline.primary' }, 307 | }, 308 | }} 309 | /> 310 | 311 | 312 | 313 | 321 | 322 | ) 323 | } 324 | export default ConversationEdit 325 | -------------------------------------------------------------------------------- /src/components/UI/ShowError.tsx: -------------------------------------------------------------------------------- 1 | import { useRecoilState } from 'recoil' 2 | import { showErrorState } from '../../atoms/showErrorState' 3 | import { Snackbar, Alert } from '@mui/material' 4 | 5 | const ShowError = () => { 6 | const [showError, setShowError] = useRecoilState(showErrorState) 7 | 8 | const handleErrorClose = ( 9 | _event?: React.SyntheticEvent | Event, 10 | reason?: string 11 | ) => { 12 | if (reason === 'clickaway') { 13 | return 14 | } 15 | 16 | setShowError('') 17 | } 18 | 19 | return ( 20 | 26 | 27 | {showError} 28 | 29 | 30 | ) 31 | } 32 | export default ShowError 33 | -------------------------------------------------------------------------------- /src/components/UI/Spacer.tsx: -------------------------------------------------------------------------------- 1 | import { Box } from '@mui/material' 2 | 3 | export interface Props { 4 | size: string 5 | horizontal?: boolean 6 | } 7 | 8 | export const Spacer = (props: Props) => { 9 | return ( 10 | 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /src/i18n/configs.ts: -------------------------------------------------------------------------------- 1 | import i18n from 'i18next' 2 | import { initReactI18next } from 'react-i18next' 3 | import { loadConfig } from '../utils/config' 4 | 5 | import translation_en from './en.json' 6 | import translation_ja from './ja.json' 7 | 8 | const resources = { 9 | ja: { 10 | translation: translation_ja, 11 | }, 12 | en: { 13 | translation: translation_en, 14 | }, 15 | } 16 | 17 | const getLanguageConfig = async () => { 18 | let config = 'en' 19 | const result = await loadConfig() 20 | config = result.language ?? 'en' 21 | return config 22 | } 23 | 24 | ;(async () => { 25 | const fallbackLng = await getLanguageConfig() 26 | 27 | i18n.use(initReactI18next).init({ 28 | resources, 29 | fallbackLng, 30 | interpolation: { 31 | escapeValue: false, 32 | }, 33 | }) 34 | })() 35 | 36 | export default i18n 37 | -------------------------------------------------------------------------------- /src/i18n/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu": { 3 | "newTalk": "New Conversations", 4 | "editColumns": "Edit Columns", 5 | "changeSettings": "Change Settings", 6 | "info": "Information" 7 | }, 8 | "editConversations": { 9 | "editConversations": "Edit Conversations", 10 | "enterTitle": "Please enter a conversation title.", 11 | "sameTitleError": "The title is already used.", 12 | "assistantAvatar": "Please select the assistant icon file. (optional)", 13 | "enterPrompt": "Please enter a prompt. (optional)", 14 | "ok": "OK", 15 | "iconSelect": "Select Icon", 16 | "iconDelete": "Delete Icon" 17 | }, 18 | "editColumns": { 19 | "conversationList": "Conversation List", 20 | "conversationPreview": "Conversation Preview", 21 | "displayOnTimeline": "Display on Timeline", 22 | "deleteConversation": "Delete Conversation" 23 | }, 24 | "timeline": { 25 | "noTimeline": "No timeline to display", 26 | "noConversations": "No conversations yet", 27 | "enterMessage": "Please enter a message.", 28 | "send": "Send", 29 | "dragIcon": "You can rearrange the order of columns by dragging here.", 30 | "columnSettings": "Change the conversation settings.", 31 | "hideColumns": "Hide columns." 32 | }, 33 | "settings": { 34 | "userAvatar": "User's avatar file", 35 | "theme": "Theme", 36 | "light": "Light", 37 | "dark": "Dark", 38 | "language": "Language", 39 | "english": "English", 40 | "japanese": "Japanese", 41 | "timelineSortOrder": "Timeline Sort Order", 42 | "ascending": "Ascending", 43 | "descending": "Descending" 44 | }, 45 | "error": { 46 | "chatGPTApiKeyIsNotSet": "Please set the API key of ChatGPT.", 47 | "chatGPTModelIsNotSet": "Please set the Model of ChatGPT.", 48 | "chatGPTNotResponse": "No response from ChatGPT was received.", 49 | "chatGPTUnknownError": "Some problem occurred with the linkage to ChatGPT." 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/i18n/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu": { 3 | "newTalk": "新しい会話", 4 | "editColumns": "カラムの編集", 5 | "changeSettings": "設定を変更する", 6 | "info": "情報" 7 | }, 8 | "editConversations": { 9 | "editConversations": "会話の編集", 10 | "enterTitle": "会話のタイトルを入力してください", 11 | "sameTitleError": "このタイトルはすでに使用されています", 12 | "assistantAvatar": "アシスタントのアイコンファイルを選択してください (任意)", 13 | "enterPrompt": "プロンプトを入力してください (任意)", 14 | "ok": "決定", 15 | "iconSelect": "アイコンを選択", 16 | "iconDelete": "アイコンを削除" 17 | }, 18 | "editColumns": { 19 | "conversationList": "会話の一覧", 20 | "conversationPreview": "会話のプレビュー", 21 | "displayOnTimeline": "タイムラインに表示する", 22 | "deleteConversation": "会話を削除する" 23 | }, 24 | "timeline": { 25 | "noTimeline": "表示するタイムラインがありません", 26 | "noConversations": "まだ会話がありません", 27 | "enterMessage": "メッセージを入力してください", 28 | "send": "送信", 29 | "dragIcon": "ここをドラッグしてカラムの順番を入れ替えられます", 30 | "columnSettings": "会話の設定を変更します", 31 | "hideColumns": "カラムを非表示にします" 32 | }, 33 | "settings": { 34 | "userAvatar": "ユーザーのアイコンファイル", 35 | "theme": "テーマ", 36 | "light": "ライト", 37 | "dark": "ダーク", 38 | "language": "言語", 39 | "english": "英語", 40 | "japanese": "日本語", 41 | "timelineSortOrder": "タイムラインの並び順", 42 | "ascending": "昇順", 43 | "descending": "降順" 44 | }, 45 | "error": { 46 | "chatGPTApiKeyIsNotSet": "ChatGPT の API キーが設定されていません。", 47 | "chatGPTModelIsNotSet": "ChatGPT のモデルが設定されていません。", 48 | "chatGPTNotResponse": "ChatGPT からの応答がありませんでした。", 49 | "chatGPTUnknownError": "ChatGPT との連携で何らかの問題が発生しました。" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | import './styles.css' 5 | import { RecoilRoot } from 'recoil' 6 | 7 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 8 | 9 | 10 | 11 | 12 | 13 | ) 14 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | ::-webkit-scrollbar { 2 | width: 8px; 3 | } 4 | ::-webkit-scrollbar-track { 5 | background-color: #424242; 6 | } 7 | ::-webkit-scrollbar-thumb { 8 | background-color: #888888; 9 | } 10 | 11 | :root { 12 | --column-header-height: 64px; 13 | --column-close-input-height: 24px; 14 | --column-open-input-height: 20rem; 15 | --menu-closed-width: 60px; 16 | --expand-menu-header-height: 2rem; 17 | } 18 | 19 | body { 20 | width: 100vw; 21 | height: 100vh; 22 | user-select: none; 23 | } 24 | -------------------------------------------------------------------------------- /src/types/types.ts: -------------------------------------------------------------------------------- 1 | export type ConversationFile = { 2 | id: string 3 | name: string 4 | assistantIconFileName: string 5 | conversations: ConversationData[] 6 | } 7 | export type ConversationData = { 8 | number: number 9 | timestamp: string 10 | model?: string 11 | completionTokens?: number 12 | promptTokens?: number 13 | totalTokens?: number 14 | message: { role: string; content: string } 15 | } 16 | 17 | export type Timeline = TimelineData[] 18 | 19 | export type TimelineData = { 20 | id: string 21 | name: string 22 | visible: boolean 23 | columnWidth: string 24 | } 25 | 26 | export type ConfigFile = { 27 | theme?: string 28 | language?: string 29 | userIconFileName?: string 30 | apiKey?: string 31 | model?: string 32 | timelineSort?: string 33 | } 34 | -------------------------------------------------------------------------------- /src/utils/config.ts: -------------------------------------------------------------------------------- 1 | import { appLocalDataDir } from '@tauri-apps/api/path' 2 | import { exists, writeTextFile, readTextFile } from '@tauri-apps/api/fs' 3 | import type { ConfigFile } from '../types/types' 4 | 5 | const initConfig = async (): Promise => { 6 | const cfgFilePath = `${await appLocalDataDir()}config.json` 7 | 8 | const settings: ConfigFile = { 9 | theme: 'dark', 10 | language: 'en', 11 | userIconFileName: '', 12 | apiKey: '', 13 | model: '', 14 | timelineSort: 'desc', 15 | } 16 | 17 | await writeTextFile(cfgFilePath, JSON.stringify(settings, null, 2)) 18 | } 19 | 20 | export const loadConfig = async (): Promise => { 21 | const cfgFilePath = `${await appLocalDataDir()}config.json` 22 | 23 | // config.json が存在しなければ初期値で生成する 24 | if (!(await exists(cfgFilePath))) { 25 | console.log(`[itos] config.json is not exists. Re-create ${cfgFilePath}`) 26 | await initConfig() 27 | } 28 | 29 | const configText = await readTextFile(cfgFilePath) 30 | console.log(`[itos] Load ${cfgFilePath}`) 31 | 32 | return JSON.parse(configText) 33 | } 34 | 35 | export const saveConfig = async (param: object): Promise => { 36 | const cfgFilePath = `${await appLocalDataDir()}config.json` 37 | 38 | // config.json が存在しなければ初期値で生成する 39 | if (!(await exists(cfgFilePath))) { 40 | await initConfig() 41 | } 42 | 43 | const configText = await readTextFile(cfgFilePath) 44 | const configJson = JSON.parse(configText) 45 | 46 | const update = { ...configJson, ...param } 47 | 48 | await writeTextFile(cfgFilePath, JSON.stringify(update, null, 2)) 49 | console.log(`[itos] Save ${cfgFilePath}`) 50 | } 51 | 52 | export default loadConfig 53 | -------------------------------------------------------------------------------- /src/utils/datetime.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs' 2 | 3 | export const getDataTimeNow = () => { 4 | return dayjs().format('YYYY-MM-DD HH:mm:ss') 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/files.ts: -------------------------------------------------------------------------------- 1 | import { appLocalDataDir } from '@tauri-apps/api/path' 2 | import { 3 | readTextFile, 4 | writeTextFile, 5 | exists, 6 | createDir, 7 | removeFile, 8 | } from '@tauri-apps/api/fs' 9 | import { Timeline, ConversationFile } from '../types/types' 10 | 11 | export const createDataDir = async (): Promise => { 12 | const dataDirPath = `${await appLocalDataDir()}data` 13 | try { 14 | if (!(await exists(dataDirPath))) { 15 | await createDir(dataDirPath) 16 | } 17 | } catch (error) { 18 | console.error(error) 19 | } 20 | } 21 | 22 | export const loadTextFileInDataDir = async ( 23 | fileName: string 24 | ): Promise => { 25 | // If the data directory does not exist, recreate it. 26 | await createDataDir() 27 | 28 | // If there is no target file, it is created by default. 29 | const filePath = `${await appLocalDataDir()}data/${fileName}` 30 | if (!(await exists(filePath))) { 31 | await saveTextFileInDataDir(fileName, '[]') 32 | } 33 | 34 | const resultJson = await readTextFile(filePath) 35 | console.log(`[itos] Load ${filePath}`) 36 | return JSON.parse(resultJson) 37 | } 38 | 39 | export const saveTextFileInDataDir = async ( 40 | fileName: string, 41 | data: string 42 | ): Promise => { 43 | // If the data directory does not exist, recreate it. 44 | await createDataDir() 45 | 46 | const filePath = `${await appLocalDataDir()}data/${fileName}` 47 | try { 48 | await writeTextFile(filePath, data) 49 | console.log(`[itos] Save ${filePath}`) 50 | } catch (error) { 51 | console.error(error) 52 | } 53 | } 54 | 55 | export const deleteFileInDataDir = async (fileName: string): Promise => { 56 | const filePath = `${await appLocalDataDir()}data/${fileName}` 57 | try { 58 | await removeFile(filePath) 59 | console.log(`[itos] Delete ${filePath}`) 60 | } catch (error) { 61 | console.error(error) 62 | } 63 | } 64 | 65 | export const getDataDirPath = async (): Promise => { 66 | return `${await appLocalDataDir()}data/` 67 | } 68 | -------------------------------------------------------------------------------- /src/utils/theme.ts: -------------------------------------------------------------------------------- 1 | import { createTheme } from '@mui/material/styles' 2 | 3 | export const theme = (mode?: string) => 4 | createTheme({ 5 | //@ts-ignore 6 | palette: mode === 'light' ? lightTheme : darkTheme, 7 | }) 8 | 9 | export const lightTheme = { 10 | mode: 'light', 11 | background: { 12 | default: '#EFEFEF', 13 | paper: '#004488', 14 | }, 15 | text: { 16 | primary: '#EAEAEA', 17 | secondary: '#AAAAAA', 18 | }, 19 | timelineHeaderText: { 20 | primary: '#343434', 21 | secondary: '#AAAAAA', 22 | }, 23 | timelineText: { 24 | primary: '#343434', 25 | secondary: '#666666', 26 | }, 27 | timelinePreviewText: { 28 | primary: '#EAEAEA', 29 | }, 30 | timelineBorder: { 31 | primary: '#888888', 32 | }, 33 | icon: { 34 | primary: '#EAEAEA', 35 | secondary: '#008787', 36 | selection: '#1976d2', 37 | }, 38 | inputOutline: { 39 | primary: '#AAAAAA', 40 | }, 41 | } 42 | 43 | export const darkTheme = { 44 | mode: 'dark', 45 | background: { 46 | default: '#191925', 47 | paper: '#232334', 48 | }, 49 | text: { 50 | primary: '#EAEAEA', 51 | secondary: '#AAAAAA', 52 | }, 53 | timelineHeaderText: { 54 | primary: '#EAEAEA', 55 | secondary: '#AAAAAA', 56 | }, 57 | timelineText: { 58 | primary: '#EAEAEA', 59 | secondary: '#AAAAAA', 60 | }, 61 | timelinePreviewText: { 62 | primary: '#EAEAEA', 63 | }, 64 | timelineBorder: { 65 | primary: '#343434', 66 | }, 67 | icon: { 68 | primary: '#EAEAEA', 69 | secondary: '#008787', 70 | selection: '#42a5f5', 71 | }, 72 | inputOutline: { 73 | primary: '#AAAAAA', 74 | }, 75 | } 76 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | const mobile = 5 | process.env.TAURI_PLATFORM === "android" || 6 | process.env.TAURI_PLATFORM === "ios"; 7 | 8 | // https://vitejs.dev/config/ 9 | export default defineConfig(async () => ({ 10 | plugins: [react()], 11 | 12 | // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 13 | // prevent vite from obscuring rust errors 14 | clearScreen: false, 15 | // tauri expects a fixed port, fail if that port is not available 16 | server: { 17 | port: 1420, 18 | strictPort: true, 19 | }, 20 | // to make use of `TAURI_DEBUG` and other env variables 21 | // https://tauri.studio/v1/api/config#buildconfig.beforedevcommand 22 | envPrefix: ["VITE_", "TAURI_"], 23 | build: { 24 | // Tauri supports es2021 25 | target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13", 26 | // don't minify for debug builds 27 | minify: !process.env.TAURI_DEBUG ? "esbuild" : false, 28 | // produce sourcemaps for debug builds 29 | sourcemap: !!process.env.TAURI_DEBUG, 30 | }, 31 | })); 32 | --------------------------------------------------------------------------------