@ondeinference / cli / commits / 89bf482

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 +}