Bevy+Ratutui powered Monitoring of Pico-Strike devices
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Noise Protocol and module reorg

+1360 -719
+1
.gitignore
··· 1 1 /target 2 + striker-config.toml
+791 -360
Cargo.lock
··· 24 24 checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 25 25 26 26 [[package]] 27 + name = "aead" 28 + version = "0.5.2" 29 + source = "registry+https://github.com/rust-lang/crates.io-index" 30 + checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 31 + dependencies = [ 32 + "crypto-common", 33 + "generic-array", 34 + ] 35 + 36 + [[package]] 27 37 name = "aho-corasick" 28 38 version = "1.1.4" 29 39 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 45 55 checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 46 56 dependencies = [ 47 57 "android-properties", 48 - "bitflags 2.10.0", 58 + "bitflags 2.11.0", 49 59 "cc", 50 60 "cesu8", 51 61 "jni", ··· 73 83 74 84 [[package]] 75 85 name = "anyhow" 76 - version = "1.0.100" 86 + version = "1.0.102" 77 87 source = "registry+https://github.com/rust-lang/crates.io-index" 78 - checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 88 + checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 79 89 80 90 [[package]] 81 91 name = "approx" ··· 100 110 dependencies = [ 101 111 "proc-macro2", 102 112 "quote", 103 - "syn 2.0.114", 113 + "syn 2.0.117", 104 114 ] 105 115 106 116 [[package]] ··· 117 127 118 128 [[package]] 119 129 name = "async-executor" 120 - version = "1.13.3" 130 + version = "1.14.0" 121 131 source = "registry+https://github.com/rust-lang/crates.io-index" 122 - checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" 132 + checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" 123 133 dependencies = [ 124 134 "async-task", 125 135 "concurrent-queue", ··· 196 206 ] 197 207 198 208 [[package]] 209 + name = "backtrace-ext" 210 + version = "0.2.1" 211 + source = "registry+https://github.com/rust-lang/crates.io-index" 212 + checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" 213 + dependencies = [ 214 + "backtrace", 215 + ] 216 + 217 + [[package]] 199 218 name = "base64" 200 219 version = "0.22.1" 201 220 source = "registry+https://github.com/rust-lang/crates.io-index" 202 221 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 203 222 204 223 [[package]] 224 + name = "base64ct" 225 + version = "1.8.3" 226 + source = "registry+https://github.com/rust-lang/crates.io-index" 227 + checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 228 + 229 + [[package]] 205 230 name = "bevy" 206 - version = "0.18.0" 231 + version = "0.18.1" 207 232 source = "registry+https://github.com/rust-lang/crates.io-index" 208 - checksum = "ec689b5a79452b6f777b889bbff22d3216b82a8d2ab7814d4a0eb571e9938d97" 233 + checksum = "1fd310426290cec560221f9750c2f4484be4a8eeea7de3483c423329b465c40e" 209 234 dependencies = [ 210 235 "bevy_internal", 211 236 ] 212 237 213 238 [[package]] 214 239 name = "bevy_a11y" 215 - version = "0.18.0" 240 + version = "0.18.1" 216 241 source = "registry+https://github.com/rust-lang/crates.io-index" 217 - checksum = "ef69b6d2dec07cbf407c63f6987e1746e4b735a9beea51f4bfc25ad49e344f75" 242 + checksum = "e887b25c84f384ffe3278a17cf0e4b405eaa3c8fbc3db24d05d560a11780676d" 218 243 dependencies = [ 219 244 "accesskit", 220 245 "bevy_app", ··· 225 250 226 251 [[package]] 227 252 name = "bevy_android" 228 - version = "0.18.0" 253 + version = "0.18.1" 229 254 source = "registry+https://github.com/rust-lang/crates.io-index" 230 - checksum = "008133458cfe0d43a8870bfc4c5a729467cc5d9246611462add38bcf45ed896f" 255 + checksum = "a8c58de772ac1148884112e8a456c4f127a94b95a0e42ab5b160b7a11895a241" 231 256 dependencies = [ 232 257 "android-activity", 233 258 ] 234 259 235 260 [[package]] 236 261 name = "bevy_app" 237 - version = "0.18.0" 262 + version = "0.18.1" 238 263 source = "registry+https://github.com/rust-lang/crates.io-index" 239 - checksum = "2271a0123a7cc355c3fe98754360c75aa84b29f2a6b1a9f8c00aac427570d174" 264 + checksum = "def9f41aa5bf9b9dec8beda307a332798609cffb9d44f71005e0cfb45164f2f6" 240 265 dependencies = [ 241 266 "bevy_derive", 242 267 "bevy_ecs", ··· 249 274 "ctrlc", 250 275 "downcast-rs", 251 276 "log", 252 - "thiserror 2.0.17", 277 + "thiserror 2.0.18", 253 278 "variadics_please", 254 279 "wasm-bindgen", 255 280 "web-sys", ··· 257 282 258 283 [[package]] 259 284 name = "bevy_color" 260 - version = "0.18.0" 285 + version = "0.18.1" 261 286 source = "registry+https://github.com/rust-lang/crates.io-index" 262 - checksum = "74727302424d7ffc23528a974dbb44a34708662926e1a3bfc5040493f858886e" 287 + checksum = "2eb41e8310a85811d14a4e75cfc2d6c07ac70661d6a4883509fc960f622970a8" 263 288 dependencies = [ 264 289 "bevy_math", 265 290 "bevy_reflect", 266 291 "bytemuck", 267 292 "derive_more", 268 293 "serde", 269 - "thiserror 2.0.17", 294 + "thiserror 2.0.18", 270 295 "wgpu-types", 271 296 ] 272 297 273 298 [[package]] 274 299 name = "bevy_derive" 275 - version = "0.18.0" 300 + version = "0.18.1" 276 301 source = "registry+https://github.com/rust-lang/crates.io-index" 277 - checksum = "70b6a05c31f54c83d681f1b8699bbaf581f06b25a40c9a6bb815625f731f5ba9" 302 + checksum = "318ee0532c3da93749859d18f89a889c638fbc56aabac4d866583df7b951d103" 278 303 dependencies = [ 279 304 "bevy_macro_utils", 280 305 "quote", 281 - "syn 2.0.114", 306 + "syn 2.0.117", 282 307 ] 283 308 284 309 [[package]] 285 310 name = "bevy_diagnostic" 286 - version = "0.18.0" 311 + version = "0.18.1" 287 312 source = "registry+https://github.com/rust-lang/crates.io-index" 288 - checksum = "aca4caa8a9014a435dca382b1bdebaee4363e9be69882c598fc4ff4d7cd56e6a" 313 + checksum = "ec8543a0f7afd56d3499ba80ffab6ef0bad12f93c2d2ca9aa7b1f1b8816c3980" 289 314 dependencies = [ 290 315 "atomic-waker", 291 316 "bevy_app", ··· 300 325 301 326 [[package]] 302 327 name = "bevy_ecs" 303 - version = "0.18.0" 328 + version = "0.18.1" 304 329 source = "registry+https://github.com/rust-lang/crates.io-index" 305 - checksum = "24637a7c8643cab493f4085cda6bde4895f0e0816699c59006f18819da2ca0b8" 330 + checksum = "c9cf7a3ee41342dd7b5a5d82e200d0e8efb933169247fce853b4ad633d51e87d" 306 331 dependencies = [ 307 332 "arrayvec", 308 333 "bevy_ecs_macros", ··· 311 336 "bevy_reflect", 312 337 "bevy_tasks", 313 338 "bevy_utils", 314 - "bitflags 2.10.0", 339 + "bitflags 2.11.0", 315 340 "bumpalo", 316 341 "concurrent-queue", 317 342 "derive_more", ··· 322 347 "serde", 323 348 "slotmap", 324 349 "smallvec", 325 - "thiserror 2.0.17", 350 + "thiserror 2.0.18", 326 351 "variadics_please", 327 352 ] 328 353 329 354 [[package]] 330 355 name = "bevy_ecs_macros" 331 - version = "0.18.0" 356 + version = "0.18.1" 332 357 source = "registry+https://github.com/rust-lang/crates.io-index" 333 - checksum = "6eb14c18ca71e11c69fbae873c2db129064efac6d52e48d0127d37bfba1acfa8" 358 + checksum = "908baf585e2ea16bd53ef0da57b69580478af0059d2dbdb4369991ac9794b618" 334 359 dependencies = [ 335 360 "bevy_macro_utils", 336 361 "proc-macro2", 337 362 "quote", 338 - "syn 2.0.114", 363 + "syn 2.0.117", 339 364 ] 340 365 341 366 [[package]] 342 367 name = "bevy_input" 343 - version = "0.18.0" 368 + version = "0.18.1" 344 369 source = "registry+https://github.com/rust-lang/crates.io-index" 345 - checksum = "9c2853993baf27b963a417d3603a73e02e39c5041913cd1ba7211b0a3037b191" 370 + checksum = "dbc8ffbd02df34dfc52faf420a5263985973765e228043adf542fd0d790a6b21" 346 371 dependencies = [ 347 372 "bevy_app", 348 373 "bevy_ecs", ··· 351 376 "bevy_reflect", 352 377 "derive_more", 353 378 "log", 354 - "thiserror 2.0.17", 379 + "thiserror 2.0.18", 355 380 ] 356 381 357 382 [[package]] 358 383 name = "bevy_input_focus" 359 - version = "0.18.0" 384 + version = "0.18.1" 360 385 source = "registry+https://github.com/rust-lang/crates.io-index" 361 - checksum = "05fc0fae5e4e081180f7f7bf8023a2b97dad13dcb5fa79eba50cda5bb95699a9" 386 + checksum = "08d48a5bceccb9157549a39ab3de4017f5368b65db6471605e9a3f1c19d91bbc" 362 387 dependencies = [ 363 388 "bevy_app", 364 389 "bevy_ecs", ··· 367 392 "bevy_reflect", 368 393 "bevy_window", 369 394 "log", 370 - "thiserror 2.0.17", 395 + "thiserror 2.0.18", 371 396 ] 372 397 373 398 [[package]] 374 399 name = "bevy_internal" 375 - version = "0.18.0" 400 + version = "0.18.1" 376 401 source = "registry+https://github.com/rust-lang/crates.io-index" 377 - checksum = "57463815630ea71221c0b8e7bff72d816a3071a89507c45f9e2686fbb5e1956b" 402 + checksum = "6a11df62e49897def470471551c02f13c6fb488e55dddb5ab7ef098132e07754" 378 403 dependencies = [ 379 404 "bevy_a11y", 380 405 "bevy_android", ··· 399 424 400 425 [[package]] 401 426 name = "bevy_log" 402 - version = "0.18.0" 427 + version = "0.18.1" 403 428 source = "registry+https://github.com/rust-lang/crates.io-index" 404 - checksum = "406304a9b867a2de98c3edf0cc9e5a608fad1a1ddc567e15e72c186a8273ef51" 429 + checksum = "c2aac1187f83a1ab2eae887564f7fb14b4abb3fbe8b2267a6426663463923120" 405 430 dependencies = [ 406 431 "android_log-sys", 407 432 "bevy_app", ··· 417 442 418 443 [[package]] 419 444 name = "bevy_macro_utils" 420 - version = "0.18.0" 445 + version = "0.18.1" 421 446 source = "registry+https://github.com/rust-lang/crates.io-index" 422 - checksum = "0b7272fca0bf30d8ca2571a803598856104b63e5c596d52850f811ed37c5e1e3" 447 + checksum = "3b147843b81a7ec548876ff97fa7bfdc646ef2567cb465566259237b39664438" 423 448 dependencies = [ 424 449 "proc-macro2", 425 450 "quote", 426 - "syn 2.0.114", 427 - "toml_edit", 451 + "syn 2.0.117", 452 + "toml_edit 0.23.10+spec-1.0.0", 428 453 ] 429 454 430 455 [[package]] 431 456 name = "bevy_math" 432 - version = "0.18.0" 457 + version = "0.18.1" 433 458 source = "registry+https://github.com/rust-lang/crates.io-index" 434 - checksum = "6a815c514b8a6f7b11508cdc8b3a4bf0761e96a14227af40aa93cb1160989ce0" 459 + checksum = "e931fa969f89c83498b22c97432383afe90e90fd1a5e04fa07be8da4d3bcac84" 435 460 dependencies = [ 436 461 "approx", 437 462 "arrayvec", 438 463 "bevy_reflect", 439 464 "derive_more", 440 465 "glam", 441 - "itertools 0.14.0", 466 + "itertools", 442 467 "libm", 443 468 "rand 0.9.2", 444 469 "rand_distr", 445 470 "serde", 446 - "thiserror 2.0.17", 471 + "thiserror 2.0.18", 447 472 "variadics_please", 448 473 ] 449 474 450 475 [[package]] 451 476 name = "bevy_platform" 452 - version = "0.18.0" 477 + version = "0.18.1" 453 478 source = "registry+https://github.com/rust-lang/crates.io-index" 454 - checksum = "9b29ea749a8e85f98186ab662f607b885b97c804bb14cdb0cdf838164496d474" 479 + checksum = "ec6b36504169b644acd26a5469fd8d371aa6f1d73ee5c01b1b1181ae1cefbf9b" 455 480 dependencies = [ 456 481 "critical-section", 457 - "foldhash", 482 + "foldhash 0.2.0", 458 483 "futures-channel", 459 - "hashbrown", 484 + "hashbrown 0.16.1", 460 485 "js-sys", 461 486 "portable-atomic", 462 487 "portable-atomic-util", ··· 469 494 470 495 [[package]] 471 496 name = "bevy_ptr" 472 - version = "0.18.0" 497 + version = "0.18.1" 473 498 source = "registry+https://github.com/rust-lang/crates.io-index" 474 - checksum = "4f98cbc6d34bbdb58240b72ed1731931b4991a893b3a3238bb7c42ae054aa676" 499 + checksum = "c7a9329e8dc4e01ced480eeec4902e6d7cb56e56ec37f6fbc4323e5c937290a7" 475 500 476 501 [[package]] 477 502 name = "bevy_ratatui" ··· 480 505 checksum = "e24368df4cff95c92448a33c46f7db4ff51016a3024d27bd2daa49d0e3ce03f4" 481 506 dependencies = [ 482 507 "bevy", 483 - "bitflags 2.10.0", 508 + "bitflags 2.11.0", 484 509 "color-eyre", 485 510 "ratatui", 486 511 "tracing", ··· 488 513 489 514 [[package]] 490 515 name = "bevy_reflect" 491 - version = "0.18.0" 516 + version = "0.18.1" 492 517 source = "registry+https://github.com/rust-lang/crates.io-index" 493 - checksum = "2b2a977e2b8dba65b6e9c11039c5f9ef108be428f036b3d1cac13ad86ec59f9c" 518 + checksum = "d1dfeb67a9fe4f59003a84f5f99ba6302141c70e926601cbc6abfd4a1eea9ca9" 494 519 dependencies = [ 495 520 "assert_type_match", 496 521 "bevy_platform", ··· 501 526 "disqualified", 502 527 "downcast-rs", 503 528 "erased-serde", 504 - "foldhash", 529 + "foldhash 0.2.0", 505 530 "glam", 506 531 "indexmap", 507 532 "serde", 508 533 "smallvec", 509 534 "smol_str", 510 - "thiserror 2.0.17", 535 + "thiserror 2.0.18", 511 536 "uuid", 512 537 "variadics_please", 513 538 "wgpu-types", ··· 515 540 516 541 [[package]] 517 542 name = "bevy_reflect_derive" 518 - version = "0.18.0" 543 + version = "0.18.1" 519 544 source = "registry+https://github.com/rust-lang/crates.io-index" 520 - checksum = "067af30072b1611fda1a577f1cb678b8ea2c9226133068be808dd49aac30cef0" 545 + checksum = "475f68c93e9cd5f17e9167635c8533a4f388f12d38245a202359e4c2721d87ba" 521 546 dependencies = [ 522 547 "bevy_macro_utils", 523 548 "indexmap", 524 549 "proc-macro2", 525 550 "quote", 526 - "syn 2.0.114", 551 + "syn 2.0.117", 527 552 "uuid", 528 553 ] 529 554 530 555 [[package]] 531 556 name = "bevy_state" 532 - version = "0.18.0" 557 + version = "0.18.1" 533 558 source = "registry+https://github.com/rust-lang/crates.io-index" 534 - checksum = "9453325ca0c185a043f4515158daa15a8ab19139a60fd1edaf87fbe896cb7f83" 559 + checksum = "0ae0682968e97d29c1eccc8c6bb6283f2678d362779bc03f1bb990967059473b" 535 560 dependencies = [ 536 561 "bevy_app", 537 562 "bevy_ecs", ··· 545 570 546 571 [[package]] 547 572 name = "bevy_state_macros" 548 - version = "0.18.0" 573 + version = "0.18.1" 549 574 source = "registry+https://github.com/rust-lang/crates.io-index" 550 - checksum = "d733081e57e49b3c43bdf3766d1de74c7df32e0f4db20c20437c85b1d18908de" 575 + checksum = "73d32f90f9cfcef5a44401db7ce206770daaa1707b0fb95eb7a96a6933f54f1b" 551 576 dependencies = [ 552 577 "bevy_macro_utils", 553 578 "quote", 554 - "syn 2.0.114", 579 + "syn 2.0.117", 555 580 ] 556 581 557 582 [[package]] 558 583 name = "bevy_tasks" 559 - version = "0.18.0" 584 + version = "0.18.1" 560 585 source = "registry+https://github.com/rust-lang/crates.io-index" 561 - checksum = "990ffedd374dd2c4fe8f0fd4bcefd5617d1ee59164b6c3fcc356a69b48e26e8e" 586 + checksum = "384eb04d80aa38664d69988fd30cbbe03e937ecb65c66aa6abe60ce0bca826aa" 562 587 dependencies = [ 563 588 "async-channel", 564 589 "async-executor", ··· 575 600 576 601 [[package]] 577 602 name = "bevy_time" 578 - version = "0.18.0" 603 + version = "0.18.1" 579 604 source = "registry+https://github.com/rust-lang/crates.io-index" 580 - checksum = "e4c68b78e7ca1cc10c811cd1ded8350f53f2be11eb46946879a74c684026bff7" 605 + checksum = "b5ef9af4e523195e561074cf60fbfad0f4cb8d1db504855fee3c4ce8896c7244" 581 606 dependencies = [ 582 607 "bevy_app", 583 608 "bevy_ecs", ··· 590 615 591 616 [[package]] 592 617 name = "bevy_transform" 593 - version = "0.18.0" 618 + version = "0.18.1" 594 619 source = "registry+https://github.com/rust-lang/crates.io-index" 595 - checksum = "b30e3957de42c2f7d88dfe8428e739b74deab8932d2a8bbb9d4eefbd64b6aa34" 620 + checksum = "3c3bb3de7842fef699344beb03f22bdbff16599d788fe0f47fbb3b1e6fa320eb" 596 621 dependencies = [ 597 622 "bevy_app", 598 623 "bevy_ecs", ··· 603 628 "bevy_utils", 604 629 "derive_more", 605 630 "serde", 606 - "thiserror 2.0.17", 631 + "thiserror 2.0.18", 607 632 ] 608 633 609 634 [[package]] 610 635 name = "bevy_utils" 611 - version = "0.18.0" 636 + version = "0.18.1" 612 637 source = "registry+https://github.com/rust-lang/crates.io-index" 613 - checksum = "e258c44d869f9c41ac0f88a16815c67f2569eb9fff4716828a40273d127b6f84" 638 + checksum = "2111910cd7a4b1e6ce07eaaeb6f68a2c0ea0ca609ed0d0d506e3eb161101435b" 614 639 dependencies = [ 615 640 "bevy_platform", 616 641 "disqualified", ··· 619 644 620 645 [[package]] 621 646 name = "bevy_window" 622 - version = "0.18.0" 647 + version = "0.18.1" 623 648 source = "registry+https://github.com/rust-lang/crates.io-index" 624 - checksum = "869a56f1da2544641734018e1f1caa660299cd6e3af794f3fa0df72293d8eed2" 649 + checksum = "6df06e6993a0896bae2fe7644ae6def29a1a92b45dfb1bcebbd92af782be3638" 625 650 dependencies = [ 626 651 "bevy_app", 627 652 "bevy_ecs", ··· 657 682 658 683 [[package]] 659 684 name = "bitflags" 660 - version = "2.10.0" 685 + version = "2.11.0" 661 686 source = "registry+https://github.com/rust-lang/crates.io-index" 662 - checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 687 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 663 688 dependencies = [ 664 689 "serde_core", 665 690 ] 666 691 667 692 [[package]] 693 + name = "blake2" 694 + version = "0.10.6" 695 + source = "registry+https://github.com/rust-lang/crates.io-index" 696 + checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" 697 + dependencies = [ 698 + "digest", 699 + ] 700 + 701 + [[package]] 668 702 name = "block-buffer" 669 703 version = "0.10.4" 670 704 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 684 718 685 719 [[package]] 686 720 name = "bumpalo" 687 - version = "3.19.1" 721 + version = "3.20.2" 688 722 source = "registry+https://github.com/rust-lang/crates.io-index" 689 - checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" 723 + checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" 690 724 691 725 [[package]] 692 726 name = "bytemuck" 693 - version = "1.24.0" 727 + version = "1.25.0" 694 728 source = "registry+https://github.com/rust-lang/crates.io-index" 695 - checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" 729 + checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" 696 730 dependencies = [ 697 731 "bytemuck_derive", 698 732 ] ··· 705 739 dependencies = [ 706 740 "proc-macro2", 707 741 "quote", 708 - "syn 2.0.114", 742 + "syn 2.0.117", 709 743 ] 710 744 711 745 [[package]] ··· 716 750 717 751 [[package]] 718 752 name = "bytes" 719 - version = "1.11.0" 753 + version = "1.11.1" 720 754 source = "registry+https://github.com/rust-lang/crates.io-index" 721 - checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" 755 + checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 722 756 723 757 [[package]] 724 758 name = "castaway" ··· 731 765 732 766 [[package]] 733 767 name = "cc" 734 - version = "1.2.52" 768 + version = "1.2.57" 735 769 source = "registry+https://github.com/rust-lang/crates.io-index" 736 - checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" 770 + checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" 737 771 dependencies = [ 738 772 "find-msvc-tools", 739 773 "jobserver", ··· 760 794 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 761 795 762 796 [[package]] 797 + name = "chacha20" 798 + version = "0.9.1" 799 + source = "registry+https://github.com/rust-lang/crates.io-index" 800 + checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 801 + dependencies = [ 802 + "cfg-if", 803 + "cipher", 804 + "cpufeatures", 805 + ] 806 + 807 + [[package]] 808 + name = "chacha20poly1305" 809 + version = "0.10.1" 810 + source = "registry+https://github.com/rust-lang/crates.io-index" 811 + checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" 812 + dependencies = [ 813 + "aead", 814 + "chacha20", 815 + "cipher", 816 + "poly1305", 817 + "zeroize", 818 + ] 819 + 820 + [[package]] 821 + name = "cipher" 822 + version = "0.4.4" 823 + source = "registry+https://github.com/rust-lang/crates.io-index" 824 + checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 825 + dependencies = [ 826 + "crypto-common", 827 + "inout", 828 + "zeroize", 829 + ] 830 + 831 + [[package]] 763 832 name = "cobs" 764 833 version = "0.3.0" 765 834 source = "registry+https://github.com/rust-lang/crates.io-index" 766 835 checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 767 836 dependencies = [ 768 - "thiserror 2.0.17", 837 + "thiserror 2.0.18", 769 838 ] 770 839 771 840 [[package]] ··· 855 924 ] 856 925 857 926 [[package]] 858 - name = "cordyceps" 859 - version = "0.3.4" 860 - source = "registry+https://github.com/rust-lang/crates.io-index" 861 - checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 862 - dependencies = [ 863 - "loom", 864 - "tracing", 865 - ] 866 - 867 - [[package]] 868 927 name = "cpufeatures" 869 928 version = "0.2.17" 870 929 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 909 968 source = "registry+https://github.com/rust-lang/crates.io-index" 910 969 checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" 911 970 dependencies = [ 912 - "bitflags 2.10.0", 971 + "bitflags 2.11.0", 913 972 "crossterm_winapi", 914 973 "derive_more", 915 974 "document-features", ··· 952 1011 953 1012 [[package]] 954 1013 name = "ctrlc" 955 - version = "3.5.1" 1014 + version = "3.5.2" 956 1015 source = "registry+https://github.com/rust-lang/crates.io-index" 957 - checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" 1016 + checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" 958 1017 dependencies = [ 959 1018 "dispatch2", 960 - "nix 0.30.1", 1019 + "nix 0.31.2", 961 1020 "windows-sys 0.61.2", 962 1021 ] 963 1022 964 1023 [[package]] 1024 + name = "curve25519-dalek" 1025 + version = "4.1.3" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 1028 + dependencies = [ 1029 + "cfg-if", 1030 + "cpufeatures", 1031 + "curve25519-dalek-derive", 1032 + "fiat-crypto", 1033 + "rustc_version", 1034 + "subtle", 1035 + ] 1036 + 1037 + [[package]] 1038 + name = "curve25519-dalek-derive" 1039 + version = "0.1.1" 1040 + source = "registry+https://github.com/rust-lang/crates.io-index" 1041 + checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" 1042 + dependencies = [ 1043 + "proc-macro2", 1044 + "quote", 1045 + "syn 2.0.117", 1046 + ] 1047 + 1048 + [[package]] 965 1049 name = "darling" 966 1050 version = "0.23.0" 967 1051 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 981 1065 "proc-macro2", 982 1066 "quote", 983 1067 "strsim", 984 - "syn 2.0.114", 1068 + "syn 2.0.117", 985 1069 ] 986 1070 987 1071 [[package]] ··· 992 1076 dependencies = [ 993 1077 "darling_core", 994 1078 "quote", 995 - "syn 2.0.114", 1079 + "syn 2.0.117", 996 1080 ] 997 1081 998 1082 [[package]] ··· 1003 1087 1004 1088 [[package]] 1005 1089 name = "deranged" 1006 - version = "0.5.5" 1090 + version = "0.5.8" 1007 1091 source = "registry+https://github.com/rust-lang/crates.io-index" 1008 - checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" 1092 + checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" 1009 1093 dependencies = [ 1010 1094 "powerfmt", 1011 1095 ] ··· 1029 1113 "proc-macro2", 1030 1114 "quote", 1031 1115 "rustc_version", 1032 - "syn 2.0.114", 1116 + "syn 2.0.117", 1033 1117 "unicode-xid", 1034 1118 ] 1035 1119 1036 1120 [[package]] 1037 - name = "diatomic-waker" 1038 - version = "0.2.3" 1039 - source = "registry+https://github.com/rust-lang/crates.io-index" 1040 - checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 1041 - 1042 - [[package]] 1043 1121 name = "digest" 1044 1122 version = "0.10.7" 1045 1123 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1047 1125 dependencies = [ 1048 1126 "block-buffer", 1049 1127 "crypto-common", 1128 + "subtle", 1050 1129 ] 1051 1130 1052 1131 [[package]] 1053 1132 name = "dispatch2" 1054 - version = "0.3.0" 1133 + version = "0.3.1" 1055 1134 source = "registry+https://github.com/rust-lang/crates.io-index" 1056 - checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 1135 + checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" 1057 1136 dependencies = [ 1058 - "bitflags 2.10.0", 1137 + "bitflags 2.11.0", 1059 1138 "block2", 1060 1139 "libc", 1061 1140 "objc2", ··· 1108 1187 1109 1188 [[package]] 1110 1189 name = "erased-serde" 1111 - version = "0.4.9" 1190 + version = "0.4.10" 1112 1191 source = "registry+https://github.com/rust-lang/crates.io-index" 1113 - checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 1192 + checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" 1114 1193 dependencies = [ 1115 1194 "serde", 1116 1195 "serde_core", ··· 1129 1208 1130 1209 [[package]] 1131 1210 name = "euclid" 1132 - version = "0.22.11" 1211 + version = "0.22.13" 1133 1212 source = "registry+https://github.com/rust-lang/crates.io-index" 1134 - checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 1213 + checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" 1135 1214 dependencies = [ 1136 1215 "num-traits", 1137 1216 ] ··· 1184 1263 checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1185 1264 1186 1265 [[package]] 1266 + name = "fiat-crypto" 1267 + version = "0.2.9" 1268 + source = "registry+https://github.com/rust-lang/crates.io-index" 1269 + checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 1270 + 1271 + [[package]] 1187 1272 name = "filedescriptor" 1188 1273 version = "0.8.3" 1189 1274 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1196 1281 1197 1282 [[package]] 1198 1283 name = "find-msvc-tools" 1199 - version = "0.1.7" 1284 + version = "0.1.9" 1200 1285 source = "registry+https://github.com/rust-lang/crates.io-index" 1201 - checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" 1286 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 1202 1287 1203 1288 [[package]] 1204 1289 name = "finl_unicode" ··· 1226 1311 1227 1312 [[package]] 1228 1313 name = "foldhash" 1229 - version = "0.2.0" 1314 + version = "0.1.5" 1230 1315 source = "registry+https://github.com/rust-lang/crates.io-index" 1231 - checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" 1316 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1232 1317 1233 1318 [[package]] 1234 - name = "futures-buffered" 1235 - version = "0.2.12" 1319 + name = "foldhash" 1320 + version = "0.2.0" 1236 1321 source = "registry+https://github.com/rust-lang/crates.io-index" 1237 - checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" 1238 - dependencies = [ 1239 - "cordyceps", 1240 - "diatomic-waker", 1241 - "futures-core", 1242 - "pin-project-lite", 1243 - "spin", 1244 - ] 1322 + checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" 1245 1323 1246 1324 [[package]] 1247 1325 name = "futures-channel" 1248 - version = "0.3.31" 1326 + version = "0.3.32" 1249 1327 source = "registry+https://github.com/rust-lang/crates.io-index" 1250 - checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1328 + checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 1251 1329 dependencies = [ 1252 1330 "futures-core", 1253 1331 ] 1254 1332 1255 1333 [[package]] 1256 1334 name = "futures-concurrency" 1257 - version = "7.6.3" 1335 + version = "7.7.1" 1258 1336 source = "registry+https://github.com/rust-lang/crates.io-index" 1259 - checksum = "0eb68017df91f2e477ed4bea586c59eaecaa47ed885a770d0444e21e62572cd2" 1337 + checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" 1260 1338 dependencies = [ 1261 1339 "fixedbitset 0.5.7", 1262 - "futures-buffered", 1263 1340 "futures-core", 1264 1341 "futures-lite", 1265 1342 "pin-project", 1266 - "slab", 1267 1343 "smallvec", 1268 1344 ] 1269 1345 1270 1346 [[package]] 1271 1347 name = "futures-core" 1272 - version = "0.3.31" 1348 + version = "0.3.32" 1273 1349 source = "registry+https://github.com/rust-lang/crates.io-index" 1274 - checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1350 + checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 1275 1351 1276 1352 [[package]] 1277 1353 name = "futures-io" 1278 - version = "0.3.31" 1354 + version = "0.3.32" 1279 1355 source = "registry+https://github.com/rust-lang/crates.io-index" 1280 - checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1356 + checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 1281 1357 1282 1358 [[package]] 1283 1359 name = "futures-lite" ··· 1293 1369 ] 1294 1370 1295 1371 [[package]] 1296 - name = "generator" 1297 - version = "0.8.8" 1372 + name = "futures-task" 1373 + version = "0.3.32" 1298 1374 source = "registry+https://github.com/rust-lang/crates.io-index" 1299 - checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" 1375 + checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 1376 + 1377 + [[package]] 1378 + name = "futures-util" 1379 + version = "0.3.32" 1380 + source = "registry+https://github.com/rust-lang/crates.io-index" 1381 + checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 1300 1382 dependencies = [ 1301 - "cc", 1302 - "cfg-if", 1303 - "libc", 1304 - "log", 1305 - "rustversion", 1306 - "windows-link", 1307 - "windows-result", 1383 + "futures-core", 1384 + "futures-task", 1385 + "pin-project-lite", 1386 + "slab", 1308 1387 ] 1309 1388 1310 1389 [[package]] ··· 1325 1404 dependencies = [ 1326 1405 "cfg-if", 1327 1406 "libc", 1328 - "r-efi", 1407 + "r-efi 5.3.0", 1329 1408 "wasip2", 1330 1409 ] 1331 1410 1332 1411 [[package]] 1412 + name = "getrandom" 1413 + version = "0.4.2" 1414 + source = "registry+https://github.com/rust-lang/crates.io-index" 1415 + checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 1416 + dependencies = [ 1417 + "cfg-if", 1418 + "libc", 1419 + "r-efi 6.0.0", 1420 + "wasip2", 1421 + "wasip3", 1422 + ] 1423 + 1424 + [[package]] 1333 1425 name = "gimli" 1334 1426 version = "0.32.3" 1335 1427 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1357 1449 1358 1450 [[package]] 1359 1451 name = "hashbrown" 1452 + version = "0.15.5" 1453 + source = "registry+https://github.com/rust-lang/crates.io-index" 1454 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1455 + dependencies = [ 1456 + "foldhash 0.1.5", 1457 + ] 1458 + 1459 + [[package]] 1460 + name = "hashbrown" 1360 1461 version = "0.16.1" 1361 1462 source = "registry+https://github.com/rust-lang/crates.io-index" 1362 1463 checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 1363 1464 dependencies = [ 1364 1465 "allocator-api2", 1365 1466 "equivalent", 1366 - "foldhash", 1467 + "foldhash 0.2.0", 1367 1468 "serde", 1368 1469 "serde_core", 1369 1470 ] ··· 1396 1497 version = "0.4.3" 1397 1498 source = "registry+https://github.com/rust-lang/crates.io-index" 1398 1499 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1500 + 1501 + [[package]] 1502 + name = "id-arena" 1503 + version = "2.3.0" 1504 + source = "registry+https://github.com/rust-lang/crates.io-index" 1505 + checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 1399 1506 1400 1507 [[package]] 1401 1508 name = "ident_case" ··· 1416 1523 checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 1417 1524 dependencies = [ 1418 1525 "equivalent", 1419 - "hashbrown", 1526 + "hashbrown 0.16.1", 1527 + "serde", 1528 + "serde_core", 1420 1529 ] 1421 1530 1422 1531 [[package]] ··· 1429 1538 ] 1430 1539 1431 1540 [[package]] 1541 + name = "inout" 1542 + version = "0.1.4" 1543 + source = "registry+https://github.com/rust-lang/crates.io-index" 1544 + checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 1545 + dependencies = [ 1546 + "generic-array", 1547 + ] 1548 + 1549 + [[package]] 1432 1550 name = "instability" 1433 1551 version = "0.3.11" 1434 1552 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1438 1556 "indoc", 1439 1557 "proc-macro2", 1440 1558 "quote", 1441 - "syn 2.0.114", 1559 + "syn 2.0.117", 1442 1560 ] 1443 1561 1444 1562 [[package]] 1445 - name = "itertools" 1446 - version = "0.13.0" 1563 + name = "is_ci" 1564 + version = "1.2.0" 1447 1565 source = "registry+https://github.com/rust-lang/crates.io-index" 1448 - checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 1449 - dependencies = [ 1450 - "either", 1451 - ] 1566 + checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 1452 1567 1453 1568 [[package]] 1454 1569 name = "itertools" ··· 1467 1582 1468 1583 [[package]] 1469 1584 name = "jiff" 1470 - version = "0.2.18" 1585 + version = "0.2.23" 1471 1586 source = "registry+https://github.com/rust-lang/crates.io-index" 1472 - checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" 1587 + checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" 1473 1588 dependencies = [ 1474 1589 "jiff-static", 1475 1590 "jiff-tzdb-platform", ··· 1482 1597 1483 1598 [[package]] 1484 1599 name = "jiff-static" 1485 - version = "0.2.18" 1600 + version = "0.2.23" 1486 1601 source = "registry+https://github.com/rust-lang/crates.io-index" 1487 - checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" 1602 + checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" 1488 1603 dependencies = [ 1489 1604 "proc-macro2", 1490 1605 "quote", 1491 - "syn 2.0.114", 1606 + "syn 2.0.117", 1492 1607 ] 1493 1608 1494 1609 [[package]] 1495 1610 name = "jiff-tzdb" 1496 - version = "0.1.5" 1611 + version = "0.1.6" 1497 1612 source = "registry+https://github.com/rust-lang/crates.io-index" 1498 - checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" 1613 + checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" 1499 1614 1500 1615 [[package]] 1501 1616 name = "jiff-tzdb-platform" ··· 1534 1649 source = "registry+https://github.com/rust-lang/crates.io-index" 1535 1650 checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1536 1651 dependencies = [ 1537 - "getrandom", 1652 + "getrandom 0.3.4", 1538 1653 "libc", 1539 1654 ] 1540 1655 1541 1656 [[package]] 1542 1657 name = "js-sys" 1543 - version = "0.3.83" 1658 + version = "0.3.91" 1544 1659 source = "registry+https://github.com/rust-lang/crates.io-index" 1545 - checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" 1660 + checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" 1546 1661 dependencies = [ 1547 1662 "once_cell", 1548 1663 "wasm-bindgen", ··· 1550 1665 1551 1666 [[package]] 1552 1667 name = "kasuari" 1553 - version = "0.4.11" 1668 + version = "0.4.12" 1554 1669 source = "registry+https://github.com/rust-lang/crates.io-index" 1555 - checksum = "8fe90c1150662e858c7d5f945089b7517b0a80d8bf7ba4b1b5ffc984e7230a5b" 1670 + checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" 1556 1671 dependencies = [ 1557 - "hashbrown", 1672 + "hashbrown 0.16.1", 1558 1673 "portable-atomic", 1559 - "thiserror 2.0.17", 1674 + "thiserror 2.0.18", 1560 1675 ] 1561 1676 1562 1677 [[package]] ··· 1572 1687 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1573 1688 1574 1689 [[package]] 1690 + name = "leb128fmt" 1691 + version = "0.1.0" 1692 + source = "registry+https://github.com/rust-lang/crates.io-index" 1693 + checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 1694 + 1695 + [[package]] 1575 1696 name = "libc" 1576 - version = "0.2.180" 1697 + version = "0.2.183" 1577 1698 source = "registry+https://github.com/rust-lang/crates.io-index" 1578 - checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" 1699 + checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 1579 1700 1580 1701 [[package]] 1581 1702 name = "libm" 1582 - version = "0.2.15" 1703 + version = "0.2.16" 1583 1704 source = "registry+https://github.com/rust-lang/crates.io-index" 1584 - checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 1705 + checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" 1585 1706 1586 1707 [[package]] 1587 1708 name = "line-clipping" ··· 1589 1710 source = "registry+https://github.com/rust-lang/crates.io-index" 1590 1711 checksum = "5f4de44e98ddbf09375cbf4d17714d18f39195f4f4894e8524501726fd9a8a4a" 1591 1712 dependencies = [ 1592 - "bitflags 2.10.0", 1713 + "bitflags 2.11.0", 1593 1714 ] 1594 1715 1595 1716 [[package]] 1596 1717 name = "linux-raw-sys" 1597 - version = "0.11.0" 1718 + version = "0.12.1" 1598 1719 source = "registry+https://github.com/rust-lang/crates.io-index" 1599 - checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 1720 + checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" 1600 1721 1601 1722 [[package]] 1602 1723 name = "litrs" ··· 1620 1741 checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 1621 1742 1622 1743 [[package]] 1623 - name = "loom" 1624 - version = "0.7.2" 1625 - source = "registry+https://github.com/rust-lang/crates.io-index" 1626 - checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 1627 - dependencies = [ 1628 - "cfg-if", 1629 - "generator", 1630 - "scoped-tls", 1631 - "tracing", 1632 - "tracing-subscriber", 1633 - ] 1634 - 1635 - [[package]] 1636 1744 name = "lru" 1637 1745 version = "0.16.3" 1638 1746 source = "registry+https://github.com/rust-lang/crates.io-index" 1639 1747 checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" 1640 1748 dependencies = [ 1641 - "hashbrown", 1749 + "hashbrown 0.16.1", 1642 1750 ] 1643 1751 1644 1752 [[package]] ··· 1662 1770 1663 1771 [[package]] 1664 1772 name = "memchr" 1665 - version = "2.7.6" 1773 + version = "2.8.0" 1666 1774 source = "registry+https://github.com/rust-lang/crates.io-index" 1667 - checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1775 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 1668 1776 1669 1777 [[package]] 1670 1778 name = "memmem" ··· 1682 1790 ] 1683 1791 1684 1792 [[package]] 1793 + name = "miette" 1794 + version = "7.6.0" 1795 + source = "registry+https://github.com/rust-lang/crates.io-index" 1796 + checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" 1797 + dependencies = [ 1798 + "backtrace", 1799 + "backtrace-ext", 1800 + "cfg-if", 1801 + "miette-derive", 1802 + "owo-colors", 1803 + "supports-color", 1804 + "supports-hyperlinks", 1805 + "supports-unicode", 1806 + "terminal_size", 1807 + "textwrap", 1808 + "unicode-width 0.1.14", 1809 + ] 1810 + 1811 + [[package]] 1812 + name = "miette-derive" 1813 + version = "7.6.0" 1814 + source = "registry+https://github.com/rust-lang/crates.io-index" 1815 + checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" 1816 + dependencies = [ 1817 + "proc-macro2", 1818 + "quote", 1819 + "syn 2.0.117", 1820 + ] 1821 + 1822 + [[package]] 1685 1823 name = "minimal-lexical" 1686 1824 version = "0.2.1" 1687 1825 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1714 1852 source = "registry+https://github.com/rust-lang/crates.io-index" 1715 1853 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 1716 1854 dependencies = [ 1717 - "bitflags 2.10.0", 1855 + "bitflags 2.11.0", 1718 1856 "jni-sys", 1719 1857 "log", 1720 1858 "ndk-sys", ··· 1743 1881 source = "registry+https://github.com/rust-lang/crates.io-index" 1744 1882 checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 1745 1883 dependencies = [ 1746 - "bitflags 2.10.0", 1884 + "bitflags 2.11.0", 1747 1885 "cfg-if", 1748 1886 "cfg_aliases", 1749 1887 "libc", ··· 1752 1890 1753 1891 [[package]] 1754 1892 name = "nix" 1755 - version = "0.30.1" 1893 + version = "0.31.2" 1756 1894 source = "registry+https://github.com/rust-lang/crates.io-index" 1757 - checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 1895 + checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" 1758 1896 dependencies = [ 1759 - "bitflags 2.10.0", 1897 + "bitflags 2.11.0", 1760 1898 "cfg-if", 1761 1899 "cfg_aliases", 1762 1900 "libc", ··· 1789 1927 1790 1928 [[package]] 1791 1929 name = "num-conv" 1792 - version = "0.1.0" 1930 + version = "0.2.0" 1793 1931 source = "registry+https://github.com/rust-lang/crates.io-index" 1794 - checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1932 + checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 1795 1933 1796 1934 [[package]] 1797 1935 name = "num-derive" ··· 1801 1939 dependencies = [ 1802 1940 "proc-macro2", 1803 1941 "quote", 1804 - "syn 2.0.114", 1942 + "syn 2.0.117", 1805 1943 ] 1806 1944 1807 1945 [[package]] ··· 1833 1971 "proc-macro-crate", 1834 1972 "proc-macro2", 1835 1973 "quote", 1836 - "syn 2.0.114", 1974 + "syn 2.0.117", 1837 1975 ] 1838 1976 1839 1977 [[package]] ··· 1847 1985 1848 1986 [[package]] 1849 1987 name = "objc2" 1850 - version = "0.6.3" 1988 + version = "0.6.4" 1851 1989 source = "registry+https://github.com/rust-lang/crates.io-index" 1852 - checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 1990 + checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" 1853 1991 dependencies = [ 1854 1992 "objc2-encode", 1855 1993 ] ··· 1871 2009 1872 2010 [[package]] 1873 2011 name = "once_cell" 1874 - version = "1.21.3" 2012 + version = "1.21.4" 1875 2013 source = "registry+https://github.com/rust-lang/crates.io-index" 1876 - checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2014 + checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" 2015 + 2016 + [[package]] 2017 + name = "opaque-debug" 2018 + version = "0.3.1" 2019 + source = "registry+https://github.com/rust-lang/crates.io-index" 2020 + checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 1877 2021 1878 2022 [[package]] 1879 2023 name = "ordered-float" ··· 1886 2030 1887 2031 [[package]] 1888 2032 name = "owo-colors" 1889 - version = "4.2.3" 2033 + version = "4.3.0" 1890 2034 source = "registry+https://github.com/rust-lang/crates.io-index" 1891 - checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" 2035 + checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" 1892 2036 1893 2037 [[package]] 1894 2038 name = "parking" ··· 1921 2065 1922 2066 [[package]] 1923 2067 name = "pest" 1924 - version = "2.8.5" 2068 + version = "2.8.6" 1925 2069 source = "registry+https://github.com/rust-lang/crates.io-index" 1926 - checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" 2070 + checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" 1927 2071 dependencies = [ 1928 2072 "memchr", 1929 2073 "ucd-trie", ··· 1931 2075 1932 2076 [[package]] 1933 2077 name = "pest_derive" 1934 - version = "2.8.5" 2078 + version = "2.8.6" 1935 2079 source = "registry+https://github.com/rust-lang/crates.io-index" 1936 - checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" 2080 + checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" 1937 2081 dependencies = [ 1938 2082 "pest", 1939 2083 "pest_generator", ··· 1941 2085 1942 2086 [[package]] 1943 2087 name = "pest_generator" 1944 - version = "2.8.5" 2088 + version = "2.8.6" 1945 2089 source = "registry+https://github.com/rust-lang/crates.io-index" 1946 - checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" 2090 + checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" 1947 2091 dependencies = [ 1948 2092 "pest", 1949 2093 "pest_meta", 1950 2094 "proc-macro2", 1951 2095 "quote", 1952 - "syn 2.0.114", 2096 + "syn 2.0.117", 1953 2097 ] 1954 2098 1955 2099 [[package]] 1956 2100 name = "pest_meta" 1957 - version = "2.8.5" 2101 + version = "2.8.6" 1958 2102 source = "registry+https://github.com/rust-lang/crates.io-index" 1959 - checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" 2103 + checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" 1960 2104 dependencies = [ 1961 2105 "pest", 1962 2106 "sha2", ··· 2002 2146 "phf_shared", 2003 2147 "proc-macro2", 2004 2148 "quote", 2005 - "syn 2.0.114", 2149 + "syn 2.0.117", 2006 2150 ] 2007 2151 2008 2152 [[package]] ··· 2016 2160 2017 2161 [[package]] 2018 2162 name = "pin-project" 2019 - version = "1.1.10" 2163 + version = "1.1.11" 2020 2164 source = "registry+https://github.com/rust-lang/crates.io-index" 2021 - checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 2165 + checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" 2022 2166 dependencies = [ 2023 2167 "pin-project-internal", 2024 2168 ] 2025 2169 2026 2170 [[package]] 2027 2171 name = "pin-project-internal" 2028 - version = "1.1.10" 2172 + version = "1.1.11" 2029 2173 source = "registry+https://github.com/rust-lang/crates.io-index" 2030 - checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 2174 + checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" 2031 2175 dependencies = [ 2032 2176 "proc-macro2", 2033 2177 "quote", 2034 - "syn 2.0.114", 2178 + "syn 2.0.117", 2035 2179 ] 2036 2180 2037 2181 [[package]] 2038 2182 name = "pin-project-lite" 2039 - version = "0.2.16" 2183 + version = "0.2.17" 2040 2184 source = "registry+https://github.com/rust-lang/crates.io-index" 2041 - checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2185 + checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" 2042 2186 2043 2187 [[package]] 2044 2188 name = "polling" ··· 2055 2199 ] 2056 2200 2057 2201 [[package]] 2202 + name = "poly1305" 2203 + version = "0.8.0" 2204 + source = "registry+https://github.com/rust-lang/crates.io-index" 2205 + checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 2206 + dependencies = [ 2207 + "cpufeatures", 2208 + "opaque-debug", 2209 + "universal-hash", 2210 + ] 2211 + 2212 + [[package]] 2058 2213 name = "portable-atomic" 2059 - version = "1.13.0" 2214 + version = "1.13.1" 2060 2215 source = "registry+https://github.com/rust-lang/crates.io-index" 2061 - checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" 2216 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 2062 2217 2063 2218 [[package]] 2064 2219 name = "portable-atomic-util" 2065 - version = "0.2.4" 2220 + version = "0.2.5" 2066 2221 source = "registry+https://github.com/rust-lang/crates.io-index" 2067 - checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 2222 + checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" 2068 2223 dependencies = [ 2069 2224 "portable-atomic", 2070 2225 ] ··· 2097 2252 ] 2098 2253 2099 2254 [[package]] 2255 + name = "prettyplease" 2256 + version = "0.2.37" 2257 + source = "registry+https://github.com/rust-lang/crates.io-index" 2258 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 2259 + dependencies = [ 2260 + "proc-macro2", 2261 + "syn 2.0.117", 2262 + ] 2263 + 2264 + [[package]] 2100 2265 name = "proc-macro-crate" 2101 - version = "3.4.0" 2266 + version = "3.5.0" 2102 2267 source = "registry+https://github.com/rust-lang/crates.io-index" 2103 - checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2268 + checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" 2104 2269 dependencies = [ 2105 - "toml_edit", 2270 + "toml_edit 0.25.4+spec-1.1.0", 2106 2271 ] 2107 2272 2108 2273 [[package]] 2109 2274 name = "proc-macro2" 2110 - version = "1.0.105" 2275 + version = "1.0.106" 2111 2276 source = "registry+https://github.com/rust-lang/crates.io-index" 2112 - checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" 2277 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 2113 2278 dependencies = [ 2114 2279 "unicode-ident", 2115 2280 ] 2116 2281 2117 2282 [[package]] 2118 2283 name = "quote" 2119 - version = "1.0.43" 2284 + version = "1.0.45" 2120 2285 source = "registry+https://github.com/rust-lang/crates.io-index" 2121 - checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" 2286 + checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" 2122 2287 dependencies = [ 2123 2288 "proc-macro2", 2124 2289 ] ··· 2130 2295 checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 2131 2296 2132 2297 [[package]] 2298 + name = "r-efi" 2299 + version = "6.0.0" 2300 + source = "registry+https://github.com/rust-lang/crates.io-index" 2301 + checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" 2302 + 2303 + [[package]] 2133 2304 name = "rand" 2134 2305 version = "0.8.5" 2135 2306 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2145 2316 checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2146 2317 dependencies = [ 2147 2318 "rand_chacha", 2148 - "rand_core 0.9.3", 2319 + "rand_core 0.9.5", 2149 2320 ] 2150 2321 2151 2322 [[package]] ··· 2155 2326 checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2156 2327 dependencies = [ 2157 2328 "ppv-lite86", 2158 - "rand_core 0.9.3", 2329 + "rand_core 0.9.5", 2159 2330 ] 2160 2331 2161 2332 [[package]] ··· 2166 2337 2167 2338 [[package]] 2168 2339 name = "rand_core" 2169 - version = "0.9.3" 2340 + version = "0.9.5" 2170 2341 source = "registry+https://github.com/rust-lang/crates.io-index" 2171 - checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2342 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 2172 2343 dependencies = [ 2173 - "getrandom", 2344 + "getrandom 0.3.4", 2174 2345 ] 2175 2346 2176 2347 [[package]] ··· 2185 2356 2186 2357 [[package]] 2187 2358 name = "rapidhash" 2188 - version = "4.2.0" 2359 + version = "4.4.1" 2189 2360 source = "registry+https://github.com/rust-lang/crates.io-index" 2190 - checksum = "2988730ee014541157f48ce4dcc603940e00915edc3c7f9a8d78092256bb2493" 2361 + checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" 2191 2362 dependencies = [ 2192 2363 "rand 0.9.2", 2193 2364 "rustversion", ··· 2213 2384 source = "registry+https://github.com/rust-lang/crates.io-index" 2214 2385 checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" 2215 2386 dependencies = [ 2216 - "bitflags 2.10.0", 2387 + "bitflags 2.11.0", 2217 2388 "compact_str", 2218 - "hashbrown", 2389 + "hashbrown 0.16.1", 2219 2390 "indoc", 2220 - "itertools 0.14.0", 2391 + "itertools", 2221 2392 "kasuari", 2222 2393 "lru", 2223 2394 "strum", 2224 - "thiserror 2.0.17", 2395 + "thiserror 2.0.18", 2225 2396 "unicode-segmentation", 2226 2397 "unicode-truncate", 2227 - "unicode-width", 2398 + "unicode-width 0.2.2", 2228 2399 ] 2229 2400 2230 2401 [[package]] ··· 2265 2436 source = "registry+https://github.com/rust-lang/crates.io-index" 2266 2437 checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" 2267 2438 dependencies = [ 2268 - "bitflags 2.10.0", 2269 - "hashbrown", 2439 + "bitflags 2.11.0", 2440 + "hashbrown 0.16.1", 2270 2441 "indoc", 2271 2442 "instability", 2272 - "itertools 0.14.0", 2443 + "itertools", 2273 2444 "line-clipping", 2274 2445 "ratatui-core", 2275 2446 "strum", 2276 2447 "time", 2277 2448 "unicode-segmentation", 2278 - "unicode-width", 2449 + "unicode-width 0.2.2", 2279 2450 ] 2280 2451 2281 2452 [[package]] ··· 2290 2461 source = "registry+https://github.com/rust-lang/crates.io-index" 2291 2462 checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2292 2463 dependencies = [ 2293 - "bitflags 2.10.0", 2464 + "bitflags 2.11.0", 2294 2465 ] 2295 2466 2296 2467 [[package]] 2297 2468 name = "regex" 2298 - version = "1.12.2" 2469 + version = "1.12.3" 2299 2470 source = "registry+https://github.com/rust-lang/crates.io-index" 2300 - checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 2471 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 2301 2472 dependencies = [ 2302 2473 "aho-corasick", 2303 2474 "memchr", ··· 2307 2478 2308 2479 [[package]] 2309 2480 name = "regex-automata" 2310 - version = "0.4.13" 2481 + version = "0.4.14" 2311 2482 source = "registry+https://github.com/rust-lang/crates.io-index" 2312 - checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 2483 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 2313 2484 dependencies = [ 2314 2485 "aho-corasick", 2315 2486 "memchr", ··· 2318 2489 2319 2490 [[package]] 2320 2491 name = "regex-syntax" 2321 - version = "0.8.8" 2492 + version = "0.8.10" 2322 2493 source = "registry+https://github.com/rust-lang/crates.io-index" 2323 - checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 2494 + checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" 2324 2495 2325 2496 [[package]] 2326 2497 name = "rustc-demangle" 2327 - version = "0.1.26" 2498 + version = "0.1.27" 2328 2499 source = "registry+https://github.com/rust-lang/crates.io-index" 2329 - checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 2500 + checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" 2330 2501 2331 2502 [[package]] 2332 2503 name = "rustc_version" ··· 2339 2510 2340 2511 [[package]] 2341 2512 name = "rustix" 2342 - version = "1.1.3" 2513 + version = "1.1.4" 2343 2514 source = "registry+https://github.com/rust-lang/crates.io-index" 2344 - checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" 2515 + checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" 2345 2516 dependencies = [ 2346 - "bitflags 2.10.0", 2517 + "bitflags 2.11.0", 2347 2518 "errno", 2348 2519 "libc", 2349 2520 "linux-raw-sys", ··· 2358 2529 2359 2530 [[package]] 2360 2531 name = "ryu" 2361 - version = "1.0.22" 2532 + version = "1.0.23" 2362 2533 source = "registry+https://github.com/rust-lang/crates.io-index" 2363 - checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" 2534 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 2535 + 2536 + [[package]] 2537 + name = "sachy-config" 2538 + version = "0.1.0" 2539 + source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" 2540 + dependencies = [ 2541 + "base64ct", 2542 + "miette", 2543 + "toml_edit 0.25.4+spec-1.1.0", 2544 + ] 2364 2545 2365 2546 [[package]] 2366 2547 name = "sachy-fmt" 2367 2548 version = "0.1.0" 2368 - source = "git+https://tangled.org/sachy.dev/sachy-embed-core#07539b3e060d72b69d4c5fef8db61a10dc20541d" 2549 + source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" 2369 2550 2370 2551 [[package]] 2371 2552 name = "sachy-mdns" 2372 2553 version = "0.1.0" 2373 - source = "git+https://tangled.org/sachy.dev/sachy-embed-core#07539b3e060d72b69d4c5fef8db61a10dc20541d" 2554 + source = "git+https://tangled.org/sachy.dev/sachy-embed-core#ee60e727e6d412cd13009809eb08f51a9b441b44" 2374 2555 dependencies = [ 2375 2556 "sachy-fmt", 2376 2557 "winnow", ··· 2386 2567 ] 2387 2568 2388 2569 [[package]] 2389 - name = "scoped-tls" 2390 - version = "1.0.1" 2391 - source = "registry+https://github.com/rust-lang/crates.io-index" 2392 - checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2393 - 2394 - [[package]] 2395 2570 name = "scopeguard" 2396 2571 version = "1.2.0" 2397 2572 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2430 2605 dependencies = [ 2431 2606 "proc-macro2", 2432 2607 "quote", 2433 - "syn 2.0.114", 2608 + "syn 2.0.117", 2609 + ] 2610 + 2611 + [[package]] 2612 + name = "serde_json" 2613 + version = "1.0.149" 2614 + source = "registry+https://github.com/rust-lang/crates.io-index" 2615 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 2616 + dependencies = [ 2617 + "itoa", 2618 + "memchr", 2619 + "serde", 2620 + "serde_core", 2621 + "zmij", 2434 2622 ] 2435 2623 2436 2624 [[package]] ··· 2492 2680 2493 2681 [[package]] 2494 2682 name = "siphasher" 2495 - version = "1.0.1" 2683 + version = "1.0.2" 2496 2684 source = "registry+https://github.com/rust-lang/crates.io-index" 2497 - checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2685 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 2498 2686 2499 2687 [[package]] 2500 2688 name = "slab" 2501 - version = "0.4.11" 2689 + version = "0.4.12" 2502 2690 source = "registry+https://github.com/rust-lang/crates.io-index" 2503 - checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 2691 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 2504 2692 2505 2693 [[package]] 2506 2694 name = "slotmap" ··· 2527 2715 ] 2528 2716 2529 2717 [[package]] 2718 + name = "snow" 2719 + version = "0.10.0" 2720 + source = "registry+https://github.com/rust-lang/crates.io-index" 2721 + checksum = "599b506ccc4aff8cf7844bc42cf783009a434c1e26c964432560fb6d6ad02d82" 2722 + dependencies = [ 2723 + "blake2", 2724 + "chacha20poly1305", 2725 + "curve25519-dalek", 2726 + "getrandom 0.3.4", 2727 + "rustc_version", 2728 + "subtle", 2729 + ] 2730 + 2731 + [[package]] 2530 2732 name = "socket2" 2531 - version = "0.6.1" 2733 + version = "0.6.3" 2532 2734 source = "registry+https://github.com/rust-lang/crates.io-index" 2533 - checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 2735 + checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" 2534 2736 dependencies = [ 2535 2737 "libc", 2536 - "windows-sys 0.60.2", 2738 + "windows-sys 0.61.2", 2537 2739 ] 2538 2740 2539 2741 [[package]] ··· 2565 2767 "async-io", 2566 2768 "bevy", 2567 2769 "bevy_ratatui", 2770 + "bytes", 2568 2771 "color-eyre", 2569 2772 "crossterm", 2570 2773 "futures-concurrency", ··· 2572 2775 "postcard", 2573 2776 "rapidhash", 2574 2777 "ratatui", 2778 + "sachy-config", 2575 2779 "sachy-mdns", 2576 2780 "serde", 2781 + "snow", 2577 2782 "socket2", 2578 2783 "striker-proto", 2579 2784 ] ··· 2610 2815 "heck", 2611 2816 "proc-macro2", 2612 2817 "quote", 2613 - "syn 2.0.114", 2818 + "syn 2.0.117", 2614 2819 ] 2615 2820 2616 2821 [[package]] 2822 + name = "subtle" 2823 + version = "2.6.1" 2824 + source = "registry+https://github.com/rust-lang/crates.io-index" 2825 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2826 + 2827 + [[package]] 2828 + name = "supports-color" 2829 + version = "3.0.2" 2830 + source = "registry+https://github.com/rust-lang/crates.io-index" 2831 + checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" 2832 + dependencies = [ 2833 + "is_ci", 2834 + ] 2835 + 2836 + [[package]] 2837 + name = "supports-hyperlinks" 2838 + version = "3.2.0" 2839 + source = "registry+https://github.com/rust-lang/crates.io-index" 2840 + checksum = "e396b6523b11ccb83120b115a0b7366de372751aa6edf19844dfb13a6af97e91" 2841 + 2842 + [[package]] 2843 + name = "supports-unicode" 2844 + version = "3.0.0" 2845 + source = "registry+https://github.com/rust-lang/crates.io-index" 2846 + checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" 2847 + 2848 + [[package]] 2617 2849 name = "syn" 2618 2850 version = "1.0.109" 2619 2851 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2626 2858 2627 2859 [[package]] 2628 2860 name = "syn" 2629 - version = "2.0.114" 2861 + version = "2.0.117" 2630 2862 source = "registry+https://github.com/rust-lang/crates.io-index" 2631 - checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" 2863 + checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" 2632 2864 dependencies = [ 2633 2865 "proc-macro2", 2634 2866 "quote", ··· 2636 2868 ] 2637 2869 2638 2870 [[package]] 2871 + name = "terminal_size" 2872 + version = "0.4.3" 2873 + source = "registry+https://github.com/rust-lang/crates.io-index" 2874 + checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" 2875 + dependencies = [ 2876 + "rustix", 2877 + "windows-sys 0.60.2", 2878 + ] 2879 + 2880 + [[package]] 2639 2881 name = "terminfo" 2640 2882 version = "0.9.0" 2641 2883 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2664 2906 dependencies = [ 2665 2907 "anyhow", 2666 2908 "base64", 2667 - "bitflags 2.10.0", 2909 + "bitflags 2.11.0", 2668 2910 "fancy-regex", 2669 2911 "filedescriptor", 2670 2912 "finl_unicode", ··· 2699 2941 ] 2700 2942 2701 2943 [[package]] 2944 + name = "textwrap" 2945 + version = "0.16.2" 2946 + source = "registry+https://github.com/rust-lang/crates.io-index" 2947 + checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" 2948 + dependencies = [ 2949 + "unicode-linebreak", 2950 + "unicode-width 0.2.2", 2951 + ] 2952 + 2953 + [[package]] 2702 2954 name = "thiserror" 2703 2955 version = "1.0.69" 2704 2956 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2709 2961 2710 2962 [[package]] 2711 2963 name = "thiserror" 2712 - version = "2.0.17" 2964 + version = "2.0.18" 2713 2965 source = "registry+https://github.com/rust-lang/crates.io-index" 2714 - checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 2966 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 2715 2967 dependencies = [ 2716 - "thiserror-impl 2.0.17", 2968 + "thiserror-impl 2.0.18", 2717 2969 ] 2718 2970 2719 2971 [[package]] ··· 2724 2976 dependencies = [ 2725 2977 "proc-macro2", 2726 2978 "quote", 2727 - "syn 2.0.114", 2979 + "syn 2.0.117", 2728 2980 ] 2729 2981 2730 2982 [[package]] 2731 2983 name = "thiserror-impl" 2732 - version = "2.0.17" 2984 + version = "2.0.18" 2733 2985 source = "registry+https://github.com/rust-lang/crates.io-index" 2734 - checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 2986 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 2735 2987 dependencies = [ 2736 2988 "proc-macro2", 2737 2989 "quote", 2738 - "syn 2.0.114", 2990 + "syn 2.0.117", 2739 2991 ] 2740 2992 2741 2993 [[package]] ··· 2749 3001 2750 3002 [[package]] 2751 3003 name = "time" 2752 - version = "0.3.44" 3004 + version = "0.3.47" 2753 3005 source = "registry+https://github.com/rust-lang/crates.io-index" 2754 - checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 3006 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 2755 3007 dependencies = [ 2756 3008 "deranged", 2757 3009 "libc", 2758 3010 "num-conv", 2759 3011 "num_threads", 2760 3012 "powerfmt", 2761 - "serde", 3013 + "serde_core", 2762 3014 "time-core", 2763 3015 ] 2764 3016 2765 3017 [[package]] 2766 3018 name = "time-core" 2767 - version = "0.1.6" 3019 + version = "0.1.8" 2768 3020 source = "registry+https://github.com/rust-lang/crates.io-index" 2769 - checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 3021 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 2770 3022 2771 3023 [[package]] 2772 3024 name = "toml_datetime" ··· 2778 3030 ] 2779 3031 2780 3032 [[package]] 3033 + name = "toml_datetime" 3034 + version = "1.0.0+spec-1.1.0" 3035 + source = "registry+https://github.com/rust-lang/crates.io-index" 3036 + checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" 3037 + dependencies = [ 3038 + "serde_core", 3039 + ] 3040 + 3041 + [[package]] 2781 3042 name = "toml_edit" 2782 3043 version = "0.23.10+spec-1.0.0" 2783 3044 source = "registry+https://github.com/rust-lang/crates.io-index" 2784 3045 checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" 2785 3046 dependencies = [ 2786 3047 "indexmap", 2787 - "toml_datetime", 3048 + "toml_datetime 0.7.5+spec-1.1.0", 2788 3049 "toml_parser", 2789 3050 "winnow", 2790 3051 ] 2791 3052 2792 3053 [[package]] 3054 + name = "toml_edit" 3055 + version = "0.25.4+spec-1.1.0" 3056 + source = "registry+https://github.com/rust-lang/crates.io-index" 3057 + checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" 3058 + dependencies = [ 3059 + "indexmap", 3060 + "toml_datetime 1.0.0+spec-1.1.0", 3061 + "toml_parser", 3062 + "toml_writer", 3063 + "winnow", 3064 + ] 3065 + 3066 + [[package]] 2793 3067 name = "toml_parser" 2794 - version = "1.0.6+spec-1.1.0" 3068 + version = "1.0.9+spec-1.1.0" 2795 3069 source = "registry+https://github.com/rust-lang/crates.io-index" 2796 - checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" 3070 + checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 2797 3071 dependencies = [ 2798 3072 "winnow", 2799 3073 ] 2800 3074 2801 3075 [[package]] 3076 + name = "toml_writer" 3077 + version = "1.0.6+spec-1.1.0" 3078 + source = "registry+https://github.com/rust-lang/crates.io-index" 3079 + checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" 3080 + 3081 + [[package]] 2802 3082 name = "tracing" 2803 3083 version = "0.1.44" 2804 3084 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2817 3097 dependencies = [ 2818 3098 "proc-macro2", 2819 3099 "quote", 2820 - "syn 2.0.114", 3100 + "syn 2.0.117", 2821 3101 ] 2822 3102 2823 3103 [[package]] ··· 2865 3145 2866 3146 [[package]] 2867 3147 name = "tracing-subscriber" 2868 - version = "0.3.22" 3148 + version = "0.3.23" 2869 3149 source = "registry+https://github.com/rust-lang/crates.io-index" 2870 - checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 3150 + checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" 2871 3151 dependencies = [ 2872 3152 "matchers", 2873 3153 "nu-ansi-term", ··· 2912 3192 2913 3193 [[package]] 2914 3194 name = "unicode-ident" 2915 - version = "1.0.22" 3195 + version = "1.0.24" 2916 3196 source = "registry+https://github.com/rust-lang/crates.io-index" 2917 - checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" 3197 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 3198 + 3199 + [[package]] 3200 + name = "unicode-linebreak" 3201 + version = "0.1.5" 3202 + source = "registry+https://github.com/rust-lang/crates.io-index" 3203 + checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 2918 3204 2919 3205 [[package]] 2920 3206 name = "unicode-segmentation" ··· 2924 3210 2925 3211 [[package]] 2926 3212 name = "unicode-truncate" 2927 - version = "2.0.0" 3213 + version = "2.0.1" 2928 3214 source = "registry+https://github.com/rust-lang/crates.io-index" 2929 - checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" 3215 + checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" 2930 3216 dependencies = [ 2931 - "itertools 0.13.0", 3217 + "itertools", 2932 3218 "unicode-segmentation", 2933 - "unicode-width", 3219 + "unicode-width 0.2.2", 2934 3220 ] 2935 3221 2936 3222 [[package]] 2937 3223 name = "unicode-width" 3224 + version = "0.1.14" 3225 + source = "registry+https://github.com/rust-lang/crates.io-index" 3226 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 3227 + 3228 + [[package]] 3229 + name = "unicode-width" 2938 3230 version = "0.2.2" 2939 3231 source = "registry+https://github.com/rust-lang/crates.io-index" 2940 3232 checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" ··· 2946 3238 checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2947 3239 2948 3240 [[package]] 3241 + name = "universal-hash" 3242 + version = "0.5.1" 3243 + source = "registry+https://github.com/rust-lang/crates.io-index" 3244 + checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 3245 + dependencies = [ 3246 + "crypto-common", 3247 + "subtle", 3248 + ] 3249 + 3250 + [[package]] 2949 3251 name = "utf8parse" 2950 3252 version = "0.2.2" 2951 3253 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2953 3255 2954 3256 [[package]] 2955 3257 name = "uuid" 2956 - version = "1.19.0" 3258 + version = "1.22.0" 2957 3259 source = "registry+https://github.com/rust-lang/crates.io-index" 2958 - checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" 3260 + checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" 2959 3261 dependencies = [ 2960 3262 "atomic", 2961 - "getrandom", 3263 + "getrandom 0.4.2", 2962 3264 "js-sys", 2963 3265 "serde_core", 2964 3266 "wasm-bindgen", ··· 2978 3280 dependencies = [ 2979 3281 "proc-macro2", 2980 3282 "quote", 2981 - "syn 2.0.114", 3283 + "syn 2.0.117", 2982 3284 ] 2983 3285 2984 3286 [[package]] ··· 3014 3316 3015 3317 [[package]] 3016 3318 name = "wasip2" 3017 - version = "1.0.1+wasi-0.2.4" 3319 + version = "1.0.2+wasi-0.2.9" 3018 3320 source = "registry+https://github.com/rust-lang/crates.io-index" 3019 - checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 3321 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 3322 + dependencies = [ 3323 + "wit-bindgen", 3324 + ] 3325 + 3326 + [[package]] 3327 + name = "wasip3" 3328 + version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 3329 + source = "registry+https://github.com/rust-lang/crates.io-index" 3330 + checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 3020 3331 dependencies = [ 3021 3332 "wit-bindgen", 3022 3333 ] 3023 3334 3024 3335 [[package]] 3025 3336 name = "wasm-bindgen" 3026 - version = "0.2.106" 3337 + version = "0.2.114" 3027 3338 source = "registry+https://github.com/rust-lang/crates.io-index" 3028 - checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" 3339 + checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" 3029 3340 dependencies = [ 3030 3341 "cfg-if", 3031 3342 "once_cell", ··· 3036 3347 3037 3348 [[package]] 3038 3349 name = "wasm-bindgen-futures" 3039 - version = "0.4.56" 3350 + version = "0.4.64" 3040 3351 source = "registry+https://github.com/rust-lang/crates.io-index" 3041 - checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" 3352 + checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" 3042 3353 dependencies = [ 3043 3354 "cfg-if", 3355 + "futures-util", 3044 3356 "js-sys", 3045 3357 "once_cell", 3046 3358 "wasm-bindgen", ··· 3049 3361 3050 3362 [[package]] 3051 3363 name = "wasm-bindgen-macro" 3052 - version = "0.2.106" 3364 + version = "0.2.114" 3053 3365 source = "registry+https://github.com/rust-lang/crates.io-index" 3054 - checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" 3366 + checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" 3055 3367 dependencies = [ 3056 3368 "quote", 3057 3369 "wasm-bindgen-macro-support", ··· 3059 3371 3060 3372 [[package]] 3061 3373 name = "wasm-bindgen-macro-support" 3062 - version = "0.2.106" 3374 + version = "0.2.114" 3063 3375 source = "registry+https://github.com/rust-lang/crates.io-index" 3064 - checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" 3376 + checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" 3065 3377 dependencies = [ 3066 3378 "bumpalo", 3067 3379 "proc-macro2", 3068 3380 "quote", 3069 - "syn 2.0.114", 3381 + "syn 2.0.117", 3070 3382 "wasm-bindgen-shared", 3071 3383 ] 3072 3384 3073 3385 [[package]] 3074 3386 name = "wasm-bindgen-shared" 3075 - version = "0.2.106" 3387 + version = "0.2.114" 3076 3388 source = "registry+https://github.com/rust-lang/crates.io-index" 3077 - checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" 3389 + checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" 3078 3390 dependencies = [ 3079 3391 "unicode-ident", 3080 3392 ] 3081 3393 3082 3394 [[package]] 3395 + name = "wasm-encoder" 3396 + version = "0.244.0" 3397 + source = "registry+https://github.com/rust-lang/crates.io-index" 3398 + checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 3399 + dependencies = [ 3400 + "leb128fmt", 3401 + "wasmparser", 3402 + ] 3403 + 3404 + [[package]] 3405 + name = "wasm-metadata" 3406 + version = "0.244.0" 3407 + source = "registry+https://github.com/rust-lang/crates.io-index" 3408 + checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 3409 + dependencies = [ 3410 + "anyhow", 3411 + "indexmap", 3412 + "wasm-encoder", 3413 + "wasmparser", 3414 + ] 3415 + 3416 + [[package]] 3417 + name = "wasmparser" 3418 + version = "0.244.0" 3419 + source = "registry+https://github.com/rust-lang/crates.io-index" 3420 + checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 3421 + dependencies = [ 3422 + "bitflags 2.11.0", 3423 + "hashbrown 0.15.5", 3424 + "indexmap", 3425 + "semver", 3426 + ] 3427 + 3428 + [[package]] 3083 3429 name = "web-sys" 3084 - version = "0.3.83" 3430 + version = "0.3.91" 3085 3431 source = "registry+https://github.com/rust-lang/crates.io-index" 3086 - checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" 3432 + checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" 3087 3433 dependencies = [ 3088 3434 "js-sys", 3089 3435 "wasm-bindgen", ··· 3115 3461 source = "registry+https://github.com/rust-lang/crates.io-index" 3116 3462 checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" 3117 3463 dependencies = [ 3118 - "getrandom", 3464 + "getrandom 0.3.4", 3119 3465 "mac_address", 3120 3466 "sha2", 3121 3467 "thiserror 1.0.69", ··· 3177 3523 source = "registry+https://github.com/rust-lang/crates.io-index" 3178 3524 checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" 3179 3525 dependencies = [ 3180 - "bitflags 2.10.0", 3526 + "bitflags 2.11.0", 3181 3527 "bytemuck", 3182 3528 "js-sys", 3183 3529 "log", 3184 3530 "serde", 3185 - "thiserror 2.0.17", 3531 + "thiserror 2.0.18", 3186 3532 "web-sys", 3187 3533 ] 3188 3534 ··· 3222 3568 version = "0.2.1" 3223 3569 source = "registry+https://github.com/rust-lang/crates.io-index" 3224 3570 checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 3225 - 3226 - [[package]] 3227 - name = "windows-result" 3228 - version = "0.4.1" 3229 - source = "registry+https://github.com/rust-lang/crates.io-index" 3230 - checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 3231 - dependencies = [ 3232 - "windows-link", 3233 - ] 3234 3571 3235 3572 [[package]] 3236 3573 name = "windows-sys" ··· 3383 3720 3384 3721 [[package]] 3385 3722 name = "winnow" 3386 - version = "0.7.14" 3723 + version = "0.7.15" 3387 3724 source = "registry+https://github.com/rust-lang/crates.io-index" 3388 - checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 3725 + checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" 3389 3726 dependencies = [ 3390 3727 "memchr", 3391 3728 ] 3392 3729 3393 3730 [[package]] 3394 3731 name = "wit-bindgen" 3395 - version = "0.46.0" 3732 + version = "0.51.0" 3733 + source = "registry+https://github.com/rust-lang/crates.io-index" 3734 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 3735 + dependencies = [ 3736 + "wit-bindgen-rust-macro", 3737 + ] 3738 + 3739 + [[package]] 3740 + name = "wit-bindgen-core" 3741 + version = "0.51.0" 3742 + source = "registry+https://github.com/rust-lang/crates.io-index" 3743 + checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 3744 + dependencies = [ 3745 + "anyhow", 3746 + "heck", 3747 + "wit-parser", 3748 + ] 3749 + 3750 + [[package]] 3751 + name = "wit-bindgen-rust" 3752 + version = "0.51.0" 3753 + source = "registry+https://github.com/rust-lang/crates.io-index" 3754 + checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 3755 + dependencies = [ 3756 + "anyhow", 3757 + "heck", 3758 + "indexmap", 3759 + "prettyplease", 3760 + "syn 2.0.117", 3761 + "wasm-metadata", 3762 + "wit-bindgen-core", 3763 + "wit-component", 3764 + ] 3765 + 3766 + [[package]] 3767 + name = "wit-bindgen-rust-macro" 3768 + version = "0.51.0" 3396 3769 source = "registry+https://github.com/rust-lang/crates.io-index" 3397 - checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 3770 + checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 3771 + dependencies = [ 3772 + "anyhow", 3773 + "prettyplease", 3774 + "proc-macro2", 3775 + "quote", 3776 + "syn 2.0.117", 3777 + "wit-bindgen-core", 3778 + "wit-bindgen-rust", 3779 + ] 3780 + 3781 + [[package]] 3782 + name = "wit-component" 3783 + version = "0.244.0" 3784 + source = "registry+https://github.com/rust-lang/crates.io-index" 3785 + checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 3786 + dependencies = [ 3787 + "anyhow", 3788 + "bitflags 2.11.0", 3789 + "indexmap", 3790 + "log", 3791 + "serde", 3792 + "serde_derive", 3793 + "serde_json", 3794 + "wasm-encoder", 3795 + "wasm-metadata", 3796 + "wasmparser", 3797 + "wit-parser", 3798 + ] 3799 + 3800 + [[package]] 3801 + name = "wit-parser" 3802 + version = "0.244.0" 3803 + source = "registry+https://github.com/rust-lang/crates.io-index" 3804 + checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 3805 + dependencies = [ 3806 + "anyhow", 3807 + "id-arena", 3808 + "indexmap", 3809 + "log", 3810 + "semver", 3811 + "serde", 3812 + "serde_derive", 3813 + "serde_json", 3814 + "unicode-xid", 3815 + "wasmparser", 3816 + ] 3398 3817 3399 3818 [[package]] 3400 3819 name = "zerocopy" 3401 - version = "0.8.33" 3820 + version = "0.8.42" 3402 3821 source = "registry+https://github.com/rust-lang/crates.io-index" 3403 - checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" 3822 + checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" 3404 3823 dependencies = [ 3405 3824 "zerocopy-derive", 3406 3825 ] 3407 3826 3408 3827 [[package]] 3409 3828 name = "zerocopy-derive" 3410 - version = "0.8.33" 3829 + version = "0.8.42" 3411 3830 source = "registry+https://github.com/rust-lang/crates.io-index" 3412 - checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" 3831 + checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" 3413 3832 dependencies = [ 3414 3833 "proc-macro2", 3415 3834 "quote", 3416 - "syn 2.0.114", 3835 + "syn 2.0.117", 3417 3836 ] 3837 + 3838 + [[package]] 3839 + name = "zeroize" 3840 + version = "1.8.2" 3841 + source = "registry+https://github.com/rust-lang/crates.io-index" 3842 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 3843 + 3844 + [[package]] 3845 + name = "zmij" 3846 + version = "1.0.21" 3847 + source = "registry+https://github.com/rust-lang/crates.io-index" 3848 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+10
Cargo.toml
··· 21 21 license.workspace = true 22 22 23 23 [dependencies] 24 + bytes = "1.11.1" 24 25 color-eyre = "0.6.5" 25 26 crossterm = "0.29.0" 26 27 ratatui = { version = "0.30.0", features = [ ··· 46 47 serde.workspace = true 47 48 postcard.workspace = true 48 49 jiff = "0.2.18" 50 + snow = { version = "0.10", default-features = false, features = [ 51 + "use-curve25519", 52 + "use-chacha20poly1305", 53 + "use-blake2", 54 + "use-getrandom", 55 + ] } 56 + 57 + [build-dependencies] 58 + sachy-config = { git = "https://tangled.org/sachy.dev/sachy-embed-core", package = "sachy-config" } 49 59 50 60 [lib] 51 61 path = "src/lib.rs"
+20
build.rs
··· 1 + use std::{io::BufWriter, path::PathBuf}; 2 + 3 + fn main() { 4 + let out = &PathBuf::from(std::env::var_os("OUT_DIR").unwrap()); 5 + 6 + let config = include_str!("striker-config.toml"); 7 + 8 + let out_file = out.join("constants.rs"); 9 + 10 + let mut writer = BufWriter::new( 11 + std::fs::OpenOptions::new() 12 + .create(true) 13 + .truncate(true) 14 + .write(true) 15 + .open(out_file) 16 + .unwrap(), 17 + ); 18 + 19 + sachy_config::output_config(config, &mut writer).unwrap(); 20 + }
+18 -170
src/device.rs
··· 1 - use core::net::IpAddr; 2 - 3 - use bevy::{ 4 - app::{Plugin, Update}, 5 - ecs::{ 6 - component::Component, 7 - entity::Entity, 8 - lifecycle::HookContext, 9 - name::Name, 10 - resource::Resource, 11 - system::{Commands, Res, ResMut}, 12 - world::DeferredWorld, 13 - }, 14 - prelude::Deref, 15 - }; 16 - use rapidhash::RapidHashSet; 17 - use ratatui::{ 18 - style::{Color, Stylize}, 19 - text::{Line, Span, Text, ToSpan}, 20 - widgets::{Block, Padding, Paragraph, Widget}, 21 - }; 22 - 23 - use crate::net::DiscoverResponse; 24 - 25 - #[derive(Debug, Resource, Default)] 26 - pub struct UniqueDevices(pub RapidHashSet<DeviceSocket>); 27 - 28 - #[derive(Debug, Component)] 29 - pub struct Device; 30 - 31 - #[derive(Debug, Clone, Component, Hash, PartialEq, Eq)] 32 - #[component(immutable, on_remove = on_remove_device)] 33 - pub struct DeviceSocket { 34 - pub address: String, 35 - pub port: u16, 36 - pub ip: IpAddr, 37 - } 38 - 39 - #[derive(Debug, Component, Default, Clone, Copy)] 40 - pub struct DeviceDetector { 41 - pub blip_threshold: u16, 42 - pub blip_size: usize, 43 - } 44 - 45 - impl Widget for DeviceDetector { 46 - fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) 47 - where 48 - Self: Sized, 49 - { 50 - let detector_lines = [ 51 - Line::from_iter([Span::raw("Threshold: "), self.blip_threshold.to_span()]), 52 - Line::from_iter([Span::raw("Blip Size: "), self.blip_size.to_span()]), 53 - ]; 54 - 55 - let detector_info = Paragraph::new(Text::from_iter(detector_lines)) 56 - .block( 57 - Block::bordered() 58 - .title("Settings") 59 - .padding(Padding::horizontal(1)) 60 - .border_style(Color::LightGreen), 61 - ) 62 - .white(); 63 - 64 - detector_info.render(area, buf); 65 - } 66 - } 67 - 68 - fn on_remove_device(mut world: DeferredWorld, context: HookContext) { 69 - let component = world 70 - .entity(context.entity) 71 - .get::<DeviceSocket>() 72 - .cloned() 73 - .unwrap(); 74 - let mut devices = world.resource_mut::<UniqueDevices>(); 75 - 76 - devices.0.remove(&component); 77 - } 78 - 79 - #[derive(Debug, Component)] 80 - #[component(immutable)] 81 - pub struct StormLevel(pub u16); 82 - 83 - #[derive(Debug, Component, Deref)] 84 - #[component(immutable)] 85 - pub struct Timestamp(pub jiff::Timestamp); 86 - 87 - impl Timestamp { 88 - pub fn from_microseconds(stamp: i64) -> Result<Self, jiff::Error> { 89 - jiff::Timestamp::from_microsecond(stamp).map(Self) 90 - } 91 - } 92 - 93 - #[derive(Debug, Component, Deref)] 94 - #[component(immutable)] 95 - pub struct StormSignal(Vec<i16>); 96 - 97 - impl StormSignal { 98 - pub fn new(value: Vec<i16>) -> Self { 99 - Self(value) 100 - } 101 - } 102 - 103 - #[derive(Debug, Component, Deref)] 104 - #[component(immutable)] 105 - pub struct SignalAverage(pub u16); 1 + mod components; 2 + mod home; 3 + mod monitoring; 4 + mod resources; 5 + mod setup; 106 6 107 - impl SignalAverage { 108 - pub fn new(value: u16) -> Self { 109 - Self(value) 110 - } 111 - } 7 + use bevy::{app::Plugin, ecs::event::Event}; 112 8 113 - #[derive(Debug, Component, Deref)] 114 - #[component(immutable)] 115 - pub struct SignalPeaks(Vec<(usize, u16)>); 116 - 117 - impl SignalPeaks { 118 - pub fn new(value: Vec<(usize, u16)>) -> Self { 119 - Self(value) 120 - } 121 - } 122 - 123 - #[derive(Debug, Component)] 124 - #[relationship(relationship_target = Signals)] 125 - pub struct SignalSource(pub Entity); 126 - 127 - #[derive(Component, Debug, Deref)] 128 - #[relationship_target(relationship = SignalSource, linked_spawn)] 129 - pub struct Signals { 130 - signals: Vec<Entity>, 131 - } 132 - 133 - #[derive(Debug, Component)] 134 - #[relationship(relationship_target = StormLevels)] 135 - pub struct StormSource(pub Entity); 9 + use crate::device::{ 10 + home::HomeViewPlugin, monitoring::MonitoringViewPlugin, resources::UniqueDevices, 11 + setup::DevicesSetupPlugin, 12 + }; 136 13 137 - #[derive(Component, Debug, Deref)] 138 - #[relationship_target(relationship = StormSource, linked_spawn)] 139 - pub struct StormLevels { 140 - levels: Vec<Entity>, 141 - } 14 + pub use crate::{device::components::*, device::resources::ConnectedDevice}; 142 15 143 16 #[derive(Debug)] 144 17 pub enum ConnectionState { ··· 157 30 } 158 31 } 159 32 160 - #[derive(Debug, Resource)] 161 - pub struct ConnectedDevice { 162 - pub device: Entity, 163 - pub connection_state: ConnectionState, 164 - } 165 - 166 - fn register_devices( 167 - incoming: Res<DiscoverResponse>, 168 - mut unique: ResMut<UniqueDevices>, 169 - mut commands: Commands, 170 - ) { 171 - let mut devices = Vec::new(); 172 - 173 - while let Ok(discovered) = incoming.0.try_recv() { 174 - let device_addr = DeviceSocket { 175 - address: discovered.address, 176 - port: discovered.port, 177 - ip: discovered.ip, 178 - }; 179 - 180 - if !unique.0.contains(&device_addr) { 181 - unique.0.insert(device_addr.clone()); 182 - devices.push((Device, Name::new(discovered.host), device_addr)); 183 - } 184 - } 185 - 186 - if !devices.is_empty() { 187 - commands.spawn_batch(devices); 188 - } 189 - } 33 + #[derive(Debug, Event)] 34 + pub struct FindDevices; 190 35 191 36 #[derive(Debug)] 192 37 pub struct DevicePlugin; 193 38 194 39 impl Plugin for DevicePlugin { 195 40 fn build(&self, app: &mut bevy::app::App) { 196 - app.init_resource::<UniqueDevices>() 197 - .add_systems(Update, register_devices); 41 + app.init_resource::<UniqueDevices>().add_plugins(( 42 + DevicesSetupPlugin, 43 + HomeViewPlugin, 44 + MonitoringViewPlugin, 45 + )); 198 46 } 199 47 }
+129
src/device/components.rs
··· 1 + use core::net::IpAddr; 2 + 3 + use bevy::{ 4 + ecs::{component::Component, entity::Entity, lifecycle::HookContext, world::DeferredWorld}, 5 + prelude::Deref, 6 + }; 7 + use ratatui::{ 8 + style::{Color, Stylize}, 9 + text::{Line, Span, Text, ToSpan}, 10 + widgets::{Block, Padding, Paragraph, Widget}, 11 + }; 12 + 13 + use crate::device::resources::UniqueDevices; 14 + 15 + #[derive(Debug, Component)] 16 + pub struct Device; 17 + 18 + #[derive(Debug, Clone, Component, Hash, PartialEq, Eq)] 19 + #[component(immutable, on_remove = on_remove_device)] 20 + pub struct DeviceSocket { 21 + pub address: String, 22 + pub port: u16, 23 + pub ip: IpAddr, 24 + pub encryption: String, 25 + } 26 + 27 + #[derive(Debug, Component, Default, Clone, Copy)] 28 + pub struct DeviceDetector { 29 + pub blip_threshold: u16, 30 + pub blip_size: usize, 31 + } 32 + 33 + impl Widget for DeviceDetector { 34 + fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) 35 + where 36 + Self: Sized, 37 + { 38 + let detector_lines = [ 39 + Line::from_iter([Span::raw("Threshold: "), self.blip_threshold.to_span()]), 40 + Line::from_iter([Span::raw("Blip Size: "), self.blip_size.to_span()]), 41 + ]; 42 + 43 + let detector_info = Paragraph::new(Text::from_iter(detector_lines)) 44 + .block( 45 + Block::bordered() 46 + .title("Settings") 47 + .padding(Padding::horizontal(1)) 48 + .border_style(Color::LightGreen), 49 + ) 50 + .white(); 51 + 52 + detector_info.render(area, buf); 53 + } 54 + } 55 + 56 + fn on_remove_device(mut world: DeferredWorld, context: HookContext) { 57 + let component = world 58 + .entity(context.entity) 59 + .get::<DeviceSocket>() 60 + .cloned() 61 + .unwrap(); 62 + let mut devices = world.resource_mut::<UniqueDevices>(); 63 + 64 + devices.0.remove(&component); 65 + } 66 + 67 + #[derive(Debug, Component)] 68 + #[component(immutable)] 69 + pub struct StormLevel(pub u16); 70 + 71 + #[derive(Debug, Component, Deref)] 72 + #[component(immutable)] 73 + pub struct Timestamp(pub jiff::Timestamp); 74 + 75 + impl Timestamp { 76 + pub fn from_microseconds(stamp: i64) -> Result<Self, jiff::Error> { 77 + jiff::Timestamp::from_microsecond(stamp).map(Self) 78 + } 79 + } 80 + 81 + #[derive(Debug, Component, Deref)] 82 + #[component(immutable)] 83 + pub struct StormSignal(Vec<i16>); 84 + 85 + impl StormSignal { 86 + pub fn new(value: Vec<i16>) -> Self { 87 + Self(value) 88 + } 89 + } 90 + 91 + #[derive(Debug, Component, Deref)] 92 + #[component(immutable)] 93 + pub struct SignalAverage(pub u16); 94 + 95 + impl SignalAverage { 96 + pub fn new(value: u16) -> Self { 97 + Self(value) 98 + } 99 + } 100 + 101 + #[derive(Debug, Component, Deref)] 102 + #[component(immutable)] 103 + pub struct SignalPeaks(Vec<(usize, u16)>); 104 + 105 + impl SignalPeaks { 106 + pub fn new(value: Vec<(usize, u16)>) -> Self { 107 + Self(value) 108 + } 109 + } 110 + 111 + #[derive(Debug, Component)] 112 + #[relationship(relationship_target = Signals)] 113 + pub struct SignalSource(pub Entity); 114 + 115 + #[derive(Component, Debug, Deref)] 116 + #[relationship_target(relationship = SignalSource, linked_spawn)] 117 + pub struct Signals { 118 + signals: Vec<Entity>, 119 + } 120 + 121 + #[derive(Debug, Component)] 122 + #[relationship(relationship_target = StormLevels)] 123 + pub struct StormSource(pub Entity); 124 + 125 + #[derive(Component, Debug, Deref)] 126 + #[relationship_target(relationship = StormSource, linked_spawn)] 127 + pub struct StormLevels { 128 + levels: Vec<Entity>, 129 + }
+18
src/device/resources.rs
··· 1 + use async_channel::Receiver; 2 + use bevy::ecs::{entity::Entity, resource::Resource}; 3 + use bytes::Bytes; 4 + use rapidhash::RapidHashSet; 5 + 6 + use crate::device::{ConnectionState, DeviceSocket}; 7 + 8 + #[derive(Debug, Resource, Default)] 9 + pub struct UniqueDevices(pub RapidHashSet<DeviceSocket>); 10 + 11 + #[derive(Debug, Resource)] 12 + pub struct DiscoverResponse(pub Receiver<Bytes>); 13 + 14 + #[derive(Debug, Resource)] 15 + pub struct ConnectedDevice { 16 + pub device: Entity, 17 + pub connection_state: ConnectionState, 18 + }
+223
src/device/setup.rs
··· 1 + use core::{ 2 + net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}, 3 + time::Duration, 4 + }; 5 + use std::net::UdpSocket; 6 + 7 + use async_channel::{Sender, TryRecvError}; 8 + use async_io::{Async, Timer}; 9 + use bevy::{ 10 + app::{Plugin, PreUpdate, Startup}, 11 + ecs::{ 12 + error::Result, 13 + name::Name, 14 + observer::On, 15 + resource::Resource, 16 + system::{Commands, Res, ResMut}, 17 + }, 18 + tasks::IoTaskPool, 19 + }; 20 + use bytes::Bytes; 21 + use futures_concurrency::future::Race; 22 + use sachy_mdns::{ 23 + GROUP_SOCK_V4, MDNS_PORT, 24 + client::query_service, 25 + dns::{ 26 + label::Label, 27 + records::{QType, Record, SRV}, 28 + reqres::Response, 29 + traits::DnsParse, 30 + }, 31 + }; 32 + use socket2::{Domain, Protocol, Socket, Type}; 33 + 34 + use crate::device::{ 35 + Device, DeviceSocket, FindDevices, 36 + resources::{DiscoverResponse, UniqueDevices}, 37 + }; 38 + 39 + fn register_devices( 40 + incoming: Option<Res<DiscoverResponse>>, 41 + mut unique: ResMut<UniqueDevices>, 42 + mut commands: Commands, 43 + ) { 44 + if let Some(incoming) = incoming { 45 + let mut devices = Vec::new(); 46 + 47 + loop { 48 + match incoming.0.try_recv() { 49 + Ok(discovered) => { 50 + if let Ok(discovered) = Response::parse(&mut &discovered[..], &discovered) 51 + && let Some(instance) = build_device_instance(&discovered) 52 + { 53 + let device_addr = DeviceSocket { 54 + address: instance.srv.target.to_string(), 55 + port: instance.srv.port, 56 + ip: instance.ip, 57 + encryption: instance.encryption.to_string(), 58 + }; 59 + 60 + if !unique.0.contains(&device_addr) { 61 + unique.0.insert(device_addr.clone()); 62 + devices.push(( 63 + Device, 64 + Name::new(instance.host.to_string()), 65 + device_addr, 66 + )); 67 + } 68 + } 69 + } 70 + Err(TryRecvError::Closed) => { 71 + commands.remove_resource::<DiscoverResponse>(); 72 + break; 73 + } 74 + Err(TryRecvError::Empty) => break, 75 + } 76 + } 77 + 78 + if !devices.is_empty() { 79 + commands.spawn_batch(devices); 80 + } 81 + } 82 + } 83 + 84 + struct InstanceDetails<'a> { 85 + host: Label<'a>, 86 + srv: &'a SRV<'a>, 87 + ip: IpAddr, 88 + encryption: &'a str, 89 + } 90 + 91 + #[derive(Debug, Default)] 92 + struct InstanceBuilder<'a> { 93 + name: Option<Label<'a>>, 94 + srv: Option<&'a SRV<'a>>, 95 + txt: Option<&'a str>, 96 + ip: Option<IpAddr>, 97 + } 98 + 99 + fn build_device_instance<'a>(resp: &'a Response<'a>) -> Option<InstanceDetails<'a>> { 100 + if resp 101 + .answers 102 + .iter() 103 + .any(|answer| answer.atype == QType::PTR && answer.name == "_picostrike._tcp.local") 104 + { 105 + let builder = 106 + resp.additional 107 + .iter() 108 + .fold(InstanceBuilder::default(), |mut instance, answer| { 109 + match &answer.record { 110 + Record::A(a) if instance.ip.is_none() => { 111 + instance.ip.replace(IpAddr::V4(a.address)); 112 + } 113 + Record::AAAA(aaaa) if instance.ip.is_none() => { 114 + instance.ip.replace(IpAddr::V6(aaaa.address)); 115 + } 116 + Record::SRV(srv) => { 117 + instance.name.replace(answer.name); 118 + instance.srv.replace(srv); 119 + } 120 + Record::TXT(txt) => { 121 + instance.txt = txt.text.first().copied(); 122 + } 123 + _ => {} 124 + } 125 + 126 + instance 127 + }); 128 + 129 + if let InstanceBuilder { 130 + name: Some(name), 131 + srv: Some(srv), 132 + txt: Some(txt), 133 + ip: Some(ip), 134 + } = builder 135 + { 136 + return Some(InstanceDetails { 137 + host: name, 138 + srv, 139 + ip, 140 + encryption: txt, 141 + }); 142 + } 143 + } 144 + 145 + None 146 + } 147 + 148 + fn on_find_devices(_trigger: On<FindDevices>, signal: Res<MdnsSignaler>, mut commands: Commands) { 149 + let (resp_tx, resp_rx) = async_channel::bounded(64); 150 + 151 + signal.0.send_blocking(resp_tx).ok(); 152 + 153 + commands.insert_resource(DiscoverResponse(resp_rx)); 154 + } 155 + 156 + #[derive(Debug, Resource)] 157 + struct MdnsSignaler(pub Sender<Sender<Bytes>>); 158 + 159 + fn create_mdns_socket() -> std::io::Result<Async<UdpSocket>> { 160 + let sock = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; 161 + sock.set_reuse_address(true)?; 162 + sock.set_nonblocking(true)?; 163 + sock.bind(&SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, MDNS_PORT)).into())?; 164 + let udp_socket = UdpSocket::from(sock); 165 + Async::new_nonblocking(udp_socket) 166 + } 167 + 168 + pub fn setup_mdns_task(mut commands: Commands) -> Result { 169 + let io = IoTaskPool::get(); 170 + 171 + let (signal_tx, signal_rx) = async_channel::bounded::<Sender<Bytes>>(1); 172 + 173 + let udp_socket = create_mdns_socket()?; 174 + 175 + io.spawn(async move { 176 + let mut buf = vec![0u8; 1028]; 177 + let mut query_buf = vec![0u8; 128]; 178 + let query = query_service("_picostrike._tcp.local", &mut query_buf).unwrap(); 179 + 180 + while let Ok(resp_tx) = signal_rx.recv().await { 181 + let send_fut = async { 182 + // Retry three times in case packets get lost coz UDP things 183 + for _ in 0..3 { 184 + udp_socket.send_to(query, GROUP_SOCK_V4).await.ok(); 185 + Timer::after(Duration::from_millis(250)).await; 186 + } 187 + }; 188 + 189 + let recv_fut = async { 190 + while let Ok((read, _)) = udp_socket.recv_from(&mut buf).await { 191 + let input = Bytes::copy_from_slice(&buf[..read]); 192 + 193 + if resp_tx.send(input).await.is_err() { 194 + break; 195 + } 196 + } 197 + }; 198 + 199 + let timer = async { 200 + Timer::after(Duration::from_millis(1000)).await; 201 + resp_tx.close(); 202 + }; 203 + 204 + (send_fut, recv_fut, timer, resp_tx.closed()).race().await; 205 + } 206 + }) 207 + .detach(); 208 + 209 + commands.insert_resource(MdnsSignaler(signal_tx)); 210 + 211 + Ok(()) 212 + } 213 + 214 + pub struct DevicesSetupPlugin; 215 + 216 + impl Plugin for DevicesSetupPlugin { 217 + fn build(&self, app: &mut bevy::app::App) { 218 + app.init_resource::<UniqueDevices>() 219 + .add_systems(Startup, setup_mdns_task) 220 + .add_systems(PreUpdate, register_devices) 221 + .add_observer(on_find_devices); 222 + } 223 + }
+4 -4
src/lib.rs
··· 4 4 mod messages; 5 5 mod net; 6 6 mod state; 7 - mod views; 7 + 8 + mod constants { 9 + include!(concat!(env!("OUT_DIR"), "/constants.rs")); 10 + } 8 11 9 12 use bevy::{ 10 13 app::{AppExit, Plugin, PreUpdate}, ··· 21 24 messages::StrikeMessage, 22 25 net::NetPlugin, 23 26 state::AppState, 24 - views::{HomeViewPlugin, MonitoringViewPlugin}, 25 27 }; 26 28 27 29 #[derive(Debug)] ··· 34 36 .add_plugins(( 35 37 NetPlugin, 36 38 DevicePlugin, 37 - HomeViewPlugin, 38 - MonitoringViewPlugin, 39 39 )) 40 40 .add_systems(PreUpdate, keybinds); 41 41 }
+96 -125
src/net.rs
··· 1 - use core::net::IpAddr; 2 1 use std::{ 3 2 io::{Read, Write}, 4 - net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpStream, UdpSocket}, 3 + net::{SocketAddr, TcpStream}, 4 + sync::{Arc, LazyLock, Mutex, OnceLock}, 5 5 time::Duration, 6 6 }; 7 7 ··· 9 9 use async_io::{Async, Timer}; 10 10 use bevy::{ 11 11 app::{Plugin, Startup}, 12 - ecs::{error::Result, resource::Resource, system::Commands}, 12 + ecs::{resource::Resource, system::Commands}, 13 13 tasks::IoTaskPool, 14 14 }; 15 15 use futures_concurrency::future::Race; 16 - use sachy_mdns::{ 17 - GROUP_SOCK_V4, MDNS_PORT, 18 - client::query_service, 19 - dns::{ 20 - records::{QType, Record}, 21 - reqres::Response, 22 - traits::DnsParse, 23 - }, 24 - }; 25 - use socket2::{Domain, Protocol, Socket, Type}; 16 + use snow::{Builder, TransportState, params::NoiseParams}; 26 17 27 - #[derive(Debug, Resource)] 28 - pub struct DiscoverResponse(pub Receiver<InstanceDetails>); 18 + use crate::constants::NOISE_PSK; 19 + 20 + static PARAMS: LazyLock<NoiseParams> = 21 + LazyLock::new(|| "Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s".parse().unwrap()); 22 + static LOCAL_PRIVATE_KEY: OnceLock<snow::Keypair> = OnceLock::new(); 29 23 30 24 pub enum StrikeUpdateState { 31 25 Disconnected, ··· 48 42 Disconnect, 49 43 } 50 44 51 - pub struct InstanceDetails { 52 - pub host: String, 53 - pub address: String, 54 - pub port: u16, 55 - pub ip: IpAddr, 56 - } 57 - 58 - #[derive(Debug, Resource)] 59 - pub struct MdnsSignaler(pub Sender<()>); 60 - 61 - fn create_mdns_socket() -> std::io::Result<Async<UdpSocket>> { 62 - let sock = Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?; 63 - sock.set_reuse_address(true)?; 64 - sock.set_nonblocking(true)?; 65 - sock.bind(&SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, MDNS_PORT)).into())?; 66 - let udp_socket = UdpSocket::from(sock); 67 - Async::new_nonblocking(udp_socket) 68 - } 69 - 70 - pub fn setup_mdns_task(mut commands: Commands) -> Result { 71 - let io = IoTaskPool::get(); 72 - 73 - let (signal_tx, signal_rx) = async_channel::bounded(1); 74 - let (resp_tx, resp_rx) = async_channel::bounded(64); 75 - 76 - let udp_socket = create_mdns_socket()?; 77 - 78 - io.spawn(async move { 79 - let mut buf = vec![0u8; 1028]; 80 - let mut query_buf = vec![0u8; 128]; 81 - let query = query_service("_picostrike._tcp.local", &mut query_buf).unwrap(); 82 - 83 - while signal_rx.recv().await.is_ok() { 84 - let send_fut = async { 85 - // Retry three times in case packets get lost coz UDP things 86 - for _ in 0..3 { 87 - udp_socket.send_to(query, GROUP_SOCK_V4).await.ok(); 88 - Timer::after(Duration::from_millis(250)).await; 89 - } 90 - }; 91 - 92 - let recv_fut = async { 93 - while let Ok((read, _)) = udp_socket.recv_from(&mut buf).await { 94 - let input = &buf[..read]; 95 - let Ok(resp) = Response::parse(&mut &*input, input) else { 96 - continue; 97 - }; 98 - 99 - if resp.answers.iter().any(|answer| { 100 - answer.atype == QType::PTR && answer.name == "_picostrike._tcp.local" 101 - }) && let Some(ip) = resp.additional.iter().find_map(|answer| match &answer 102 - .record 103 - { 104 - Record::A(a) => Some(IpAddr::V4(a.address)), 105 - Record::AAAA(aaaa) => Some(IpAddr::V6(aaaa.address)), 106 - _ => None, 107 - }) && let Some((name, srv)) = resp.additional.iter().find_map(|answer| { 108 - if let Record::SRV(srv) = &answer.record { 109 - Some((answer.name, srv)) 110 - } else { 111 - None 112 - } 113 - }) { 114 - resp_tx 115 - .send(InstanceDetails { 116 - host: name.to_string(), 117 - address: srv.target.to_string(), 118 - port: srv.port, 119 - ip, 120 - }) 121 - .await 122 - .ok(); 123 - } 124 - } 125 - }; 126 - 127 - let timer = async { 128 - Timer::after(Duration::from_millis(1000)).await; 129 - }; 130 - 131 - let cancel = async { 132 - signal_rx.recv().await.ok(); 133 - }; 134 - 135 - (send_fut, recv_fut, timer, cancel).race().await; 136 - } 137 - }) 138 - .detach(); 139 - 140 - commands.insert_resource(DiscoverResponse(resp_rx)); 141 - commands.insert_resource(MdnsSignaler(signal_tx)); 142 - 143 - Ok(()) 144 - } 145 - 146 45 pub fn setup_strike_connection(mut commands: Commands) { 147 46 let io = IoTaskPool::get(); 148 47 ··· 152 51 153 52 io.spawn(async move { 154 53 let mut read_buf = vec![0u8; 4096]; 54 + let mut enc_buf = vec![0u8; 4096]; 155 55 let mut write_buf = vec![0u8; 4096]; 156 56 157 57 while let Ok(StrikeAction::Connect(addr)) = signal_rx.recv().await { ··· 166 66 resp_tx.send(StrikeUpdateState::Connected).await.ok(); 167 67 stream.write_with(|s| s.set_nodelay(true)).await.ok(); 168 68 69 + let Ok(transport) = noise_handshake(&stream).await else { 70 + resp_tx.send(StrikeUpdateState::Disconnected).await.ok(); 71 + continue; 72 + }; 73 + 74 + let transport_access = Arc::new(Mutex::new(transport)); 75 + 169 76 let read_fut = async { 170 - while let Ok(read) = stream.read_with(|mut a| a.read(&mut read_buf)).await { 171 - let Ok(data) = striker_proto::receive_response(&mut read_buf[..read]) 172 - else { 173 - continue; 174 - }; 175 - 176 - if resp_tx.send(StrikeUpdateState::Updating(data)).await.is_err() { 77 + while let Ok(buh) = recv(&stream).await { 78 + if let Ok(decrypted) = { 79 + transport_access 80 + .lock() 81 + .unwrap() 82 + .read_message(&buh, &mut read_buf) 83 + } && let Ok(data) = 84 + striker_proto::receive_response(&mut read_buf[..decrypted]) 85 + && resp_tx 86 + .send(StrikeUpdateState::Updating(data)) 87 + .await 88 + .is_err() 89 + { 177 90 break; 178 91 } 179 92 } ··· 181 94 182 95 let write_fut = async { 183 96 while let Ok(req) = req_rx.recv().await { 184 - let Ok(payload) = striker_proto::send_request(req, &mut write_buf) 185 - else { 186 - continue; 187 - }; 188 - 189 - if stream.write_with(|mut s| s.write(payload)).await.is_err() { 97 + if let Ok(payload) = striker_proto::send_request(req, &mut write_buf) 98 + && let Ok(encrypted) = { 99 + transport_access 100 + .lock() 101 + .unwrap() 102 + .write_message(payload, &mut enc_buf) 103 + } 104 + && send(&stream, &enc_buf[..encrypted]).await.is_err() 105 + { 190 106 break; 191 - } 107 + }; 192 108 } 193 109 }; 194 110 ··· 227 143 228 144 impl Plugin for NetPlugin { 229 145 fn build(&self, app: &mut bevy::app::App) { 230 - app.add_systems(Startup, (setup_mdns_task, setup_strike_connection)); 146 + app.add_systems(Startup, setup_strike_connection); 231 147 } 232 148 } 149 + 150 + async fn noise_handshake(tcp: &Async<TcpStream>) -> color_eyre::Result<TransportState> { 151 + let builder = Builder::new(PARAMS.clone()); 152 + let static_key = LOCAL_PRIVATE_KEY.get_or_init(|| builder.generate_keypair().unwrap()); 153 + 154 + let mut noise = builder 155 + .local_private_key(&static_key.private)? 156 + .psk(3, &NOISE_PSK)? 157 + .build_initiator()?; 158 + 159 + let mut payload = vec![0u8; 2048]; 160 + 161 + // -> e 162 + let len = noise.write_message(&[], &mut payload)?; 163 + 164 + send(tcp, &payload[..len]).await?; 165 + 166 + // <- e, ee, s, es 167 + noise.read_message(&recv(tcp).await?, &mut payload)?; 168 + 169 + // -> s, se 170 + let len = noise.write_message(&[], &mut payload)?; 171 + 172 + send(tcp, &payload[..len]).await?; 173 + 174 + let transport = noise.into_transport_mode()?; 175 + 176 + Ok(transport) 177 + } 178 + 179 + async fn recv(stream: &Async<TcpStream>) -> std::io::Result<Vec<u8>> { 180 + let mut msg_len_buf = [0_u8; 2]; 181 + 182 + stream 183 + .read_with(|mut stream| { 184 + stream.read_exact(&mut msg_len_buf)?; 185 + let msg_len = usize::from(u16::from_be_bytes(msg_len_buf)); 186 + let mut msg = vec![0_u8; msg_len]; 187 + stream.read_exact(&mut msg[..])?; 188 + 189 + Ok(msg) 190 + }) 191 + .await 192 + } 193 + 194 + /// Hyper-basic stream transport sender. 16-bit BE size followed by payload. 195 + async fn send(stream: &Async<TcpStream>, buf: &[u8]) -> std::io::Result<()> { 196 + stream 197 + .write_with(|mut stream| { 198 + let len = u16::try_from(buf.len()).expect("message too large"); 199 + stream.write_all(&len.to_be_bytes())?; 200 + stream.write_all(buf) 201 + }) 202 + .await 203 + }
-54
src/views.rs
··· 1 - use bevy::{ 2 - app::{Plugin, PostUpdate}, 3 - ecs::schedule::IntoScheduleConfigs, 4 - state::{ 5 - condition::in_state, 6 - state::{OnEnter, OnExit}, 7 - }, 8 - }; 9 - 10 - use crate::state::AppState; 11 - 12 - pub mod home; 13 - pub mod monitoring; 14 - 15 - pub struct HomeViewPlugin; 16 - 17 - impl Plugin for HomeViewPlugin { 18 - fn build(&self, app: &mut bevy::app::App) { 19 - app.add_systems(OnEnter(AppState::Home), home::setup_home_view) 20 - .add_systems(OnExit(AppState::Home), home::cleanup_home_view) 21 - .add_systems( 22 - PostUpdate, 23 - ( 24 - home::search_timer, 25 - home::home_message_handler, 26 - home::home_view, 27 - ) 28 - .chain() 29 - .run_if(in_state(AppState::Home)), 30 - ); 31 - } 32 - } 33 - 34 - pub struct MonitoringViewPlugin; 35 - 36 - impl Plugin for MonitoringViewPlugin { 37 - fn build(&self, app: &mut bevy::app::App) { 38 - app.add_systems(OnEnter(AppState::Monitoring), monitoring::enter_monitoring) 39 - .add_systems(OnExit(AppState::Monitoring), monitoring::exit_monitoring) 40 - .add_systems( 41 - PostUpdate, 42 - ( 43 - monitoring::monitoring_message_handler, 44 - ( 45 - monitoring::update_device_data, 46 - monitoring::clear_device_data, 47 - ), 48 - monitoring::monitoring_view, 49 - ) 50 - .chain() 51 - .run_if(in_state(AppState::Monitoring)), 52 - ); 53 - } 54 - }
+23 -5
src/views/home.rs src/device/home.rs
··· 1 1 use bevy::{ 2 + app::{Plugin, PostUpdate}, 2 3 ecs::{ 3 4 entity::Entity, 4 5 error::Result, ··· 6 7 name::Name, 7 8 query::With, 8 9 resource::Resource, 10 + schedule::IntoScheduleConfigs, 9 11 system::{Commands, Query, Res, ResMut}, 10 12 world::World, 11 13 }, 12 - state::state::NextState, 14 + state::{ 15 + condition::in_state, 16 + state::{NextState, OnEnter, OnExit}, 17 + }, 13 18 time::{Real, Time, Timer}, 14 19 }; 15 20 use bevy_ratatui::RatatuiContext; ··· 20 25 }; 21 26 22 27 use crate::{ 23 - device::{ConnectedDevice, ConnectionState, Device, DeviceSocket}, 28 + device::{ConnectedDevice, ConnectionState, Device, DeviceSocket, FindDevices}, 24 29 messages::StrikeMessage, 25 - net::MdnsSignaler, 26 30 state::AppState, 27 31 }; 28 32 ··· 45 49 } 46 50 47 51 pub fn home_message_handler( 48 - signal: Res<MdnsSignaler>, 49 52 mut list_state: ResMut<DeviceListState>, 50 53 mut is_searching: ResMut<SearchingDevices>, 51 54 mut strike_reader: MessageReader<StrikeMessage>, ··· 60 63 is_searching.searching = 61 64 Some(Timer::from_seconds(1.0, bevy::time::TimerMode::Once)); 62 65 } 63 - let _ = signal.0.try_send(()); 66 + commands.trigger(FindDevices); 64 67 } 65 68 StrikeMessage::NextDevice if is_searching.searching.is_none() => { 66 69 list_state.0.select_next(); ··· 165 168 } 166 169 } 167 170 } 171 + 172 + pub struct HomeViewPlugin; 173 + 174 + impl Plugin for HomeViewPlugin { 175 + fn build(&self, app: &mut bevy::app::App) { 176 + app.add_systems(OnEnter(AppState::Home), setup_home_view) 177 + .add_systems(OnExit(AppState::Home), cleanup_home_view) 178 + .add_systems( 179 + PostUpdate, 180 + (search_timer, home_message_handler, home_view) 181 + .chain() 182 + .run_if(in_state(AppState::Home)), 183 + ); 184 + } 185 + }
+25 -1
src/views/monitoring.rs src/device/monitoring.rs
··· 1 1 use core::net::SocketAddr; 2 2 3 3 use bevy::{ 4 + app::{Plugin, PostUpdate}, 4 5 ecs::{ 5 6 entity::Entity, 6 7 error::Result, ··· 8 9 name::Name, 9 10 query::With, 10 11 resource::Resource, 12 + schedule::IntoScheduleConfigs, 11 13 system::{Commands, Query, Res, ResMut}, 12 14 world::World, 13 15 }, 14 - state::state::NextState, 16 + state::{ 17 + condition::in_state, 18 + state::{NextState, OnEnter, OnExit}, 19 + }, 15 20 time::{Real, Time, Timer}, 16 21 }; 17 22 use bevy_ratatui::RatatuiContext; ··· 358 363 chart.render(area, buf); 359 364 } 360 365 } 366 + 367 + pub struct MonitoringViewPlugin; 368 + 369 + impl Plugin for MonitoringViewPlugin { 370 + fn build(&self, app: &mut bevy::app::App) { 371 + app.add_systems(OnEnter(AppState::Monitoring), enter_monitoring) 372 + .add_systems(OnExit(AppState::Monitoring), exit_monitoring) 373 + .add_systems( 374 + PostUpdate, 375 + ( 376 + monitoring_message_handler, 377 + (update_device_data, clear_device_data), 378 + monitoring_view, 379 + ) 380 + .chain() 381 + .run_if(in_state(AppState::Monitoring)), 382 + ); 383 + } 384 + }
+2
striker-config.example.toml
··· 1 + [statics] 2 + NOISE_PSK = { kind = "bytes", value = "FwDnM8ikl63kopPSMm9dvz8NljGVoJWNR2ue7YWs45A=" }