Initial commit
Seto Elkahfi committed
Apr 11, 2026 at 07:18 UTC
89bf482368de345d2863e34e05ae76f5a10012ad
10 files changed
+4189
.github/workflows/ci.yml
new
+138
@@ -0,0 +1,138 @@
1
+name: CI
2
+
3
+on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ workflow_dispatch:
9
+
10
+permissions:
11
+ contents: read
12
+
13
+concurrency:
14
+ group: ci-${{ github.workflow }}-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+env:
18
+ CARGO_TERM_COLOR: always
19
+
20
+jobs:
21
+ fmt:
22
+ name: Format
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - name: Checkout
26
+ uses: actions/checkout@v4
27
+
28
+ - name: Install Rust toolchain
29
+ uses: dtolnay/rust-toolchain@stable
30
+ with:
31
+ components: rustfmt
32
+
33
+ - name: Cache cargo registry and build artifacts
34
+ uses: Swatinem/rust-cache@v2
35
+
36
+ - name: Check formatting
37
+ run: cargo fmt --all -- --check
38
+
39
+ clippy:
40
+ name: Clippy
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - name: Checkout
44
+ uses: actions/checkout@v4
45
+
46
+ - name: Install Rust toolchain
47
+ uses: dtolnay/rust-toolchain@stable
48
+ with:
49
+ components: clippy
50
+
51
+ - name: Cache cargo registry and build artifacts
52
+ uses: Swatinem/rust-cache@v2
53
+
54
+ - name: Lint
55
+ run: cargo clippy --all-targets --all-features -- -D warnings
56
+
57
+ test:
58
+ name: Test
59
+ runs-on: ubuntu-latest
60
+ steps:
61
+ - name: Checkout
62
+ uses: actions/checkout@v4
63
+
64
+ - name: Install Rust toolchain
65
+ uses: dtolnay/rust-toolchain@stable
66
+
67
+ - name: Cache cargo registry and build artifacts
68
+ uses: Swatinem/rust-cache@v2
69
+
70
+ - name: Run tests
71
+ run: cargo test --all-features --locked --verbose
72
+
73
+ check:
74
+ name: Cargo check
75
+ runs-on: ubuntu-latest
76
+ strategy:
77
+ fail-fast: false
78
+ matrix:
79
+ target:
80
+ - x86_64-unknown-linux-gnu
81
+ - x86_64-pc-windows-msvc
82
+ - x86_64-apple-darwin
83
+ steps:
84
+ - name: Checkout
85
+ uses: actions/checkout@v4
86
+
87
+ - name: Install Rust toolchain
88
+ uses: dtolnay/rust-toolchain@stable
89
+ with:
90
+ targets: ${{ matrix.target }}
91
+
92
+ - name: Cache cargo registry and build artifacts
93
+ uses: Swatinem/rust-cache@v2
94
+
95
+ - name: Cargo check
96
+ run: cargo check --locked --target ${{ matrix.target }}
97
+
98
+ build:
99
+ name: Build
100
+ runs-on: ubuntu-latest
101
+ strategy:
102
+ fail-fast: false
103
+ matrix:
104
+ target:
105
+ - x86_64-unknown-linux-gnu
106
+ steps:
107
+ - name: Checkout
108
+ uses: actions/checkout@v4
109
+
110
+ - name: Install Rust toolchain
111
+ uses: dtolnay/rust-toolchain@stable
112
+ with:
113
+ targets: ${{ matrix.target }}
114
+
115
+ - name: Cache cargo registry and build artifacts
116
+ uses: Swatinem/rust-cache@v2
117
+
118
+ - name: Build release binary
119
+ run: cargo build --release --locked --target ${{ matrix.target }}
120
+
121
+ ci:
122
+ name: CI status
123
+ runs-on: ubuntu-latest
124
+ needs:
125
+ - fmt
126
+ - clippy
127
+ - test
128
+ - check
129
+ - build
130
+ if: always()
131
+ steps:
132
+ - name: Verify required jobs succeeded
133
+ run: |
134
+ test "${{ needs.fmt.result }}" = "success"
135
+ test "${{ needs.clippy.result }}" = "success"
136
+ test "${{ needs.test.result }}" = "success"
137
+ test "${{ needs.check.result }}" = "success"
138
+ test "${{ needs.build.result }}" = "success"
.github/workflows/release-crates.yml
new
+116
@@ -0,0 +1,116 @@
1
+name: Release crates.io
2
+
3
+on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+
9
+permissions:
10
+ contents: read
11
+
12
+concurrency:
13
+ group: release-crates-${{ github.ref }}
14
+ cancel-in-progress: false
15
+
16
+env:
17
+ CARGO_TERM_COLOR: always
18
+
19
+jobs:
20
+ verify:
21
+ name: Verify release
22
+ runs-on: ubuntu-latest
23
+ outputs:
24
+ version: ${{ steps.package.outputs.version }}
25
+ tag: ${{ steps.tag.outputs.tag }}
26
+ steps:
27
+ - name: Checkout
28
+ uses: actions/checkout@v4
29
+
30
+ - name: Install Rust toolchain
31
+ uses: dtolnay/rust-toolchain@stable
32
+ with:
33
+ components: clippy, rustfmt
34
+
35
+ - name: Cache cargo registry and build artifacts
36
+ uses: Swatinem/rust-cache@v2
37
+
38
+ - name: Read package version
39
+ id: package
40
+ shell: bash
41
+ run: |
42
+ version="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n 1)"
43
+ if [ -z "$version" ]; then
44
+ echo "Failed to read package version from Cargo.toml" >&2
45
+ exit 1
46
+ fi
47
+ echo "version=$version" >> "$GITHUB_OUTPUT"
48
+
49
+ - name: Read git tag version
50
+ id: tag
51
+ shell: bash
52
+ run: |
53
+ ref="${GITHUB_REF_NAME}"
54
+ tag="${ref#v}"
55
+ echo "tag=$tag" >> "$GITHUB_OUTPUT"
56
+
57
+ - name: Ensure tag matches Cargo.toml version
58
+ if: github.event_name == 'push'
59
+ shell: bash
60
+ run: |
61
+ test "${{ steps.package.outputs.version }}" = "${{ steps.tag.outputs.tag }}"
62
+
63
+ - name: Check formatting
64
+ run: cargo fmt --all -- --check
65
+
66
+ - name: Run clippy
67
+ run: cargo clippy --all-targets --all-features -- -D warnings
68
+
69
+ - name: Run tests
70
+ run: cargo test --all-features --locked --verbose
71
+
72
+ - name: Run cargo check
73
+ run: cargo check --locked
74
+
75
+ - name: Verify package contents
76
+ run: cargo package --locked --allow-dirty
77
+
78
+ publish:
79
+ name: Publish to crates.io
80
+ runs-on: ubuntu-latest
81
+ needs: verify
82
+ environment:
83
+ name: crates-io
84
+ permissions:
85
+ contents: read
86
+ steps:
87
+ - name: Checkout
88
+ uses: actions/checkout@v4
89
+
90
+ - name: Install Rust toolchain
91
+ uses: dtolnay/rust-toolchain@stable
92
+
93
+ - name: Cache cargo registry and build artifacts
94
+ uses: Swatinem/rust-cache@v2
95
+
96
+ - name: Publish crate
97
+ env:
98
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
99
+ run: cargo publish --locked
100
+
101
+ github-release:
102
+ name: Create GitHub release
103
+ runs-on: ubuntu-latest
104
+ needs:
105
+ - verify
106
+ - publish
107
+ if: github.event_name == 'push'
108
+ permissions:
109
+ contents: write
110
+ steps:
111
+ - name: Create release
112
+ uses: softprops/action-gh-release@v2
113
+ with:
114
+ tag_name: v${{ needs.verify.outputs.version }}
115
+ generate_release_notes: true
116
+ name: onde-cli v${{ needs.verify.outputs.version }}
.gitignore
new
+1
@@ -0,0 +1 @@
1
+/target
Cargo.lock
new
+3035
@@ -0,0 +1,3035 @@
1
+# This file is automatically @generated by Cargo.
2
+# It is not intended for manual editing.
3
+version = 4
4
+
5
+[[package]]
6
+name = "aho-corasick"
7
+version = "1.1.4"
8
+source = "registry+https://github.com/rust-lang/crates.io-index"
9
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10
+dependencies = [
11
+ "memchr",
12
+]
13
+
14
+[[package]]
15
+name = "allocator-api2"
16
+version = "0.2.21"
17
+source = "registry+https://github.com/rust-lang/crates.io-index"
18
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
19
+
20
+[[package]]
21
+name = "android_system_properties"
22
+version = "0.1.5"
23
+source = "registry+https://github.com/rust-lang/crates.io-index"
24
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
25
+dependencies = [
26
+ "libc",
27
+]
28
+
29
+[[package]]
30
+name = "ansi_term"
31
+version = "0.12.1"
32
+source = "registry+https://github.com/rust-lang/crates.io-index"
33
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
34
+dependencies = [
35
+ "winapi",
36
+]
37
+
38
+[[package]]
39
+name = "anstream"
40
+version = "1.0.0"
41
+source = "registry+https://github.com/rust-lang/crates.io-index"
42
+checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
43
+dependencies = [
44
+ "anstyle",
45
+ "anstyle-parse",
46
+ "anstyle-query",
47
+ "anstyle-wincon",
48
+ "colorchoice",
49
+ "is_terminal_polyfill",
50
+ "utf8parse",
51
+]
52
+
53
+[[package]]
54
+name = "anstyle"
55
+version = "1.0.14"
56
+source = "registry+https://github.com/rust-lang/crates.io-index"
57
+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
58
+
59
+[[package]]
60
+name = "anstyle-parse"
61
+version = "1.0.0"
62
+source = "registry+https://github.com/rust-lang/crates.io-index"
63
+checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
64
+dependencies = [
65
+ "utf8parse",
66
+]
67
+
68
+[[package]]
69
+name = "anstyle-query"
70
+version = "1.1.5"
71
+source = "registry+https://github.com/rust-lang/crates.io-index"
72
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
73
+dependencies = [
74
+ "windows-sys 0.61.2",
75
+]
76
+
77
+[[package]]
78
+name = "anstyle-wincon"
79
+version = "3.0.11"
80
+source = "registry+https://github.com/rust-lang/crates.io-index"
81
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
82
+dependencies = [
83
+ "anstyle",
84
+ "once_cell_polyfill",
85
+ "windows-sys 0.61.2",
86
+]
87
+
88
+[[package]]
89
+name = "anyhow"
90
+version = "1.0.102"
91
+source = "registry+https://github.com/rust-lang/crates.io-index"
92
+checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
93
+
94
+[[package]]
95
+name = "atomic-waker"
96
+version = "1.1.2"
97
+source = "registry+https://github.com/rust-lang/crates.io-index"
98
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
99
+
100
+[[package]]
101
+name = "atty"
102
+version = "0.2.14"
103
+source = "registry+https://github.com/rust-lang/crates.io-index"
104
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
105
+dependencies = [
106
+ "hermit-abi",
107
+ "libc",
108
+ "winapi",
109
+]
110
+
111
+[[package]]
112
+name = "autocfg"
113
+version = "1.5.0"
114
+source = "registry+https://github.com/rust-lang/crates.io-index"
115
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
116
+
117
+[[package]]
118
+name = "base64"
119
+version = "0.22.1"
120
+source = "registry+https://github.com/rust-lang/crates.io-index"
121
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
122
+
123
+[[package]]
124
+name = "bitflags"
125
+version = "1.3.2"
126
+source = "registry+https://github.com/rust-lang/crates.io-index"
127
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
128
+
129
+[[package]]
130
+name = "bitflags"
131
+version = "2.11.0"
132
+source = "registry+https://github.com/rust-lang/crates.io-index"
133
+checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
134
+
135
+[[package]]
136
+name = "block-buffer"
137
+version = "0.10.4"
138
+source = "registry+https://github.com/rust-lang/crates.io-index"
139
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
140
+dependencies = [
141
+ "generic-array",
142
+]
143
+
144
+[[package]]
145
+name = "bumpalo"
146
+version = "3.20.2"
147
+source = "registry+https://github.com/rust-lang/crates.io-index"
148
+checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
149
+
150
+[[package]]
151
+name = "bytes"
152
+version = "1.11.1"
153
+source = "registry+https://github.com/rust-lang/crates.io-index"
154
+checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
155
+
156
+[[package]]
157
+name = "cassowary"
158
+version = "0.3.0"
159
+source = "registry+https://github.com/rust-lang/crates.io-index"
160
+checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
161
+
162
+[[package]]
163
+name = "castaway"
164
+version = "0.2.4"
165
+source = "registry+https://github.com/rust-lang/crates.io-index"
166
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
167
+dependencies = [
168
+ "rustversion",
169
+]
170
+
171
+[[package]]
172
+name = "cc"
173
+version = "1.2.60"
174
+source = "registry+https://github.com/rust-lang/crates.io-index"
175
+checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"
176
+dependencies = [
177
+ "find-msvc-tools",
178
+ "shlex",
179
+]
180
+
181
+[[package]]
182
+name = "cfg-if"
183
+version = "1.0.4"
184
+source = "registry+https://github.com/rust-lang/crates.io-index"
185
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
186
+
187
+[[package]]
188
+name = "cfg_aliases"
189
+version = "0.2.1"
190
+source = "registry+https://github.com/rust-lang/crates.io-index"
191
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
192
+
193
+[[package]]
194
+name = "chrono"
195
+version = "0.4.44"
196
+source = "registry+https://github.com/rust-lang/crates.io-index"
197
+checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
198
+dependencies = [
199
+ "iana-time-zone",
200
+ "js-sys",
201
+ "num-traits",
202
+ "serde",
203
+ "wasm-bindgen",
204
+ "windows-link",
205
+]
206
+
207
+[[package]]
208
+name = "clap"
209
+version = "2.34.0"
210
+source = "registry+https://github.com/rust-lang/crates.io-index"
211
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
212
+dependencies = [
213
+ "ansi_term",
214
+ "atty",
215
+ "bitflags 1.3.2",
216
+ "strsim 0.8.0",
217
+ "textwrap",
218
+ "unicode-width 0.1.14",
219
+ "vec_map",
220
+]
221
+
222
+[[package]]
223
+name = "clap"
224
+version = "4.6.0"
225
+source = "registry+https://github.com/rust-lang/crates.io-index"
226
+checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
227
+dependencies = [
228
+ "clap_builder",
229
+ "clap_derive",
230
+]
231
+
232
+[[package]]
233
+name = "clap_builder"
234
+version = "4.6.0"
235
+source = "registry+https://github.com/rust-lang/crates.io-index"
236
+checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
237
+dependencies = [
238
+ "anstream",
239
+ "anstyle",
240
+ "clap_lex",
241
+ "strsim 0.11.1",
242
+]
243
+
244
+[[package]]
245
+name = "clap_derive"
246
+version = "4.6.0"
247
+source = "registry+https://github.com/rust-lang/crates.io-index"
248
+checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
249
+dependencies = [
250
+ "heck 0.5.0",
251
+ "proc-macro2",
252
+ "quote",
253
+ "syn 2.0.117",
254
+]
255
+
256
+[[package]]
257
+name = "clap_lex"
258
+version = "1.1.0"
259
+source = "registry+https://github.com/rust-lang/crates.io-index"
260
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
261
+
262
+[[package]]
263
+name = "colorchoice"
264
+version = "1.0.5"
265
+source = "registry+https://github.com/rust-lang/crates.io-index"
266
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
267
+
268
+[[package]]
269
+name = "compact_str"
270
+version = "0.8.1"
271
+source = "registry+https://github.com/rust-lang/crates.io-index"
272
+checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
273
+dependencies = [
274
+ "castaway",
275
+ "cfg-if",
276
+ "itoa",
277
+ "rustversion",
278
+ "ryu",
279
+ "static_assertions",
280
+]
281
+
282
+[[package]]
283
+name = "convert_case"
284
+version = "0.6.0"
285
+source = "registry+https://github.com/rust-lang/crates.io-index"
286
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
287
+dependencies = [
288
+ "unicode-segmentation",
289
+]
290
+
291
+[[package]]
292
+name = "core-foundation"
293
+version = "0.10.1"
294
+source = "registry+https://github.com/rust-lang/crates.io-index"
295
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
296
+dependencies = [
297
+ "core-foundation-sys",
298
+ "libc",
299
+]
300
+
301
+[[package]]
302
+name = "core-foundation-sys"
303
+version = "0.8.7"
304
+source = "registry+https://github.com/rust-lang/crates.io-index"
305
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
306
+
307
+[[package]]
308
+name = "cpufeatures"
309
+version = "0.2.17"
310
+source = "registry+https://github.com/rust-lang/crates.io-index"
311
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
312
+dependencies = [
313
+ "libc",
314
+]
315
+
316
+[[package]]
317
+name = "crossterm"
318
+version = "0.28.1"
319
+source = "registry+https://github.com/rust-lang/crates.io-index"
320
+checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
321
+dependencies = [
322
+ "bitflags 2.11.0",
323
+ "crossterm_winapi",
324
+ "futures-core",
325
+ "mio",
326
+ "parking_lot",
327
+ "rustix",
328
+ "signal-hook",
329
+ "signal-hook-mio",
330
+ "winapi",
331
+]
332
+
333
+[[package]]
334
+name = "crossterm_winapi"
335
+version = "0.9.1"
336
+source = "registry+https://github.com/rust-lang/crates.io-index"
337
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
338
+dependencies = [
339
+ "winapi",
340
+]
341
+
342
+[[package]]
343
+name = "crypto-common"
344
+version = "0.1.7"
345
+source = "registry+https://github.com/rust-lang/crates.io-index"
346
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
347
+dependencies = [
348
+ "generic-array",
349
+ "typenum",
350
+]
351
+
352
+[[package]]
353
+name = "darling"
354
+version = "0.23.0"
355
+source = "registry+https://github.com/rust-lang/crates.io-index"
356
+checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
357
+dependencies = [
358
+ "darling_core",
359
+ "darling_macro",
360
+]
361
+
362
+[[package]]
363
+name = "darling_core"
364
+version = "0.23.0"
365
+source = "registry+https://github.com/rust-lang/crates.io-index"
366
+checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
367
+dependencies = [
368
+ "ident_case",
369
+ "proc-macro2",
370
+ "quote",
371
+ "strsim 0.11.1",
372
+ "syn 2.0.117",
373
+]
374
+
375
+[[package]]
376
+name = "darling_macro"
377
+version = "0.23.0"
378
+source = "registry+https://github.com/rust-lang/crates.io-index"
379
+checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
380
+dependencies = [
381
+ "darling_core",
382
+ "quote",
383
+ "syn 2.0.117",
384
+]
385
+
386
+[[package]]
387
+name = "digest"
388
+version = "0.10.7"
389
+source = "registry+https://github.com/rust-lang/crates.io-index"
390
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
391
+dependencies = [
392
+ "block-buffer",
393
+ "crypto-common",
394
+]
395
+
396
+[[package]]
397
+name = "dirs"
398
+version = "5.0.1"
399
+source = "registry+https://github.com/rust-lang/crates.io-index"
400
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
401
+dependencies = [
402
+ "dirs-sys",
403
+]
404
+
405
+[[package]]
406
+name = "dirs-sys"
407
+version = "0.4.1"
408
+source = "registry+https://github.com/rust-lang/crates.io-index"
409
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
410
+dependencies = [
411
+ "libc",
412
+ "option-ext",
413
+ "redox_users",
414
+ "windows-sys 0.48.0",
415
+]
416
+
417
+[[package]]
418
+name = "displaydoc"
419
+version = "0.2.5"
420
+source = "registry+https://github.com/rust-lang/crates.io-index"
421
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
422
+dependencies = [
423
+ "proc-macro2",
424
+ "quote",
425
+ "syn 2.0.117",
426
+]
427
+
428
+[[package]]
429
+name = "either"
430
+version = "1.15.0"
431
+source = "registry+https://github.com/rust-lang/crates.io-index"
432
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
433
+
434
+[[package]]
435
+name = "equivalent"
436
+version = "1.0.2"
437
+source = "registry+https://github.com/rust-lang/crates.io-index"
438
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
439
+
440
+[[package]]
441
+name = "errno"
442
+version = "0.3.14"
443
+source = "registry+https://github.com/rust-lang/crates.io-index"
444
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
445
+dependencies = [
446
+ "libc",
447
+ "windows-sys 0.61.2",
448
+]
449
+
450
+[[package]]
451
+name = "find-msvc-tools"
452
+version = "0.1.9"
453
+source = "registry+https://github.com/rust-lang/crates.io-index"
454
+checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
455
+
456
+[[package]]
457
+name = "foldhash"
458
+version = "0.1.5"
459
+source = "registry+https://github.com/rust-lang/crates.io-index"
460
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
461
+
462
+[[package]]
463
+name = "form_urlencoded"
464
+version = "1.2.2"
465
+source = "registry+https://github.com/rust-lang/crates.io-index"
466
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
467
+dependencies = [
468
+ "percent-encoding",
469
+]
470
+
471
+[[package]]
472
+name = "futures"
473
+version = "0.3.32"
474
+source = "registry+https://github.com/rust-lang/crates.io-index"
475
+checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
476
+dependencies = [
477
+ "futures-channel",
478
+ "futures-core",
479
+ "futures-executor",
480
+ "futures-io",
481
+ "futures-sink",
482
+ "futures-task",
483
+ "futures-util",
484
+]
485
+
486
+[[package]]
487
+name = "futures-channel"
488
+version = "0.3.32"
489
+source = "registry+https://github.com/rust-lang/crates.io-index"
490
+checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
491
+dependencies = [
492
+ "futures-core",
493
+ "futures-sink",
494
+]
495
+
496
+[[package]]
497
+name = "futures-core"
498
+version = "0.3.32"
499
+source = "registry+https://github.com/rust-lang/crates.io-index"
500
+checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
501
+
502
+[[package]]
503
+name = "futures-executor"
504
+version = "0.3.32"
505
+source = "registry+https://github.com/rust-lang/crates.io-index"
506
+checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
507
+dependencies = [
508
+ "futures-core",
509
+ "futures-task",
510
+ "futures-util",
511
+]
512
+
513
+[[package]]
514
+name = "futures-io"
515
+version = "0.3.32"
516
+source = "registry+https://github.com/rust-lang/crates.io-index"
517
+checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
518
+
519
+[[package]]
520
+name = "futures-macro"
521
+version = "0.3.32"
522
+source = "registry+https://github.com/rust-lang/crates.io-index"
523
+checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
524
+dependencies = [
525
+ "proc-macro2",
526
+ "quote",
527
+ "syn 2.0.117",
528
+]
529
+
530
+[[package]]
531
+name = "futures-sink"
532
+version = "0.3.32"
533
+source = "registry+https://github.com/rust-lang/crates.io-index"
534
+checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
535
+
536
+[[package]]
537
+name = "futures-task"
538
+version = "0.3.32"
539
+source = "registry+https://github.com/rust-lang/crates.io-index"
540
+checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
541
+
542
+[[package]]
543
+name = "futures-util"
544
+version = "0.3.32"
545
+source = "registry+https://github.com/rust-lang/crates.io-index"
546
+checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
547
+dependencies = [
548
+ "futures-channel",
549
+ "futures-core",
550
+ "futures-io",
551
+ "futures-macro",
552
+ "futures-sink",
553
+ "futures-task",
554
+ "memchr",
555
+ "pin-project-lite",
556
+ "slab",
557
+]
558
+
559
+[[package]]
560
+name = "generator"
561
+version = "0.7.5"
562
+source = "registry+https://github.com/rust-lang/crates.io-index"
563
+checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
564
+dependencies = [
565
+ "cc",
566
+ "libc",
567
+ "log",
568
+ "rustversion",
569
+ "windows",
570
+]
571
+
572
+[[package]]
573
+name = "generic-array"
574
+version = "0.14.7"
575
+source = "registry+https://github.com/rust-lang/crates.io-index"
576
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
577
+dependencies = [
578
+ "typenum",
579
+ "version_check",
580
+]
581
+
582
+[[package]]
583
+name = "getrandom"
584
+version = "0.2.17"
585
+source = "registry+https://github.com/rust-lang/crates.io-index"
586
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
587
+dependencies = [
588
+ "cfg-if",
589
+ "js-sys",
590
+ "libc",
591
+ "wasi",
592
+ "wasm-bindgen",
593
+]
594
+
595
+[[package]]
596
+name = "getrandom"
597
+version = "0.3.4"
598
+source = "registry+https://github.com/rust-lang/crates.io-index"
599
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
600
+dependencies = [
601
+ "cfg-if",
602
+ "js-sys",
603
+ "libc",
604
+ "r-efi 5.3.0",
605
+ "wasip2",
606
+ "wasm-bindgen",
607
+]
608
+
609
+[[package]]
610
+name = "getrandom"
611
+version = "0.4.2"
612
+source = "registry+https://github.com/rust-lang/crates.io-index"
613
+checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
614
+dependencies = [
615
+ "cfg-if",
616
+ "libc",
617
+ "r-efi 6.0.0",
618
+ "wasip2",
619
+ "wasip3",
620
+]
621
+
622
+[[package]]
623
+name = "hashbrown"
624
+version = "0.15.5"
625
+source = "registry+https://github.com/rust-lang/crates.io-index"
626
+checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
627
+dependencies = [
628
+ "allocator-api2",
629
+ "equivalent",
630
+ "foldhash",
631
+]
632
+
633
+[[package]]
634
+name = "hashbrown"
635
+version = "0.17.0"
636
+source = "registry+https://github.com/rust-lang/crates.io-index"
637
+checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
638
+
639
+[[package]]
640
+name = "heck"
641
+version = "0.3.3"
642
+source = "registry+https://github.com/rust-lang/crates.io-index"
643
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
644
+dependencies = [
645
+ "unicode-segmentation",
646
+]
647
+
648
+[[package]]
649
+name = "heck"
650
+version = "0.4.1"
651
+source = "registry+https://github.com/rust-lang/crates.io-index"
652
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
653
+
654
+[[package]]
655
+name = "heck"
656
+version = "0.5.0"
657
+source = "registry+https://github.com/rust-lang/crates.io-index"
658
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
659
+
660
+[[package]]
661
+name = "hermit-abi"
662
+version = "0.1.19"
663
+source = "registry+https://github.com/rust-lang/crates.io-index"
664
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
665
+dependencies = [
666
+ "libc",
667
+]
668
+
669
+[[package]]
670
+name = "http"
671
+version = "1.4.0"
672
+source = "registry+https://github.com/rust-lang/crates.io-index"
673
+checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
674
+dependencies = [
675
+ "bytes",
676
+ "itoa",
677
+]
678
+
679
+[[package]]
680
+name = "http-body"
681
+version = "1.0.1"
682
+source = "registry+https://github.com/rust-lang/crates.io-index"
683
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
684
+dependencies = [
685
+ "bytes",
686
+ "http",
687
+]
688
+
689
+[[package]]
690
+name = "http-body-util"
691
+version = "0.1.3"
692
+source = "registry+https://github.com/rust-lang/crates.io-index"
693
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
694
+dependencies = [
695
+ "bytes",
696
+ "futures-core",
697
+ "http",
698
+ "http-body",
699
+ "pin-project-lite",
700
+]
701
+
702
+[[package]]
703
+name = "httparse"
704
+version = "1.10.1"
705
+source = "registry+https://github.com/rust-lang/crates.io-index"
706
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
707
+
708
+[[package]]
709
+name = "hyper"
710
+version = "1.9.0"
711
+source = "registry+https://github.com/rust-lang/crates.io-index"
712
+checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
713
+dependencies = [
714
+ "atomic-waker",
715
+ "bytes",
716
+ "futures-channel",
717
+ "futures-core",
718
+ "http",
719
+ "http-body",
720
+ "httparse",
721
+ "itoa",
722
+ "pin-project-lite",
723
+ "smallvec",
724
+ "tokio",
725
+ "want",
726
+]
727
+
728
+[[package]]
729
+name = "hyper-rustls"
730
+version = "0.27.7"
731
+source = "registry+https://github.com/rust-lang/crates.io-index"
732
+checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
733
+dependencies = [
734
+ "http",
735
+ "hyper",
736
+ "hyper-util",
737
+ "rustls",
738
+ "rustls-native-certs",
739
+ "rustls-pki-types",
740
+ "tokio",
741
+ "tokio-rustls",
742
+ "tower-service",
743
+]
744
+
745
+[[package]]
746
+name = "hyper-util"
747
+version = "0.1.20"
748
+source = "registry+https://github.com/rust-lang/crates.io-index"
749
+checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
750
+dependencies = [
751
+ "base64",
752
+ "bytes",
753
+ "futures-channel",
754
+ "futures-util",
755
+ "http",
756
+ "http-body",
757
+ "hyper",
758
+ "ipnet",
759
+ "libc",
760
+ "percent-encoding",
761
+ "pin-project-lite",
762
+ "socket2",
763
+ "tokio",
764
+ "tower-service",
765
+ "tracing",
766
+]
767
+
768
+[[package]]
769
+name = "iana-time-zone"
770
+version = "0.1.65"
771
+source = "registry+https://github.com/rust-lang/crates.io-index"
772
+checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
773
+dependencies = [
774
+ "android_system_properties",
775
+ "core-foundation-sys",
776
+ "iana-time-zone-haiku",
777
+ "js-sys",
778
+ "log",
779
+ "wasm-bindgen",
780
+ "windows-core",
781
+]
782
+
783
+[[package]]
784
+name = "iana-time-zone-haiku"
785
+version = "0.1.2"
786
+source = "registry+https://github.com/rust-lang/crates.io-index"
787
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
788
+dependencies = [
789
+ "cc",
790
+]
791
+
792
+[[package]]
793
+name = "icu_collections"
794
+version = "2.2.0"
795
+source = "registry+https://github.com/rust-lang/crates.io-index"
796
+checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
797
+dependencies = [
798
+ "displaydoc",
799
+ "potential_utf",
800
+ "utf8_iter",
801
+ "yoke",
802
+ "zerofrom",
803
+ "zerovec",
804
+]
805
+
806
+[[package]]
807
+name = "icu_locale_core"
808
+version = "2.2.0"
809
+source = "registry+https://github.com/rust-lang/crates.io-index"
810
+checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
811
+dependencies = [
812
+ "displaydoc",
813
+ "litemap",
814
+ "tinystr",
815
+ "writeable",
816
+ "zerovec",
817
+]
818
+
819
+[[package]]
820
+name = "icu_normalizer"
821
+version = "2.2.0"
822
+source = "registry+https://github.com/rust-lang/crates.io-index"
823
+checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
824
+dependencies = [
825
+ "icu_collections",
826
+ "icu_normalizer_data",
827
+ "icu_properties",
828
+ "icu_provider",
829
+ "smallvec",
830
+ "zerovec",
831
+]
832
+
833
+[[package]]
834
+name = "icu_normalizer_data"
835
+version = "2.2.0"
836
+source = "registry+https://github.com/rust-lang/crates.io-index"
837
+checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
838
+
839
+[[package]]
840
+name = "icu_properties"
841
+version = "2.2.0"
842
+source = "registry+https://github.com/rust-lang/crates.io-index"
843
+checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
844
+dependencies = [
845
+ "icu_collections",
846
+ "icu_locale_core",
847
+ "icu_properties_data",
848
+ "icu_provider",
849
+ "zerotrie",
850
+ "zerovec",
851
+]
852
+
853
+[[package]]
854
+name = "icu_properties_data"
855
+version = "2.2.0"
856
+source = "registry+https://github.com/rust-lang/crates.io-index"
857
+checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
858
+
859
+[[package]]
860
+name = "icu_provider"
861
+version = "2.2.0"
862
+source = "registry+https://github.com/rust-lang/crates.io-index"
863
+checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
864
+dependencies = [
865
+ "displaydoc",
866
+ "icu_locale_core",
867
+ "writeable",
868
+ "yoke",
869
+ "zerofrom",
870
+ "zerotrie",
871
+ "zerovec",
872
+]
873
+
874
+[[package]]
875
+name = "id-arena"
876
+version = "2.3.0"
877
+source = "registry+https://github.com/rust-lang/crates.io-index"
878
+checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
879
+
880
+[[package]]
881
+name = "ident_case"
882
+version = "1.0.1"
883
+source = "registry+https://github.com/rust-lang/crates.io-index"
884
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
885
+
886
+[[package]]
887
+name = "idna"
888
+version = "1.1.0"
889
+source = "registry+https://github.com/rust-lang/crates.io-index"
890
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
891
+dependencies = [
892
+ "idna_adapter",
893
+ "smallvec",
894
+ "utf8_iter",
895
+]
896
+
897
+[[package]]
898
+name = "idna_adapter"
899
+version = "1.2.1"
900
+source = "registry+https://github.com/rust-lang/crates.io-index"
901
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
902
+dependencies = [
903
+ "icu_normalizer",
904
+ "icu_properties",
905
+]
906
+
907
+[[package]]
908
+name = "indexmap"
909
+version = "2.14.0"
910
+source = "registry+https://github.com/rust-lang/crates.io-index"
911
+checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
912
+dependencies = [
913
+ "equivalent",
914
+ "hashbrown 0.17.0",
915
+ "serde",
916
+ "serde_core",
917
+]
918
+
919
+[[package]]
920
+name = "indoc"
921
+version = "2.0.7"
922
+source = "registry+https://github.com/rust-lang/crates.io-index"
923
+checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
924
+dependencies = [
925
+ "rustversion",
926
+]
927
+
928
+[[package]]
929
+name = "instability"
930
+version = "0.3.12"
931
+source = "registry+https://github.com/rust-lang/crates.io-index"
932
+checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971"
933
+dependencies = [
934
+ "darling",
935
+ "indoc",
936
+ "proc-macro2",
937
+ "quote",
938
+ "syn 2.0.117",
939
+]
940
+
941
+[[package]]
942
+name = "ipnet"
943
+version = "2.12.0"
944
+source = "registry+https://github.com/rust-lang/crates.io-index"
945
+checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
946
+
947
+[[package]]
948
+name = "iri-string"
949
+version = "0.7.12"
950
+source = "registry+https://github.com/rust-lang/crates.io-index"
951
+checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20"
952
+dependencies = [
953
+ "memchr",
954
+ "serde",
955
+]
956
+
957
+[[package]]
958
+name = "is_terminal_polyfill"
959
+version = "1.70.2"
960
+source = "registry+https://github.com/rust-lang/crates.io-index"
961
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
962
+
963
+[[package]]
964
+name = "itertools"
965
+version = "0.13.0"
966
+source = "registry+https://github.com/rust-lang/crates.io-index"
967
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
968
+dependencies = [
969
+ "either",
970
+]
971
+
972
+[[package]]
973
+name = "itoa"
974
+version = "1.0.18"
975
+source = "registry+https://github.com/rust-lang/crates.io-index"
976
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
977
+
978
+[[package]]
979
+name = "js-sys"
980
+version = "0.3.95"
981
+source = "registry+https://github.com/rust-lang/crates.io-index"
982
+checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
983
+dependencies = [
984
+ "cfg-if",
985
+ "futures-util",
986
+ "once_cell",
987
+ "wasm-bindgen",
988
+]
989
+
990
+[[package]]
991
+name = "lazy_static"
992
+version = "1.5.0"
993
+source = "registry+https://github.com/rust-lang/crates.io-index"
994
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
995
+
996
+[[package]]
997
+name = "leb128fmt"
998
+version = "0.1.0"
999
+source = "registry+https://github.com/rust-lang/crates.io-index"
1000
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
1001
+
1002
+[[package]]
1003
+name = "libc"
1004
+version = "0.2.184"
1005
+source = "registry+https://github.com/rust-lang/crates.io-index"
1006
+checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
1007
+
1008
+[[package]]
1009
+name = "libredox"
1010
+version = "0.1.16"
1011
+source = "registry+https://github.com/rust-lang/crates.io-index"
1012
+checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c"
1013
+dependencies = [
1014
+ "libc",
1015
+]
1016
+
1017
+[[package]]
1018
+name = "linux-raw-sys"
1019
+version = "0.4.15"
1020
+source = "registry+https://github.com/rust-lang/crates.io-index"
1021
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1022
+
1023
+[[package]]
1024
+name = "litemap"
1025
+version = "0.8.2"
1026
+source = "registry+https://github.com/rust-lang/crates.io-index"
1027
+checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
1028
+
1029
+[[package]]
1030
+name = "lock_api"
1031
+version = "0.4.14"
1032
+source = "registry+https://github.com/rust-lang/crates.io-index"
1033
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1034
+dependencies = [
1035
+ "scopeguard",
1036
+]
1037
+
1038
+[[package]]
1039
+name = "log"
1040
+version = "0.4.29"
1041
+source = "registry+https://github.com/rust-lang/crates.io-index"
1042
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
1043
+
1044
+[[package]]
1045
+name = "loom"
1046
+version = "0.5.6"
1047
+source = "registry+https://github.com/rust-lang/crates.io-index"
1048
+checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
1049
+dependencies = [
1050
+ "cfg-if",
1051
+ "generator",
1052
+ "scoped-tls",
1053
+ "serde",
1054
+ "serde_json",
1055
+ "tracing",
1056
+ "tracing-subscriber",
1057
+]
1058
+
1059
+[[package]]
1060
+name = "lru"
1061
+version = "0.12.5"
1062
+source = "registry+https://github.com/rust-lang/crates.io-index"
1063
+checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
1064
+dependencies = [
1065
+ "hashbrown 0.15.5",
1066
+]
1067
+
1068
+[[package]]
1069
+name = "lru-slab"
1070
+version = "0.1.2"
1071
+source = "registry+https://github.com/rust-lang/crates.io-index"
1072
+checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
1073
+
1074
+[[package]]
1075
+name = "maplit"
1076
+version = "1.0.2"
1077
+source = "registry+https://github.com/rust-lang/crates.io-index"
1078
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
1079
+
1080
+[[package]]
1081
+name = "matchers"
1082
+version = "0.2.0"
1083
+source = "registry+https://github.com/rust-lang/crates.io-index"
1084
+checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
1085
+dependencies = [
1086
+ "regex-automata",
1087
+]
1088
+
1089
+[[package]]
1090
+name = "memchr"
1091
+version = "2.8.0"
1092
+source = "registry+https://github.com/rust-lang/crates.io-index"
1093
+checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
1094
+
1095
+[[package]]
1096
+name = "mio"
1097
+version = "1.2.0"
1098
+source = "registry+https://github.com/rust-lang/crates.io-index"
1099
+checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
1100
+dependencies = [
1101
+ "libc",
1102
+ "log",
1103
+ "wasi",
1104
+ "windows-sys 0.61.2",
1105
+]
1106
+
1107
+[[package]]
1108
+name = "nu-ansi-term"
1109
+version = "0.50.3"
1110
+source = "registry+https://github.com/rust-lang/crates.io-index"
1111
+checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
1112
+dependencies = [
1113
+ "windows-sys 0.61.2",
1114
+]
1115
+
1116
+[[package]]
1117
+name = "num-traits"
1118
+version = "0.2.19"
1119
+source = "registry+https://github.com/rust-lang/crates.io-index"
1120
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1121
+dependencies = [
1122
+ "autocfg",
1123
+]
1124
+
1125
+[[package]]
1126
+name = "once_cell"
1127
+version = "1.21.4"
1128
+source = "registry+https://github.com/rust-lang/crates.io-index"
1129
+checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
1130
+
1131
+[[package]]
1132
+name = "once_cell_polyfill"
1133
+version = "1.70.2"
1134
+source = "registry+https://github.com/rust-lang/crates.io-index"
1135
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
1136
+
1137
+[[package]]
1138
+name = "onde-cli"
1139
+version = "0.1.0"
1140
+dependencies = [
1141
+ "anyhow",
1142
+ "crossterm",
1143
+ "dirs",
1144
+ "futures",
1145
+ "libc",
1146
+ "log",
1147
+ "ratatui",
1148
+ "smbcloud-auth-sdk",
1149
+ "smbcloud-model",
1150
+ "smbcloud-network",
1151
+ "tokio",
1152
+]
1153
+
1154
+[[package]]
1155
+name = "openssl-probe"
1156
+version = "0.2.1"
1157
+source = "registry+https://github.com/rust-lang/crates.io-index"
1158
+checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
1159
+
1160
+[[package]]
1161
+name = "option-ext"
1162
+version = "0.2.0"
1163
+source = "registry+https://github.com/rust-lang/crates.io-index"
1164
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
1165
+
1166
+[[package]]
1167
+name = "parking_lot"
1168
+version = "0.12.5"
1169
+source = "registry+https://github.com/rust-lang/crates.io-index"
1170
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
1171
+dependencies = [
1172
+ "lock_api",
1173
+ "parking_lot_core",
1174
+]
1175
+
1176
+[[package]]
1177
+name = "parking_lot_core"
1178
+version = "0.9.12"
1179
+source = "registry+https://github.com/rust-lang/crates.io-index"
1180
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
1181
+dependencies = [
1182
+ "cfg-if",
1183
+ "libc",
1184
+ "redox_syscall",
1185
+ "smallvec",
1186
+ "windows-link",
1187
+]
1188
+
1189
+[[package]]
1190
+name = "paste"
1191
+version = "1.0.15"
1192
+source = "registry+https://github.com/rust-lang/crates.io-index"
1193
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
1194
+
1195
+[[package]]
1196
+name = "percent-encoding"
1197
+version = "2.3.2"
1198
+source = "registry+https://github.com/rust-lang/crates.io-index"
1199
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1200
+
1201
+[[package]]
1202
+name = "pin-project-lite"
1203
+version = "0.2.17"
1204
+source = "registry+https://github.com/rust-lang/crates.io-index"
1205
+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1206
+
1207
+[[package]]
1208
+name = "potential_utf"
1209
+version = "0.1.5"
1210
+source = "registry+https://github.com/rust-lang/crates.io-index"
1211
+checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
1212
+dependencies = [
1213
+ "zerovec",
1214
+]
1215
+
1216
+[[package]]
1217
+name = "ppv-lite86"
1218
+version = "0.2.21"
1219
+source = "registry+https://github.com/rust-lang/crates.io-index"
1220
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
1221
+dependencies = [
1222
+ "zerocopy",
1223
+]
1224
+
1225
+[[package]]
1226
+name = "prettyplease"
1227
+version = "0.2.37"
1228
+source = "registry+https://github.com/rust-lang/crates.io-index"
1229
+checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
1230
+dependencies = [
1231
+ "proc-macro2",
1232
+ "syn 2.0.117",
1233
+]
1234
+
1235
+[[package]]
1236
+name = "proc-macro-error"
1237
+version = "1.0.4"
1238
+source = "registry+https://github.com/rust-lang/crates.io-index"
1239
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
1240
+dependencies = [
1241
+ "proc-macro-error-attr",
1242
+ "proc-macro2",
1243
+ "quote",
1244
+ "syn 1.0.109",
1245
+ "version_check",
1246
+]
1247
+
1248
+[[package]]
1249
+name = "proc-macro-error-attr"
1250
+version = "1.0.4"
1251
+source = "registry+https://github.com/rust-lang/crates.io-index"
1252
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
1253
+dependencies = [
1254
+ "proc-macro2",
1255
+ "quote",
1256
+ "version_check",
1257
+]
1258
+
1259
+[[package]]
1260
+name = "proc-macro2"
1261
+version = "1.0.106"
1262
+source = "registry+https://github.com/rust-lang/crates.io-index"
1263
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
1264
+dependencies = [
1265
+ "unicode-ident",
1266
+]
1267
+
1268
+[[package]]
1269
+name = "quinn"
1270
+version = "0.11.9"
1271
+source = "registry+https://github.com/rust-lang/crates.io-index"
1272
+checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
1273
+dependencies = [
1274
+ "bytes",
1275
+ "cfg_aliases",
1276
+ "pin-project-lite",
1277
+ "quinn-proto",
1278
+ "quinn-udp",
1279
+ "rustc-hash",
1280
+ "rustls",
1281
+ "socket2",
1282
+ "thiserror 2.0.18",
1283
+ "tokio",
1284
+ "tracing",
1285
+ "web-time",
1286
+]
1287
+
1288
+[[package]]
1289
+name = "quinn-proto"
1290
+version = "0.11.14"
1291
+source = "registry+https://github.com/rust-lang/crates.io-index"
1292
+checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098"
1293
+dependencies = [
1294
+ "bytes",
1295
+ "getrandom 0.3.4",
1296
+ "lru-slab",
1297
+ "rand",
1298
+ "ring",
1299
+ "rustc-hash",
1300
+ "rustls",
1301
+ "rustls-pki-types",
1302
+ "slab",
1303
+ "thiserror 2.0.18",
1304
+ "tinyvec",
1305
+ "tracing",
1306
+ "web-time",
1307
+]
1308
+
1309
+[[package]]
1310
+name = "quinn-udp"
1311
+version = "0.5.14"
1312
+source = "registry+https://github.com/rust-lang/crates.io-index"
1313
+checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
1314
+dependencies = [
1315
+ "cfg_aliases",
1316
+ "libc",
1317
+ "once_cell",
1318
+ "socket2",
1319
+ "tracing",
1320
+ "windows-sys 0.60.2",
1321
+]
1322
+
1323
+[[package]]
1324
+name = "quote"
1325
+version = "1.0.45"
1326
+source = "registry+https://github.com/rust-lang/crates.io-index"
1327
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
1328
+dependencies = [
1329
+ "proc-macro2",
1330
+]
1331
+
1332
+[[package]]
1333
+name = "r-efi"
1334
+version = "5.3.0"
1335
+source = "registry+https://github.com/rust-lang/crates.io-index"
1336
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1337
+
1338
+[[package]]
1339
+name = "r-efi"
1340
+version = "6.0.0"
1341
+source = "registry+https://github.com/rust-lang/crates.io-index"
1342
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
1343
+
1344
+[[package]]
1345
+name = "rand"
1346
+version = "0.9.2"
1347
+source = "registry+https://github.com/rust-lang/crates.io-index"
1348
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
1349
+dependencies = [
1350
+ "rand_chacha",
1351
+ "rand_core",
1352
+]
1353
+
1354
+[[package]]
1355
+name = "rand_chacha"
1356
+version = "0.9.0"
1357
+source = "registry+https://github.com/rust-lang/crates.io-index"
1358
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
1359
+dependencies = [
1360
+ "ppv-lite86",
1361
+ "rand_core",
1362
+]
1363
+
1364
+[[package]]
1365
+name = "rand_core"
1366
+version = "0.9.5"
1367
+source = "registry+https://github.com/rust-lang/crates.io-index"
1368
+checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
1369
+dependencies = [
1370
+ "getrandom 0.3.4",
1371
+]
1372
+
1373
+[[package]]
1374
+name = "ratatui"
1375
+version = "0.29.0"
1376
+source = "registry+https://github.com/rust-lang/crates.io-index"
1377
+checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
1378
+dependencies = [
1379
+ "bitflags 2.11.0",
1380
+ "cassowary",
1381
+ "compact_str",
1382
+ "crossterm",
1383
+ "indoc",
1384
+ "instability",
1385
+ "itertools",
1386
+ "lru",
1387
+ "paste",
1388
+ "strum 0.26.3",
1389
+ "unicode-segmentation",
1390
+ "unicode-truncate",
1391
+ "unicode-width 0.2.0",
1392
+]
1393
+
1394
+[[package]]
1395
+name = "redox_syscall"
1396
+version = "0.5.18"
1397
+source = "registry+https://github.com/rust-lang/crates.io-index"
1398
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
1399
+dependencies = [
1400
+ "bitflags 2.11.0",
1401
+]
1402
+
1403
+[[package]]
1404
+name = "redox_users"
1405
+version = "0.4.6"
1406
+source = "registry+https://github.com/rust-lang/crates.io-index"
1407
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
1408
+dependencies = [
1409
+ "getrandom 0.2.17",
1410
+ "libredox",
1411
+ "thiserror 1.0.69",
1412
+]
1413
+
1414
+[[package]]
1415
+name = "regex-automata"
1416
+version = "0.4.14"
1417
+source = "registry+https://github.com/rust-lang/crates.io-index"
1418
+checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
1419
+dependencies = [
1420
+ "aho-corasick",
1421
+ "memchr",
1422
+ "regex-syntax",
1423
+]
1424
+
1425
+[[package]]
1426
+name = "regex-syntax"
1427
+version = "0.8.10"
1428
+source = "registry+https://github.com/rust-lang/crates.io-index"
1429
+checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
1430
+
1431
+[[package]]
1432
+name = "reqwest"
1433
+version = "0.12.28"
1434
+source = "registry+https://github.com/rust-lang/crates.io-index"
1435
+checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
1436
+dependencies = [
1437
+ "base64",
1438
+ "bytes",
1439
+ "futures-core",
1440
+ "http",
1441
+ "http-body",
1442
+ "http-body-util",
1443
+ "hyper",
1444
+ "hyper-rustls",
1445
+ "hyper-util",
1446
+ "js-sys",
1447
+ "log",
1448
+ "percent-encoding",
1449
+ "pin-project-lite",
1450
+ "quinn",
1451
+ "rustls",
1452
+ "rustls-native-certs",
1453
+ "rustls-pki-types",
1454
+ "serde",
1455
+ "serde_json",
1456
+ "serde_urlencoded",
1457
+ "sync_wrapper",
1458
+ "tokio",
1459
+ "tokio-rustls",
1460
+ "tower",
1461
+ "tower-http",
1462
+ "tower-service",
1463
+ "url",
1464
+ "wasm-bindgen",
1465
+ "wasm-bindgen-futures",
1466
+ "web-sys",
1467
+]
1468
+
1469
+[[package]]
1470
+name = "ring"
1471
+version = "0.17.14"
1472
+source = "registry+https://github.com/rust-lang/crates.io-index"
1473
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1474
+dependencies = [
1475
+ "cc",
1476
+ "cfg-if",
1477
+ "getrandom 0.2.17",
1478
+ "libc",
1479
+ "untrusted",
1480
+ "windows-sys 0.52.0",
1481
+]
1482
+
1483
+[[package]]
1484
+name = "rustc-hash"
1485
+version = "2.1.2"
1486
+source = "registry+https://github.com/rust-lang/crates.io-index"
1487
+checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
1488
+
1489
+[[package]]
1490
+name = "rustix"
1491
+version = "0.38.44"
1492
+source = "registry+https://github.com/rust-lang/crates.io-index"
1493
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
1494
+dependencies = [
1495
+ "bitflags 2.11.0",
1496
+ "errno",
1497
+ "libc",
1498
+ "linux-raw-sys",
1499
+ "windows-sys 0.59.0",
1500
+]
1501
+
1502
+[[package]]
1503
+name = "rustls"
1504
+version = "0.23.37"
1505
+source = "registry+https://github.com/rust-lang/crates.io-index"
1506
+checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4"
1507
+dependencies = [
1508
+ "once_cell",
1509
+ "ring",
1510
+ "rustls-pki-types",
1511
+ "rustls-webpki",
1512
+ "subtle",
1513
+ "zeroize",
1514
+]
1515
+
1516
+[[package]]
1517
+name = "rustls-native-certs"
1518
+version = "0.8.3"
1519
+source = "registry+https://github.com/rust-lang/crates.io-index"
1520
+checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
1521
+dependencies = [
1522
+ "openssl-probe",
1523
+ "rustls-pki-types",
1524
+ "schannel",
1525
+ "security-framework",
1526
+]
1527
+
1528
+[[package]]
1529
+name = "rustls-pki-types"
1530
+version = "1.14.0"
1531
+source = "registry+https://github.com/rust-lang/crates.io-index"
1532
+checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
1533
+dependencies = [
1534
+ "web-time",
1535
+ "zeroize",
1536
+]
1537
+
1538
+[[package]]
1539
+name = "rustls-webpki"
1540
+version = "0.103.11"
1541
+source = "registry+https://github.com/rust-lang/crates.io-index"
1542
+checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4"
1543
+dependencies = [
1544
+ "ring",
1545
+ "rustls-pki-types",
1546
+ "untrusted",
1547
+]
1548
+
1549
+[[package]]
1550
+name = "rustversion"
1551
+version = "1.0.22"
1552
+source = "registry+https://github.com/rust-lang/crates.io-index"
1553
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1554
+
1555
+[[package]]
1556
+name = "ryu"
1557
+version = "1.0.23"
1558
+source = "registry+https://github.com/rust-lang/crates.io-index"
1559
+checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
1560
+
1561
+[[package]]
1562
+name = "same-file"
1563
+version = "1.0.6"
1564
+source = "registry+https://github.com/rust-lang/crates.io-index"
1565
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
1566
+dependencies = [
1567
+ "winapi-util",
1568
+]
1569
+
1570
+[[package]]
1571
+name = "schannel"
1572
+version = "0.1.29"
1573
+source = "registry+https://github.com/rust-lang/crates.io-index"
1574
+checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939"
1575
+dependencies = [
1576
+ "windows-sys 0.61.2",
1577
+]
1578
+
1579
+[[package]]
1580
+name = "scoped-tls"
1581
+version = "1.0.1"
1582
+source = "registry+https://github.com/rust-lang/crates.io-index"
1583
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
1584
+
1585
+[[package]]
1586
+name = "scopeguard"
1587
+version = "1.2.0"
1588
+source = "registry+https://github.com/rust-lang/crates.io-index"
1589
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1590
+
1591
+[[package]]
1592
+name = "security-framework"
1593
+version = "3.7.0"
1594
+source = "registry+https://github.com/rust-lang/crates.io-index"
1595
+checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
1596
+dependencies = [
1597
+ "bitflags 2.11.0",
1598
+ "core-foundation",
1599
+ "core-foundation-sys",
1600
+ "libc",
1601
+ "security-framework-sys",
1602
+]
1603
+
1604
+[[package]]
1605
+name = "security-framework-sys"
1606
+version = "2.17.0"
1607
+source = "registry+https://github.com/rust-lang/crates.io-index"
1608
+checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
1609
+dependencies = [
1610
+ "core-foundation-sys",
1611
+ "libc",
1612
+]
1613
+
1614
+[[package]]
1615
+name = "semver"
1616
+version = "1.0.28"
1617
+source = "registry+https://github.com/rust-lang/crates.io-index"
1618
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
1619
+
1620
+[[package]]
1621
+name = "serde"
1622
+version = "1.0.228"
1623
+source = "registry+https://github.com/rust-lang/crates.io-index"
1624
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
1625
+dependencies = [
1626
+ "serde_core",
1627
+ "serde_derive",
1628
+]
1629
+
1630
+[[package]]
1631
+name = "serde_core"
1632
+version = "1.0.228"
1633
+source = "registry+https://github.com/rust-lang/crates.io-index"
1634
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
1635
+dependencies = [
1636
+ "serde_derive",
1637
+]
1638
+
1639
+[[package]]
1640
+name = "serde_derive"
1641
+version = "1.0.228"
1642
+source = "registry+https://github.com/rust-lang/crates.io-index"
1643
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
1644
+dependencies = [
1645
+ "proc-macro2",
1646
+ "quote",
1647
+ "syn 2.0.117",
1648
+]
1649
+
1650
+[[package]]
1651
+name = "serde_json"
1652
+version = "1.0.149"
1653
+source = "registry+https://github.com/rust-lang/crates.io-index"
1654
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
1655
+dependencies = [
1656
+ "itoa",
1657
+ "memchr",
1658
+ "serde",
1659
+ "serde_core",
1660
+ "zmij",
1661
+]
1662
+
1663
+[[package]]
1664
+name = "serde_repr"
1665
+version = "0.1.20"
1666
+source = "registry+https://github.com/rust-lang/crates.io-index"
1667
+checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
1668
+dependencies = [
1669
+ "proc-macro2",
1670
+ "quote",
1671
+ "syn 2.0.117",
1672
+]
1673
+
1674
+[[package]]
1675
+name = "serde_urlencoded"
1676
+version = "0.7.1"
1677
+source = "registry+https://github.com/rust-lang/crates.io-index"
1678
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1679
+dependencies = [
1680
+ "form_urlencoded",
1681
+ "itoa",
1682
+ "ryu",
1683
+ "serde",
1684
+]
1685
+
1686
+[[package]]
1687
+name = "sha2"
1688
+version = "0.10.9"
1689
+source = "registry+https://github.com/rust-lang/crates.io-index"
1690
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
1691
+dependencies = [
1692
+ "cfg-if",
1693
+ "cpufeatures",
1694
+ "digest",
1695
+]
1696
+
1697
+[[package]]
1698
+name = "sharded-slab"
1699
+version = "0.1.7"
1700
+source = "registry+https://github.com/rust-lang/crates.io-index"
1701
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1702
+dependencies = [
1703
+ "lazy_static",
1704
+]
1705
+
1706
+[[package]]
1707
+name = "shlex"
1708
+version = "1.3.0"
1709
+source = "registry+https://github.com/rust-lang/crates.io-index"
1710
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1711
+
1712
+[[package]]
1713
+name = "signal-hook"
1714
+version = "0.3.18"
1715
+source = "registry+https://github.com/rust-lang/crates.io-index"
1716
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
1717
+dependencies = [
1718
+ "libc",
1719
+ "signal-hook-registry",
1720
+]
1721
+
1722
+[[package]]
1723
+name = "signal-hook-mio"
1724
+version = "0.2.5"
1725
+source = "registry+https://github.com/rust-lang/crates.io-index"
1726
+checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
1727
+dependencies = [
1728
+ "libc",
1729
+ "mio",
1730
+ "signal-hook",
1731
+]
1732
+
1733
+[[package]]
1734
+name = "signal-hook-registry"
1735
+version = "1.4.8"
1736
+source = "registry+https://github.com/rust-lang/crates.io-index"
1737
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
1738
+dependencies = [
1739
+ "errno",
1740
+ "libc",
1741
+]
1742
+
1743
+[[package]]
1744
+name = "slab"
1745
+version = "0.4.12"
1746
+source = "registry+https://github.com/rust-lang/crates.io-index"
1747
+checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
1748
+
1749
+[[package]]
1750
+name = "smallvec"
1751
+version = "1.15.1"
1752
+source = "registry+https://github.com/rust-lang/crates.io-index"
1753
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1754
+
1755
+[[package]]
1756
+name = "smbcloud-auth-sdk"
1757
+version = "0.3.34"
1758
+dependencies = [
1759
+ "base64",
1760
+ "reqwest",
1761
+ "serde",
1762
+ "serde_json",
1763
+ "sha2",
1764
+ "smbcloud-model",
1765
+ "smbcloud-network",
1766
+ "url-builder",
1767
+ "uuid",
1768
+]
1769
+
1770
+[[package]]
1771
+name = "smbcloud-model"
1772
+version = "0.3.35"
1773
+dependencies = [
1774
+ "chrono",
1775
+ "log",
1776
+ "serde",
1777
+ "serde_json",
1778
+ "serde_repr",
1779
+ "spinners",
1780
+ "strum 0.27.2",
1781
+ "strum_macros 0.27.2",
1782
+ "thiserror 2.0.18",
1783
+ "tsync",
1784
+]
1785
+
1786
+[[package]]
1787
+name = "smbcloud-network"
1788
+version = "0.3.35"
1789
+dependencies = [
1790
+ "clap 4.6.0",
1791
+ "log",
1792
+ "reqwest",
1793
+ "serde",
1794
+ "serde_json",
1795
+ "smbcloud-model",
1796
+ "wasm-bindgen",
1797
+]
1798
+
1799
+[[package]]
1800
+name = "socket2"
1801
+version = "0.6.3"
1802
+source = "registry+https://github.com/rust-lang/crates.io-index"
1803
+checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
1804
+dependencies = [
1805
+ "libc",
1806
+ "windows-sys 0.61.2",
1807
+]
1808
+
1809
+[[package]]
1810
+name = "spinners"
1811
+version = "4.2.0"
1812
+source = "registry+https://github.com/rust-lang/crates.io-index"
1813
+checksum = "071af1a9d34b78b8db3ca4424b0ea4d87052d607dbe96287aebaccd596cabc86"
1814
+dependencies = [
1815
+ "lazy_static",
1816
+ "maplit",
1817
+ "strum 0.24.1",
1818
+]
1819
+
1820
+[[package]]
1821
+name = "stable_deref_trait"
1822
+version = "1.2.1"
1823
+source = "registry+https://github.com/rust-lang/crates.io-index"
1824
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
1825
+
1826
+[[package]]
1827
+name = "state"
1828
+version = "0.6.0"
1829
+source = "registry+https://github.com/rust-lang/crates.io-index"
1830
+checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
1831
+dependencies = [
1832
+ "loom",
1833
+]
1834
+
1835
+[[package]]
1836
+name = "static_assertions"
1837
+version = "1.1.0"
1838
+source = "registry+https://github.com/rust-lang/crates.io-index"
1839
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
1840
+
1841
+[[package]]
1842
+name = "strsim"
1843
+version = "0.8.0"
1844
+source = "registry+https://github.com/rust-lang/crates.io-index"
1845
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1846
+
1847
+[[package]]
1848
+name = "strsim"
1849
+version = "0.11.1"
1850
+source = "registry+https://github.com/rust-lang/crates.io-index"
1851
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1852
+
1853
+[[package]]
1854
+name = "structopt"
1855
+version = "0.3.26"
1856
+source = "registry+https://github.com/rust-lang/crates.io-index"
1857
+checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10"
1858
+dependencies = [
1859
+ "clap 2.34.0",
1860
+ "lazy_static",
1861
+ "structopt-derive",
1862
+]
1863
+
1864
+[[package]]
1865
+name = "structopt-derive"
1866
+version = "0.4.18"
1867
+source = "registry+https://github.com/rust-lang/crates.io-index"
1868
+checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0"
1869
+dependencies = [
1870
+ "heck 0.3.3",
1871
+ "proc-macro-error",
1872
+ "proc-macro2",
1873
+ "quote",
1874
+ "syn 1.0.109",
1875
+]
1876
+
1877
+[[package]]
1878
+name = "strum"
1879
+version = "0.24.1"
1880
+source = "registry+https://github.com/rust-lang/crates.io-index"
1881
+checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
1882
+dependencies = [
1883
+ "strum_macros 0.24.3",
1884
+]
1885
+
1886
+[[package]]
1887
+name = "strum"
1888
+version = "0.26.3"
1889
+source = "registry+https://github.com/rust-lang/crates.io-index"
1890
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
1891
+dependencies = [
1892
+ "strum_macros 0.26.4",
1893
+]
1894
+
1895
+[[package]]
1896
+name = "strum"
1897
+version = "0.27.2"
1898
+source = "registry+https://github.com/rust-lang/crates.io-index"
1899
+checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
1900
+
1901
+[[package]]
1902
+name = "strum_macros"
1903
+version = "0.24.3"
1904
+source = "registry+https://github.com/rust-lang/crates.io-index"
1905
+checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
1906
+dependencies = [
1907
+ "heck 0.4.1",
1908
+ "proc-macro2",
1909
+ "quote",
1910
+ "rustversion",
1911
+ "syn 1.0.109",
1912
+]
1913
+
1914
+[[package]]
1915
+name = "strum_macros"
1916
+version = "0.26.4"
1917
+source = "registry+https://github.com/rust-lang/crates.io-index"
1918
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
1919
+dependencies = [
1920
+ "heck 0.5.0",
1921
+ "proc-macro2",
1922
+ "quote",
1923
+ "rustversion",
1924
+ "syn 2.0.117",
1925
+]
1926
+
1927
+[[package]]
1928
+name = "strum_macros"
1929
+version = "0.27.2"
1930
+source = "registry+https://github.com/rust-lang/crates.io-index"
1931
+checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
1932
+dependencies = [
1933
+ "heck 0.5.0",
1934
+ "proc-macro2",
1935
+ "quote",
1936
+ "syn 2.0.117",
1937
+]
1938
+
1939
+[[package]]
1940
+name = "subtle"
1941
+version = "2.6.1"
1942
+source = "registry+https://github.com/rust-lang/crates.io-index"
1943
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1944
+
1945
+[[package]]
1946
+name = "syn"
1947
+version = "1.0.109"
1948
+source = "registry+https://github.com/rust-lang/crates.io-index"
1949
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
1950
+dependencies = [
1951
+ "proc-macro2",
1952
+ "quote",
1953
+ "unicode-ident",
1954
+]
1955
+
1956
+[[package]]
1957
+name = "syn"
1958
+version = "2.0.117"
1959
+source = "registry+https://github.com/rust-lang/crates.io-index"
1960
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
1961
+dependencies = [
1962
+ "proc-macro2",
1963
+ "quote",
1964
+ "unicode-ident",
1965
+]
1966
+
1967
+[[package]]
1968
+name = "sync_wrapper"
1969
+version = "1.0.2"
1970
+source = "registry+https://github.com/rust-lang/crates.io-index"
1971
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1972
+dependencies = [
1973
+ "futures-core",
1974
+]
1975
+
1976
+[[package]]
1977
+name = "synstructure"
1978
+version = "0.13.2"
1979
+source = "registry+https://github.com/rust-lang/crates.io-index"
1980
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
1981
+dependencies = [
1982
+ "proc-macro2",
1983
+ "quote",
1984
+ "syn 2.0.117",
1985
+]
1986
+
1987
+[[package]]
1988
+name = "textwrap"
1989
+version = "0.11.0"
1990
+source = "registry+https://github.com/rust-lang/crates.io-index"
1991
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1992
+dependencies = [
1993
+ "unicode-width 0.1.14",
1994
+]
1995
+
1996
+[[package]]
1997
+name = "thiserror"
1998
+version = "1.0.69"
1999
+source = "registry+https://github.com/rust-lang/crates.io-index"
2000
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
2001
+dependencies = [
2002
+ "thiserror-impl 1.0.69",
2003
+]
2004
+
2005
+[[package]]
2006
+name = "thiserror"
2007
+version = "2.0.18"
2008
+source = "registry+https://github.com/rust-lang/crates.io-index"
2009
+checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
2010
+dependencies = [
2011
+ "thiserror-impl 2.0.18",
2012
+]
2013
+
2014
+[[package]]
2015
+name = "thiserror-impl"
2016
+version = "1.0.69"
2017
+source = "registry+https://github.com/rust-lang/crates.io-index"
2018
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2019
+dependencies = [
2020
+ "proc-macro2",
2021
+ "quote",
2022
+ "syn 2.0.117",
2023
+]
2024
+
2025
+[[package]]
2026
+name = "thiserror-impl"
2027
+version = "2.0.18"
2028
+source = "registry+https://github.com/rust-lang/crates.io-index"
2029
+checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
2030
+dependencies = [
2031
+ "proc-macro2",
2032
+ "quote",
2033
+ "syn 2.0.117",
2034
+]
2035
+
2036
+[[package]]
2037
+name = "thread_local"
2038
+version = "1.1.9"
2039
+source = "registry+https://github.com/rust-lang/crates.io-index"
2040
+checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
2041
+dependencies = [
2042
+ "cfg-if",
2043
+]
2044
+
2045
+[[package]]
2046
+name = "tinystr"
2047
+version = "0.8.3"
2048
+source = "registry+https://github.com/rust-lang/crates.io-index"
2049
+checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
2050
+dependencies = [
2051
+ "displaydoc",
2052
+ "zerovec",
2053
+]
2054
+
2055
+[[package]]
2056
+name = "tinyvec"
2057
+version = "1.11.0"
2058
+source = "registry+https://github.com/rust-lang/crates.io-index"
2059
+checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
2060
+dependencies = [
2061
+ "tinyvec_macros",
2062
+]
2063
+
2064
+[[package]]
2065
+name = "tinyvec_macros"
2066
+version = "0.1.1"
2067
+source = "registry+https://github.com/rust-lang/crates.io-index"
2068
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2069
+
2070
+[[package]]
2071
+name = "tokio"
2072
+version = "1.51.1"
2073
+source = "registry+https://github.com/rust-lang/crates.io-index"
2074
+checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c"
2075
+dependencies = [
2076
+ "bytes",
2077
+ "libc",
2078
+ "mio",
2079
+ "pin-project-lite",
2080
+ "socket2",
2081
+ "tokio-macros",
2082
+ "windows-sys 0.61.2",
2083
+]
2084
+
2085
+[[package]]
2086
+name = "tokio-macros"
2087
+version = "2.7.0"
2088
+source = "registry+https://github.com/rust-lang/crates.io-index"
2089
+checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
2090
+dependencies = [
2091
+ "proc-macro2",
2092
+ "quote",
2093
+ "syn 2.0.117",
2094
+]
2095
+
2096
+[[package]]
2097
+name = "tokio-rustls"
2098
+version = "0.26.4"
2099
+source = "registry+https://github.com/rust-lang/crates.io-index"
2100
+checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
2101
+dependencies = [
2102
+ "rustls",
2103
+ "tokio",
2104
+]
2105
+
2106
+[[package]]
2107
+name = "tower"
2108
+version = "0.5.3"
2109
+source = "registry+https://github.com/rust-lang/crates.io-index"
2110
+checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
2111
+dependencies = [
2112
+ "futures-core",
2113
+ "futures-util",
2114
+ "pin-project-lite",
2115
+ "sync_wrapper",
2116
+ "tokio",
2117
+ "tower-layer",
2118
+ "tower-service",
2119
+]
2120
+
2121
+[[package]]
2122
+name = "tower-http"
2123
+version = "0.6.8"
2124
+source = "registry+https://github.com/rust-lang/crates.io-index"
2125
+checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
2126
+dependencies = [
2127
+ "bitflags 2.11.0",
2128
+ "bytes",
2129
+ "futures-util",
2130
+ "http",
2131
+ "http-body",
2132
+ "iri-string",
2133
+ "pin-project-lite",
2134
+ "tower",
2135
+ "tower-layer",
2136
+ "tower-service",
2137
+]
2138
+
2139
+[[package]]
2140
+name = "tower-layer"
2141
+version = "0.3.3"
2142
+source = "registry+https://github.com/rust-lang/crates.io-index"
2143
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
2144
+
2145
+[[package]]
2146
+name = "tower-service"
2147
+version = "0.3.3"
2148
+source = "registry+https://github.com/rust-lang/crates.io-index"
2149
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
2150
+
2151
+[[package]]
2152
+name = "tracing"
2153
+version = "0.1.44"
2154
+source = "registry+https://github.com/rust-lang/crates.io-index"
2155
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
2156
+dependencies = [
2157
+ "pin-project-lite",
2158
+ "tracing-attributes",
2159
+ "tracing-core",
2160
+]
2161
+
2162
+[[package]]
2163
+name = "tracing-attributes"
2164
+version = "0.1.31"
2165
+source = "registry+https://github.com/rust-lang/crates.io-index"
2166
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
2167
+dependencies = [
2168
+ "proc-macro2",
2169
+ "quote",
2170
+ "syn 2.0.117",
2171
+]
2172
+
2173
+[[package]]
2174
+name = "tracing-core"
2175
+version = "0.1.36"
2176
+source = "registry+https://github.com/rust-lang/crates.io-index"
2177
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
2178
+dependencies = [
2179
+ "once_cell",
2180
+ "valuable",
2181
+]
2182
+
2183
+[[package]]
2184
+name = "tracing-log"
2185
+version = "0.2.0"
2186
+source = "registry+https://github.com/rust-lang/crates.io-index"
2187
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
2188
+dependencies = [
2189
+ "log",
2190
+ "once_cell",
2191
+ "tracing-core",
2192
+]
2193
+
2194
+[[package]]
2195
+name = "tracing-subscriber"
2196
+version = "0.3.23"
2197
+source = "registry+https://github.com/rust-lang/crates.io-index"
2198
+checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
2199
+dependencies = [
2200
+ "matchers",
2201
+ "nu-ansi-term",
2202
+ "once_cell",
2203
+ "regex-automata",
2204
+ "sharded-slab",
2205
+ "smallvec",
2206
+ "thread_local",
2207
+ "tracing",
2208
+ "tracing-core",
2209
+ "tracing-log",
2210
+]
2211
+
2212
+[[package]]
2213
+name = "try-lock"
2214
+version = "0.2.5"
2215
+source = "registry+https://github.com/rust-lang/crates.io-index"
2216
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2217
+
2218
+[[package]]
2219
+name = "tsync"
2220
+version = "2.2.1"
2221
+source = "registry+https://github.com/rust-lang/crates.io-index"
2222
+checksum = "4fc20a25899c5ae43735253244214f3d5eb75dd28d9cc8491732294a985adb8c"
2223
+dependencies = [
2224
+ "convert_case",
2225
+ "proc-macro2",
2226
+ "quote",
2227
+ "state",
2228
+ "structopt",
2229
+ "syn 2.0.117",
2230
+ "tsync-macro",
2231
+ "walkdir",
2232
+]
2233
+
2234
+[[package]]
2235
+name = "tsync-macro"
2236
+version = "0.1.0"
2237
+source = "registry+https://github.com/rust-lang/crates.io-index"
2238
+checksum = "8acc9e35a3072d9ea375093f321b3738ea3ac4fdebc18d2789b01581e5c2e4ae"
2239
+
2240
+[[package]]
2241
+name = "typenum"
2242
+version = "1.19.0"
2243
+source = "registry+https://github.com/rust-lang/crates.io-index"
2244
+checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
2245
+
2246
+[[package]]
2247
+name = "unicode-ident"
2248
+version = "1.0.24"
2249
+source = "registry+https://github.com/rust-lang/crates.io-index"
2250
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
2251
+
2252
+[[package]]
2253
+name = "unicode-segmentation"
2254
+version = "1.13.2"
2255
+source = "registry+https://github.com/rust-lang/crates.io-index"
2256
+checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
2257
+
2258
+[[package]]
2259
+name = "unicode-truncate"
2260
+version = "1.1.0"
2261
+source = "registry+https://github.com/rust-lang/crates.io-index"
2262
+checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
2263
+dependencies = [
2264
+ "itertools",
2265
+ "unicode-segmentation",
2266
+ "unicode-width 0.1.14",
2267
+]
2268
+
2269
+[[package]]
2270
+name = "unicode-width"
2271
+version = "0.1.14"
2272
+source = "registry+https://github.com/rust-lang/crates.io-index"
2273
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
2274
+
2275
+[[package]]
2276
+name = "unicode-width"
2277
+version = "0.2.0"
2278
+source = "registry+https://github.com/rust-lang/crates.io-index"
2279
+checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
2280
+
2281
+[[package]]
2282
+name = "unicode-xid"
2283
+version = "0.2.6"
2284
+source = "registry+https://github.com/rust-lang/crates.io-index"
2285
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
2286
+
2287
+[[package]]
2288
+name = "untrusted"
2289
+version = "0.9.0"
2290
+source = "registry+https://github.com/rust-lang/crates.io-index"
2291
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2292
+
2293
+[[package]]
2294
+name = "url"
2295
+version = "2.5.8"
2296
+source = "registry+https://github.com/rust-lang/crates.io-index"
2297
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
2298
+dependencies = [
2299
+ "form_urlencoded",
2300
+ "idna",
2301
+ "percent-encoding",
2302
+ "serde",
2303
+]
2304
+
2305
+[[package]]
2306
+name = "url-builder"
2307
+version = "0.1.1"
2308
+source = "registry+https://github.com/rust-lang/crates.io-index"
2309
+checksum = "6c560d19163937c53680c515b82a9311c5a796691c67890b8ad579423123e194"
2310
+
2311
+[[package]]
2312
+name = "utf8_iter"
2313
+version = "1.0.4"
2314
+source = "registry+https://github.com/rust-lang/crates.io-index"
2315
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2316
+
2317
+[[package]]
2318
+name = "utf8parse"
2319
+version = "0.2.2"
2320
+source = "registry+https://github.com/rust-lang/crates.io-index"
2321
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
2322
+
2323
+[[package]]
2324
+name = "uuid"
2325
+version = "1.23.0"
2326
+source = "registry+https://github.com/rust-lang/crates.io-index"
2327
+checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9"
2328
+dependencies = [
2329
+ "getrandom 0.4.2",
2330
+ "js-sys",
2331
+ "wasm-bindgen",
2332
+]
2333
+
2334
+[[package]]
2335
+name = "valuable"
2336
+version = "0.1.1"
2337
+source = "registry+https://github.com/rust-lang/crates.io-index"
2338
+checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2339
+
2340
+[[package]]
2341
+name = "vec_map"
2342
+version = "0.8.2"
2343
+source = "registry+https://github.com/rust-lang/crates.io-index"
2344
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
2345
+
2346
+[[package]]
2347
+name = "version_check"
2348
+version = "0.9.5"
2349
+source = "registry+https://github.com/rust-lang/crates.io-index"
2350
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2351
+
2352
+[[package]]
2353
+name = "walkdir"
2354
+version = "2.5.0"
2355
+source = "registry+https://github.com/rust-lang/crates.io-index"
2356
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
2357
+dependencies = [
2358
+ "same-file",
2359
+ "winapi-util",
2360
+]
2361
+
2362
+[[package]]
2363
+name = "want"
2364
+version = "0.3.1"
2365
+source = "registry+https://github.com/rust-lang/crates.io-index"
2366
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
2367
+dependencies = [
2368
+ "try-lock",
2369
+]
2370
+
2371
+[[package]]
2372
+name = "wasi"
2373
+version = "0.11.1+wasi-snapshot-preview1"
2374
+source = "registry+https://github.com/rust-lang/crates.io-index"
2375
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2376
+
2377
+[[package]]
2378
+name = "wasip2"
2379
+version = "1.0.2+wasi-0.2.9"
2380
+source = "registry+https://github.com/rust-lang/crates.io-index"
2381
+checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
2382
+dependencies = [
2383
+ "wit-bindgen",
2384
+]
2385
+
2386
+[[package]]
2387
+name = "wasip3"
2388
+version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
2389
+source = "registry+https://github.com/rust-lang/crates.io-index"
2390
+checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
2391
+dependencies = [
2392
+ "wit-bindgen",
2393
+]
2394
+
2395
+[[package]]
2396
+name = "wasm-bindgen"
2397
+version = "0.2.118"
2398
+source = "registry+https://github.com/rust-lang/crates.io-index"
2399
+checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
2400
+dependencies = [
2401
+ "cfg-if",
2402
+ "once_cell",
2403
+ "rustversion",
2404
+ "wasm-bindgen-macro",
2405
+ "wasm-bindgen-shared",
2406
+]
2407
+
2408
+[[package]]
2409
+name = "wasm-bindgen-futures"
2410
+version = "0.4.68"
2411
+source = "registry+https://github.com/rust-lang/crates.io-index"
2412
+checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8"
2413
+dependencies = [
2414
+ "js-sys",
2415
+ "wasm-bindgen",
2416
+]
2417
+
2418
+[[package]]
2419
+name = "wasm-bindgen-macro"
2420
+version = "0.2.118"
2421
+source = "registry+https://github.com/rust-lang/crates.io-index"
2422
+checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
2423
+dependencies = [
2424
+ "quote",
2425
+ "wasm-bindgen-macro-support",
2426
+]
2427
+
2428
+[[package]]
2429
+name = "wasm-bindgen-macro-support"
2430
+version = "0.2.118"
2431
+source = "registry+https://github.com/rust-lang/crates.io-index"
2432
+checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
2433
+dependencies = [
2434
+ "bumpalo",
2435
+ "proc-macro2",
2436
+ "quote",
2437
+ "syn 2.0.117",
2438
+ "wasm-bindgen-shared",
2439
+]
2440
+
2441
+[[package]]
2442
+name = "wasm-bindgen-shared"
2443
+version = "0.2.118"
2444
+source = "registry+https://github.com/rust-lang/crates.io-index"
2445
+checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
2446
+dependencies = [
2447
+ "unicode-ident",
2448
+]
2449
+
2450
+[[package]]
2451
+name = "wasm-encoder"
2452
+version = "0.244.0"
2453
+source = "registry+https://github.com/rust-lang/crates.io-index"
2454
+checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
2455
+dependencies = [
2456
+ "leb128fmt",
2457
+ "wasmparser",
2458
+]
2459
+
2460
+[[package]]
2461
+name = "wasm-metadata"
2462
+version = "0.244.0"
2463
+source = "registry+https://github.com/rust-lang/crates.io-index"
2464
+checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
2465
+dependencies = [
2466
+ "anyhow",
2467
+ "indexmap",
2468
+ "wasm-encoder",
2469
+ "wasmparser",
2470
+]
2471
+
2472
+[[package]]
2473
+name = "wasmparser"
2474
+version = "0.244.0"
2475
+source = "registry+https://github.com/rust-lang/crates.io-index"
2476
+checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
2477
+dependencies = [
2478
+ "bitflags 2.11.0",
2479
+ "hashbrown 0.15.5",
2480
+ "indexmap",
2481
+ "semver",
2482
+]
2483
+
2484
+[[package]]
2485
+name = "web-sys"
2486
+version = "0.3.95"
2487
+source = "registry+https://github.com/rust-lang/crates.io-index"
2488
+checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d"
2489
+dependencies = [
2490
+ "js-sys",
2491
+ "wasm-bindgen",
2492
+]
2493
+
2494
+[[package]]
2495
+name = "web-time"
2496
+version = "1.1.0"
2497
+source = "registry+https://github.com/rust-lang/crates.io-index"
2498
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
2499
+dependencies = [
2500
+ "js-sys",
2501
+ "wasm-bindgen",
2502
+]
2503
+
2504
+[[package]]
2505
+name = "winapi"
2506
+version = "0.3.9"
2507
+source = "registry+https://github.com/rust-lang/crates.io-index"
2508
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2509
+dependencies = [
2510
+ "winapi-i686-pc-windows-gnu",
2511
+ "winapi-x86_64-pc-windows-gnu",
2512
+]
2513
+
2514
+[[package]]
2515
+name = "winapi-i686-pc-windows-gnu"
2516
+version = "0.4.0"
2517
+source = "registry+https://github.com/rust-lang/crates.io-index"
2518
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2519
+
2520
+[[package]]
2521
+name = "winapi-util"
2522
+version = "0.1.11"
2523
+source = "registry+https://github.com/rust-lang/crates.io-index"
2524
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
2525
+dependencies = [
2526
+ "windows-sys 0.61.2",
2527
+]
2528
+
2529
+[[package]]
2530
+name = "winapi-x86_64-pc-windows-gnu"
2531
+version = "0.4.0"
2532
+source = "registry+https://github.com/rust-lang/crates.io-index"
2533
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2534
+
2535
+[[package]]
2536
+name = "windows"
2537
+version = "0.48.0"
2538
+source = "registry+https://github.com/rust-lang/crates.io-index"
2539
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
2540
+dependencies = [
2541
+ "windows-targets 0.48.5",
2542
+]
2543
+
2544
+[[package]]
2545
+name = "windows-core"
2546
+version = "0.62.2"
2547
+source = "registry+https://github.com/rust-lang/crates.io-index"
2548
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
2549
+dependencies = [
2550
+ "windows-implement",
2551
+ "windows-interface",
2552
+ "windows-link",
2553
+ "windows-result",
2554
+ "windows-strings",
2555
+]
2556
+
2557
+[[package]]
2558
+name = "windows-implement"
2559
+version = "0.60.2"
2560
+source = "registry+https://github.com/rust-lang/crates.io-index"
2561
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
2562
+dependencies = [
2563
+ "proc-macro2",
2564
+ "quote",
2565
+ "syn 2.0.117",
2566
+]
2567
+
2568
+[[package]]
2569
+name = "windows-interface"
2570
+version = "0.59.3"
2571
+source = "registry+https://github.com/rust-lang/crates.io-index"
2572
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
2573
+dependencies = [
2574
+ "proc-macro2",
2575
+ "quote",
2576
+ "syn 2.0.117",
2577
+]
2578
+
2579
+[[package]]
2580
+name = "windows-link"
2581
+version = "0.2.1"
2582
+source = "registry+https://github.com/rust-lang/crates.io-index"
2583
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
2584
+
2585
+[[package]]
2586
+name = "windows-result"
2587
+version = "0.4.1"
2588
+source = "registry+https://github.com/rust-lang/crates.io-index"
2589
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
2590
+dependencies = [
2591
+ "windows-link",
2592
+]
2593
+
2594
+[[package]]
2595
+name = "windows-strings"
2596
+version = "0.5.1"
2597
+source = "registry+https://github.com/rust-lang/crates.io-index"
2598
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
2599
+dependencies = [
2600
+ "windows-link",
2601
+]
2602
+
2603
+[[package]]
2604
+name = "windows-sys"
2605
+version = "0.48.0"
2606
+source = "registry+https://github.com/rust-lang/crates.io-index"
2607
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
2608
+dependencies = [
2609
+ "windows-targets 0.48.5",
2610
+]
2611
+
2612
+[[package]]
2613
+name = "windows-sys"
2614
+version = "0.52.0"
2615
+source = "registry+https://github.com/rust-lang/crates.io-index"
2616
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2617
+dependencies = [
2618
+ "windows-targets 0.52.6",
2619
+]
2620
+
2621
+[[package]]
2622
+name = "windows-sys"
2623
+version = "0.59.0"
2624
+source = "registry+https://github.com/rust-lang/crates.io-index"
2625
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2626
+dependencies = [
2627
+ "windows-targets 0.52.6",
2628
+]
2629
+
2630
+[[package]]
2631
+name = "windows-sys"
2632
+version = "0.60.2"
2633
+source = "registry+https://github.com/rust-lang/crates.io-index"
2634
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
2635
+dependencies = [
2636
+ "windows-targets 0.53.5",
2637
+]
2638
+
2639
+[[package]]
2640
+name = "windows-sys"
2641
+version = "0.61.2"
2642
+source = "registry+https://github.com/rust-lang/crates.io-index"
2643
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
2644
+dependencies = [
2645
+ "windows-link",
2646
+]
2647
+
2648
+[[package]]
2649
+name = "windows-targets"
2650
+version = "0.48.5"
2651
+source = "registry+https://github.com/rust-lang/crates.io-index"
2652
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
2653
+dependencies = [
2654
+ "windows_aarch64_gnullvm 0.48.5",
2655
+ "windows_aarch64_msvc 0.48.5",
2656
+ "windows_i686_gnu 0.48.5",
2657
+ "windows_i686_msvc 0.48.5",
2658
+ "windows_x86_64_gnu 0.48.5",
2659
+ "windows_x86_64_gnullvm 0.48.5",
2660
+ "windows_x86_64_msvc 0.48.5",
2661
+]
2662
+
2663
+[[package]]
2664
+name = "windows-targets"
2665
+version = "0.52.6"
2666
+source = "registry+https://github.com/rust-lang/crates.io-index"
2667
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2668
+dependencies = [
2669
+ "windows_aarch64_gnullvm 0.52.6",
2670
+ "windows_aarch64_msvc 0.52.6",
2671
+ "windows_i686_gnu 0.52.6",
2672
+ "windows_i686_gnullvm 0.52.6",
2673
+ "windows_i686_msvc 0.52.6",
2674
+ "windows_x86_64_gnu 0.52.6",
2675
+ "windows_x86_64_gnullvm 0.52.6",
2676
+ "windows_x86_64_msvc 0.52.6",
2677
+]
2678
+
2679
+[[package]]
2680
+name = "windows-targets"
2681
+version = "0.53.5"
2682
+source = "registry+https://github.com/rust-lang/crates.io-index"
2683
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
2684
+dependencies = [
2685
+ "windows-link",
2686
+ "windows_aarch64_gnullvm 0.53.1",
2687
+ "windows_aarch64_msvc 0.53.1",
2688
+ "windows_i686_gnu 0.53.1",
2689
+ "windows_i686_gnullvm 0.53.1",
2690
+ "windows_i686_msvc 0.53.1",
2691
+ "windows_x86_64_gnu 0.53.1",
2692
+ "windows_x86_64_gnullvm 0.53.1",
2693
+ "windows_x86_64_msvc 0.53.1",
2694
+]
2695
+
2696
+[[package]]
2697
+name = "windows_aarch64_gnullvm"
2698
+version = "0.48.5"
2699
+source = "registry+https://github.com/rust-lang/crates.io-index"
2700
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
2701
+
2702
+[[package]]
2703
+name = "windows_aarch64_gnullvm"
2704
+version = "0.52.6"
2705
+source = "registry+https://github.com/rust-lang/crates.io-index"
2706
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2707
+
2708
+[[package]]
2709
+name = "windows_aarch64_gnullvm"
2710
+version = "0.53.1"
2711
+source = "registry+https://github.com/rust-lang/crates.io-index"
2712
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
2713
+
2714
+[[package]]
2715
+name = "windows_aarch64_msvc"
2716
+version = "0.48.5"
2717
+source = "registry+https://github.com/rust-lang/crates.io-index"
2718
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
2719
+
2720
+[[package]]
2721
+name = "windows_aarch64_msvc"
2722
+version = "0.52.6"
2723
+source = "registry+https://github.com/rust-lang/crates.io-index"
2724
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2725
+
2726
+[[package]]
2727
+name = "windows_aarch64_msvc"
2728
+version = "0.53.1"
2729
+source = "registry+https://github.com/rust-lang/crates.io-index"
2730
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
2731
+
2732
+[[package]]
2733
+name = "windows_i686_gnu"
2734
+version = "0.48.5"
2735
+source = "registry+https://github.com/rust-lang/crates.io-index"
2736
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
2737
+
2738
+[[package]]
2739
+name = "windows_i686_gnu"
2740
+version = "0.52.6"
2741
+source = "registry+https://github.com/rust-lang/crates.io-index"
2742
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2743
+
2744
+[[package]]
2745
+name = "windows_i686_gnu"
2746
+version = "0.53.1"
2747
+source = "registry+https://github.com/rust-lang/crates.io-index"
2748
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
2749
+
2750
+[[package]]
2751
+name = "windows_i686_gnullvm"
2752
+version = "0.52.6"
2753
+source = "registry+https://github.com/rust-lang/crates.io-index"
2754
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2755
+
2756
+[[package]]
2757
+name = "windows_i686_gnullvm"
2758
+version = "0.53.1"
2759
+source = "registry+https://github.com/rust-lang/crates.io-index"
2760
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
2761
+
2762
+[[package]]
2763
+name = "windows_i686_msvc"
2764
+version = "0.48.5"
2765
+source = "registry+https://github.com/rust-lang/crates.io-index"
2766
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
2767
+
2768
+[[package]]
2769
+name = "windows_i686_msvc"
2770
+version = "0.52.6"
2771
+source = "registry+https://github.com/rust-lang/crates.io-index"
2772
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2773
+
2774
+[[package]]
2775
+name = "windows_i686_msvc"
2776
+version = "0.53.1"
2777
+source = "registry+https://github.com/rust-lang/crates.io-index"
2778
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
2779
+
2780
+[[package]]
2781
+name = "windows_x86_64_gnu"
2782
+version = "0.48.5"
2783
+source = "registry+https://github.com/rust-lang/crates.io-index"
2784
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
2785
+
2786
+[[package]]
2787
+name = "windows_x86_64_gnu"
2788
+version = "0.52.6"
2789
+source = "registry+https://github.com/rust-lang/crates.io-index"
2790
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2791
+
2792
+[[package]]
2793
+name = "windows_x86_64_gnu"
2794
+version = "0.53.1"
2795
+source = "registry+https://github.com/rust-lang/crates.io-index"
2796
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
2797
+
2798
+[[package]]
2799
+name = "windows_x86_64_gnullvm"
2800
+version = "0.48.5"
2801
+source = "registry+https://github.com/rust-lang/crates.io-index"
2802
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
2803
+
2804
+[[package]]
2805
+name = "windows_x86_64_gnullvm"
2806
+version = "0.52.6"
2807
+source = "registry+https://github.com/rust-lang/crates.io-index"
2808
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2809
+
2810
+[[package]]
2811
+name = "windows_x86_64_gnullvm"
2812
+version = "0.53.1"
2813
+source = "registry+https://github.com/rust-lang/crates.io-index"
2814
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
2815
+
2816
+[[package]]
2817
+name = "windows_x86_64_msvc"
2818
+version = "0.48.5"
2819
+source = "registry+https://github.com/rust-lang/crates.io-index"
2820
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
2821
+
2822
+[[package]]
2823
+name = "windows_x86_64_msvc"
2824
+version = "0.52.6"
2825
+source = "registry+https://github.com/rust-lang/crates.io-index"
2826
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2827
+
2828
+[[package]]
2829
+name = "windows_x86_64_msvc"
2830
+version = "0.53.1"
2831
+source = "registry+https://github.com/rust-lang/crates.io-index"
2832
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
2833
+
2834
+[[package]]
2835
+name = "wit-bindgen"
2836
+version = "0.51.0"
2837
+source = "registry+https://github.com/rust-lang/crates.io-index"
2838
+checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
2839
+dependencies = [
2840
+ "wit-bindgen-rust-macro",
2841
+]
2842
+
2843
+[[package]]
2844
+name = "wit-bindgen-core"
2845
+version = "0.51.0"
2846
+source = "registry+https://github.com/rust-lang/crates.io-index"
2847
+checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
2848
+dependencies = [
2849
+ "anyhow",
2850
+ "heck 0.5.0",
2851
+ "wit-parser",
2852
+]
2853
+
2854
+[[package]]
2855
+name = "wit-bindgen-rust"
2856
+version = "0.51.0"
2857
+source = "registry+https://github.com/rust-lang/crates.io-index"
2858
+checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
2859
+dependencies = [
2860
+ "anyhow",
2861
+ "heck 0.5.0",
2862
+ "indexmap",
2863
+ "prettyplease",
2864
+ "syn 2.0.117",
2865
+ "wasm-metadata",
2866
+ "wit-bindgen-core",
2867
+ "wit-component",
2868
+]
2869
+
2870
+[[package]]
2871
+name = "wit-bindgen-rust-macro"
2872
+version = "0.51.0"
2873
+source = "registry+https://github.com/rust-lang/crates.io-index"
2874
+checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
2875
+dependencies = [
2876
+ "anyhow",
2877
+ "prettyplease",
2878
+ "proc-macro2",
2879
+ "quote",
2880
+ "syn 2.0.117",
2881
+ "wit-bindgen-core",
2882
+ "wit-bindgen-rust",
2883
+]
2884
+
2885
+[[package]]
2886
+name = "wit-component"
2887
+version = "0.244.0"
2888
+source = "registry+https://github.com/rust-lang/crates.io-index"
2889
+checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
2890
+dependencies = [
2891
+ "anyhow",
2892
+ "bitflags 2.11.0",
2893
+ "indexmap",
2894
+ "log",
2895
+ "serde",
2896
+ "serde_derive",
2897
+ "serde_json",
2898
+ "wasm-encoder",
2899
+ "wasm-metadata",
2900
+ "wasmparser",
2901
+ "wit-parser",
2902
+]
2903
+
2904
+[[package]]
2905
+name = "wit-parser"
2906
+version = "0.244.0"
2907
+source = "registry+https://github.com/rust-lang/crates.io-index"
2908
+checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
2909
+dependencies = [
2910
+ "anyhow",
2911
+ "id-arena",
2912
+ "indexmap",
2913
+ "log",
2914
+ "semver",
2915
+ "serde",
2916
+ "serde_derive",
2917
+ "serde_json",
2918
+ "unicode-xid",
2919
+ "wasmparser",
2920
+]
2921
+
2922
+[[package]]
2923
+name = "writeable"
2924
+version = "0.6.3"
2925
+source = "registry+https://github.com/rust-lang/crates.io-index"
2926
+checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
2927
+
2928
+[[package]]
2929
+name = "yoke"
2930
+version = "0.8.2"
2931
+source = "registry+https://github.com/rust-lang/crates.io-index"
2932
+checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
2933
+dependencies = [
2934
+ "stable_deref_trait",
2935
+ "yoke-derive",
2936
+ "zerofrom",
2937
+]
2938
+
2939
+[[package]]
2940
+name = "yoke-derive"
2941
+version = "0.8.2"
2942
+source = "registry+https://github.com/rust-lang/crates.io-index"
2943
+checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
2944
+dependencies = [
2945
+ "proc-macro2",
2946
+ "quote",
2947
+ "syn 2.0.117",
2948
+ "synstructure",
2949
+]
2950
+
2951
+[[package]]
2952
+name = "zerocopy"
2953
+version = "0.8.48"
2954
+source = "registry+https://github.com/rust-lang/crates.io-index"
2955
+checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
2956
+dependencies = [
2957
+ "zerocopy-derive",
2958
+]
2959
+
2960
+[[package]]
2961
+name = "zerocopy-derive"
2962
+version = "0.8.48"
2963
+source = "registry+https://github.com/rust-lang/crates.io-index"
2964
+checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
2965
+dependencies = [
2966
+ "proc-macro2",
2967
+ "quote",
2968
+ "syn 2.0.117",
2969
+]
2970
+
2971
+[[package]]
2972
+name = "zerofrom"
2973
+version = "0.1.7"
2974
+source = "registry+https://github.com/rust-lang/crates.io-index"
2975
+checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
2976
+dependencies = [
2977
+ "zerofrom-derive",
2978
+]
2979
+
2980
+[[package]]
2981
+name = "zerofrom-derive"
2982
+version = "0.1.7"
2983
+source = "registry+https://github.com/rust-lang/crates.io-index"
2984
+checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
2985
+dependencies = [
2986
+ "proc-macro2",
2987
+ "quote",
2988
+ "syn 2.0.117",
2989
+ "synstructure",
2990
+]
2991
+
2992
+[[package]]
2993
+name = "zeroize"
2994
+version = "1.8.2"
2995
+source = "registry+https://github.com/rust-lang/crates.io-index"
2996
+checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
2997
+
2998
+[[package]]
2999
+name = "zerotrie"
3000
+version = "0.2.4"
3001
+source = "registry+https://github.com/rust-lang/crates.io-index"
3002
+checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
3003
+dependencies = [
3004
+ "displaydoc",
3005
+ "yoke",
3006
+ "zerofrom",
3007
+]
3008
+
3009
+[[package]]
3010
+name = "zerovec"
3011
+version = "0.11.6"
3012
+source = "registry+https://github.com/rust-lang/crates.io-index"
3013
+checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
3014
+dependencies = [
3015
+ "yoke",
3016
+ "zerofrom",
3017
+ "zerovec-derive",
3018
+]
3019
+
3020
+[[package]]
3021
+name = "zerovec-derive"
3022
+version = "0.11.3"
3023
+source = "registry+https://github.com/rust-lang/crates.io-index"
3024
+checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
3025
+dependencies = [
3026
+ "proc-macro2",
3027
+ "quote",
3028
+ "syn 2.0.117",
3029
+]
3030
+
3031
+[[package]]
3032
+name = "zmij"
3033
+version = "1.0.21"
3034
+source = "registry+https://github.com/rust-lang/crates.io-index"
3035
+checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
Cargo.toml
new
+21
@@ -0,0 +1,21 @@
1
+[package]
2
+name = "onde-cli"
3
+version = "0.1.0"
4
+edition = "2024"
5
+
6
+[[bin]]
7
+name = "onde"
8
+path = "src/main.rs"
9
+
10
+[dependencies]
11
+anyhow = "1"
12
+crossterm = { version = "0.28", features = ["event-stream"] }
13
+dirs = "5"
14
+futures = "0.3"
15
+log = "0.4"
16
+ratatui = "0.29"
17
+libc = "0.2"
18
+tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
19
+smbcloud-auth-sdk = { path = "../smbcloud-cli/crates/smbcloud-auth-sdk" }
20
+smbcloud-model = { path = "../smbcloud-cli/crates/smbcloud-model" }
21
+smbcloud-network = { path = "../smbcloud-cli/crates/smbcloud-network" }
README.md
new
+76
@@ -0,0 +1,76 @@
1
+<p align="center">
2
+ <img src="https://raw.githubusercontent.com/ondeinference/onde/main/assets/onde-inference-logo.svg" alt="Onde Inference" width="96">
3
+</p>
4
+
5
+<h1 align="center">onde</h1>
6
+
7
+<p align="center">
8
+ <strong>Command-line interface for <a href="https://ondeinference.com">Onde Inference</a>.</strong>
9
+</p>
10
+
11
+<p align="center">
12
+ <a href="https://ondeinference.com"><img src="https://img.shields.io/badge/ondeinference.com-235843?style=flat-square&labelColor=17211D" alt="Website"></a>
13
+ <a href="https://apps.apple.com/se/developer/splitfire-ab/id1831430993"><img src="https://img.shields.io/badge/App%20Store-live-235843?style=flat-square&labelColor=17211D" alt="App Store"></a>
14
+</p>
15
+
16
+<p align="center">
17
+ <a href="https://github.com/ondeinference/onde-swift">Swift SDK</a> · <a href="https://pub.dev/packages/onde_inference">Flutter SDK</a> · <a href="https://www.npmjs.com/package/@ondeinference/react-native">React Native SDK</a> · <a href="https://ondeinference.com">Website</a>
18
+</p>
19
+
20
+---
21
+
22
+Manage your Onde Inference account from the terminal. Sign up, sign in, and access the service.
23
+
24
+More commands are coming.
25
+
26
+## Install
27
+
28
+```sh
29
+cargo install onde-cli
30
+```
31
+
32
+Or build locally:
33
+
34
+```sh
35
+git clone https://github.com/ondeinference/onde-cli
36
+cd onde-cli
37
+cargo build --release
38
+./target/release/onde
39
+```
40
+
41
+## Usage
42
+
43
+```sh
44
+onde
45
+```
46
+
47
+Opens a terminal UI. Create an account or sign in.
48
+
49
+## Keys
50
+
51
+| Key | What it does |
52
+|--------|---------------------|
53
+| Tab | move between fields |
54
+| Enter | submit / sign out |
55
+| Ctrl+L | go to sign in |
56
+| Ctrl+N | go to new account |
57
+| Ctrl+C | quit |
58
+
59
+## Debug
60
+
61
+Logs go to `~/.cache/onde/debug.log`. Nothing touches the terminal output.
62
+
63
+---
64
+
65
+## License
66
+
67
+Dual-licensed under **MIT** and **Apache 2.0**.
68
+
69
+- [MIT License](https://github.com/ondeinference/onde/blob/main/LICENSE-MIT)
70
+- [Apache License 2.0](https://github.com/ondeinference/onde/blob/main/LICENSE-APACHE)
71
+
72
+---
73
+
74
+<p align="center">
75
+ <sub>© 2026 <a href="https://ondeinference.com">Onde Inference</a></sub>
76
+</p>
src/app.rs
new
+377
@@ -0,0 +1,377 @@
1
+use {
2
+ crate::token,
3
+ anyhow::Result,
4
+ crossterm::event::{Event, EventStream, KeyCode, KeyEventKind, KeyModifiers},
5
+ futures::StreamExt,
6
+ ratatui::DefaultTerminal,
7
+ smbcloud_auth_sdk::{
8
+ client_credentials::ClientCredentials, login::login_with_client,
9
+ logout::logout_with_client, me::me_with_client, signup::signup_with_client,
10
+ },
11
+ smbcloud_model::{error_codes::ErrorResponse, login::AccountStatus},
12
+ smbcloud_network::environment::Environment,
13
+ tokio::sync::mpsc,
14
+};
15
+
16
+// app credentials — Onde is a tenant in smbCloud Auth
17
+
18
+const APP_ID: &str = "e1098adf-9859-43bf-ae98-514cf66252a5";
19
+const APP_SECRET: &str = "5bc60b32-c072-40ce-a91f-b289fdee075d";
20
+
21
+fn credentials() -> ClientCredentials<'static> {
22
+ ClientCredentials {
23
+ app_id: APP_ID,
24
+ app_secret: APP_SECRET,
25
+ }
26
+}
27
+
28
+// types
29
+
30
+#[derive(Debug, Clone, PartialEq)]
31
+pub enum Mode {
32
+ Signup,
33
+ Signin,
34
+}
35
+
36
+#[derive(Debug, Clone, PartialEq)]
37
+pub enum Focus {
38
+ Email,
39
+ Password,
40
+}
41
+
42
+#[derive(Debug, Clone, PartialEq)]
43
+pub enum StatusTone {
44
+ Neutral,
45
+ Success,
46
+ Error,
47
+}
48
+
49
+#[derive(Debug, Clone)]
50
+pub struct Status {
51
+ pub tone: StatusTone,
52
+ pub message: String,
53
+}
54
+
55
+impl Status {
56
+ pub fn neutral(msg: impl Into<String>) -> Self {
57
+ Self {
58
+ tone: StatusTone::Neutral,
59
+ message: msg.into(),
60
+ }
61
+ }
62
+ pub fn success(msg: impl Into<String>) -> Self {
63
+ Self {
64
+ tone: StatusTone::Success,
65
+ message: msg.into(),
66
+ }
67
+ }
68
+ pub fn error(msg: impl Into<String>) -> Self {
69
+ Self {
70
+ tone: StatusTone::Error,
71
+ message: msg.into(),
72
+ }
73
+ }
74
+}
75
+
76
+#[derive(Debug, Clone)]
77
+pub struct Profile {
78
+ pub email: String,
79
+}
80
+
81
+pub enum AuthEvent {
82
+ SignupOk(String),
83
+ SigninOk(Profile),
84
+ ProfileOk(Profile),
85
+ SignedOut,
86
+ Failed(String),
87
+}
88
+
89
+// app state
90
+
91
+pub struct App {
92
+ pub mode: Mode,
93
+ pub email: String,
94
+ pub password: String,
95
+ pub focus: Focus,
96
+ pub status: Status,
97
+ pub busy: bool,
98
+ pub profile: Option<Profile>,
99
+ pub should_quit: bool,
100
+}
101
+
102
+impl App {
103
+ pub fn new() -> Self {
104
+ Self {
105
+ mode: Mode::Signup,
106
+ email: String::new(),
107
+ password: String::new(),
108
+ focus: Focus::Email,
109
+ status: Status::neutral("Type your email and password."),
110
+ busy: false,
111
+ profile: None,
112
+ should_quit: false,
113
+ }
114
+ }
115
+
116
+ fn idle_status(&self) -> Status {
117
+ match self.mode {
118
+ Mode::Signup => Status::neutral("Type your email and password."),
119
+ Mode::Signin => Status::neutral("Sign in to your existing account."),
120
+ }
121
+ }
122
+
123
+ pub fn switch_mode(&mut self, mode: Mode) {
124
+ if self.busy {
125
+ return;
126
+ }
127
+ self.mode = mode;
128
+ if self.profile.is_none() {
129
+ self.status = self.idle_status();
130
+ }
131
+ }
132
+
133
+ pub fn apply(&mut self, event: AuthEvent) {
134
+ self.busy = false;
135
+ match event {
136
+ AuthEvent::SignupOk(message) => {
137
+ self.password.clear();
138
+ self.status = Status::success(message);
139
+ }
140
+ AuthEvent::SigninOk(profile) => {
141
+ self.password.clear();
142
+ self.profile = Some(profile);
143
+ self.status = Status::success("You're in.");
144
+ }
145
+ AuthEvent::ProfileOk(profile) => {
146
+ self.profile = Some(profile);
147
+ self.status = Status::success("Still signed in.");
148
+ }
149
+ AuthEvent::SignedOut => {
150
+ token::clear();
151
+ self.profile = None;
152
+ self.status = Status::neutral("Signed out.");
153
+ }
154
+ AuthEvent::Failed(message) => {
155
+ self.status = Status::error(message);
156
+ }
157
+ }
158
+ }
159
+}
160
+
161
+// event loop
162
+
163
+pub async fn run(terminal: &mut DefaultTerminal) -> Result<()> {
164
+ let mut app = App::new();
165
+ let (tx, mut rx) = mpsc::unbounded_channel::<AuthEvent>();
166
+ let mut events = EventStream::new();
167
+
168
+ // pick up where we left off if there's a saved token
169
+ if let Some(saved_token) = token::load() {
170
+ app.busy = true;
171
+ app.status = Status::neutral("Restoring session…");
172
+ let tx = tx.clone();
173
+ tokio::spawn(async move {
174
+ match me_with_client(Environment::Production, credentials(), &saved_token).await {
175
+ Ok(user) => {
176
+ let _ = tx.send(AuthEvent::ProfileOk(Profile { email: user.email }));
177
+ }
178
+ Err(_) => {
179
+ token::clear();
180
+ let _ = tx.send(AuthEvent::Failed("Session expired. Sign in again.".into()));
181
+ }
182
+ }
183
+ });
184
+ }
185
+
186
+ loop {
187
+ terminal.draw(|frame| crate::ui::render(frame, &app))?;
188
+
189
+ tokio::select! {
190
+ maybe = events.next() => {
191
+ match maybe {
192
+ Some(Ok(Event::Key(key))) if key.kind == KeyEventKind::Press => {
193
+ handle_key(&mut app, key, tx.clone());
194
+ }
195
+ None => break,
196
+ _ => {}
197
+ }
198
+ }
199
+ maybe = rx.recv() => {
200
+ if let Some(event) = maybe {
201
+ app.apply(event);
202
+ }
203
+ }
204
+ }
205
+
206
+ if app.should_quit {
207
+ break;
208
+ }
209
+ }
210
+
211
+ Ok(())
212
+}
213
+
214
+// key handling
215
+
216
+fn handle_key(
217
+ app: &mut App,
218
+ key: crossterm::event::KeyEvent,
219
+ tx: mpsc::UnboundedSender<AuthEvent>,
220
+) {
221
+ use KeyCode::*;
222
+
223
+ // don't process input while a request is in flight — only quit
224
+ if app.busy {
225
+ if matches!(
226
+ (key.code, key.modifiers),
227
+ (Char('c'), KeyModifiers::CONTROL)
228
+ ) {
229
+ app.should_quit = true;
230
+ }
231
+ return;
232
+ }
233
+
234
+ match (key.code, key.modifiers) {
235
+ // Quit
236
+ (Char('c'), KeyModifiers::CONTROL) | (Esc, _) => {
237
+ app.should_quit = true;
238
+ }
239
+
240
+ // Tab: cycle focus between fields (only on auth form)
241
+ (Tab, _) if app.profile.is_none() => {
242
+ app.focus = match app.focus {
243
+ Focus::Email => Focus::Password,
244
+ Focus::Password => Focus::Email,
245
+ };
246
+ }
247
+
248
+ // Mode switching
249
+ (Char('l'), KeyModifiers::CONTROL) if app.profile.is_none() => {
250
+ app.switch_mode(Mode::Signin);
251
+ }
252
+ (Char('n'), KeyModifiers::CONTROL) if app.profile.is_none() => {
253
+ app.switch_mode(Mode::Signup);
254
+ }
255
+
256
+ // Enter: submit form or sign out
257
+ (Enter, _) => {
258
+ if app.profile.is_some() {
259
+ sign_out(app, tx);
260
+ } else {
261
+ submit(app, tx);
262
+ }
263
+ }
264
+
265
+ // Backspace
266
+ (Backspace, _) if app.profile.is_none() => match app.focus {
267
+ Focus::Email => {
268
+ app.email.pop();
269
+ }
270
+ Focus::Password => {
271
+ app.password.pop();
272
+ }
273
+ },
274
+
275
+ // Regular character input
276
+ (Char(c), KeyModifiers::NONE | KeyModifiers::SHIFT) if app.profile.is_none() => {
277
+ match app.focus {
278
+ Focus::Email => app.email.push(c),
279
+ Focus::Password => app.password.push(c),
280
+ }
281
+ }
282
+
283
+ _ => {}
284
+ }
285
+}
286
+
287
+// auth actions
288
+
289
+fn submit(app: &mut App, tx: mpsc::UnboundedSender<AuthEvent>) {
290
+ let email = app.email.trim().to_string();
291
+ let password = app.password.clone();
292
+
293
+ if email.is_empty() || password.is_empty() {
294
+ app.status = Status::error("Email and password are required.");
295
+ return;
296
+ }
297
+
298
+ app.busy = true;
299
+ app.status = match app.mode {
300
+ Mode::Signup => Status::neutral("Creating account…"),
301
+ Mode::Signin => Status::neutral("Signing in…"),
302
+ };
303
+
304
+ let mode = app.mode.clone();
305
+
306
+ tokio::spawn(async move {
307
+ let event = match mode {
308
+ Mode::Signup => {
309
+ match signup_with_client(Environment::Production, credentials(), email, password)
310
+ .await
311
+ {
312
+ Ok(result) => AuthEvent::SignupOk(result.message),
313
+ Err(e) => AuthEvent::Failed(extract_error(&e)),
314
+ }
315
+ }
316
+ Mode::Signin => {
317
+ match login_with_client(
318
+ Environment::Production,
319
+ credentials(),
320
+ email.clone(),
321
+ password,
322
+ )
323
+ .await
324
+ {
325
+ Ok(AccountStatus::Ready { access_token }) => {
326
+ if let Err(e) = token::save(&access_token) {
327
+ log::warn!("Could not persist token: {e}");
328
+ }
329
+ // Fetch profile; fall back to the email typed by the user
330
+ let profile_email = match me_with_client(
331
+ Environment::Production,
332
+ credentials(),
333
+ &access_token,
334
+ )
335
+ .await
336
+ {
337
+ Ok(user) => user.email,
338
+ Err(_) => email,
339
+ };
340
+ AuthEvent::SigninOk(Profile {
341
+ email: profile_email,
342
+ })
343
+ }
344
+ Ok(AccountStatus::Incomplete { .. }) => AuthEvent::Failed(
345
+ "Check your email first — we sent a confirmation link when you signed up."
346
+ .into(),
347
+ ),
348
+ Ok(AccountStatus::NotFound) => {
349
+ AuthEvent::Failed("That email isn't in our system.".into())
350
+ }
351
+ Err(e) => AuthEvent::Failed(extract_error(&e)),
352
+ }
353
+ }
354
+ };
355
+ let _ = tx.send(event);
356
+ });
357
+}
358
+
359
+fn sign_out(app: &mut App, tx: mpsc::UnboundedSender<AuthEvent>) {
360
+ let saved_token = token::load();
361
+ app.busy = true;
362
+ app.status = Status::neutral("Signing out…");
363
+
364
+ tokio::spawn(async move {
365
+ if let Some(token) = saved_token {
366
+ // fire and forget — if the server call fails we still clear locally
367
+ let _ = logout_with_client(Environment::Production, credentials(), token).await;
368
+ }
369
+ let _ = tx.send(AuthEvent::SignedOut);
370
+ });
371
+}
372
+
373
+fn extract_error(e: &ErrorResponse) -> String {
374
+ match e {
375
+ ErrorResponse::Error { message, .. } => message.clone(),
376
+ }
377
+}
src/main.rs
new
+45
@@ -0,0 +1,45 @@
1
+mod app;
2
+mod token;
3
+mod ui;
4
+
5
+/// Point stderr at ~/.cache/onde/debug.log before ratatui owns the terminal.
6
+/// Without this, any stray eprintln! or log output tears up the display.
7
+#[cfg(unix)]
8
+fn redirect_stderr() {
9
+ use std::fs::{self, OpenOptions};
10
+ use std::os::fd::IntoRawFd;
11
+
12
+ let log_dir = dirs::cache_dir()
13
+ .unwrap_or_else(|| std::path::PathBuf::from("/tmp"))
14
+ .join("onde");
15
+
16
+ if fs::create_dir_all(&log_dir).is_err() {
17
+ return;
18
+ }
19
+
20
+ if let Ok(file) = OpenOptions::new()
21
+ .create(true)
22
+ .append(true)
23
+ .open(log_dir.join("debug.log"))
24
+ {
25
+ // SAFETY: called before tokio or ratatui start, so no threads yet.
26
+ unsafe {
27
+ let fd = file.into_raw_fd();
28
+ libc::dup2(fd, libc::STDERR_FILENO);
29
+ libc::close(fd);
30
+ }
31
+ }
32
+}
33
+
34
+#[cfg(not(unix))]
35
+fn redirect_stderr() {}
36
+
37
+#[tokio::main]
38
+async fn main() -> anyhow::Result<()> {
39
+ redirect_stderr();
40
+
41
+ let mut terminal = ratatui::init();
42
+ let result = app::run(&mut terminal).await;
43
+ ratatui::restore();
44
+ result
45
+}
src/token.rs
new
+30
@@ -0,0 +1,30 @@
1
+use std::{fs, path::PathBuf};
2
+
3
+fn path() -> Option<PathBuf> {
4
+ dirs::config_dir().map(|p| p.join("onde").join("token"))
5
+}
6
+
7
+pub fn load() -> Option<String> {
8
+ let content = fs::read_to_string(path()?).ok()?;
9
+ let trimmed = content.trim().to_string();
10
+ if trimmed.is_empty() {
11
+ None
12
+ } else {
13
+ Some(trimmed)
14
+ }
15
+}
16
+
17
+pub fn save(token: &str) -> std::io::Result<()> {
18
+ let path = path()
19
+ .ok_or_else(|| std::io::Error::new(std::io::ErrorKind::NotFound, "no config directory"))?;
20
+ if let Some(parent) = path.parent() {
21
+ fs::create_dir_all(parent)?;
22
+ }
23
+ fs::write(path, token)
24
+}
25
+
26
+pub fn clear() {
27
+ if let Some(path) = path() {
28
+ let _ = fs::remove_file(path);
29
+ }
30
+}
src/ui.rs
new
+350
@@ -0,0 +1,350 @@
1
+use {
2
+ crate::app::{App, Focus, Mode, Profile, StatusTone},
3
+ ratatui::{
4
+ Frame,
5
+ layout::{Alignment, Constraint, Layout},
6
+ style::{Color, Style, Stylize},
7
+ text::{Line, Span},
8
+ widgets::{Block, BorderType, Borders, Padding, Paragraph, Wrap},
9
+ },
10
+};
11
+
12
+// theme — colours pulled directly from globals.css
13
+
14
+const C_BG: Color = Color::Rgb(0, 0, 0);
15
+const C_SURFACE: Color = Color::Rgb(13, 20, 16);
16
+const C_SURFACE_STRONG: Color = Color::Rgb(20, 28, 24);
17
+const C_NEON: Color = Color::Rgb(66, 255, 145);
18
+const C_TEXT: Color = Color::Rgb(226, 226, 226);
19
+const C_MUTED: Color = Color::Rgb(122, 144, 128);
20
+const C_INK: Color = Color::Rgb(216, 229, 222);
21
+const C_DANGER: Color = Color::Rgb(255, 95, 86);
22
+const C_LINE: Color = Color::Rgb(35, 50, 42);
23
+
24
+// render
25
+
26
+pub fn render(frame: &mut Frame, app: &App) {
27
+ let area = frame.area();
28
+
29
+ // Full-screen obsidian background
30
+ frame.render_widget(Block::new().style(Style::new().bg(C_BG)), area);
31
+
32
+ let layout = Layout::vertical([
33
+ Constraint::Length(3), // header
34
+ Constraint::Min(0), // card
35
+ Constraint::Length(1), // footer
36
+ ])
37
+ .split(area);
38
+
39
+ render_header(frame, layout[0]);
40
+ render_card(frame, app, layout[1]);
41
+ render_footer(frame, app, layout[2]);
42
+}
43
+
44
+// header
45
+
46
+fn render_header(frame: &mut Frame, area: ratatui::layout::Rect) {
47
+ let text = vec![
48
+ Line::from(vec![
49
+ Span::styled("◆ onde", Style::new().fg(C_NEON).bold()),
50
+ Span::styled(" — ondeinference.com", Style::new().fg(C_MUTED)),
51
+ ]),
52
+ Line::from(""),
53
+ Line::from(Span::styled(
54
+ "Start building on Apple silicon.",
55
+ Style::new().fg(C_TEXT),
56
+ )),
57
+ ];
58
+ frame.render_widget(Paragraph::new(text).alignment(Alignment::Center), area);
59
+}
60
+
61
+// card
62
+
63
+fn render_card(frame: &mut Frame, app: &App, area: ratatui::layout::Rect) {
64
+ // Centre the card horizontally (max 64 wide, minimum terminal width − 4)
65
+ let card_width = 64_u16.min(area.width.saturating_sub(4));
66
+ let h_pad = area.width.saturating_sub(card_width) / 2;
67
+
68
+ let cols = Layout::horizontal([
69
+ Constraint::Length(h_pad),
70
+ Constraint::Length(card_width),
71
+ Constraint::Min(0),
72
+ ])
73
+ .split(area);
74
+
75
+ let card_area = cols[1];
76
+
77
+ let card = Block::new()
78
+ .borders(Borders::ALL)
79
+ .border_type(BorderType::Rounded)
80
+ .border_style(Style::new().fg(C_LINE))
81
+ .style(Style::new().bg(C_SURFACE))
82
+ .padding(Padding::new(2, 2, 1, 1));
83
+
84
+ let inner = card.inner(card_area);
85
+ frame.render_widget(card, card_area);
86
+
87
+ if let Some(profile) = &app.profile {
88
+ render_session(frame, app, profile, inner);
89
+ } else {
90
+ render_form(frame, app, inner);
91
+ }
92
+}
93
+
94
+// auth form
95
+
96
+fn render_form(frame: &mut Frame, app: &App, area: ratatui::layout::Rect) {
97
+ let rows = Layout::vertical([
98
+ Constraint::Length(1), // tabs
99
+ Constraint::Length(1), // spacer
100
+ Constraint::Length(1), // headline
101
+ Constraint::Length(2), // description
102
+ Constraint::Length(1), // spacer
103
+ Constraint::Length(1), // status
104
+ Constraint::Length(1), // spacer
105
+ Constraint::Length(1), // email label
106
+ Constraint::Length(3), // email input
107
+ Constraint::Length(1), // spacer
108
+ Constraint::Length(1), // password label
109
+ Constraint::Length(3), // password input
110
+ Constraint::Length(1), // spacer
111
+ Constraint::Length(1), // primary button
112
+ Constraint::Length(1), // secondary hint
113
+ Constraint::Min(0), // remainder
114
+ ])
115
+ .split(area);
116
+
117
+ render_tabs(frame, app, rows[0]);
118
+
119
+ let (headline, description) = match app.mode {
120
+ Mode::Signup => (
121
+ "Create your account",
122
+ "We'll send a confirmation email. You'll need to verify before signing in.",
123
+ ),
124
+ Mode::Signin => ("Good to have you back", "Sign in to your existing account."),
125
+ };
126
+
127
+ frame.render_widget(
128
+ Paragraph::new(headline).style(Style::new().fg(C_INK).bold()),
129
+ rows[2],
130
+ );
131
+ frame.render_widget(
132
+ Paragraph::new(description)
133
+ .style(Style::new().fg(C_MUTED))
134
+ .wrap(Wrap { trim: true }),
135
+ rows[3],
136
+ );
137
+
138
+ render_status(frame, app, rows[5]);
139
+
140
+ // Email
141
+ frame.render_widget(
142
+ Paragraph::new("Email").style(Style::new().fg(C_MUTED)),
143
+ rows[7],
144
+ );
145
+ render_input(
146
+ frame,
147
+ app,
148
+ &app.email,
149
+ Focus::Email,
150
+ "name@company.com",
151
+ rows[8],
152
+ );
153
+
154
+ // Password
155
+ frame.render_widget(
156
+ Paragraph::new("Password").style(Style::new().fg(C_MUTED)),
157
+ rows[10],
158
+ );
159
+ let masked = "•".repeat(app.password.len());
160
+ render_input(
161
+ frame,
162
+ app,
163
+ &masked,
164
+ Focus::Password,
165
+ "Minimum 8 characters",
166
+ rows[11],
167
+ );
168
+
169
+ // Buttons
170
+ let (primary_label, secondary_label) = match app.mode {
171
+ Mode::Signup => ("[ Create account ]", "I already have an account Ctrl+L"),
172
+ Mode::Signin => ("[ Sign in ]", "Create a new account Ctrl+N"),
173
+ };
174
+
175
+ let primary_style = if app.busy {
176
+ Style::new().fg(C_MUTED)
177
+ } else {
178
+ Style::new().fg(C_SURFACE).bg(C_NEON).bold()
179
+ };
180
+
181
+ frame.render_widget(Paragraph::new(primary_label).style(primary_style), rows[13]);
182
+ frame.render_widget(
183
+ Paragraph::new(secondary_label).style(Style::new().fg(C_MUTED)),
184
+ rows[14],
185
+ );
186
+}
187
+
188
+// mode tabs
189
+
190
+fn render_tabs(frame: &mut Frame, app: &App, area: ratatui::layout::Rect) {
191
+ let cols = Layout::horizontal([
192
+ Constraint::Length(19), // signup tab
193
+ Constraint::Length(1), // gap
194
+ Constraint::Length(11), // signin tab
195
+ Constraint::Min(0),
196
+ ])
197
+ .split(area);
198
+
199
+ let active = Style::new().fg(C_SURFACE).bg(C_NEON).bold();
200
+ let inactive = Style::new().fg(C_MUTED).bg(C_SURFACE_STRONG);
201
+
202
+ frame.render_widget(
203
+ Paragraph::new(" Create account ").style(if app.mode == Mode::Signup {
204
+ active
205
+ } else {
206
+ inactive
207
+ }),
208
+ cols[0],
209
+ );
210
+ frame.render_widget(
211
+ Paragraph::new(" Sign in ").style(if app.mode == Mode::Signin {
212
+ active
213
+ } else {
214
+ inactive
215
+ }),
216
+ cols[2],
217
+ );
218
+}
219
+
220
+// input field
221
+
222
+fn render_input(
223
+ frame: &mut Frame,
224
+ app: &App,
225
+ value: &str,
226
+ field: Focus,
227
+ placeholder: &str,
228
+ area: ratatui::layout::Rect,
229
+) {
230
+ let is_focused = app.focus == field;
231
+
232
+ let border_style = if is_focused {
233
+ Style::new().fg(C_NEON)
234
+ } else {
235
+ Style::new().fg(C_LINE)
236
+ };
237
+
238
+ let block = Block::new()
239
+ .borders(Borders::ALL)
240
+ .border_type(BorderType::Rounded)
241
+ .border_style(border_style)
242
+ .style(Style::new().bg(C_SURFACE_STRONG));
243
+
244
+ let inner = block.inner(area);
245
+ frame.render_widget(block, area);
246
+
247
+ if value.is_empty() && !is_focused {
248
+ frame.render_widget(
249
+ Paragraph::new(placeholder).style(Style::new().fg(C_MUTED)),
250
+ inner,
251
+ );
252
+ } else {
253
+ frame.render_widget(Paragraph::new(value).style(Style::new().fg(C_TEXT)), inner);
254
+ if is_focused {
255
+ let cursor_x = (inner.x + value.chars().count() as u16)
256
+ .min(inner.x + inner.width.saturating_sub(1));
257
+ frame.set_cursor_position((cursor_x, inner.y));
258
+ }
259
+ }
260
+}
261
+
262
+// status bar
263
+
264
+fn render_status(frame: &mut Frame, app: &App, area: ratatui::layout::Rect) {
265
+ let (icon, color) = match app.status.tone {
266
+ StatusTone::Neutral => ("●", C_MUTED),
267
+ StatusTone::Success => ("✓", C_NEON),
268
+ StatusTone::Error => ("✗", C_DANGER),
269
+ };
270
+
271
+ let prefix = if app.busy { "⠿ " } else { "" };
272
+
273
+ let line = Line::from(vec![
274
+ Span::styled(format!("{prefix}{icon} "), Style::new().fg(color)),
275
+ Span::styled(&app.status.message, Style::new().fg(color)),
276
+ ]);
277
+
278
+ frame.render_widget(Paragraph::new(line), area);
279
+}
280
+
281
+// session view — shown after sign-in
282
+
283
+fn render_session(frame: &mut Frame, app: &App, profile: &Profile, area: ratatui::layout::Rect) {
284
+ let rows = Layout::vertical([
285
+ Constraint::Length(1), // signed-in badge
286
+ Constraint::Length(1), // spacer
287
+ Constraint::Length(1), // email
288
+ Constraint::Length(1), // spacer
289
+ Constraint::Length(2), // beta message
290
+ Constraint::Length(1), // spacer
291
+ Constraint::Length(1), // status
292
+ Constraint::Length(1), // spacer
293
+ Constraint::Length(1), // sign-out button
294
+ Constraint::Min(0),
295
+ ])
296
+ .split(area);
297
+
298
+ frame.render_widget(
299
+ Paragraph::new("✓ Signed in").style(Style::new().fg(C_NEON).bold()),
300
+ rows[0],
301
+ );
302
+ frame.render_widget(
303
+ Paragraph::new(profile.email.as_str()).style(Style::new().fg(C_TEXT).bold()),
304
+ rows[2],
305
+ );
306
+ frame.render_widget(
307
+ Paragraph::new(
308
+ "We are in private beta. Thanks for your interest.\nEmail work@setoelkahfi.se for questions.",
309
+ )
310
+ .style(Style::new().fg(C_MUTED))
311
+ .wrap(Wrap { trim: true }),
312
+ rows[4],
313
+ );
314
+ render_status(frame, app, rows[6]);
315
+ frame.render_widget(
316
+ Paragraph::new("[ Sign out ] Enter").style(Style::new().fg(C_MUTED)),
317
+ rows[8],
318
+ );
319
+}
320
+
321
+// footer key hints
322
+
323
+fn render_footer(frame: &mut Frame, app: &App, area: ratatui::layout::Rect) {
324
+ let keys: Vec<Span> = if app.profile.is_some() {
325
+ vec![
326
+ Span::styled("Enter", Style::new().fg(C_NEON)),
327
+ Span::styled(" · sign out ", Style::new().fg(C_MUTED)),
328
+ Span::styled("Ctrl+C", Style::new().fg(C_NEON)),
329
+ Span::styled(" · quit", Style::new().fg(C_MUTED)),
330
+ ]
331
+ } else {
332
+ vec![
333
+ Span::styled("Tab", Style::new().fg(C_NEON)),
334
+ Span::styled(" · next field ", Style::new().fg(C_MUTED)),
335
+ Span::styled("Enter", Style::new().fg(C_NEON)),
336
+ Span::styled(" · submit ", Style::new().fg(C_MUTED)),
337
+ Span::styled("Ctrl+L", Style::new().fg(C_NEON)),
338
+ Span::styled(" · sign in ", Style::new().fg(C_MUTED)),
339
+ Span::styled("Ctrl+N", Style::new().fg(C_NEON)),
340
+ Span::styled(" · new account ", Style::new().fg(C_MUTED)),
341
+ Span::styled("Ctrl+C", Style::new().fg(C_NEON)),
342
+ Span::styled(" · quit", Style::new().fg(C_MUTED)),
343
+ ]
344
+ };
345
+
346
+ frame.render_widget(
347
+ Paragraph::new(Line::from(keys)).alignment(Alignment::Center),
348
+ area,
349
+ );
350
+}