├── .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 | 
2 | 
3 | 
4 | 
5 |
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
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 | 
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 |
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 |
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 |
24 |
25 |
26 |
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 |
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 |
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 |
--------------------------------------------------------------------------------