nushell on your web browser
nushell wasm terminal

init

ptr.pet bcad46f0

+2
.cargo/config.toml
··· 1 + [target.wasm32-unknown-unknown] 2 + rustflags = ["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals,+simd128"]
+1
.envrc
··· 1 + use flake
+42
.gitignore
··· 1 + node_modules 2 + 3 + # Output 4 + .output 5 + .vercel 6 + .svelte-kit 7 + build 8 + visitcount 9 + bouncecount 10 + legitvisitcount 11 + fakevisitcount 12 + distancetravelled 13 + notes 14 + note 15 + data 16 + 17 + # OS 18 + .DS_Store 19 + Thumbs.db 20 + 21 + # Env 22 + .env 23 + .env.* 24 + !.env.example 25 + !.env.test 26 + 27 + # Vite 28 + vite.config.js.timestamp-* 29 + vite.config.ts.timestamp-* 30 + 31 + # nix 32 + /result 33 + /.direnv 34 + 35 + # scala 36 + target 37 + .metals 38 + .bloop 39 + guestbook/entries 40 + guestbook/entries_size 41 + last_game.json 42 + last_track.json
+2
.npmrc
··· 1 + engine-strict=true 2 + @jsr:registry=https://npm.jsr.io
+6655
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "abnf" 7 + version = "0.13.0" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "087113bd50d9adce24850eed5d0476c7d199d532fce8fab5173650331e09033a" 10 + dependencies = [ 11 + "abnf-core", 12 + "nom", 13 + ] 14 + 15 + [[package]] 16 + name = "abnf-core" 17 + version = "0.5.0" 18 + source = "registry+https://github.com/rust-lang/crates.io-index" 19 + checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" 20 + dependencies = [ 21 + "nom", 22 + ] 23 + 24 + [[package]] 25 + name = "addr2line" 26 + version = "0.25.1" 27 + source = "registry+https://github.com/rust-lang/crates.io-index" 28 + checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 29 + dependencies = [ 30 + "gimli", 31 + ] 32 + 33 + [[package]] 34 + name = "adler2" 35 + version = "2.0.1" 36 + source = "registry+https://github.com/rust-lang/crates.io-index" 37 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 38 + 39 + [[package]] 40 + name = "aho-corasick" 41 + version = "1.1.4" 42 + source = "registry+https://github.com/rust-lang/crates.io-index" 43 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 44 + dependencies = [ 45 + "memchr", 46 + ] 47 + 48 + [[package]] 49 + name = "aliasable" 50 + version = "0.1.3" 51 + source = "registry+https://github.com/rust-lang/crates.io-index" 52 + checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" 53 + 54 + [[package]] 55 + name = "alloc-no-stdlib" 56 + version = "2.0.4" 57 + source = "registry+https://github.com/rust-lang/crates.io-index" 58 + checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 59 + 60 + [[package]] 61 + name = "alloc-stdlib" 62 + version = "0.2.2" 63 + source = "registry+https://github.com/rust-lang/crates.io-index" 64 + checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 65 + dependencies = [ 66 + "alloc-no-stdlib", 67 + ] 68 + 69 + [[package]] 70 + name = "allocator-api2" 71 + version = "0.2.21" 72 + source = "registry+https://github.com/rust-lang/crates.io-index" 73 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 74 + 75 + [[package]] 76 + name = "alphanumeric-sort" 77 + version = "1.5.4" 78 + source = "registry+https://github.com/rust-lang/crates.io-index" 79 + checksum = "ab31f79a61d3c25cae1d6734a386662e5cf1b6ba5a9720c135b609273c058c15" 80 + 81 + [[package]] 82 + name = "android_system_properties" 83 + version = "0.1.5" 84 + source = "registry+https://github.com/rust-lang/crates.io-index" 85 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 86 + dependencies = [ 87 + "libc", 88 + ] 89 + 90 + [[package]] 91 + name = "ansi-str" 92 + version = "0.9.0" 93 + source = "registry+https://github.com/rust-lang/crates.io-index" 94 + checksum = "060de1453b69f46304b28274f382132f4e72c55637cf362920926a70d090890d" 95 + dependencies = [ 96 + "ansitok", 97 + ] 98 + 99 + [[package]] 100 + name = "ansi_term" 101 + version = "0.12.1" 102 + source = "registry+https://github.com/rust-lang/crates.io-index" 103 + checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 104 + dependencies = [ 105 + "winapi", 106 + ] 107 + 108 + [[package]] 109 + name = "ansitok" 110 + version = "0.3.0" 111 + source = "registry+https://github.com/rust-lang/crates.io-index" 112 + checksum = "c0a8acea8c2f1c60f0a92a8cd26bf96ca97db56f10bbcab238bbe0cceba659ee" 113 + dependencies = [ 114 + "nom", 115 + "vte", 116 + ] 117 + 118 + [[package]] 119 + name = "anstream" 120 + version = "0.6.21" 121 + source = "registry+https://github.com/rust-lang/crates.io-index" 122 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 123 + dependencies = [ 124 + "anstyle", 125 + "anstyle-parse", 126 + "anstyle-query", 127 + "anstyle-wincon", 128 + "colorchoice", 129 + "is_terminal_polyfill", 130 + "utf8parse", 131 + ] 132 + 133 + [[package]] 134 + name = "anstyle" 135 + version = "1.0.13" 136 + source = "registry+https://github.com/rust-lang/crates.io-index" 137 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 138 + 139 + [[package]] 140 + name = "anstyle-parse" 141 + version = "0.2.7" 142 + source = "registry+https://github.com/rust-lang/crates.io-index" 143 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 144 + dependencies = [ 145 + "utf8parse", 146 + ] 147 + 148 + [[package]] 149 + name = "anstyle-query" 150 + version = "1.1.5" 151 + source = "registry+https://github.com/rust-lang/crates.io-index" 152 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 153 + dependencies = [ 154 + "windows-sys 0.61.2", 155 + ] 156 + 157 + [[package]] 158 + name = "anstyle-wincon" 159 + version = "3.0.11" 160 + source = "registry+https://github.com/rust-lang/crates.io-index" 161 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 162 + dependencies = [ 163 + "anstyle", 164 + "once_cell_polyfill", 165 + "windows-sys 0.61.2", 166 + ] 167 + 168 + [[package]] 169 + name = "anyhow" 170 + version = "1.0.100" 171 + source = "registry+https://github.com/rust-lang/crates.io-index" 172 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 173 + 174 + [[package]] 175 + name = "arbitrary" 176 + version = "1.4.2" 177 + source = "registry+https://github.com/rust-lang/crates.io-index" 178 + checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" 179 + dependencies = [ 180 + "derive_arbitrary", 181 + ] 182 + 183 + [[package]] 184 + name = "arrayvec" 185 + version = "0.7.6" 186 + source = "registry+https://github.com/rust-lang/crates.io-index" 187 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 188 + 189 + [[package]] 190 + name = "async-compression" 191 + version = "0.4.36" 192 + source = "registry+https://github.com/rust-lang/crates.io-index" 193 + checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" 194 + dependencies = [ 195 + "compression-codecs", 196 + "compression-core", 197 + "futures-core", 198 + "pin-project-lite", 199 + "tokio", 200 + ] 201 + 202 + [[package]] 203 + name = "atoi_simd" 204 + version = "0.16.1" 205 + source = "registry+https://github.com/rust-lang/crates.io-index" 206 + checksum = "c2a49e05797ca52e312a0c658938b7d00693ef037799ef7187678f212d7684cf" 207 + dependencies = [ 208 + "debug_unsafe", 209 + ] 210 + 211 + [[package]] 212 + name = "atomic-polyfill" 213 + version = "1.0.3" 214 + source = "registry+https://github.com/rust-lang/crates.io-index" 215 + checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" 216 + dependencies = [ 217 + "critical-section", 218 + ] 219 + 220 + [[package]] 221 + name = "atomic-waker" 222 + version = "1.1.2" 223 + source = "registry+https://github.com/rust-lang/crates.io-index" 224 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 225 + 226 + [[package]] 227 + name = "autocfg" 228 + version = "1.5.0" 229 + source = "registry+https://github.com/rust-lang/crates.io-index" 230 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 231 + 232 + [[package]] 233 + name = "backtrace" 234 + version = "0.3.76" 235 + source = "registry+https://github.com/rust-lang/crates.io-index" 236 + checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 237 + dependencies = [ 238 + "addr2line", 239 + "cfg-if", 240 + "libc", 241 + "miniz_oxide", 242 + "object", 243 + "rustc-demangle", 244 + "windows-link 0.2.1", 245 + ] 246 + 247 + [[package]] 248 + name = "backtrace-ext" 249 + version = "0.2.1" 250 + source = "registry+https://github.com/rust-lang/crates.io-index" 251 + checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" 252 + dependencies = [ 253 + "backtrace", 254 + ] 255 + 256 + [[package]] 257 + name = "base-x" 258 + version = "0.2.11" 259 + source = "registry+https://github.com/rust-lang/crates.io-index" 260 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 261 + 262 + [[package]] 263 + name = "base16ct" 264 + version = "0.2.0" 265 + source = "registry+https://github.com/rust-lang/crates.io-index" 266 + checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 267 + 268 + [[package]] 269 + name = "base256emoji" 270 + version = "1.0.2" 271 + source = "registry+https://github.com/rust-lang/crates.io-index" 272 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 273 + dependencies = [ 274 + "const-str", 275 + "match-lookup", 276 + ] 277 + 278 + [[package]] 279 + name = "base64" 280 + version = "0.22.1" 281 + source = "registry+https://github.com/rust-lang/crates.io-index" 282 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 283 + 284 + [[package]] 285 + name = "base64ct" 286 + version = "1.8.1" 287 + source = "registry+https://github.com/rust-lang/crates.io-index" 288 + checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" 289 + 290 + [[package]] 291 + name = "bindgen" 292 + version = "0.72.1" 293 + source = "registry+https://github.com/rust-lang/crates.io-index" 294 + checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" 295 + dependencies = [ 296 + "bitflags", 297 + "cexpr", 298 + "clang-sys", 299 + "itertools 0.13.0", 300 + "proc-macro2", 301 + "quote", 302 + "regex", 303 + "rustc-hash", 304 + "shlex", 305 + "syn 2.0.111", 306 + ] 307 + 308 + [[package]] 309 + name = "bit-set" 310 + version = "0.8.0" 311 + source = "registry+https://github.com/rust-lang/crates.io-index" 312 + checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 313 + dependencies = [ 314 + "bit-vec", 315 + ] 316 + 317 + [[package]] 318 + name = "bit-vec" 319 + version = "0.8.0" 320 + source = "registry+https://github.com/rust-lang/crates.io-index" 321 + checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 322 + 323 + [[package]] 324 + name = "bitflags" 325 + version = "2.10.0" 326 + source = "registry+https://github.com/rust-lang/crates.io-index" 327 + checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 328 + 329 + [[package]] 330 + name = "block-buffer" 331 + version = "0.10.4" 332 + source = "registry+https://github.com/rust-lang/crates.io-index" 333 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 334 + dependencies = [ 335 + "generic-array", 336 + ] 337 + 338 + [[package]] 339 + name = "bon" 340 + version = "3.8.1" 341 + source = "registry+https://github.com/rust-lang/crates.io-index" 342 + checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1" 343 + dependencies = [ 344 + "bon-macros", 345 + "rustversion", 346 + ] 347 + 348 + [[package]] 349 + name = "bon-macros" 350 + version = "3.8.1" 351 + source = "registry+https://github.com/rust-lang/crates.io-index" 352 + checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645" 353 + dependencies = [ 354 + "darling", 355 + "ident_case", 356 + "prettyplease", 357 + "proc-macro2", 358 + "quote", 359 + "rustversion", 360 + "syn 2.0.111", 361 + ] 362 + 363 + [[package]] 364 + name = "borsh" 365 + version = "1.6.0" 366 + source = "registry+https://github.com/rust-lang/crates.io-index" 367 + checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" 368 + dependencies = [ 369 + "cfg_aliases", 370 + ] 371 + 372 + [[package]] 373 + name = "bracoxide" 374 + version = "0.1.7" 375 + source = "registry+https://github.com/rust-lang/crates.io-index" 376 + checksum = "f5a4d25760c1b6f53db7257292236bc20da1215a1004ee330b37976eeac3af31" 377 + 378 + [[package]] 379 + name = "brotli" 380 + version = "8.0.2" 381 + source = "registry+https://github.com/rust-lang/crates.io-index" 382 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 383 + dependencies = [ 384 + "alloc-no-stdlib", 385 + "alloc-stdlib", 386 + "brotli-decompressor", 387 + ] 388 + 389 + [[package]] 390 + name = "brotli-decompressor" 391 + version = "5.0.0" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" 394 + dependencies = [ 395 + "alloc-no-stdlib", 396 + "alloc-stdlib", 397 + ] 398 + 399 + [[package]] 400 + name = "bstr" 401 + version = "1.12.1" 402 + source = "registry+https://github.com/rust-lang/crates.io-index" 403 + checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" 404 + dependencies = [ 405 + "memchr", 406 + "regex-automata", 407 + "serde", 408 + ] 409 + 410 + [[package]] 411 + name = "btree-range-map" 412 + version = "0.7.2" 413 + source = "registry+https://github.com/rust-lang/crates.io-index" 414 + checksum = "1be5c9672446d3800bcbcaabaeba121fe22f1fb25700c4562b22faf76d377c33" 415 + dependencies = [ 416 + "btree-slab", 417 + "cc-traits", 418 + "range-traits", 419 + "serde", 420 + "slab", 421 + ] 422 + 423 + [[package]] 424 + name = "btree-slab" 425 + version = "0.6.1" 426 + source = "registry+https://github.com/rust-lang/crates.io-index" 427 + checksum = "7a2b56d3029f075c4fa892428a098425b86cef5c89ae54073137ece416aef13c" 428 + dependencies = [ 429 + "cc-traits", 430 + "slab", 431 + "smallvec", 432 + ] 433 + 434 + [[package]] 435 + name = "buf-trait" 436 + version = "0.4.1" 437 + source = "registry+https://github.com/rust-lang/crates.io-index" 438 + checksum = "21eaafc770e8c073d6c3facafe7617e774305d4954aa6351b9c452eb37ee17b4" 439 + dependencies = [ 440 + "zerocopy 0.7.35", 441 + ] 442 + 443 + [[package]] 444 + name = "bumpalo" 445 + version = "3.19.0" 446 + source = "registry+https://github.com/rust-lang/crates.io-index" 447 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 448 + 449 + [[package]] 450 + name = "bytecount" 451 + version = "0.6.9" 452 + source = "registry+https://github.com/rust-lang/crates.io-index" 453 + checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" 454 + 455 + [[package]] 456 + name = "byteorder" 457 + version = "1.5.0" 458 + source = "registry+https://github.com/rust-lang/crates.io-index" 459 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 460 + 461 + [[package]] 462 + name = "bytes" 463 + version = "1.11.0" 464 + source = "registry+https://github.com/rust-lang/crates.io-index" 465 + checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" 466 + dependencies = [ 467 + "serde", 468 + ] 469 + 470 + [[package]] 471 + name = "bytesize" 472 + version = "2.3.1" 473 + source = "registry+https://github.com/rust-lang/crates.io-index" 474 + checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" 475 + 476 + [[package]] 477 + name = "byteyarn" 478 + version = "0.5.1" 479 + source = "registry+https://github.com/rust-lang/crates.io-index" 480 + checksum = "b93e51d26468a15ea59f8525e0c13dc405db43e644a0b1e6d44346c72cf4cf7b" 481 + dependencies = [ 482 + "buf-trait", 483 + ] 484 + 485 + [[package]] 486 + name = "calamine" 487 + version = "0.28.0" 488 + source = "registry+https://github.com/rust-lang/crates.io-index" 489 + checksum = "15e02a18e79de779a78b0a6ec84a3deed1ff0607dd970a11369f993263f99f1a" 490 + dependencies = [ 491 + "atoi_simd", 492 + "byteorder", 493 + "chrono", 494 + "codepage", 495 + "encoding_rs", 496 + "fast-float2", 497 + "log", 498 + "quick-xml 0.37.5", 499 + "serde", 500 + "zip", 501 + ] 502 + 503 + [[package]] 504 + name = "castaway" 505 + version = "0.2.4" 506 + source = "registry+https://github.com/rust-lang/crates.io-index" 507 + checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" 508 + dependencies = [ 509 + "rustversion", 510 + ] 511 + 512 + [[package]] 513 + name = "cbor4ii" 514 + version = "0.2.14" 515 + source = "registry+https://github.com/rust-lang/crates.io-index" 516 + checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" 517 + dependencies = [ 518 + "serde", 519 + ] 520 + 521 + [[package]] 522 + name = "cc" 523 + version = "1.2.49" 524 + source = "registry+https://github.com/rust-lang/crates.io-index" 525 + checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" 526 + dependencies = [ 527 + "find-msvc-tools", 528 + "shlex", 529 + ] 530 + 531 + [[package]] 532 + name = "cc-traits" 533 + version = "2.0.0" 534 + source = "registry+https://github.com/rust-lang/crates.io-index" 535 + checksum = "060303ef31ef4a522737e1b1ab68c67916f2a787bb2f4f54f383279adba962b5" 536 + dependencies = [ 537 + "slab", 538 + ] 539 + 540 + [[package]] 541 + name = "cexpr" 542 + version = "0.6.0" 543 + source = "registry+https://github.com/rust-lang/crates.io-index" 544 + checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 545 + dependencies = [ 546 + "nom", 547 + ] 548 + 549 + [[package]] 550 + name = "cfg-if" 551 + version = "1.0.4" 552 + source = "registry+https://github.com/rust-lang/crates.io-index" 553 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 554 + 555 + [[package]] 556 + name = "cfg_aliases" 557 + version = "0.2.1" 558 + source = "registry+https://github.com/rust-lang/crates.io-index" 559 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 560 + 561 + [[package]] 562 + name = "chardetng" 563 + version = "0.1.17" 564 + source = "registry+https://github.com/rust-lang/crates.io-index" 565 + checksum = "14b8f0b65b7b08ae3c8187e8d77174de20cb6777864c6b832d8ad365999cf1ea" 566 + dependencies = [ 567 + "cfg-if", 568 + "encoding_rs", 569 + "memchr", 570 + ] 571 + 572 + [[package]] 573 + name = "chrono" 574 + version = "0.4.42" 575 + source = "registry+https://github.com/rust-lang/crates.io-index" 576 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 577 + dependencies = [ 578 + "iana-time-zone", 579 + "js-sys", 580 + "num-traits", 581 + "pure-rust-locales", 582 + "serde", 583 + "wasm-bindgen", 584 + "windows-link 0.2.1", 585 + ] 586 + 587 + [[package]] 588 + name = "chrono-humanize" 589 + version = "0.2.3" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" 592 + dependencies = [ 593 + "chrono", 594 + ] 595 + 596 + [[package]] 597 + name = "chrono-tz" 598 + version = "0.10.4" 599 + source = "registry+https://github.com/rust-lang/crates.io-index" 600 + checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" 601 + dependencies = [ 602 + "chrono", 603 + "phf 0.12.1", 604 + ] 605 + 606 + [[package]] 607 + name = "ciborium" 608 + version = "0.2.2" 609 + source = "registry+https://github.com/rust-lang/crates.io-index" 610 + checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 611 + dependencies = [ 612 + "ciborium-io", 613 + "ciborium-ll", 614 + "serde", 615 + ] 616 + 617 + [[package]] 618 + name = "ciborium-io" 619 + version = "0.2.2" 620 + source = "registry+https://github.com/rust-lang/crates.io-index" 621 + checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 622 + 623 + [[package]] 624 + name = "ciborium-ll" 625 + version = "0.2.2" 626 + source = "registry+https://github.com/rust-lang/crates.io-index" 627 + checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 628 + dependencies = [ 629 + "ciborium-io", 630 + "half", 631 + ] 632 + 633 + [[package]] 634 + name = "cid" 635 + version = "0.11.1" 636 + source = "registry+https://github.com/rust-lang/crates.io-index" 637 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 638 + dependencies = [ 639 + "core2", 640 + "multibase", 641 + "multihash", 642 + "serde", 643 + "serde_bytes", 644 + "unsigned-varint 0.8.0", 645 + ] 646 + 647 + [[package]] 648 + name = "clang-sys" 649 + version = "1.8.1" 650 + source = "registry+https://github.com/rust-lang/crates.io-index" 651 + checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 652 + dependencies = [ 653 + "glob", 654 + "libc", 655 + "libloading", 656 + ] 657 + 658 + [[package]] 659 + name = "clap" 660 + version = "4.5.53" 661 + source = "registry+https://github.com/rust-lang/crates.io-index" 662 + checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" 663 + dependencies = [ 664 + "clap_builder", 665 + ] 666 + 667 + [[package]] 668 + name = "clap_builder" 669 + version = "4.5.53" 670 + source = "registry+https://github.com/rust-lang/crates.io-index" 671 + checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" 672 + dependencies = [ 673 + "anstream", 674 + "anstyle", 675 + "clap_lex", 676 + "strsim", 677 + "terminal_size", 678 + ] 679 + 680 + [[package]] 681 + name = "clap_lex" 682 + version = "0.7.6" 683 + source = "registry+https://github.com/rust-lang/crates.io-index" 684 + checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" 685 + 686 + [[package]] 687 + name = "cobs" 688 + version = "0.3.0" 689 + source = "registry+https://github.com/rust-lang/crates.io-index" 690 + checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 691 + dependencies = [ 692 + "thiserror 2.0.17", 693 + ] 694 + 695 + [[package]] 696 + name = "codepage" 697 + version = "0.1.2" 698 + source = "registry+https://github.com/rust-lang/crates.io-index" 699 + checksum = "48f68d061bc2828ae826206326e61251aca94c1e4a5305cf52d9138639c918b4" 700 + dependencies = [ 701 + "encoding_rs", 702 + ] 703 + 704 + [[package]] 705 + name = "colorchoice" 706 + version = "1.0.4" 707 + source = "registry+https://github.com/rust-lang/crates.io-index" 708 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 709 + 710 + [[package]] 711 + name = "compression-codecs" 712 + version = "0.4.35" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" 715 + dependencies = [ 716 + "compression-core", 717 + "flate2", 718 + "memchr", 719 + ] 720 + 721 + [[package]] 722 + name = "compression-core" 723 + version = "0.4.31" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" 726 + 727 + [[package]] 728 + name = "console" 729 + version = "0.15.11" 730 + source = "registry+https://github.com/rust-lang/crates.io-index" 731 + checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" 732 + dependencies = [ 733 + "encode_unicode", 734 + "libc", 735 + "once_cell", 736 + "unicode-width 0.2.2", 737 + "windows-sys 0.59.0", 738 + ] 739 + 740 + [[package]] 741 + name = "console" 742 + version = "0.16.1" 743 + source = "registry+https://github.com/rust-lang/crates.io-index" 744 + checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" 745 + dependencies = [ 746 + "encode_unicode", 747 + "libc", 748 + "once_cell", 749 + "unicode-width 0.2.2", 750 + "windows-sys 0.61.2", 751 + ] 752 + 753 + [[package]] 754 + name = "console_error_panic_hook" 755 + version = "0.1.7" 756 + source = "registry+https://github.com/rust-lang/crates.io-index" 757 + checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 758 + dependencies = [ 759 + "cfg-if", 760 + "wasm-bindgen", 761 + ] 762 + 763 + [[package]] 764 + name = "const-oid" 765 + version = "0.9.6" 766 + source = "registry+https://github.com/rust-lang/crates.io-index" 767 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 768 + 769 + [[package]] 770 + name = "const-str" 771 + version = "0.4.3" 772 + source = "registry+https://github.com/rust-lang/crates.io-index" 773 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 774 + 775 + [[package]] 776 + name = "const_format" 777 + version = "0.2.35" 778 + source = "registry+https://github.com/rust-lang/crates.io-index" 779 + checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" 780 + dependencies = [ 781 + "const_format_proc_macros", 782 + ] 783 + 784 + [[package]] 785 + name = "const_format_proc_macros" 786 + version = "0.2.34" 787 + source = "registry+https://github.com/rust-lang/crates.io-index" 788 + checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" 789 + dependencies = [ 790 + "proc-macro2", 791 + "quote", 792 + "unicode-xid", 793 + ] 794 + 795 + [[package]] 796 + name = "cordyceps" 797 + version = "0.3.4" 798 + source = "registry+https://github.com/rust-lang/crates.io-index" 799 + checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 800 + dependencies = [ 801 + "loom", 802 + "tracing", 803 + ] 804 + 805 + [[package]] 806 + name = "core-foundation" 807 + version = "0.9.4" 808 + source = "registry+https://github.com/rust-lang/crates.io-index" 809 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 810 + dependencies = [ 811 + "core-foundation-sys", 812 + "libc", 813 + ] 814 + 815 + [[package]] 816 + name = "core-foundation-sys" 817 + version = "0.8.7" 818 + source = "registry+https://github.com/rust-lang/crates.io-index" 819 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 820 + 821 + [[package]] 822 + name = "core2" 823 + version = "0.4.0" 824 + source = "registry+https://github.com/rust-lang/crates.io-index" 825 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 826 + dependencies = [ 827 + "memchr", 828 + ] 829 + 830 + [[package]] 831 + name = "cpufeatures" 832 + version = "0.2.17" 833 + source = "registry+https://github.com/rust-lang/crates.io-index" 834 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 835 + dependencies = [ 836 + "libc", 837 + ] 838 + 839 + [[package]] 840 + name = "crc32fast" 841 + version = "1.5.0" 842 + source = "registry+https://github.com/rust-lang/crates.io-index" 843 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 844 + dependencies = [ 845 + "cfg-if", 846 + ] 847 + 848 + [[package]] 849 + name = "critical-section" 850 + version = "1.2.0" 851 + source = "registry+https://github.com/rust-lang/crates.io-index" 852 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 853 + 854 + [[package]] 855 + name = "crossbeam-channel" 856 + version = "0.5.15" 857 + source = "registry+https://github.com/rust-lang/crates.io-index" 858 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 859 + dependencies = [ 860 + "crossbeam-utils", 861 + ] 862 + 863 + [[package]] 864 + name = "crossbeam-deque" 865 + version = "0.8.6" 866 + source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 868 + dependencies = [ 869 + "crossbeam-epoch", 870 + "crossbeam-utils", 871 + ] 872 + 873 + [[package]] 874 + name = "crossbeam-epoch" 875 + version = "0.9.18" 876 + source = "registry+https://github.com/rust-lang/crates.io-index" 877 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 878 + dependencies = [ 879 + "crossbeam-utils", 880 + ] 881 + 882 + [[package]] 883 + name = "crossbeam-utils" 884 + version = "0.8.21" 885 + source = "registry+https://github.com/rust-lang/crates.io-index" 886 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 887 + 888 + [[package]] 889 + name = "crossterm_winapi" 890 + version = "0.9.1" 891 + source = "registry+https://github.com/rust-lang/crates.io-index" 892 + checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 893 + dependencies = [ 894 + "winapi", 895 + ] 896 + 897 + [[package]] 898 + name = "crunchy" 899 + version = "0.2.4" 900 + source = "registry+https://github.com/rust-lang/crates.io-index" 901 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 902 + 903 + [[package]] 904 + name = "crypto-bigint" 905 + version = "0.5.5" 906 + source = "registry+https://github.com/rust-lang/crates.io-index" 907 + checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 908 + dependencies = [ 909 + "generic-array", 910 + "rand_core 0.6.4", 911 + "subtle", 912 + "zeroize", 913 + ] 914 + 915 + [[package]] 916 + name = "crypto-common" 917 + version = "0.1.6" 918 + source = "registry+https://github.com/rust-lang/crates.io-index" 919 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 920 + dependencies = [ 921 + "generic-array", 922 + "typenum", 923 + ] 924 + 925 + [[package]] 926 + name = "csv" 927 + version = "1.4.0" 928 + source = "registry+https://github.com/rust-lang/crates.io-index" 929 + checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" 930 + dependencies = [ 931 + "csv-core", 932 + "itoa", 933 + "ryu", 934 + "serde_core", 935 + ] 936 + 937 + [[package]] 938 + name = "csv-core" 939 + version = "0.1.13" 940 + source = "registry+https://github.com/rust-lang/crates.io-index" 941 + checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" 942 + dependencies = [ 943 + "memchr", 944 + ] 945 + 946 + [[package]] 947 + name = "curve25519-dalek" 948 + version = "4.1.3" 949 + source = "registry+https://github.com/rust-lang/crates.io-index" 950 + checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 951 + dependencies = [ 952 + "cfg-if", 953 + "cpufeatures", 954 + "curve25519-dalek-derive", 955 + "digest", 956 + "fiat-crypto", 957 + "rustc_version", 958 + "subtle", 959 + "zeroize", 960 + ] 961 + 962 + [[package]] 963 + name = "curve25519-dalek-derive" 964 + version = "0.1.1" 965 + source = "registry+https://github.com/rust-lang/crates.io-index" 966 + checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" 967 + dependencies = [ 968 + "proc-macro2", 969 + "quote", 970 + "syn 2.0.111", 971 + ] 972 + 973 + [[package]] 974 + name = "darling" 975 + version = "0.21.3" 976 + source = "registry+https://github.com/rust-lang/crates.io-index" 977 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 978 + dependencies = [ 979 + "darling_core", 980 + "darling_macro", 981 + ] 982 + 983 + [[package]] 984 + name = "darling_core" 985 + version = "0.21.3" 986 + source = "registry+https://github.com/rust-lang/crates.io-index" 987 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 988 + dependencies = [ 989 + "fnv", 990 + "ident_case", 991 + "proc-macro2", 992 + "quote", 993 + "strsim", 994 + "syn 2.0.111", 995 + ] 996 + 997 + [[package]] 998 + name = "darling_macro" 999 + version = "0.21.3" 1000 + source = "registry+https://github.com/rust-lang/crates.io-index" 1001 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 1002 + dependencies = [ 1003 + "darling_core", 1004 + "quote", 1005 + "syn 2.0.111", 1006 + ] 1007 + 1008 + [[package]] 1009 + name = "dashmap" 1010 + version = "6.1.0" 1011 + source = "registry+https://github.com/rust-lang/crates.io-index" 1012 + checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 1013 + dependencies = [ 1014 + "cfg-if", 1015 + "crossbeam-utils", 1016 + "hashbrown 0.14.5", 1017 + "lock_api", 1018 + "once_cell", 1019 + "parking_lot_core", 1020 + ] 1021 + 1022 + [[package]] 1023 + name = "data-encoding" 1024 + version = "2.9.0" 1025 + source = "registry+https://github.com/rust-lang/crates.io-index" 1026 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 1027 + 1028 + [[package]] 1029 + name = "data-encoding-macro" 1030 + version = "0.1.18" 1031 + source = "registry+https://github.com/rust-lang/crates.io-index" 1032 + checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" 1033 + dependencies = [ 1034 + "data-encoding", 1035 + "data-encoding-macro-internal", 1036 + ] 1037 + 1038 + [[package]] 1039 + name = "data-encoding-macro-internal" 1040 + version = "0.1.16" 1041 + source = "registry+https://github.com/rust-lang/crates.io-index" 1042 + checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" 1043 + dependencies = [ 1044 + "data-encoding", 1045 + "syn 2.0.111", 1046 + ] 1047 + 1048 + [[package]] 1049 + name = "debug_unsafe" 1050 + version = "0.1.3" 1051 + source = "registry+https://github.com/rust-lang/crates.io-index" 1052 + checksum = "85d3cef41d236720ed453e102153a53e4cc3d2fde848c0078a50cf249e8e3e5b" 1053 + 1054 + [[package]] 1055 + name = "der" 1056 + version = "0.7.10" 1057 + source = "registry+https://github.com/rust-lang/crates.io-index" 1058 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 1059 + dependencies = [ 1060 + "const-oid", 1061 + "pem-rfc7468", 1062 + "zeroize", 1063 + ] 1064 + 1065 + [[package]] 1066 + name = "deranged" 1067 + version = "0.5.5" 1068 + source = "registry+https://github.com/rust-lang/crates.io-index" 1069 + checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 1070 + dependencies = [ 1071 + "powerfmt", 1072 + "serde_core", 1073 + ] 1074 + 1075 + [[package]] 1076 + name = "derive_arbitrary" 1077 + version = "1.4.2" 1078 + source = "registry+https://github.com/rust-lang/crates.io-index" 1079 + checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" 1080 + dependencies = [ 1081 + "proc-macro2", 1082 + "quote", 1083 + "syn 2.0.111", 1084 + ] 1085 + 1086 + [[package]] 1087 + name = "derive_more" 1088 + version = "1.0.0" 1089 + source = "registry+https://github.com/rust-lang/crates.io-index" 1090 + checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 1091 + dependencies = [ 1092 + "derive_more-impl", 1093 + ] 1094 + 1095 + [[package]] 1096 + name = "derive_more-impl" 1097 + version = "1.0.0" 1098 + source = "registry+https://github.com/rust-lang/crates.io-index" 1099 + checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 1100 + dependencies = [ 1101 + "proc-macro2", 1102 + "quote", 1103 + "syn 2.0.111", 1104 + "unicode-xid", 1105 + ] 1106 + 1107 + [[package]] 1108 + name = "devicons" 1109 + version = "0.6.12" 1110 + source = "registry+https://github.com/rust-lang/crates.io-index" 1111 + checksum = "830e47e2f330cf4fdd5a958dcef921b9523ffc21ab6713aa5e77ba2cce03904b" 1112 + dependencies = [ 1113 + "lazy_static", 1114 + ] 1115 + 1116 + [[package]] 1117 + name = "dialoguer" 1118 + version = "0.11.0" 1119 + source = "registry+https://github.com/rust-lang/crates.io-index" 1120 + checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" 1121 + dependencies = [ 1122 + "console 0.15.11", 1123 + "fuzzy-matcher", 1124 + "shell-words", 1125 + "thiserror 1.0.69", 1126 + ] 1127 + 1128 + [[package]] 1129 + name = "diatomic-waker" 1130 + version = "0.2.3" 1131 + source = "registry+https://github.com/rust-lang/crates.io-index" 1132 + checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 1133 + 1134 + [[package]] 1135 + name = "digest" 1136 + version = "0.10.7" 1137 + source = "registry+https://github.com/rust-lang/crates.io-index" 1138 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1139 + dependencies = [ 1140 + "block-buffer", 1141 + "const-oid", 1142 + "crypto-common", 1143 + "subtle", 1144 + ] 1145 + 1146 + [[package]] 1147 + name = "dirs" 1148 + version = "6.0.0" 1149 + source = "registry+https://github.com/rust-lang/crates.io-index" 1150 + checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" 1151 + dependencies = [ 1152 + "dirs-sys", 1153 + ] 1154 + 1155 + [[package]] 1156 + name = "dirs-sys" 1157 + version = "0.5.0" 1158 + source = "registry+https://github.com/rust-lang/crates.io-index" 1159 + checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 1160 + dependencies = [ 1161 + "libc", 1162 + "option-ext", 1163 + "redox_users", 1164 + "windows-sys 0.61.2", 1165 + ] 1166 + 1167 + [[package]] 1168 + name = "displaydoc" 1169 + version = "0.2.5" 1170 + source = "registry+https://github.com/rust-lang/crates.io-index" 1171 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 1172 + dependencies = [ 1173 + "proc-macro2", 1174 + "quote", 1175 + "syn 2.0.111", 1176 + ] 1177 + 1178 + [[package]] 1179 + name = "dtparse" 1180 + version = "2.0.1" 1181 + source = "registry+https://github.com/rust-lang/crates.io-index" 1182 + checksum = "23fb403c0926d35af2cc54d961bc2696a10d40725c08360ef69db04a4c201fd7" 1183 + dependencies = [ 1184 + "chrono", 1185 + "lazy_static", 1186 + "num-traits", 1187 + "rust_decimal", 1188 + ] 1189 + 1190 + [[package]] 1191 + name = "dyn-clone" 1192 + version = "1.0.20" 1193 + source = "registry+https://github.com/rust-lang/crates.io-index" 1194 + checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 1195 + 1196 + [[package]] 1197 + name = "ecdsa" 1198 + version = "0.16.9" 1199 + source = "registry+https://github.com/rust-lang/crates.io-index" 1200 + checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 1201 + dependencies = [ 1202 + "der", 1203 + "digest", 1204 + "elliptic-curve", 1205 + "rfc6979", 1206 + "signature", 1207 + "spki", 1208 + ] 1209 + 1210 + [[package]] 1211 + name = "ed25519" 1212 + version = "2.2.3" 1213 + source = "registry+https://github.com/rust-lang/crates.io-index" 1214 + checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" 1215 + dependencies = [ 1216 + "pkcs8", 1217 + "signature", 1218 + ] 1219 + 1220 + [[package]] 1221 + name = "ed25519-dalek" 1222 + version = "2.2.0" 1223 + source = "registry+https://github.com/rust-lang/crates.io-index" 1224 + checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" 1225 + dependencies = [ 1226 + "curve25519-dalek", 1227 + "ed25519", 1228 + "rand_core 0.6.4", 1229 + "serde", 1230 + "sha2", 1231 + "subtle", 1232 + "zeroize", 1233 + ] 1234 + 1235 + [[package]] 1236 + name = "either" 1237 + version = "1.15.0" 1238 + source = "registry+https://github.com/rust-lang/crates.io-index" 1239 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 1240 + 1241 + [[package]] 1242 + name = "elliptic-curve" 1243 + version = "0.13.8" 1244 + source = "registry+https://github.com/rust-lang/crates.io-index" 1245 + checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 1246 + dependencies = [ 1247 + "base16ct", 1248 + "crypto-bigint", 1249 + "digest", 1250 + "ff", 1251 + "generic-array", 1252 + "group", 1253 + "pem-rfc7468", 1254 + "pkcs8", 1255 + "rand_core 0.6.4", 1256 + "sec1", 1257 + "subtle", 1258 + "zeroize", 1259 + ] 1260 + 1261 + [[package]] 1262 + name = "embedded-io" 1263 + version = "0.4.0" 1264 + source = "registry+https://github.com/rust-lang/crates.io-index" 1265 + checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 1266 + 1267 + [[package]] 1268 + name = "embedded-io" 1269 + version = "0.6.1" 1270 + source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 1272 + 1273 + [[package]] 1274 + name = "encode_unicode" 1275 + version = "1.0.0" 1276 + source = "registry+https://github.com/rust-lang/crates.io-index" 1277 + checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 1278 + 1279 + [[package]] 1280 + name = "encoding_rs" 1281 + version = "0.8.35" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 1284 + dependencies = [ 1285 + "cfg-if", 1286 + ] 1287 + 1288 + [[package]] 1289 + name = "equivalent" 1290 + version = "1.0.2" 1291 + source = "registry+https://github.com/rust-lang/crates.io-index" 1292 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 1293 + 1294 + [[package]] 1295 + name = "erased-serde" 1296 + version = "0.4.9" 1297 + source = "registry+https://github.com/rust-lang/crates.io-index" 1298 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 1299 + dependencies = [ 1300 + "serde", 1301 + "serde_core", 1302 + "typeid", 1303 + ] 1304 + 1305 + [[package]] 1306 + name = "errno" 1307 + version = "0.3.14" 1308 + source = "registry+https://github.com/rust-lang/crates.io-index" 1309 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 1310 + dependencies = [ 1311 + "libc", 1312 + "windows-sys 0.61.2", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "fancy-regex" 1317 + version = "0.16.2" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" 1320 + dependencies = [ 1321 + "bit-set", 1322 + "regex-automata", 1323 + "regex-syntax", 1324 + ] 1325 + 1326 + [[package]] 1327 + name = "fast-float2" 1328 + version = "0.2.3" 1329 + source = "registry+https://github.com/rust-lang/crates.io-index" 1330 + checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" 1331 + 1332 + [[package]] 1333 + name = "fastrand" 1334 + version = "2.3.0" 1335 + source = "registry+https://github.com/rust-lang/crates.io-index" 1336 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1337 + 1338 + [[package]] 1339 + name = "faunu" 1340 + version = "0.1.0" 1341 + dependencies = [ 1342 + "ansi_term", 1343 + "anyhow", 1344 + "console_error_panic_hook", 1345 + "futures", 1346 + "getrandom 0.3.4", 1347 + "jacquard", 1348 + "jacquard-repo", 1349 + "js-sys", 1350 + "miette", 1351 + "nu-cmd-extra", 1352 + "nu-cmd-lang", 1353 + "nu-command", 1354 + "nu-engine", 1355 + "nu-parser", 1356 + "nu-protocol", 1357 + "rapidhash", 1358 + "reqwest", 1359 + "scc", 1360 + "serde", 1361 + "serde_ipld_dagcbor", 1362 + "serde_json", 1363 + "url", 1364 + "vfs", 1365 + "wasm-bindgen", 1366 + "wasm-bindgen-futures", 1367 + "web-sys", 1368 + ] 1369 + 1370 + [[package]] 1371 + name = "ff" 1372 + version = "0.13.1" 1373 + source = "registry+https://github.com/rust-lang/crates.io-index" 1374 + checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 1375 + dependencies = [ 1376 + "rand_core 0.6.4", 1377 + "subtle", 1378 + ] 1379 + 1380 + [[package]] 1381 + name = "fiat-crypto" 1382 + version = "0.2.9" 1383 + source = "registry+https://github.com/rust-lang/crates.io-index" 1384 + checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 1385 + 1386 + [[package]] 1387 + name = "filesize" 1388 + version = "0.2.0" 1389 + source = "registry+https://github.com/rust-lang/crates.io-index" 1390 + checksum = "12d741e2415d4e2e5bd1c1d00409d1a8865a57892c2d689b504365655d237d43" 1391 + dependencies = [ 1392 + "winapi", 1393 + ] 1394 + 1395 + [[package]] 1396 + name = "filetime" 1397 + version = "0.2.26" 1398 + source = "registry+https://github.com/rust-lang/crates.io-index" 1399 + checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" 1400 + dependencies = [ 1401 + "cfg-if", 1402 + "libc", 1403 + "libredox", 1404 + "windows-sys 0.60.2", 1405 + ] 1406 + 1407 + [[package]] 1408 + name = "find-msvc-tools" 1409 + version = "0.1.5" 1410 + source = "registry+https://github.com/rust-lang/crates.io-index" 1411 + checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" 1412 + 1413 + [[package]] 1414 + name = "flate2" 1415 + version = "1.1.5" 1416 + source = "registry+https://github.com/rust-lang/crates.io-index" 1417 + checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" 1418 + dependencies = [ 1419 + "crc32fast", 1420 + "libz-rs-sys", 1421 + "miniz_oxide", 1422 + ] 1423 + 1424 + [[package]] 1425 + name = "fluent" 1426 + version = "0.17.0" 1427 + source = "registry+https://github.com/rust-lang/crates.io-index" 1428 + checksum = "8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477" 1429 + dependencies = [ 1430 + "fluent-bundle", 1431 + "unic-langid", 1432 + ] 1433 + 1434 + [[package]] 1435 + name = "fluent-bundle" 1436 + version = "0.16.0" 1437 + source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" 1439 + dependencies = [ 1440 + "fluent-langneg", 1441 + "fluent-syntax", 1442 + "intl-memoizer", 1443 + "intl_pluralrules", 1444 + "rustc-hash", 1445 + "self_cell", 1446 + "smallvec", 1447 + "unic-langid", 1448 + ] 1449 + 1450 + [[package]] 1451 + name = "fluent-langneg" 1452 + version = "0.13.1" 1453 + source = "registry+https://github.com/rust-lang/crates.io-index" 1454 + checksum = "7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0" 1455 + dependencies = [ 1456 + "unic-langid", 1457 + ] 1458 + 1459 + [[package]] 1460 + name = "fluent-syntax" 1461 + version = "0.12.0" 1462 + source = "registry+https://github.com/rust-lang/crates.io-index" 1463 + checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" 1464 + dependencies = [ 1465 + "memchr", 1466 + "thiserror 2.0.17", 1467 + ] 1468 + 1469 + [[package]] 1470 + name = "fnv" 1471 + version = "1.0.7" 1472 + source = "registry+https://github.com/rust-lang/crates.io-index" 1473 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1474 + 1475 + [[package]] 1476 + name = "foldhash" 1477 + version = "0.1.5" 1478 + source = "registry+https://github.com/rust-lang/crates.io-index" 1479 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1480 + 1481 + [[package]] 1482 + name = "form_urlencoded" 1483 + version = "1.2.2" 1484 + source = "registry+https://github.com/rust-lang/crates.io-index" 1485 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1486 + dependencies = [ 1487 + "percent-encoding", 1488 + ] 1489 + 1490 + [[package]] 1491 + name = "futf" 1492 + version = "0.1.5" 1493 + source = "registry+https://github.com/rust-lang/crates.io-index" 1494 + checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 1495 + dependencies = [ 1496 + "mac", 1497 + "new_debug_unreachable", 1498 + ] 1499 + 1500 + [[package]] 1501 + name = "futures" 1502 + version = "0.3.31" 1503 + source = "registry+https://github.com/rust-lang/crates.io-index" 1504 + checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 1505 + dependencies = [ 1506 + "futures-channel", 1507 + "futures-core", 1508 + "futures-executor", 1509 + "futures-io", 1510 + "futures-sink", 1511 + "futures-task", 1512 + "futures-util", 1513 + ] 1514 + 1515 + [[package]] 1516 + name = "futures-buffered" 1517 + version = "0.2.12" 1518 + source = "registry+https://github.com/rust-lang/crates.io-index" 1519 + checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" 1520 + dependencies = [ 1521 + "cordyceps", 1522 + "diatomic-waker", 1523 + "futures-core", 1524 + "pin-project-lite", 1525 + "spin 0.10.0", 1526 + ] 1527 + 1528 + [[package]] 1529 + name = "futures-channel" 1530 + version = "0.3.31" 1531 + source = "registry+https://github.com/rust-lang/crates.io-index" 1532 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1533 + dependencies = [ 1534 + "futures-core", 1535 + "futures-sink", 1536 + ] 1537 + 1538 + [[package]] 1539 + name = "futures-core" 1540 + version = "0.3.31" 1541 + source = "registry+https://github.com/rust-lang/crates.io-index" 1542 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1543 + 1544 + [[package]] 1545 + name = "futures-executor" 1546 + version = "0.3.31" 1547 + source = "registry+https://github.com/rust-lang/crates.io-index" 1548 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1549 + dependencies = [ 1550 + "futures-core", 1551 + "futures-task", 1552 + "futures-util", 1553 + ] 1554 + 1555 + [[package]] 1556 + name = "futures-io" 1557 + version = "0.3.31" 1558 + source = "registry+https://github.com/rust-lang/crates.io-index" 1559 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1560 + 1561 + [[package]] 1562 + name = "futures-lite" 1563 + version = "2.6.1" 1564 + source = "registry+https://github.com/rust-lang/crates.io-index" 1565 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1566 + dependencies = [ 1567 + "fastrand", 1568 + "futures-core", 1569 + "futures-io", 1570 + "parking", 1571 + "pin-project-lite", 1572 + ] 1573 + 1574 + [[package]] 1575 + name = "futures-macro" 1576 + version = "0.3.31" 1577 + source = "registry+https://github.com/rust-lang/crates.io-index" 1578 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1579 + dependencies = [ 1580 + "proc-macro2", 1581 + "quote", 1582 + "syn 2.0.111", 1583 + ] 1584 + 1585 + [[package]] 1586 + name = "futures-sink" 1587 + version = "0.3.31" 1588 + source = "registry+https://github.com/rust-lang/crates.io-index" 1589 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1590 + 1591 + [[package]] 1592 + name = "futures-task" 1593 + version = "0.3.31" 1594 + source = "registry+https://github.com/rust-lang/crates.io-index" 1595 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1596 + 1597 + [[package]] 1598 + name = "futures-util" 1599 + version = "0.3.31" 1600 + source = "registry+https://github.com/rust-lang/crates.io-index" 1601 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1602 + dependencies = [ 1603 + "futures-channel", 1604 + "futures-core", 1605 + "futures-io", 1606 + "futures-macro", 1607 + "futures-sink", 1608 + "futures-task", 1609 + "memchr", 1610 + "pin-project-lite", 1611 + "pin-utils", 1612 + "slab", 1613 + ] 1614 + 1615 + [[package]] 1616 + name = "fuzzy-matcher" 1617 + version = "0.3.7" 1618 + source = "registry+https://github.com/rust-lang/crates.io-index" 1619 + checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" 1620 + dependencies = [ 1621 + "thread_local", 1622 + ] 1623 + 1624 + [[package]] 1625 + name = "generator" 1626 + version = "0.8.7" 1627 + source = "registry+https://github.com/rust-lang/crates.io-index" 1628 + checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" 1629 + dependencies = [ 1630 + "cc", 1631 + "cfg-if", 1632 + "libc", 1633 + "log", 1634 + "rustversion", 1635 + "windows 0.61.3", 1636 + ] 1637 + 1638 + [[package]] 1639 + name = "generic-array" 1640 + version = "0.14.9" 1641 + source = "registry+https://github.com/rust-lang/crates.io-index" 1642 + checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 1643 + dependencies = [ 1644 + "typenum", 1645 + "version_check", 1646 + "zeroize", 1647 + ] 1648 + 1649 + [[package]] 1650 + name = "getrandom" 1651 + version = "0.2.16" 1652 + source = "registry+https://github.com/rust-lang/crates.io-index" 1653 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 1654 + dependencies = [ 1655 + "cfg-if", 1656 + "js-sys", 1657 + "libc", 1658 + "wasi", 1659 + "wasm-bindgen", 1660 + ] 1661 + 1662 + [[package]] 1663 + name = "getrandom" 1664 + version = "0.3.4" 1665 + source = "registry+https://github.com/rust-lang/crates.io-index" 1666 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1667 + dependencies = [ 1668 + "cfg-if", 1669 + "js-sys", 1670 + "libc", 1671 + "r-efi", 1672 + "wasip2", 1673 + "wasm-bindgen", 1674 + ] 1675 + 1676 + [[package]] 1677 + name = "gimli" 1678 + version = "0.32.3" 1679 + source = "registry+https://github.com/rust-lang/crates.io-index" 1680 + checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 1681 + 1682 + [[package]] 1683 + name = "glob" 1684 + version = "0.3.3" 1685 + source = "registry+https://github.com/rust-lang/crates.io-index" 1686 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1687 + 1688 + [[package]] 1689 + name = "gloo-storage" 1690 + version = "0.3.0" 1691 + source = "registry+https://github.com/rust-lang/crates.io-index" 1692 + checksum = "fbc8031e8c92758af912f9bc08fbbadd3c6f3cfcbf6b64cdf3d6a81f0139277a" 1693 + dependencies = [ 1694 + "gloo-utils", 1695 + "js-sys", 1696 + "serde", 1697 + "serde_json", 1698 + "thiserror 1.0.69", 1699 + "wasm-bindgen", 1700 + "web-sys", 1701 + ] 1702 + 1703 + [[package]] 1704 + name = "gloo-utils" 1705 + version = "0.2.0" 1706 + source = "registry+https://github.com/rust-lang/crates.io-index" 1707 + checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" 1708 + dependencies = [ 1709 + "js-sys", 1710 + "serde", 1711 + "serde_json", 1712 + "wasm-bindgen", 1713 + "web-sys", 1714 + ] 1715 + 1716 + [[package]] 1717 + name = "group" 1718 + version = "0.13.0" 1719 + source = "registry+https://github.com/rust-lang/crates.io-index" 1720 + checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1721 + dependencies = [ 1722 + "ff", 1723 + "rand_core 0.6.4", 1724 + "subtle", 1725 + ] 1726 + 1727 + [[package]] 1728 + name = "h2" 1729 + version = "0.4.12" 1730 + source = "registry+https://github.com/rust-lang/crates.io-index" 1731 + checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 1732 + dependencies = [ 1733 + "atomic-waker", 1734 + "bytes", 1735 + "fnv", 1736 + "futures-core", 1737 + "futures-sink", 1738 + "http", 1739 + "indexmap 2.12.1", 1740 + "slab", 1741 + "tokio", 1742 + "tokio-util", 1743 + "tracing", 1744 + ] 1745 + 1746 + [[package]] 1747 + name = "half" 1748 + version = "2.7.1" 1749 + source = "registry+https://github.com/rust-lang/crates.io-index" 1750 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1751 + dependencies = [ 1752 + "cfg-if", 1753 + "crunchy", 1754 + "zerocopy 0.8.31", 1755 + ] 1756 + 1757 + [[package]] 1758 + name = "hash32" 1759 + version = "0.2.1" 1760 + source = "registry+https://github.com/rust-lang/crates.io-index" 1761 + checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 1762 + dependencies = [ 1763 + "byteorder", 1764 + ] 1765 + 1766 + [[package]] 1767 + name = "hashbrown" 1768 + version = "0.12.3" 1769 + source = "registry+https://github.com/rust-lang/crates.io-index" 1770 + checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1771 + 1772 + [[package]] 1773 + name = "hashbrown" 1774 + version = "0.14.5" 1775 + source = "registry+https://github.com/rust-lang/crates.io-index" 1776 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1777 + 1778 + [[package]] 1779 + name = "hashbrown" 1780 + version = "0.15.5" 1781 + source = "registry+https://github.com/rust-lang/crates.io-index" 1782 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1783 + dependencies = [ 1784 + "allocator-api2", 1785 + "equivalent", 1786 + "foldhash", 1787 + ] 1788 + 1789 + [[package]] 1790 + name = "hashbrown" 1791 + version = "0.16.1" 1792 + source = "registry+https://github.com/rust-lang/crates.io-index" 1793 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 1794 + 1795 + [[package]] 1796 + name = "heapless" 1797 + version = "0.7.17" 1798 + source = "registry+https://github.com/rust-lang/crates.io-index" 1799 + checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" 1800 + dependencies = [ 1801 + "atomic-polyfill", 1802 + "hash32", 1803 + "rustc_version", 1804 + "serde", 1805 + "spin 0.9.8", 1806 + "stable_deref_trait", 1807 + ] 1808 + 1809 + [[package]] 1810 + name = "heck" 1811 + version = "0.4.1" 1812 + source = "registry+https://github.com/rust-lang/crates.io-index" 1813 + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1814 + 1815 + [[package]] 1816 + name = "heck" 1817 + version = "0.5.0" 1818 + source = "registry+https://github.com/rust-lang/crates.io-index" 1819 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1820 + 1821 + [[package]] 1822 + name = "hex" 1823 + version = "0.4.3" 1824 + source = "registry+https://github.com/rust-lang/crates.io-index" 1825 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1826 + 1827 + [[package]] 1828 + name = "hex_fmt" 1829 + version = "0.3.0" 1830 + source = "registry+https://github.com/rust-lang/crates.io-index" 1831 + checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" 1832 + 1833 + [[package]] 1834 + name = "hmac" 1835 + version = "0.12.1" 1836 + source = "registry+https://github.com/rust-lang/crates.io-index" 1837 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1838 + dependencies = [ 1839 + "digest", 1840 + ] 1841 + 1842 + [[package]] 1843 + name = "html5ever" 1844 + version = "0.27.0" 1845 + source = "registry+https://github.com/rust-lang/crates.io-index" 1846 + checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" 1847 + dependencies = [ 1848 + "log", 1849 + "mac", 1850 + "markup5ever", 1851 + "proc-macro2", 1852 + "quote", 1853 + "syn 2.0.111", 1854 + ] 1855 + 1856 + [[package]] 1857 + name = "http" 1858 + version = "1.4.0" 1859 + source = "registry+https://github.com/rust-lang/crates.io-index" 1860 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 1861 + dependencies = [ 1862 + "bytes", 1863 + "itoa", 1864 + ] 1865 + 1866 + [[package]] 1867 + name = "http-body" 1868 + version = "1.0.1" 1869 + source = "registry+https://github.com/rust-lang/crates.io-index" 1870 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1871 + dependencies = [ 1872 + "bytes", 1873 + "http", 1874 + ] 1875 + 1876 + [[package]] 1877 + name = "http-body-util" 1878 + version = "0.1.3" 1879 + source = "registry+https://github.com/rust-lang/crates.io-index" 1880 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1881 + dependencies = [ 1882 + "bytes", 1883 + "futures-core", 1884 + "http", 1885 + "http-body", 1886 + "pin-project-lite", 1887 + ] 1888 + 1889 + [[package]] 1890 + name = "httparse" 1891 + version = "1.10.1" 1892 + source = "registry+https://github.com/rust-lang/crates.io-index" 1893 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1894 + 1895 + [[package]] 1896 + name = "human-date-parser" 1897 + version = "0.3.1" 1898 + source = "registry+https://github.com/rust-lang/crates.io-index" 1899 + checksum = "406f83c56de4b2c9183be52ae9a4fefa22c0e0c3d3d7ef80be26eaee11c7110e" 1900 + dependencies = [ 1901 + "chrono", 1902 + "pest", 1903 + "pest_consume", 1904 + "pest_derive", 1905 + "thiserror 1.0.69", 1906 + ] 1907 + 1908 + [[package]] 1909 + name = "hyper" 1910 + version = "1.8.1" 1911 + source = "registry+https://github.com/rust-lang/crates.io-index" 1912 + checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 1913 + dependencies = [ 1914 + "atomic-waker", 1915 + "bytes", 1916 + "futures-channel", 1917 + "futures-core", 1918 + "h2", 1919 + "http", 1920 + "http-body", 1921 + "httparse", 1922 + "itoa", 1923 + "pin-project-lite", 1924 + "pin-utils", 1925 + "smallvec", 1926 + "tokio", 1927 + "want", 1928 + ] 1929 + 1930 + [[package]] 1931 + name = "hyper-rustls" 1932 + version = "0.27.7" 1933 + source = "registry+https://github.com/rust-lang/crates.io-index" 1934 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 1935 + dependencies = [ 1936 + "http", 1937 + "hyper", 1938 + "hyper-util", 1939 + "rustls", 1940 + "rustls-pki-types", 1941 + "tokio", 1942 + "tokio-rustls", 1943 + "tower-service", 1944 + "webpki-roots", 1945 + ] 1946 + 1947 + [[package]] 1948 + name = "hyper-util" 1949 + version = "0.1.19" 1950 + source = "registry+https://github.com/rust-lang/crates.io-index" 1951 + checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" 1952 + dependencies = [ 1953 + "base64", 1954 + "bytes", 1955 + "futures-channel", 1956 + "futures-core", 1957 + "futures-util", 1958 + "http", 1959 + "http-body", 1960 + "hyper", 1961 + "ipnet", 1962 + "libc", 1963 + "percent-encoding", 1964 + "pin-project-lite", 1965 + "socket2", 1966 + "system-configuration", 1967 + "tokio", 1968 + "tower-service", 1969 + "tracing", 1970 + "windows-registry", 1971 + ] 1972 + 1973 + [[package]] 1974 + name = "iana-time-zone" 1975 + version = "0.1.64" 1976 + source = "registry+https://github.com/rust-lang/crates.io-index" 1977 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1978 + dependencies = [ 1979 + "android_system_properties", 1980 + "core-foundation-sys", 1981 + "iana-time-zone-haiku", 1982 + "js-sys", 1983 + "log", 1984 + "wasm-bindgen", 1985 + "windows-core 0.62.2", 1986 + ] 1987 + 1988 + [[package]] 1989 + name = "iana-time-zone-haiku" 1990 + version = "0.1.2" 1991 + source = "registry+https://github.com/rust-lang/crates.io-index" 1992 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1993 + dependencies = [ 1994 + "cc", 1995 + ] 1996 + 1997 + [[package]] 1998 + name = "icu_collections" 1999 + version = "2.1.1" 2000 + source = "registry+https://github.com/rust-lang/crates.io-index" 2001 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 2002 + dependencies = [ 2003 + "displaydoc", 2004 + "potential_utf", 2005 + "yoke", 2006 + "zerofrom", 2007 + "zerovec", 2008 + ] 2009 + 2010 + [[package]] 2011 + name = "icu_locale_core" 2012 + version = "2.1.1" 2013 + source = "registry+https://github.com/rust-lang/crates.io-index" 2014 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 2015 + dependencies = [ 2016 + "displaydoc", 2017 + "litemap", 2018 + "tinystr", 2019 + "writeable", 2020 + "zerovec", 2021 + ] 2022 + 2023 + [[package]] 2024 + name = "icu_normalizer" 2025 + version = "2.1.1" 2026 + source = "registry+https://github.com/rust-lang/crates.io-index" 2027 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 2028 + dependencies = [ 2029 + "icu_collections", 2030 + "icu_normalizer_data", 2031 + "icu_properties", 2032 + "icu_provider", 2033 + "smallvec", 2034 + "zerovec", 2035 + ] 2036 + 2037 + [[package]] 2038 + name = "icu_normalizer_data" 2039 + version = "2.1.1" 2040 + source = "registry+https://github.com/rust-lang/crates.io-index" 2041 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 2042 + 2043 + [[package]] 2044 + name = "icu_properties" 2045 + version = "2.1.2" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 2048 + dependencies = [ 2049 + "icu_collections", 2050 + "icu_locale_core", 2051 + "icu_properties_data", 2052 + "icu_provider", 2053 + "zerotrie", 2054 + "zerovec", 2055 + ] 2056 + 2057 + [[package]] 2058 + name = "icu_properties_data" 2059 + version = "2.1.2" 2060 + source = "registry+https://github.com/rust-lang/crates.io-index" 2061 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 2062 + 2063 + [[package]] 2064 + name = "icu_provider" 2065 + version = "2.1.1" 2066 + source = "registry+https://github.com/rust-lang/crates.io-index" 2067 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 2068 + dependencies = [ 2069 + "displaydoc", 2070 + "icu_locale_core", 2071 + "writeable", 2072 + "yoke", 2073 + "zerofrom", 2074 + "zerotrie", 2075 + "zerovec", 2076 + ] 2077 + 2078 + [[package]] 2079 + name = "ident_case" 2080 + version = "1.0.1" 2081 + source = "registry+https://github.com/rust-lang/crates.io-index" 2082 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 2083 + 2084 + [[package]] 2085 + name = "idna" 2086 + version = "1.1.0" 2087 + source = "registry+https://github.com/rust-lang/crates.io-index" 2088 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 2089 + dependencies = [ 2090 + "idna_adapter", 2091 + "smallvec", 2092 + "utf8_iter", 2093 + ] 2094 + 2095 + [[package]] 2096 + name = "idna_adapter" 2097 + version = "1.2.1" 2098 + source = "registry+https://github.com/rust-lang/crates.io-index" 2099 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 2100 + dependencies = [ 2101 + "icu_normalizer", 2102 + "icu_properties", 2103 + ] 2104 + 2105 + [[package]] 2106 + name = "indexmap" 2107 + version = "1.9.3" 2108 + source = "registry+https://github.com/rust-lang/crates.io-index" 2109 + checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 2110 + dependencies = [ 2111 + "autocfg", 2112 + "hashbrown 0.12.3", 2113 + "serde", 2114 + ] 2115 + 2116 + [[package]] 2117 + name = "indexmap" 2118 + version = "2.12.1" 2119 + source = "registry+https://github.com/rust-lang/crates.io-index" 2120 + checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" 2121 + dependencies = [ 2122 + "equivalent", 2123 + "hashbrown 0.16.1", 2124 + "serde", 2125 + "serde_core", 2126 + ] 2127 + 2128 + [[package]] 2129 + name = "indicatif" 2130 + version = "0.18.3" 2131 + source = "registry+https://github.com/rust-lang/crates.io-index" 2132 + checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" 2133 + dependencies = [ 2134 + "console 0.16.1", 2135 + "portable-atomic", 2136 + "unicode-width 0.2.2", 2137 + "unit-prefix", 2138 + "web-time", 2139 + ] 2140 + 2141 + [[package]] 2142 + name = "indoc" 2143 + version = "2.0.7" 2144 + source = "registry+https://github.com/rust-lang/crates.io-index" 2145 + checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" 2146 + dependencies = [ 2147 + "rustversion", 2148 + ] 2149 + 2150 + [[package]] 2151 + name = "intl-memoizer" 2152 + version = "0.5.3" 2153 + source = "registry+https://github.com/rust-lang/crates.io-index" 2154 + checksum = "310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f" 2155 + dependencies = [ 2156 + "type-map", 2157 + "unic-langid", 2158 + ] 2159 + 2160 + [[package]] 2161 + name = "intl_pluralrules" 2162 + version = "7.0.2" 2163 + source = "registry+https://github.com/rust-lang/crates.io-index" 2164 + checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" 2165 + dependencies = [ 2166 + "unic-langid", 2167 + ] 2168 + 2169 + [[package]] 2170 + name = "inventory" 2171 + version = "0.3.21" 2172 + source = "registry+https://github.com/rust-lang/crates.io-index" 2173 + checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" 2174 + dependencies = [ 2175 + "rustversion", 2176 + ] 2177 + 2178 + [[package]] 2179 + name = "ipld-core" 2180 + version = "0.4.2" 2181 + source = "registry+https://github.com/rust-lang/crates.io-index" 2182 + checksum = "104718b1cc124d92a6d01ca9c9258a7df311405debb3408c445a36452f9bf8db" 2183 + dependencies = [ 2184 + "cid", 2185 + "serde", 2186 + "serde_bytes", 2187 + ] 2188 + 2189 + [[package]] 2190 + name = "ipnet" 2191 + version = "2.11.0" 2192 + source = "registry+https://github.com/rust-lang/crates.io-index" 2193 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 2194 + 2195 + [[package]] 2196 + name = "iri-string" 2197 + version = "0.7.9" 2198 + source = "registry+https://github.com/rust-lang/crates.io-index" 2199 + checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" 2200 + dependencies = [ 2201 + "memchr", 2202 + "serde", 2203 + ] 2204 + 2205 + [[package]] 2206 + name = "iroh-car" 2207 + version = "0.5.1" 2208 + source = "registry+https://github.com/rust-lang/crates.io-index" 2209 + checksum = "cb7f8cd4cb9aa083fba8b52e921764252d0b4dcb1cd6d120b809dbfe1106e81a" 2210 + dependencies = [ 2211 + "anyhow", 2212 + "cid", 2213 + "futures", 2214 + "serde", 2215 + "serde_ipld_dagcbor", 2216 + "thiserror 1.0.69", 2217 + "tokio", 2218 + "unsigned-varint 0.7.2", 2219 + ] 2220 + 2221 + [[package]] 2222 + name = "is_ci" 2223 + version = "1.2.0" 2224 + source = "registry+https://github.com/rust-lang/crates.io-index" 2225 + checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 2226 + 2227 + [[package]] 2228 + name = "is_debug" 2229 + version = "1.1.0" 2230 + source = "registry+https://github.com/rust-lang/crates.io-index" 2231 + checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" 2232 + 2233 + [[package]] 2234 + name = "is_terminal_polyfill" 2235 + version = "1.70.2" 2236 + source = "registry+https://github.com/rust-lang/crates.io-index" 2237 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 2238 + 2239 + [[package]] 2240 + name = "itertools" 2241 + version = "0.11.0" 2242 + source = "registry+https://github.com/rust-lang/crates.io-index" 2243 + checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" 2244 + dependencies = [ 2245 + "either", 2246 + ] 2247 + 2248 + [[package]] 2249 + name = "itertools" 2250 + version = "0.13.0" 2251 + source = "registry+https://github.com/rust-lang/crates.io-index" 2252 + checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 2253 + dependencies = [ 2254 + "either", 2255 + ] 2256 + 2257 + [[package]] 2258 + name = "itertools" 2259 + version = "0.14.0" 2260 + source = "registry+https://github.com/rust-lang/crates.io-index" 2261 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 2262 + dependencies = [ 2263 + "either", 2264 + ] 2265 + 2266 + [[package]] 2267 + name = "itoa" 2268 + version = "1.0.15" 2269 + source = "registry+https://github.com/rust-lang/crates.io-index" 2270 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 2271 + 2272 + [[package]] 2273 + name = "jacquard" 2274 + version = "0.9.4" 2275 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2276 + dependencies = [ 2277 + "bytes", 2278 + "getrandom 0.2.16", 2279 + "gloo-storage", 2280 + "http", 2281 + "jacquard-api", 2282 + "jacquard-common", 2283 + "jacquard-identity", 2284 + "jacquard-oauth", 2285 + "jose-jwk", 2286 + "miette", 2287 + "regex", 2288 + "regex-lite", 2289 + "reqwest", 2290 + "ring", 2291 + "serde", 2292 + "serde_html_form", 2293 + "serde_json", 2294 + "smol_str", 2295 + "thiserror 2.0.17", 2296 + "tokio", 2297 + "trait-variant", 2298 + "url", 2299 + "webpage", 2300 + ] 2301 + 2302 + [[package]] 2303 + name = "jacquard-api" 2304 + version = "0.9.2" 2305 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2306 + dependencies = [ 2307 + "bon", 2308 + "bytes", 2309 + "jacquard-common", 2310 + "jacquard-derive", 2311 + "jacquard-lexicon", 2312 + "miette", 2313 + "rustversion", 2314 + "serde", 2315 + "serde_bytes", 2316 + "serde_ipld_dagcbor", 2317 + "thiserror 2.0.17", 2318 + "unicode-segmentation", 2319 + ] 2320 + 2321 + [[package]] 2322 + name = "jacquard-common" 2323 + version = "0.9.2" 2324 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2325 + dependencies = [ 2326 + "base64", 2327 + "bon", 2328 + "bytes", 2329 + "chrono", 2330 + "cid", 2331 + "ed25519-dalek", 2332 + "getrandom 0.2.16", 2333 + "getrandom 0.3.4", 2334 + "http", 2335 + "ipld-core", 2336 + "k256", 2337 + "langtag", 2338 + "miette", 2339 + "multibase", 2340 + "multihash", 2341 + "ouroboros", 2342 + "p256", 2343 + "postcard", 2344 + "rand 0.9.2", 2345 + "regex", 2346 + "regex-lite", 2347 + "reqwest", 2348 + "ring", 2349 + "serde", 2350 + "serde_bytes", 2351 + "serde_html_form", 2352 + "serde_ipld_dagcbor", 2353 + "serde_json", 2354 + "signature", 2355 + "smol_str", 2356 + "thiserror 2.0.17", 2357 + "tokio", 2358 + "tokio-util", 2359 + "trait-variant", 2360 + "url", 2361 + ] 2362 + 2363 + [[package]] 2364 + name = "jacquard-derive" 2365 + version = "0.9.4" 2366 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2367 + dependencies = [ 2368 + "heck 0.5.0", 2369 + "jacquard-lexicon", 2370 + "proc-macro2", 2371 + "quote", 2372 + "syn 2.0.111", 2373 + ] 2374 + 2375 + [[package]] 2376 + name = "jacquard-identity" 2377 + version = "0.9.2" 2378 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2379 + dependencies = [ 2380 + "bon", 2381 + "bytes", 2382 + "http", 2383 + "jacquard-api", 2384 + "jacquard-common", 2385 + "jacquard-lexicon", 2386 + "miette", 2387 + "mini-moka", 2388 + "n0-future", 2389 + "percent-encoding", 2390 + "reqwest", 2391 + "ring", 2392 + "serde", 2393 + "serde_html_form", 2394 + "serde_json", 2395 + "thiserror 2.0.17", 2396 + "tokio", 2397 + "trait-variant", 2398 + "url", 2399 + "urlencoding", 2400 + ] 2401 + 2402 + [[package]] 2403 + name = "jacquard-lexicon" 2404 + version = "0.9.2" 2405 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2406 + dependencies = [ 2407 + "cid", 2408 + "dashmap", 2409 + "heck 0.5.0", 2410 + "inventory", 2411 + "jacquard-common", 2412 + "miette", 2413 + "multihash", 2414 + "prettyplease", 2415 + "proc-macro2", 2416 + "quote", 2417 + "serde", 2418 + "serde_ipld_dagcbor", 2419 + "serde_json", 2420 + "serde_repr", 2421 + "serde_with", 2422 + "sha2", 2423 + "syn 2.0.111", 2424 + "thiserror 2.0.17", 2425 + "unicode-segmentation", 2426 + ] 2427 + 2428 + [[package]] 2429 + name = "jacquard-oauth" 2430 + version = "0.9.2" 2431 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2432 + dependencies = [ 2433 + "base64", 2434 + "bytes", 2435 + "chrono", 2436 + "dashmap", 2437 + "elliptic-curve", 2438 + "http", 2439 + "jacquard-common", 2440 + "jacquard-identity", 2441 + "jose-jwa", 2442 + "jose-jwk", 2443 + "miette", 2444 + "p256", 2445 + "rand 0.8.5", 2446 + "ring", 2447 + "serde", 2448 + "serde_html_form", 2449 + "serde_json", 2450 + "sha2", 2451 + "smol_str", 2452 + "thiserror 2.0.17", 2453 + "tokio", 2454 + "trait-variant", 2455 + "url", 2456 + ] 2457 + 2458 + [[package]] 2459 + name = "jacquard-repo" 2460 + version = "0.9.4" 2461 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2462 + dependencies = [ 2463 + "bytes", 2464 + "cid", 2465 + "ed25519-dalek", 2466 + "iroh-car", 2467 + "jacquard-common", 2468 + "jacquard-derive", 2469 + "k256", 2470 + "miette", 2471 + "multihash", 2472 + "n0-future", 2473 + "p256", 2474 + "serde", 2475 + "serde_bytes", 2476 + "serde_ipld_dagcbor", 2477 + "sha2", 2478 + "smol_str", 2479 + "thiserror 2.0.17", 2480 + "tokio", 2481 + "trait-variant", 2482 + ] 2483 + 2484 + [[package]] 2485 + name = "jose-b64" 2486 + version = "0.1.2" 2487 + source = "registry+https://github.com/rust-lang/crates.io-index" 2488 + checksum = "bec69375368709666b21c76965ce67549f2d2db7605f1f8707d17c9656801b56" 2489 + dependencies = [ 2490 + "base64ct", 2491 + "serde", 2492 + "subtle", 2493 + "zeroize", 2494 + ] 2495 + 2496 + [[package]] 2497 + name = "jose-jwa" 2498 + version = "0.1.2" 2499 + source = "registry+https://github.com/rust-lang/crates.io-index" 2500 + checksum = "9ab78e053fe886a351d67cf0d194c000f9d0dcb92906eb34d853d7e758a4b3a7" 2501 + dependencies = [ 2502 + "serde", 2503 + ] 2504 + 2505 + [[package]] 2506 + name = "jose-jwk" 2507 + version = "0.1.2" 2508 + source = "registry+https://github.com/rust-lang/crates.io-index" 2509 + checksum = "280fa263807fe0782ecb6f2baadc28dffc04e00558a58e33bfdb801d11fd58e7" 2510 + dependencies = [ 2511 + "jose-b64", 2512 + "jose-jwa", 2513 + "p256", 2514 + "p384", 2515 + "rsa", 2516 + "serde", 2517 + "zeroize", 2518 + ] 2519 + 2520 + [[package]] 2521 + name = "js-sys" 2522 + version = "0.3.81" 2523 + source = "registry+https://github.com/rust-lang/crates.io-index" 2524 + checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 2525 + dependencies = [ 2526 + "once_cell", 2527 + "wasm-bindgen", 2528 + ] 2529 + 2530 + [[package]] 2531 + name = "k256" 2532 + version = "0.13.4" 2533 + source = "registry+https://github.com/rust-lang/crates.io-index" 2534 + checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" 2535 + dependencies = [ 2536 + "cfg-if", 2537 + "ecdsa", 2538 + "elliptic-curve", 2539 + "once_cell", 2540 + "sha2", 2541 + "signature", 2542 + ] 2543 + 2544 + [[package]] 2545 + name = "langtag" 2546 + version = "0.4.0" 2547 + source = "registry+https://github.com/rust-lang/crates.io-index" 2548 + checksum = "9ecb4c689a30e48ebeaa14237f34037e300dd072e6ad21a9ec72e810ff3c6600" 2549 + dependencies = [ 2550 + "serde", 2551 + "static-regular-grammar", 2552 + "thiserror 1.0.69", 2553 + ] 2554 + 2555 + [[package]] 2556 + name = "lazy_static" 2557 + version = "1.5.0" 2558 + source = "registry+https://github.com/rust-lang/crates.io-index" 2559 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2560 + dependencies = [ 2561 + "spin 0.9.8", 2562 + ] 2563 + 2564 + [[package]] 2565 + name = "lean_string" 2566 + version = "0.5.1" 2567 + source = "registry+https://github.com/rust-lang/crates.io-index" 2568 + checksum = "962df00ba70ac8d5ca5c064e17e5c3d090c087fd8d21aa45096c716b169da514" 2569 + dependencies = [ 2570 + "castaway", 2571 + "itoa", 2572 + "ryu", 2573 + "serde", 2574 + ] 2575 + 2576 + [[package]] 2577 + name = "libc" 2578 + version = "0.2.178" 2579 + source = "registry+https://github.com/rust-lang/crates.io-index" 2580 + checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" 2581 + 2582 + [[package]] 2583 + name = "libloading" 2584 + version = "0.8.9" 2585 + source = "registry+https://github.com/rust-lang/crates.io-index" 2586 + checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 2587 + dependencies = [ 2588 + "cfg-if", 2589 + "windows-link 0.2.1", 2590 + ] 2591 + 2592 + [[package]] 2593 + name = "libm" 2594 + version = "0.2.15" 2595 + source = "registry+https://github.com/rust-lang/crates.io-index" 2596 + checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 2597 + 2598 + [[package]] 2599 + name = "libproc" 2600 + version = "0.14.11" 2601 + source = "registry+https://github.com/rust-lang/crates.io-index" 2602 + checksum = "a54ad7278b8bc5301d5ffd2a94251c004feb971feba96c971ea4063645990757" 2603 + dependencies = [ 2604 + "bindgen", 2605 + "errno", 2606 + "libc", 2607 + ] 2608 + 2609 + [[package]] 2610 + name = "libredox" 2611 + version = "0.1.10" 2612 + source = "registry+https://github.com/rust-lang/crates.io-index" 2613 + checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2614 + dependencies = [ 2615 + "bitflags", 2616 + "libc", 2617 + "redox_syscall", 2618 + ] 2619 + 2620 + [[package]] 2621 + name = "libz-rs-sys" 2622 + version = "0.5.4" 2623 + source = "registry+https://github.com/rust-lang/crates.io-index" 2624 + checksum = "15413ef615ad868d4d65dce091cb233b229419c7c0c4bcaa746c0901c49ff39c" 2625 + dependencies = [ 2626 + "zlib-rs", 2627 + ] 2628 + 2629 + [[package]] 2630 + name = "linked-hash-map" 2631 + version = "0.5.6" 2632 + source = "registry+https://github.com/rust-lang/crates.io-index" 2633 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 2634 + dependencies = [ 2635 + "serde", 2636 + ] 2637 + 2638 + [[package]] 2639 + name = "linux-raw-sys" 2640 + version = "0.4.15" 2641 + source = "registry+https://github.com/rust-lang/crates.io-index" 2642 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 2643 + 2644 + [[package]] 2645 + name = "linux-raw-sys" 2646 + version = "0.11.0" 2647 + source = "registry+https://github.com/rust-lang/crates.io-index" 2648 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2649 + 2650 + [[package]] 2651 + name = "litemap" 2652 + version = "0.8.1" 2653 + source = "registry+https://github.com/rust-lang/crates.io-index" 2654 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2655 + 2656 + [[package]] 2657 + name = "lock_api" 2658 + version = "0.4.14" 2659 + source = "registry+https://github.com/rust-lang/crates.io-index" 2660 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2661 + dependencies = [ 2662 + "scopeguard", 2663 + ] 2664 + 2665 + [[package]] 2666 + name = "log" 2667 + version = "0.4.29" 2668 + source = "registry+https://github.com/rust-lang/crates.io-index" 2669 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 2670 + 2671 + [[package]] 2672 + name = "loom" 2673 + version = "0.7.2" 2674 + source = "registry+https://github.com/rust-lang/crates.io-index" 2675 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 2676 + dependencies = [ 2677 + "cfg-if", 2678 + "generator", 2679 + "scoped-tls", 2680 + "tracing", 2681 + "tracing-subscriber", 2682 + ] 2683 + 2684 + [[package]] 2685 + name = "lru" 2686 + version = "0.12.5" 2687 + source = "registry+https://github.com/rust-lang/crates.io-index" 2688 + checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 2689 + dependencies = [ 2690 + "hashbrown 0.15.5", 2691 + ] 2692 + 2693 + [[package]] 2694 + name = "lru-slab" 2695 + version = "0.1.2" 2696 + source = "registry+https://github.com/rust-lang/crates.io-index" 2697 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 2698 + 2699 + [[package]] 2700 + name = "lscolors" 2701 + version = "0.20.0" 2702 + source = "registry+https://github.com/rust-lang/crates.io-index" 2703 + checksum = "61183da5de8ba09a58e330d55e5ea796539d8443bd00fdeb863eac39724aa4ab" 2704 + dependencies = [ 2705 + "aho-corasick", 2706 + "nu-ansi-term", 2707 + ] 2708 + 2709 + [[package]] 2710 + name = "mac" 2711 + version = "0.1.1" 2712 + source = "registry+https://github.com/rust-lang/crates.io-index" 2713 + checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 2714 + 2715 + [[package]] 2716 + name = "mach2" 2717 + version = "0.4.3" 2718 + source = "registry+https://github.com/rust-lang/crates.io-index" 2719 + checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" 2720 + dependencies = [ 2721 + "libc", 2722 + ] 2723 + 2724 + [[package]] 2725 + name = "markup5ever" 2726 + version = "0.12.1" 2727 + source = "registry+https://github.com/rust-lang/crates.io-index" 2728 + checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" 2729 + dependencies = [ 2730 + "log", 2731 + "phf 0.11.3", 2732 + "phf_codegen", 2733 + "string_cache", 2734 + "string_cache_codegen", 2735 + "tendril", 2736 + ] 2737 + 2738 + [[package]] 2739 + name = "markup5ever_rcdom" 2740 + version = "0.3.0" 2741 + source = "registry+https://github.com/rust-lang/crates.io-index" 2742 + checksum = "edaa21ab3701bfee5099ade5f7e1f84553fd19228cf332f13cd6e964bf59be18" 2743 + dependencies = [ 2744 + "html5ever", 2745 + "markup5ever", 2746 + "tendril", 2747 + "xml5ever", 2748 + ] 2749 + 2750 + [[package]] 2751 + name = "match-lookup" 2752 + version = "0.1.1" 2753 + source = "registry+https://github.com/rust-lang/crates.io-index" 2754 + checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" 2755 + dependencies = [ 2756 + "proc-macro2", 2757 + "quote", 2758 + "syn 1.0.109", 2759 + ] 2760 + 2761 + [[package]] 2762 + name = "matchers" 2763 + version = "0.2.0" 2764 + source = "registry+https://github.com/rust-lang/crates.io-index" 2765 + checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 2766 + dependencies = [ 2767 + "regex-automata", 2768 + ] 2769 + 2770 + [[package]] 2771 + name = "md-5" 2772 + version = "0.10.6" 2773 + source = "registry+https://github.com/rust-lang/crates.io-index" 2774 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 2775 + dependencies = [ 2776 + "cfg-if", 2777 + "digest", 2778 + ] 2779 + 2780 + [[package]] 2781 + name = "memchr" 2782 + version = "2.7.6" 2783 + source = "registry+https://github.com/rust-lang/crates.io-index" 2784 + checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2785 + 2786 + [[package]] 2787 + name = "memoffset" 2788 + version = "0.9.1" 2789 + source = "registry+https://github.com/rust-lang/crates.io-index" 2790 + checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 2791 + dependencies = [ 2792 + "autocfg", 2793 + ] 2794 + 2795 + [[package]] 2796 + name = "miette" 2797 + version = "7.6.0" 2798 + source = "registry+https://github.com/rust-lang/crates.io-index" 2799 + checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" 2800 + dependencies = [ 2801 + "backtrace", 2802 + "backtrace-ext", 2803 + "cfg-if", 2804 + "miette-derive", 2805 + "owo-colors", 2806 + "supports-color", 2807 + "supports-hyperlinks", 2808 + "supports-unicode", 2809 + "terminal_size", 2810 + "textwrap", 2811 + "unicode-width 0.1.14", 2812 + ] 2813 + 2814 + [[package]] 2815 + name = "miette-derive" 2816 + version = "7.6.0" 2817 + source = "registry+https://github.com/rust-lang/crates.io-index" 2818 + checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" 2819 + dependencies = [ 2820 + "proc-macro2", 2821 + "quote", 2822 + "syn 2.0.111", 2823 + ] 2824 + 2825 + [[package]] 2826 + name = "mime" 2827 + version = "0.3.17" 2828 + source = "registry+https://github.com/rust-lang/crates.io-index" 2829 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2830 + 2831 + [[package]] 2832 + name = "mime_guess" 2833 + version = "2.0.5" 2834 + source = "registry+https://github.com/rust-lang/crates.io-index" 2835 + checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 2836 + dependencies = [ 2837 + "mime", 2838 + "unicase", 2839 + ] 2840 + 2841 + [[package]] 2842 + name = "mini-moka" 2843 + version = "0.10.99" 2844 + source = "git+https://tangled.sh/ptr.pet/jacquard#1461248486744fa5d3f487701faba85a27caa19d" 2845 + dependencies = [ 2846 + "crossbeam-channel", 2847 + "crossbeam-utils", 2848 + "dashmap", 2849 + "smallvec", 2850 + "tagptr", 2851 + "triomphe", 2852 + "web-time", 2853 + ] 2854 + 2855 + [[package]] 2856 + name = "minimal-lexical" 2857 + version = "0.2.1" 2858 + source = "registry+https://github.com/rust-lang/crates.io-index" 2859 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2860 + 2861 + [[package]] 2862 + name = "miniz_oxide" 2863 + version = "0.8.9" 2864 + source = "registry+https://github.com/rust-lang/crates.io-index" 2865 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 2866 + dependencies = [ 2867 + "adler2", 2868 + "simd-adler32", 2869 + ] 2870 + 2871 + [[package]] 2872 + name = "mio" 2873 + version = "1.1.1" 2874 + source = "registry+https://github.com/rust-lang/crates.io-index" 2875 + checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" 2876 + dependencies = [ 2877 + "libc", 2878 + "wasi", 2879 + "windows-sys 0.61.2", 2880 + ] 2881 + 2882 + [[package]] 2883 + name = "multibase" 2884 + version = "0.9.2" 2885 + source = "registry+https://github.com/rust-lang/crates.io-index" 2886 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 2887 + dependencies = [ 2888 + "base-x", 2889 + "base256emoji", 2890 + "data-encoding", 2891 + "data-encoding-macro", 2892 + ] 2893 + 2894 + [[package]] 2895 + name = "multihash" 2896 + version = "0.19.3" 2897 + source = "registry+https://github.com/rust-lang/crates.io-index" 2898 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 2899 + dependencies = [ 2900 + "core2", 2901 + "serde", 2902 + "unsigned-varint 0.8.0", 2903 + ] 2904 + 2905 + [[package]] 2906 + name = "n0-future" 2907 + version = "0.1.3" 2908 + source = "registry+https://github.com/rust-lang/crates.io-index" 2909 + checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" 2910 + dependencies = [ 2911 + "cfg_aliases", 2912 + "derive_more", 2913 + "futures-buffered", 2914 + "futures-lite", 2915 + "futures-util", 2916 + "js-sys", 2917 + "pin-project", 2918 + "send_wrapper", 2919 + "tokio", 2920 + "tokio-util", 2921 + "wasm-bindgen", 2922 + "wasm-bindgen-futures", 2923 + "web-time", 2924 + ] 2925 + 2926 + [[package]] 2927 + name = "new_debug_unreachable" 2928 + version = "1.0.6" 2929 + source = "registry+https://github.com/rust-lang/crates.io-index" 2930 + checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 2931 + 2932 + [[package]] 2933 + name = "nix" 2934 + version = "0.30.1" 2935 + source = "registry+https://github.com/rust-lang/crates.io-index" 2936 + checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 2937 + dependencies = [ 2938 + "bitflags", 2939 + "cfg-if", 2940 + "cfg_aliases", 2941 + "libc", 2942 + ] 2943 + 2944 + [[package]] 2945 + name = "nom" 2946 + version = "7.1.3" 2947 + source = "registry+https://github.com/rust-lang/crates.io-index" 2948 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2949 + dependencies = [ 2950 + "memchr", 2951 + "minimal-lexical", 2952 + ] 2953 + 2954 + [[package]] 2955 + name = "ntapi" 2956 + version = "0.4.1" 2957 + source = "registry+https://github.com/rust-lang/crates.io-index" 2958 + checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 2959 + dependencies = [ 2960 + "winapi", 2961 + ] 2962 + 2963 + [[package]] 2964 + name = "nu-ansi-term" 2965 + version = "0.50.3" 2966 + source = "registry+https://github.com/rust-lang/crates.io-index" 2967 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 2968 + dependencies = [ 2969 + "windows-sys 0.61.2", 2970 + ] 2971 + 2972 + [[package]] 2973 + name = "nu-cmd-base" 2974 + version = "0.109.1" 2975 + source = "registry+https://github.com/rust-lang/crates.io-index" 2976 + checksum = "2460ee389a43b935aa18ef5ed9fa8275bdf617e8c05eba7c2b82f92effd2132b" 2977 + dependencies = [ 2978 + "indexmap 2.12.1", 2979 + "miette", 2980 + "nu-engine", 2981 + "nu-parser", 2982 + "nu-path", 2983 + "nu-protocol", 2984 + ] 2985 + 2986 + [[package]] 2987 + name = "nu-cmd-extra" 2988 + version = "0.109.1" 2989 + source = "registry+https://github.com/rust-lang/crates.io-index" 2990 + checksum = "96f1ac416cd5182ca427a1007c9d0193feaa746aeb54b5320251faad41481cfe" 2991 + dependencies = [ 2992 + "fancy-regex", 2993 + "heck 0.5.0", 2994 + "itertools 0.14.0", 2995 + "mime", 2996 + "nu-ansi-term", 2997 + "nu-cmd-base", 2998 + "nu-engine", 2999 + "nu-json", 3000 + "nu-parser", 3001 + "nu-pretty-hex", 3002 + "nu-protocol", 3003 + "nu-utils", 3004 + "num-traits", 3005 + "rust-embed", 3006 + "serde", 3007 + "serde_urlencoded", 3008 + "v_htmlescape", 3009 + ] 3010 + 3011 + [[package]] 3012 + name = "nu-cmd-lang" 3013 + version = "0.109.1" 3014 + source = "registry+https://github.com/rust-lang/crates.io-index" 3015 + checksum = "5b266674d87b816264f6aff8cca351e6ebb156f34faab45d7d728c2aba005495" 3016 + dependencies = [ 3017 + "itertools 0.14.0", 3018 + "nu-cmd-base", 3019 + "nu-engine", 3020 + "nu-experimental", 3021 + "nu-parser", 3022 + "nu-protocol", 3023 + "nu-utils", 3024 + "shadow-rs", 3025 + ] 3026 + 3027 + [[package]] 3028 + name = "nu-color-config" 3029 + version = "0.109.1" 3030 + source = "registry+https://github.com/rust-lang/crates.io-index" 3031 + checksum = "440a59265caf5468af6ff186e656bc6e6d349c08662ee959b116375597864206" 3032 + dependencies = [ 3033 + "nu-ansi-term", 3034 + "nu-engine", 3035 + "nu-json", 3036 + "nu-protocol", 3037 + "serde", 3038 + ] 3039 + 3040 + [[package]] 3041 + name = "nu-command" 3042 + version = "0.109.1" 3043 + source = "registry+https://github.com/rust-lang/crates.io-index" 3044 + checksum = "5380a9cf6ef0f482280b71d6e78fa8d4bc1b2b43aa8f0b1fa786f96087c2d500" 3045 + dependencies = [ 3046 + "alphanumeric-sort", 3047 + "base64", 3048 + "bracoxide", 3049 + "brotli", 3050 + "byteorder", 3051 + "bytesize", 3052 + "calamine", 3053 + "chardetng", 3054 + "chrono", 3055 + "chrono-humanize", 3056 + "chrono-tz", 3057 + "csv", 3058 + "data-encoding", 3059 + "devicons", 3060 + "dialoguer", 3061 + "digest", 3062 + "dtparse", 3063 + "encoding_rs", 3064 + "fancy-regex", 3065 + "filesize", 3066 + "filetime", 3067 + "fuzzy-matcher", 3068 + "http", 3069 + "human-date-parser", 3070 + "indexmap 2.12.1", 3071 + "indicatif", 3072 + "itertools 0.14.0", 3073 + "log", 3074 + "lscolors", 3075 + "md-5", 3076 + "mime", 3077 + "mime_guess", 3078 + "nix", 3079 + "nu-ansi-term", 3080 + "nu-cmd-base", 3081 + "nu-color-config", 3082 + "nu-engine", 3083 + "nu-experimental", 3084 + "nu-glob", 3085 + "nu-json", 3086 + "nu-parser", 3087 + "nu-path", 3088 + "nu-pretty-hex", 3089 + "nu-protocol", 3090 + "nu-system", 3091 + "nu-table", 3092 + "nu-term-grid", 3093 + "nu-utils", 3094 + "num-format", 3095 + "num-traits", 3096 + "nuon", 3097 + "oem_cp", 3098 + "pathdiff", 3099 + "percent-encoding", 3100 + "print-positions", 3101 + "procfs 0.17.0", 3102 + "quick-xml 0.38.4", 3103 + "rayon", 3104 + "rmp", 3105 + "roxmltree", 3106 + "scopeguard", 3107 + "serde", 3108 + "serde_json", 3109 + "serde_urlencoded", 3110 + "serde_yaml", 3111 + "sha2", 3112 + "strum", 3113 + "sysinfo", 3114 + "tabled", 3115 + "titlecase", 3116 + "toml", 3117 + "uds_windows", 3118 + "umask", 3119 + "unicode-segmentation", 3120 + "unicode-width 0.2.2", 3121 + "url", 3122 + "uucore", 3123 + "v_htmlescape", 3124 + "wax", 3125 + "web-time", 3126 + "windows 0.62.2", 3127 + "winreg", 3128 + ] 3129 + 3130 + [[package]] 3131 + name = "nu-derive-value" 3132 + version = "0.109.1" 3133 + source = "registry+https://github.com/rust-lang/crates.io-index" 3134 + checksum = "1465d2d3ada6004cb6689f269a08c70ba81056231e2b5392d1e0ccf5825f81cb" 3135 + dependencies = [ 3136 + "heck 0.5.0", 3137 + "proc-macro-error2", 3138 + "proc-macro2", 3139 + "quote", 3140 + "syn 2.0.111", 3141 + ] 3142 + 3143 + [[package]] 3144 + name = "nu-engine" 3145 + version = "0.109.1" 3146 + source = "registry+https://github.com/rust-lang/crates.io-index" 3147 + checksum = "b3b777faf7c5180fe5d7f67d83c44fd14138d91f2938a36494ed6ac66b7160f3" 3148 + dependencies = [ 3149 + "fancy-regex", 3150 + "log", 3151 + "nu-experimental", 3152 + "nu-glob", 3153 + "nu-path", 3154 + "nu-protocol", 3155 + "nu-utils", 3156 + ] 3157 + 3158 + [[package]] 3159 + name = "nu-experimental" 3160 + version = "0.109.1" 3161 + source = "registry+https://github.com/rust-lang/crates.io-index" 3162 + checksum = "73dd212a1afdad646a38c00579a0988264880aeb97fee820b349a28cdcc04df2" 3163 + dependencies = [ 3164 + "itertools 0.14.0", 3165 + "thiserror 2.0.17", 3166 + ] 3167 + 3168 + [[package]] 3169 + name = "nu-glob" 3170 + version = "0.109.1" 3171 + source = "registry+https://github.com/rust-lang/crates.io-index" 3172 + checksum = "15aa2c17078926f14e393b4b708e69f228cb6fd4c81136839bde82772bdde1b5" 3173 + 3174 + [[package]] 3175 + name = "nu-json" 3176 + version = "0.109.1" 3177 + source = "registry+https://github.com/rust-lang/crates.io-index" 3178 + checksum = "7ca63927a3c1c4fb889e80dc5cfbe754daed822a7b503cc74e600627c2aa8435" 3179 + dependencies = [ 3180 + "linked-hash-map", 3181 + "nu-utils", 3182 + "num-traits", 3183 + "serde", 3184 + "serde_json", 3185 + ] 3186 + 3187 + [[package]] 3188 + name = "nu-parser" 3189 + version = "0.109.1" 3190 + source = "registry+https://github.com/rust-lang/crates.io-index" 3191 + checksum = "237172636312c3566272511a00c1dc355202406c376e1546a45a33c65e81babe" 3192 + dependencies = [ 3193 + "bytesize", 3194 + "chrono", 3195 + "itertools 0.14.0", 3196 + "log", 3197 + "nu-engine", 3198 + "nu-path", 3199 + "nu-protocol", 3200 + "nu-utils", 3201 + "serde_json", 3202 + ] 3203 + 3204 + [[package]] 3205 + name = "nu-path" 3206 + version = "0.109.1" 3207 + source = "registry+https://github.com/rust-lang/crates.io-index" 3208 + checksum = "dde9d8ba26f62c07176c0237a36f38ce964ab3a0dcfb6aab1feea7515d1c6594" 3209 + dependencies = [ 3210 + "dirs", 3211 + "omnipath", 3212 + "pwd", 3213 + "ref-cast", 3214 + ] 3215 + 3216 + [[package]] 3217 + name = "nu-pretty-hex" 3218 + version = "0.109.1" 3219 + source = "registry+https://github.com/rust-lang/crates.io-index" 3220 + checksum = "02561546604ac4c443bad65d9485ab3965154cad0873340e2e9ebe72d4a18aef" 3221 + dependencies = [ 3222 + "nu-ansi-term", 3223 + ] 3224 + 3225 + [[package]] 3226 + name = "nu-protocol" 3227 + version = "0.109.1" 3228 + source = "registry+https://github.com/rust-lang/crates.io-index" 3229 + checksum = "038943300ca9de0924fef1c795a7dd16ffc67105629477cf163e8ee6bad95ea6" 3230 + dependencies = [ 3231 + "bytes", 3232 + "chrono", 3233 + "chrono-humanize", 3234 + "dirs", 3235 + "dirs-sys", 3236 + "fancy-regex", 3237 + "heck 0.5.0", 3238 + "indexmap 2.12.1", 3239 + "log", 3240 + "lru", 3241 + "memchr", 3242 + "miette", 3243 + "nix", 3244 + "nu-derive-value", 3245 + "nu-experimental", 3246 + "nu-glob", 3247 + "nu-path", 3248 + "nu-system", 3249 + "nu-utils", 3250 + "num-format", 3251 + "serde", 3252 + "serde_json", 3253 + "strum", 3254 + "strum_macros", 3255 + "thiserror 2.0.17", 3256 + "typetag", 3257 + "web-time", 3258 + "windows 0.62.2", 3259 + "windows-sys 0.61.2", 3260 + ] 3261 + 3262 + [[package]] 3263 + name = "nu-system" 3264 + version = "0.109.1" 3265 + source = "registry+https://github.com/rust-lang/crates.io-index" 3266 + checksum = "46be734cc9b19e09a9665769e14360e13e6978490056ba5c8bfad7dd0537ea83" 3267 + dependencies = [ 3268 + "chrono", 3269 + "itertools 0.14.0", 3270 + "libc", 3271 + "libproc", 3272 + "log", 3273 + "mach2", 3274 + "nix", 3275 + "ntapi", 3276 + "procfs 0.17.0", 3277 + "sysinfo", 3278 + "web-time", 3279 + "windows 0.62.2", 3280 + ] 3281 + 3282 + [[package]] 3283 + name = "nu-table" 3284 + version = "0.109.1" 3285 + source = "registry+https://github.com/rust-lang/crates.io-index" 3286 + checksum = "aa96502adbb69c838d8469715327ba2dacf2c4f5254a4cdee7536e2c6849de1d" 3287 + dependencies = [ 3288 + "fancy-regex", 3289 + "nu-ansi-term", 3290 + "nu-color-config", 3291 + "nu-engine", 3292 + "nu-protocol", 3293 + "nu-utils", 3294 + "tabled", 3295 + ] 3296 + 3297 + [[package]] 3298 + name = "nu-term-grid" 3299 + version = "0.109.1" 3300 + source = "registry+https://github.com/rust-lang/crates.io-index" 3301 + checksum = "2b6545b361413e88bea37c4b9c7aa97a7fd7a11d84a5d330a72242367fd1d2df" 3302 + dependencies = [ 3303 + "nu-utils", 3304 + "unicode-width 0.2.2", 3305 + ] 3306 + 3307 + [[package]] 3308 + name = "nu-utils" 3309 + version = "0.109.1" 3310 + source = "registry+https://github.com/rust-lang/crates.io-index" 3311 + checksum = "3f8eb43c29cc5bce85f87defdadc2cca964fa434d808af37036a7cb78f3c68e9" 3312 + dependencies = [ 3313 + "byteyarn", 3314 + "crossterm_winapi", 3315 + "fancy-regex", 3316 + "lean_string", 3317 + "log", 3318 + "lscolors", 3319 + "memchr", 3320 + "nix", 3321 + "num-format", 3322 + "serde", 3323 + "serde_json", 3324 + "strip-ansi-escapes", 3325 + "sys-locale", 3326 + "unicase", 3327 + ] 3328 + 3329 + [[package]] 3330 + name = "num-bigint-dig" 3331 + version = "0.8.6" 3332 + source = "registry+https://github.com/rust-lang/crates.io-index" 3333 + checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" 3334 + dependencies = [ 3335 + "lazy_static", 3336 + "libm", 3337 + "num-integer", 3338 + "num-iter", 3339 + "num-traits", 3340 + "rand 0.8.5", 3341 + "smallvec", 3342 + "zeroize", 3343 + ] 3344 + 3345 + [[package]] 3346 + name = "num-conv" 3347 + version = "0.1.0" 3348 + source = "registry+https://github.com/rust-lang/crates.io-index" 3349 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 3350 + 3351 + [[package]] 3352 + name = "num-format" 3353 + version = "0.4.4" 3354 + source = "registry+https://github.com/rust-lang/crates.io-index" 3355 + checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" 3356 + dependencies = [ 3357 + "arrayvec", 3358 + "itoa", 3359 + ] 3360 + 3361 + [[package]] 3362 + name = "num-integer" 3363 + version = "0.1.46" 3364 + source = "registry+https://github.com/rust-lang/crates.io-index" 3365 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 3366 + dependencies = [ 3367 + "num-traits", 3368 + ] 3369 + 3370 + [[package]] 3371 + name = "num-iter" 3372 + version = "0.1.45" 3373 + source = "registry+https://github.com/rust-lang/crates.io-index" 3374 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 3375 + dependencies = [ 3376 + "autocfg", 3377 + "num-integer", 3378 + "num-traits", 3379 + ] 3380 + 3381 + [[package]] 3382 + name = "num-traits" 3383 + version = "0.2.19" 3384 + source = "registry+https://github.com/rust-lang/crates.io-index" 3385 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 3386 + dependencies = [ 3387 + "autocfg", 3388 + "libm", 3389 + ] 3390 + 3391 + [[package]] 3392 + name = "num_threads" 3393 + version = "0.1.7" 3394 + source = "registry+https://github.com/rust-lang/crates.io-index" 3395 + checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 3396 + dependencies = [ 3397 + "libc", 3398 + ] 3399 + 3400 + [[package]] 3401 + name = "number_prefix" 3402 + version = "0.4.0" 3403 + source = "registry+https://github.com/rust-lang/crates.io-index" 3404 + checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 3405 + 3406 + [[package]] 3407 + name = "nuon" 3408 + version = "0.109.1" 3409 + source = "registry+https://github.com/rust-lang/crates.io-index" 3410 + checksum = "f8c4f2e4460a6cf00e50cddf0840f954874d645be3af5196c5858c70c069d8c0" 3411 + dependencies = [ 3412 + "nu-engine", 3413 + "nu-parser", 3414 + "nu-protocol", 3415 + "nu-utils", 3416 + ] 3417 + 3418 + [[package]] 3419 + name = "objc2-core-foundation" 3420 + version = "0.3.2" 3421 + source = "registry+https://github.com/rust-lang/crates.io-index" 3422 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 3423 + dependencies = [ 3424 + "bitflags", 3425 + ] 3426 + 3427 + [[package]] 3428 + name = "objc2-io-kit" 3429 + version = "0.3.2" 3430 + source = "registry+https://github.com/rust-lang/crates.io-index" 3431 + checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" 3432 + dependencies = [ 3433 + "libc", 3434 + "objc2-core-foundation", 3435 + ] 3436 + 3437 + [[package]] 3438 + name = "object" 3439 + version = "0.37.3" 3440 + source = "registry+https://github.com/rust-lang/crates.io-index" 3441 + checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 3442 + dependencies = [ 3443 + "memchr", 3444 + ] 3445 + 3446 + [[package]] 3447 + name = "oem_cp" 3448 + version = "2.1.1" 3449 + source = "registry+https://github.com/rust-lang/crates.io-index" 3450 + checksum = "a4b91a3be3b523e58bd7a9d839b0bf65720331db50ddfba5ace0680f8c6f58a1" 3451 + dependencies = [ 3452 + "phf 0.11.3", 3453 + ] 3454 + 3455 + [[package]] 3456 + name = "omnipath" 3457 + version = "0.1.6" 3458 + source = "registry+https://github.com/rust-lang/crates.io-index" 3459 + checksum = "80adb31078122c880307e9cdfd4e3361e6545c319f9b9dcafcb03acd3b51a575" 3460 + 3461 + [[package]] 3462 + name = "once_cell" 3463 + version = "1.21.3" 3464 + source = "registry+https://github.com/rust-lang/crates.io-index" 3465 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 3466 + 3467 + [[package]] 3468 + name = "once_cell_polyfill" 3469 + version = "1.70.2" 3470 + source = "registry+https://github.com/rust-lang/crates.io-index" 3471 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 3472 + 3473 + [[package]] 3474 + name = "option-ext" 3475 + version = "0.2.0" 3476 + source = "registry+https://github.com/rust-lang/crates.io-index" 3477 + checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 3478 + 3479 + [[package]] 3480 + name = "os_display" 3481 + version = "0.1.4" 3482 + source = "registry+https://github.com/rust-lang/crates.io-index" 3483 + checksum = "ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f" 3484 + dependencies = [ 3485 + "unicode-width 0.2.2", 3486 + ] 3487 + 3488 + [[package]] 3489 + name = "ouroboros" 3490 + version = "0.18.5" 3491 + source = "registry+https://github.com/rust-lang/crates.io-index" 3492 + checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" 3493 + dependencies = [ 3494 + "aliasable", 3495 + "ouroboros_macro", 3496 + "static_assertions", 3497 + ] 3498 + 3499 + [[package]] 3500 + name = "ouroboros_macro" 3501 + version = "0.18.5" 3502 + source = "registry+https://github.com/rust-lang/crates.io-index" 3503 + checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" 3504 + dependencies = [ 3505 + "heck 0.4.1", 3506 + "proc-macro2", 3507 + "proc-macro2-diagnostics", 3508 + "quote", 3509 + "syn 2.0.111", 3510 + ] 3511 + 3512 + [[package]] 3513 + name = "owo-colors" 3514 + version = "4.2.3" 3515 + source = "registry+https://github.com/rust-lang/crates.io-index" 3516 + checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" 3517 + 3518 + [[package]] 3519 + name = "p256" 3520 + version = "0.13.2" 3521 + source = "registry+https://github.com/rust-lang/crates.io-index" 3522 + checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 3523 + dependencies = [ 3524 + "ecdsa", 3525 + "elliptic-curve", 3526 + "primeorder", 3527 + "sha2", 3528 + ] 3529 + 3530 + [[package]] 3531 + name = "p384" 3532 + version = "0.13.1" 3533 + source = "registry+https://github.com/rust-lang/crates.io-index" 3534 + checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" 3535 + dependencies = [ 3536 + "elliptic-curve", 3537 + "primeorder", 3538 + ] 3539 + 3540 + [[package]] 3541 + name = "papergrid" 3542 + version = "0.17.0" 3543 + source = "registry+https://github.com/rust-lang/crates.io-index" 3544 + checksum = "6978128c8b51d8f4080631ceb2302ab51e32cc6e8615f735ee2f83fd269ae3f1" 3545 + dependencies = [ 3546 + "ansi-str", 3547 + "ansitok", 3548 + "bytecount", 3549 + "fnv", 3550 + "unicode-width 0.2.2", 3551 + ] 3552 + 3553 + [[package]] 3554 + name = "parking" 3555 + version = "2.2.1" 3556 + source = "registry+https://github.com/rust-lang/crates.io-index" 3557 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 3558 + 3559 + [[package]] 3560 + name = "parking_lot" 3561 + version = "0.12.5" 3562 + source = "registry+https://github.com/rust-lang/crates.io-index" 3563 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 3564 + dependencies = [ 3565 + "lock_api", 3566 + "parking_lot_core", 3567 + ] 3568 + 3569 + [[package]] 3570 + name = "parking_lot_core" 3571 + version = "0.9.12" 3572 + source = "registry+https://github.com/rust-lang/crates.io-index" 3573 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 3574 + dependencies = [ 3575 + "cfg-if", 3576 + "libc", 3577 + "redox_syscall", 3578 + "smallvec", 3579 + "windows-link 0.2.1", 3580 + ] 3581 + 3582 + [[package]] 3583 + name = "paste" 3584 + version = "1.0.15" 3585 + source = "registry+https://github.com/rust-lang/crates.io-index" 3586 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 3587 + 3588 + [[package]] 3589 + name = "pathdiff" 3590 + version = "0.2.3" 3591 + source = "registry+https://github.com/rust-lang/crates.io-index" 3592 + checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 3593 + 3594 + [[package]] 3595 + name = "pem-rfc7468" 3596 + version = "0.7.0" 3597 + source = "registry+https://github.com/rust-lang/crates.io-index" 3598 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 3599 + dependencies = [ 3600 + "base64ct", 3601 + ] 3602 + 3603 + [[package]] 3604 + name = "percent-encoding" 3605 + version = "2.3.2" 3606 + source = "registry+https://github.com/rust-lang/crates.io-index" 3607 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 3608 + 3609 + [[package]] 3610 + name = "pest" 3611 + version = "2.8.4" 3612 + source = "registry+https://github.com/rust-lang/crates.io-index" 3613 + checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" 3614 + dependencies = [ 3615 + "memchr", 3616 + "ucd-trie", 3617 + ] 3618 + 3619 + [[package]] 3620 + name = "pest_consume" 3621 + version = "1.1.3" 3622 + source = "registry+https://github.com/rust-lang/crates.io-index" 3623 + checksum = "79447402d15d18e7142e14c72f2e63fa3d155be1bc5b70b3ccbb610ac55f536b" 3624 + dependencies = [ 3625 + "pest", 3626 + "pest_consume_macros", 3627 + "pest_derive", 3628 + ] 3629 + 3630 + [[package]] 3631 + name = "pest_consume_macros" 3632 + version = "1.1.0" 3633 + source = "registry+https://github.com/rust-lang/crates.io-index" 3634 + checksum = "9d8630a7a899cb344ec1c16ba0a6b24240029af34bdc0a21f84e411d7f793f29" 3635 + dependencies = [ 3636 + "proc-macro2", 3637 + "quote", 3638 + "syn 1.0.109", 3639 + ] 3640 + 3641 + [[package]] 3642 + name = "pest_derive" 3643 + version = "2.8.4" 3644 + source = "registry+https://github.com/rust-lang/crates.io-index" 3645 + checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" 3646 + dependencies = [ 3647 + "pest", 3648 + "pest_generator", 3649 + ] 3650 + 3651 + [[package]] 3652 + name = "pest_generator" 3653 + version = "2.8.4" 3654 + source = "registry+https://github.com/rust-lang/crates.io-index" 3655 + checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" 3656 + dependencies = [ 3657 + "pest", 3658 + "pest_meta", 3659 + "proc-macro2", 3660 + "quote", 3661 + "syn 2.0.111", 3662 + ] 3663 + 3664 + [[package]] 3665 + name = "pest_meta" 3666 + version = "2.8.4" 3667 + source = "registry+https://github.com/rust-lang/crates.io-index" 3668 + checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" 3669 + dependencies = [ 3670 + "pest", 3671 + "sha2", 3672 + ] 3673 + 3674 + [[package]] 3675 + name = "phf" 3676 + version = "0.11.3" 3677 + source = "registry+https://github.com/rust-lang/crates.io-index" 3678 + checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 3679 + dependencies = [ 3680 + "phf_shared 0.11.3", 3681 + ] 3682 + 3683 + [[package]] 3684 + name = "phf" 3685 + version = "0.12.1" 3686 + source = "registry+https://github.com/rust-lang/crates.io-index" 3687 + checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" 3688 + dependencies = [ 3689 + "phf_shared 0.12.1", 3690 + ] 3691 + 3692 + [[package]] 3693 + name = "phf" 3694 + version = "0.13.1" 3695 + source = "registry+https://github.com/rust-lang/crates.io-index" 3696 + checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" 3697 + dependencies = [ 3698 + "phf_shared 0.13.1", 3699 + "serde", 3700 + ] 3701 + 3702 + [[package]] 3703 + name = "phf_codegen" 3704 + version = "0.11.3" 3705 + source = "registry+https://github.com/rust-lang/crates.io-index" 3706 + checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" 3707 + dependencies = [ 3708 + "phf_generator", 3709 + "phf_shared 0.11.3", 3710 + ] 3711 + 3712 + [[package]] 3713 + name = "phf_generator" 3714 + version = "0.11.3" 3715 + source = "registry+https://github.com/rust-lang/crates.io-index" 3716 + checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 3717 + dependencies = [ 3718 + "phf_shared 0.11.3", 3719 + "rand 0.8.5", 3720 + ] 3721 + 3722 + [[package]] 3723 + name = "phf_shared" 3724 + version = "0.11.3" 3725 + source = "registry+https://github.com/rust-lang/crates.io-index" 3726 + checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 3727 + dependencies = [ 3728 + "siphasher", 3729 + ] 3730 + 3731 + [[package]] 3732 + name = "phf_shared" 3733 + version = "0.12.1" 3734 + source = "registry+https://github.com/rust-lang/crates.io-index" 3735 + checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" 3736 + dependencies = [ 3737 + "siphasher", 3738 + ] 3739 + 3740 + [[package]] 3741 + name = "phf_shared" 3742 + version = "0.13.1" 3743 + source = "registry+https://github.com/rust-lang/crates.io-index" 3744 + checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" 3745 + dependencies = [ 3746 + "siphasher", 3747 + ] 3748 + 3749 + [[package]] 3750 + name = "pin-project" 3751 + version = "1.1.10" 3752 + source = "registry+https://github.com/rust-lang/crates.io-index" 3753 + checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 3754 + dependencies = [ 3755 + "pin-project-internal", 3756 + ] 3757 + 3758 + [[package]] 3759 + name = "pin-project-internal" 3760 + version = "1.1.10" 3761 + source = "registry+https://github.com/rust-lang/crates.io-index" 3762 + checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 3763 + dependencies = [ 3764 + "proc-macro2", 3765 + "quote", 3766 + "syn 2.0.111", 3767 + ] 3768 + 3769 + [[package]] 3770 + name = "pin-project-lite" 3771 + version = "0.2.16" 3772 + source = "registry+https://github.com/rust-lang/crates.io-index" 3773 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 3774 + 3775 + [[package]] 3776 + name = "pin-utils" 3777 + version = "0.1.0" 3778 + source = "registry+https://github.com/rust-lang/crates.io-index" 3779 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 3780 + 3781 + [[package]] 3782 + name = "pkcs1" 3783 + version = "0.7.5" 3784 + source = "registry+https://github.com/rust-lang/crates.io-index" 3785 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 3786 + dependencies = [ 3787 + "der", 3788 + "pkcs8", 3789 + "spki", 3790 + ] 3791 + 3792 + [[package]] 3793 + name = "pkcs8" 3794 + version = "0.10.2" 3795 + source = "registry+https://github.com/rust-lang/crates.io-index" 3796 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 3797 + dependencies = [ 3798 + "der", 3799 + "spki", 3800 + ] 3801 + 3802 + [[package]] 3803 + name = "pori" 3804 + version = "0.0.0" 3805 + source = "registry+https://github.com/rust-lang/crates.io-index" 3806 + checksum = "a4a63d338dec139f56dacc692ca63ad35a6be6a797442479b55acd611d79e906" 3807 + dependencies = [ 3808 + "nom", 3809 + ] 3810 + 3811 + [[package]] 3812 + name = "portable-atomic" 3813 + version = "1.11.1" 3814 + source = "registry+https://github.com/rust-lang/crates.io-index" 3815 + checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 3816 + 3817 + [[package]] 3818 + name = "postcard" 3819 + version = "1.1.3" 3820 + source = "registry+https://github.com/rust-lang/crates.io-index" 3821 + checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" 3822 + dependencies = [ 3823 + "cobs", 3824 + "embedded-io 0.4.0", 3825 + "embedded-io 0.6.1", 3826 + "heapless", 3827 + "serde", 3828 + ] 3829 + 3830 + [[package]] 3831 + name = "potential_utf" 3832 + version = "0.1.4" 3833 + source = "registry+https://github.com/rust-lang/crates.io-index" 3834 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 3835 + dependencies = [ 3836 + "zerovec", 3837 + ] 3838 + 3839 + [[package]] 3840 + name = "powerfmt" 3841 + version = "0.2.0" 3842 + source = "registry+https://github.com/rust-lang/crates.io-index" 3843 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 3844 + 3845 + [[package]] 3846 + name = "ppv-lite86" 3847 + version = "0.2.21" 3848 + source = "registry+https://github.com/rust-lang/crates.io-index" 3849 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 3850 + dependencies = [ 3851 + "zerocopy 0.8.31", 3852 + ] 3853 + 3854 + [[package]] 3855 + name = "precomputed-hash" 3856 + version = "0.1.1" 3857 + source = "registry+https://github.com/rust-lang/crates.io-index" 3858 + checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 3859 + 3860 + [[package]] 3861 + name = "prettyplease" 3862 + version = "0.2.37" 3863 + source = "registry+https://github.com/rust-lang/crates.io-index" 3864 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 3865 + dependencies = [ 3866 + "proc-macro2", 3867 + "syn 2.0.111", 3868 + ] 3869 + 3870 + [[package]] 3871 + name = "primeorder" 3872 + version = "0.13.6" 3873 + source = "registry+https://github.com/rust-lang/crates.io-index" 3874 + checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 3875 + dependencies = [ 3876 + "elliptic-curve", 3877 + ] 3878 + 3879 + [[package]] 3880 + name = "print-positions" 3881 + version = "0.6.1" 3882 + source = "registry+https://github.com/rust-lang/crates.io-index" 3883 + checksum = "1df593470e3ef502e48cb0cfc9a3a61e5f61e967b78e1ed35a67ac615cfbd208" 3884 + dependencies = [ 3885 + "unicode-segmentation", 3886 + ] 3887 + 3888 + [[package]] 3889 + name = "proc-macro-error" 3890 + version = "1.0.4" 3891 + source = "registry+https://github.com/rust-lang/crates.io-index" 3892 + checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 3893 + dependencies = [ 3894 + "proc-macro-error-attr", 3895 + "proc-macro2", 3896 + "quote", 3897 + "syn 1.0.109", 3898 + "version_check", 3899 + ] 3900 + 3901 + [[package]] 3902 + name = "proc-macro-error-attr" 3903 + version = "1.0.4" 3904 + source = "registry+https://github.com/rust-lang/crates.io-index" 3905 + checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 3906 + dependencies = [ 3907 + "proc-macro2", 3908 + "quote", 3909 + "version_check", 3910 + ] 3911 + 3912 + [[package]] 3913 + name = "proc-macro-error-attr2" 3914 + version = "2.0.0" 3915 + source = "registry+https://github.com/rust-lang/crates.io-index" 3916 + checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" 3917 + dependencies = [ 3918 + "proc-macro2", 3919 + "quote", 3920 + ] 3921 + 3922 + [[package]] 3923 + name = "proc-macro-error2" 3924 + version = "2.0.1" 3925 + source = "registry+https://github.com/rust-lang/crates.io-index" 3926 + checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" 3927 + dependencies = [ 3928 + "proc-macro-error-attr2", 3929 + "proc-macro2", 3930 + "quote", 3931 + "syn 2.0.111", 3932 + ] 3933 + 3934 + [[package]] 3935 + name = "proc-macro2" 3936 + version = "1.0.103" 3937 + source = "registry+https://github.com/rust-lang/crates.io-index" 3938 + checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" 3939 + dependencies = [ 3940 + "unicode-ident", 3941 + ] 3942 + 3943 + [[package]] 3944 + name = "proc-macro2-diagnostics" 3945 + version = "0.10.1" 3946 + source = "registry+https://github.com/rust-lang/crates.io-index" 3947 + checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 3948 + dependencies = [ 3949 + "proc-macro2", 3950 + "quote", 3951 + "syn 2.0.111", 3952 + "version_check", 3953 + "yansi", 3954 + ] 3955 + 3956 + [[package]] 3957 + name = "procfs" 3958 + version = "0.17.0" 3959 + source = "registry+https://github.com/rust-lang/crates.io-index" 3960 + checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" 3961 + dependencies = [ 3962 + "bitflags", 3963 + "chrono", 3964 + "flate2", 3965 + "hex", 3966 + "procfs-core 0.17.0", 3967 + "rustix 0.38.44", 3968 + ] 3969 + 3970 + [[package]] 3971 + name = "procfs" 3972 + version = "0.18.0" 3973 + source = "registry+https://github.com/rust-lang/crates.io-index" 3974 + checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" 3975 + dependencies = [ 3976 + "bitflags", 3977 + "chrono", 3978 + "flate2", 3979 + "procfs-core 0.18.0", 3980 + "rustix 1.1.2", 3981 + ] 3982 + 3983 + [[package]] 3984 + name = "procfs-core" 3985 + version = "0.17.0" 3986 + source = "registry+https://github.com/rust-lang/crates.io-index" 3987 + checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" 3988 + dependencies = [ 3989 + "bitflags", 3990 + "chrono", 3991 + "hex", 3992 + ] 3993 + 3994 + [[package]] 3995 + name = "procfs-core" 3996 + version = "0.18.0" 3997 + source = "registry+https://github.com/rust-lang/crates.io-index" 3998 + checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" 3999 + dependencies = [ 4000 + "bitflags", 4001 + "chrono", 4002 + "hex", 4003 + ] 4004 + 4005 + [[package]] 4006 + name = "pure-rust-locales" 4007 + version = "0.8.2" 4008 + source = "registry+https://github.com/rust-lang/crates.io-index" 4009 + checksum = "869675ad2d7541aea90c6d88c81f46a7f4ea9af8cd0395d38f11a95126998a0d" 4010 + 4011 + [[package]] 4012 + name = "pwd" 4013 + version = "1.4.0" 4014 + source = "registry+https://github.com/rust-lang/crates.io-index" 4015 + checksum = "72c71c0c79b9701efe4e1e4b563b2016dd4ee789eb99badcb09d61ac4b92e4a2" 4016 + dependencies = [ 4017 + "libc", 4018 + "thiserror 1.0.69", 4019 + ] 4020 + 4021 + [[package]] 4022 + name = "quick-xml" 4023 + version = "0.37.5" 4024 + source = "registry+https://github.com/rust-lang/crates.io-index" 4025 + checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 4026 + dependencies = [ 4027 + "encoding_rs", 4028 + "memchr", 4029 + ] 4030 + 4031 + [[package]] 4032 + name = "quick-xml" 4033 + version = "0.38.4" 4034 + source = "registry+https://github.com/rust-lang/crates.io-index" 4035 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 4036 + dependencies = [ 4037 + "memchr", 4038 + ] 4039 + 4040 + [[package]] 4041 + name = "quinn" 4042 + version = "0.11.9" 4043 + source = "registry+https://github.com/rust-lang/crates.io-index" 4044 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 4045 + dependencies = [ 4046 + "bytes", 4047 + "cfg_aliases", 4048 + "pin-project-lite", 4049 + "quinn-proto", 4050 + "quinn-udp", 4051 + "rustc-hash", 4052 + "rustls", 4053 + "socket2", 4054 + "thiserror 2.0.17", 4055 + "tokio", 4056 + "tracing", 4057 + "web-time", 4058 + ] 4059 + 4060 + [[package]] 4061 + name = "quinn-proto" 4062 + version = "0.11.13" 4063 + source = "registry+https://github.com/rust-lang/crates.io-index" 4064 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 4065 + dependencies = [ 4066 + "bytes", 4067 + "getrandom 0.3.4", 4068 + "lru-slab", 4069 + "rand 0.9.2", 4070 + "ring", 4071 + "rustc-hash", 4072 + "rustls", 4073 + "rustls-pki-types", 4074 + "slab", 4075 + "thiserror 2.0.17", 4076 + "tinyvec", 4077 + "tracing", 4078 + "web-time", 4079 + ] 4080 + 4081 + [[package]] 4082 + name = "quinn-udp" 4083 + version = "0.5.14" 4084 + source = "registry+https://github.com/rust-lang/crates.io-index" 4085 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 4086 + dependencies = [ 4087 + "cfg_aliases", 4088 + "libc", 4089 + "once_cell", 4090 + "socket2", 4091 + "tracing", 4092 + "windows-sys 0.60.2", 4093 + ] 4094 + 4095 + [[package]] 4096 + name = "quote" 4097 + version = "1.0.42" 4098 + source = "registry+https://github.com/rust-lang/crates.io-index" 4099 + checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" 4100 + dependencies = [ 4101 + "proc-macro2", 4102 + ] 4103 + 4104 + [[package]] 4105 + name = "r-efi" 4106 + version = "5.3.0" 4107 + source = "registry+https://github.com/rust-lang/crates.io-index" 4108 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 4109 + 4110 + [[package]] 4111 + name = "rand" 4112 + version = "0.8.5" 4113 + source = "registry+https://github.com/rust-lang/crates.io-index" 4114 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 4115 + dependencies = [ 4116 + "libc", 4117 + "rand_chacha 0.3.1", 4118 + "rand_core 0.6.4", 4119 + ] 4120 + 4121 + [[package]] 4122 + name = "rand" 4123 + version = "0.9.2" 4124 + source = "registry+https://github.com/rust-lang/crates.io-index" 4125 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 4126 + dependencies = [ 4127 + "rand_chacha 0.9.0", 4128 + "rand_core 0.9.3", 4129 + ] 4130 + 4131 + [[package]] 4132 + name = "rand_chacha" 4133 + version = "0.3.1" 4134 + source = "registry+https://github.com/rust-lang/crates.io-index" 4135 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 4136 + dependencies = [ 4137 + "ppv-lite86", 4138 + "rand_core 0.6.4", 4139 + ] 4140 + 4141 + [[package]] 4142 + name = "rand_chacha" 4143 + version = "0.9.0" 4144 + source = "registry+https://github.com/rust-lang/crates.io-index" 4145 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 4146 + dependencies = [ 4147 + "ppv-lite86", 4148 + "rand_core 0.9.3", 4149 + ] 4150 + 4151 + [[package]] 4152 + name = "rand_core" 4153 + version = "0.6.4" 4154 + source = "registry+https://github.com/rust-lang/crates.io-index" 4155 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 4156 + dependencies = [ 4157 + "getrandom 0.2.16", 4158 + ] 4159 + 4160 + [[package]] 4161 + name = "rand_core" 4162 + version = "0.9.3" 4163 + source = "registry+https://github.com/rust-lang/crates.io-index" 4164 + checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 4165 + dependencies = [ 4166 + "getrandom 0.3.4", 4167 + ] 4168 + 4169 + [[package]] 4170 + name = "range-traits" 4171 + version = "0.3.2" 4172 + source = "registry+https://github.com/rust-lang/crates.io-index" 4173 + checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" 4174 + 4175 + [[package]] 4176 + name = "rapidhash" 4177 + version = "4.1.1" 4178 + source = "registry+https://github.com/rust-lang/crates.io-index" 4179 + checksum = "d8e65c75143ce5d47c55b510297eeb1182f3c739b6043c537670e9fc18612dae" 4180 + dependencies = [ 4181 + "rustversion", 4182 + ] 4183 + 4184 + [[package]] 4185 + name = "rayon" 4186 + version = "1.11.0" 4187 + source = "registry+https://github.com/rust-lang/crates.io-index" 4188 + checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 4189 + dependencies = [ 4190 + "either", 4191 + "rayon-core", 4192 + ] 4193 + 4194 + [[package]] 4195 + name = "rayon-core" 4196 + version = "1.13.0" 4197 + source = "registry+https://github.com/rust-lang/crates.io-index" 4198 + checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 4199 + dependencies = [ 4200 + "crossbeam-deque", 4201 + "crossbeam-utils", 4202 + ] 4203 + 4204 + [[package]] 4205 + name = "redox_syscall" 4206 + version = "0.5.18" 4207 + source = "registry+https://github.com/rust-lang/crates.io-index" 4208 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 4209 + dependencies = [ 4210 + "bitflags", 4211 + ] 4212 + 4213 + [[package]] 4214 + name = "redox_users" 4215 + version = "0.5.2" 4216 + source = "registry+https://github.com/rust-lang/crates.io-index" 4217 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 4218 + dependencies = [ 4219 + "getrandom 0.2.16", 4220 + "libredox", 4221 + "thiserror 2.0.17", 4222 + ] 4223 + 4224 + [[package]] 4225 + name = "ref-cast" 4226 + version = "1.0.25" 4227 + source = "registry+https://github.com/rust-lang/crates.io-index" 4228 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 4229 + dependencies = [ 4230 + "ref-cast-impl", 4231 + ] 4232 + 4233 + [[package]] 4234 + name = "ref-cast-impl" 4235 + version = "1.0.25" 4236 + source = "registry+https://github.com/rust-lang/crates.io-index" 4237 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 4238 + dependencies = [ 4239 + "proc-macro2", 4240 + "quote", 4241 + "syn 2.0.111", 4242 + ] 4243 + 4244 + [[package]] 4245 + name = "regex" 4246 + version = "1.12.2" 4247 + source = "registry+https://github.com/rust-lang/crates.io-index" 4248 + checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 4249 + dependencies = [ 4250 + "aho-corasick", 4251 + "memchr", 4252 + "regex-automata", 4253 + "regex-syntax", 4254 + ] 4255 + 4256 + [[package]] 4257 + name = "regex-automata" 4258 + version = "0.4.13" 4259 + source = "registry+https://github.com/rust-lang/crates.io-index" 4260 + checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 4261 + dependencies = [ 4262 + "aho-corasick", 4263 + "memchr", 4264 + "regex-syntax", 4265 + ] 4266 + 4267 + [[package]] 4268 + name = "regex-lite" 4269 + version = "0.1.8" 4270 + source = "registry+https://github.com/rust-lang/crates.io-index" 4271 + checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" 4272 + 4273 + [[package]] 4274 + name = "regex-syntax" 4275 + version = "0.8.8" 4276 + source = "registry+https://github.com/rust-lang/crates.io-index" 4277 + checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 4278 + 4279 + [[package]] 4280 + name = "reqwest" 4281 + version = "0.12.25" 4282 + source = "registry+https://github.com/rust-lang/crates.io-index" 4283 + checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a" 4284 + dependencies = [ 4285 + "base64", 4286 + "bytes", 4287 + "encoding_rs", 4288 + "futures-core", 4289 + "h2", 4290 + "http", 4291 + "http-body", 4292 + "http-body-util", 4293 + "hyper", 4294 + "hyper-rustls", 4295 + "hyper-util", 4296 + "js-sys", 4297 + "log", 4298 + "mime", 4299 + "percent-encoding", 4300 + "pin-project-lite", 4301 + "quinn", 4302 + "rustls", 4303 + "rustls-pki-types", 4304 + "serde", 4305 + "serde_json", 4306 + "serde_urlencoded", 4307 + "sync_wrapper", 4308 + "tokio", 4309 + "tokio-rustls", 4310 + "tower", 4311 + "tower-http", 4312 + "tower-service", 4313 + "url", 4314 + "wasm-bindgen", 4315 + "wasm-bindgen-futures", 4316 + "web-sys", 4317 + "webpki-roots", 4318 + ] 4319 + 4320 + [[package]] 4321 + name = "rfc6979" 4322 + version = "0.4.0" 4323 + source = "registry+https://github.com/rust-lang/crates.io-index" 4324 + checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 4325 + dependencies = [ 4326 + "hmac", 4327 + "subtle", 4328 + ] 4329 + 4330 + [[package]] 4331 + name = "ring" 4332 + version = "0.17.14" 4333 + source = "registry+https://github.com/rust-lang/crates.io-index" 4334 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 4335 + dependencies = [ 4336 + "cc", 4337 + "cfg-if", 4338 + "getrandom 0.2.16", 4339 + "libc", 4340 + "untrusted", 4341 + "windows-sys 0.52.0", 4342 + ] 4343 + 4344 + [[package]] 4345 + name = "rmp" 4346 + version = "0.8.14" 4347 + source = "registry+https://github.com/rust-lang/crates.io-index" 4348 + checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 4349 + dependencies = [ 4350 + "byteorder", 4351 + "num-traits", 4352 + "paste", 4353 + ] 4354 + 4355 + [[package]] 4356 + name = "roxmltree" 4357 + version = "0.20.0" 4358 + source = "registry+https://github.com/rust-lang/crates.io-index" 4359 + checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" 4360 + 4361 + [[package]] 4362 + name = "rsa" 4363 + version = "0.9.9" 4364 + source = "registry+https://github.com/rust-lang/crates.io-index" 4365 + checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" 4366 + dependencies = [ 4367 + "const-oid", 4368 + "digest", 4369 + "num-bigint-dig", 4370 + "num-integer", 4371 + "num-traits", 4372 + "pkcs1", 4373 + "pkcs8", 4374 + "rand_core 0.6.4", 4375 + "signature", 4376 + "spki", 4377 + "subtle", 4378 + "zeroize", 4379 + ] 4380 + 4381 + [[package]] 4382 + name = "rust-embed" 4383 + version = "8.9.0" 4384 + source = "registry+https://github.com/rust-lang/crates.io-index" 4385 + checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" 4386 + dependencies = [ 4387 + "rust-embed-impl", 4388 + "rust-embed-utils", 4389 + "walkdir", 4390 + ] 4391 + 4392 + [[package]] 4393 + name = "rust-embed-impl" 4394 + version = "8.9.0" 4395 + source = "registry+https://github.com/rust-lang/crates.io-index" 4396 + checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" 4397 + dependencies = [ 4398 + "proc-macro2", 4399 + "quote", 4400 + "rust-embed-utils", 4401 + "syn 2.0.111", 4402 + "walkdir", 4403 + ] 4404 + 4405 + [[package]] 4406 + name = "rust-embed-utils" 4407 + version = "8.9.0" 4408 + source = "registry+https://github.com/rust-lang/crates.io-index" 4409 + checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" 4410 + dependencies = [ 4411 + "sha2", 4412 + "walkdir", 4413 + ] 4414 + 4415 + [[package]] 4416 + name = "rust_decimal" 4417 + version = "1.39.0" 4418 + source = "registry+https://github.com/rust-lang/crates.io-index" 4419 + checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" 4420 + dependencies = [ 4421 + "arrayvec", 4422 + "num-traits", 4423 + ] 4424 + 4425 + [[package]] 4426 + name = "rustc-demangle" 4427 + version = "0.1.26" 4428 + source = "registry+https://github.com/rust-lang/crates.io-index" 4429 + checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 4430 + 4431 + [[package]] 4432 + name = "rustc-hash" 4433 + version = "2.1.1" 4434 + source = "registry+https://github.com/rust-lang/crates.io-index" 4435 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 4436 + 4437 + [[package]] 4438 + name = "rustc_version" 4439 + version = "0.4.1" 4440 + source = "registry+https://github.com/rust-lang/crates.io-index" 4441 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 4442 + dependencies = [ 4443 + "semver", 4444 + ] 4445 + 4446 + [[package]] 4447 + name = "rustix" 4448 + version = "0.38.44" 4449 + source = "registry+https://github.com/rust-lang/crates.io-index" 4450 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 4451 + dependencies = [ 4452 + "bitflags", 4453 + "errno", 4454 + "libc", 4455 + "linux-raw-sys 0.4.15", 4456 + "windows-sys 0.59.0", 4457 + ] 4458 + 4459 + [[package]] 4460 + name = "rustix" 4461 + version = "1.1.2" 4462 + source = "registry+https://github.com/rust-lang/crates.io-index" 4463 + checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 4464 + dependencies = [ 4465 + "bitflags", 4466 + "errno", 4467 + "libc", 4468 + "linux-raw-sys 0.11.0", 4469 + "windows-sys 0.61.2", 4470 + ] 4471 + 4472 + [[package]] 4473 + name = "rustls" 4474 + version = "0.23.28" 4475 + source = "registry+https://github.com/rust-lang/crates.io-index" 4476 + checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" 4477 + dependencies = [ 4478 + "once_cell", 4479 + "ring", 4480 + "rustls-pki-types", 4481 + "rustls-webpki", 4482 + "subtle", 4483 + "zeroize", 4484 + ] 4485 + 4486 + [[package]] 4487 + name = "rustls-pki-types" 4488 + version = "1.13.1" 4489 + source = "registry+https://github.com/rust-lang/crates.io-index" 4490 + checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" 4491 + dependencies = [ 4492 + "web-time", 4493 + "zeroize", 4494 + ] 4495 + 4496 + [[package]] 4497 + name = "rustls-webpki" 4498 + version = "0.103.8" 4499 + source = "registry+https://github.com/rust-lang/crates.io-index" 4500 + checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" 4501 + dependencies = [ 4502 + "ring", 4503 + "rustls-pki-types", 4504 + "untrusted", 4505 + ] 4506 + 4507 + [[package]] 4508 + name = "rustversion" 4509 + version = "1.0.22" 4510 + source = "registry+https://github.com/rust-lang/crates.io-index" 4511 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 4512 + 4513 + [[package]] 4514 + name = "ryu" 4515 + version = "1.0.20" 4516 + source = "registry+https://github.com/rust-lang/crates.io-index" 4517 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 4518 + 4519 + [[package]] 4520 + name = "saa" 4521 + version = "5.4.0" 4522 + source = "registry+https://github.com/rust-lang/crates.io-index" 4523 + checksum = "3192d99ee2f69effeacef86c9fa80e75b6604e2a5d3ade6856d206b519521e53" 4524 + 4525 + [[package]] 4526 + name = "same-file" 4527 + version = "1.0.6" 4528 + source = "registry+https://github.com/rust-lang/crates.io-index" 4529 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 4530 + dependencies = [ 4531 + "winapi-util", 4532 + ] 4533 + 4534 + [[package]] 4535 + name = "scc" 4536 + version = "3.4.6" 4537 + source = "registry+https://github.com/rust-lang/crates.io-index" 4538 + checksum = "0b6f8686af8563182fc6b63ab7bd7b5cad8f40fbe660675627caedc6c073eca8" 4539 + dependencies = [ 4540 + "saa", 4541 + "sdd", 4542 + ] 4543 + 4544 + [[package]] 4545 + name = "schemars" 4546 + version = "0.9.0" 4547 + source = "registry+https://github.com/rust-lang/crates.io-index" 4548 + checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" 4549 + dependencies = [ 4550 + "dyn-clone", 4551 + "ref-cast", 4552 + "serde", 4553 + "serde_json", 4554 + ] 4555 + 4556 + [[package]] 4557 + name = "schemars" 4558 + version = "1.1.0" 4559 + source = "registry+https://github.com/rust-lang/crates.io-index" 4560 + checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" 4561 + dependencies = [ 4562 + "dyn-clone", 4563 + "ref-cast", 4564 + "serde", 4565 + "serde_json", 4566 + ] 4567 + 4568 + [[package]] 4569 + name = "scoped-tls" 4570 + version = "1.0.1" 4571 + source = "registry+https://github.com/rust-lang/crates.io-index" 4572 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 4573 + 4574 + [[package]] 4575 + name = "scopeguard" 4576 + version = "1.2.0" 4577 + source = "registry+https://github.com/rust-lang/crates.io-index" 4578 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 4579 + 4580 + [[package]] 4581 + name = "sdd" 4582 + version = "4.5.0" 4583 + source = "registry+https://github.com/rust-lang/crates.io-index" 4584 + checksum = "7168ecf885fdd3920ade15d50189593b076e1d060b60406a745766380195d65a" 4585 + 4586 + [[package]] 4587 + name = "sec1" 4588 + version = "0.7.3" 4589 + source = "registry+https://github.com/rust-lang/crates.io-index" 4590 + checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 4591 + dependencies = [ 4592 + "base16ct", 4593 + "der", 4594 + "generic-array", 4595 + "pkcs8", 4596 + "subtle", 4597 + "zeroize", 4598 + ] 4599 + 4600 + [[package]] 4601 + name = "self_cell" 4602 + version = "1.2.1" 4603 + source = "registry+https://github.com/rust-lang/crates.io-index" 4604 + checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" 4605 + 4606 + [[package]] 4607 + name = "semver" 4608 + version = "1.0.27" 4609 + source = "registry+https://github.com/rust-lang/crates.io-index" 4610 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 4611 + 4612 + [[package]] 4613 + name = "send_wrapper" 4614 + version = "0.6.0" 4615 + source = "registry+https://github.com/rust-lang/crates.io-index" 4616 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 4617 + 4618 + [[package]] 4619 + name = "serde" 4620 + version = "1.0.228" 4621 + source = "registry+https://github.com/rust-lang/crates.io-index" 4622 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 4623 + dependencies = [ 4624 + "serde_core", 4625 + "serde_derive", 4626 + ] 4627 + 4628 + [[package]] 4629 + name = "serde_bytes" 4630 + version = "0.11.19" 4631 + source = "registry+https://github.com/rust-lang/crates.io-index" 4632 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 4633 + dependencies = [ 4634 + "serde", 4635 + "serde_core", 4636 + ] 4637 + 4638 + [[package]] 4639 + name = "serde_core" 4640 + version = "1.0.228" 4641 + source = "registry+https://github.com/rust-lang/crates.io-index" 4642 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 4643 + dependencies = [ 4644 + "serde_derive", 4645 + ] 4646 + 4647 + [[package]] 4648 + name = "serde_derive" 4649 + version = "1.0.228" 4650 + source = "registry+https://github.com/rust-lang/crates.io-index" 4651 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 4652 + dependencies = [ 4653 + "proc-macro2", 4654 + "quote", 4655 + "syn 2.0.111", 4656 + ] 4657 + 4658 + [[package]] 4659 + name = "serde_html_form" 4660 + version = "0.2.8" 4661 + source = "registry+https://github.com/rust-lang/crates.io-index" 4662 + checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" 4663 + dependencies = [ 4664 + "form_urlencoded", 4665 + "indexmap 2.12.1", 4666 + "itoa", 4667 + "ryu", 4668 + "serde_core", 4669 + ] 4670 + 4671 + [[package]] 4672 + name = "serde_ipld_dagcbor" 4673 + version = "0.6.4" 4674 + source = "registry+https://github.com/rust-lang/crates.io-index" 4675 + checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" 4676 + dependencies = [ 4677 + "cbor4ii", 4678 + "ipld-core", 4679 + "scopeguard", 4680 + "serde", 4681 + ] 4682 + 4683 + [[package]] 4684 + name = "serde_json" 4685 + version = "1.0.145" 4686 + source = "registry+https://github.com/rust-lang/crates.io-index" 4687 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 4688 + dependencies = [ 4689 + "indexmap 2.12.1", 4690 + "itoa", 4691 + "memchr", 4692 + "ryu", 4693 + "serde", 4694 + "serde_core", 4695 + ] 4696 + 4697 + [[package]] 4698 + name = "serde_repr" 4699 + version = "0.1.20" 4700 + source = "registry+https://github.com/rust-lang/crates.io-index" 4701 + checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" 4702 + dependencies = [ 4703 + "proc-macro2", 4704 + "quote", 4705 + "syn 2.0.111", 4706 + ] 4707 + 4708 + [[package]] 4709 + name = "serde_spanned" 4710 + version = "0.6.9" 4711 + source = "registry+https://github.com/rust-lang/crates.io-index" 4712 + checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" 4713 + dependencies = [ 4714 + "serde", 4715 + ] 4716 + 4717 + [[package]] 4718 + name = "serde_urlencoded" 4719 + version = "0.7.1" 4720 + source = "registry+https://github.com/rust-lang/crates.io-index" 4721 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 4722 + dependencies = [ 4723 + "form_urlencoded", 4724 + "itoa", 4725 + "ryu", 4726 + "serde", 4727 + ] 4728 + 4729 + [[package]] 4730 + name = "serde_with" 4731 + version = "3.16.1" 4732 + source = "registry+https://github.com/rust-lang/crates.io-index" 4733 + checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" 4734 + dependencies = [ 4735 + "base64", 4736 + "chrono", 4737 + "hex", 4738 + "indexmap 1.9.3", 4739 + "indexmap 2.12.1", 4740 + "schemars 0.9.0", 4741 + "schemars 1.1.0", 4742 + "serde_core", 4743 + "serde_json", 4744 + "serde_with_macros", 4745 + "time", 4746 + ] 4747 + 4748 + [[package]] 4749 + name = "serde_with_macros" 4750 + version = "3.16.1" 4751 + source = "registry+https://github.com/rust-lang/crates.io-index" 4752 + checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" 4753 + dependencies = [ 4754 + "darling", 4755 + "proc-macro2", 4756 + "quote", 4757 + "syn 2.0.111", 4758 + ] 4759 + 4760 + [[package]] 4761 + name = "serde_yaml" 4762 + version = "0.9.34+deprecated" 4763 + source = "registry+https://github.com/rust-lang/crates.io-index" 4764 + checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" 4765 + dependencies = [ 4766 + "indexmap 2.12.1", 4767 + "itoa", 4768 + "ryu", 4769 + "serde", 4770 + "unsafe-libyaml", 4771 + ] 4772 + 4773 + [[package]] 4774 + name = "sha2" 4775 + version = "0.10.9" 4776 + source = "registry+https://github.com/rust-lang/crates.io-index" 4777 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 4778 + dependencies = [ 4779 + "cfg-if", 4780 + "cpufeatures", 4781 + "digest", 4782 + ] 4783 + 4784 + [[package]] 4785 + name = "shadow-rs" 4786 + version = "1.4.0" 4787 + source = "registry+https://github.com/rust-lang/crates.io-index" 4788 + checksum = "72d18183cef626bce22836103349c7050d73db799be0171386b80947d157ae32" 4789 + dependencies = [ 4790 + "const_format", 4791 + "is_debug", 4792 + "time", 4793 + "tzdb", 4794 + ] 4795 + 4796 + [[package]] 4797 + name = "sharded-slab" 4798 + version = "0.1.7" 4799 + source = "registry+https://github.com/rust-lang/crates.io-index" 4800 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 4801 + dependencies = [ 4802 + "lazy_static", 4803 + ] 4804 + 4805 + [[package]] 4806 + name = "shell-words" 4807 + version = "1.1.1" 4808 + source = "registry+https://github.com/rust-lang/crates.io-index" 4809 + checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" 4810 + 4811 + [[package]] 4812 + name = "shlex" 4813 + version = "1.3.0" 4814 + source = "registry+https://github.com/rust-lang/crates.io-index" 4815 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 4816 + 4817 + [[package]] 4818 + name = "signature" 4819 + version = "2.2.0" 4820 + source = "registry+https://github.com/rust-lang/crates.io-index" 4821 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 4822 + dependencies = [ 4823 + "digest", 4824 + "rand_core 0.6.4", 4825 + ] 4826 + 4827 + [[package]] 4828 + name = "simd-adler32" 4829 + version = "0.3.8" 4830 + source = "registry+https://github.com/rust-lang/crates.io-index" 4831 + checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" 4832 + 4833 + [[package]] 4834 + name = "siphasher" 4835 + version = "1.0.1" 4836 + source = "registry+https://github.com/rust-lang/crates.io-index" 4837 + checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 4838 + 4839 + [[package]] 4840 + name = "slab" 4841 + version = "0.4.11" 4842 + source = "registry+https://github.com/rust-lang/crates.io-index" 4843 + checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 4844 + 4845 + [[package]] 4846 + name = "smallvec" 4847 + version = "1.15.1" 4848 + source = "registry+https://github.com/rust-lang/crates.io-index" 4849 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 4850 + 4851 + [[package]] 4852 + name = "smol_str" 4853 + version = "0.3.4" 4854 + source = "registry+https://github.com/rust-lang/crates.io-index" 4855 + checksum = "3498b0a27f93ef1402f20eefacfaa1691272ac4eca1cdc8c596cb0a245d6cbf5" 4856 + dependencies = [ 4857 + "borsh", 4858 + "serde_core", 4859 + ] 4860 + 4861 + [[package]] 4862 + name = "socket2" 4863 + version = "0.6.1" 4864 + source = "registry+https://github.com/rust-lang/crates.io-index" 4865 + checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 4866 + dependencies = [ 4867 + "libc", 4868 + "windows-sys 0.60.2", 4869 + ] 4870 + 4871 + [[package]] 4872 + name = "spin" 4873 + version = "0.9.8" 4874 + source = "registry+https://github.com/rust-lang/crates.io-index" 4875 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 4876 + dependencies = [ 4877 + "lock_api", 4878 + ] 4879 + 4880 + [[package]] 4881 + name = "spin" 4882 + version = "0.10.0" 4883 + source = "registry+https://github.com/rust-lang/crates.io-index" 4884 + checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" 4885 + 4886 + [[package]] 4887 + name = "spki" 4888 + version = "0.7.3" 4889 + source = "registry+https://github.com/rust-lang/crates.io-index" 4890 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 4891 + dependencies = [ 4892 + "base64ct", 4893 + "der", 4894 + ] 4895 + 4896 + [[package]] 4897 + name = "stable_deref_trait" 4898 + version = "1.2.1" 4899 + source = "registry+https://github.com/rust-lang/crates.io-index" 4900 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 4901 + 4902 + [[package]] 4903 + name = "static-regular-grammar" 4904 + version = "2.0.2" 4905 + source = "registry+https://github.com/rust-lang/crates.io-index" 4906 + checksum = "4f4a6c40247579acfbb138c3cd7de3dab113ab4ac6227f1b7de7d626ee667957" 4907 + dependencies = [ 4908 + "abnf", 4909 + "btree-range-map", 4910 + "ciborium", 4911 + "hex_fmt", 4912 + "indoc", 4913 + "proc-macro-error", 4914 + "proc-macro2", 4915 + "quote", 4916 + "serde", 4917 + "sha2", 4918 + "syn 2.0.111", 4919 + "thiserror 1.0.69", 4920 + ] 4921 + 4922 + [[package]] 4923 + name = "static_assertions" 4924 + version = "1.1.0" 4925 + source = "registry+https://github.com/rust-lang/crates.io-index" 4926 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 4927 + 4928 + [[package]] 4929 + name = "string_cache" 4930 + version = "0.8.9" 4931 + source = "registry+https://github.com/rust-lang/crates.io-index" 4932 + checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" 4933 + dependencies = [ 4934 + "new_debug_unreachable", 4935 + "parking_lot", 4936 + "phf_shared 0.11.3", 4937 + "precomputed-hash", 4938 + "serde", 4939 + ] 4940 + 4941 + [[package]] 4942 + name = "string_cache_codegen" 4943 + version = "0.5.4" 4944 + source = "registry+https://github.com/rust-lang/crates.io-index" 4945 + checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" 4946 + dependencies = [ 4947 + "phf_generator", 4948 + "phf_shared 0.11.3", 4949 + "proc-macro2", 4950 + "quote", 4951 + ] 4952 + 4953 + [[package]] 4954 + name = "strip-ansi-escapes" 4955 + version = "0.2.1" 4956 + source = "registry+https://github.com/rust-lang/crates.io-index" 4957 + checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" 4958 + dependencies = [ 4959 + "vte", 4960 + ] 4961 + 4962 + [[package]] 4963 + name = "strsim" 4964 + version = "0.11.1" 4965 + source = "registry+https://github.com/rust-lang/crates.io-index" 4966 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 4967 + 4968 + [[package]] 4969 + name = "strum" 4970 + version = "0.26.3" 4971 + source = "registry+https://github.com/rust-lang/crates.io-index" 4972 + checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 4973 + 4974 + [[package]] 4975 + name = "strum_macros" 4976 + version = "0.27.2" 4977 + source = "registry+https://github.com/rust-lang/crates.io-index" 4978 + checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" 4979 + dependencies = [ 4980 + "heck 0.5.0", 4981 + "proc-macro2", 4982 + "quote", 4983 + "syn 2.0.111", 4984 + ] 4985 + 4986 + [[package]] 4987 + name = "subtle" 4988 + version = "2.6.1" 4989 + source = "registry+https://github.com/rust-lang/crates.io-index" 4990 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 4991 + 4992 + [[package]] 4993 + name = "supports-color" 4994 + version = "3.0.2" 4995 + source = "registry+https://github.com/rust-lang/crates.io-index" 4996 + checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" 4997 + dependencies = [ 4998 + "is_ci", 4999 + ] 5000 + 5001 + [[package]] 5002 + name = "supports-hyperlinks" 5003 + version = "3.1.0" 5004 + source = "registry+https://github.com/rust-lang/crates.io-index" 5005 + checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" 5006 + 5007 + [[package]] 5008 + name = "supports-unicode" 5009 + version = "3.0.0" 5010 + source = "registry+https://github.com/rust-lang/crates.io-index" 5011 + checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" 5012 + 5013 + [[package]] 5014 + name = "syn" 5015 + version = "1.0.109" 5016 + source = "registry+https://github.com/rust-lang/crates.io-index" 5017 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 5018 + dependencies = [ 5019 + "proc-macro2", 5020 + "quote", 5021 + "unicode-ident", 5022 + ] 5023 + 5024 + [[package]] 5025 + name = "syn" 5026 + version = "2.0.111" 5027 + source = "registry+https://github.com/rust-lang/crates.io-index" 5028 + checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" 5029 + dependencies = [ 5030 + "proc-macro2", 5031 + "quote", 5032 + "unicode-ident", 5033 + ] 5034 + 5035 + [[package]] 5036 + name = "sync_wrapper" 5037 + version = "1.0.2" 5038 + source = "registry+https://github.com/rust-lang/crates.io-index" 5039 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 5040 + dependencies = [ 5041 + "futures-core", 5042 + ] 5043 + 5044 + [[package]] 5045 + name = "synstructure" 5046 + version = "0.13.2" 5047 + source = "registry+https://github.com/rust-lang/crates.io-index" 5048 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 5049 + dependencies = [ 5050 + "proc-macro2", 5051 + "quote", 5052 + "syn 2.0.111", 5053 + ] 5054 + 5055 + [[package]] 5056 + name = "sys-locale" 5057 + version = "0.3.2" 5058 + source = "registry+https://github.com/rust-lang/crates.io-index" 5059 + checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 5060 + dependencies = [ 5061 + "libc", 5062 + ] 5063 + 5064 + [[package]] 5065 + name = "sysinfo" 5066 + version = "0.37.2" 5067 + source = "registry+https://github.com/rust-lang/crates.io-index" 5068 + checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f" 5069 + dependencies = [ 5070 + "libc", 5071 + "memchr", 5072 + "ntapi", 5073 + "objc2-core-foundation", 5074 + "objc2-io-kit", 5075 + "windows 0.61.3", 5076 + ] 5077 + 5078 + [[package]] 5079 + name = "system-configuration" 5080 + version = "0.6.1" 5081 + source = "registry+https://github.com/rust-lang/crates.io-index" 5082 + checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 5083 + dependencies = [ 5084 + "bitflags", 5085 + "core-foundation", 5086 + "system-configuration-sys", 5087 + ] 5088 + 5089 + [[package]] 5090 + name = "system-configuration-sys" 5091 + version = "0.6.0" 5092 + source = "registry+https://github.com/rust-lang/crates.io-index" 5093 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 5094 + dependencies = [ 5095 + "core-foundation-sys", 5096 + "libc", 5097 + ] 5098 + 5099 + [[package]] 5100 + name = "tabled" 5101 + version = "0.20.0" 5102 + source = "registry+https://github.com/rust-lang/crates.io-index" 5103 + checksum = "e39a2ee1fbcd360805a771e1b300f78cc88fec7b8d3e2f71cd37bbf23e725c7d" 5104 + dependencies = [ 5105 + "ansi-str", 5106 + "ansitok", 5107 + "papergrid", 5108 + "testing_table", 5109 + ] 5110 + 5111 + [[package]] 5112 + name = "tagptr" 5113 + version = "0.2.0" 5114 + source = "registry+https://github.com/rust-lang/crates.io-index" 5115 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 5116 + 5117 + [[package]] 5118 + name = "tempfile" 5119 + version = "3.23.0" 5120 + source = "registry+https://github.com/rust-lang/crates.io-index" 5121 + checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 5122 + dependencies = [ 5123 + "fastrand", 5124 + "getrandom 0.3.4", 5125 + "once_cell", 5126 + "rustix 1.1.2", 5127 + "windows-sys 0.61.2", 5128 + ] 5129 + 5130 + [[package]] 5131 + name = "tendril" 5132 + version = "0.4.3" 5133 + source = "registry+https://github.com/rust-lang/crates.io-index" 5134 + checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 5135 + dependencies = [ 5136 + "futf", 5137 + "mac", 5138 + "utf-8", 5139 + ] 5140 + 5141 + [[package]] 5142 + name = "terminal_size" 5143 + version = "0.4.3" 5144 + source = "registry+https://github.com/rust-lang/crates.io-index" 5145 + checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" 5146 + dependencies = [ 5147 + "rustix 1.1.2", 5148 + "windows-sys 0.60.2", 5149 + ] 5150 + 5151 + [[package]] 5152 + name = "testing_table" 5153 + version = "0.3.0" 5154 + source = "registry+https://github.com/rust-lang/crates.io-index" 5155 + checksum = "0f8daae29995a24f65619e19d8d31dea5b389f3d853d8bf297bbf607cd0014cc" 5156 + dependencies = [ 5157 + "ansitok", 5158 + "unicode-width 0.2.2", 5159 + ] 5160 + 5161 + [[package]] 5162 + name = "textwrap" 5163 + version = "0.16.2" 5164 + source = "registry+https://github.com/rust-lang/crates.io-index" 5165 + checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" 5166 + dependencies = [ 5167 + "unicode-linebreak", 5168 + "unicode-width 0.2.2", 5169 + ] 5170 + 5171 + [[package]] 5172 + name = "thiserror" 5173 + version = "1.0.69" 5174 + source = "registry+https://github.com/rust-lang/crates.io-index" 5175 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 5176 + dependencies = [ 5177 + "thiserror-impl 1.0.69", 5178 + ] 5179 + 5180 + [[package]] 5181 + name = "thiserror" 5182 + version = "2.0.17" 5183 + source = "registry+https://github.com/rust-lang/crates.io-index" 5184 + checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 5185 + dependencies = [ 5186 + "thiserror-impl 2.0.17", 5187 + ] 5188 + 5189 + [[package]] 5190 + name = "thiserror-impl" 5191 + version = "1.0.69" 5192 + source = "registry+https://github.com/rust-lang/crates.io-index" 5193 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 5194 + dependencies = [ 5195 + "proc-macro2", 5196 + "quote", 5197 + "syn 2.0.111", 5198 + ] 5199 + 5200 + [[package]] 5201 + name = "thiserror-impl" 5202 + version = "2.0.17" 5203 + source = "registry+https://github.com/rust-lang/crates.io-index" 5204 + checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 5205 + dependencies = [ 5206 + "proc-macro2", 5207 + "quote", 5208 + "syn 2.0.111", 5209 + ] 5210 + 5211 + [[package]] 5212 + name = "thread_local" 5213 + version = "1.1.9" 5214 + source = "registry+https://github.com/rust-lang/crates.io-index" 5215 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 5216 + dependencies = [ 5217 + "cfg-if", 5218 + ] 5219 + 5220 + [[package]] 5221 + name = "time" 5222 + version = "0.3.44" 5223 + source = "registry+https://github.com/rust-lang/crates.io-index" 5224 + checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 5225 + dependencies = [ 5226 + "deranged", 5227 + "itoa", 5228 + "libc", 5229 + "num-conv", 5230 + "num_threads", 5231 + "powerfmt", 5232 + "serde", 5233 + "time-core", 5234 + "time-macros", 5235 + ] 5236 + 5237 + [[package]] 5238 + name = "time-core" 5239 + version = "0.1.6" 5240 + source = "registry+https://github.com/rust-lang/crates.io-index" 5241 + checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 5242 + 5243 + [[package]] 5244 + name = "time-macros" 5245 + version = "0.2.24" 5246 + source = "registry+https://github.com/rust-lang/crates.io-index" 5247 + checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 5248 + dependencies = [ 5249 + "num-conv", 5250 + "time-core", 5251 + ] 5252 + 5253 + [[package]] 5254 + name = "tinystr" 5255 + version = "0.8.2" 5256 + source = "registry+https://github.com/rust-lang/crates.io-index" 5257 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 5258 + dependencies = [ 5259 + "displaydoc", 5260 + "serde_core", 5261 + "zerovec", 5262 + ] 5263 + 5264 + [[package]] 5265 + name = "tinyvec" 5266 + version = "1.10.0" 5267 + source = "registry+https://github.com/rust-lang/crates.io-index" 5268 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 5269 + dependencies = [ 5270 + "tinyvec_macros", 5271 + ] 5272 + 5273 + [[package]] 5274 + name = "tinyvec_macros" 5275 + version = "0.1.1" 5276 + source = "registry+https://github.com/rust-lang/crates.io-index" 5277 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 5278 + 5279 + [[package]] 5280 + name = "titlecase" 5281 + version = "3.6.0" 5282 + source = "registry+https://github.com/rust-lang/crates.io-index" 5283 + checksum = "eb567088a91d59b492520c8149e2be5ce10d5deb2d9a383f3378df3259679d40" 5284 + dependencies = [ 5285 + "regex", 5286 + ] 5287 + 5288 + [[package]] 5289 + name = "tokio" 5290 + version = "1.48.0" 5291 + source = "registry+https://github.com/rust-lang/crates.io-index" 5292 + checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 5293 + dependencies = [ 5294 + "bytes", 5295 + "libc", 5296 + "mio", 5297 + "pin-project-lite", 5298 + "socket2", 5299 + "tokio-macros", 5300 + "windows-sys 0.61.2", 5301 + ] 5302 + 5303 + [[package]] 5304 + name = "tokio-macros" 5305 + version = "2.6.0" 5306 + source = "registry+https://github.com/rust-lang/crates.io-index" 5307 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 5308 + dependencies = [ 5309 + "proc-macro2", 5310 + "quote", 5311 + "syn 2.0.111", 5312 + ] 5313 + 5314 + [[package]] 5315 + name = "tokio-rustls" 5316 + version = "0.26.4" 5317 + source = "registry+https://github.com/rust-lang/crates.io-index" 5318 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 5319 + dependencies = [ 5320 + "rustls", 5321 + "tokio", 5322 + ] 5323 + 5324 + [[package]] 5325 + name = "tokio-util" 5326 + version = "0.7.17" 5327 + source = "registry+https://github.com/rust-lang/crates.io-index" 5328 + checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" 5329 + dependencies = [ 5330 + "bytes", 5331 + "futures-core", 5332 + "futures-sink", 5333 + "futures-util", 5334 + "pin-project-lite", 5335 + "tokio", 5336 + ] 5337 + 5338 + [[package]] 5339 + name = "toml" 5340 + version = "0.8.23" 5341 + source = "registry+https://github.com/rust-lang/crates.io-index" 5342 + checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 5343 + dependencies = [ 5344 + "indexmap 2.12.1", 5345 + "serde", 5346 + "serde_spanned", 5347 + "toml_datetime", 5348 + "toml_edit", 5349 + ] 5350 + 5351 + [[package]] 5352 + name = "toml_datetime" 5353 + version = "0.6.11" 5354 + source = "registry+https://github.com/rust-lang/crates.io-index" 5355 + checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 5356 + dependencies = [ 5357 + "serde", 5358 + ] 5359 + 5360 + [[package]] 5361 + name = "toml_edit" 5362 + version = "0.22.27" 5363 + source = "registry+https://github.com/rust-lang/crates.io-index" 5364 + checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 5365 + dependencies = [ 5366 + "indexmap 2.12.1", 5367 + "serde", 5368 + "serde_spanned", 5369 + "toml_datetime", 5370 + "toml_write", 5371 + "winnow", 5372 + ] 5373 + 5374 + [[package]] 5375 + name = "toml_write" 5376 + version = "0.1.2" 5377 + source = "registry+https://github.com/rust-lang/crates.io-index" 5378 + checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 5379 + 5380 + [[package]] 5381 + name = "tower" 5382 + version = "0.5.2" 5383 + source = "registry+https://github.com/rust-lang/crates.io-index" 5384 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 5385 + dependencies = [ 5386 + "futures-core", 5387 + "futures-util", 5388 + "pin-project-lite", 5389 + "sync_wrapper", 5390 + "tokio", 5391 + "tower-layer", 5392 + "tower-service", 5393 + ] 5394 + 5395 + [[package]] 5396 + name = "tower-http" 5397 + version = "0.6.8" 5398 + source = "registry+https://github.com/rust-lang/crates.io-index" 5399 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 5400 + dependencies = [ 5401 + "async-compression", 5402 + "bitflags", 5403 + "bytes", 5404 + "futures-core", 5405 + "futures-util", 5406 + "http", 5407 + "http-body", 5408 + "http-body-util", 5409 + "iri-string", 5410 + "pin-project-lite", 5411 + "tokio", 5412 + "tokio-util", 5413 + "tower", 5414 + "tower-layer", 5415 + "tower-service", 5416 + ] 5417 + 5418 + [[package]] 5419 + name = "tower-layer" 5420 + version = "0.3.3" 5421 + source = "registry+https://github.com/rust-lang/crates.io-index" 5422 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 5423 + 5424 + [[package]] 5425 + name = "tower-service" 5426 + version = "0.3.3" 5427 + source = "registry+https://github.com/rust-lang/crates.io-index" 5428 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 5429 + 5430 + [[package]] 5431 + name = "tracing" 5432 + version = "0.1.43" 5433 + source = "registry+https://github.com/rust-lang/crates.io-index" 5434 + checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" 5435 + dependencies = [ 5436 + "pin-project-lite", 5437 + "tracing-attributes", 5438 + "tracing-core", 5439 + ] 5440 + 5441 + [[package]] 5442 + name = "tracing-attributes" 5443 + version = "0.1.31" 5444 + source = "registry+https://github.com/rust-lang/crates.io-index" 5445 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 5446 + dependencies = [ 5447 + "proc-macro2", 5448 + "quote", 5449 + "syn 2.0.111", 5450 + ] 5451 + 5452 + [[package]] 5453 + name = "tracing-core" 5454 + version = "0.1.35" 5455 + source = "registry+https://github.com/rust-lang/crates.io-index" 5456 + checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" 5457 + dependencies = [ 5458 + "once_cell", 5459 + "valuable", 5460 + ] 5461 + 5462 + [[package]] 5463 + name = "tracing-log" 5464 + version = "0.2.0" 5465 + source = "registry+https://github.com/rust-lang/crates.io-index" 5466 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 5467 + dependencies = [ 5468 + "log", 5469 + "once_cell", 5470 + "tracing-core", 5471 + ] 5472 + 5473 + [[package]] 5474 + name = "tracing-subscriber" 5475 + version = "0.3.22" 5476 + source = "registry+https://github.com/rust-lang/crates.io-index" 5477 + checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 5478 + dependencies = [ 5479 + "matchers", 5480 + "nu-ansi-term", 5481 + "once_cell", 5482 + "regex-automata", 5483 + "sharded-slab", 5484 + "smallvec", 5485 + "thread_local", 5486 + "tracing", 5487 + "tracing-core", 5488 + "tracing-log", 5489 + ] 5490 + 5491 + [[package]] 5492 + name = "trait-variant" 5493 + version = "0.1.2" 5494 + source = "registry+https://github.com/rust-lang/crates.io-index" 5495 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 5496 + dependencies = [ 5497 + "proc-macro2", 5498 + "quote", 5499 + "syn 2.0.111", 5500 + ] 5501 + 5502 + [[package]] 5503 + name = "triomphe" 5504 + version = "0.1.15" 5505 + source = "registry+https://github.com/rust-lang/crates.io-index" 5506 + checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" 5507 + 5508 + [[package]] 5509 + name = "try-lock" 5510 + version = "0.2.5" 5511 + source = "registry+https://github.com/rust-lang/crates.io-index" 5512 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 5513 + 5514 + [[package]] 5515 + name = "type-map" 5516 + version = "0.5.1" 5517 + source = "registry+https://github.com/rust-lang/crates.io-index" 5518 + checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" 5519 + dependencies = [ 5520 + "rustc-hash", 5521 + ] 5522 + 5523 + [[package]] 5524 + name = "typeid" 5525 + version = "1.0.3" 5526 + source = "registry+https://github.com/rust-lang/crates.io-index" 5527 + checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 5528 + 5529 + [[package]] 5530 + name = "typenum" 5531 + version = "1.19.0" 5532 + source = "registry+https://github.com/rust-lang/crates.io-index" 5533 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 5534 + 5535 + [[package]] 5536 + name = "typetag" 5537 + version = "0.2.21" 5538 + source = "registry+https://github.com/rust-lang/crates.io-index" 5539 + checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" 5540 + dependencies = [ 5541 + "erased-serde", 5542 + "inventory", 5543 + "once_cell", 5544 + "serde", 5545 + "typetag-impl", 5546 + ] 5547 + 5548 + [[package]] 5549 + name = "typetag-impl" 5550 + version = "0.2.21" 5551 + source = "registry+https://github.com/rust-lang/crates.io-index" 5552 + checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" 5553 + dependencies = [ 5554 + "proc-macro2", 5555 + "quote", 5556 + "syn 2.0.111", 5557 + ] 5558 + 5559 + [[package]] 5560 + name = "tz-rs" 5561 + version = "0.7.1" 5562 + source = "registry+https://github.com/rust-lang/crates.io-index" 5563 + checksum = "14eff19b8dc1ace5bf7e4d920b2628ae3837f422ff42210cb1567cbf68b5accf" 5564 + 5565 + [[package]] 5566 + name = "tzdb" 5567 + version = "0.7.3" 5568 + source = "registry+https://github.com/rust-lang/crates.io-index" 5569 + checksum = "56d4e985b6dda743ae7fd4140c28105316ffd75bc58258ee6cc12934e3eb7a0c" 5570 + dependencies = [ 5571 + "iana-time-zone", 5572 + "tz-rs", 5573 + "tzdb_data", 5574 + ] 5575 + 5576 + [[package]] 5577 + name = "tzdb_data" 5578 + version = "0.2.3" 5579 + source = "registry+https://github.com/rust-lang/crates.io-index" 5580 + checksum = "42302a846dea7ab786f42dc5f519387069045acff793e1178d9368414168fe95" 5581 + dependencies = [ 5582 + "tz-rs", 5583 + ] 5584 + 5585 + [[package]] 5586 + name = "ucd-trie" 5587 + version = "0.1.7" 5588 + source = "registry+https://github.com/rust-lang/crates.io-index" 5589 + checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 5590 + 5591 + [[package]] 5592 + name = "uds_windows" 5593 + version = "1.1.0" 5594 + source = "registry+https://github.com/rust-lang/crates.io-index" 5595 + checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 5596 + dependencies = [ 5597 + "memoffset", 5598 + "tempfile", 5599 + "winapi", 5600 + ] 5601 + 5602 + [[package]] 5603 + name = "umask" 5604 + version = "2.1.0" 5605 + source = "registry+https://github.com/rust-lang/crates.io-index" 5606 + checksum = "ec9a46c2549e35c054e0ffe281a3a6ec0007793db4df106604d37ed3f4d73d1c" 5607 + dependencies = [ 5608 + "thiserror 1.0.69", 5609 + ] 5610 + 5611 + [[package]] 5612 + name = "unic-langid" 5613 + version = "0.9.6" 5614 + source = "registry+https://github.com/rust-lang/crates.io-index" 5615 + checksum = "a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05" 5616 + dependencies = [ 5617 + "unic-langid-impl", 5618 + ] 5619 + 5620 + [[package]] 5621 + name = "unic-langid-impl" 5622 + version = "0.9.6" 5623 + source = "registry+https://github.com/rust-lang/crates.io-index" 5624 + checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" 5625 + dependencies = [ 5626 + "tinystr", 5627 + ] 5628 + 5629 + [[package]] 5630 + name = "unicase" 5631 + version = "2.8.1" 5632 + source = "registry+https://github.com/rust-lang/crates.io-index" 5633 + checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 5634 + 5635 + [[package]] 5636 + name = "unicode-ident" 5637 + version = "1.0.22" 5638 + source = "registry+https://github.com/rust-lang/crates.io-index" 5639 + checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 5640 + 5641 + [[package]] 5642 + name = "unicode-linebreak" 5643 + version = "0.1.5" 5644 + source = "registry+https://github.com/rust-lang/crates.io-index" 5645 + checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 5646 + 5647 + [[package]] 5648 + name = "unicode-segmentation" 5649 + version = "1.12.0" 5650 + source = "registry+https://github.com/rust-lang/crates.io-index" 5651 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 5652 + 5653 + [[package]] 5654 + name = "unicode-width" 5655 + version = "0.1.14" 5656 + source = "registry+https://github.com/rust-lang/crates.io-index" 5657 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 5658 + 5659 + [[package]] 5660 + name = "unicode-width" 5661 + version = "0.2.2" 5662 + source = "registry+https://github.com/rust-lang/crates.io-index" 5663 + checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" 5664 + 5665 + [[package]] 5666 + name = "unicode-xid" 5667 + version = "0.2.6" 5668 + source = "registry+https://github.com/rust-lang/crates.io-index" 5669 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 5670 + 5671 + [[package]] 5672 + name = "unit-prefix" 5673 + version = "0.5.2" 5674 + source = "registry+https://github.com/rust-lang/crates.io-index" 5675 + checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" 5676 + 5677 + [[package]] 5678 + name = "unsafe-libyaml" 5679 + version = "0.2.11" 5680 + source = "registry+https://github.com/rust-lang/crates.io-index" 5681 + checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" 5682 + 5683 + [[package]] 5684 + name = "unsigned-varint" 5685 + version = "0.7.2" 5686 + source = "registry+https://github.com/rust-lang/crates.io-index" 5687 + checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" 5688 + 5689 + [[package]] 5690 + name = "unsigned-varint" 5691 + version = "0.8.0" 5692 + source = "registry+https://github.com/rust-lang/crates.io-index" 5693 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 5694 + 5695 + [[package]] 5696 + name = "untrusted" 5697 + version = "0.9.0" 5698 + source = "registry+https://github.com/rust-lang/crates.io-index" 5699 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 5700 + 5701 + [[package]] 5702 + name = "url" 5703 + version = "2.5.7" 5704 + source = "registry+https://github.com/rust-lang/crates.io-index" 5705 + checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 5706 + dependencies = [ 5707 + "form_urlencoded", 5708 + "idna", 5709 + "percent-encoding", 5710 + "serde", 5711 + ] 5712 + 5713 + [[package]] 5714 + name = "urlencoding" 5715 + version = "2.1.3" 5716 + source = "registry+https://github.com/rust-lang/crates.io-index" 5717 + checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 5718 + 5719 + [[package]] 5720 + name = "utf-8" 5721 + version = "0.7.6" 5722 + source = "registry+https://github.com/rust-lang/crates.io-index" 5723 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 5724 + 5725 + [[package]] 5726 + name = "utf8_iter" 5727 + version = "1.0.4" 5728 + source = "registry+https://github.com/rust-lang/crates.io-index" 5729 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 5730 + 5731 + [[package]] 5732 + name = "utf8parse" 5733 + version = "0.2.2" 5734 + source = "registry+https://github.com/rust-lang/crates.io-index" 5735 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 5736 + 5737 + [[package]] 5738 + name = "uucore" 5739 + version = "0.4.0" 5740 + source = "registry+https://github.com/rust-lang/crates.io-index" 5741 + checksum = "2003164a38a7f39da1de103a70fa66b745f572f0045ec261481539516c0a8a0e" 5742 + dependencies = [ 5743 + "bstr", 5744 + "clap", 5745 + "fluent", 5746 + "fluent-bundle", 5747 + "fluent-syntax", 5748 + "libc", 5749 + "nix", 5750 + "number_prefix", 5751 + "os_display", 5752 + "phf 0.13.1", 5753 + "procfs 0.18.0", 5754 + "thiserror 2.0.17", 5755 + "unic-langid", 5756 + "uucore_procs", 5757 + "wild", 5758 + ] 5759 + 5760 + [[package]] 5761 + name = "uucore_procs" 5762 + version = "0.4.0" 5763 + source = "registry+https://github.com/rust-lang/crates.io-index" 5764 + checksum = "c76f0308f7810d915246a39748e7f5d64e43e6bb9d6c8107224f9d741aefc375" 5765 + dependencies = [ 5766 + "proc-macro2", 5767 + "quote", 5768 + ] 5769 + 5770 + [[package]] 5771 + name = "v_htmlescape" 5772 + version = "0.15.8" 5773 + source = "registry+https://github.com/rust-lang/crates.io-index" 5774 + checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" 5775 + 5776 + [[package]] 5777 + name = "valuable" 5778 + version = "0.1.1" 5779 + source = "registry+https://github.com/rust-lang/crates.io-index" 5780 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 5781 + 5782 + [[package]] 5783 + name = "version_check" 5784 + version = "0.9.5" 5785 + source = "registry+https://github.com/rust-lang/crates.io-index" 5786 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5787 + 5788 + [[package]] 5789 + name = "vfs" 5790 + version = "0.12.1" 5791 + source = "git+https://github.com/landaire/rust-vfs?branch=fix%2Fwasm#c4341e8e7c16a019c1a1415fc8a413bf883a08d5" 5792 + dependencies = [ 5793 + "filetime", 5794 + ] 5795 + 5796 + [[package]] 5797 + name = "vte" 5798 + version = "0.14.1" 5799 + source = "registry+https://github.com/rust-lang/crates.io-index" 5800 + checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" 5801 + dependencies = [ 5802 + "arrayvec", 5803 + "memchr", 5804 + ] 5805 + 5806 + [[package]] 5807 + name = "walkdir" 5808 + version = "2.5.0" 5809 + source = "registry+https://github.com/rust-lang/crates.io-index" 5810 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 5811 + dependencies = [ 5812 + "same-file", 5813 + "winapi-util", 5814 + ] 5815 + 5816 + [[package]] 5817 + name = "want" 5818 + version = "0.3.1" 5819 + source = "registry+https://github.com/rust-lang/crates.io-index" 5820 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 5821 + dependencies = [ 5822 + "try-lock", 5823 + ] 5824 + 5825 + [[package]] 5826 + name = "wasi" 5827 + version = "0.11.1+wasi-snapshot-preview1" 5828 + source = "registry+https://github.com/rust-lang/crates.io-index" 5829 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 5830 + 5831 + [[package]] 5832 + name = "wasip2" 5833 + version = "1.0.1+wasi-0.2.4" 5834 + source = "registry+https://github.com/rust-lang/crates.io-index" 5835 + checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 5836 + dependencies = [ 5837 + "wit-bindgen", 5838 + ] 5839 + 5840 + [[package]] 5841 + name = "wasm-bindgen" 5842 + version = "0.2.104" 5843 + source = "registry+https://github.com/rust-lang/crates.io-index" 5844 + checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 5845 + dependencies = [ 5846 + "cfg-if", 5847 + "once_cell", 5848 + "rustversion", 5849 + "wasm-bindgen-macro", 5850 + "wasm-bindgen-shared", 5851 + ] 5852 + 5853 + [[package]] 5854 + name = "wasm-bindgen-backend" 5855 + version = "0.2.104" 5856 + source = "registry+https://github.com/rust-lang/crates.io-index" 5857 + checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 5858 + dependencies = [ 5859 + "bumpalo", 5860 + "log", 5861 + "proc-macro2", 5862 + "quote", 5863 + "syn 2.0.111", 5864 + "wasm-bindgen-shared", 5865 + ] 5866 + 5867 + [[package]] 5868 + name = "wasm-bindgen-futures" 5869 + version = "0.4.54" 5870 + source = "registry+https://github.com/rust-lang/crates.io-index" 5871 + checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 5872 + dependencies = [ 5873 + "cfg-if", 5874 + "js-sys", 5875 + "once_cell", 5876 + "wasm-bindgen", 5877 + "web-sys", 5878 + ] 5879 + 5880 + [[package]] 5881 + name = "wasm-bindgen-macro" 5882 + version = "0.2.104" 5883 + source = "registry+https://github.com/rust-lang/crates.io-index" 5884 + checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 5885 + dependencies = [ 5886 + "quote", 5887 + "wasm-bindgen-macro-support", 5888 + ] 5889 + 5890 + [[package]] 5891 + name = "wasm-bindgen-macro-support" 5892 + version = "0.2.104" 5893 + source = "registry+https://github.com/rust-lang/crates.io-index" 5894 + checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 5895 + dependencies = [ 5896 + "proc-macro2", 5897 + "quote", 5898 + "syn 2.0.111", 5899 + "wasm-bindgen-backend", 5900 + "wasm-bindgen-shared", 5901 + ] 5902 + 5903 + [[package]] 5904 + name = "wasm-bindgen-shared" 5905 + version = "0.2.104" 5906 + source = "registry+https://github.com/rust-lang/crates.io-index" 5907 + checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 5908 + dependencies = [ 5909 + "unicode-ident", 5910 + ] 5911 + 5912 + [[package]] 5913 + name = "wax" 5914 + version = "0.6.0" 5915 + source = "registry+https://github.com/rust-lang/crates.io-index" 5916 + checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" 5917 + dependencies = [ 5918 + "const_format", 5919 + "itertools 0.11.0", 5920 + "nom", 5921 + "pori", 5922 + "regex", 5923 + "thiserror 1.0.69", 5924 + "walkdir", 5925 + ] 5926 + 5927 + [[package]] 5928 + name = "web-sys" 5929 + version = "0.3.81" 5930 + source = "registry+https://github.com/rust-lang/crates.io-index" 5931 + checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 5932 + dependencies = [ 5933 + "js-sys", 5934 + "wasm-bindgen", 5935 + ] 5936 + 5937 + [[package]] 5938 + name = "web-time" 5939 + version = "1.1.0" 5940 + source = "registry+https://github.com/rust-lang/crates.io-index" 5941 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 5942 + dependencies = [ 5943 + "js-sys", 5944 + "wasm-bindgen", 5945 + ] 5946 + 5947 + [[package]] 5948 + name = "webpage" 5949 + version = "2.0.1" 5950 + source = "registry+https://github.com/rust-lang/crates.io-index" 5951 + checksum = "70862efc041d46e6bbaa82bb9c34ae0596d090e86cbd14bd9e93b36ee6802eac" 5952 + dependencies = [ 5953 + "html5ever", 5954 + "markup5ever_rcdom", 5955 + "serde_json", 5956 + "url", 5957 + ] 5958 + 5959 + [[package]] 5960 + name = "webpki-roots" 5961 + version = "1.0.4" 5962 + source = "registry+https://github.com/rust-lang/crates.io-index" 5963 + checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" 5964 + dependencies = [ 5965 + "rustls-pki-types", 5966 + ] 5967 + 5968 + [[package]] 5969 + name = "wild" 5970 + version = "2.2.1" 5971 + source = "registry+https://github.com/rust-lang/crates.io-index" 5972 + checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" 5973 + dependencies = [ 5974 + "glob", 5975 + ] 5976 + 5977 + [[package]] 5978 + name = "winapi" 5979 + version = "0.3.9" 5980 + source = "registry+https://github.com/rust-lang/crates.io-index" 5981 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 5982 + dependencies = [ 5983 + "winapi-i686-pc-windows-gnu", 5984 + "winapi-x86_64-pc-windows-gnu", 5985 + ] 5986 + 5987 + [[package]] 5988 + name = "winapi-i686-pc-windows-gnu" 5989 + version = "0.4.0" 5990 + source = "registry+https://github.com/rust-lang/crates.io-index" 5991 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 5992 + 5993 + [[package]] 5994 + name = "winapi-util" 5995 + version = "0.1.11" 5996 + source = "registry+https://github.com/rust-lang/crates.io-index" 5997 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 5998 + dependencies = [ 5999 + "windows-sys 0.61.2", 6000 + ] 6001 + 6002 + [[package]] 6003 + name = "winapi-x86_64-pc-windows-gnu" 6004 + version = "0.4.0" 6005 + source = "registry+https://github.com/rust-lang/crates.io-index" 6006 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 6007 + 6008 + [[package]] 6009 + name = "windows" 6010 + version = "0.61.3" 6011 + source = "registry+https://github.com/rust-lang/crates.io-index" 6012 + checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 6013 + dependencies = [ 6014 + "windows-collections 0.2.0", 6015 + "windows-core 0.61.2", 6016 + "windows-future 0.2.1", 6017 + "windows-link 0.1.3", 6018 + "windows-numerics 0.2.0", 6019 + ] 6020 + 6021 + [[package]] 6022 + name = "windows" 6023 + version = "0.62.2" 6024 + source = "registry+https://github.com/rust-lang/crates.io-index" 6025 + checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" 6026 + dependencies = [ 6027 + "windows-collections 0.3.2", 6028 + "windows-core 0.62.2", 6029 + "windows-future 0.3.2", 6030 + "windows-numerics 0.3.1", 6031 + ] 6032 + 6033 + [[package]] 6034 + name = "windows-collections" 6035 + version = "0.2.0" 6036 + source = "registry+https://github.com/rust-lang/crates.io-index" 6037 + checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 6038 + dependencies = [ 6039 + "windows-core 0.61.2", 6040 + ] 6041 + 6042 + [[package]] 6043 + name = "windows-collections" 6044 + version = "0.3.2" 6045 + source = "registry+https://github.com/rust-lang/crates.io-index" 6046 + checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" 6047 + dependencies = [ 6048 + "windows-core 0.62.2", 6049 + ] 6050 + 6051 + [[package]] 6052 + name = "windows-core" 6053 + version = "0.61.2" 6054 + source = "registry+https://github.com/rust-lang/crates.io-index" 6055 + checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 6056 + dependencies = [ 6057 + "windows-implement", 6058 + "windows-interface", 6059 + "windows-link 0.1.3", 6060 + "windows-result 0.3.4", 6061 + "windows-strings 0.4.2", 6062 + ] 6063 + 6064 + [[package]] 6065 + name = "windows-core" 6066 + version = "0.62.2" 6067 + source = "registry+https://github.com/rust-lang/crates.io-index" 6068 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 6069 + dependencies = [ 6070 + "windows-implement", 6071 + "windows-interface", 6072 + "windows-link 0.2.1", 6073 + "windows-result 0.4.1", 6074 + "windows-strings 0.5.1", 6075 + ] 6076 + 6077 + [[package]] 6078 + name = "windows-future" 6079 + version = "0.2.1" 6080 + source = "registry+https://github.com/rust-lang/crates.io-index" 6081 + checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 6082 + dependencies = [ 6083 + "windows-core 0.61.2", 6084 + "windows-link 0.1.3", 6085 + "windows-threading 0.1.0", 6086 + ] 6087 + 6088 + [[package]] 6089 + name = "windows-future" 6090 + version = "0.3.2" 6091 + source = "registry+https://github.com/rust-lang/crates.io-index" 6092 + checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" 6093 + dependencies = [ 6094 + "windows-core 0.62.2", 6095 + "windows-link 0.2.1", 6096 + "windows-threading 0.2.1", 6097 + ] 6098 + 6099 + [[package]] 6100 + name = "windows-implement" 6101 + version = "0.60.2" 6102 + source = "registry+https://github.com/rust-lang/crates.io-index" 6103 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 6104 + dependencies = [ 6105 + "proc-macro2", 6106 + "quote", 6107 + "syn 2.0.111", 6108 + ] 6109 + 6110 + [[package]] 6111 + name = "windows-interface" 6112 + version = "0.59.3" 6113 + source = "registry+https://github.com/rust-lang/crates.io-index" 6114 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 6115 + dependencies = [ 6116 + "proc-macro2", 6117 + "quote", 6118 + "syn 2.0.111", 6119 + ] 6120 + 6121 + [[package]] 6122 + name = "windows-link" 6123 + version = "0.1.3" 6124 + source = "registry+https://github.com/rust-lang/crates.io-index" 6125 + checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 6126 + 6127 + [[package]] 6128 + name = "windows-link" 6129 + version = "0.2.1" 6130 + source = "registry+https://github.com/rust-lang/crates.io-index" 6131 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 6132 + 6133 + [[package]] 6134 + name = "windows-numerics" 6135 + version = "0.2.0" 6136 + source = "registry+https://github.com/rust-lang/crates.io-index" 6137 + checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 6138 + dependencies = [ 6139 + "windows-core 0.61.2", 6140 + "windows-link 0.1.3", 6141 + ] 6142 + 6143 + [[package]] 6144 + name = "windows-numerics" 6145 + version = "0.3.1" 6146 + source = "registry+https://github.com/rust-lang/crates.io-index" 6147 + checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" 6148 + dependencies = [ 6149 + "windows-core 0.62.2", 6150 + "windows-link 0.2.1", 6151 + ] 6152 + 6153 + [[package]] 6154 + name = "windows-registry" 6155 + version = "0.6.1" 6156 + source = "registry+https://github.com/rust-lang/crates.io-index" 6157 + checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" 6158 + dependencies = [ 6159 + "windows-link 0.2.1", 6160 + "windows-result 0.4.1", 6161 + "windows-strings 0.5.1", 6162 + ] 6163 + 6164 + [[package]] 6165 + name = "windows-result" 6166 + version = "0.3.4" 6167 + source = "registry+https://github.com/rust-lang/crates.io-index" 6168 + checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 6169 + dependencies = [ 6170 + "windows-link 0.1.3", 6171 + ] 6172 + 6173 + [[package]] 6174 + name = "windows-result" 6175 + version = "0.4.1" 6176 + source = "registry+https://github.com/rust-lang/crates.io-index" 6177 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 6178 + dependencies = [ 6179 + "windows-link 0.2.1", 6180 + ] 6181 + 6182 + [[package]] 6183 + name = "windows-strings" 6184 + version = "0.4.2" 6185 + source = "registry+https://github.com/rust-lang/crates.io-index" 6186 + checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 6187 + dependencies = [ 6188 + "windows-link 0.1.3", 6189 + ] 6190 + 6191 + [[package]] 6192 + name = "windows-strings" 6193 + version = "0.5.1" 6194 + source = "registry+https://github.com/rust-lang/crates.io-index" 6195 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 6196 + dependencies = [ 6197 + "windows-link 0.2.1", 6198 + ] 6199 + 6200 + [[package]] 6201 + name = "windows-sys" 6202 + version = "0.48.0" 6203 + source = "registry+https://github.com/rust-lang/crates.io-index" 6204 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 6205 + dependencies = [ 6206 + "windows-targets 0.48.5", 6207 + ] 6208 + 6209 + [[package]] 6210 + name = "windows-sys" 6211 + version = "0.52.0" 6212 + source = "registry+https://github.com/rust-lang/crates.io-index" 6213 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 6214 + dependencies = [ 6215 + "windows-targets 0.52.6", 6216 + ] 6217 + 6218 + [[package]] 6219 + name = "windows-sys" 6220 + version = "0.59.0" 6221 + source = "registry+https://github.com/rust-lang/crates.io-index" 6222 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 6223 + dependencies = [ 6224 + "windows-targets 0.52.6", 6225 + ] 6226 + 6227 + [[package]] 6228 + name = "windows-sys" 6229 + version = "0.60.2" 6230 + source = "registry+https://github.com/rust-lang/crates.io-index" 6231 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 6232 + dependencies = [ 6233 + "windows-targets 0.53.5", 6234 + ] 6235 + 6236 + [[package]] 6237 + name = "windows-sys" 6238 + version = "0.61.2" 6239 + source = "registry+https://github.com/rust-lang/crates.io-index" 6240 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 6241 + dependencies = [ 6242 + "windows-link 0.2.1", 6243 + ] 6244 + 6245 + [[package]] 6246 + name = "windows-targets" 6247 + version = "0.48.5" 6248 + source = "registry+https://github.com/rust-lang/crates.io-index" 6249 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 6250 + dependencies = [ 6251 + "windows_aarch64_gnullvm 0.48.5", 6252 + "windows_aarch64_msvc 0.48.5", 6253 + "windows_i686_gnu 0.48.5", 6254 + "windows_i686_msvc 0.48.5", 6255 + "windows_x86_64_gnu 0.48.5", 6256 + "windows_x86_64_gnullvm 0.48.5", 6257 + "windows_x86_64_msvc 0.48.5", 6258 + ] 6259 + 6260 + [[package]] 6261 + name = "windows-targets" 6262 + version = "0.52.6" 6263 + source = "registry+https://github.com/rust-lang/crates.io-index" 6264 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 6265 + dependencies = [ 6266 + "windows_aarch64_gnullvm 0.52.6", 6267 + "windows_aarch64_msvc 0.52.6", 6268 + "windows_i686_gnu 0.52.6", 6269 + "windows_i686_gnullvm 0.52.6", 6270 + "windows_i686_msvc 0.52.6", 6271 + "windows_x86_64_gnu 0.52.6", 6272 + "windows_x86_64_gnullvm 0.52.6", 6273 + "windows_x86_64_msvc 0.52.6", 6274 + ] 6275 + 6276 + [[package]] 6277 + name = "windows-targets" 6278 + version = "0.53.5" 6279 + source = "registry+https://github.com/rust-lang/crates.io-index" 6280 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 6281 + dependencies = [ 6282 + "windows-link 0.2.1", 6283 + "windows_aarch64_gnullvm 0.53.1", 6284 + "windows_aarch64_msvc 0.53.1", 6285 + "windows_i686_gnu 0.53.1", 6286 + "windows_i686_gnullvm 0.53.1", 6287 + "windows_i686_msvc 0.53.1", 6288 + "windows_x86_64_gnu 0.53.1", 6289 + "windows_x86_64_gnullvm 0.53.1", 6290 + "windows_x86_64_msvc 0.53.1", 6291 + ] 6292 + 6293 + [[package]] 6294 + name = "windows-threading" 6295 + version = "0.1.0" 6296 + source = "registry+https://github.com/rust-lang/crates.io-index" 6297 + checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 6298 + dependencies = [ 6299 + "windows-link 0.1.3", 6300 + ] 6301 + 6302 + [[package]] 6303 + name = "windows-threading" 6304 + version = "0.2.1" 6305 + source = "registry+https://github.com/rust-lang/crates.io-index" 6306 + checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" 6307 + dependencies = [ 6308 + "windows-link 0.2.1", 6309 + ] 6310 + 6311 + [[package]] 6312 + name = "windows_aarch64_gnullvm" 6313 + version = "0.48.5" 6314 + source = "registry+https://github.com/rust-lang/crates.io-index" 6315 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 6316 + 6317 + [[package]] 6318 + name = "windows_aarch64_gnullvm" 6319 + version = "0.52.6" 6320 + source = "registry+https://github.com/rust-lang/crates.io-index" 6321 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 6322 + 6323 + [[package]] 6324 + name = "windows_aarch64_gnullvm" 6325 + version = "0.53.1" 6326 + source = "registry+https://github.com/rust-lang/crates.io-index" 6327 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 6328 + 6329 + [[package]] 6330 + name = "windows_aarch64_msvc" 6331 + version = "0.48.5" 6332 + source = "registry+https://github.com/rust-lang/crates.io-index" 6333 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 6334 + 6335 + [[package]] 6336 + name = "windows_aarch64_msvc" 6337 + version = "0.52.6" 6338 + source = "registry+https://github.com/rust-lang/crates.io-index" 6339 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 6340 + 6341 + [[package]] 6342 + name = "windows_aarch64_msvc" 6343 + version = "0.53.1" 6344 + source = "registry+https://github.com/rust-lang/crates.io-index" 6345 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 6346 + 6347 + [[package]] 6348 + name = "windows_i686_gnu" 6349 + version = "0.48.5" 6350 + source = "registry+https://github.com/rust-lang/crates.io-index" 6351 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 6352 + 6353 + [[package]] 6354 + name = "windows_i686_gnu" 6355 + version = "0.52.6" 6356 + source = "registry+https://github.com/rust-lang/crates.io-index" 6357 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 6358 + 6359 + [[package]] 6360 + name = "windows_i686_gnu" 6361 + version = "0.53.1" 6362 + source = "registry+https://github.com/rust-lang/crates.io-index" 6363 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 6364 + 6365 + [[package]] 6366 + name = "windows_i686_gnullvm" 6367 + version = "0.52.6" 6368 + source = "registry+https://github.com/rust-lang/crates.io-index" 6369 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 6370 + 6371 + [[package]] 6372 + name = "windows_i686_gnullvm" 6373 + version = "0.53.1" 6374 + source = "registry+https://github.com/rust-lang/crates.io-index" 6375 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 6376 + 6377 + [[package]] 6378 + name = "windows_i686_msvc" 6379 + version = "0.48.5" 6380 + source = "registry+https://github.com/rust-lang/crates.io-index" 6381 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 6382 + 6383 + [[package]] 6384 + name = "windows_i686_msvc" 6385 + version = "0.52.6" 6386 + source = "registry+https://github.com/rust-lang/crates.io-index" 6387 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 6388 + 6389 + [[package]] 6390 + name = "windows_i686_msvc" 6391 + version = "0.53.1" 6392 + source = "registry+https://github.com/rust-lang/crates.io-index" 6393 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 6394 + 6395 + [[package]] 6396 + name = "windows_x86_64_gnu" 6397 + version = "0.48.5" 6398 + source = "registry+https://github.com/rust-lang/crates.io-index" 6399 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 6400 + 6401 + [[package]] 6402 + name = "windows_x86_64_gnu" 6403 + version = "0.52.6" 6404 + source = "registry+https://github.com/rust-lang/crates.io-index" 6405 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 6406 + 6407 + [[package]] 6408 + name = "windows_x86_64_gnu" 6409 + version = "0.53.1" 6410 + source = "registry+https://github.com/rust-lang/crates.io-index" 6411 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 6412 + 6413 + [[package]] 6414 + name = "windows_x86_64_gnullvm" 6415 + version = "0.48.5" 6416 + source = "registry+https://github.com/rust-lang/crates.io-index" 6417 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 6418 + 6419 + [[package]] 6420 + name = "windows_x86_64_gnullvm" 6421 + version = "0.52.6" 6422 + source = "registry+https://github.com/rust-lang/crates.io-index" 6423 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 6424 + 6425 + [[package]] 6426 + name = "windows_x86_64_gnullvm" 6427 + version = "0.53.1" 6428 + source = "registry+https://github.com/rust-lang/crates.io-index" 6429 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 6430 + 6431 + [[package]] 6432 + name = "windows_x86_64_msvc" 6433 + version = "0.48.5" 6434 + source = "registry+https://github.com/rust-lang/crates.io-index" 6435 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 6436 + 6437 + [[package]] 6438 + name = "windows_x86_64_msvc" 6439 + version = "0.52.6" 6440 + source = "registry+https://github.com/rust-lang/crates.io-index" 6441 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 6442 + 6443 + [[package]] 6444 + name = "windows_x86_64_msvc" 6445 + version = "0.53.1" 6446 + source = "registry+https://github.com/rust-lang/crates.io-index" 6447 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 6448 + 6449 + [[package]] 6450 + name = "winnow" 6451 + version = "0.7.14" 6452 + source = "registry+https://github.com/rust-lang/crates.io-index" 6453 + checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 6454 + dependencies = [ 6455 + "memchr", 6456 + ] 6457 + 6458 + [[package]] 6459 + name = "winreg" 6460 + version = "0.52.0" 6461 + source = "registry+https://github.com/rust-lang/crates.io-index" 6462 + checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 6463 + dependencies = [ 6464 + "cfg-if", 6465 + "windows-sys 0.48.0", 6466 + ] 6467 + 6468 + [[package]] 6469 + name = "wit-bindgen" 6470 + version = "0.46.0" 6471 + source = "registry+https://github.com/rust-lang/crates.io-index" 6472 + checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 6473 + 6474 + [[package]] 6475 + name = "writeable" 6476 + version = "0.6.2" 6477 + source = "registry+https://github.com/rust-lang/crates.io-index" 6478 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 6479 + 6480 + [[package]] 6481 + name = "xml5ever" 6482 + version = "0.18.1" 6483 + source = "registry+https://github.com/rust-lang/crates.io-index" 6484 + checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69" 6485 + dependencies = [ 6486 + "log", 6487 + "mac", 6488 + "markup5ever", 6489 + ] 6490 + 6491 + [[package]] 6492 + name = "yansi" 6493 + version = "1.0.1" 6494 + source = "registry+https://github.com/rust-lang/crates.io-index" 6495 + checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 6496 + 6497 + [[package]] 6498 + name = "yoke" 6499 + version = "0.8.1" 6500 + source = "registry+https://github.com/rust-lang/crates.io-index" 6501 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 6502 + dependencies = [ 6503 + "stable_deref_trait", 6504 + "yoke-derive", 6505 + "zerofrom", 6506 + ] 6507 + 6508 + [[package]] 6509 + name = "yoke-derive" 6510 + version = "0.8.1" 6511 + source = "registry+https://github.com/rust-lang/crates.io-index" 6512 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 6513 + dependencies = [ 6514 + "proc-macro2", 6515 + "quote", 6516 + "syn 2.0.111", 6517 + "synstructure", 6518 + ] 6519 + 6520 + [[package]] 6521 + name = "zerocopy" 6522 + version = "0.7.35" 6523 + source = "registry+https://github.com/rust-lang/crates.io-index" 6524 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 6525 + dependencies = [ 6526 + "byteorder", 6527 + "zerocopy-derive 0.7.35", 6528 + ] 6529 + 6530 + [[package]] 6531 + name = "zerocopy" 6532 + version = "0.8.31" 6533 + source = "registry+https://github.com/rust-lang/crates.io-index" 6534 + checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" 6535 + dependencies = [ 6536 + "zerocopy-derive 0.8.31", 6537 + ] 6538 + 6539 + [[package]] 6540 + name = "zerocopy-derive" 6541 + version = "0.7.35" 6542 + source = "registry+https://github.com/rust-lang/crates.io-index" 6543 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 6544 + dependencies = [ 6545 + "proc-macro2", 6546 + "quote", 6547 + "syn 2.0.111", 6548 + ] 6549 + 6550 + [[package]] 6551 + name = "zerocopy-derive" 6552 + version = "0.8.31" 6553 + source = "registry+https://github.com/rust-lang/crates.io-index" 6554 + checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" 6555 + dependencies = [ 6556 + "proc-macro2", 6557 + "quote", 6558 + "syn 2.0.111", 6559 + ] 6560 + 6561 + [[package]] 6562 + name = "zerofrom" 6563 + version = "0.1.6" 6564 + source = "registry+https://github.com/rust-lang/crates.io-index" 6565 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 6566 + dependencies = [ 6567 + "zerofrom-derive", 6568 + ] 6569 + 6570 + [[package]] 6571 + name = "zerofrom-derive" 6572 + version = "0.1.6" 6573 + source = "registry+https://github.com/rust-lang/crates.io-index" 6574 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 6575 + dependencies = [ 6576 + "proc-macro2", 6577 + "quote", 6578 + "syn 2.0.111", 6579 + "synstructure", 6580 + ] 6581 + 6582 + [[package]] 6583 + name = "zeroize" 6584 + version = "1.8.2" 6585 + source = "registry+https://github.com/rust-lang/crates.io-index" 6586 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 6587 + dependencies = [ 6588 + "serde", 6589 + ] 6590 + 6591 + [[package]] 6592 + name = "zerotrie" 6593 + version = "0.2.3" 6594 + source = "registry+https://github.com/rust-lang/crates.io-index" 6595 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 6596 + dependencies = [ 6597 + "displaydoc", 6598 + "yoke", 6599 + "zerofrom", 6600 + ] 6601 + 6602 + [[package]] 6603 + name = "zerovec" 6604 + version = "0.11.5" 6605 + source = "registry+https://github.com/rust-lang/crates.io-index" 6606 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 6607 + dependencies = [ 6608 + "serde", 6609 + "yoke", 6610 + "zerofrom", 6611 + "zerovec-derive", 6612 + ] 6613 + 6614 + [[package]] 6615 + name = "zerovec-derive" 6616 + version = "0.11.2" 6617 + source = "registry+https://github.com/rust-lang/crates.io-index" 6618 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 6619 + dependencies = [ 6620 + "proc-macro2", 6621 + "quote", 6622 + "syn 2.0.111", 6623 + ] 6624 + 6625 + [[package]] 6626 + name = "zip" 6627 + version = "4.6.1" 6628 + source = "registry+https://github.com/rust-lang/crates.io-index" 6629 + checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" 6630 + dependencies = [ 6631 + "arbitrary", 6632 + "crc32fast", 6633 + "flate2", 6634 + "indexmap 2.12.1", 6635 + "memchr", 6636 + "zopfli", 6637 + ] 6638 + 6639 + [[package]] 6640 + name = "zlib-rs" 6641 + version = "0.5.4" 6642 + source = "registry+https://github.com/rust-lang/crates.io-index" 6643 + checksum = "51f936044d677be1a1168fae1d03b583a285a5dd9d8cbf7b24c23aa1fc775235" 6644 + 6645 + [[package]] 6646 + name = "zopfli" 6647 + version = "0.8.3" 6648 + source = "registry+https://github.com/rust-lang/crates.io-index" 6649 + checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" 6650 + dependencies = [ 6651 + "bumpalo", 6652 + "crc32fast", 6653 + "log", 6654 + "simd-adler32", 6655 + ]
+46
Cargo.toml
··· 1 + [package] 2 + name = "faunu" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [lib] 7 + crate-type = ["cdylib"] 8 + 9 + [dependencies] 10 + wasm-bindgen = "=0.2.104" 11 + wasm-bindgen-futures = "0.4" 12 + getrandom = { version = "0.3", features = ["wasm_js"] } 13 + web-sys = { version = "0.3", features = ["console", "Window"] } 14 + vfs = { version = "0.12" } 15 + nu-cmd-lang = { version = "0.109.1", default-features = false } 16 + nu-command = { version = "0.109.1", default-features = false } 17 + nu-engine = { version = "0.109.1", default-features = false } 18 + nu-parser = { version = "0.109.1", default-features = false } 19 + nu-protocol = { version = "0.109.1", default-features = false } 20 + nu-cmd-extra = { version = "0.109.1", default-features = false } 21 + serde = { version = "1.0", features = ["derive"] } 22 + serde_json = "1" 23 + miette = { version = "7.6", features = ["fancy"] } 24 + ansi_term = "0.12.1" 25 + 26 + anyhow = "1" 27 + jacquard = { git = "https://tangled.sh/ptr.pet/jacquard", default-features = false, features = ["api", "cache"] } 28 + jacquard-repo = { git = "https://tangled.sh/ptr.pet/jacquard" } 29 + url = "2" 30 + futures = "0.3.31" 31 + js-sys = "=0.3.81" 32 + serde_ipld_dagcbor = "0.6.4" 33 + reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] } 34 + console_error_panic_hook = "0.1.7" 35 + 36 + scc = "3" 37 + rapidhash = { version = "4", features = ["unsafe"] } 38 + 39 + [patch.crates-io] 40 + vfs = { git = "https://github.com/landaire/rust-vfs", branch = "fix/wasm" } 41 + 42 + [profile.release] 43 + opt-level = 3 44 + lto = true 45 + codegen-units = 1 46 + strip = true
+21
LICENSE
··· 1 + MIT License 2 + 3 + Copyright (c) 2020 Yusuf Bera Ertan 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+3
README.md
··· 1 + nushell, but on the web, with a virtual environment for working in with various commands to interact with the environment, trying to emulate the nushell CLI from native OSes. faux + nu = faunu. 2 + 3 + see [dysnomia.ptr.pet](https://dysnomia.ptr.pet) to try it out.
+4
deno.json
··· 1 + { 2 + "workspace": ["./www"], 3 + "nodeModulesDir": "auto" 4 + }
+783
deno.lock
··· 1 + { 2 + "version": "5", 3 + "specifiers": { 4 + "npm:@jsr/std__toml@*": "1.0.11", 5 + "npm:@xterm/addon-canvas@0.7": "0.7.0_@xterm+xterm@5.5.0", 6 + "npm:@xterm/addon-fit@0.10": "0.10.0_@xterm+xterm@5.5.0", 7 + "npm:@xterm/addon-web-links@0.11": "0.11.0_@xterm+xterm@5.5.0", 8 + "npm:@xterm/addon-webgl@0.18": "0.18.0_@xterm+xterm@5.5.0", 9 + "npm:@xterm/xterm@^5.5.0": "5.5.0", 10 + "npm:rolldown-vite@7.2.5": "7.2.5_picomatch@4.0.3", 11 + "npm:typescript@~5.9.3": "5.9.3", 12 + "npm:vite-plugin-top-level-await@^1.6.0": "1.6.0_vite@7.2.7__picomatch@4.0.3", 13 + "npm:vite-plugin-wasm@^3.5.0": "3.5.0_vite@7.2.7__picomatch@4.0.3" 14 + }, 15 + "npm": { 16 + "@emnapi/core@1.7.1": { 17 + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", 18 + "dependencies": [ 19 + "@emnapi/wasi-threads", 20 + "tslib" 21 + ] 22 + }, 23 + "@emnapi/runtime@1.7.1": { 24 + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", 25 + "dependencies": [ 26 + "tslib" 27 + ] 28 + }, 29 + "@emnapi/wasi-threads@1.1.0": { 30 + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", 31 + "dependencies": [ 32 + "tslib" 33 + ] 34 + }, 35 + "@esbuild/aix-ppc64@0.25.12": { 36 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 37 + "os": ["aix"], 38 + "cpu": ["ppc64"] 39 + }, 40 + "@esbuild/android-arm64@0.25.12": { 41 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 42 + "os": ["android"], 43 + "cpu": ["arm64"] 44 + }, 45 + "@esbuild/android-arm@0.25.12": { 46 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 47 + "os": ["android"], 48 + "cpu": ["arm"] 49 + }, 50 + "@esbuild/android-x64@0.25.12": { 51 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 52 + "os": ["android"], 53 + "cpu": ["x64"] 54 + }, 55 + "@esbuild/darwin-arm64@0.25.12": { 56 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 57 + "os": ["darwin"], 58 + "cpu": ["arm64"] 59 + }, 60 + "@esbuild/darwin-x64@0.25.12": { 61 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 62 + "os": ["darwin"], 63 + "cpu": ["x64"] 64 + }, 65 + "@esbuild/freebsd-arm64@0.25.12": { 66 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 67 + "os": ["freebsd"], 68 + "cpu": ["arm64"] 69 + }, 70 + "@esbuild/freebsd-x64@0.25.12": { 71 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 72 + "os": ["freebsd"], 73 + "cpu": ["x64"] 74 + }, 75 + "@esbuild/linux-arm64@0.25.12": { 76 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 77 + "os": ["linux"], 78 + "cpu": ["arm64"] 79 + }, 80 + "@esbuild/linux-arm@0.25.12": { 81 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 82 + "os": ["linux"], 83 + "cpu": ["arm"] 84 + }, 85 + "@esbuild/linux-ia32@0.25.12": { 86 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 87 + "os": ["linux"], 88 + "cpu": ["ia32"] 89 + }, 90 + "@esbuild/linux-loong64@0.25.12": { 91 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 92 + "os": ["linux"], 93 + "cpu": ["loong64"] 94 + }, 95 + "@esbuild/linux-mips64el@0.25.12": { 96 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 97 + "os": ["linux"], 98 + "cpu": ["mips64el"] 99 + }, 100 + "@esbuild/linux-ppc64@0.25.12": { 101 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 102 + "os": ["linux"], 103 + "cpu": ["ppc64"] 104 + }, 105 + "@esbuild/linux-riscv64@0.25.12": { 106 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 107 + "os": ["linux"], 108 + "cpu": ["riscv64"] 109 + }, 110 + "@esbuild/linux-s390x@0.25.12": { 111 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 112 + "os": ["linux"], 113 + "cpu": ["s390x"] 114 + }, 115 + "@esbuild/linux-x64@0.25.12": { 116 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 117 + "os": ["linux"], 118 + "cpu": ["x64"] 119 + }, 120 + "@esbuild/netbsd-arm64@0.25.12": { 121 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 122 + "os": ["netbsd"], 123 + "cpu": ["arm64"] 124 + }, 125 + "@esbuild/netbsd-x64@0.25.12": { 126 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 127 + "os": ["netbsd"], 128 + "cpu": ["x64"] 129 + }, 130 + "@esbuild/openbsd-arm64@0.25.12": { 131 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 132 + "os": ["openbsd"], 133 + "cpu": ["arm64"] 134 + }, 135 + "@esbuild/openbsd-x64@0.25.12": { 136 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 137 + "os": ["openbsd"], 138 + "cpu": ["x64"] 139 + }, 140 + "@esbuild/openharmony-arm64@0.25.12": { 141 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 142 + "os": ["openharmony"], 143 + "cpu": ["arm64"] 144 + }, 145 + "@esbuild/sunos-x64@0.25.12": { 146 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 147 + "os": ["sunos"], 148 + "cpu": ["x64"] 149 + }, 150 + "@esbuild/win32-arm64@0.25.12": { 151 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 152 + "os": ["win32"], 153 + "cpu": ["arm64"] 154 + }, 155 + "@esbuild/win32-ia32@0.25.12": { 156 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 157 + "os": ["win32"], 158 + "cpu": ["ia32"] 159 + }, 160 + "@esbuild/win32-x64@0.25.12": { 161 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 162 + "os": ["win32"], 163 + "cpu": ["x64"] 164 + }, 165 + "@jsr/std__collections@1.1.3": { 166 + "integrity": "sha512-jGG6mv3IjOyxm6PyT1YVbLyAlZL+Gow6LOpBw+84qb1nkdJY0+t6bi7ICEqAwUz87cNjBS0P+yZQ5HHclJhsfw==", 167 + "tarball": "https://npm.jsr.io/~/11/@jsr/std__collections/1.1.3.tgz" 168 + }, 169 + "@jsr/std__toml@1.0.11": { 170 + "integrity": "sha512-+LZAizoPAPwMDmRZr86/xPrbO8E0Oq0BJ70mr1fNMobJ/6X6v15Jk16ZClFGukWgzBMd8ggiMWnzp24+N3VNZg==", 171 + "dependencies": [ 172 + "@jsr/std__collections" 173 + ], 174 + "tarball": "https://npm.jsr.io/~/11/@jsr/std__toml/1.0.11.tgz" 175 + }, 176 + "@napi-rs/wasm-runtime@1.1.0": { 177 + "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", 178 + "dependencies": [ 179 + "@emnapi/core", 180 + "@emnapi/runtime", 181 + "@tybys/wasm-util" 182 + ] 183 + }, 184 + "@oxc-project/runtime@0.97.0": { 185 + "integrity": "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==" 186 + }, 187 + "@oxc-project/types@0.97.0": { 188 + "integrity": "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ==" 189 + }, 190 + "@rolldown/binding-android-arm64@1.0.0-beta.50": { 191 + "integrity": "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag==", 192 + "os": ["android"], 193 + "cpu": ["arm64"] 194 + }, 195 + "@rolldown/binding-darwin-arm64@1.0.0-beta.50": { 196 + "integrity": "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==", 197 + "os": ["darwin"], 198 + "cpu": ["arm64"] 199 + }, 200 + "@rolldown/binding-darwin-x64@1.0.0-beta.50": { 201 + "integrity": "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA==", 202 + "os": ["darwin"], 203 + "cpu": ["x64"] 204 + }, 205 + "@rolldown/binding-freebsd-x64@1.0.0-beta.50": { 206 + "integrity": "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==", 207 + "os": ["freebsd"], 208 + "cpu": ["x64"] 209 + }, 210 + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50": { 211 + "integrity": "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==", 212 + "os": ["linux"], 213 + "cpu": ["arm"] 214 + }, 215 + "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50": { 216 + "integrity": "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==", 217 + "os": ["linux"], 218 + "cpu": ["arm64"] 219 + }, 220 + "@rolldown/binding-linux-arm64-musl@1.0.0-beta.50": { 221 + "integrity": "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==", 222 + "os": ["linux"], 223 + "cpu": ["arm64"] 224 + }, 225 + "@rolldown/binding-linux-x64-gnu@1.0.0-beta.50": { 226 + "integrity": "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==", 227 + "os": ["linux"], 228 + "cpu": ["x64"] 229 + }, 230 + "@rolldown/binding-linux-x64-musl@1.0.0-beta.50": { 231 + "integrity": "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==", 232 + "os": ["linux"], 233 + "cpu": ["x64"] 234 + }, 235 + "@rolldown/binding-openharmony-arm64@1.0.0-beta.50": { 236 + "integrity": "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==", 237 + "os": ["openharmony"], 238 + "cpu": ["arm64"] 239 + }, 240 + "@rolldown/binding-wasm32-wasi@1.0.0-beta.50": { 241 + "integrity": "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==", 242 + "dependencies": [ 243 + "@napi-rs/wasm-runtime" 244 + ], 245 + "cpu": ["wasm32"] 246 + }, 247 + "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50": { 248 + "integrity": "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==", 249 + "os": ["win32"], 250 + "cpu": ["arm64"] 251 + }, 252 + "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50": { 253 + "integrity": "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==", 254 + "os": ["win32"], 255 + "cpu": ["ia32"] 256 + }, 257 + "@rolldown/binding-win32-x64-msvc@1.0.0-beta.50": { 258 + "integrity": "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==", 259 + "os": ["win32"], 260 + "cpu": ["x64"] 261 + }, 262 + "@rolldown/pluginutils@1.0.0-beta.50": { 263 + "integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==" 264 + }, 265 + "@rollup/plugin-virtual@3.0.2": { 266 + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==" 267 + }, 268 + "@rollup/rollup-android-arm-eabi@4.53.3": { 269 + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", 270 + "os": ["android"], 271 + "cpu": ["arm"] 272 + }, 273 + "@rollup/rollup-android-arm64@4.53.3": { 274 + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", 275 + "os": ["android"], 276 + "cpu": ["arm64"] 277 + }, 278 + "@rollup/rollup-darwin-arm64@4.53.3": { 279 + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", 280 + "os": ["darwin"], 281 + "cpu": ["arm64"] 282 + }, 283 + "@rollup/rollup-darwin-x64@4.53.3": { 284 + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", 285 + "os": ["darwin"], 286 + "cpu": ["x64"] 287 + }, 288 + "@rollup/rollup-freebsd-arm64@4.53.3": { 289 + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", 290 + "os": ["freebsd"], 291 + "cpu": ["arm64"] 292 + }, 293 + "@rollup/rollup-freebsd-x64@4.53.3": { 294 + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", 295 + "os": ["freebsd"], 296 + "cpu": ["x64"] 297 + }, 298 + "@rollup/rollup-linux-arm-gnueabihf@4.53.3": { 299 + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", 300 + "os": ["linux"], 301 + "cpu": ["arm"] 302 + }, 303 + "@rollup/rollup-linux-arm-musleabihf@4.53.3": { 304 + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", 305 + "os": ["linux"], 306 + "cpu": ["arm"] 307 + }, 308 + "@rollup/rollup-linux-arm64-gnu@4.53.3": { 309 + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", 310 + "os": ["linux"], 311 + "cpu": ["arm64"] 312 + }, 313 + "@rollup/rollup-linux-arm64-musl@4.53.3": { 314 + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", 315 + "os": ["linux"], 316 + "cpu": ["arm64"] 317 + }, 318 + "@rollup/rollup-linux-loong64-gnu@4.53.3": { 319 + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", 320 + "os": ["linux"], 321 + "cpu": ["loong64"] 322 + }, 323 + "@rollup/rollup-linux-ppc64-gnu@4.53.3": { 324 + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", 325 + "os": ["linux"], 326 + "cpu": ["ppc64"] 327 + }, 328 + "@rollup/rollup-linux-riscv64-gnu@4.53.3": { 329 + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", 330 + "os": ["linux"], 331 + "cpu": ["riscv64"] 332 + }, 333 + "@rollup/rollup-linux-riscv64-musl@4.53.3": { 334 + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", 335 + "os": ["linux"], 336 + "cpu": ["riscv64"] 337 + }, 338 + "@rollup/rollup-linux-s390x-gnu@4.53.3": { 339 + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", 340 + "os": ["linux"], 341 + "cpu": ["s390x"] 342 + }, 343 + "@rollup/rollup-linux-x64-gnu@4.53.3": { 344 + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", 345 + "os": ["linux"], 346 + "cpu": ["x64"] 347 + }, 348 + "@rollup/rollup-linux-x64-musl@4.53.3": { 349 + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", 350 + "os": ["linux"], 351 + "cpu": ["x64"] 352 + }, 353 + "@rollup/rollup-openharmony-arm64@4.53.3": { 354 + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", 355 + "os": ["openharmony"], 356 + "cpu": ["arm64"] 357 + }, 358 + "@rollup/rollup-win32-arm64-msvc@4.53.3": { 359 + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", 360 + "os": ["win32"], 361 + "cpu": ["arm64"] 362 + }, 363 + "@rollup/rollup-win32-ia32-msvc@4.53.3": { 364 + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", 365 + "os": ["win32"], 366 + "cpu": ["ia32"] 367 + }, 368 + "@rollup/rollup-win32-x64-gnu@4.53.3": { 369 + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", 370 + "os": ["win32"], 371 + "cpu": ["x64"] 372 + }, 373 + "@rollup/rollup-win32-x64-msvc@4.53.3": { 374 + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", 375 + "os": ["win32"], 376 + "cpu": ["x64"] 377 + }, 378 + "@swc/core-darwin-arm64@1.15.3": { 379 + "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==", 380 + "os": ["darwin"], 381 + "cpu": ["arm64"] 382 + }, 383 + "@swc/core-darwin-x64@1.15.3": { 384 + "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==", 385 + "os": ["darwin"], 386 + "cpu": ["x64"] 387 + }, 388 + "@swc/core-linux-arm-gnueabihf@1.15.3": { 389 + "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==", 390 + "os": ["linux"], 391 + "cpu": ["arm"] 392 + }, 393 + "@swc/core-linux-arm64-gnu@1.15.3": { 394 + "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==", 395 + "os": ["linux"], 396 + "cpu": ["arm64"] 397 + }, 398 + "@swc/core-linux-arm64-musl@1.15.3": { 399 + "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==", 400 + "os": ["linux"], 401 + "cpu": ["arm64"] 402 + }, 403 + "@swc/core-linux-x64-gnu@1.15.3": { 404 + "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==", 405 + "os": ["linux"], 406 + "cpu": ["x64"] 407 + }, 408 + "@swc/core-linux-x64-musl@1.15.3": { 409 + "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==", 410 + "os": ["linux"], 411 + "cpu": ["x64"] 412 + }, 413 + "@swc/core-win32-arm64-msvc@1.15.3": { 414 + "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==", 415 + "os": ["win32"], 416 + "cpu": ["arm64"] 417 + }, 418 + "@swc/core-win32-ia32-msvc@1.15.3": { 419 + "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==", 420 + "os": ["win32"], 421 + "cpu": ["ia32"] 422 + }, 423 + "@swc/core-win32-x64-msvc@1.15.3": { 424 + "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==", 425 + "os": ["win32"], 426 + "cpu": ["x64"] 427 + }, 428 + "@swc/core@1.15.3": { 429 + "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==", 430 + "dependencies": [ 431 + "@swc/counter", 432 + "@swc/types" 433 + ], 434 + "optionalDependencies": [ 435 + "@swc/core-darwin-arm64", 436 + "@swc/core-darwin-x64", 437 + "@swc/core-linux-arm-gnueabihf", 438 + "@swc/core-linux-arm64-gnu", 439 + "@swc/core-linux-arm64-musl", 440 + "@swc/core-linux-x64-gnu", 441 + "@swc/core-linux-x64-musl", 442 + "@swc/core-win32-arm64-msvc", 443 + "@swc/core-win32-ia32-msvc", 444 + "@swc/core-win32-x64-msvc" 445 + ], 446 + "scripts": true 447 + }, 448 + "@swc/counter@0.1.3": { 449 + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" 450 + }, 451 + "@swc/types@0.1.25": { 452 + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", 453 + "dependencies": [ 454 + "@swc/counter" 455 + ] 456 + }, 457 + "@swc/wasm@1.15.3": { 458 + "integrity": "sha512-NrjGmAplk+v4wokIaLxp1oLoCMVqdQcWoBXopQg57QqyPRcJXLKe+kg5ehhW6z8XaU4Bu5cRkDxUTDY5P0Zy9Q==" 459 + }, 460 + "@tybys/wasm-util@0.10.1": { 461 + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", 462 + "dependencies": [ 463 + "tslib" 464 + ] 465 + }, 466 + "@types/estree@1.0.8": { 467 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" 468 + }, 469 + "@xterm/addon-canvas@0.7.0_@xterm+xterm@5.5.0": { 470 + "integrity": "sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==", 471 + "dependencies": [ 472 + "@xterm/xterm" 473 + ] 474 + }, 475 + "@xterm/addon-fit@0.10.0_@xterm+xterm@5.5.0": { 476 + "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", 477 + "dependencies": [ 478 + "@xterm/xterm" 479 + ] 480 + }, 481 + "@xterm/addon-web-links@0.11.0_@xterm+xterm@5.5.0": { 482 + "integrity": "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==", 483 + "dependencies": [ 484 + "@xterm/xterm" 485 + ] 486 + }, 487 + "@xterm/addon-webgl@0.18.0_@xterm+xterm@5.5.0": { 488 + "integrity": "sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w==", 489 + "dependencies": [ 490 + "@xterm/xterm" 491 + ] 492 + }, 493 + "@xterm/xterm@5.5.0": { 494 + "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==" 495 + }, 496 + "detect-libc@2.1.2": { 497 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" 498 + }, 499 + "esbuild@0.25.12": { 500 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 501 + "optionalDependencies": [ 502 + "@esbuild/aix-ppc64", 503 + "@esbuild/android-arm", 504 + "@esbuild/android-arm64", 505 + "@esbuild/android-x64", 506 + "@esbuild/darwin-arm64", 507 + "@esbuild/darwin-x64", 508 + "@esbuild/freebsd-arm64", 509 + "@esbuild/freebsd-x64", 510 + "@esbuild/linux-arm", 511 + "@esbuild/linux-arm64", 512 + "@esbuild/linux-ia32", 513 + "@esbuild/linux-loong64", 514 + "@esbuild/linux-mips64el", 515 + "@esbuild/linux-ppc64", 516 + "@esbuild/linux-riscv64", 517 + "@esbuild/linux-s390x", 518 + "@esbuild/linux-x64", 519 + "@esbuild/netbsd-arm64", 520 + "@esbuild/netbsd-x64", 521 + "@esbuild/openbsd-arm64", 522 + "@esbuild/openbsd-x64", 523 + "@esbuild/openharmony-arm64", 524 + "@esbuild/sunos-x64", 525 + "@esbuild/win32-arm64", 526 + "@esbuild/win32-ia32", 527 + "@esbuild/win32-x64" 528 + ], 529 + "scripts": true, 530 + "bin": true 531 + }, 532 + "fdir@6.5.0_picomatch@4.0.3": { 533 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 534 + "dependencies": [ 535 + "picomatch" 536 + ], 537 + "optionalPeers": [ 538 + "picomatch" 539 + ] 540 + }, 541 + "fsevents@2.3.3": { 542 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 543 + "os": ["darwin"], 544 + "scripts": true 545 + }, 546 + "lightningcss-android-arm64@1.30.2": { 547 + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", 548 + "os": ["android"], 549 + "cpu": ["arm64"] 550 + }, 551 + "lightningcss-darwin-arm64@1.30.2": { 552 + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", 553 + "os": ["darwin"], 554 + "cpu": ["arm64"] 555 + }, 556 + "lightningcss-darwin-x64@1.30.2": { 557 + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", 558 + "os": ["darwin"], 559 + "cpu": ["x64"] 560 + }, 561 + "lightningcss-freebsd-x64@1.30.2": { 562 + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", 563 + "os": ["freebsd"], 564 + "cpu": ["x64"] 565 + }, 566 + "lightningcss-linux-arm-gnueabihf@1.30.2": { 567 + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", 568 + "os": ["linux"], 569 + "cpu": ["arm"] 570 + }, 571 + "lightningcss-linux-arm64-gnu@1.30.2": { 572 + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", 573 + "os": ["linux"], 574 + "cpu": ["arm64"] 575 + }, 576 + "lightningcss-linux-arm64-musl@1.30.2": { 577 + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", 578 + "os": ["linux"], 579 + "cpu": ["arm64"] 580 + }, 581 + "lightningcss-linux-x64-gnu@1.30.2": { 582 + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", 583 + "os": ["linux"], 584 + "cpu": ["x64"] 585 + }, 586 + "lightningcss-linux-x64-musl@1.30.2": { 587 + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", 588 + "os": ["linux"], 589 + "cpu": ["x64"] 590 + }, 591 + "lightningcss-win32-arm64-msvc@1.30.2": { 592 + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", 593 + "os": ["win32"], 594 + "cpu": ["arm64"] 595 + }, 596 + "lightningcss-win32-x64-msvc@1.30.2": { 597 + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", 598 + "os": ["win32"], 599 + "cpu": ["x64"] 600 + }, 601 + "lightningcss@1.30.2": { 602 + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", 603 + "dependencies": [ 604 + "detect-libc" 605 + ], 606 + "optionalDependencies": [ 607 + "lightningcss-android-arm64", 608 + "lightningcss-darwin-arm64", 609 + "lightningcss-darwin-x64", 610 + "lightningcss-freebsd-x64", 611 + "lightningcss-linux-arm-gnueabihf", 612 + "lightningcss-linux-arm64-gnu", 613 + "lightningcss-linux-arm64-musl", 614 + "lightningcss-linux-x64-gnu", 615 + "lightningcss-linux-x64-musl", 616 + "lightningcss-win32-arm64-msvc", 617 + "lightningcss-win32-x64-msvc" 618 + ] 619 + }, 620 + "nanoid@3.3.11": { 621 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 622 + "bin": true 623 + }, 624 + "picocolors@1.1.1": { 625 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 626 + }, 627 + "picomatch@4.0.3": { 628 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" 629 + }, 630 + "postcss@8.5.6": { 631 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 632 + "dependencies": [ 633 + "nanoid", 634 + "picocolors", 635 + "source-map-js" 636 + ] 637 + }, 638 + "rolldown-vite@7.2.5_picomatch@4.0.3": { 639 + "integrity": "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA==", 640 + "dependencies": [ 641 + "@oxc-project/runtime", 642 + "fdir", 643 + "lightningcss", 644 + "picomatch", 645 + "postcss", 646 + "rolldown", 647 + "tinyglobby" 648 + ], 649 + "optionalDependencies": [ 650 + "fsevents" 651 + ], 652 + "bin": true 653 + }, 654 + "rolldown@1.0.0-beta.50": { 655 + "integrity": "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A==", 656 + "dependencies": [ 657 + "@oxc-project/types", 658 + "@rolldown/pluginutils" 659 + ], 660 + "optionalDependencies": [ 661 + "@rolldown/binding-android-arm64", 662 + "@rolldown/binding-darwin-arm64", 663 + "@rolldown/binding-darwin-x64", 664 + "@rolldown/binding-freebsd-x64", 665 + "@rolldown/binding-linux-arm-gnueabihf", 666 + "@rolldown/binding-linux-arm64-gnu", 667 + "@rolldown/binding-linux-arm64-musl", 668 + "@rolldown/binding-linux-x64-gnu", 669 + "@rolldown/binding-linux-x64-musl", 670 + "@rolldown/binding-openharmony-arm64", 671 + "@rolldown/binding-wasm32-wasi", 672 + "@rolldown/binding-win32-arm64-msvc", 673 + "@rolldown/binding-win32-ia32-msvc", 674 + "@rolldown/binding-win32-x64-msvc" 675 + ], 676 + "bin": true 677 + }, 678 + "rollup@4.53.3": { 679 + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", 680 + "dependencies": [ 681 + "@types/estree" 682 + ], 683 + "optionalDependencies": [ 684 + "@rollup/rollup-android-arm-eabi", 685 + "@rollup/rollup-android-arm64", 686 + "@rollup/rollup-darwin-arm64", 687 + "@rollup/rollup-darwin-x64", 688 + "@rollup/rollup-freebsd-arm64", 689 + "@rollup/rollup-freebsd-x64", 690 + "@rollup/rollup-linux-arm-gnueabihf", 691 + "@rollup/rollup-linux-arm-musleabihf", 692 + "@rollup/rollup-linux-arm64-gnu", 693 + "@rollup/rollup-linux-arm64-musl", 694 + "@rollup/rollup-linux-loong64-gnu", 695 + "@rollup/rollup-linux-ppc64-gnu", 696 + "@rollup/rollup-linux-riscv64-gnu", 697 + "@rollup/rollup-linux-riscv64-musl", 698 + "@rollup/rollup-linux-s390x-gnu", 699 + "@rollup/rollup-linux-x64-gnu", 700 + "@rollup/rollup-linux-x64-musl", 701 + "@rollup/rollup-openharmony-arm64", 702 + "@rollup/rollup-win32-arm64-msvc", 703 + "@rollup/rollup-win32-ia32-msvc", 704 + "@rollup/rollup-win32-x64-gnu", 705 + "@rollup/rollup-win32-x64-msvc", 706 + "fsevents" 707 + ], 708 + "bin": true 709 + }, 710 + "source-map-js@1.2.1": { 711 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 712 + }, 713 + "tinyglobby@0.2.15_picomatch@4.0.3": { 714 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 715 + "dependencies": [ 716 + "fdir", 717 + "picomatch" 718 + ] 719 + }, 720 + "tslib@2.8.1": { 721 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 722 + }, 723 + "typescript@5.9.3": { 724 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 725 + "bin": true 726 + }, 727 + "uuid@10.0.0": { 728 + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", 729 + "bin": true 730 + }, 731 + "vite-plugin-top-level-await@1.6.0_vite@7.2.7__picomatch@4.0.3": { 732 + "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", 733 + "dependencies": [ 734 + "@rollup/plugin-virtual", 735 + "@swc/core", 736 + "@swc/wasm", 737 + "uuid", 738 + "vite" 739 + ] 740 + }, 741 + "vite-plugin-wasm@3.5.0_vite@7.2.7__picomatch@4.0.3": { 742 + "integrity": "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==", 743 + "dependencies": [ 744 + "vite" 745 + ] 746 + }, 747 + "vite@7.2.7_picomatch@4.0.3": { 748 + "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", 749 + "dependencies": [ 750 + "esbuild", 751 + "fdir", 752 + "picomatch", 753 + "postcss", 754 + "rollup", 755 + "tinyglobby" 756 + ], 757 + "optionalDependencies": [ 758 + "fsevents" 759 + ], 760 + "bin": true 761 + } 762 + }, 763 + "workspace": { 764 + "members": { 765 + "www": { 766 + "packageJson": { 767 + "dependencies": [ 768 + "npm:@jsr/std__toml@*", 769 + "npm:@xterm/addon-canvas@0.7", 770 + "npm:@xterm/addon-fit@0.10", 771 + "npm:@xterm/addon-web-links@0.11", 772 + "npm:@xterm/addon-webgl@0.18", 773 + "npm:@xterm/xterm@^5.5.0", 774 + "npm:rolldown-vite@7.2.5", 775 + "npm:typescript@~5.9.3", 776 + "npm:vite-plugin-top-level-await@^1.6.0", 777 + "npm:vite-plugin-wasm@^3.5.0" 778 + ] 779 + } 780 + } 781 + } 782 + } 783 + }
+308
flake.lock
··· 1 + { 2 + "nodes": { 3 + "crane": { 4 + "flake": false, 5 + "locked": { 6 + "lastModified": 1758758545, 7 + "narHash": "sha256-NU5WaEdfwF6i8faJ2Yh+jcK9vVFrofLcwlD/mP65JrI=", 8 + "owner": "ipetkov", 9 + "repo": "crane", 10 + "rev": "95d528a5f54eaba0d12102249ce42f4d01f4e364", 11 + "type": "github" 12 + }, 13 + "original": { 14 + "owner": "ipetkov", 15 + "ref": "v0.21.1", 16 + "repo": "crane", 17 + "type": "github" 18 + } 19 + }, 20 + "dream2nix": { 21 + "inputs": { 22 + "nixpkgs": [ 23 + "nci", 24 + "nixpkgs" 25 + ], 26 + "purescript-overlay": "purescript-overlay", 27 + "pyproject-nix": "pyproject-nix" 28 + }, 29 + "locked": { 30 + "lastModified": 1765450682, 31 + "narHash": "sha256-nZjNYEvNKZRF0+koTN2azGWbGlsvLNUTF6PcC0eqTa4=", 32 + "owner": "nix-community", 33 + "repo": "dream2nix", 34 + "rev": "343053a4dfa53ce8abfc35e918cd4ab990abc58d", 35 + "type": "github" 36 + }, 37 + "original": { 38 + "owner": "nix-community", 39 + "repo": "dream2nix", 40 + "type": "github" 41 + } 42 + }, 43 + "flake-compat": { 44 + "flake": false, 45 + "locked": { 46 + "lastModified": 1696426674, 47 + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", 48 + "owner": "edolstra", 49 + "repo": "flake-compat", 50 + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", 51 + "type": "github" 52 + }, 53 + "original": { 54 + "owner": "edolstra", 55 + "repo": "flake-compat", 56 + "type": "github" 57 + } 58 + }, 59 + "mk-naked-shell": { 60 + "flake": false, 61 + "locked": { 62 + "lastModified": 1681286841, 63 + "narHash": "sha256-3XlJrwlR0nBiREnuogoa5i1b4+w/XPe0z8bbrJASw0g=", 64 + "owner": "90-008", 65 + "repo": "mk-naked-shell", 66 + "rev": "7612f828dd6f22b7fb332cc69440e839d7ffe6bd", 67 + "type": "github" 68 + }, 69 + "original": { 70 + "owner": "90-008", 71 + "repo": "mk-naked-shell", 72 + "type": "github" 73 + } 74 + }, 75 + "naked-shell": { 76 + "locked": { 77 + "lastModified": 1681286841, 78 + "narHash": "sha256-3XlJrwlR0nBiREnuogoa5i1b4+w/XPe0z8bbrJASw0g=", 79 + "owner": "90-008", 80 + "repo": "mk-naked-shell", 81 + "rev": "7612f828dd6f22b7fb332cc69440e839d7ffe6bd", 82 + "type": "github" 83 + }, 84 + "original": { 85 + "owner": "90-008", 86 + "repo": "mk-naked-shell", 87 + "type": "github" 88 + } 89 + }, 90 + "nci": { 91 + "inputs": { 92 + "crane": "crane", 93 + "dream2nix": "dream2nix", 94 + "mk-naked-shell": "mk-naked-shell", 95 + "nixpkgs": [ 96 + "nixpkgs" 97 + ], 98 + "parts": "parts", 99 + "rust-overlay": "rust-overlay", 100 + "treefmt": "treefmt" 101 + }, 102 + "locked": { 103 + "lastModified": 1765693183, 104 + "narHash": "sha256-DQIYzLNbpynPaw7ktP3KZ09LzczHIROn39jRQDMK7Wg=", 105 + "owner": "90-008", 106 + "repo": "nix-cargo-integration", 107 + "rev": "cc67b9cd2d85e1fccab800e2df26b351bea2d379", 108 + "type": "github" 109 + }, 110 + "original": { 111 + "owner": "90-008", 112 + "repo": "nix-cargo-integration", 113 + "type": "github" 114 + } 115 + }, 116 + "nixpkgs": { 117 + "locked": { 118 + "lastModified": 1765644376, 119 + "narHash": "sha256-yqHBL2wYGwjGL2GUF2w3tofWl8qO9tZEuI4wSqbCrtE=", 120 + "owner": "nixos", 121 + "repo": "nixpkgs", 122 + "rev": "23735a82a828372c4ef92c660864e82fbe2f5fbe", 123 + "type": "github" 124 + }, 125 + "original": { 126 + "owner": "nixos", 127 + "ref": "nixpkgs-unstable", 128 + "repo": "nixpkgs", 129 + "type": "github" 130 + } 131 + }, 132 + "nixpkgs-lib": { 133 + "locked": { 134 + "lastModified": 1761765539, 135 + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", 136 + "owner": "nix-community", 137 + "repo": "nixpkgs.lib", 138 + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", 139 + "type": "github" 140 + }, 141 + "original": { 142 + "owner": "nix-community", 143 + "repo": "nixpkgs.lib", 144 + "type": "github" 145 + } 146 + }, 147 + "parts": { 148 + "inputs": { 149 + "nixpkgs-lib": [ 150 + "nci", 151 + "nixpkgs" 152 + ] 153 + }, 154 + "locked": { 155 + "lastModified": 1765495779, 156 + "narHash": "sha256-MhA7wmo/7uogLxiewwRRmIax70g6q1U/YemqTGoFHlM=", 157 + "owner": "hercules-ci", 158 + "repo": "flake-parts", 159 + "rev": "5635c32d666a59ec9a55cab87e898889869f7b71", 160 + "type": "github" 161 + }, 162 + "original": { 163 + "owner": "hercules-ci", 164 + "repo": "flake-parts", 165 + "type": "github" 166 + } 167 + }, 168 + "parts_2": { 169 + "inputs": { 170 + "nixpkgs-lib": "nixpkgs-lib" 171 + }, 172 + "locked": { 173 + "lastModified": 1765495779, 174 + "narHash": "sha256-MhA7wmo/7uogLxiewwRRmIax70g6q1U/YemqTGoFHlM=", 175 + "owner": "hercules-ci", 176 + "repo": "flake-parts", 177 + "rev": "5635c32d666a59ec9a55cab87e898889869f7b71", 178 + "type": "github" 179 + }, 180 + "original": { 181 + "owner": "hercules-ci", 182 + "repo": "flake-parts", 183 + "type": "github" 184 + } 185 + }, 186 + "purescript-overlay": { 187 + "inputs": { 188 + "flake-compat": "flake-compat", 189 + "nixpkgs": [ 190 + "nci", 191 + "dream2nix", 192 + "nixpkgs" 193 + ], 194 + "slimlock": "slimlock" 195 + }, 196 + "locked": { 197 + "lastModified": 1728546539, 198 + "narHash": "sha256-Sws7w0tlnjD+Bjck1nv29NjC5DbL6nH5auL9Ex9Iz2A=", 199 + "owner": "thomashoneyman", 200 + "repo": "purescript-overlay", 201 + "rev": "4ad4c15d07bd899d7346b331f377606631eb0ee4", 202 + "type": "github" 203 + }, 204 + "original": { 205 + "owner": "thomashoneyman", 206 + "repo": "purescript-overlay", 207 + "type": "github" 208 + } 209 + }, 210 + "pyproject-nix": { 211 + "inputs": { 212 + "nixpkgs": [ 213 + "nci", 214 + "dream2nix", 215 + "nixpkgs" 216 + ] 217 + }, 218 + "locked": { 219 + "lastModified": 1763017646, 220 + "narHash": "sha256-Z+R2lveIp6Skn1VPH3taQIuMhABg1IizJd8oVdmdHsQ=", 221 + "owner": "pyproject-nix", 222 + "repo": "pyproject.nix", 223 + "rev": "47bd6f296502842643078d66128f7b5e5370790c", 224 + "type": "github" 225 + }, 226 + "original": { 227 + "owner": "pyproject-nix", 228 + "repo": "pyproject.nix", 229 + "type": "github" 230 + } 231 + }, 232 + "root": { 233 + "inputs": { 234 + "naked-shell": "naked-shell", 235 + "nci": "nci", 236 + "nixpkgs": "nixpkgs", 237 + "parts": "parts_2" 238 + } 239 + }, 240 + "rust-overlay": { 241 + "inputs": { 242 + "nixpkgs": [ 243 + "nci", 244 + "nixpkgs" 245 + ] 246 + }, 247 + "locked": { 248 + "lastModified": 1765680428, 249 + "narHash": "sha256-fyPmRof9SZeI14ChPk5rVPOm7ISiiGkwGCunkhM+eUg=", 250 + "owner": "oxalica", 251 + "repo": "rust-overlay", 252 + "rev": "eb3898d8ef143d4bf0f7f2229105fc51c7731b2f", 253 + "type": "github" 254 + }, 255 + "original": { 256 + "owner": "oxalica", 257 + "repo": "rust-overlay", 258 + "type": "github" 259 + } 260 + }, 261 + "slimlock": { 262 + "inputs": { 263 + "nixpkgs": [ 264 + "nci", 265 + "dream2nix", 266 + "purescript-overlay", 267 + "nixpkgs" 268 + ] 269 + }, 270 + "locked": { 271 + "lastModified": 1688756706, 272 + "narHash": "sha256-xzkkMv3neJJJ89zo3o2ojp7nFeaZc2G0fYwNXNJRFlo=", 273 + "owner": "thomashoneyman", 274 + "repo": "slimlock", 275 + "rev": "cf72723f59e2340d24881fd7bf61cb113b4c407c", 276 + "type": "github" 277 + }, 278 + "original": { 279 + "owner": "thomashoneyman", 280 + "repo": "slimlock", 281 + "type": "github" 282 + } 283 + }, 284 + "treefmt": { 285 + "inputs": { 286 + "nixpkgs": [ 287 + "nci", 288 + "nixpkgs" 289 + ] 290 + }, 291 + "locked": { 292 + "lastModified": 1762938485, 293 + "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", 294 + "owner": "numtide", 295 + "repo": "treefmt-nix", 296 + "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", 297 + "type": "github" 298 + }, 299 + "original": { 300 + "owner": "numtide", 301 + "repo": "treefmt-nix", 302 + "type": "github" 303 + } 304 + } 305 + }, 306 + "root": "root", 307 + "version": 7 308 + }
+40
flake.nix
··· 1 + { 2 + inputs.parts.url = "github:hercules-ci/flake-parts"; 3 + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; 4 + inputs.naked-shell.url = "github:90-008/mk-naked-shell"; 5 + inputs.nci.url = "github:90-008/nix-cargo-integration"; 6 + inputs.nci.inputs.nixpkgs.follows = "nixpkgs"; 7 + 8 + outputs = inp: 9 + inp.parts.lib.mkFlake {inputs = inp;} { 10 + systems = ["x86_64-linux"]; 11 + imports = [ 12 + inp.naked-shell.flakeModule 13 + # inp.nci.flakeModule 14 + ]; 15 + perSystem = { 16 + config, 17 + pkgs, 18 + ... 19 + }: { 20 + devShells.default = pkgs.mkShell { 21 + name = "faunu-devshell"; 22 + packages = with pkgs; [ 23 + nodejs-slim_latest deno 24 + nodePackages.svelte-language-server 25 + nodePackages.typescript-language-server 26 + rustc rust-analyzer cargo wasm-pack wasm-bindgen-cli lld rustfmt binaryen 27 + ]; 28 + shellHook = '' 29 + export PATH="$PATH:$PWD/node_modules/.bin" 30 + ''; 31 + }; 32 + packages.faunu-wasm = pkgs.callPackage ./nix/wasm.nix {}; 33 + packages.faunu-modules = pkgs.callPackage ./nix/modules.nix {}; 34 + packages.faunu = pkgs.callPackage ./nix { 35 + inherit (config.packages) faunu-modules faunu-wasm; 36 + }; 37 + packages.default = config.packages.faunu; 38 + }; 39 + }; 40 + }
+55
nix/default.nix
··· 1 + { 2 + lib, 3 + stdenv, 4 + deno, 5 + nodejs, 6 + makeBinaryWrapper, 7 + callPackage, 8 + faunu-modules ? callPackage ./modules.nix {}, 9 + faunu-wasm ? callPackage ./wasm.nix {}, 10 + PUBLIC_BASE_URL ? "http://localhost:5173", 11 + }: 12 + stdenv.mkDerivation { 13 + name = "faunu"; 14 + 15 + src = lib.fileset.toSource { 16 + root = ../.; 17 + fileset = lib.fileset.unions [ 18 + ../.npmrc 19 + ../deno.lock 20 + ../deno.json 21 + ../www 22 + ]; 23 + }; 24 + 25 + nativeBuildInputs = [makeBinaryWrapper]; 26 + buildInputs = [deno]; 27 + 28 + inherit PUBLIC_BASE_URL; 29 + 30 + dontCheck = true; 31 + 32 + configurePhase = '' 33 + runHook preConfigure 34 + cp -R --no-preserve=ownership,mode ${faunu-modules} node_modules 35 + find node_modules -type d -exec chmod 755 {} \; 36 + find -L node_modules -type f -path '*/bin/*' -exec chmod +x {} \; 37 + substituteInPlace node_modules/.bin/vite \ 38 + --replace-fail "/usr/bin/env node" "${nodejs}/bin/node" 39 + ln -sf ${faunu-wasm} pkg 40 + runHook postConfigure 41 + ''; 42 + buildPhase = '' 43 + runHook preBuild 44 + HOME=$TMPDIR deno task --cwd www --frozen build 45 + runHook postBuild 46 + ''; 47 + installPhase = '' 48 + runHook preInstall 49 + 50 + mkdir -p $out 51 + cp -R ./www/dist/* $out 52 + 53 + runHook postInstall 54 + ''; 55 + }
+40
nix/modules.nix
··· 1 + { 2 + lib, 3 + stdenv, 4 + deno, 5 + }: 6 + stdenv.mkDerivation { 7 + name = "faunu-modules"; 8 + 9 + src = lib.fileset.toSource { 10 + root = ../.; 11 + fileset = lib.fileset.unions [ 12 + ../.npmrc 13 + ../deno.lock 14 + ../deno.json 15 + ../www 16 + ]; 17 + }; 18 + 19 + outputHash = "sha256-Vl0zc9YI7zNIqBB3Bj2B+lqxT4jWCRihGClyW0FHBmM="; 20 + outputHashAlgo = "sha256"; 21 + outputHashMode = "recursive"; 22 + 23 + nativeBuildInputs = [deno]; 24 + 25 + dontConfigure = true; 26 + dontCheck = true; 27 + dontFixup = true; 28 + dontPatchShebangs = true; 29 + 30 + postUnpack = '' 31 + 32 + ''; 33 + buildPhase = '' 34 + HOME=$TMPDIR deno install --allow-scripts=npm:@swc/core --frozen --seed 8008135 35 + ''; 36 + installPhase = '' 37 + cp -R node_modules $out 38 + ls -la $out 39 + ''; 40 + }
+63
nix/wasm.nix
··· 1 + { 2 + rustPlatform, 3 + lib, 4 + wasm-pack, 5 + binaryen, 6 + wasm-bindgen-cli, 7 + lld, 8 + stdenv, 9 + ... 10 + }: 11 + let 12 + # First derivation: wasm-pack build 13 + wasmBuild = rustPlatform.buildRustPackage { 14 + pname = "faunu-wasm-build"; 15 + version = "main"; 16 + 17 + src = lib.fileset.toSource { 18 + root = ../.; 19 + fileset = lib.fileset.unions [ 20 + ../Cargo.toml 21 + ../Cargo.lock 22 + ../src 23 + ../.cargo 24 + ]; 25 + }; 26 + 27 + cargoLock = { 28 + lockFile = ../Cargo.lock; 29 + outputHashes = { 30 + "vfs-0.12.1" = "sha256-d249sIYhICdqqb7uoTRyhXAZTCF5zgjfItM4DE7b/gQ="; 31 + "jacquard-0.9.4" = "sha256-TEu4coueWzzkmFCkGb610Xrly7n8LUGMa5tdde/OElg="; 32 + }; 33 + }; 34 + 35 + nativeBuildInputs = [wasm-pack wasm-bindgen-cli lld]; 36 + 37 + phases = ["unpackPhase" "buildPhase"]; 38 + 39 + buildPhase = '' 40 + mkdir -p $out 41 + HOME=$TMPDIR wasm-pack build --target web --release --no-opt -d $out 42 + ''; 43 + }; 44 + 45 + # Second derivation: wasm-opt 46 + wasmOpt = stdenv.mkDerivation { 47 + pname = "faunu-wasm"; 48 + version = "main"; 49 + 50 + src = wasmBuild; 51 + 52 + nativeBuildInputs = [binaryen]; 53 + 54 + phases = ["unpackPhase" "buildPhase"]; 55 + 56 + buildPhase = '' 57 + mkdir -p $out 58 + cp -r --no-preserve=ownership,mode ${wasmBuild}/* $out/ 59 + wasm-opt $out/faunu_bg.wasm -O4 -all -o $out/faunu_bg.wasm 60 + ''; 61 + }; 62 + in 63 + wasmOpt
+64
src/cmd/cd.rs
··· 1 + use crate::globals::{get_pwd, get_vfs, set_pwd, to_shell_err}; 2 + use nu_engine::CallExt; 3 + use nu_protocol::{ 4 + Category, PipelineData, ShellError, Signature, SyntaxShape, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + use std::sync::Arc; 8 + use vfs::VfsFileType; 9 + 10 + #[derive(Clone)] 11 + pub struct Cd; 12 + 13 + impl Command for Cd { 14 + fn name(&self) -> &str { 15 + "cd" 16 + } 17 + 18 + fn signature(&self) -> Signature { 19 + Signature::build("cd") 20 + .optional("path", SyntaxShape::String, "the path to change into") 21 + .category(Category::FileSystem) 22 + } 23 + 24 + fn description(&self) -> &str { 25 + "change the current directory in the virtual filesystem." 26 + } 27 + 28 + fn run( 29 + &self, 30 + engine_state: &EngineState, 31 + _stack: &mut Stack, 32 + call: &nu_protocol::engine::Call, 33 + _input: PipelineData, 34 + ) -> Result<PipelineData, ShellError> { 35 + let path_arg: Option<String> = call.opt(engine_state, _stack, 0)?; 36 + let path = path_arg.unwrap_or_else(|| "/".to_string()); 37 + 38 + let base: Arc<vfs::VfsPath> = if path.starts_with('/') { 39 + get_vfs() 40 + } else { 41 + get_pwd().clone() 42 + }; 43 + 44 + let target = base 45 + .join(path.trim_end_matches('/')) 46 + .map_err(to_shell_err(call.head))?; 47 + 48 + // Ensure target exists and is a directory 49 + let metadata = target.metadata().map_err(to_shell_err(call.head))?; 50 + match metadata.file_type { 51 + VfsFileType::Directory => { 52 + set_pwd(Arc::new(target)); 53 + Ok(PipelineData::Empty) 54 + } 55 + VfsFileType::File => Err(ShellError::GenericError { 56 + error: "not a directory".to_string(), 57 + msg: format!("'{}' is not a directory", path), 58 + span: Some(call.head), 59 + help: None, 60 + inner: vec![], 61 + }), 62 + } 63 + } 64 + }
+338
src/cmd/fetch.rs
··· 1 + use crate::globals::{get_pwd, print_to_console, register_task, remove_task, to_shell_err}; 2 + use anyhow::{Result, anyhow}; 3 + use futures::future::{AbortHandle, Abortable}; 4 + use jacquard::types::aturi::AtUri; 5 + use jacquard::types::ident::AtIdentifier; 6 + use jacquard::types::string::Rkey; 7 + use jacquard::{ 8 + api::com_atproto::{ 9 + repo::{get_record::GetRecord, list_records::ListRecords}, 10 + sync::get_repo::GetRepo, 11 + }, 12 + client::{Agent, MemorySessionStore, credential_session::CredentialSession}, 13 + identity::{resolver::IdentityResolver, slingshot_resolver_default}, 14 + prelude::*, 15 + types::{did::Did, nsid::Nsid}, 16 + }; 17 + use jacquard_repo::{ 18 + Repository, 19 + car::parse_car_bytes, 20 + storage::{BlockStore, MemoryBlockStore}, 21 + }; 22 + use nu_engine::CallExt; 23 + use nu_protocol::IntoPipelineData; 24 + use nu_protocol::{ 25 + Category, PipelineData, ShellError, Signature, SyntaxShape, Value, 26 + engine::{Command, EngineState, Stack}, 27 + }; 28 + use std::io::Write; 29 + use std::str::FromStr; 30 + use std::sync::Arc; 31 + use url::Url; 32 + use wasm_bindgen_futures::spawn_local; 33 + 34 + #[derive(Clone)] 35 + pub struct Fetch; 36 + 37 + impl Command for Fetch { 38 + fn name(&self) -> &str { 39 + "fetch" 40 + } 41 + 42 + fn signature(&self) -> Signature { 43 + Signature::build(self.name()) 44 + .required( 45 + "uri", 46 + SyntaxShape::String, 47 + "HTTP URI or AT URI (at://identifier[/collection[/rkey]])", 48 + ) 49 + .named("output", SyntaxShape::Filepath, "output path", Some('o')) 50 + .category(Category::Network) 51 + } 52 + 53 + fn description(&self) -> &str { 54 + "fetch files using HTTP or fetch records from an AT Protocol repository.\nsupports full repo (CAR), collection, or a single record." 55 + } 56 + 57 + fn run( 58 + &self, 59 + engine_state: &EngineState, 60 + stack: &mut Stack, 61 + call: &nu_protocol::engine::Call, 62 + _input: PipelineData, 63 + ) -> Result<PipelineData, ShellError> { 64 + let uri_arg: String = call.req(engine_state, stack, 0)?; 65 + let output_arg: Option<String> = call.get_flag(engine_state, stack, "output")?; 66 + let output_span = call.get_flag_span(stack, "output"); 67 + 68 + let at_uri = uri_arg 69 + .starts_with("at://") 70 + .then(|| { 71 + AtUri::from_str(&uri_arg).map_err(|err| ShellError::GenericError { 72 + error: "invalid AT URI format".into(), 73 + msg: err.to_string(), 74 + span: Some(call.arguments_span()), 75 + help: None, 76 + inner: vec![], 77 + }) 78 + }) 79 + .transpose()?; 80 + let uri = at_uri 81 + .is_none() 82 + .then(|| { 83 + Url::from_str(&uri_arg).map_err(|err| ShellError::GenericError { 84 + error: "invalid URI format".into(), 85 + msg: err.to_string(), 86 + span: Some(call.arguments_span()), 87 + help: None, 88 + inner: vec![], 89 + }) 90 + }) 91 + .transpose()?; 92 + 93 + // Determine target directory 94 + let pwd = get_pwd(); 95 + let base_dir = if let Some(out) = output_arg.as_ref() { 96 + pwd.join(out.trim_end_matches('/')) 97 + .map_err(to_shell_err(output_span.unwrap()))? 98 + } else { 99 + pwd.join("").unwrap() 100 + }; 101 + 102 + let final_path = if let Some(at_uri) = at_uri.as_ref() { 103 + match (at_uri.collection(), at_uri.rkey()) { 104 + (None, _) => base_dir 105 + .join(at_uri.authority()) 106 + .map_err(to_shell_err(call.span()))?, 107 + (Some(collection), None) => base_dir 108 + .join(collection) 109 + .map_err(to_shell_err(call.span()))?, 110 + // use rkey as file name 111 + (Some(_), Some(rkey)) => output_arg 112 + .is_some() 113 + .then(|| Ok(base_dir.clone())) 114 + .unwrap_or_else(|| base_dir.join(&rkey.0).map_err(to_shell_err(call.span())))?, 115 + } 116 + } else if let Some(uri) = uri.as_ref() { 117 + // choose file name from uri 118 + output_arg 119 + .is_some() 120 + .then(|| Ok(base_dir.clone())) 121 + .unwrap_or_else(|| { 122 + base_dir 123 + .join( 124 + uri.path() 125 + .split('/') 126 + .rfind(|a| !a.is_empty()) 127 + .unwrap_or("index"), 128 + ) 129 + .map_err(to_shell_err(call.span())) 130 + })? 131 + } else { 132 + // todo: make these into an enum so we dont need this 133 + unreachable!("either of at_uri or uri should be set") 134 + }; 135 + 136 + if !final_path.exists().map_err(to_shell_err(call.span()))? { 137 + // if http uri or at uri with rkey, we create parent dir since we'll 138 + // write just a single file, otherwise we create this path as directory 139 + if at_uri.as_ref().map_or(true, |at| at.rkey().is_some()) { 140 + final_path 141 + .parent() 142 + .create_dir_all() 143 + .map_err(to_shell_err(call.span()))?; 144 + } else { 145 + final_path 146 + .create_dir_all() 147 + .map_err(to_shell_err(call.span()))?; 148 + } 149 + } 150 + 151 + let (abort_handle, abort_registration) = AbortHandle::new_pair(); 152 + let task_desc = format!("{name} {uri_arg}", name = self.name()); 153 + let task_id = register_task(task_desc.clone(), abort_handle); 154 + 155 + spawn_local(async move { 156 + let task_future = async { 157 + if let Some(at_uri) = at_uri { 158 + let identifier = at_uri.authority().clone(); 159 + match (at_uri.collection(), at_uri.rkey()) { 160 + (Some(coll), Some(key)) => { 161 + fetch_record(identifier, coll.clone(), key.0.clone(), final_path).await 162 + } 163 + (Some(coll), None) => { 164 + fetch_collection(identifier, coll.clone(), final_path).await 165 + } 166 + _ => fetch_repo(identifier, final_path).await, 167 + } 168 + } else if let Some(uri) = uri { 169 + fetch_file(uri, final_path).await 170 + } else { 171 + Ok(()) 172 + } 173 + }; 174 + 175 + let abortable = Abortable::new(task_future, abort_registration); 176 + 177 + match abortable.await { 178 + Ok(result) => { 179 + remove_task(task_id); 180 + match result { 181 + Ok(_) => {} 182 + Err(e) => { 183 + print_to_console( 184 + &format!("\x1b[31m✖\x1b[0m ({task_desc}) error: {e}"), 185 + false, 186 + ); 187 + } 188 + } 189 + } 190 + Err(_) => { 191 + remove_task(task_id); 192 + } 193 + } 194 + }); 195 + 196 + Ok(Value::nothing(call.head).into_pipeline_data()) 197 + } 198 + } 199 + 200 + async fn fetch_file(uri: Url, target_path: vfs::VfsPath) -> Result<()> { 201 + let response = reqwest::get(uri).await?; 202 + let content = response.bytes().await?; 203 + target_path.create_file()?.write_all(&content)?; 204 + Ok(()) 205 + } 206 + 207 + async fn resolve_did(identifier: AtIdentifier<'_>) -> Result<Did<'_>> { 208 + match identifier { 209 + AtIdentifier::Did(did) => Ok(did), 210 + AtIdentifier::Handle(handle) => { 211 + let did = slingshot_resolver_default().resolve_handle(&handle).await?; 212 + Ok(did) 213 + } 214 + } 215 + } 216 + 217 + async fn resolve_pds(did: &Did<'_>) -> Result<Url> { 218 + slingshot_resolver_default() 219 + .resolve_did_doc(did) 220 + .await? 221 + .parse()? 222 + .pds_endpoint() 223 + .ok_or_else(|| anyhow!("no pds endpoint in did doc")) 224 + } 225 + 226 + async fn create_agent(pds: Url) -> BasicClient { 227 + let store = MemorySessionStore::default(); 228 + let session = CredentialSession::new(Arc::new(store), Arc::new(slingshot_resolver_default())); 229 + session.set_endpoint(pds).await; 230 + Agent::new(session) 231 + } 232 + 233 + async fn fetch_record( 234 + identifier: AtIdentifier<'_>, 235 + collection: Nsid<'_>, 236 + rkey: Rkey<'_>, 237 + target_path: vfs::VfsPath, 238 + ) -> anyhow::Result<()> { 239 + let did = resolve_did(identifier).await?; 240 + let pds = resolve_pds(&did).await?; 241 + let client = create_agent(pds).await; 242 + 243 + let nsid = Nsid::new(&collection)?; 244 + 245 + let request = GetRecord::new() 246 + .repo(did) 247 + .collection(nsid) 248 + .rkey(rkey.clone()); 249 + 250 + let output = client.send(request.build()).await?.into_output()?; 251 + let file = target_path.create_file()?; 252 + serde_json::to_writer_pretty(file, &output.value)?; 253 + 254 + Ok(()) 255 + } 256 + 257 + async fn fetch_collection( 258 + identifier: AtIdentifier<'_>, 259 + collection: Nsid<'_>, 260 + target_path: vfs::VfsPath, 261 + ) -> anyhow::Result<()> { 262 + let did = resolve_did(identifier).await?; 263 + let pds = resolve_pds(&did).await?; 264 + let client = create_agent(pds).await; 265 + 266 + let mut cursor: Option<String> = None; 267 + 268 + loop { 269 + let request = ListRecords::new() 270 + .repo(did.clone()) 271 + .collection(collection.clone()) 272 + .limit(100) 273 + .cursor(cursor.map(Into::into)); 274 + 275 + let response = client.send(request.build()).await?; 276 + 277 + let output = response.into_output()?; 278 + 279 + for rec in output.records { 280 + if let Some(rkey) = rec.uri.rkey() { 281 + let file = target_path.join(&rkey.0)?.create_file()?; 282 + serde_json::to_writer_pretty(file, &rec.value)?; 283 + } 284 + } 285 + 286 + if let Some(c) = output.cursor { 287 + cursor = Some(c.into()); 288 + } else { 289 + break; 290 + } 291 + } 292 + 293 + Ok(()) 294 + } 295 + 296 + async fn fetch_repo(identifier: AtIdentifier<'_>, target_path: vfs::VfsPath) -> Result<()> { 297 + let did = resolve_did(identifier).await?; 298 + let pds = resolve_pds(&did).await?; 299 + let client = create_agent(pds).await; 300 + 301 + let response = client.send(GetRepo::new().did(did).build()).await?; 302 + 303 + // parse the car and create the repo 304 + let car_bytes = response.into_output()?.body; 305 + let parsed = parse_car_bytes(&car_bytes).await?; 306 + let storage = Arc::new(MemoryBlockStore::new_from_blocks(parsed.blocks)); 307 + let repo = Repository::from_commit(storage, &parsed.root).await?; 308 + 309 + // Iterate over all leaves in the MST 310 + // repo.mst() gives us the Mst<S> 311 + // mst.leaves() returns Vec<(SmolStr, IpldCid)> 312 + let leaves = repo.mst().leaves_sequential().await?; 313 + 314 + for (key, cid) in leaves { 315 + // key format: collection/rkey 316 + let key_str = key.as_str(); 317 + 318 + if let Some((collection, rkey)) = key_str.split_once('/') { 319 + // Get the record block from storage 320 + // The record data is just a CBOR block. We need to convert it to JSON for readability. 321 + if let Some(block_bytes) = repo.storage().get(&cid).await? { 322 + // Deserialize DAG-CBOR to generic JSON Value 323 + let json_val: jacquard::RawData = serde_ipld_dagcbor::from_slice(&block_bytes) 324 + .map_err(|e| anyhow!("failed to deserialize record {}: {}", key, e))?; 325 + 326 + let coll_dir = target_path.join(collection)?; 327 + if !coll_dir.exists()? { 328 + coll_dir.create_dir_all()?; 329 + } 330 + let file = coll_dir.join(rkey)?.create_file()?; 331 + 332 + serde_json::to_writer_pretty(file, &json_val)?; 333 + } 334 + } 335 + } 336 + 337 + Ok(()) 338 + }
+39
src/cmd/job.rs
··· 1 + use nu_engine::{command_prelude::*, get_full_help}; 2 + use nu_protocol::{ 3 + Category, IntoPipelineData, PipelineData, ShellError, Signature, Value, 4 + engine::{Command, EngineState, Stack}, 5 + }; 6 + 7 + #[derive(Clone)] 8 + pub struct Job; 9 + 10 + // Top-level `job` command that just prints help (like nu stdlib style) 11 + impl Command for Job { 12 + fn name(&self) -> &str { 13 + "job" 14 + } 15 + 16 + fn signature(&self) -> Signature { 17 + Signature::build("job") 18 + .category(Category::System) 19 + .input_output_types(vec![(Type::Nothing, Type::String)]) 20 + } 21 + 22 + fn description(&self) -> &str { 23 + "Various commands for working with background jobs." 24 + } 25 + 26 + fn extra_description(&self) -> &str { 27 + "You must use one of the following subcommands. Using this command as-is will only produce this help message." 28 + } 29 + 30 + fn run( 31 + &self, 32 + engine_state: &EngineState, 33 + stack: &mut Stack, 34 + call: &Call, 35 + _input: PipelineData, 36 + ) -> Result<PipelineData, ShellError> { 37 + Ok(Value::string(get_full_help(self, engine_state, stack), call.head).into_pipeline_data()) 38 + } 39 + }
+49
src/cmd/job_kill.rs
··· 1 + use crate::globals::kill_task_by_id; 2 + use nu_engine::CallExt; 3 + use nu_protocol::{ 4 + Category, IntoPipelineData, PipelineData, ShellError, Signature, SyntaxShape, Value, 5 + engine::{Call, Command, EngineState, Stack}, 6 + }; 7 + 8 + #[derive(Clone)] 9 + pub struct JobKill; 10 + 11 + impl Command for JobKill { 12 + fn name(&self) -> &str { 13 + "job kill" 14 + } 15 + 16 + fn signature(&self) -> Signature { 17 + Signature::build("job kill") 18 + .required("id", SyntaxShape::Int, "id of job to kill") 19 + .category(Category::System) 20 + } 21 + 22 + fn description(&self) -> &str { 23 + "Kill a background job by ID." 24 + } 25 + 26 + fn run( 27 + &self, 28 + engine_state: &EngineState, 29 + stack: &mut Stack, 30 + call: &Call, 31 + _input: PipelineData, 32 + ) -> Result<PipelineData, ShellError> { 33 + let id: i64 = call.req(engine_state, stack, 0)?; 34 + if id < 0 { 35 + return Err(ShellError::GenericError { 36 + error: "invalid id".to_string(), 37 + msg: format!("task id must be non-negative, got {}", id), 38 + span: Some(call.head), 39 + help: None, 40 + inner: vec![], 41 + }); 42 + } 43 + 44 + let killed = kill_task_by_id(id as usize); 45 + 46 + // Return a boolean indicating whether a task was found & killed. 47 + Ok(Value::bool(killed, call.head).into_pipeline_data()) 48 + } 49 + }
+43
src/cmd/job_list.rs
··· 1 + use crate::globals::get_all_tasks; 2 + use nu_protocol::{ 3 + Category, ListStream, PipelineData, Record, ShellError, Signature, Value, 4 + engine::{Call, Command, EngineState, Stack}, 5 + }; 6 + 7 + #[derive(Clone)] 8 + pub struct JobList; 9 + 10 + impl Command for JobList { 11 + fn name(&self) -> &str { 12 + "job list" 13 + } 14 + 15 + fn signature(&self) -> Signature { 16 + Signature::build("job list").category(Category::System) 17 + } 18 + 19 + fn description(&self) -> &str { 20 + "List background jobs." 21 + } 22 + 23 + fn run( 24 + &self, 25 + engine_state: &EngineState, 26 + _stack: &mut Stack, 27 + call: &Call, 28 + _input: PipelineData, 29 + ) -> Result<PipelineData, ShellError> { 30 + let tasks = get_all_tasks(); 31 + let span = call.head; 32 + let iter = tasks.into_iter().map(move |(id, desc)| { 33 + let mut rec = Record::new(); 34 + rec.push("id", Value::int(id as i64, span)); 35 + rec.push("description", Value::string(desc, span)); 36 + Value::record(rec, span) 37 + }); 38 + Ok(PipelineData::list_stream( 39 + ListStream::new(iter, span, engine_state.signals().clone()), 40 + None, 41 + )) 42 + } 43 + }
+139
src/cmd/ls.rs
··· 1 + use std::{ 2 + sync::Arc, 3 + time::{SystemTime, UNIX_EPOCH}, 4 + }; 5 + 6 + use crate::globals::{get_pwd, to_shell_err}; 7 + use jacquard::chrono; 8 + use nu_engine::CallExt; 9 + use nu_protocol::{ 10 + Category, ListStream, PipelineData, Record, ShellError, Signature, SyntaxShape, Value, 11 + engine::{Command, EngineState, Stack}, 12 + }; 13 + 14 + #[derive(Clone)] 15 + pub struct Ls; 16 + 17 + impl Command for Ls { 18 + fn name(&self) -> &str { 19 + "ls" 20 + } 21 + 22 + fn signature(&self) -> Signature { 23 + Signature::build("ls") 24 + .optional("path", SyntaxShape::String, "the path to list") 25 + .switch( 26 + "all", 27 + "include hidden paths (that start with a dot)", 28 + Some('a'), 29 + ) 30 + .switch( 31 + "long", 32 + "show detailed information about each file", 33 + Some('l'), 34 + ) 35 + .category(Category::FileSystem) 36 + } 37 + 38 + fn description(&self) -> &str { 39 + "list the files in the virtual filesystem." 40 + } 41 + 42 + fn run( 43 + &self, 44 + engine_state: &EngineState, 45 + stack: &mut Stack, 46 + call: &nu_protocol::engine::Call, 47 + _input: PipelineData, 48 + ) -> Result<PipelineData, ShellError> { 49 + let path_arg: Option<String> = call.opt(engine_state, stack, 0)?; 50 + let all = call.has_flag(engine_state, stack, "all")?; 51 + let long = call.has_flag(engine_state, stack, "long")?; 52 + 53 + let mut target_dir = get_pwd(); 54 + if let Some(path) = path_arg { 55 + target_dir = Arc::new( 56 + target_dir 57 + .join(path.trim_end_matches('/')) 58 + .map_err(to_shell_err(call.arguments_span()))?, 59 + ); 60 + } 61 + 62 + let span = call.head; 63 + let entries = target_dir.read_dir().map_err(to_shell_err(span))?; 64 + 65 + let make_record = move |name: &str, metadata: &vfs::VfsMetadata| { 66 + let type_str = match metadata.file_type { 67 + vfs::VfsFileType::Directory => "dir", 68 + vfs::VfsFileType::File => "file", 69 + }; 70 + 71 + let mut record = Record::new(); 72 + record.push("name", Value::string(name, span)); 73 + record.push("type", Value::string(type_str, span)); 74 + record.push("size", Value::filesize(metadata.len as i64, span)); 75 + let mut add_timestamp = |field: &str, timestamp: Option<SystemTime>| { 76 + if let Some(dur) = timestamp.and_then(|s| s.duration_since(UNIX_EPOCH).ok()) { 77 + record.push( 78 + field, 79 + Value::date( 80 + chrono::DateTime::from_timestamp_nanos(dur.as_nanos() as i64) 81 + .fixed_offset(), 82 + span, 83 + ), 84 + ); 85 + } else { 86 + record.push(field, Value::nothing(span)); 87 + } 88 + }; 89 + add_timestamp("modified", metadata.modified); 90 + if long { 91 + add_timestamp("created", metadata.created); 92 + add_timestamp("accessed", metadata.accessed); 93 + } 94 + Value::record(record, span) 95 + }; 96 + const DIR_METADATA: vfs::VfsMetadata = vfs::VfsMetadata { 97 + file_type: vfs::VfsFileType::Directory, 98 + len: 0, 99 + modified: None, 100 + created: None, 101 + accessed: None, 102 + }; 103 + 104 + let dots = if all { 105 + vec![ 106 + make_record(".", &DIR_METADATA), 107 + make_record("..", &DIR_METADATA), 108 + ] 109 + } else { 110 + Vec::new() 111 + }; 112 + let entries = dots 113 + .into_iter() 114 + .chain(entries.into_iter().flat_map(move |entry| { 115 + let do_map = move || { 116 + let name = entry.filename(); 117 + if name.starts_with('.') && !all { 118 + return Ok(None); 119 + } 120 + let metadata = entry.metadata().map_err(to_shell_err(span))?; 121 + 122 + Ok(Some(make_record(&name, &metadata))) 123 + }; 124 + do_map() 125 + .transpose() 126 + .map(|res| res.unwrap_or_else(|err| Value::error(err, span))) 127 + })); 128 + 129 + let signals = engine_state.signals().clone(); 130 + Ok(PipelineData::list_stream( 131 + ListStream::new(entries, span, signals.clone()), 132 + Some(nu_protocol::PipelineMetadata { 133 + data_source: nu_protocol::DataSource::Ls, 134 + content_type: None, 135 + custom: Record::new(), 136 + }), 137 + )) 138 + } 139 + }
+46
src/cmd/mkdir.rs
··· 1 + use crate::globals::{get_pwd, to_shell_err}; 2 + use nu_engine::CallExt; 3 + use nu_protocol::{ 4 + Category, PipelineData, ShellError, Signature, SyntaxShape, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + 8 + #[derive(Clone)] 9 + pub struct Mkdir; 10 + 11 + impl Command for Mkdir { 12 + fn name(&self) -> &str { 13 + "mkdir" 14 + } 15 + 16 + fn signature(&self) -> Signature { 17 + Signature::build("mkdir") 18 + .required( 19 + "path", 20 + SyntaxShape::String, 21 + "path of the directory(s) to create", 22 + ) 23 + .category(Category::FileSystem) 24 + } 25 + 26 + fn description(&self) -> &str { 27 + "create a directory in the virtual filesystem." 28 + } 29 + 30 + fn run( 31 + &self, 32 + engine_state: &EngineState, 33 + stack: &mut Stack, 34 + call: &nu_protocol::engine::Call, 35 + _: PipelineData, 36 + ) -> Result<PipelineData, ShellError> { 37 + let path: String = call.req(engine_state, stack, 0)?; 38 + let new_dir = get_pwd() 39 + .join(path.trim_end_matches('/')) 40 + .map_err(to_shell_err(call.head))?; 41 + new_dir 42 + .create_dir_all() 43 + .map_err(to_shell_err(call.head)) 44 + .map(|_| PipelineData::Empty) 45 + } 46 + }
+31
src/cmd/mod.rs
··· 1 + pub mod cd; 2 + pub mod fetch; 3 + pub mod job; 4 + pub mod job_kill; 5 + pub mod job_list; 6 + pub mod ls; 7 + pub mod mkdir; 8 + pub mod open; 9 + pub mod pwd; 10 + pub mod random; 11 + pub mod rm; 12 + pub mod save; 13 + pub mod source; 14 + pub mod sys; 15 + pub mod version; 16 + 17 + pub use cd::Cd; 18 + pub use fetch::Fetch; 19 + pub use job::Job; 20 + pub use job_kill::JobKill; 21 + pub use job_list::JobList; 22 + pub use ls::Ls; 23 + pub use mkdir::Mkdir; 24 + pub use open::Open; 25 + pub use pwd::Pwd; 26 + pub use random::Random; 27 + pub use rm::Rm; 28 + pub use save::Save; 29 + pub use source::Source; 30 + pub use sys::Sys; 31 + pub use version::Version;
+88
src/cmd/open.rs
··· 1 + use std::ops::Not; 2 + 3 + use crate::globals::{get_pwd, to_shell_err}; 4 + use nu_command::{FromCsv, FromJson, FromOds, FromToml, FromTsv, FromXlsx, FromXml, FromYaml}; 5 + use nu_engine::CallExt; 6 + use nu_protocol::{ 7 + ByteStream, Category, PipelineData, ShellError, Signature, SyntaxShape, 8 + engine::{Command, EngineState, Stack}, 9 + }; 10 + 11 + #[derive(Clone)] 12 + pub struct Open; 13 + 14 + impl Command for Open { 15 + fn name(&self) -> &str { 16 + "open" 17 + } 18 + 19 + fn signature(&self) -> Signature { 20 + Signature::build("open") 21 + .required("path", SyntaxShape::String, "path to the file") 22 + .switch( 23 + "raw", 24 + "output content as raw string/binary without parsing", 25 + Some('r'), 26 + ) 27 + .category(Category::FileSystem) 28 + } 29 + 30 + fn description(&self) -> &str { 31 + "open a file from the virtual filesystem." 32 + } 33 + 34 + fn run( 35 + &self, 36 + engine_state: &EngineState, 37 + stack: &mut Stack, 38 + call: &nu_protocol::engine::Call, 39 + _input: PipelineData, 40 + ) -> Result<PipelineData, ShellError> { 41 + let path: String = call.req(engine_state, stack, 0)?; 42 + let raw_flag = call.has_flag(engine_state, stack, "raw")?; 43 + 44 + let target_file = get_pwd().join(&path).map_err(to_shell_err(call.head))?; 45 + 46 + let parse_cmd = raw_flag 47 + .not() 48 + .then(|| { 49 + target_file 50 + .extension() 51 + .and_then(|ext| get_cmd_for_ext(&ext)) 52 + }) 53 + .flatten(); 54 + 55 + target_file 56 + .open_file() 57 + .map_err(to_shell_err(call.head)) 58 + .and_then(|f| { 59 + let data = PipelineData::ByteStream( 60 + ByteStream::read( 61 + f, 62 + call.head, 63 + engine_state.signals().clone(), 64 + nu_protocol::ByteStreamType::String, 65 + ), 66 + None, 67 + ); 68 + if let Some(cmd) = parse_cmd { 69 + return cmd.run(engine_state, stack, call, data); 70 + } 71 + Ok(data) 72 + }) 73 + } 74 + } 75 + 76 + fn get_cmd_for_ext(ext: &str) -> Option<Box<dyn Command>> { 77 + Some(match ext { 78 + "json" => Box::new(FromJson), 79 + "yaml" | "yml" => Box::new(FromYaml), 80 + "toml" => Box::new(FromToml), 81 + "csv" => Box::new(FromCsv), 82 + "ods" => Box::new(FromOds), 83 + "tsv" => Box::new(FromTsv), 84 + "xml" => Box::new(FromXml), 85 + "xlsx" => Box::new(FromXlsx), 86 + _ => return None, 87 + }) 88 + }
+37
src/cmd/pwd.rs
··· 1 + use crate::globals::get_pwd; 2 + use nu_protocol::engine::Call; 3 + use nu_protocol::{ 4 + Category, IntoPipelineData, PipelineData, ShellError, Signature, Value, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + 8 + #[derive(Clone)] 9 + pub struct Pwd; 10 + 11 + impl Command for Pwd { 12 + fn name(&self) -> &str { 13 + "pwd" 14 + } 15 + 16 + fn signature(&self) -> Signature { 17 + Signature::build("pwd").category(Category::FileSystem) 18 + } 19 + 20 + fn description(&self) -> &str { 21 + "print the current working directory in the virtual filesystem." 22 + } 23 + 24 + fn run( 25 + &self, 26 + _engine_state: &EngineState, 27 + _stack: &mut Stack, 28 + call: &Call, 29 + _input: PipelineData, 30 + ) -> Result<PipelineData, ShellError> { 31 + let mut pwd = get_pwd().as_str().to_string(); 32 + if pwd.is_empty() { 33 + pwd.push('/'); 34 + } 35 + Ok(Value::string(pwd, call.head).into_pipeline_data()) 36 + } 37 + }
+37
src/cmd/random.rs
··· 1 + use js_sys::Math; 2 + use nu_protocol::Type; 3 + use nu_protocol::engine::Call; 4 + use nu_protocol::{ 5 + Category, IntoPipelineData, PipelineData, ShellError, Signature, Value, 6 + engine::{Command, EngineState, Stack}, 7 + }; 8 + 9 + #[derive(Clone)] 10 + pub struct Random; 11 + 12 + impl Command for Random { 13 + fn name(&self) -> &str { 14 + "random" 15 + } 16 + 17 + fn signature(&self) -> Signature { 18 + Signature::build("random") 19 + .category(Category::Math) 20 + .input_output_type(Type::Nothing, Type::Float) 21 + } 22 + 23 + fn description(&self) -> &str { 24 + "returns a random float between 0 and 1." 25 + } 26 + 27 + fn run( 28 + &self, 29 + _engine_state: &EngineState, 30 + _stack: &mut Stack, 31 + call: &Call, 32 + _input: PipelineData, 33 + ) -> Result<PipelineData, ShellError> { 34 + let v: f64 = Math::random(); 35 + Ok(Value::float(v, call.head).into_pipeline_data()) 36 + } 37 + }
+80
src/cmd/rm.rs
··· 1 + use crate::globals::{get_pwd, to_shell_err}; 2 + use nu_engine::CallExt; 3 + use nu_protocol::{ 4 + Category, PipelineData, ShellError, Signature, SyntaxShape, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + use vfs::VfsFileType; 8 + 9 + #[derive(Clone)] 10 + pub struct Rm; 11 + 12 + impl Command for Rm { 13 + fn name(&self) -> &str { 14 + "rm" 15 + } 16 + 17 + fn signature(&self) -> Signature { 18 + Signature::build("rm") 19 + .required( 20 + "path", 21 + SyntaxShape::String, 22 + "path to file or directory to remove", 23 + ) 24 + .switch( 25 + "recursive", 26 + "remove directories and their contents recursively", 27 + Some('r'), 28 + ) 29 + .category(Category::FileSystem) 30 + } 31 + 32 + fn description(&self) -> &str { 33 + "remove a file or directory from the virtual filesystem." 34 + } 35 + 36 + fn run( 37 + &self, 38 + engine_state: &EngineState, 39 + stack: &mut Stack, 40 + call: &nu_protocol::engine::Call, 41 + _input: PipelineData, 42 + ) -> Result<PipelineData, ShellError> { 43 + let path: String = call.req(engine_state, stack, 0)?; 44 + let recursive = call.has_flag(engine_state, stack, "recursive")?; 45 + 46 + // Prevent removing root 47 + if path == "/" { 48 + return Err(ShellError::GenericError { 49 + error: "cannot remove root".to_string(), 50 + msg: "refusing to remove root directory".to_string(), 51 + span: Some(call.head), 52 + help: None, 53 + inner: vec![], 54 + }); 55 + } 56 + 57 + // Resolve target relative to PWD (or absolute if path starts with '/') 58 + let target = get_pwd() 59 + .join(path.trim_end_matches('/')) 60 + .map_err(to_shell_err(call.head))?; 61 + 62 + let meta = target.metadata().map_err(to_shell_err(call.head))?; 63 + match meta.file_type { 64 + VfsFileType::File => { 65 + target.remove_file().map_err(to_shell_err(call.head))?; 66 + Ok(PipelineData::Empty) 67 + } 68 + VfsFileType::Directory => { 69 + (if recursive { 70 + target.remove_dir_all() 71 + } else { 72 + // non-recursive: attempt to remove directory (will fail if not empty) 73 + target.remove_dir() 74 + }) 75 + .map_err(to_shell_err(call.head)) 76 + .map(|_| PipelineData::Empty) 77 + } 78 + } 79 + } 80 + }
+67
src/cmd/save.rs
··· 1 + use crate::globals::{get_pwd, to_shell_err}; 2 + use nu_engine::CallExt; 3 + use nu_protocol::{ 4 + Category, PipelineData, ShellError, Signature, SyntaxShape, Type, Value, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + use vfs::VfsError; 8 + 9 + #[derive(Clone)] 10 + pub struct Save; 11 + 12 + impl Command for Save { 13 + fn name(&self) -> &str { 14 + "save" 15 + } 16 + 17 + fn signature(&self) -> Signature { 18 + Signature::build("save") 19 + .required("path", SyntaxShape::String, "path to write the data to") 20 + .input_output_types(vec![(Type::Any, Type::Nothing)]) 21 + .category(Category::FileSystem) 22 + } 23 + 24 + fn description(&self) -> &str { 25 + "save content to a file in the virtual filesystem." 26 + } 27 + 28 + fn run( 29 + &self, 30 + engine_state: &EngineState, 31 + stack: &mut Stack, 32 + call: &nu_protocol::engine::Call, 33 + input: PipelineData, 34 + ) -> Result<PipelineData, ShellError> { 35 + let path: String = call.req(engine_state, stack, 0)?; 36 + 37 + let value = input.into_value(call.head)?; 38 + let contents = match value { 39 + Value::String { val, .. } => val.into_bytes(), 40 + Value::Binary { val, .. } => val, 41 + Value::Bool { val, .. } => val.to_string().into_bytes(), 42 + Value::Float { val, .. } => val.to_string().into_bytes(), 43 + Value::Int { val, .. } => val.to_string().into_bytes(), 44 + Value::Date { val, .. } => val.to_string().into_bytes(), 45 + _ => { 46 + return Err(ShellError::CantConvert { 47 + to_type: "string".to_string(), 48 + from_type: value.get_type().to_string(), 49 + span: value.span(), 50 + help: None, 51 + }); 52 + } 53 + }; 54 + 55 + let target_file = get_pwd().join(&path).map_err(to_shell_err(call.head))?; 56 + 57 + target_file 58 + .create_file() 59 + .map_err(to_shell_err(call.head)) 60 + .and_then(|mut f| { 61 + f.write_all(&contents) 62 + .map_err(VfsError::from) 63 + .map_err(to_shell_err(call.head)) 64 + }) 65 + .map(|_| PipelineData::Empty) 66 + } 67 + }
+89
src/cmd/source.rs
··· 1 + use crate::globals::{get_pwd, queue_delta, to_shell_err}; 2 + use nu_engine::{CallExt, command_prelude::IoError, eval_block}; 3 + use nu_parser::parse; 4 + use nu_protocol::{ 5 + Category, PipelineData, ShellError, Signature, SyntaxShape, 6 + debugger::WithoutDebug, 7 + engine::{Command, EngineState, Stack, StateWorkingSet}, 8 + }; 9 + use std::{io::Read, path::PathBuf, str::FromStr}; 10 + 11 + #[derive(Clone)] 12 + pub struct Source; 13 + 14 + impl Command for Source { 15 + fn name(&self) -> &str { 16 + "source" 17 + } 18 + 19 + fn signature(&self) -> Signature { 20 + Signature::build(self.name()) 21 + .required("filename", SyntaxShape::String, "the file to source") 22 + .category(Category::Core) 23 + } 24 + 25 + fn description(&self) -> &str { 26 + "source a file from the virtual filesystem." 27 + } 28 + 29 + fn run( 30 + &self, 31 + engine_state: &EngineState, 32 + stack: &mut Stack, 33 + call: &nu_protocol::engine::Call, 34 + input: PipelineData, 35 + ) -> Result<PipelineData, ShellError> { 36 + let filename: String = call.req(engine_state, stack, 0)?; 37 + 38 + // 1. Read file from VFS 39 + let path = get_pwd().join(&filename).map_err(to_shell_err(call.head))?; 40 + let mut file = path.open_file().map_err(to_shell_err(call.head))?; 41 + let mut contents = String::new(); 42 + file.read_to_string(&mut contents).map_err(|e| { 43 + ShellError::Io(IoError::new( 44 + e, 45 + call.head, 46 + PathBuf::from_str(path.as_str()).unwrap(), 47 + )) 48 + })?; 49 + 50 + // 2. Parse the content 51 + // We create a new working set based on the CURRENT engine state. 52 + let mut working_set = StateWorkingSet::new(engine_state); 53 + 54 + // We must add the file to the working set so the parser can track spans correctly 55 + let _file_id = working_set.add_file(filename.clone(), contents.as_bytes()); 56 + 57 + // Parse the block 58 + let block = parse( 59 + &mut working_set, 60 + Some(&filename), 61 + contents.as_bytes(), 62 + false, 63 + ); 64 + 65 + if let Some(err) = working_set.parse_errors.first() { 66 + return Err(ShellError::GenericError { 67 + error: "Parse error".into(), 68 + msg: err.to_string(), 69 + span: Some(call.head), 70 + help: None, 71 + inner: vec![], 72 + }); 73 + } 74 + 75 + // 3. Prepare execution context 76 + // We clone the engine state to merge the new definitions (delta) locally. 77 + // This ensures the script can call its own defined functions immediately. 78 + let mut local_state = engine_state.clone(); 79 + local_state.merge_delta(working_set.delta.clone())?; 80 + 81 + // 4. Queue the delta for the global engine state 82 + // This allows definitions to be available in the next command execution cycle (REPL behavior). 83 + queue_delta(working_set.delta); 84 + 85 + // 5. Evaluate the block 86 + // We pass the MUTABLE stack, so environment variable changes (PWD, load-env) WILL persist. 87 + eval_block::<WithoutDebug>(&local_state, stack, &block, input).map(|data| data.body) 88 + } 89 + }
+182
src/cmd/sys.rs
··· 1 + use js_sys::Reflect; 2 + use js_sys::global; 3 + use nu_protocol::{ 4 + Category, IntoPipelineData, PipelineData, Record, ShellError, Signature, Value, 5 + engine::{Command, EngineState, Stack}, 6 + }; 7 + use wasm_bindgen::JsValue; 8 + 9 + #[derive(Clone)] 10 + pub struct Sys; 11 + 12 + impl Command for Sys { 13 + fn name(&self) -> &str { 14 + "sys" 15 + } 16 + 17 + fn signature(&self) -> Signature { 18 + Signature::build("sys").category(Category::System) 19 + } 20 + 21 + fn description(&self) -> &str { 22 + "return information about the browser environment (when running in wasm)" 23 + } 24 + 25 + fn run( 26 + &self, 27 + _engine_state: &EngineState, 28 + _stack: &mut Stack, 29 + call: &nu_protocol::engine::Call, 30 + _input: PipelineData, 31 + ) -> Result<PipelineData, ShellError> { 32 + let head = call.head; 33 + let mut rec = Record::new(); 34 + 35 + let g = global(); 36 + 37 + // navigator-derived fields 38 + if let Ok(nav) = Reflect::get(&g, &JsValue::from_str("navigator")) { 39 + if !nav.is_undefined() && !nav.is_null() { 40 + let ua = Reflect::get(&nav, &JsValue::from_str("userAgent")) 41 + .ok() 42 + .and_then(|v| v.as_string()) 43 + .unwrap_or_default(); 44 + rec.push("user_agent", Value::string(ua, head)); 45 + 46 + let platform = Reflect::get(&nav, &JsValue::from_str("platform")) 47 + .ok() 48 + .and_then(|v| v.as_string()) 49 + .unwrap_or_default(); 50 + rec.push("platform", Value::string(platform, head)); 51 + 52 + let vendor = Reflect::get(&nav, &JsValue::from_str("vendor")) 53 + .ok() 54 + .and_then(|v| v.as_string()) 55 + .unwrap_or_default(); 56 + rec.push("vendor", Value::string(vendor, head)); 57 + 58 + let product = Reflect::get(&nav, &JsValue::from_str("product")) 59 + .ok() 60 + .and_then(|v| v.as_string()) 61 + .unwrap_or_default(); 62 + rec.push("product", Value::string(product, head)); 63 + 64 + let app_name = Reflect::get(&nav, &JsValue::from_str("appName")) 65 + .ok() 66 + .and_then(|v| v.as_string()) 67 + .unwrap_or_default(); 68 + rec.push("app_name", Value::string(app_name, head)); 69 + 70 + let language = Reflect::get(&nav, &JsValue::from_str("language")) 71 + .ok() 72 + .and_then(|v| v.as_string()) 73 + .unwrap_or_default(); 74 + rec.push("language", Value::string(language, head)); 75 + 76 + // booleans now use Value::bool 77 + let online = Reflect::get(&nav, &JsValue::from_str("onLine")) 78 + .ok() 79 + .and_then(|v| v.as_bool()) 80 + .unwrap_or(false); 81 + rec.push("online", Value::bool(online, head)); 82 + 83 + let cookie_enabled = Reflect::get(&nav, &JsValue::from_str("cookieEnabled")) 84 + .ok() 85 + .and_then(|v| v.as_bool()) 86 + .unwrap_or(false); 87 + rec.push("cookie_enabled", Value::bool(cookie_enabled, head)); 88 + 89 + // numeric-ish fields 90 + let hardware_concurrency = 91 + Reflect::get(&nav, &JsValue::from_str("hardwareConcurrency")) 92 + .ok() 93 + .and_then(|v| v.as_f64()) 94 + .map(|f| f as i64); 95 + if let Some(hc) = hardware_concurrency { 96 + rec.push("hardware_concurrency", Value::int(hc, head)); 97 + } 98 + 99 + let device_memory = Reflect::get(&nav, &JsValue::from_str("deviceMemory")) 100 + .ok() 101 + .and_then(|v| v.as_f64()) 102 + .map(|f| f as i64); 103 + if let Some(dm) = device_memory { 104 + rec.push("device_memory_gb", Value::int(dm, head)); 105 + } 106 + 107 + let max_touch_points = Reflect::get(&nav, &JsValue::from_str("maxTouchPoints")) 108 + .ok() 109 + .and_then(|v| v.as_f64()) 110 + .map(|f| f as i64); 111 + if let Some(tp) = max_touch_points { 112 + rec.push("max_touch_points", Value::int(tp, head)); 113 + } 114 + 115 + let dnt = Reflect::get(&nav, &JsValue::from_str("doNotTrack")) 116 + .ok() 117 + .and_then(|v| v.as_string()) 118 + .unwrap_or_default(); 119 + if !dnt.is_empty() { 120 + rec.push("do_not_track", Value::string(dnt, head)); 121 + } 122 + } 123 + } 124 + 125 + // screen dimensions (if available) 126 + if let Ok(screen) = Reflect::get(&g, &JsValue::from_str("screen")) { 127 + if !screen.is_undefined() && !screen.is_null() { 128 + let width = Reflect::get(&screen, &JsValue::from_str("width")) 129 + .ok() 130 + .and_then(|v| v.as_f64()) 131 + .map(|f| f as i64); 132 + let height = Reflect::get(&screen, &JsValue::from_str("height")) 133 + .ok() 134 + .and_then(|v| v.as_f64()) 135 + .map(|f| f as i64); 136 + if let Some(w) = width { 137 + rec.push("screen_width", Value::int(w, head)); 138 + } 139 + if let Some(h) = height { 140 + rec.push("screen_height", Value::int(h, head)); 141 + } 142 + } 143 + } 144 + 145 + // performance.memory (optional) 146 + if let Ok(perf) = Reflect::get(&g, &JsValue::from_str("performance")) { 147 + if !perf.is_undefined() && !perf.is_null() { 148 + if let Ok(mem) = Reflect::get(&perf, &JsValue::from_str("memory")) { 149 + if !mem.is_undefined() && !mem.is_null() { 150 + let used = Reflect::get(&mem, &JsValue::from_str("usedJSHeapSize")) 151 + .ok() 152 + .and_then(|v| v.as_f64()) 153 + .map(|f| f as i64); 154 + let limit = Reflect::get(&mem, &JsValue::from_str("jsHeapSizeLimit")) 155 + .ok() 156 + .and_then(|v| v.as_f64()) 157 + .map(|f| f as i64); 158 + let mut mrec = Record::new(); 159 + if let Some(u) = used { 160 + mrec.push("used_js_heap_size", Value::filesize(u, head)); 161 + } 162 + if let Some(l) = limit { 163 + mrec.push("js_heap_size_limit", Value::filesize(l, head)); 164 + } 165 + if !mrec.is_empty() { 166 + rec.push("performance_memory", Value::record(mrec, head)); 167 + } 168 + } 169 + } 170 + } 171 + } 172 + 173 + if rec.is_empty() { 174 + rec.push( 175 + "error", 176 + Value::string("not running in a browser environment", head), 177 + ); 178 + } 179 + 180 + Ok(Value::record(rec, head).into_pipeline_data()) 181 + } 182 + }
+32
src/cmd/version.rs
··· 1 + use nu_protocol::engine::Call; 2 + use nu_protocol::{ 3 + Category, IntoPipelineData, PipelineData, ShellError, Signature, Value, 4 + engine::{Command, EngineState, Stack}, 5 + }; 6 + 7 + #[derive(Clone)] 8 + pub struct Version; 9 + 10 + impl Command for Version { 11 + fn name(&self) -> &str { 12 + "version" 13 + } 14 + 15 + fn signature(&self) -> Signature { 16 + Signature::build(self.name()).category(Category::System) 17 + } 18 + 19 + fn description(&self) -> &str { 20 + "print the version of dysnomia." 21 + } 22 + 23 + fn run( 24 + &self, 25 + _engine_state: &EngineState, 26 + _stack: &mut Stack, 27 + call: &Call, 28 + _input: PipelineData, 29 + ) -> Result<PipelineData, ShellError> { 30 + Ok(Value::string("dysnomia.v099.t1765660500", call.head).into_pipeline_data()) 31 + } 32 + }
+213
src/completion.rs
··· 1 + use super::*; 2 + 3 + #[derive(Debug, Serialize)] 4 + struct Suggestion { 5 + name: String, 6 + description: Option<String>, 7 + is_command: bool, 8 + rendered: String, 9 + span_start: usize, // char index (not byte) 10 + span_end: usize, // char index (not byte) 11 + } 12 + 13 + impl PartialEq for Suggestion { 14 + fn eq(&self, other: &Self) -> bool { 15 + self.name == other.name 16 + } 17 + } 18 + impl Eq for Suggestion {} 19 + impl PartialOrd for Suggestion { 20 + fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { 21 + self.name.partial_cmp(&other.name) 22 + } 23 + } 24 + impl Ord for Suggestion { 25 + fn cmp(&self, other: &Self) -> std::cmp::Ordering { 26 + self.name.cmp(&other.name) 27 + } 28 + } 29 + 30 + #[wasm_bindgen] 31 + pub fn completion(input: &str, js_cursor_pos: usize) -> String { 32 + let engine_guard = ENGINE_STATE 33 + .get() 34 + .unwrap() 35 + .lock() 36 + .expect("engine state initialized"); 37 + let root = get_pwd(); 38 + 39 + // Map UTF-16 cursor position (from JS) to Byte index (for Rust) 40 + let byte_pos = input 41 + .char_indices() 42 + .map(|(i, _)| i) 43 + .nth(js_cursor_pos) 44 + .unwrap_or(input.len()); 45 + 46 + // 1. Parse & Flatten 47 + let mut working_set = StateWorkingSet::new(&engine_guard); 48 + // CRITICAL: Capture the start offset so we can normalize spans later 49 + let global_offset = working_set.next_span_start(); 50 + let block = parse(&mut working_set, None, input.as_bytes(), false); 51 + let shapes = flatten_block(&working_set, &block); 52 + 53 + // 2. Identify context 54 + let mut is_command_pos = false; 55 + let mut current_span = Span::new(byte_pos, byte_pos); 56 + let mut prefix = "".to_string(); 57 + let mut found_shape = false; 58 + 59 + // Check if cursor is inside or touching a shape 60 + for (span, shape) in &shapes { 61 + // Convert global span to local indices 62 + let local_start = span.start.saturating_sub(global_offset); 63 + let local_end = span.end.saturating_sub(global_offset); 64 + let local_span = Span::new(local_start, local_end); 65 + 66 + if local_span.contains(byte_pos) || local_span.end == byte_pos { 67 + current_span = local_span; 68 + found_shape = true; 69 + let safe_end = std::cmp::min(local_span.end, byte_pos); 70 + if local_span.start < input.len() { 71 + prefix = input[local_span.start..safe_end].to_string(); 72 + } 73 + 74 + match shape { 75 + FlatShape::External(_) | FlatShape::InternalCall(_) | FlatShape::Keyword => { 76 + is_command_pos = true; 77 + } 78 + FlatShape::Garbage => { 79 + // Check if it looks like a flag 80 + if prefix.starts_with('-') { 81 + is_command_pos = false; 82 + } else { 83 + // Assume command if it's garbage but not a flag (e.g. typing a new command) 84 + is_command_pos = true; 85 + } 86 + } 87 + _ => { 88 + is_command_pos = false; 89 + } 90 + } 91 + break; 92 + } 93 + } 94 + 95 + // Fallback to Lexer if in whitespace 96 + if !found_shape { 97 + let (tokens, _err) = lex(input.as_bytes(), 0, &[], &[], true); 98 + let last_token = tokens.iter().filter(|t| t.span.end <= byte_pos).last(); 99 + 100 + if let Some(token) = last_token { 101 + match token.contents { 102 + TokenContents::Pipe 103 + | TokenContents::PipePipe 104 + | TokenContents::Semicolon 105 + | TokenContents::Eol => { 106 + is_command_pos = true; 107 + } 108 + _ => { 109 + let text = &input[token.span.start..token.span.end]; 110 + if text == "{" || text == "(" || text == ";" || text == "&&" || text == "||" { 111 + is_command_pos = true; 112 + } else { 113 + is_command_pos = false; 114 + } 115 + } 116 + } 117 + } else { 118 + is_command_pos = true; // Start of input 119 + } 120 + } 121 + 122 + let mut suggestions: Vec<Suggestion> = Vec::new(); 123 + 124 + // Convert byte-spans back to char-spans for JS 125 + let to_char_span = |start: usize, end: usize| -> (usize, usize) { 126 + let char_start = input[..start].chars().count(); 127 + let char_end = input[..end].chars().count(); 128 + (char_start, char_end) 129 + }; 130 + 131 + let (span_start, span_end) = to_char_span(current_span.start, current_span.end); 132 + 133 + let mut add_cmd_suggestion = |name: Vec<u8>, desc: Option<String>| { 134 + let name = String::from_utf8_lossy(&name).to_string(); 135 + suggestions.push(Suggestion { 136 + rendered: { 137 + let name = ansi_term::Color::Green.bold().paint(&name); 138 + let desc = desc.as_deref().unwrap_or("<no description>"); 139 + format!("{name} {desc}") 140 + }, 141 + name: name.clone(), // Replacement text is just the name 142 + description: desc, 143 + is_command: true, 144 + span_start, 145 + span_end, 146 + }); 147 + }; 148 + 149 + let working_set = StateWorkingSet::new(&engine_guard); 150 + 151 + if is_command_pos { 152 + for (_, name, desc, _) in working_set 153 + .find_commands_by_predicate(|value| value.starts_with(prefix.as_bytes()), true) 154 + { 155 + add_cmd_suggestion(name, desc); 156 + } 157 + } else { 158 + // File completion 159 + // Split prefix into directory and file part 160 + let (dir, file_prefix) = if let Some(idx) = prefix.rfind('/') { 161 + (&prefix[..idx + 1], &prefix[idx + 1..]) 162 + } else { 163 + ("", prefix.as_str()) 164 + }; 165 + 166 + // Fix: Clean up the directory path before joining. 167 + // VFS often fails if 'join' is called with a trailing slash (e.g. "a/") because it interprets it as "a" + "" 168 + let dir_to_join = if dir.len() > 1 && dir.ends_with('/') { 169 + &dir[..dir.len() - 1] 170 + } else { 171 + dir 172 + }; 173 + 174 + let target_dir = if !dir.is_empty() { 175 + match root.join(dir_to_join) { 176 + Ok(d) => { 177 + if let Ok(true) = d.is_dir() { 178 + Some(d) 179 + } else { 180 + None 181 + } 182 + } 183 + Err(_) => None, 184 + } 185 + } else { 186 + // If prefix is empty, list current directory 187 + Some(root.join("").unwrap()) 188 + }; 189 + 190 + if let Some(d) = target_dir { 191 + if let Ok(iterator) = d.read_dir() { 192 + for entry in iterator { 193 + let name = entry.filename(); 194 + if name.starts_with(file_prefix) { 195 + let full_completion = format!("{}{}", dir, name); 196 + suggestions.push(Suggestion { 197 + name: full_completion.clone(), 198 + description: None, 199 + is_command: false, 200 + rendered: full_completion, 201 + span_start, 202 + span_end, 203 + }) 204 + } 205 + } 206 + } 207 + } 208 + } 209 + 210 + suggestions.sort(); 211 + 212 + serde_json::to_string(&suggestions).unwrap_or_else(|_| "[]".to_string()) 213 + }
+370
src/default_context.rs
··· 1 + use nu_command::*; 2 + use nu_protocol::engine::{EngineState, StateWorkingSet}; 3 + 4 + pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState { 5 + let delta = { 6 + let mut working_set = StateWorkingSet::new(&engine_state); 7 + 8 + macro_rules! bind_command { 9 + ( $( $command:expr ),* $(,)? ) => { 10 + $( working_set.add_decl(Box::new($command)); )* 11 + }; 12 + } 13 + 14 + // If there are commands that have the same name as default declarations, 15 + // they have to be registered before the main declarations. This helps to make 16 + // them only accessible if the correct input value category is used with the 17 + // declaration 18 + 19 + // Database-related 20 + // Adds all related commands to query databases 21 + // add_database_decls(&mut working_set); 22 + 23 + // Charts 24 + bind_command! { 25 + Histogram 26 + } 27 + 28 + // Filters 29 + bind_command! { 30 + All, 31 + Any, 32 + Append, 33 + Chunks, 34 + Columns, 35 + Compact, 36 + Default, 37 + Drop, 38 + DropColumn, 39 + DropNth, 40 + Each, 41 + Enumerate, 42 + Every, 43 + Filter, 44 + Find, 45 + First, 46 + Flatten, 47 + Get, 48 + GroupBy, 49 + Headers, 50 + Insert, 51 + IsEmpty, 52 + IsNotEmpty, 53 + Interleave, 54 + Items, 55 + Join, 56 + Take, 57 + Merge, 58 + MergeDeep, 59 + Move, 60 + TakeWhile, 61 + TakeUntil, 62 + Last, 63 + Length, 64 + Lines, 65 + ParEach, 66 + ChunkBy, 67 + Prepend, 68 + Reduce, 69 + Reject, 70 + Rename, 71 + Reverse, 72 + Select, 73 + Skip, 74 + SkipUntil, 75 + SkipWhile, 76 + Slice, 77 + Sort, 78 + SortBy, 79 + SplitList, 80 + Tee, 81 + Transpose, 82 + Uniq, 83 + UniqBy, 84 + Upsert, 85 + Update, 86 + Values, 87 + Where, 88 + Window, 89 + Wrap, 90 + Zip, 91 + }; 92 + 93 + // Misc 94 + bind_command! { 95 + Panic, 96 + }; 97 + 98 + // Path 99 + bind_command! { 100 + Path, 101 + PathBasename, 102 + PathSelf, 103 + PathDirname, 104 + PathExists, 105 + PathExpand, 106 + PathJoin, 107 + PathParse, 108 + PathRelativeTo, 109 + PathSplit, 110 + PathType, 111 + }; 112 + 113 + // Help 114 + bind_command! { 115 + Help, 116 + HelpAliases, 117 + HelpExterns, 118 + HelpCommands, 119 + HelpModules, 120 + HelpOperators, 121 + HelpPipeAndRedirect, 122 + HelpEscapes, 123 + }; 124 + 125 + // Debug 126 + bind_command! { 127 + Ast, 128 + Debug, 129 + DebugEnv, 130 + DebugExperimentalOptions, 131 + DebugInfo, 132 + DebugProfile, 133 + Explain, 134 + Inspect, 135 + Metadata, 136 + MetadataAccess, 137 + MetadataSet, 138 + TimeIt, 139 + View, 140 + ViewBlocks, 141 + ViewFiles, 142 + ViewIr, 143 + ViewSource, 144 + ViewSpan, 145 + }; 146 + 147 + // Strings 148 + bind_command! { 149 + Ansi, 150 + AnsiLink, 151 + AnsiStrip, 152 + Char, 153 + Decode, 154 + Encode, 155 + DecodeHex, 156 + EncodeHex, 157 + DecodeBase32, 158 + EncodeBase32, 159 + DecodeBase32Hex, 160 + EncodeBase32Hex, 161 + DecodeBase64, 162 + EncodeBase64, 163 + Detect, 164 + DetectColumns, 165 + DetectType, 166 + Parse, 167 + Split, 168 + SplitChars, 169 + SplitColumn, 170 + SplitRow, 171 + SplitWords, 172 + Str, 173 + StrCapitalize, 174 + StrContains, 175 + StrDistance, 176 + StrDowncase, 177 + StrEndswith, 178 + StrExpand, 179 + StrJoin, 180 + StrReplace, 181 + StrIndexOf, 182 + StrLength, 183 + StrReverse, 184 + StrStats, 185 + StrStartsWith, 186 + StrSubstring, 187 + StrTrim, 188 + StrUpcase, 189 + Format, 190 + FormatDate, 191 + FormatDuration, 192 + FormatFilesize, 193 + }; 194 + 195 + // Date 196 + bind_command! { 197 + Date, 198 + DateFromHuman, 199 + DateHumanize, 200 + DateListTimezones, 201 + DateNow, 202 + DateToTimezone, 203 + }; 204 + 205 + // Formats 206 + bind_command! { 207 + From, 208 + FromCsv, 209 + FromJson, 210 + FromMsgpack, 211 + FromMsgpackz, 212 + FromNuon, 213 + FromOds, 214 + FromSsv, 215 + FromToml, 216 + FromTsv, 217 + FromXlsx, 218 + FromXml, 219 + FromYaml, 220 + FromYml, 221 + To, 222 + ToCsv, 223 + ToJson, 224 + ToMd, 225 + ToMsgpack, 226 + ToMsgpackz, 227 + ToNuon, 228 + ToText, 229 + ToToml, 230 + ToTsv, 231 + Upsert, 232 + Where, 233 + ToXml, 234 + ToYaml, 235 + ToYml, 236 + }; 237 + 238 + // Viewers 239 + bind_command! { 240 + Griddle, 241 + Table, 242 + }; 243 + 244 + // Conversions 245 + bind_command! { 246 + Fill, 247 + Into, 248 + IntoBool, 249 + IntoBinary, 250 + IntoCellPath, 251 + IntoDatetime, 252 + IntoDuration, 253 + IntoFloat, 254 + IntoFilesize, 255 + IntoInt, 256 + IntoRecord, 257 + IntoString, 258 + IntoGlob, 259 + IntoValue, 260 + SplitCellPath, 261 + }; 262 + 263 + // Env 264 + bind_command! { 265 + ExportEnv, 266 + LoadEnv, 267 + SourceEnv, 268 + WithEnv, 269 + ConfigNu, 270 + ConfigEnv, 271 + ConfigFlatten, 272 + ConfigMeta, 273 + ConfigReset, 274 + ConfigUseColors, 275 + }; 276 + 277 + // Math 278 + bind_command! { 279 + Math, 280 + MathAbs, 281 + MathAvg, 282 + MathCeil, 283 + MathFloor, 284 + MathMax, 285 + MathMedian, 286 + MathMin, 287 + MathMode, 288 + MathProduct, 289 + MathRound, 290 + MathSqrt, 291 + MathStddev, 292 + MathSum, 293 + MathVariance, 294 + MathLog, 295 + }; 296 + 297 + // Bytes 298 + bind_command! { 299 + Bytes, 300 + BytesLen, 301 + BytesSplit, 302 + BytesStartsWith, 303 + BytesEndsWith, 304 + BytesReverse, 305 + BytesReplace, 306 + BytesAdd, 307 + BytesAt, 308 + BytesIndexOf, 309 + BytesCollect, 310 + BytesRemove, 311 + BytesBuild 312 + } 313 + 314 + bind_command! { 315 + Url, 316 + UrlBuildQuery, 317 + UrlSplitQuery, 318 + UrlDecode, 319 + UrlEncode, 320 + UrlJoin, 321 + UrlParse, 322 + } 323 + 324 + // Generators 325 + bind_command! { 326 + Cal, 327 + Seq, 328 + SeqDate, 329 + SeqChar, 330 + Generate, 331 + }; 332 + 333 + // Hash 334 + bind_command! { 335 + Hash, 336 + HashMd5::default(), 337 + HashSha256::default(), 338 + }; 339 + 340 + // Removed 341 + bind_command! { 342 + LetEnv, 343 + DateFormat, 344 + }; 345 + 346 + // bind_command! { 347 + // Stor, 348 + // StorCreate, 349 + // StorDelete, 350 + // StorExport, 351 + // StorImport, 352 + // StorInsert, 353 + // StorOpen, 354 + // StorReset, 355 + // StorUpdate, 356 + // }; 357 + 358 + working_set.render() 359 + }; 360 + 361 + if let Err(err) = engine_state.merge_delta(delta) { 362 + eprintln!("Error creating default context: {err:?}"); 363 + } 364 + 365 + // Cache the table decl id so we don't have to look it up later 366 + let table_decl_id = engine_state.find_decl("table".as_bytes(), &[]); 367 + engine_state.table_decl_id = table_decl_id; 368 + 369 + engine_state 370 + }
+78
src/error.rs
··· 1 + use miette::{GraphicalReportHandler, Report, SourceCode, SourceSpan, SpanContents}; 2 + 3 + pub struct CommandError { 4 + pub error: Report, 5 + pub start_offset: usize, 6 + } 7 + 8 + pub struct OffsetSource { 9 + pub source: String, 10 + pub start_offset: usize, 11 + } 12 + 13 + pub struct OffsetSpanContents<'a> { 14 + inner: Box<dyn SpanContents<'a> + 'a>, 15 + global_span: SourceSpan, 16 + } 17 + 18 + impl<'a> SpanContents<'a> for OffsetSpanContents<'a> { 19 + fn data(&self) -> &'a [u8] { 20 + self.inner.data() 21 + } 22 + fn span(&self) -> &SourceSpan { 23 + &self.global_span 24 + } 25 + fn line(&self) -> usize { 26 + self.inner.line() 27 + } 28 + fn column(&self) -> usize { 29 + self.inner.column() 30 + } 31 + fn line_count(&self) -> usize { 32 + self.inner.line_count() 33 + } 34 + } 35 + 36 + impl SourceCode for OffsetSource { 37 + fn read_span<'b>( 38 + &'b self, 39 + span: &SourceSpan, 40 + context_lines_before: usize, 41 + context_lines_after: usize, 42 + ) -> Result<Box<dyn miette::SpanContents<'b> + 'b>, miette::MietteError> { 43 + let local_start = span.offset().saturating_sub(self.start_offset); 44 + let local_len = std::cmp::min(span.len(), self.source.len().saturating_sub(local_start)); 45 + let local_span = SourceSpan::new(local_start.into(), local_len); 46 + 47 + let local_contents = 48 + self.source 49 + .read_span(&local_span, context_lines_before, context_lines_after)?; 50 + 51 + let content_local_span = local_contents.span(); 52 + let global_start = content_local_span.offset() + self.start_offset; 53 + let global_span = SourceSpan::new(global_start.into(), content_local_span.len()); 54 + 55 + Ok(Box::new(OffsetSpanContents { 56 + inner: local_contents, 57 + global_span, 58 + })) 59 + } 60 + } 61 + 62 + pub fn format_error(error: Report, input: String, start_offset: usize) -> String { 63 + let handler = GraphicalReportHandler::new() 64 + .with_theme(miette::GraphicalTheme::unicode()) 65 + .with_cause_chain(); 66 + 67 + let source = OffsetSource { 68 + source: input, 69 + start_offset, 70 + }; 71 + 72 + let report_with_source = error.with_source_code(source); 73 + let mut output = String::new(); 74 + handler 75 + .render_report(&mut output, report_with_source.as_ref()) 76 + .unwrap(); 77 + output 78 + }
+189
src/globals.rs
··· 1 + use futures::stream::AbortHandle; 2 + use nu_protocol::{ 3 + ShellError, Span, 4 + engine::{EngineState, StateDelta}, 5 + }; 6 + use std::{ 7 + collections::HashMap, 8 + sync::{ 9 + Arc, Mutex, OnceLock, RwLock, 10 + atomic::{AtomicUsize, Ordering}, 11 + }, 12 + time::{Duration, SystemTime, UNIX_EPOCH}, 13 + }; 14 + use vfs::{VfsError, VfsPath, error::VfsErrorKind}; 15 + use wasm_bindgen::prelude::*; 16 + 17 + use crate::memory_fs::MemoryFS; 18 + 19 + static ROOT: OnceLock<Arc<VfsPath>> = OnceLock::new(); 20 + 21 + pub fn get_vfs() -> Arc<VfsPath> { 22 + ROOT.get_or_init(|| Arc::new(VfsPath::new(MemoryFS::new()))) 23 + .clone() 24 + } 25 + 26 + static PWD: OnceLock<RwLock<Arc<VfsPath>>> = OnceLock::new(); 27 + 28 + pub fn get_pwd() -> Arc<VfsPath> { 29 + PWD.get_or_init(|| RwLock::new(get_vfs())) 30 + .read() 31 + .unwrap() 32 + .clone() 33 + } 34 + 35 + pub fn set_pwd(path: Arc<VfsPath>) { 36 + *PWD.get_or_init(|| RwLock::new(get_vfs())).write().unwrap() = path; 37 + } 38 + 39 + pub fn to_shell_err(span: Span) -> impl Fn(VfsError) -> ShellError { 40 + move |vfs_error: VfsError| ShellError::GenericError { 41 + error: (match vfs_error.kind() { 42 + VfsErrorKind::DirectoryExists 43 + | VfsErrorKind::FileExists 44 + | VfsErrorKind::FileNotFound 45 + | VfsErrorKind::InvalidPath => "path error", 46 + _ => "io error", 47 + }) 48 + .to_string(), 49 + msg: vfs_error.to_string(), 50 + span: Some(span), 51 + help: None, 52 + inner: vec![], 53 + } 54 + } 55 + 56 + pub struct TaskInfo { 57 + pub id: usize, 58 + pub description: String, 59 + pub handle: AbortHandle, 60 + } 61 + 62 + pub struct CallbackWrapper(js_sys::Function); 63 + unsafe impl Send for CallbackWrapper {} 64 + unsafe impl Sync for CallbackWrapper {} 65 + 66 + static NEXT_TASK_ID: AtomicUsize = AtomicUsize::new(1); 67 + static TASK_REGISTRY: OnceLock<Mutex<HashMap<usize, TaskInfo>>> = OnceLock::new(); 68 + static TASK_CALLBACK: OnceLock<Mutex<Option<CallbackWrapper>>> = OnceLock::new(); 69 + 70 + pub fn get_registry() -> &'static Mutex<HashMap<usize, TaskInfo>> { 71 + TASK_REGISTRY.get_or_init(|| Mutex::new(HashMap::new())) 72 + } 73 + 74 + #[wasm_bindgen] 75 + pub fn register_task_count_callback(f: js_sys::Function) { 76 + let _ = TASK_CALLBACK.get_or_init(|| Mutex::new(None)); 77 + if let Ok(mut guard) = TASK_CALLBACK.get().unwrap().lock() { 78 + *guard = Some(CallbackWrapper(f)); 79 + } 80 + } 81 + 82 + pub fn notify_task_count() { 83 + if let Some(mutex) = TASK_CALLBACK.get() { 84 + if let Ok(guard) = mutex.lock() { 85 + if let Some(cb) = guard.as_ref() { 86 + let count = if let Ok(reg) = get_registry().lock() { 87 + reg.len() 88 + } else { 89 + 0 90 + }; 91 + let this = JsValue::NULL; 92 + let arg = JsValue::from(count as u32); 93 + let _ = cb.0.call1(&this, &arg); 94 + } 95 + } 96 + } 97 + } 98 + 99 + pub fn register_task(description: String, handle: AbortHandle) -> usize { 100 + let id = NEXT_TASK_ID.fetch_add(1, Ordering::Relaxed); 101 + if let Ok(mut reg) = get_registry().lock() { 102 + reg.insert( 103 + id, 104 + TaskInfo { 105 + id, 106 + description, 107 + handle, 108 + }, 109 + ); 110 + } 111 + notify_task_count(); 112 + id 113 + } 114 + 115 + pub fn remove_task(id: usize) { 116 + if let Ok(mut reg) = get_registry().lock() { 117 + reg.remove(&id); 118 + } 119 + notify_task_count(); 120 + } 121 + 122 + pub fn get_all_tasks() -> Vec<(usize, String)> { 123 + if let Ok(reg) = get_registry().lock() { 124 + reg.values() 125 + .map(|t| (t.id, t.description.clone())) 126 + .collect() 127 + } else { 128 + vec![] 129 + } 130 + } 131 + 132 + pub fn kill_task_by_id(id: usize) -> bool { 133 + if let Ok(mut reg) = get_registry().lock() { 134 + if let Some(task) = reg.remove(&id) { 135 + task.handle.abort(); 136 + drop(reg); 137 + notify_task_count(); 138 + return true; 139 + } 140 + } 141 + false 142 + } 143 + 144 + static PENDING_DELTAS: OnceLock<Mutex<Vec<StateDelta>>> = OnceLock::new(); 145 + 146 + pub fn queue_delta(delta: StateDelta) { 147 + let _ = PENDING_DELTAS.get_or_init(|| Mutex::new(Vec::new())); 148 + if let Ok(mut guard) = PENDING_DELTAS.get().unwrap().lock() { 149 + guard.push(delta); 150 + } 151 + } 152 + 153 + pub fn apply_pending_deltas(engine_state: &mut EngineState) -> Result<(), ShellError> { 154 + if let Some(mutex) = PENDING_DELTAS.get() { 155 + if let Ok(mut guard) = mutex.lock() { 156 + for delta in guard.drain(..) { 157 + engine_state.merge_delta(delta)?; 158 + } 159 + } 160 + } 161 + Ok(()) 162 + } 163 + 164 + pub static CONSOLE_CALLBACK: OnceLock<Mutex<Option<CallbackWrapper>>> = OnceLock::new(); 165 + 166 + #[wasm_bindgen] 167 + pub fn register_console_callback(f: js_sys::Function) { 168 + let _ = CONSOLE_CALLBACK.get_or_init(|| Mutex::new(None)); 169 + if let Ok(mut guard) = CONSOLE_CALLBACK.get().unwrap().lock() { 170 + *guard = Some(CallbackWrapper(f)); 171 + } 172 + } 173 + 174 + pub fn print_to_console(msg: &str, is_cmd: bool) { 175 + if let Some(mutex) = CONSOLE_CALLBACK.get() { 176 + if let Ok(guard) = mutex.lock() { 177 + if let Some(cb) = guard.as_ref() { 178 + let this = JsValue::NULL; 179 + let arg = JsValue::from_str(msg); 180 + let arg2 = JsValue::from_bool(is_cmd); 181 + let _ = cb.0.call2(&this, &arg, &arg2); 182 + } 183 + } 184 + } 185 + } 186 + 187 + pub fn current_time() -> Option<SystemTime> { 188 + UNIX_EPOCH.checked_add(Duration::from_millis(js_sys::Date::now() as u64)) 189 + }
+72
src/highlight.rs
··· 1 + use super::*; 2 + 3 + #[wasm_bindgen] 4 + pub fn highlight(input: &str) -> String { 5 + let engine_guard = ENGINE_STATE 6 + .get() 7 + .unwrap() 8 + .lock() 9 + .expect("engine state initialized"); 10 + let mut working_set = StateWorkingSet::new(&engine_guard); 11 + 12 + // Capture the global offset before parsing, as parse will generate spans relative to this 13 + let global_offset = working_set.next_span_start(); 14 + 15 + // Parse the input block using Nushell's full parser 16 + let block = parse(&mut working_set, None, input.as_bytes(), false); 17 + 18 + // Flatten the block to get shapes (semantic tokens) 19 + let shapes = flatten_block(&working_set, &block); 20 + 21 + let mut output = String::new(); 22 + let mut last_end = 0; 23 + 24 + for (span, shape) in shapes { 25 + // Adjust global span to local byte indices 26 + let local_start = span.start.saturating_sub(global_offset); 27 + let local_end = span.end.saturating_sub(global_offset); 28 + 29 + if local_start >= input.len() { 30 + continue; 31 + } 32 + let safe_end = std::cmp::min(local_end, input.len()); 33 + 34 + if local_start > last_end { 35 + output.push_str(&input[last_end..local_start]); 36 + } 37 + 38 + let start_index = std::cmp::max(local_start, last_end); 39 + if start_index >= safe_end { 40 + continue; 41 + } 42 + 43 + // Colors corresponding to standard Nushell/Ansi map 44 + let color = match shape { 45 + FlatShape::Pipe | FlatShape::Redirection => "\x1b[35m", // Magenta 46 + FlatShape::Bool | FlatShape::Int | FlatShape::Float => "\x1b[35;1m", // Light Magenta (Numbers/Bool) 47 + FlatShape::External(_) | FlatShape::InternalCall(_) | FlatShape::Keyword => { 48 + "\x1b[32;1m" 49 + } // Green Bold 50 + FlatShape::String | FlatShape::StringInterpolation | FlatShape::RawString => "\x1b[36m", // Cyan 51 + FlatShape::Variable(_) | FlatShape::Flag => "\x1b[34m", // Blue 52 + FlatShape::Garbage => "\x1b[31;1m\x1b[47m", // Red on White 53 + FlatShape::Signature => "\x1b[33;1m", // Yellow Bold 54 + // Closures, blocks, punctuation often fall here 55 + FlatShape::Block => "\x1b[37m", // White 56 + FlatShape::Closure => "\x1b[36;1m", // Light Cyan 57 + _ => "\x1b[0m", 58 + }; 59 + 60 + output.push_str(color); 61 + output.push_str(&input[start_index..safe_end]); 62 + output.push_str("\x1b[0m"); 63 + 64 + last_end = safe_end; 65 + } 66 + 67 + if last_end < input.len() { 68 + output.push_str(&input[last_end..]); 69 + } 70 + 71 + output 72 + }
+249
src/lib.rs
··· 1 + use jacquard::chrono; 2 + use miette::Report; 3 + use nu_cmd_extra::add_extra_command_context; 4 + use nu_cmd_lang::create_default_context; 5 + use nu_engine::{command_prelude::*, eval_block}; 6 + use nu_parser::{FlatShape, TokenContents, flatten_block, lex, parse}; 7 + use nu_protocol::{ 8 + Config, PipelineData, Span, 9 + engine::{Call, EngineState, Stack, StateWorkingSet}, 10 + }; 11 + use serde::Serialize; 12 + use std::{ 13 + sync::{Arc, Mutex, OnceLock}, 14 + time::UNIX_EPOCH, 15 + }; 16 + use vfs::VfsError; 17 + use wasm_bindgen::prelude::*; 18 + 19 + pub mod cmd; 20 + pub mod completion; 21 + pub mod default_context; 22 + pub mod error; 23 + pub mod globals; 24 + pub mod highlight; 25 + pub mod memory_fs; 26 + 27 + use crate::{ 28 + cmd::{ 29 + Cd, Fetch, Job, JobKill, JobList, Ls, Mkdir, Open, Pwd, Random, Rm, Save, Source, Sys, 30 + Version, 31 + }, 32 + default_context::add_shell_command_context, 33 + error::format_error, 34 + globals::{apply_pending_deltas, current_time, get_pwd, print_to_console}, 35 + }; 36 + use error::CommandError; 37 + use globals::get_vfs; 38 + 39 + static ENGINE_STATE: OnceLock<Mutex<EngineState>> = OnceLock::new(); 40 + static STACK: OnceLock<Mutex<Stack>> = OnceLock::new(); 41 + 42 + fn init_engine_internal() -> Result<(), Report> { 43 + let mut engine_state = create_default_context(); 44 + engine_state = add_shell_command_context(engine_state); 45 + engine_state = add_extra_command_context(engine_state); 46 + 47 + let write_file = |name: &str, contents: &str| { 48 + get_vfs() 49 + .join(name) 50 + .and_then(|p| p.create_file()) 51 + .and_then(|mut f| f.write_all(contents.as_bytes()).map_err(VfsError::from)) 52 + .map_err(|e| miette::miette!(e.to_string())) 53 + }; 54 + 55 + let access_log = format!( 56 + r#"/dysnomia.v000 /user: 90008/ /ip: [REDACTED]/ /time: [REDACTED]// 57 + /dysnomia.v002 /user: 90008/ /ip: [REDACTED]/ /time: [REDACTED]// 58 + /dysnomia.v011 /user: 90008/ /ip: [REDACTED]/ /time: [REDACTED]// 59 + [...ENTRIES TRUNCATED...] 60 + /dysnomia.v099 /user: anonymous/ /ip: [REDACTED]/ /time: {time}//"#, 61 + time = current_time() 62 + .and_then(|t| t.duration_since(UNIX_EPOCH).ok()) 63 + .map_or_else( 64 + || "unknown".to_string(), 65 + |time| chrono::DateTime::from_timestamp_nanos(time.as_nanos() as i64) 66 + .format("%Y-%m-%dT%H:%M:%SZ") 67 + .to_string() 68 + ) 69 + ); 70 + write_file(".access.log", &access_log)?; 71 + 72 + let welcome_txt = r#"welcome anonymous ! 73 + 74 + 75 + you are interfacing with dysnomia.v099 76 + using the nu shell. 77 + 78 + 79 + a few commands you can try: 80 + 81 + "hello, user!" | save message.txt 82 + fetch at://ptr.pet 83 + ls --help"#; 84 + write_file("welcome.txt", &welcome_txt)?; 85 + 86 + let mut working_set = StateWorkingSet::new(&engine_state); 87 + let decls: [Box<dyn Command>; 15] = [ 88 + Box::new(Ls), 89 + Box::new(Open), 90 + Box::new(Save), 91 + Box::new(Mkdir), 92 + Box::new(Pwd), 93 + Box::new(Cd), 94 + Box::new(Rm), 95 + Box::new(Fetch), 96 + Box::new(Source), 97 + Box::new(Job), 98 + Box::new(JobList), 99 + Box::new(JobKill), 100 + Box::new(Sys), 101 + Box::new(Random), 102 + Box::new(Version), 103 + ]; 104 + for decl in decls { 105 + working_set.add_decl(decl); 106 + } 107 + engine_state.merge_delta(working_set.delta)?; 108 + 109 + let mut config = Config::default(); 110 + config.use_ansi_coloring = true.into(); 111 + config.show_banner = nu_protocol::BannerKind::Full; 112 + engine_state.config = Arc::new(config); 113 + 114 + ENGINE_STATE 115 + .set(Mutex::new(engine_state)) 116 + .map_err(|_| miette::miette!("ENGINE_STATE was already set!?"))?; 117 + STACK 118 + .set(Mutex::new(Stack::new())) 119 + .map_err(|_| miette::miette!("STACK was already set!?"))?; 120 + 121 + // web_sys::console::log_1(&"Hello, World!".into()); 122 + 123 + Ok(()) 124 + } 125 + 126 + #[wasm_bindgen] 127 + pub fn init_engine() -> String { 128 + console_error_panic_hook::set_once(); 129 + init_engine_internal().map_or_else(|err| format!("error: {err}"), |_| String::new()) 130 + } 131 + 132 + fn run_command_internal( 133 + engine_state: &mut EngineState, 134 + stack: &mut Stack, 135 + input: &str, 136 + ) -> Result<(), CommandError> { 137 + // apply any pending deltas from previous commands (like `source`) 138 + apply_pending_deltas(engine_state).map_err(|e| CommandError { 139 + error: Report::new(e), 140 + start_offset: 0, 141 + })?; 142 + // set PWD 143 + engine_state.add_env_var( 144 + "PWD".to_string(), 145 + get_pwd_string().into_value(Span::unknown()), 146 + ); 147 + 148 + let mut working_set = StateWorkingSet::new(engine_state); 149 + 150 + // Capture the start offset *before* adding the file, as this is the global offset 151 + // where our file begins. 152 + let start_offset = working_set.next_span_start(); 153 + let block = parse(&mut working_set, Some("entry"), input.as_bytes(), false); 154 + 155 + let cmd_err = |err: ShellError| CommandError { 156 + error: Report::new(err), 157 + start_offset, 158 + }; 159 + 160 + if let Some(err) = working_set.parse_errors.into_iter().next() { 161 + return Err(CommandError { 162 + error: Report::new(err), 163 + start_offset, 164 + }); 165 + } 166 + if let Some(err) = working_set.compile_errors.into_iter().next() { 167 + return Err(CommandError { 168 + error: Report::new(err), 169 + start_offset, 170 + }); 171 + } 172 + 173 + engine_state 174 + .merge_delta(working_set.delta) 175 + .map_err(cmd_err)?; 176 + let result = eval_block::<nu_protocol::debugger::WithoutDebug>( 177 + engine_state, 178 + stack, 179 + &block, 180 + PipelineData::Empty, 181 + ); 182 + 183 + let pipeline_data = result.map_err(cmd_err)?; 184 + let table_command = nu_command::Table; 185 + let call = Call::new(pipeline_data.span().unwrap_or_else(Span::unknown)); 186 + 187 + let res = table_command 188 + .run(engine_state, stack, &call, pipeline_data.body) 189 + .map_err(cmd_err)?; 190 + 191 + match res { 192 + PipelineData::Empty => {} 193 + PipelineData::Value(v, _) => { 194 + print_to_console(&v.to_expanded_string("\n", &engine_state.config), true) 195 + } 196 + PipelineData::ByteStream(s, _) => { 197 + for line in s.lines().into_iter().flatten() { 198 + let out = line.map_err(|e| CommandError { 199 + error: Report::new(e), 200 + start_offset, 201 + })?; 202 + print_to_console(&out, true); 203 + } 204 + } 205 + PipelineData::ListStream(s, _) => { 206 + for item in s.into_iter() { 207 + let out = item.to_expanded_string("\n", &engine_state.config); 208 + print_to_console(&out, true); 209 + } 210 + } 211 + } 212 + 213 + Ok(()) 214 + } 215 + 216 + #[wasm_bindgen] 217 + pub fn run_command(input: &str) -> Option<String> { 218 + let (mut engine_guard, mut stack_guard) = ( 219 + ENGINE_STATE 220 + .get() 221 + .unwrap() 222 + .lock() 223 + .expect("engine state initialized"), 224 + STACK.get().unwrap().lock().expect("stack initialized"), 225 + ); 226 + 227 + let result = std::panic::catch_unwind(move || { 228 + match run_command_internal(&mut engine_guard, &mut stack_guard, input) { 229 + Ok(_) => None, 230 + Err(cmd_err) => Some(format_error( 231 + cmd_err.error, 232 + input.to_owned(), 233 + cmd_err.start_offset, 234 + )), 235 + } 236 + }); 237 + result.unwrap_or_else(|err| Some(format!("panicked: {err:?}"))) 238 + } 239 + 240 + #[wasm_bindgen] 241 + pub fn get_pwd_string() -> String { 242 + // web_sys::console::log_1(&"before pwd".into()); 243 + let pwd = get_pwd(); 244 + // web_sys::console::log_1(&"after pwd".into()); 245 + if pwd.is_root() { 246 + return "/".to_string(); 247 + } 248 + pwd.as_str().to_string() 249 + }
+390
src/memory_fs.rs
··· 1 + //! An ephemeral in-memory file system, intended mainly for unit tests 2 + 3 + use core::cmp; 4 + use std::fmt; 5 + use std::fmt::{Debug, Formatter}; 6 + use std::io::{Cursor, Read, Seek, SeekFrom, Write}; 7 + use std::mem::swap; 8 + use std::sync::Arc; 9 + use std::time::SystemTime; 10 + use vfs::error::VfsErrorKind; 11 + use vfs::{FileSystem, VfsFileType}; 12 + use vfs::{SeekAndRead, VfsMetadata}; 13 + use vfs::{SeekAndWrite, VfsResult}; 14 + 15 + use crate::globals::current_time; 16 + 17 + type MemoryFsHandle = Arc<MemoryFsImpl>; 18 + 19 + /// An ephemeral in-memory file system, intended mainly for unit tests 20 + pub struct MemoryFS { 21 + handle: MemoryFsHandle, 22 + } 23 + 24 + impl Debug for MemoryFS { 25 + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { 26 + f.write_str("In Memory File System") 27 + } 28 + } 29 + 30 + impl MemoryFS { 31 + /// Create a new in-memory filesystem 32 + pub fn new() -> Self { 33 + MemoryFS { 34 + handle: Arc::new(MemoryFsImpl::new()), 35 + } 36 + } 37 + 38 + fn ensure_has_parent(&self, path: &str) -> VfsResult<()> { 39 + let separator = path.rfind('/'); 40 + if let Some(index) = separator { 41 + if self.exists(&path[..index])? { 42 + return Ok(()); 43 + } 44 + } 45 + Err(VfsErrorKind::Other("Parent path does not exist".into()).into()) 46 + } 47 + } 48 + 49 + impl Default for MemoryFS { 50 + fn default() -> Self { 51 + Self::new() 52 + } 53 + } 54 + 55 + struct WritableFile { 56 + content: Cursor<Vec<u8>>, 57 + destination: String, 58 + fs: MemoryFsHandle, 59 + } 60 + 61 + impl Seek for WritableFile { 62 + fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> { 63 + self.content.seek(pos) 64 + } 65 + } 66 + 67 + impl Write for WritableFile { 68 + fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 69 + self.content.write(buf) 70 + } 71 + 72 + fn flush(&mut self) -> std::io::Result<()> { 73 + self.content.flush()?; 74 + let mut content = self.content.get_ref().clone(); 75 + swap(&mut content, self.content.get_mut()); 76 + let content = Arc::new(content); 77 + 78 + let new_file = self 79 + .fs 80 + .files 81 + .peek_with(&self.destination, |_, previous_file| MemoryFile { 82 + file_type: VfsFileType::File, 83 + content: content.clone(), 84 + created: previous_file.created, 85 + modified: current_time(), 86 + accessed: previous_file.accessed, 87 + }) 88 + .unwrap_or_else(|| { 89 + let time = current_time(); 90 + MemoryFile { 91 + file_type: VfsFileType::File, 92 + content, 93 + created: time, 94 + modified: time, 95 + accessed: None, 96 + } 97 + }); 98 + 99 + // Remove old entry if it exists, then insert new one 100 + self.fs.files.remove_sync(&self.destination); 101 + let _ = self 102 + .fs 103 + .files 104 + .insert_sync(self.destination.clone(), new_file); 105 + Ok(()) 106 + } 107 + } 108 + 109 + impl Drop for WritableFile { 110 + fn drop(&mut self) { 111 + self.flush() 112 + .expect("Flush failed while dropping in-memory file"); 113 + } 114 + } 115 + 116 + struct ReadableFile { 117 + #[allow(clippy::rc_buffer)] // to allow accessing the same object as writable 118 + content: Arc<Vec<u8>>, 119 + position: u64, 120 + } 121 + 122 + impl ReadableFile { 123 + fn len(&self) -> u64 { 124 + self.content.len() as u64 - self.position 125 + } 126 + } 127 + 128 + impl Read for ReadableFile { 129 + fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { 130 + let amt = cmp::min(buf.len(), self.len() as usize); 131 + 132 + if amt == 1 { 133 + buf[0] = self.content[self.position as usize]; 134 + } else { 135 + buf[..amt].copy_from_slice( 136 + &self.content.as_slice()[self.position as usize..self.position as usize + amt], 137 + ); 138 + } 139 + self.position += amt as u64; 140 + Ok(amt) 141 + } 142 + } 143 + 144 + impl Seek for ReadableFile { 145 + fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> { 146 + match pos { 147 + SeekFrom::Start(offset) => self.position = offset, 148 + SeekFrom::Current(offset) => self.position = (self.position as i64 + offset) as u64, 149 + SeekFrom::End(offset) => self.position = (self.content.len() as i64 + offset) as u64, 150 + } 151 + Ok(self.position) 152 + } 153 + } 154 + 155 + impl FileSystem for MemoryFS { 156 + fn read_dir(&self, path: &str) -> VfsResult<Box<dyn Iterator<Item = String> + Send>> { 157 + let prefix = format!("{}/", path); 158 + 159 + // Ensure the directory exists 160 + if !self.handle.files.contains(path) { 161 + return Err(VfsErrorKind::FileNotFound.into()); 162 + } 163 + 164 + let guard = scc::Guard::new(); 165 + let mut entries = Vec::new(); 166 + 167 + let range_start = prefix.clone(); 168 + for (candidate_path, _) in self.handle.files.range(range_start.., &guard) { 169 + if candidate_path.starts_with(&prefix) { 170 + let rest = &candidate_path[prefix.len()..]; 171 + if !rest.contains('/') { 172 + entries.push(rest.to_string()); 173 + } 174 + } else { 175 + // we are in a different directory if the prefix doesnt match 176 + break; 177 + } 178 + } 179 + 180 + Ok(Box::new(entries.into_iter())) 181 + } 182 + 183 + fn create_dir(&self, path: &str) -> VfsResult<()> { 184 + self.ensure_has_parent(path)?; 185 + 186 + // Check if path already exists and return appropriate error 187 + if let Some(result) = self 188 + .handle 189 + .files 190 + .peek_with(path, |_, file| match file.file_type { 191 + VfsFileType::File => Err(VfsErrorKind::FileExists.into()), 192 + VfsFileType::Directory => Err(VfsErrorKind::DirectoryExists.into()), 193 + }) 194 + { 195 + return result; 196 + } 197 + 198 + let new_dir = MemoryFile { 199 + file_type: VfsFileType::Directory, 200 + content: Default::default(), 201 + created: current_time(), 202 + modified: current_time(), 203 + accessed: current_time(), 204 + }; 205 + 206 + self.handle 207 + .files 208 + .insert_sync(path.to_string(), new_dir) 209 + .map_err(|_| VfsErrorKind::DirectoryExists.into()) 210 + } 211 + 212 + fn open_file(&self, path: &str) -> VfsResult<Box<dyn SeekAndRead + Send>> { 213 + if let Some(time) = current_time() { 214 + let _ = self.set_access_time(path, time); 215 + } 216 + 217 + let content = self 218 + .handle 219 + .files 220 + .peek_with(path, |_, file| { 221 + ensure_file(file)?; 222 + VfsResult::Ok(file.content.clone()) 223 + }) 224 + .ok_or(VfsErrorKind::FileNotFound)??; 225 + 226 + Ok(Box::new(ReadableFile { 227 + content, 228 + position: 0, 229 + })) 230 + } 231 + 232 + fn create_file(&self, path: &str) -> VfsResult<Box<dyn SeekAndWrite + Send>> { 233 + self.ensure_has_parent(path)?; 234 + let content = Arc::new(Vec::<u8>::new()); 235 + let new_file = MemoryFile { 236 + file_type: VfsFileType::File, 237 + content, 238 + created: current_time(), 239 + modified: current_time(), 240 + accessed: current_time(), 241 + }; 242 + 243 + // Remove old entry if it exists, then insert new one 244 + self.handle.files.remove_sync(path); 245 + let _ = self.handle.files.insert_sync(path.to_string(), new_file); 246 + 247 + let writer = WritableFile { 248 + content: Cursor::new(vec![]), 249 + destination: path.to_string(), 250 + fs: self.handle.clone(), 251 + }; 252 + Ok(Box::new(writer)) 253 + } 254 + 255 + fn append_file(&self, path: &str) -> VfsResult<Box<dyn SeekAndWrite + Send>> { 256 + let content = self 257 + .handle 258 + .files 259 + .peek_with(path, |_, file| file.content.clone()) 260 + .ok_or(VfsErrorKind::FileNotFound)?; 261 + let mut content = Cursor::new(content.as_slice().to_vec()); 262 + content.seek(SeekFrom::End(0))?; 263 + let writer = WritableFile { 264 + content, 265 + destination: path.to_string(), 266 + fs: self.handle.clone(), 267 + }; 268 + Ok(Box::new(writer)) 269 + } 270 + 271 + fn metadata(&self, path: &str) -> VfsResult<VfsMetadata> { 272 + self.handle 273 + .files 274 + .peek_with(path, |_, file| VfsMetadata { 275 + file_type: file.file_type, 276 + len: file.content.len() as u64, 277 + modified: file.modified, 278 + created: file.created, 279 + accessed: file.accessed, 280 + }) 281 + .ok_or(VfsErrorKind::FileNotFound.into()) 282 + } 283 + 284 + fn set_creation_time(&self, path: &str, time: SystemTime) -> VfsResult<()> { 285 + let updated = self 286 + .handle 287 + .files 288 + .peek_with(path, |_, file| MemoryFile { 289 + created: Some(time), 290 + ..file.clone() 291 + }) 292 + .ok_or(VfsErrorKind::FileNotFound)?; 293 + 294 + self.handle.files.remove_sync(path); 295 + let _ = self.handle.files.insert_sync(path.to_string(), updated); 296 + Ok(()) 297 + } 298 + 299 + fn set_modification_time(&self, path: &str, time: SystemTime) -> VfsResult<()> { 300 + let updated = self 301 + .handle 302 + .files 303 + .peek_with(path, |_, file| MemoryFile { 304 + modified: Some(time), 305 + ..file.clone() 306 + }) 307 + .ok_or(VfsErrorKind::FileNotFound)?; 308 + 309 + self.handle.files.remove_sync(path); 310 + let _ = self.handle.files.insert_sync(path.to_string(), updated); 311 + Ok(()) 312 + } 313 + 314 + fn set_access_time(&self, path: &str, time: SystemTime) -> VfsResult<()> { 315 + let updated = self 316 + .handle 317 + .files 318 + .peek_with(path, |_, file| MemoryFile { 319 + accessed: Some(time), 320 + ..file.clone() 321 + }) 322 + .ok_or(VfsErrorKind::FileNotFound)?; 323 + 324 + self.handle.files.remove_sync(path); 325 + let _ = self.handle.files.insert_sync(path.to_string(), updated); 326 + Ok(()) 327 + } 328 + 329 + fn exists(&self, path: &str) -> VfsResult<bool> { 330 + Ok(self.handle.files.contains(path)) 331 + } 332 + 333 + fn remove_file(&self, path: &str) -> VfsResult<()> { 334 + self.handle 335 + .files 336 + .remove_sync(path) 337 + .then_some(Ok(())) 338 + .unwrap_or_else(|| Err(VfsErrorKind::FileNotFound.into())) 339 + } 340 + 341 + fn remove_dir(&self, path: &str) -> VfsResult<()> { 342 + if self.read_dir(path)?.next().is_some() { 343 + return Err(VfsErrorKind::Other("Directory to remove is not empty".into()).into()); 344 + } 345 + self.handle 346 + .files 347 + .remove_sync(path) 348 + .then_some(Ok(())) 349 + .unwrap_or_else(|| Err(VfsErrorKind::FileNotFound.into())) 350 + } 351 + } 352 + 353 + struct MemoryFsImpl { 354 + files: scc::TreeIndex<String, MemoryFile>, 355 + } 356 + 357 + impl MemoryFsImpl { 358 + pub fn new() -> Self { 359 + let files = scc::TreeIndex::new(); 360 + // Add root directory 361 + let _ = files.insert_sync( 362 + "".to_string(), 363 + MemoryFile { 364 + file_type: VfsFileType::Directory, 365 + content: Arc::new(vec![]), 366 + created: current_time(), 367 + modified: None, 368 + accessed: None, 369 + }, 370 + ); 371 + Self { files } 372 + } 373 + } 374 + 375 + #[derive(Clone)] 376 + struct MemoryFile { 377 + file_type: VfsFileType, 378 + content: Arc<Vec<u8>>, 379 + 380 + created: Option<SystemTime>, 381 + modified: Option<SystemTime>, 382 + accessed: Option<SystemTime>, 383 + } 384 + 385 + fn ensure_file(file: &MemoryFile) -> VfsResult<()> { 386 + if file.file_type != VfsFileType::File { 387 + return Err(VfsErrorKind::Other("Not a file".into()).into()); 388 + } 389 + Ok(()) 390 + }
+24
www/.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+13
www/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/vite.svg" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>dysnomia</title> 8 + </head> 9 + <body> 10 + <div id="app"></div> 11 + <script type="module" src="/src/main.ts"></script> 12 + </body> 13 + </html>
+25
www/package.json
··· 1 + { 2 + "name": "dysnomia", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc && vite build", 9 + "preview": "vite preview" 10 + }, 11 + "devDependencies": { 12 + "typescript": "~5.9.3", 13 + "vite": "npm:rolldown-vite@7.2.5", 14 + "vite-plugin-top-level-await": "^1.6.0", 15 + "vite-plugin-wasm": "^3.5.0" 16 + }, 17 + "dependencies": { 18 + "@std/toml": "npm:@jsr/std__toml", 19 + "@xterm/addon-canvas": "^0.7.0", 20 + "@xterm/addon-fit": "^0.10.0", 21 + "@xterm/addon-web-links": "^0.11.0", 22 + "@xterm/addon-webgl": "^0.18.0", 23 + "@xterm/xterm": "^5.5.0" 24 + } 25 + }
+1
www/public/vite.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
+659
www/src/main.ts
··· 1 + import { Terminal } from "@xterm/xterm"; 2 + import { FitAddon } from "@xterm/addon-fit"; 3 + import { WebLinksAddon } from "@xterm/addon-web-links"; 4 + import { CanvasAddon } from "@xterm/addon-canvas"; 5 + import { WebglAddon } from "@xterm/addon-webgl"; 6 + 7 + // Import the worker using Vite's explicit worker suffix 8 + // This fixes the "disallowed MIME type" error by ensuring Vite bundles it correctly 9 + import DysnomiaWorker from "./worker?worker"; 10 + 11 + import "./style.css"; 12 + import "@xterm/xterm/css/xterm.css"; 13 + 14 + type Candidate = { 15 + name: string; 16 + description: string; 17 + is_command: boolean; 18 + rendered: string; 19 + span_start: number; 20 + span_end: number; 21 + }; 22 + 23 + type SearchState = "history" | "completion" | "none"; 24 + 25 + async function bootstrap() { 26 + // Instantiate the worker using the imported class 27 + const worker = new DysnomiaWorker(); 28 + 29 + // Communication Helpers 30 + let msgId = 0; 31 + const pending = new Map< 32 + number, 33 + { resolve: (value: any) => void; reject: (reason: any) => void } 34 + >(); 35 + 36 + // State to track if WASM is fully loaded 37 + let isWorkerReady = false; 38 + 39 + const callWorker = (type: string, payload?: any): Promise<any> => { 40 + return new Promise((resolve, reject) => { 41 + const id = ++msgId; 42 + pending.set(id, { resolve, reject }); 43 + worker.postMessage({ id, type, payload }); 44 + }); 45 + }; 46 + 47 + const term = new Terminal({ 48 + cursorBlink: true, 49 + cursorStyle: "bar", 50 + cursorInactiveStyle: "block", 51 + fontFamily: '"Comic Mono", monospace', 52 + fontSize: 15, 53 + scrollback: 100000, 54 + theme: { 55 + background: "#000000", 56 + foreground: "#ffffff", 57 + }, 58 + }); 59 + 60 + const fitAddon = new FitAddon(); 61 + term.loadAddon(fitAddon); 62 + term.loadAddon(new WebLinksAddon()); 63 + 64 + document.querySelector<HTMLDivElement>("#app")!.innerHTML = 65 + `<div id="terminal"></div>`; 66 + term.open(document.getElementById("terminal")!); 67 + try { 68 + term.loadAddon(new WebglAddon()); 69 + } catch (err) { 70 + console.error("WebGL addon failed to load:", err); 71 + console.warn("falling back to canvas!"); 72 + term.loadAddon(new CanvasAddon()); 73 + } 74 + fitAddon.fit(); 75 + 76 + let activeTasks = 0; 77 + let currentLine = ""; 78 + let completionBaseLine = ""; 79 + let cursorPos = 0; 80 + let isRunningCommand = false; 81 + 82 + let searchState: SearchState = "none"; 83 + let completionCandidates: Candidate[] = []; 84 + let completionIndex = -1; 85 + const history: string[] = []; 86 + let historyIndex = 0; 87 + 88 + // Cache PWD to avoid flickering/excessive async calls 89 + let cachedPwd = "/"; 90 + 91 + let readyPromiseResolve: () => void; 92 + const readyPromise = new Promise<void>((resolve) => { 93 + readyPromiseResolve = resolve; 94 + }); 95 + 96 + worker.onmessage = (e) => { 97 + const { id, type, payload } = e.data; 98 + 99 + // console.log("Received message:", id, type, payload); 100 + 101 + if (type === "initialized") { 102 + isWorkerReady = true; 103 + readyPromiseResolve(); 104 + } 105 + 106 + if (type === "console") { 107 + const safeMsg = payload.msg.replace(/\n/g, "\r\n"); 108 + 109 + if (!payload.isCmd) { 110 + // If we are sitting at a prompt, clear it to show the message 111 + term.write("\r\x1b[2K"); // Clear line 112 + term.write(safeMsg + "\r\n"); 113 + refreshPrompt(); 114 + } else { 115 + term.write(safeMsg + "\r\n"); 116 + } 117 + return; 118 + } 119 + 120 + if (type === "task_count") { 121 + activeTasks = payload; 122 + if (!isRunningCommand) { 123 + refreshPrompt(); 124 + } 125 + return; 126 + } 127 + 128 + if (pending.has(id)) { 129 + const resolver = pending.get(id)!; 130 + pending.delete(id); 131 + if (type === "error") { 132 + resolver.reject(payload); 133 + } else { 134 + resolver.resolve(payload); 135 + } 136 + } 137 + }; 138 + 139 + const getPrompt = () => { 140 + const indicator = 141 + activeTasks > 0 ? `\x1b[33m(${activeTasks} bg)\x1b[0m ` : ""; 142 + 143 + let modeIndicator = ""; 144 + if (searchState === "history") { 145 + modeIndicator = "\x1b[7m\x1b[34m(h-search)\x1b[0m "; 146 + } else if (searchState === "completion") { 147 + modeIndicator = "\x1b[7m\x1b[35m(c-search)\x1b[0m "; 148 + } 149 + 150 + const pathColor = isWorkerReady ? "\x1b[33m" : "\x1b[30;1m"; // Yellow (ready) vs Dark Gray (loading) 151 + return `${indicator}${pathColor}${cachedPwd}\x1b[32m/\x1b[0m ${modeIndicator}`; 152 + }; 153 + 154 + // Async Refresh Prompt 155 + const refreshPrompt = async () => { 156 + // If we are running a command (blocking), don't redraw prompt 157 + if (isRunningCommand) return; 158 + 159 + let output = ""; 160 + output += "\r"; 161 + output += "\x1b[2K"; // Clear current line 162 + output += "\x1b[J"; // Clear everything below 163 + 164 + output += getPrompt(); 165 + 166 + try { 167 + if (currentLine.length > 0 && isWorkerReady) { 168 + const highlighted = await callWorker("highlight", currentLine); 169 + output += highlighted; 170 + } else { 171 + output += currentLine; 172 + } 173 + } catch (e) { 174 + output += currentLine; 175 + } 176 + 177 + if (completionCandidates.length > 0) { 178 + output += "\x1b7"; // Save cursor position 179 + output += "\r\n"; 180 + 181 + const MAX_VISIBLE = 10; 182 + const total = completionCandidates.length; 183 + let start = 0; 184 + let end = total; 185 + 186 + if (total > MAX_VISIBLE) { 187 + const half = Math.floor(MAX_VISIBLE / 2); 188 + if (completionIndex < half) { 189 + start = 0; 190 + end = MAX_VISIBLE; 191 + } else if (completionIndex >= total - half) { 192 + start = total - MAX_VISIBLE; 193 + end = total; 194 + } else { 195 + start = completionIndex - half; 196 + end = start + MAX_VISIBLE; 197 + } 198 + } 199 + 200 + if (start > 0) { 201 + output += `\x1b[2m... ${start} more\x1b[0m\x1b[K\r\n`; 202 + } 203 + 204 + for (let i = start; i < end; i++) { 205 + const cand = completionCandidates[i]; 206 + const isSelected = i === completionIndex; 207 + let rendered = cand.rendered; 208 + 209 + if (isSelected) { 210 + rendered = rendered.replace(/\x1b\[0m/g, "\x1b[0m\x1b[7m"); 211 + output += `\x1b[7m${rendered}\x1b[K\x1b[0m\r\n`; 212 + } else { 213 + output += `${rendered}\x1b[K\r\n`; 214 + } 215 + } 216 + 217 + if (end < total) { 218 + output += `\x1b[2m... ${total - end} more\x1b[0m\x1b[K\r\n`; 219 + } 220 + 221 + output += "\x1b8"; // Restore cursor position 222 + } 223 + 224 + // Move cursor back to correct position 225 + const distance = currentLine.length - cursorPos; 226 + if (distance > 0) { 227 + output += `\x1b[${distance}D`; 228 + } 229 + 230 + // We write the whole block at once to minimize flicker 231 + term.write(output); 232 + }; 233 + 234 + const getLineWithCompletion = (baseLine: string, candidate: Candidate) => { 235 + const before = baseLine.slice(0, candidate.span_start); 236 + const after = baseLine.slice(candidate.span_end); 237 + return before + candidate.name + after; 238 + }; 239 + 240 + const applyCompletion = (candidate: Candidate) => { 241 + currentLine = getLineWithCompletion(currentLine, candidate); 242 + const before = currentLine.slice(0, candidate.span_start); 243 + cursorPos = (before + candidate.name).length; 244 + }; 245 + 246 + const updateCompletionCandidates = async () => { 247 + // Don't try to get completion if worker isn't loaded 248 + if (!isWorkerReady) return; 249 + 250 + try { 251 + const json = await callWorker("completion", { 252 + line: currentLine, 253 + cursor: cursorPos, 254 + }); 255 + const candidates: Candidate[] = JSON.parse(json); 256 + completionCandidates = candidates; 257 + completionBaseLine = currentLine; 258 + 259 + if (completionCandidates.length > 0) { 260 + if (completionIndex >= completionCandidates.length) { 261 + completionIndex = 0; 262 + } 263 + if (completionIndex < 0) { 264 + completionIndex = 0; 265 + } 266 + } else { 267 + completionIndex = -1; 268 + } 269 + } catch (err) { 270 + completionCandidates = []; 271 + completionIndex = -1; 272 + } 273 + }; 274 + 275 + const updateHistoryCandidates = () => { 276 + const query = currentLine.toLowerCase(); 277 + const matches = history.filter((cmd) => { 278 + let i = 0, 279 + j = 0; 280 + const cmdLower = cmd.toLowerCase(); 281 + while (i < query.length && j < cmdLower.length) { 282 + if (query[i] === cmdLower[j]) i++; 283 + j++; 284 + } 285 + return i === query.length; 286 + }); 287 + 288 + matches.reverse(); 289 + 290 + completionCandidates = matches.map((cmd) => ({ 291 + name: cmd, 292 + description: "", 293 + is_command: true, 294 + rendered: cmd, 295 + span_start: 0, 296 + span_end: currentLine.length, 297 + })); 298 + 299 + completionBaseLine = currentLine; 300 + 301 + if (completionCandidates.length > 0) { 302 + completionIndex = 0; 303 + } else { 304 + completionIndex = -1; 305 + } 306 + }; 307 + 308 + // 1. Setup Input Handler immediately so terminal isn't blocked 309 + term.onData(async (e) => { 310 + // SEARCH MODE INPUT 311 + if (searchState !== "none" && e >= " " && e <= "~") { 312 + if (cursorPos === currentLine.length) { 313 + currentLine += e; 314 + cursorPos++; 315 + } else { 316 + currentLine = 317 + currentLine.slice(0, cursorPos) + e + currentLine.slice(cursorPos); 318 + cursorPos++; 319 + } 320 + term.write(e); 321 + 322 + if (searchState === "history") updateHistoryCandidates(); 323 + if (searchState === "completion") await updateCompletionCandidates(); 324 + 325 + await refreshPrompt(); 326 + return; 327 + } 328 + 329 + // SEARCH MODE BACKSPACE 330 + if (searchState !== "none" && e === "\u007F") { 331 + if (cursorPos > 0) { 332 + currentLine = 333 + currentLine.slice(0, cursorPos - 1) + currentLine.slice(cursorPos); 334 + cursorPos--; 335 + 336 + if (searchState === "history") updateHistoryCandidates(); 337 + if (searchState === "completion") await updateCompletionCandidates(); 338 + 339 + await refreshPrompt(); 340 + } 341 + return; 342 + } 343 + 344 + // EXIT SEARCH MODE (on non-nav keys) 345 + const isTab = e === "\t" || e === "\x1b[Z"; 346 + const isArrow = e === "\x1b[A" || e === "\x1b[B"; 347 + 348 + if ( 349 + !isTab && 350 + !isArrow && 351 + (completionCandidates.length > 0 || searchState !== "none") 352 + ) { 353 + if (e !== "\r") { 354 + completionCandidates = []; 355 + completionIndex = -1; 356 + searchState = "none"; 357 + await refreshPrompt(); 358 + } 359 + } 360 + 361 + switch (e) { 362 + case "\r": { 363 + // ENTER 364 + 365 + // 1. Accept Completion/Search Selection 366 + if (completionCandidates.length > 0) { 367 + const cand = completionCandidates[completionIndex]; 368 + if (cand) { 369 + currentLine = getLineWithCompletion(completionBaseLine, cand); 370 + cursorPos = currentLine.length; 371 + } 372 + } 373 + 374 + const wasInMode = 375 + searchState != "none" || completionCandidates.length > 0; 376 + 377 + completionCandidates = []; 378 + searchState = "none"; 379 + 380 + if (wasInMode) { 381 + await refreshPrompt(); 382 + break; 383 + } 384 + 385 + // 2. Execute Command 386 + await refreshPrompt(); // Ensure clean line 387 + term.write("\r\n"); 388 + const trimmed = currentLine.trim(); 389 + 390 + if (trimmed.length > 0) { 391 + currentLine = ""; 392 + isRunningCommand = true; 393 + try { 394 + // Check readiness before executing 395 + if (!isWorkerReady) { 396 + term.write( 397 + "\x1b[33mengine is still loading, please wait (_ _ )zZ...\x1b[0m\r\n", 398 + ); 399 + } else { 400 + // ASYNC execution 401 + const output: string | undefined = await callWorker( 402 + "run", 403 + trimmed, 404 + ); 405 + if (output) { 406 + term.write(output.replace(/\n/g, "\r\n")); 407 + if (output && !output.endsWith("\n")) { 408 + term.write("\r\n"); 409 + } 410 + } 411 + 412 + // Update cached PWD after command execution (cd, etc) 413 + cachedPwd = await callWorker("get_pwd"); 414 + 415 + // Update History 416 + const idx = history.indexOf(trimmed); 417 + if (idx >= 0) history.splice(idx, 1); 418 + history.push(trimmed); 419 + historyIndex = history.length; 420 + } 421 + } catch (err) { 422 + term.write(`\x1b[31mfatal: ${err}\x1b[0m\r\n`); 423 + } finally { 424 + isRunningCommand = false; 425 + } 426 + } 427 + 428 + term.write(getPrompt()); 429 + cursorPos = 0; 430 + break; 431 + } 432 + 433 + case "\u007F": // Backspace 434 + if (cursorPos > 0) { 435 + currentLine = 436 + currentLine.slice(0, cursorPos - 1) + currentLine.slice(cursorPos); 437 + cursorPos--; 438 + await refreshPrompt(); 439 + } 440 + break; 441 + 442 + case "\x1b[3~": // Delete 443 + if (cursorPos < currentLine.length) { 444 + currentLine = 445 + currentLine.slice(0, cursorPos) + currentLine.slice(cursorPos + 1); 446 + await refreshPrompt(); 447 + } 448 + break; 449 + 450 + case "\u0003": // Ctrl+C 451 + currentLine = ""; 452 + cursorPos = 0; 453 + completionCandidates = []; 454 + searchState = "none"; 455 + term.write("^C\r\n" + getPrompt()); 456 + break; 457 + 458 + case "\u000C": // Ctrl+L 459 + term.clear(); 460 + break; 461 + 462 + case "\u0012": // Ctrl+R 463 + searchState = "history"; 464 + updateHistoryCandidates(); 465 + await refreshPrompt(); 466 + break; 467 + 468 + // NAVIGATION 469 + 470 + case "\x1b[D": // Left Arrow 471 + if (cursorPos > 0) { 472 + cursorPos--; 473 + term.write(e); // Local echo is fine for navigation 474 + } 475 + break; 476 + 477 + case "\x1b[C": // Right Arrow 478 + if (cursorPos < currentLine.length) { 479 + cursorPos++; 480 + term.write(e); 481 + } 482 + break; 483 + 484 + case "\x1b[1;5D": // Ctrl+Left 485 + case "\x1b\x1b[D": // Alt+Left 486 + { 487 + let p = cursorPos; 488 + while (p > 0 && currentLine[p - 1] === " ") p--; 489 + while (p > 0 && currentLine[p - 1] !== " ") p--; 490 + cursorPos = p; 491 + await refreshPrompt(); 492 + } 493 + break; 494 + 495 + case "\x1b[1;5C": // Ctrl+Right 496 + case "\x1b\x1b[C": // Alt+Right 497 + { 498 + let p = cursorPos; 499 + while (p < currentLine.length && currentLine[p] !== " ") p++; 500 + while (p < currentLine.length && currentLine[p] === " ") p++; 501 + cursorPos = p; 502 + await refreshPrompt(); 503 + } 504 + break; 505 + 506 + case "\x1b[A": // Up Arrow 507 + case "\x1b[1;5A": // Ctrl+Up 508 + // Cycle Completion 509 + if (completionCandidates.length > 0 && e === "\x1b[A") { 510 + completionIndex = 511 + (completionIndex - 1 + completionCandidates.length) % 512 + completionCandidates.length; 513 + const candidate = completionCandidates[completionIndex]; 514 + currentLine = getLineWithCompletion(completionBaseLine, candidate); 515 + cursorPos = currentLine.length; 516 + await refreshPrompt(); 517 + break; 518 + } 519 + 520 + // History 521 + if (e === "\x1b[A" || currentLine.length === 0) { 522 + if (historyIndex > 0) { 523 + historyIndex--; 524 + currentLine = history[historyIndex]; 525 + cursorPos = currentLine.length; 526 + await refreshPrompt(); 527 + } 528 + } else { 529 + cursorPos = 0; 530 + await refreshPrompt(); 531 + } 532 + break; 533 + 534 + case "\x1b[H": // Home 535 + cursorPos = 0; 536 + await refreshPrompt(); 537 + break; 538 + 539 + case "\x1b[B": // Down Arrow 540 + case "\x1b[1;5B": // Ctrl+Down 541 + // Cycle Completion 542 + if (completionCandidates.length > 0 && e === "\x1b[B") { 543 + completionIndex = (completionIndex + 1) % completionCandidates.length; 544 + const candidate = completionCandidates[completionIndex]; 545 + currentLine = getLineWithCompletion(completionBaseLine, candidate); 546 + cursorPos = currentLine.length; 547 + await refreshPrompt(); 548 + break; 549 + } 550 + 551 + // History 552 + if (e === "\x1b[B" || currentLine.length === 0) { 553 + if (historyIndex < history.length) { 554 + historyIndex++; 555 + if (historyIndex === history.length) { 556 + currentLine = ""; 557 + } else { 558 + currentLine = history[historyIndex]; 559 + } 560 + cursorPos = currentLine.length; 561 + await refreshPrompt(); 562 + } 563 + } else { 564 + cursorPos = currentLine.length; 565 + await refreshPrompt(); 566 + } 567 + break; 568 + 569 + case "\x1b[F": // End 570 + cursorPos = currentLine.length; 571 + await refreshPrompt(); 572 + break; 573 + 574 + case "\t": // Tab 575 + try { 576 + if (completionCandidates.length > 0) { 577 + completionIndex = 578 + (completionIndex + 1) % completionCandidates.length; 579 + 580 + const candidate = completionCandidates[completionIndex]; 581 + currentLine = getLineWithCompletion(completionBaseLine, candidate); 582 + await refreshPrompt(); 583 + } else { 584 + // Guard: ensure worker is ready 585 + if (!isWorkerReady) return; 586 + 587 + const json = await callWorker("completion", { 588 + line: currentLine, 589 + cursor: cursorPos, 590 + }); 591 + const candidates: Candidate[] = JSON.parse(json); 592 + 593 + if (candidates.length === 1) { 594 + const candidate = candidates[0]; 595 + applyCompletion(candidate); 596 + await refreshPrompt(); 597 + } else if (candidates.length > 1) { 598 + completionCandidates = candidates; 599 + completionIndex = 0; 600 + searchState = "completion"; 601 + completionBaseLine = currentLine; 602 + await refreshPrompt(); 603 + } 604 + } 605 + } catch (err) { 606 + // ignore 607 + } 608 + break; 609 + 610 + case "\x1b[Z": // Shift+Tab 611 + if (completionCandidates.length > 0) { 612 + completionIndex = 613 + (completionIndex - 1 + completionCandidates.length) % 614 + completionCandidates.length; 615 + const candidate = completionCandidates[completionIndex]; 616 + currentLine = getLineWithCompletion(completionBaseLine, candidate); 617 + cursorPos = currentLine.length; 618 + await refreshPrompt(); 619 + } 620 + break; 621 + 622 + default: 623 + // Typing 624 + if (e >= " " && e <= "~") { 625 + if (cursorPos === currentLine.length) { 626 + currentLine += e; 627 + cursorPos++; 628 + } else { 629 + currentLine = 630 + currentLine.slice(0, cursorPos) + 631 + e + 632 + currentLine.slice(cursorPos); 633 + cursorPos++; 634 + } 635 + await refreshPrompt(); 636 + } 637 + } 638 + }); 639 + 640 + window.addEventListener("resize", () => fitAddon.fit()); 641 + 642 + await readyPromise; 643 + 644 + await callWorker("run", "open welcome.txt"); 645 + 646 + term.write(getPrompt()); 647 + 648 + callWorker("get_pwd") 649 + .then((pwd) => { 650 + cachedPwd = pwd; 651 + // Re-render prompt to show "ready" state (yellow path) and enable highlighting 652 + refreshPrompt(); 653 + }) 654 + .catch((e) => { 655 + term.write(`\r\n\x1b[31mfatal: failed to load engine: ${e}\x1b[0m\r\n`); 656 + }); 657 + } 658 + 659 + bootstrap().catch(console.error);
+13
www/src/style.css
··· 1 + body { 2 + margin: 0; 3 + padding: 0; 4 + background-color: #000000; 5 + height: 100vh; 6 + width: 100vw; 7 + overflow: hidden; 8 + } 9 + 10 + #terminal { 11 + height: 100vh; 12 + width: 100vw; 13 + }
+54
www/src/worker.ts
··· 1 + import init, { 2 + init_engine, 3 + run_command, 4 + completion, 5 + highlight, 6 + get_pwd_string, 7 + register_console_callback, 8 + register_task_count_callback, 9 + } from "../../pkg"; 10 + 11 + // Initialize WASM 12 + await init(); 13 + init_engine(); 14 + 15 + // Setup Callbacks to proxy messages back to Main Thread 16 + register_console_callback((msg: string, isCmd: boolean) => { 17 + self.postMessage({ type: "console", payload: { msg, isCmd } }); 18 + }); 19 + 20 + register_task_count_callback((count: number) => { 21 + self.postMessage({ type: "task_count", payload: count }); 22 + }); 23 + 24 + // Handle messages from Main Thread 25 + self.onmessage = (e) => { 26 + const { id, type, payload } = e.data; 27 + 28 + // console.log("Received message:", id, type, payload); 29 + 30 + try { 31 + let result; 32 + switch (type) { 33 + case "run": 34 + result = run_command(payload); 35 + break; 36 + case "completion": 37 + result = completion(payload.line, payload.cursor); 38 + break; 39 + case "highlight": 40 + result = highlight(payload); 41 + break; 42 + case "get_pwd": 43 + result = get_pwd_string(); 44 + break; 45 + default: 46 + throw new Error(`Unknown message type: ${type}`); 47 + } 48 + self.postMessage({ id, type: `${type}_result`, payload: result }); 49 + } catch (err) { 50 + self.postMessage({ id, type: "error", payload: String(err) }); 51 + } 52 + }; 53 + 54 + self.postMessage({ type: "initialized", payload: true });
+26
www/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "useDefineForClassFields": true, 5 + "module": "ESNext", 6 + "lib": ["ES2022", "DOM", "DOM.Iterable"], 7 + "types": ["vite/client"], 8 + "skipLibCheck": true, 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "verbatimModuleSyntax": true, 14 + "moduleDetection": "force", 15 + "noEmit": true, 16 + 17 + /* Linting */ 18 + "strict": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "erasableSyntaxOnly": true, 22 + "noFallthroughCasesInSwitch": true, 23 + "noUncheckedSideEffectImports": true 24 + }, 25 + "include": ["src"] 26 + }
+16
www/vite.config.ts
··· 1 + import { defineConfig } from "vite"; 2 + import wasm from "vite-plugin-wasm"; 3 + import topLevelAwait from "vite-plugin-top-level-await"; 4 + 5 + export default defineConfig({ 6 + plugins: [wasm(), topLevelAwait()], 7 + worker: { 8 + format: "es", 9 + plugins: () => [wasm(), topLevelAwait()], 10 + }, 11 + server: { 12 + fs: { 13 + allow: [".."], 14 + }, 15 + }, 16 + });