A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

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

Merge pull request #106 from tilesprivacy/feat/device-link-p2p

P2P device linking v1

authored by

Anandu Pavanan and committed by
GitHub
a7114126 6dde5fa2

+3219 -191
+14
CHANGELOG.md
··· 5 5 6 6 ## [Unreleased] 7 7 8 + ## [0.4.5] - 2026-03-23 9 + 10 + ### Added 11 + - Added P2P device linking v1 in [#106](https://github.com/tilesprivacy/tiles/pull/106). 12 + - Works both online and in offline networks 13 + - Utility Commands for device linking 14 + - `tiles link enable` - creates the ticket and listens for an link requests 15 + - `tiles link enable <ticket>`- Device that need to join will run this command with the ticket from the sender. **NOTE**: The ticket sharing is out-of-band. 16 + - `tiles link list-peers` - Shows the info (DID, nickname etc) of the linked devices. 17 + - `tiles link disable <DID>` - Unlinks a linked device 18 + 19 + ### Fixed 20 + - Fixed the permission issues while trying to update Tiles using `tiles update` in [$104](https://github.com/tilesprivacy/tiles/pull/104). This was due to new binary location is in `/usr/` instead of `~/.local/`. Running the internal script with `sudo` fixed it. 21 + 8 22 ## [0.4.4] - 2026-03-16 9 23 10 24 ### Added
+2212 -130
Cargo.lock
··· 3 3 version = 4 4 4 5 5 [[package]] 6 + name = "acto" 7 + version = "0.8.0" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "148541f13c28e3e840354ee4d6c99046c10be2c81068bbd23b9e3a38f95a917e" 10 + dependencies = [ 11 + "parking_lot", 12 + "pin-project-lite", 13 + "rustc_version", 14 + "smol_str", 15 + "sync_wrapper", 16 + "tokio", 17 + "tracing", 18 + ] 19 + 20 + [[package]] 6 21 name = "adler2" 7 22 version = "2.0.1" 8 23 source = "registry+https://github.com/rust-lang/crates.io-index" 9 24 checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 10 25 11 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 0.1.7", 33 + "generic-array", 34 + ] 35 + 36 + [[package]] 37 + name = "aes" 38 + version = "0.8.4" 39 + source = "registry+https://github.com/rust-lang/crates.io-index" 40 + checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 41 + dependencies = [ 42 + "cfg-if", 43 + "cipher", 44 + "cpufeatures", 45 + ] 46 + 47 + [[package]] 48 + name = "aes-gcm" 49 + version = "0.10.3" 50 + source = "registry+https://github.com/rust-lang/crates.io-index" 51 + checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" 52 + dependencies = [ 53 + "aead", 54 + "aes", 55 + "cipher", 56 + "ctr", 57 + "ghash", 58 + "subtle", 59 + ] 60 + 61 + [[package]] 12 62 name = "ahash" 13 63 version = "0.8.12" 14 64 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 63 113 64 114 [[package]] 65 115 name = "anstream" 66 - version = "0.6.21" 116 + version = "1.0.0" 67 117 source = "registry+https://github.com/rust-lang/crates.io-index" 68 - checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 118 + checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" 69 119 dependencies = [ 70 120 "anstyle", 71 121 "anstyle-parse", ··· 78 128 79 129 [[package]] 80 130 name = "anstyle" 81 - version = "1.0.13" 131 + version = "1.0.14" 82 132 source = "registry+https://github.com/rust-lang/crates.io-index" 83 - checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 133 + checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" 84 134 85 135 [[package]] 86 136 name = "anstyle-parse" 87 - version = "0.2.7" 137 + version = "1.0.0" 88 138 source = "registry+https://github.com/rust-lang/crates.io-index" 89 - checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 139 + checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" 90 140 dependencies = [ 91 141 "utf8parse", 92 142 ] ··· 131 181 dependencies = [ 132 182 "rustversion", 133 183 ] 184 + 185 + [[package]] 186 + name = "arrayref" 187 + version = "0.3.9" 188 + source = "registry+https://github.com/rust-lang/crates.io-index" 189 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 190 + 191 + [[package]] 192 + name = "arrayvec" 193 + version = "0.7.6" 194 + source = "registry+https://github.com/rust-lang/crates.io-index" 195 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 134 196 135 197 [[package]] 136 198 name = "arrow" ··· 453 515 source = "registry+https://github.com/rust-lang/crates.io-index" 454 516 checksum = "646dcc11163091f40c1618702bcde3d2e152c52b05fc4527fc67cfe077e47c22" 455 517 dependencies = [ 456 - "signature", 518 + "signature 2.2.0", 457 519 ] 458 520 459 521 [[package]] ··· 523 585 ] 524 586 525 587 [[package]] 588 + name = "async_io_stream" 589 + version = "0.3.3" 590 + source = "registry+https://github.com/rust-lang/crates.io-index" 591 + checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 592 + dependencies = [ 593 + "futures", 594 + "pharos", 595 + "rustc_version", 596 + ] 597 + 598 + [[package]] 526 599 name = "atoi" 527 600 version = "2.0.0" 528 601 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 532 605 ] 533 606 534 607 [[package]] 608 + name = "atomic-polyfill" 609 + version = "1.0.3" 610 + source = "registry+https://github.com/rust-lang/crates.io-index" 611 + checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" 612 + dependencies = [ 613 + "critical-section", 614 + ] 615 + 616 + [[package]] 535 617 name = "atomic-waker" 536 618 version = "1.1.2" 537 619 source = "registry+https://github.com/rust-lang/crates.io-index" 538 620 checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 621 + 622 + [[package]] 623 + name = "attohttpc" 624 + version = "0.30.1" 625 + source = "registry+https://github.com/rust-lang/crates.io-index" 626 + checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" 627 + dependencies = [ 628 + "base64", 629 + "http", 630 + "log", 631 + "url", 632 + ] 539 633 540 634 [[package]] 541 635 name = "autocfg" ··· 596 690 ] 597 691 598 692 [[package]] 693 + name = "axum-macros" 694 + version = "0.5.0" 695 + source = "registry+https://github.com/rust-lang/crates.io-index" 696 + checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" 697 + dependencies = [ 698 + "proc-macro2", 699 + "quote", 700 + "syn 2.0.117", 701 + ] 702 + 703 + [[package]] 704 + name = "backon" 705 + version = "1.6.0" 706 + source = "registry+https://github.com/rust-lang/crates.io-index" 707 + checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" 708 + dependencies = [ 709 + "fastrand", 710 + "gloo-timers", 711 + "tokio", 712 + ] 713 + 714 + [[package]] 599 715 name = "base-x" 600 716 version = "0.2.11" 601 717 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 616 732 "const-str", 617 733 "match-lookup", 618 734 ] 735 + 736 + [[package]] 737 + name = "base32" 738 + version = "0.5.1" 739 + source = "registry+https://github.com/rust-lang/crates.io-index" 740 + checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" 619 741 620 742 [[package]] 621 743 name = "base58" ··· 651 773 checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 652 774 653 775 [[package]] 776 + name = "blake3" 777 + version = "1.8.3" 778 + source = "registry+https://github.com/rust-lang/crates.io-index" 779 + checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" 780 + dependencies = [ 781 + "arrayref", 782 + "arrayvec", 783 + "cc", 784 + "cfg-if", 785 + "constant_time_eq", 786 + "cpufeatures", 787 + ] 788 + 789 + [[package]] 654 790 name = "block-buffer" 655 791 version = "0.10.4" 656 792 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 660 796 ] 661 797 662 798 [[package]] 799 + name = "block-buffer" 800 + version = "0.11.0" 801 + source = "registry+https://github.com/rust-lang/crates.io-index" 802 + checksum = "96eb4cdd6cf1b31d671e9efe75c5d1ec614776856cefbe109ca373554a6d514f" 803 + dependencies = [ 804 + "hybrid-array", 805 + ] 806 + 807 + [[package]] 808 + name = "block2" 809 + version = "0.6.2" 810 + source = "registry+https://github.com/rust-lang/crates.io-index" 811 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 812 + dependencies = [ 813 + "objc2", 814 + ] 815 + 816 + [[package]] 663 817 name = "blocking" 664 818 version = "1.6.2" 665 819 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 674 828 675 829 [[package]] 676 830 name = "bon" 677 - version = "3.9.0" 831 + version = "3.9.1" 678 832 source = "registry+https://github.com/rust-lang/crates.io-index" 679 - checksum = "2d13a61f2963b88eef9c1be03df65d42f6996dfeac1054870d950fcf66686f83" 833 + checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe" 680 834 dependencies = [ 681 835 "bon-macros", 682 836 "rustversion", ··· 684 838 685 839 [[package]] 686 840 name = "bon-macros" 687 - version = "3.9.0" 841 + version = "3.9.1" 688 842 source = "registry+https://github.com/rust-lang/crates.io-index" 689 - checksum = "d314cc62af2b6b0c65780555abb4d02a03dd3b799cd42419044f0c38d99738c0" 843 + checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c" 690 844 dependencies = [ 691 845 "darling 0.23.0", 692 846 "ident_case", ··· 735 889 version = "1.11.1" 736 890 source = "registry+https://github.com/rust-lang/crates.io-index" 737 891 checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 892 + dependencies = [ 893 + "serde", 894 + ] 738 895 739 896 [[package]] 740 897 name = "cbor4ii" ··· 747 904 748 905 [[package]] 749 906 name = "cc" 750 - version = "1.2.56" 907 + version = "1.2.57" 751 908 source = "registry+https://github.com/rust-lang/crates.io-index" 752 - checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" 909 + checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" 753 910 dependencies = [ 754 911 "find-msvc-tools", 755 912 "jobserver", ··· 777 934 dependencies = [ 778 935 "iana-time-zone", 779 936 "num-traits", 937 + "serde", 780 938 "windows-link", 781 939 ] 782 940 ··· 798 956 ] 799 957 800 958 [[package]] 959 + name = "cipher" 960 + version = "0.4.4" 961 + source = "registry+https://github.com/rust-lang/crates.io-index" 962 + checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 963 + dependencies = [ 964 + "crypto-common 0.1.7", 965 + "inout", 966 + ] 967 + 968 + [[package]] 801 969 name = "clap" 802 - version = "4.5.60" 970 + version = "4.6.0" 803 971 source = "registry+https://github.com/rust-lang/crates.io-index" 804 - checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" 972 + checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" 805 973 dependencies = [ 806 974 "clap_builder", 807 975 "clap_derive", ··· 809 977 810 978 [[package]] 811 979 name = "clap_builder" 812 - version = "4.5.60" 980 + version = "4.6.0" 813 981 source = "registry+https://github.com/rust-lang/crates.io-index" 814 - checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" 982 + checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" 815 983 dependencies = [ 816 984 "anstream", 817 985 "anstyle", ··· 821 989 822 990 [[package]] 823 991 name = "clap_derive" 824 - version = "4.5.55" 992 + version = "4.6.0" 825 993 source = "registry+https://github.com/rust-lang/crates.io-index" 826 - checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 994 + checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" 827 995 dependencies = [ 828 996 "heck", 829 997 "proc-macro2", ··· 833 1001 834 1002 [[package]] 835 1003 name = "clap_lex" 836 - version = "1.0.0" 1004 + version = "1.1.0" 837 1005 source = "registry+https://github.com/rust-lang/crates.io-index" 838 - checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" 1006 + checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" 839 1007 840 1008 [[package]] 841 1009 name = "clipboard-win" ··· 853 1021 checksum = "d7ee2cfacbd29706479902b06d75ad8f1362900836aa32799eabc7e004bfd854" 854 1022 855 1023 [[package]] 1024 + name = "cobs" 1025 + version = "0.3.0" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 1028 + dependencies = [ 1029 + "thiserror 2.0.18", 1030 + ] 1031 + 1032 + [[package]] 856 1033 name = "colorchoice" 857 - version = "1.0.4" 1034 + version = "1.0.5" 858 1035 source = "registry+https://github.com/rust-lang/crates.io-index" 859 - checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 1036 + checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" 860 1037 861 1038 [[package]] 862 1039 name = "concurrent-queue" ··· 887 1064 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 888 1065 889 1066 [[package]] 1067 + name = "const-oid" 1068 + version = "0.10.2" 1069 + source = "registry+https://github.com/rust-lang/crates.io-index" 1070 + checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" 1071 + 1072 + [[package]] 890 1073 name = "const-random" 891 1074 version = "0.1.18" 892 1075 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 913 1096 checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 914 1097 915 1098 [[package]] 1099 + name = "constant_time_eq" 1100 + version = "0.4.2" 1101 + source = "registry+https://github.com/rust-lang/crates.io-index" 1102 + checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" 1103 + 1104 + [[package]] 1105 + name = "convert_case" 1106 + version = "0.10.0" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" 1109 + dependencies = [ 1110 + "unicode-segmentation", 1111 + ] 1112 + 1113 + [[package]] 1114 + name = "cordyceps" 1115 + version = "0.3.4" 1116 + source = "registry+https://github.com/rust-lang/crates.io-index" 1117 + checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 1118 + dependencies = [ 1119 + "loom", 1120 + "tracing", 1121 + ] 1122 + 1123 + [[package]] 916 1124 name = "core-foundation" 917 1125 version = "0.9.4" 918 1126 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 977 1185 ] 978 1186 979 1187 [[package]] 1188 + name = "critical-section" 1189 + version = "1.2.0" 1190 + source = "registry+https://github.com/rust-lang/crates.io-index" 1191 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 1192 + 1193 + [[package]] 1194 + name = "crossbeam-channel" 1195 + version = "0.5.15" 1196 + source = "registry+https://github.com/rust-lang/crates.io-index" 1197 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 1198 + dependencies = [ 1199 + "crossbeam-utils", 1200 + ] 1201 + 1202 + [[package]] 980 1203 name = "crossbeam-deque" 981 1204 version = "0.8.6" 982 1205 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1021 1244 1022 1245 [[package]] 1023 1246 name = "crypto-common" 1024 - version = "0.1.6" 1247 + version = "0.1.7" 1025 1248 source = "registry+https://github.com/rust-lang/crates.io-index" 1026 - checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 1249 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 1027 1250 dependencies = [ 1028 1251 "generic-array", 1029 1252 "typenum", 1030 1253 ] 1031 1254 1032 1255 [[package]] 1256 + name = "crypto-common" 1257 + version = "0.2.1" 1258 + source = "registry+https://github.com/rust-lang/crates.io-index" 1259 + checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" 1260 + dependencies = [ 1261 + "hybrid-array", 1262 + ] 1263 + 1264 + [[package]] 1033 1265 name = "csv" 1034 1266 version = "1.4.0" 1035 1267 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1051 1283 ] 1052 1284 1053 1285 [[package]] 1286 + name = "ctr" 1287 + version = "0.9.2" 1288 + source = "registry+https://github.com/rust-lang/crates.io-index" 1289 + checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 1290 + dependencies = [ 1291 + "cipher", 1292 + ] 1293 + 1294 + [[package]] 1054 1295 name = "curve25519-dalek" 1055 1296 version = "4.1.3" 1056 1297 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1059 1300 "cfg-if", 1060 1301 "cpufeatures", 1061 1302 "curve25519-dalek-derive", 1062 - "digest", 1063 - "fiat-crypto", 1303 + "digest 0.10.7", 1304 + "fiat-crypto 0.2.9", 1064 1305 "rustc_version", 1065 1306 "subtle", 1066 1307 "zeroize", 1067 1308 ] 1068 1309 1069 1310 [[package]] 1311 + name = "curve25519-dalek" 1312 + version = "5.0.0-pre.1" 1313 + source = "registry+https://github.com/rust-lang/crates.io-index" 1314 + checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" 1315 + dependencies = [ 1316 + "cfg-if", 1317 + "cpufeatures", 1318 + "curve25519-dalek-derive", 1319 + "digest 0.11.0-rc.10", 1320 + "fiat-crypto 0.3.0", 1321 + "rand_core 0.9.5", 1322 + "rustc_version", 1323 + "serde", 1324 + "subtle", 1325 + "zeroize", 1326 + ] 1327 + 1328 + [[package]] 1070 1329 name = "curve25519-dalek-derive" 1071 1330 version = "0.1.1" 1072 1331 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1089 1348 1090 1349 [[package]] 1091 1350 name = "darling" 1351 + version = "0.20.11" 1352 + source = "registry+https://github.com/rust-lang/crates.io-index" 1353 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 1354 + dependencies = [ 1355 + "darling_core 0.20.11", 1356 + "darling_macro 0.20.11", 1357 + ] 1358 + 1359 + [[package]] 1360 + name = "darling" 1092 1361 version = "0.23.0" 1093 1362 source = "registry+https://github.com/rust-lang/crates.io-index" 1094 1363 checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" ··· 1113 1382 1114 1383 [[package]] 1115 1384 name = "darling_core" 1385 + version = "0.20.11" 1386 + source = "registry+https://github.com/rust-lang/crates.io-index" 1387 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 1388 + dependencies = [ 1389 + "fnv", 1390 + "ident_case", 1391 + "proc-macro2", 1392 + "quote", 1393 + "strsim 0.11.1", 1394 + "syn 2.0.117", 1395 + ] 1396 + 1397 + [[package]] 1398 + name = "darling_core" 1116 1399 version = "0.23.0" 1117 1400 source = "registry+https://github.com/rust-lang/crates.io-index" 1118 1401 checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" ··· 1133 1416 "darling_core 0.14.4", 1134 1417 "quote", 1135 1418 "syn 1.0.109", 1419 + ] 1420 + 1421 + [[package]] 1422 + name = "darling_macro" 1423 + version = "0.20.11" 1424 + source = "registry+https://github.com/rust-lang/crates.io-index" 1425 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 1426 + dependencies = [ 1427 + "darling_core 0.20.11", 1428 + "quote", 1429 + "syn 2.0.117", 1136 1430 ] 1137 1431 1138 1432 [[package]] ··· 1196 1490 source = "registry+https://github.com/rust-lang/crates.io-index" 1197 1491 checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 1198 1492 dependencies = [ 1199 - "const-oid", 1200 - "pem-rfc7468", 1493 + "const-oid 0.9.6", 1494 + "pem-rfc7468 0.7.0", 1495 + "zeroize", 1496 + ] 1497 + 1498 + [[package]] 1499 + name = "der" 1500 + version = "0.8.0" 1501 + source = "registry+https://github.com/rust-lang/crates.io-index" 1502 + checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" 1503 + dependencies = [ 1504 + "const-oid 0.10.2", 1505 + "pem-rfc7468 1.0.0", 1201 1506 "zeroize", 1202 1507 ] 1203 1508 1204 1509 [[package]] 1510 + name = "deranged" 1511 + version = "0.5.8" 1512 + source = "registry+https://github.com/rust-lang/crates.io-index" 1513 + checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" 1514 + dependencies = [ 1515 + "powerfmt", 1516 + ] 1517 + 1518 + [[package]] 1519 + name = "derive_builder" 1520 + version = "0.20.2" 1521 + source = "registry+https://github.com/rust-lang/crates.io-index" 1522 + checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 1523 + dependencies = [ 1524 + "derive_builder_macro", 1525 + ] 1526 + 1527 + [[package]] 1528 + name = "derive_builder_core" 1529 + version = "0.20.2" 1530 + source = "registry+https://github.com/rust-lang/crates.io-index" 1531 + checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 1532 + dependencies = [ 1533 + "darling 0.20.11", 1534 + "proc-macro2", 1535 + "quote", 1536 + "syn 2.0.117", 1537 + ] 1538 + 1539 + [[package]] 1540 + name = "derive_builder_macro" 1541 + version = "0.20.2" 1542 + source = "registry+https://github.com/rust-lang/crates.io-index" 1543 + checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 1544 + dependencies = [ 1545 + "derive_builder_core", 1546 + "syn 2.0.117", 1547 + ] 1548 + 1549 + [[package]] 1550 + name = "derive_more" 1551 + version = "2.1.1" 1552 + source = "registry+https://github.com/rust-lang/crates.io-index" 1553 + checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" 1554 + dependencies = [ 1555 + "derive_more-impl", 1556 + ] 1557 + 1558 + [[package]] 1559 + name = "derive_more-impl" 1560 + version = "2.1.1" 1561 + source = "registry+https://github.com/rust-lang/crates.io-index" 1562 + checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" 1563 + dependencies = [ 1564 + "convert_case", 1565 + "proc-macro2", 1566 + "quote", 1567 + "rustc_version", 1568 + "syn 2.0.117", 1569 + "unicode-xid", 1570 + ] 1571 + 1572 + [[package]] 1573 + name = "diatomic-waker" 1574 + version = "0.2.3" 1575 + source = "registry+https://github.com/rust-lang/crates.io-index" 1576 + checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 1577 + 1578 + [[package]] 1205 1579 name = "digest" 1206 1580 version = "0.10.7" 1207 1581 source = "registry+https://github.com/rust-lang/crates.io-index" 1208 1582 checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1209 1583 dependencies = [ 1210 - "block-buffer", 1211 - "const-oid", 1212 - "crypto-common", 1584 + "block-buffer 0.10.4", 1585 + "const-oid 0.9.6", 1586 + "crypto-common 0.1.7", 1213 1587 "subtle", 1214 1588 ] 1215 1589 1216 1590 [[package]] 1591 + name = "digest" 1592 + version = "0.11.0-rc.10" 1593 + source = "registry+https://github.com/rust-lang/crates.io-index" 1594 + checksum = "afa94b64bfc6549e6e4b5a3216f22593224174083da7a90db47e951c4fb31725" 1595 + dependencies = [ 1596 + "block-buffer 0.11.0", 1597 + "const-oid 0.10.2", 1598 + "crypto-common 0.2.1", 1599 + ] 1600 + 1601 + [[package]] 1217 1602 name = "dirs" 1218 1603 version = "6.0.0" 1219 1604 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1235 1620 ] 1236 1621 1237 1622 [[package]] 1623 + name = "dispatch2" 1624 + version = "0.3.1" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" 1627 + dependencies = [ 1628 + "bitflags", 1629 + "block2", 1630 + "libc", 1631 + "objc2", 1632 + ] 1633 + 1634 + [[package]] 1238 1635 name = "displaydoc" 1239 1636 version = "0.2.5" 1240 1637 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1246 1643 ] 1247 1644 1248 1645 [[package]] 1646 + name = "dlopen2" 1647 + version = "0.5.0" 1648 + source = "registry+https://github.com/rust-lang/crates.io-index" 1649 + checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" 1650 + dependencies = [ 1651 + "libc", 1652 + "once_cell", 1653 + "winapi", 1654 + ] 1655 + 1656 + [[package]] 1657 + name = "document-features" 1658 + version = "0.2.12" 1659 + source = "registry+https://github.com/rust-lang/crates.io-index" 1660 + checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" 1661 + dependencies = [ 1662 + "litrs", 1663 + ] 1664 + 1665 + [[package]] 1249 1666 name = "downcast-rs" 1250 1667 version = "1.2.1" 1251 1668 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1311 1728 source = "registry+https://github.com/rust-lang/crates.io-index" 1312 1729 checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 1313 1730 dependencies = [ 1314 - "der", 1315 - "digest", 1731 + "der 0.7.10", 1732 + "digest 0.10.7", 1316 1733 "elliptic-curve", 1317 1734 "rfc6979", 1318 - "signature", 1319 - "spki", 1735 + "signature 2.2.0", 1736 + "spki 0.7.3", 1320 1737 ] 1321 1738 1322 1739 [[package]] ··· 1325 1742 source = "registry+https://github.com/rust-lang/crates.io-index" 1326 1743 checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" 1327 1744 dependencies = [ 1328 - "pkcs8", 1745 + "pkcs8 0.10.2", 1329 1746 "serde", 1330 - "signature", 1747 + "signature 2.2.0", 1748 + ] 1749 + 1750 + [[package]] 1751 + name = "ed25519" 1752 + version = "3.0.0-rc.4" 1753 + source = "registry+https://github.com/rust-lang/crates.io-index" 1754 + checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" 1755 + dependencies = [ 1756 + "pkcs8 0.11.0-rc.11", 1757 + "serde", 1758 + "signature 3.0.0-rc.10", 1331 1759 ] 1332 1760 1333 1761 [[package]] ··· 1336 1764 source = "registry+https://github.com/rust-lang/crates.io-index" 1337 1765 checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" 1338 1766 dependencies = [ 1339 - "curve25519-dalek", 1340 - "ed25519", 1767 + "curve25519-dalek 4.1.3", 1768 + "ed25519 2.2.3", 1341 1769 "rand_core 0.6.4", 1342 1770 "serde", 1343 - "sha2", 1771 + "sha2 0.10.9", 1772 + "subtle", 1773 + "zeroize", 1774 + ] 1775 + 1776 + [[package]] 1777 + name = "ed25519-dalek" 1778 + version = "3.0.0-pre.1" 1779 + source = "registry+https://github.com/rust-lang/crates.io-index" 1780 + checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" 1781 + dependencies = [ 1782 + "curve25519-dalek 5.0.0-pre.1", 1783 + "ed25519 3.0.0-rc.4", 1784 + "rand_core 0.9.5", 1785 + "serde", 1786 + "sha2 0.11.0-rc.2", 1787 + "signature 3.0.0-rc.10", 1344 1788 "subtle", 1345 1789 "zeroize", 1346 1790 ] ··· 1359 1803 dependencies = [ 1360 1804 "base16ct", 1361 1805 "crypto-bigint", 1362 - "digest", 1806 + "digest 0.10.7", 1363 1807 "ff", 1364 1808 "generic-array", 1365 1809 "group", 1366 - "pem-rfc7468", 1367 - "pkcs8", 1810 + "pem-rfc7468 0.7.0", 1811 + "pkcs8 0.10.2", 1368 1812 "rand_core 0.6.4", 1369 1813 "sec1", 1370 1814 "subtle", ··· 1372 1816 ] 1373 1817 1374 1818 [[package]] 1819 + name = "embedded-io" 1820 + version = "0.4.0" 1821 + source = "registry+https://github.com/rust-lang/crates.io-index" 1822 + checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 1823 + 1824 + [[package]] 1825 + name = "embedded-io" 1826 + version = "0.6.1" 1827 + source = "registry+https://github.com/rust-lang/crates.io-index" 1828 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 1829 + 1830 + [[package]] 1375 1831 name = "encode_unicode" 1376 1832 version = "1.0.0" 1377 1833 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1393 1849 checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" 1394 1850 1395 1851 [[package]] 1852 + name = "enum-as-inner" 1853 + version = "0.6.1" 1854 + source = "registry+https://github.com/rust-lang/crates.io-index" 1855 + checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" 1856 + dependencies = [ 1857 + "heck", 1858 + "proc-macro2", 1859 + "quote", 1860 + "syn 2.0.117", 1861 + ] 1862 + 1863 + [[package]] 1864 + name = "enum-assoc" 1865 + version = "1.3.0" 1866 + source = "registry+https://github.com/rust-lang/crates.io-index" 1867 + checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" 1868 + dependencies = [ 1869 + "proc-macro2", 1870 + "quote", 1871 + "syn 2.0.117", 1872 + ] 1873 + 1874 + [[package]] 1396 1875 name = "enum_dispatch" 1397 1876 version = "0.3.13" 1398 1877 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1507 1986 ] 1508 1987 1509 1988 [[package]] 1989 + name = "fastbloom" 1990 + version = "0.14.1" 1991 + source = "registry+https://github.com/rust-lang/crates.io-index" 1992 + checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" 1993 + dependencies = [ 1994 + "getrandom 0.3.4", 1995 + "libm", 1996 + "rand 0.9.2", 1997 + "siphasher", 1998 + ] 1999 + 2000 + [[package]] 1510 2001 name = "fastrand" 1511 2002 version = "2.3.0" 1512 2003 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1540 2031 checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" 1541 2032 1542 2033 [[package]] 2034 + name = "fiat-crypto" 2035 + version = "0.3.0" 2036 + source = "registry+https://github.com/rust-lang/crates.io-index" 2037 + checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" 2038 + 2039 + [[package]] 1543 2040 name = "find-msvc-tools" 1544 2041 version = "0.1.9" 1545 2042 source = "registry+https://github.com/rust-lang/crates.io-index" 1546 2043 checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 1547 2044 1548 2045 [[package]] 2046 + name = "fixedbitset" 2047 + version = "0.5.7" 2048 + source = "registry+https://github.com/rust-lang/crates.io-index" 2049 + checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 2050 + 2051 + [[package]] 1549 2052 name = "flatbuffers" 1550 2053 version = "25.12.19" 1551 2054 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1575 2078 "futures-core", 1576 2079 "futures-sink", 1577 2080 "nanorand", 1578 - "spin", 2081 + "spin 0.9.8", 1579 2082 ] 1580 2083 1581 2084 [[package]] ··· 1753 2256 ] 1754 2257 1755 2258 [[package]] 2259 + name = "futures-buffered" 2260 + version = "0.2.13" 2261 + source = "registry+https://github.com/rust-lang/crates.io-index" 2262 + checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" 2263 + dependencies = [ 2264 + "cordyceps", 2265 + "diatomic-waker", 2266 + "futures-core", 2267 + "pin-project-lite", 2268 + "spin 0.10.0", 2269 + ] 2270 + 2271 + [[package]] 1756 2272 name = "futures-channel" 1757 2273 version = "0.3.32" 1758 2274 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1760 2276 dependencies = [ 1761 2277 "futures-core", 1762 2278 "futures-sink", 2279 + ] 2280 + 2281 + [[package]] 2282 + name = "futures-concurrency" 2283 + version = "7.7.1" 2284 + source = "registry+https://github.com/rust-lang/crates.io-index" 2285 + checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" 2286 + dependencies = [ 2287 + "fixedbitset", 2288 + "futures-core", 2289 + "futures-lite", 2290 + "pin-project", 2291 + "smallvec", 1763 2292 ] 1764 2293 1765 2294 [[package]] ··· 1845 2374 ] 1846 2375 1847 2376 [[package]] 2377 + name = "generator" 2378 + version = "0.8.8" 2379 + source = "registry+https://github.com/rust-lang/crates.io-index" 2380 + checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" 2381 + dependencies = [ 2382 + "cc", 2383 + "cfg-if", 2384 + "libc", 2385 + "log", 2386 + "rustversion", 2387 + "windows-link", 2388 + "windows-result", 2389 + ] 2390 + 2391 + [[package]] 1848 2392 name = "generic-array" 1849 - version = "0.14.9" 2393 + version = "0.14.7" 1850 2394 source = "registry+https://github.com/rust-lang/crates.io-index" 1851 - checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" 2395 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1852 2396 dependencies = [ 1853 2397 "typenum", 1854 2398 "version_check", ··· 1875 2419 checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1876 2420 dependencies = [ 1877 2421 "cfg-if", 2422 + "js-sys", 1878 2423 "libc", 1879 - "r-efi", 2424 + "r-efi 5.3.0", 1880 2425 "wasip2", 2426 + "wasm-bindgen", 1881 2427 ] 1882 2428 1883 2429 [[package]] 1884 2430 name = "getrandom" 1885 - version = "0.4.1" 2431 + version = "0.4.2" 1886 2432 source = "registry+https://github.com/rust-lang/crates.io-index" 1887 - checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" 2433 + checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 1888 2434 dependencies = [ 1889 2435 "cfg-if", 2436 + "js-sys", 1890 2437 "libc", 1891 - "r-efi", 2438 + "r-efi 6.0.0", 1892 2439 "rand_core 0.10.0", 1893 2440 "wasip2", 1894 2441 "wasip3", 2442 + "wasm-bindgen", 2443 + ] 2444 + 2445 + [[package]] 2446 + name = "ghash" 2447 + version = "0.5.1" 2448 + source = "registry+https://github.com/rust-lang/crates.io-index" 2449 + checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" 2450 + dependencies = [ 2451 + "opaque-debug", 2452 + "polyval", 1895 2453 ] 1896 2454 1897 2455 [[package]] ··· 1955 2513 ] 1956 2514 1957 2515 [[package]] 2516 + name = "hash32" 2517 + version = "0.2.1" 2518 + source = "registry+https://github.com/rust-lang/crates.io-index" 2519 + checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 2520 + dependencies = [ 2521 + "byteorder", 2522 + ] 2523 + 2524 + [[package]] 1958 2525 name = "hashbrown" 1959 2526 version = "0.15.5" 1960 2527 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1971 2538 source = "registry+https://github.com/rust-lang/crates.io-index" 1972 2539 checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 1973 2540 dependencies = [ 2541 + "allocator-api2", 2542 + "equivalent", 1974 2543 "foldhash 0.2.0", 1975 2544 ] 1976 2545 ··· 1984 2553 ] 1985 2554 1986 2555 [[package]] 2556 + name = "heapless" 2557 + version = "0.7.17" 2558 + source = "registry+https://github.com/rust-lang/crates.io-index" 2559 + checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" 2560 + dependencies = [ 2561 + "atomic-polyfill", 2562 + "hash32", 2563 + "rustc_version", 2564 + "serde", 2565 + "spin 0.9.8", 2566 + "stable_deref_trait", 2567 + ] 2568 + 2569 + [[package]] 1987 2570 name = "heck" 1988 2571 version = "0.5.0" 1989 2572 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1996 2579 checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 1997 2580 1998 2581 [[package]] 2582 + name = "hex" 2583 + version = "0.4.3" 2584 + source = "registry+https://github.com/rust-lang/crates.io-index" 2585 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 2586 + 2587 + [[package]] 1999 2588 name = "hf-hub" 2000 2589 version = "0.4.3" 2001 2590 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2020 2609 ] 2021 2610 2022 2611 [[package]] 2612 + name = "hickory-proto" 2613 + version = "0.25.2" 2614 + source = "registry+https://github.com/rust-lang/crates.io-index" 2615 + checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" 2616 + dependencies = [ 2617 + "async-trait", 2618 + "bytes", 2619 + "cfg-if", 2620 + "data-encoding", 2621 + "enum-as-inner", 2622 + "futures-channel", 2623 + "futures-io", 2624 + "futures-util", 2625 + "h2", 2626 + "http", 2627 + "idna", 2628 + "ipnet", 2629 + "once_cell", 2630 + "rand 0.9.2", 2631 + "ring", 2632 + "rustls", 2633 + "thiserror 2.0.18", 2634 + "tinyvec", 2635 + "tokio", 2636 + "tokio-rustls", 2637 + "tracing", 2638 + "url", 2639 + ] 2640 + 2641 + [[package]] 2642 + name = "hickory-resolver" 2643 + version = "0.25.2" 2644 + source = "registry+https://github.com/rust-lang/crates.io-index" 2645 + checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" 2646 + dependencies = [ 2647 + "cfg-if", 2648 + "futures-util", 2649 + "hickory-proto", 2650 + "ipconfig", 2651 + "moka", 2652 + "once_cell", 2653 + "parking_lot", 2654 + "rand 0.9.2", 2655 + "resolv-conf", 2656 + "rustls", 2657 + "smallvec", 2658 + "thiserror 2.0.18", 2659 + "tokio", 2660 + "tokio-rustls", 2661 + "tracing", 2662 + ] 2663 + 2664 + [[package]] 2023 2665 name = "hmac" 2024 2666 version = "0.12.1" 2025 2667 source = "registry+https://github.com/rust-lang/crates.io-index" 2026 2668 checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 2027 2669 dependencies = [ 2028 - "digest", 2670 + "digest 0.10.7", 2029 2671 ] 2030 2672 2031 2673 [[package]] ··· 2083 2725 checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 2084 2726 2085 2727 [[package]] 2728 + name = "hybrid-array" 2729 + version = "0.4.8" 2730 + source = "registry+https://github.com/rust-lang/crates.io-index" 2731 + checksum = "8655f91cd07f2b9d0c24137bd650fe69617773435ee5ec83022377777ce65ef1" 2732 + dependencies = [ 2733 + "typenum", 2734 + ] 2735 + 2736 + [[package]] 2086 2737 name = "hyper" 2087 2738 version = "1.8.1" 2088 2739 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2119 2770 "tokio", 2120 2771 "tokio-rustls", 2121 2772 "tower-service", 2773 + "webpki-roots 1.0.6", 2122 2774 ] 2123 2775 2124 2776 [[package]] ··· 2154 2806 "libc", 2155 2807 "percent-encoding", 2156 2808 "pin-project-lite", 2157 - "socket2", 2809 + "socket2 0.6.3", 2158 2810 "system-configuration", 2159 2811 "tokio", 2160 2812 "tower-service", ··· 2280 2932 checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 2281 2933 2282 2934 [[package]] 2935 + name = "identity-hash" 2936 + version = "0.1.0" 2937 + source = "registry+https://github.com/rust-lang/crates.io-index" 2938 + checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" 2939 + 2940 + [[package]] 2283 2941 name = "idna" 2284 2942 version = "1.1.0" 2285 2943 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2301 2959 ] 2302 2960 2303 2961 [[package]] 2962 + name = "igd-next" 2963 + version = "0.16.2" 2964 + source = "registry+https://github.com/rust-lang/crates.io-index" 2965 + checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" 2966 + dependencies = [ 2967 + "async-trait", 2968 + "attohttpc", 2969 + "bytes", 2970 + "futures", 2971 + "http", 2972 + "http-body-util", 2973 + "hyper", 2974 + "hyper-util", 2975 + "log", 2976 + "rand 0.9.2", 2977 + "tokio", 2978 + "url", 2979 + "xmltree", 2980 + ] 2981 + 2982 + [[package]] 2304 2983 name = "indexmap" 2305 2984 version = "2.13.0" 2306 2985 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2326 3005 ] 2327 3006 2328 3007 [[package]] 3008 + name = "inout" 3009 + version = "0.1.4" 3010 + source = "registry+https://github.com/rust-lang/crates.io-index" 3011 + checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 3012 + dependencies = [ 3013 + "generic-array", 3014 + ] 3015 + 3016 + [[package]] 2329 3017 name = "integer-encoding" 2330 3018 version = "3.0.4" 2331 3019 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2340 3028 "bitflags", 2341 3029 "cfg-if", 2342 3030 "libc", 3031 + ] 3032 + 3033 + [[package]] 3034 + name = "ipconfig" 3035 + version = "0.3.2" 3036 + source = "registry+https://github.com/rust-lang/crates.io-index" 3037 + checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" 3038 + dependencies = [ 3039 + "socket2 0.5.10", 3040 + "widestring", 3041 + "windows-sys 0.48.0", 3042 + "winreg", 2343 3043 ] 2344 3044 2345 3045 [[package]] ··· 2371 3071 ] 2372 3072 2373 3073 [[package]] 3074 + name = "iroh" 3075 + version = "0.97.0" 3076 + source = "registry+https://github.com/rust-lang/crates.io-index" 3077 + checksum = "feb56e7e4b0ec7fba7efa6a236b016a52b5d927d50244aceb9e20566159b1a32" 3078 + dependencies = [ 3079 + "backon", 3080 + "bytes", 3081 + "cfg_aliases", 3082 + "data-encoding", 3083 + "derive_more", 3084 + "ed25519-dalek 3.0.0-pre.1", 3085 + "futures-util", 3086 + "getrandom 0.3.4", 3087 + "hickory-resolver", 3088 + "http", 3089 + "ipnet", 3090 + "iroh-base", 3091 + "iroh-metrics", 3092 + "iroh-relay", 3093 + "n0-error", 3094 + "n0-future", 3095 + "n0-watcher", 3096 + "netwatch", 3097 + "noq", 3098 + "noq-proto", 3099 + "noq-udp", 3100 + "papaya", 3101 + "pin-project", 3102 + "pkarr", 3103 + "pkcs8 0.11.0-rc.11", 3104 + "portable-atomic", 3105 + "portmapper", 3106 + "rand 0.9.2", 3107 + "reqwest", 3108 + "rustc-hash", 3109 + "rustls", 3110 + "rustls-pki-types", 3111 + "rustls-webpki", 3112 + "serde", 3113 + "smallvec", 3114 + "strum", 3115 + "swarm-discovery", 3116 + "sync_wrapper", 3117 + "time", 3118 + "tokio", 3119 + "tokio-stream", 3120 + "tokio-util", 3121 + "tracing", 3122 + "url", 3123 + "wasm-bindgen-futures", 3124 + "webpki-roots 1.0.6", 3125 + ] 3126 + 3127 + [[package]] 3128 + name = "iroh-base" 3129 + version = "0.97.0" 3130 + source = "registry+https://github.com/rust-lang/crates.io-index" 3131 + checksum = "55a354e3396b62c14717ee807dfee9a7f43f6dad47e4ac0fd1d49f1ffad14ef0" 3132 + dependencies = [ 3133 + "curve25519-dalek 5.0.0-pre.1", 3134 + "data-encoding", 3135 + "derive_more", 3136 + "digest 0.11.0-rc.10", 3137 + "ed25519-dalek 3.0.0-pre.1", 3138 + "n0-error", 3139 + "rand_core 0.9.5", 3140 + "serde", 3141 + "sha2 0.11.0-rc.2", 3142 + "url", 3143 + "zeroize", 3144 + "zeroize_derive", 3145 + ] 3146 + 3147 + [[package]] 3148 + name = "iroh-gossip" 3149 + version = "0.97.0" 3150 + source = "registry+https://github.com/rust-lang/crates.io-index" 3151 + checksum = "4db5b64f3cb0a0c8b68b57888acd4cefcd2f0774f1a132d2a498cbb2a92fbc55" 3152 + dependencies = [ 3153 + "blake3", 3154 + "bytes", 3155 + "data-encoding", 3156 + "derive_more", 3157 + "ed25519-dalek 3.0.0-pre.1", 3158 + "futures-concurrency", 3159 + "futures-lite", 3160 + "futures-util", 3161 + "hex", 3162 + "indexmap", 3163 + "iroh", 3164 + "iroh-base", 3165 + "iroh-metrics", 3166 + "irpc", 3167 + "n0-error", 3168 + "n0-future", 3169 + "postcard", 3170 + "rand 0.9.2", 3171 + "serde", 3172 + "tokio", 3173 + "tokio-util", 3174 + "tracing", 3175 + ] 3176 + 3177 + [[package]] 3178 + name = "iroh-metrics" 3179 + version = "0.38.3" 3180 + source = "registry+https://github.com/rust-lang/crates.io-index" 3181 + checksum = "761b45ba046134b11eb3e432fa501616b45c4bf3a30c21717578bc07aa6461dd" 3182 + dependencies = [ 3183 + "iroh-metrics-derive", 3184 + "itoa", 3185 + "n0-error", 3186 + "portable-atomic", 3187 + "postcard", 3188 + "ryu", 3189 + "serde", 3190 + "tracing", 3191 + ] 3192 + 3193 + [[package]] 3194 + name = "iroh-metrics-derive" 3195 + version = "0.4.1" 3196 + source = "registry+https://github.com/rust-lang/crates.io-index" 3197 + checksum = "cab063c2bfd6c3d5a33a913d4fdb5252f140db29ec67c704f20f3da7e8f92dbf" 3198 + dependencies = [ 3199 + "heck", 3200 + "proc-macro2", 3201 + "quote", 3202 + "syn 2.0.117", 3203 + ] 3204 + 3205 + [[package]] 3206 + name = "iroh-ping" 3207 + version = "0.9.0" 3208 + source = "registry+https://github.com/rust-lang/crates.io-index" 3209 + checksum = "ae0d3040396ce546281e3716e3fa88bcc425a99ab2fd2715484a86f050a5d36e" 3210 + dependencies = [ 3211 + "anyhow", 3212 + "iroh", 3213 + "iroh-metrics", 3214 + "n0-error", 3215 + ] 3216 + 3217 + [[package]] 3218 + name = "iroh-relay" 3219 + version = "0.97.0" 3220 + source = "registry+https://github.com/rust-lang/crates.io-index" 3221 + checksum = "d786b260cadfe82ae0b6a9e372e8c78949096a06c857d1c3521355cefced0f55" 3222 + dependencies = [ 3223 + "blake3", 3224 + "bytes", 3225 + "cfg_aliases", 3226 + "data-encoding", 3227 + "derive_more", 3228 + "getrandom 0.3.4", 3229 + "hickory-resolver", 3230 + "http", 3231 + "http-body-util", 3232 + "hyper", 3233 + "hyper-util", 3234 + "iroh-base", 3235 + "iroh-metrics", 3236 + "lru", 3237 + "n0-error", 3238 + "n0-future", 3239 + "noq", 3240 + "noq-proto", 3241 + "num_enum", 3242 + "pin-project", 3243 + "pkarr", 3244 + "postcard", 3245 + "rand 0.9.2", 3246 + "reqwest", 3247 + "rustls", 3248 + "rustls-pki-types", 3249 + "serde", 3250 + "serde_bytes", 3251 + "strum", 3252 + "tokio", 3253 + "tokio-rustls", 3254 + "tokio-util", 3255 + "tokio-websockets", 3256 + "tracing", 3257 + "url", 3258 + "vergen-gitcl", 3259 + "webpki-roots 1.0.6", 3260 + "ws_stream_wasm", 3261 + "z32", 3262 + ] 3263 + 3264 + [[package]] 3265 + name = "iroh-tickets" 3266 + version = "0.4.0" 3267 + source = "registry+https://github.com/rust-lang/crates.io-index" 3268 + checksum = "ab64bac4bb573b9cfd2142bd2876ed65ca792efbc4398361a4ee51a0f9afbed6" 3269 + dependencies = [ 3270 + "data-encoding", 3271 + "derive_more", 3272 + "iroh-base", 3273 + "n0-error", 3274 + "postcard", 3275 + "serde", 3276 + ] 3277 + 3278 + [[package]] 3279 + name = "irpc" 3280 + version = "0.13.0" 3281 + source = "registry+https://github.com/rust-lang/crates.io-index" 3282 + checksum = "4f47b7c52662d673df377b5ac40c121c7ff56eb764e520fae6543686132f7957" 3283 + dependencies = [ 3284 + "futures-util", 3285 + "irpc-derive", 3286 + "n0-error", 3287 + "n0-future", 3288 + "serde", 3289 + "tokio", 3290 + "tokio-util", 3291 + "tracing", 3292 + ] 3293 + 3294 + [[package]] 3295 + name = "irpc-derive" 3296 + version = "0.10.0" 3297 + source = "registry+https://github.com/rust-lang/crates.io-index" 3298 + checksum = "83c1a4b460634aeed6dc01236a0047867de70e30562d91a0ad031dcb3ac33fb4" 3299 + dependencies = [ 3300 + "proc-macro2", 3301 + "quote", 3302 + "syn 2.0.117", 3303 + ] 3304 + 3305 + [[package]] 2374 3306 name = "is_terminal_polyfill" 2375 3307 version = "1.70.2" 2376 3308 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2387 3319 2388 3320 [[package]] 2389 3321 name = "itoa" 2390 - version = "1.0.17" 3322 + version = "1.0.18" 2391 3323 source = "registry+https://github.com/rust-lang/crates.io-index" 2392 - checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" 3324 + checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" 2393 3325 2394 3326 [[package]] 2395 3327 name = "jobserver" ··· 2421 3353 "ecdsa", 2422 3354 "elliptic-curve", 2423 3355 "once_cell", 2424 - "sha2", 2425 - "signature", 3356 + "sha2 0.10.9", 3357 + "signature 2.2.0", 2426 3358 ] 2427 3359 2428 3360 [[package]] ··· 2533 3465 2534 3466 [[package]] 2535 3467 name = "libc" 2536 - version = "0.2.182" 3468 + version = "0.2.183" 2537 3469 source = "registry+https://github.com/rust-lang/crates.io-index" 2538 - checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" 3470 + checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 2539 3471 2540 3472 [[package]] 2541 3473 name = "libm" ··· 2576 3508 checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2577 3509 2578 3510 [[package]] 3511 + name = "litrs" 3512 + version = "1.0.0" 3513 + source = "registry+https://github.com/rust-lang/crates.io-index" 3514 + checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" 3515 + 3516 + [[package]] 2579 3517 name = "lock_api" 2580 3518 version = "0.4.14" 2581 3519 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2594 3532 ] 2595 3533 2596 3534 [[package]] 3535 + name = "loom" 3536 + version = "0.7.2" 3537 + source = "registry+https://github.com/rust-lang/crates.io-index" 3538 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 3539 + dependencies = [ 3540 + "cfg-if", 3541 + "generator", 3542 + "scoped-tls", 3543 + "tracing", 3544 + "tracing-subscriber", 3545 + ] 3546 + 3547 + [[package]] 3548 + name = "lru" 3549 + version = "0.16.3" 3550 + source = "registry+https://github.com/rust-lang/crates.io-index" 3551 + checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" 3552 + dependencies = [ 3553 + "hashbrown 0.16.1", 3554 + ] 3555 + 3556 + [[package]] 3557 + name = "lru-slab" 3558 + version = "0.1.2" 3559 + source = "registry+https://github.com/rust-lang/crates.io-index" 3560 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 3561 + 3562 + [[package]] 2597 3563 name = "lz4" 2598 3564 version = "1.28.1" 2599 3565 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2614 3580 2615 3581 [[package]] 2616 3582 name = "lz4_flex" 2617 - version = "0.11.5" 3583 + version = "0.11.6" 2618 3584 source = "registry+https://github.com/rust-lang/crates.io-index" 2619 - checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" 3585 + checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" 2620 3586 dependencies = [ 2621 3587 "twox-hash", 2622 3588 ] 2623 3589 2624 3590 [[package]] 3591 + name = "mac-addr" 3592 + version = "0.3.0" 3593 + source = "registry+https://github.com/rust-lang/crates.io-index" 3594 + checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f" 3595 + 3596 + [[package]] 2625 3597 name = "madsim" 2626 3598 version = "0.2.34" 2627 3599 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2645 3617 "rand_xoshiro", 2646 3618 "rustversion", 2647 3619 "serde", 2648 - "spin", 3620 + "spin 0.9.8", 2649 3621 "tokio", 2650 3622 "tokio-util", 2651 3623 "toml 0.9.12+spec-1.1.0", ··· 2672 3644 checksum = "7d3eb2acc57c82d21d699119b859e2df70a91dbdb84734885a1e72be83bdecb5" 2673 3645 dependencies = [ 2674 3646 "madsim", 2675 - "spin", 3647 + "spin 0.9.8", 2676 3648 "tokio", 2677 3649 ] 2678 3650 ··· 2688 3660 ] 2689 3661 2690 3662 [[package]] 3663 + name = "matchers" 3664 + version = "0.2.0" 3665 + source = "registry+https://github.com/rust-lang/crates.io-index" 3666 + checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 3667 + dependencies = [ 3668 + "regex-automata", 3669 + ] 3670 + 3671 + [[package]] 2691 3672 name = "matchit" 2692 3673 version = "0.8.4" 2693 3674 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2762 3743 ] 2763 3744 2764 3745 [[package]] 3746 + name = "moka" 3747 + version = "0.12.14" 3748 + source = "registry+https://github.com/rust-lang/crates.io-index" 3749 + checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b" 3750 + dependencies = [ 3751 + "crossbeam-channel", 3752 + "crossbeam-epoch", 3753 + "crossbeam-utils", 3754 + "equivalent", 3755 + "parking_lot", 3756 + "portable-atomic", 3757 + "smallvec", 3758 + "tagptr", 3759 + "uuid", 3760 + ] 3761 + 3762 + [[package]] 2765 3763 name = "multibase" 2766 3764 version = "0.9.2" 2767 3765 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2788 3786 ] 2789 3787 2790 3788 [[package]] 3789 + name = "n0-error" 3790 + version = "0.1.3" 3791 + source = "registry+https://github.com/rust-lang/crates.io-index" 3792 + checksum = "af4782b4baf92d686d161c15460c83d16ebcfd215918763903e9619842665cae" 3793 + dependencies = [ 3794 + "anyhow", 3795 + "n0-error-macros", 3796 + "spez", 3797 + ] 3798 + 3799 + [[package]] 3800 + name = "n0-error-macros" 3801 + version = "0.1.3" 3802 + source = "registry+https://github.com/rust-lang/crates.io-index" 3803 + checksum = "03755949235714b2b307e5ae89dd8c1c2531fb127d9b8b7b4adf9c876cd3ed18" 3804 + dependencies = [ 3805 + "proc-macro2", 3806 + "quote", 3807 + "syn 2.0.117", 3808 + ] 3809 + 3810 + [[package]] 3811 + name = "n0-future" 3812 + version = "0.3.2" 3813 + source = "registry+https://github.com/rust-lang/crates.io-index" 3814 + checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe" 3815 + dependencies = [ 3816 + "cfg_aliases", 3817 + "derive_more", 3818 + "futures-buffered", 3819 + "futures-lite", 3820 + "futures-util", 3821 + "js-sys", 3822 + "pin-project", 3823 + "send_wrapper", 3824 + "tokio", 3825 + "tokio-util", 3826 + "wasm-bindgen", 3827 + "wasm-bindgen-futures", 3828 + "web-time", 3829 + ] 3830 + 3831 + [[package]] 3832 + name = "n0-watcher" 3833 + version = "0.6.1" 3834 + source = "registry+https://github.com/rust-lang/crates.io-index" 3835 + checksum = "38795f7932e6e9d1c6e989270ef5b3ff24ebb910e2c9d4bed2d28d8bae3007dc" 3836 + dependencies = [ 3837 + "derive_more", 3838 + "n0-error", 3839 + "n0-future", 3840 + ] 3841 + 3842 + [[package]] 2791 3843 name = "naive-timer" 2792 3844 version = "0.2.0" 2793 3845 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2820 3872 ] 2821 3873 2822 3874 [[package]] 3875 + name = "netdev" 3876 + version = "0.40.1" 3877 + source = "registry+https://github.com/rust-lang/crates.io-index" 3878 + checksum = "1b0a0096d9613ee878dba89bbe595f079d373e3f1960d882e4f2f78ff9c30a0a" 3879 + dependencies = [ 3880 + "block2", 3881 + "dispatch2", 3882 + "dlopen2", 3883 + "ipnet", 3884 + "libc", 3885 + "mac-addr", 3886 + "netlink-packet-core", 3887 + "netlink-packet-route", 3888 + "netlink-sys", 3889 + "objc2-core-foundation", 3890 + "objc2-system-configuration", 3891 + "once_cell", 3892 + "plist", 3893 + "windows-sys 0.59.0", 3894 + ] 3895 + 3896 + [[package]] 3897 + name = "netlink-packet-core" 3898 + version = "0.8.1" 3899 + source = "registry+https://github.com/rust-lang/crates.io-index" 3900 + checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" 3901 + dependencies = [ 3902 + "paste", 3903 + ] 3904 + 3905 + [[package]] 3906 + name = "netlink-packet-route" 3907 + version = "0.29.0" 3908 + source = "registry+https://github.com/rust-lang/crates.io-index" 3909 + checksum = "df9854ea6ad14e3f4698a7f03b65bce0833dd2d81d594a0e4a984170537146b6" 3910 + dependencies = [ 3911 + "bitflags", 3912 + "libc", 3913 + "log", 3914 + "netlink-packet-core", 3915 + ] 3916 + 3917 + [[package]] 3918 + name = "netlink-proto" 3919 + version = "0.12.0" 3920 + source = "registry+https://github.com/rust-lang/crates.io-index" 3921 + checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" 3922 + dependencies = [ 3923 + "bytes", 3924 + "futures", 3925 + "log", 3926 + "netlink-packet-core", 3927 + "netlink-sys", 3928 + "thiserror 2.0.18", 3929 + ] 3930 + 3931 + [[package]] 3932 + name = "netlink-sys" 3933 + version = "0.8.8" 3934 + source = "registry+https://github.com/rust-lang/crates.io-index" 3935 + checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" 3936 + dependencies = [ 3937 + "bytes", 3938 + "futures-util", 3939 + "libc", 3940 + "log", 3941 + "tokio", 3942 + ] 3943 + 3944 + [[package]] 3945 + name = "netwatch" 3946 + version = "0.15.0" 3947 + source = "registry+https://github.com/rust-lang/crates.io-index" 3948 + checksum = "3b1b27babe89ef9f2237bc6c028bea24fa84163a1b6f8f17ff93573ebd7d861f" 3949 + dependencies = [ 3950 + "atomic-waker", 3951 + "bytes", 3952 + "cfg_aliases", 3953 + "derive_more", 3954 + "js-sys", 3955 + "libc", 3956 + "n0-error", 3957 + "n0-future", 3958 + "n0-watcher", 3959 + "netdev", 3960 + "netlink-packet-core", 3961 + "netlink-packet-route", 3962 + "netlink-proto", 3963 + "netlink-sys", 3964 + "noq-udp", 3965 + "objc2-core-foundation", 3966 + "objc2-system-configuration", 3967 + "pin-project-lite", 3968 + "serde", 3969 + "socket2 0.6.3", 3970 + "time", 3971 + "tokio", 3972 + "tokio-util", 3973 + "tracing", 3974 + "web-sys", 3975 + "windows", 3976 + "windows-result", 3977 + "wmi", 3978 + ] 3979 + 3980 + [[package]] 2823 3981 name = "nibble_vec" 2824 3982 version = "0.1.0" 2825 3983 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2878 4036 ] 2879 4037 2880 4038 [[package]] 4039 + name = "noq" 4040 + version = "0.17.0" 4041 + source = "registry+https://github.com/rust-lang/crates.io-index" 4042 + checksum = "8df966fb44ac763bc86da97fa6c811c54ae82ef656575949f93c6dae0c9f09bf" 4043 + dependencies = [ 4044 + "bytes", 4045 + "cfg_aliases", 4046 + "noq-proto", 4047 + "noq-udp", 4048 + "pin-project-lite", 4049 + "rustc-hash", 4050 + "rustls", 4051 + "socket2 0.6.3", 4052 + "thiserror 2.0.18", 4053 + "tokio", 4054 + "tokio-stream", 4055 + "tracing", 4056 + "web-time", 4057 + ] 4058 + 4059 + [[package]] 4060 + name = "noq-proto" 4061 + version = "0.16.0" 4062 + source = "registry+https://github.com/rust-lang/crates.io-index" 4063 + checksum = "5c61b72abd670eebc05b5cf720e077b04a3ef3354bc7bc19f1c3524cb424db7b" 4064 + dependencies = [ 4065 + "aes-gcm", 4066 + "bytes", 4067 + "derive_more", 4068 + "enum-assoc", 4069 + "fastbloom", 4070 + "getrandom 0.3.4", 4071 + "identity-hash", 4072 + "lru-slab", 4073 + "rand 0.9.2", 4074 + "ring", 4075 + "rustc-hash", 4076 + "rustls", 4077 + "rustls-pki-types", 4078 + "slab", 4079 + "sorted-index-buffer", 4080 + "thiserror 2.0.18", 4081 + "tinyvec", 4082 + "tracing", 4083 + "web-time", 4084 + ] 4085 + 4086 + [[package]] 4087 + name = "noq-udp" 4088 + version = "0.9.0" 4089 + source = "registry+https://github.com/rust-lang/crates.io-index" 4090 + checksum = "bb9be4fedd6b98f3ba82ccd3506f4d0219fb723c3f97c67e12fe1494aa020e44" 4091 + dependencies = [ 4092 + "cfg_aliases", 4093 + "libc", 4094 + "socket2 0.6.3", 4095 + "tracing", 4096 + "windows-sys 0.61.2", 4097 + ] 4098 + 4099 + [[package]] 4100 + name = "ntimestamp" 4101 + version = "1.0.0" 4102 + source = "registry+https://github.com/rust-lang/crates.io-index" 4103 + checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" 4104 + dependencies = [ 4105 + "base32", 4106 + "document-features", 4107 + "getrandom 0.2.17", 4108 + "httpdate", 4109 + "js-sys", 4110 + "once_cell", 4111 + "serde", 4112 + ] 4113 + 4114 + [[package]] 2881 4115 name = "nu-ansi-term" 2882 4116 version = "0.50.3" 2883 4117 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2920 4154 ] 2921 4155 2922 4156 [[package]] 4157 + name = "num-conv" 4158 + version = "0.2.0" 4159 + source = "registry+https://github.com/rust-lang/crates.io-index" 4160 + checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 4161 + 4162 + [[package]] 2923 4163 name = "num-integer" 2924 4164 version = "0.1.46" 2925 4165 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2971 4211 ] 2972 4212 2973 4213 [[package]] 4214 + name = "num_enum" 4215 + version = "0.7.6" 4216 + source = "registry+https://github.com/rust-lang/crates.io-index" 4217 + checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" 4218 + dependencies = [ 4219 + "num_enum_derive", 4220 + "rustversion", 4221 + ] 4222 + 4223 + [[package]] 4224 + name = "num_enum_derive" 4225 + version = "0.7.6" 4226 + source = "registry+https://github.com/rust-lang/crates.io-index" 4227 + checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" 4228 + dependencies = [ 4229 + "proc-macro-crate", 4230 + "proc-macro2", 4231 + "quote", 4232 + "syn 2.0.117", 4233 + ] 4234 + 4235 + [[package]] 4236 + name = "num_threads" 4237 + version = "0.1.7" 4238 + source = "registry+https://github.com/rust-lang/crates.io-index" 4239 + checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 4240 + dependencies = [ 4241 + "libc", 4242 + ] 4243 + 4244 + [[package]] 2974 4245 name = "number_prefix" 2975 4246 version = "0.4.0" 2976 4247 source = "registry+https://github.com/rust-lang/crates.io-index" 2977 4248 checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 2978 4249 2979 4250 [[package]] 4251 + name = "objc2" 4252 + version = "0.6.4" 4253 + source = "registry+https://github.com/rust-lang/crates.io-index" 4254 + checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" 4255 + dependencies = [ 4256 + "objc2-encode", 4257 + ] 4258 + 4259 + [[package]] 4260 + name = "objc2-core-foundation" 4261 + version = "0.3.2" 4262 + source = "registry+https://github.com/rust-lang/crates.io-index" 4263 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 4264 + dependencies = [ 4265 + "bitflags", 4266 + "block2", 4267 + "dispatch2", 4268 + "libc", 4269 + "objc2", 4270 + ] 4271 + 4272 + [[package]] 4273 + name = "objc2-encode" 4274 + version = "4.1.0" 4275 + source = "registry+https://github.com/rust-lang/crates.io-index" 4276 + checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 4277 + 4278 + [[package]] 4279 + name = "objc2-security" 4280 + version = "0.3.2" 4281 + source = "registry+https://github.com/rust-lang/crates.io-index" 4282 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 4283 + dependencies = [ 4284 + "bitflags", 4285 + "objc2", 4286 + "objc2-core-foundation", 4287 + ] 4288 + 4289 + [[package]] 4290 + name = "objc2-system-configuration" 4291 + version = "0.3.2" 4292 + source = "registry+https://github.com/rust-lang/crates.io-index" 4293 + checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" 4294 + dependencies = [ 4295 + "bitflags", 4296 + "dispatch2", 4297 + "libc", 4298 + "objc2", 4299 + "objc2-core-foundation", 4300 + "objc2-security", 4301 + ] 4302 + 4303 + [[package]] 2980 4304 name = "once_cell" 2981 - version = "1.21.3" 4305 + version = "1.21.4" 2982 4306 source = "registry+https://github.com/rust-lang/crates.io-index" 2983 - checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 4307 + checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" 4308 + dependencies = [ 4309 + "critical-section", 4310 + "portable-atomic", 4311 + ] 2984 4312 2985 4313 [[package]] 2986 4314 name = "once_cell_polyfill" 2987 4315 version = "1.70.2" 2988 4316 source = "registry+https://github.com/rust-lang/crates.io-index" 2989 4317 checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 4318 + 4319 + [[package]] 4320 + name = "opaque-debug" 4321 + version = "0.3.1" 4322 + source = "registry+https://github.com/rust-lang/crates.io-index" 4323 + checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 2990 4324 2991 4325 [[package]] 2992 4326 name = "openssl" 2993 - version = "0.10.75" 4327 + version = "0.10.76" 2994 4328 source = "registry+https://github.com/rust-lang/crates.io-index" 2995 - checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" 4329 + checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" 2996 4330 dependencies = [ 2997 4331 "bitflags", 2998 4332 "cfg-if", ··· 3022 4356 3023 4357 [[package]] 3024 4358 name = "openssl-sys" 3025 - version = "0.9.111" 4359 + version = "0.9.112" 3026 4360 source = "registry+https://github.com/rust-lang/crates.io-index" 3027 - checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" 4361 + checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" 3028 4362 dependencies = [ 3029 4363 "cc", 3030 4364 "libc", ··· 3071 4405 "ecdsa", 3072 4406 "elliptic-curve", 3073 4407 "primeorder", 3074 - "sha2", 4408 + "sha2 0.10.9", 3075 4409 ] 3076 4410 3077 4411 [[package]] ··· 3081 4415 checksum = "384e52fd8fbd4cbe3c317e8216260c21a0f9134de108cea8a4dd4e7e152c472d" 3082 4416 3083 4417 [[package]] 4418 + name = "papaya" 4419 + version = "0.2.3" 4420 + source = "registry+https://github.com/rust-lang/crates.io-index" 4421 + checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" 4422 + dependencies = [ 4423 + "equivalent", 4424 + "seize", 4425 + ] 4426 + 4427 + [[package]] 3084 4428 name = "parking" 3085 4429 version = "2.2.1" 3086 4430 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3158 4502 ] 3159 4503 3160 4504 [[package]] 4505 + name = "pem-rfc7468" 4506 + version = "1.0.0" 4507 + source = "registry+https://github.com/rust-lang/crates.io-index" 4508 + checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" 4509 + dependencies = [ 4510 + "base64ct", 4511 + ] 4512 + 4513 + [[package]] 3161 4514 name = "percent-encoding" 3162 4515 version = "2.3.2" 3163 4516 source = "registry+https://github.com/rust-lang/crates.io-index" 3164 4517 checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 3165 4518 3166 4519 [[package]] 4520 + name = "pharos" 4521 + version = "0.5.3" 4522 + source = "registry+https://github.com/rust-lang/crates.io-index" 4523 + checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 4524 + dependencies = [ 4525 + "futures", 4526 + "rustc_version", 4527 + ] 4528 + 4529 + [[package]] 3167 4530 name = "pin-project" 3168 4531 version = "1.1.11" 3169 4532 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3207 4570 ] 3208 4571 3209 4572 [[package]] 4573 + name = "pkarr" 4574 + version = "5.0.3" 4575 + source = "registry+https://github.com/rust-lang/crates.io-index" 4576 + checksum = "2f950360d31be432c0c9467fba5024a94f55128e7f32bc9d32db140369f24c77" 4577 + dependencies = [ 4578 + "base32", 4579 + "bytes", 4580 + "cfg_aliases", 4581 + "document-features", 4582 + "ed25519-dalek 3.0.0-pre.1", 4583 + "getrandom 0.4.2", 4584 + "ntimestamp", 4585 + "self_cell", 4586 + "serde", 4587 + "simple-dns", 4588 + "thiserror 2.0.18", 4589 + ] 4590 + 4591 + [[package]] 3210 4592 name = "pkcs8" 3211 4593 version = "0.10.2" 3212 4594 source = "registry+https://github.com/rust-lang/crates.io-index" 3213 4595 checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 3214 4596 dependencies = [ 3215 - "der", 3216 - "spki", 4597 + "der 0.7.10", 4598 + "spki 0.7.3", 4599 + ] 4600 + 4601 + [[package]] 4602 + name = "pkcs8" 4603 + version = "0.11.0-rc.11" 4604 + source = "registry+https://github.com/rust-lang/crates.io-index" 4605 + checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" 4606 + dependencies = [ 4607 + "der 0.8.0", 4608 + "spki 0.8.0-rc.4", 3217 4609 ] 3218 4610 3219 4611 [[package]] ··· 3223 4615 checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 3224 4616 3225 4617 [[package]] 4618 + name = "plist" 4619 + version = "1.8.0" 4620 + source = "registry+https://github.com/rust-lang/crates.io-index" 4621 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 4622 + dependencies = [ 4623 + "base64", 4624 + "indexmap", 4625 + "quick-xml", 4626 + "serde", 4627 + "time", 4628 + ] 4629 + 4630 + [[package]] 3226 4631 name = "polling" 3227 4632 version = "3.11.0" 3228 4633 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3237 4642 ] 3238 4643 3239 4644 [[package]] 4645 + name = "polyval" 4646 + version = "0.6.2" 4647 + source = "registry+https://github.com/rust-lang/crates.io-index" 4648 + checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 4649 + dependencies = [ 4650 + "cfg-if", 4651 + "cpufeatures", 4652 + "opaque-debug", 4653 + "universal-hash", 4654 + ] 4655 + 4656 + [[package]] 3240 4657 name = "portable-atomic" 3241 4658 version = "1.13.1" 3242 4659 source = "registry+https://github.com/rust-lang/crates.io-index" 3243 4660 checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 4661 + dependencies = [ 4662 + "serde", 4663 + ] 4664 + 4665 + [[package]] 4666 + name = "portmapper" 4667 + version = "0.15.0" 4668 + source = "registry+https://github.com/rust-lang/crates.io-index" 4669 + checksum = "74748bc706fa6b6aebac6bbe0bbe0de806b384cb5c557ea974f771360a4e3858" 4670 + dependencies = [ 4671 + "base64", 4672 + "bytes", 4673 + "derive_more", 4674 + "futures-lite", 4675 + "futures-util", 4676 + "hyper-util", 4677 + "igd-next", 4678 + "iroh-metrics", 4679 + "libc", 4680 + "n0-error", 4681 + "netwatch", 4682 + "num_enum", 4683 + "rand 0.9.2", 4684 + "serde", 4685 + "smallvec", 4686 + "socket2 0.6.3", 4687 + "time", 4688 + "tokio", 4689 + "tokio-util", 4690 + "tower-layer", 4691 + "tracing", 4692 + "url", 4693 + ] 4694 + 4695 + [[package]] 4696 + name = "postcard" 4697 + version = "1.1.3" 4698 + source = "registry+https://github.com/rust-lang/crates.io-index" 4699 + checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" 4700 + dependencies = [ 4701 + "cobs", 4702 + "embedded-io 0.4.0", 4703 + "embedded-io 0.6.1", 4704 + "heapless", 4705 + "postcard-derive", 4706 + "serde", 4707 + ] 4708 + 4709 + [[package]] 4710 + name = "postcard-derive" 4711 + version = "0.2.2" 4712 + source = "registry+https://github.com/rust-lang/crates.io-index" 4713 + checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" 4714 + dependencies = [ 4715 + "proc-macro2", 4716 + "quote", 4717 + "syn 2.0.117", 4718 + ] 3244 4719 3245 4720 [[package]] 3246 4721 name = "potential_utf" ··· 3252 4727 ] 3253 4728 3254 4729 [[package]] 4730 + name = "powerfmt" 4731 + version = "0.2.0" 4732 + source = "registry+https://github.com/rust-lang/crates.io-index" 4733 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 4734 + 4735 + [[package]] 3255 4736 name = "ppv-lite86" 3256 4737 version = "0.2.21" 3257 4738 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3281 4762 3282 4763 [[package]] 3283 4764 name = "proc-macro-crate" 3284 - version = "3.4.0" 4765 + version = "3.5.0" 3285 4766 source = "registry+https://github.com/rust-lang/crates.io-index" 3286 - checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 4767 + checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" 3287 4768 dependencies = [ 3288 4769 "toml_edit", 3289 4770 ] ··· 3298 4779 ] 3299 4780 3300 4781 [[package]] 4782 + name = "quick-xml" 4783 + version = "0.38.4" 4784 + source = "registry+https://github.com/rust-lang/crates.io-index" 4785 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 4786 + dependencies = [ 4787 + "memchr", 4788 + ] 4789 + 4790 + [[package]] 3301 4791 name = "quickcheck" 3302 4792 version = "1.1.0" 3303 4793 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3309 4799 ] 3310 4800 3311 4801 [[package]] 4802 + name = "quinn" 4803 + version = "0.11.9" 4804 + source = "registry+https://github.com/rust-lang/crates.io-index" 4805 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 4806 + dependencies = [ 4807 + "bytes", 4808 + "cfg_aliases", 4809 + "pin-project-lite", 4810 + "quinn-proto", 4811 + "quinn-udp", 4812 + "rustc-hash", 4813 + "rustls", 4814 + "socket2 0.6.3", 4815 + "thiserror 2.0.18", 4816 + "tokio", 4817 + "tracing", 4818 + "web-time", 4819 + ] 4820 + 4821 + [[package]] 4822 + name = "quinn-proto" 4823 + version = "0.11.14" 4824 + source = "registry+https://github.com/rust-lang/crates.io-index" 4825 + checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" 4826 + dependencies = [ 4827 + "bytes", 4828 + "getrandom 0.3.4", 4829 + "lru-slab", 4830 + "rand 0.9.2", 4831 + "ring", 4832 + "rustc-hash", 4833 + "rustls", 4834 + "rustls-pki-types", 4835 + "slab", 4836 + "thiserror 2.0.18", 4837 + "tinyvec", 4838 + "tracing", 4839 + "web-time", 4840 + ] 4841 + 4842 + [[package]] 4843 + name = "quinn-udp" 4844 + version = "0.5.14" 4845 + source = "registry+https://github.com/rust-lang/crates.io-index" 4846 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 4847 + dependencies = [ 4848 + "cfg_aliases", 4849 + "libc", 4850 + "once_cell", 4851 + "socket2 0.6.3", 4852 + "tracing", 4853 + "windows-sys 0.60.2", 4854 + ] 4855 + 4856 + [[package]] 3312 4857 name = "quote" 3313 - version = "1.0.44" 4858 + version = "1.0.45" 3314 4859 source = "registry+https://github.com/rust-lang/crates.io-index" 3315 - checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" 4860 + checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" 3316 4861 dependencies = [ 3317 4862 "proc-macro2", 3318 4863 ] ··· 3322 4867 version = "5.3.0" 3323 4868 source = "registry+https://github.com/rust-lang/crates.io-index" 3324 4869 checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 4870 + 4871 + [[package]] 4872 + name = "r-efi" 4873 + version = "6.0.0" 4874 + source = "registry+https://github.com/rust-lang/crates.io-index" 4875 + checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" 3325 4876 3326 4877 [[package]] 3327 4878 name = "radix_trie" ··· 3360 4911 source = "registry+https://github.com/rust-lang/crates.io-index" 3361 4912 checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" 3362 4913 dependencies = [ 3363 - "getrandom 0.4.1", 4914 + "getrandom 0.4.2", 3364 4915 "rand_core 0.10.0", 3365 4916 ] 3366 4917 ··· 3539 5090 "native-tls", 3540 5091 "percent-encoding", 3541 5092 "pin-project-lite", 5093 + "quinn", 5094 + "rustls", 3542 5095 "rustls-pki-types", 3543 5096 "serde", 3544 5097 "serde_json", ··· 3546 5099 "sync_wrapper", 3547 5100 "tokio", 3548 5101 "tokio-native-tls", 5102 + "tokio-rustls", 3549 5103 "tokio-util", 3550 5104 "tower", 3551 5105 "tower-http", ··· 3555 5109 "wasm-bindgen-futures", 3556 5110 "wasm-streams", 3557 5111 "web-sys", 5112 + "webpki-roots 1.0.6", 3558 5113 ] 3559 5114 3560 5115 [[package]] ··· 3572 5127 "reqwest", 3573 5128 "thiserror 1.0.69", 3574 5129 ] 5130 + 5131 + [[package]] 5132 + name = "resolv-conf" 5133 + version = "0.7.6" 5134 + source = "registry+https://github.com/rust-lang/crates.io-index" 5135 + checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" 3575 5136 3576 5137 [[package]] 3577 5138 name = "rfc6979" ··· 3688 5249 "log", 3689 5250 "rusqlite", 3690 5251 ] 5252 + 5253 + [[package]] 5254 + name = "rustc-hash" 5255 + version = "2.1.1" 5256 + source = "registry+https://github.com/rust-lang/crates.io-index" 5257 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 3691 5258 3692 5259 [[package]] 3693 5260 name = "rustc_version" ··· 3732 5299 source = "registry+https://github.com/rust-lang/crates.io-index" 3733 5300 checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 3734 5301 dependencies = [ 5302 + "web-time", 3735 5303 "zeroize", 3736 5304 ] 3737 5305 3738 5306 [[package]] 3739 5307 name = "rustls-webpki" 3740 - version = "0.103.9" 5308 + version = "0.103.10" 3741 5309 source = "registry+https://github.com/rust-lang/crates.io-index" 3742 - checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" 5310 + checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" 3743 5311 dependencies = [ 3744 5312 "ring", 3745 5313 "rustls-pki-types", ··· 3791 5359 3792 5360 [[package]] 3793 5361 name = "schannel" 3794 - version = "0.1.28" 5362 + version = "0.1.29" 3795 5363 source = "registry+https://github.com/rust-lang/crates.io-index" 3796 - checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 5364 + checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" 3797 5365 dependencies = [ 3798 5366 "windows-sys 0.61.2", 3799 5367 ] ··· 3824 5392 ] 3825 5393 3826 5394 [[package]] 5395 + name = "scoped-tls" 5396 + version = "1.0.1" 5397 + source = "registry+https://github.com/rust-lang/crates.io-index" 5398 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 5399 + 5400 + [[package]] 3827 5401 name = "scopeguard" 3828 5402 version = "1.2.0" 3829 5403 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3842 5416 checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 3843 5417 dependencies = [ 3844 5418 "base16ct", 3845 - "der", 5419 + "der 0.7.10", 3846 5420 "generic-array", 3847 - "pkcs8", 5421 + "pkcs8 0.10.2", 3848 5422 "subtle", 3849 5423 "zeroize", 3850 5424 ] ··· 3886 5460 ] 3887 5461 3888 5462 [[package]] 5463 + name = "seize" 5464 + version = "0.5.1" 5465 + source = "registry+https://github.com/rust-lang/crates.io-index" 5466 + checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" 5467 + dependencies = [ 5468 + "libc", 5469 + "windows-sys 0.61.2", 5470 + ] 5471 + 5472 + [[package]] 5473 + name = "self_cell" 5474 + version = "1.2.2" 5475 + source = "registry+https://github.com/rust-lang/crates.io-index" 5476 + checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" 5477 + 5478 + [[package]] 3889 5479 name = "semver" 3890 5480 version = "1.0.27" 3891 5481 source = "registry+https://github.com/rust-lang/crates.io-index" 3892 5482 checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3893 5483 3894 5484 [[package]] 5485 + name = "send_wrapper" 5486 + version = "0.6.0" 5487 + source = "registry+https://github.com/rust-lang/crates.io-index" 5488 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 5489 + 5490 + [[package]] 3895 5491 name = "seq-macro" 3896 5492 version = "0.3.6" 3897 5493 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4050 5646 dependencies = [ 4051 5647 "cfg-if", 4052 5648 "cpufeatures", 4053 - "digest", 5649 + "digest 0.10.7", 5650 + ] 5651 + 5652 + [[package]] 5653 + name = "sha2" 5654 + version = "0.11.0-rc.2" 5655 + source = "registry+https://github.com/rust-lang/crates.io-index" 5656 + checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" 5657 + dependencies = [ 5658 + "cfg-if", 5659 + "cpufeatures", 5660 + "digest 0.11.0-rc.10", 4054 5661 ] 4055 5662 4056 5663 [[package]] ··· 4084 5691 source = "registry+https://github.com/rust-lang/crates.io-index" 4085 5692 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 4086 5693 dependencies = [ 4087 - "digest", 5694 + "digest 0.10.7", 4088 5695 "rand_core 0.6.4", 4089 5696 ] 4090 5697 4091 5698 [[package]] 5699 + name = "signature" 5700 + version = "3.0.0-rc.10" 5701 + source = "registry+https://github.com/rust-lang/crates.io-index" 5702 + checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" 5703 + 5704 + [[package]] 4092 5705 name = "simd-adler32" 4093 5706 version = "0.3.8" 4094 5707 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4101 5714 checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 4102 5715 4103 5716 [[package]] 5717 + name = "simple-dns" 5718 + version = "0.9.3" 5719 + source = "registry+https://github.com/rust-lang/crates.io-index" 5720 + checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" 5721 + dependencies = [ 5722 + "bitflags", 5723 + ] 5724 + 5725 + [[package]] 5726 + name = "siphasher" 5727 + version = "1.0.2" 5728 + source = "registry+https://github.com/rust-lang/crates.io-index" 5729 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 5730 + 5731 + [[package]] 4104 5732 name = "slab" 4105 5733 version = "0.4.12" 4106 5734 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4117 5745 version = "1.15.1" 4118 5746 source = "registry+https://github.com/rust-lang/crates.io-index" 4119 5747 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 5748 + 5749 + [[package]] 5750 + name = "smol_str" 5751 + version = "0.1.24" 5752 + source = "registry+https://github.com/rust-lang/crates.io-index" 5753 + checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" 4120 5754 4121 5755 [[package]] 4122 5756 name = "snap" ··· 4126 5760 4127 5761 [[package]] 4128 5762 name = "socket2" 4129 - version = "0.6.2" 5763 + version = "0.5.10" 5764 + source = "registry+https://github.com/rust-lang/crates.io-index" 5765 + checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 5766 + dependencies = [ 5767 + "libc", 5768 + "windows-sys 0.52.0", 5769 + ] 5770 + 5771 + [[package]] 5772 + name = "socket2" 5773 + version = "0.6.3" 4130 5774 source = "registry+https://github.com/rust-lang/crates.io-index" 4131 - checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" 5775 + checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" 4132 5776 dependencies = [ 4133 5777 "libc", 4134 - "windows-sys 0.60.2", 5778 + "windows-sys 0.61.2", 4135 5779 ] 4136 5780 4137 5781 [[package]] ··· 4146 5790 ] 4147 5791 4148 5792 [[package]] 5793 + name = "sorted-index-buffer" 5794 + version = "0.2.1" 5795 + source = "registry+https://github.com/rust-lang/crates.io-index" 5796 + checksum = "ea06cc588e43c632923a55450401b8f25e628131571d4e1baea1bdfdb2b5ed06" 5797 + 5798 + [[package]] 5799 + name = "spez" 5800 + version = "0.1.2" 5801 + source = "registry+https://github.com/rust-lang/crates.io-index" 5802 + checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" 5803 + dependencies = [ 5804 + "proc-macro2", 5805 + "quote", 5806 + "syn 2.0.117", 5807 + ] 5808 + 5809 + [[package]] 4149 5810 name = "spin" 4150 5811 version = "0.9.8" 4151 5812 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4155 5816 ] 4156 5817 4157 5818 [[package]] 5819 + name = "spin" 5820 + version = "0.10.0" 5821 + source = "registry+https://github.com/rust-lang/crates.io-index" 5822 + checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" 5823 + 5824 + [[package]] 4158 5825 name = "spki" 4159 5826 version = "0.7.3" 4160 5827 source = "registry+https://github.com/rust-lang/crates.io-index" 4161 5828 checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 4162 5829 dependencies = [ 4163 5830 "base64ct", 4164 - "der", 5831 + "der 0.7.10", 5832 + ] 5833 + 5834 + [[package]] 5835 + name = "spki" 5836 + version = "0.8.0-rc.4" 5837 + source = "registry+https://github.com/rust-lang/crates.io-index" 5838 + checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" 5839 + dependencies = [ 5840 + "base64ct", 5841 + "der 0.8.0", 4165 5842 ] 4166 5843 4167 5844 [[package]] ··· 4195 5872 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 4196 5873 4197 5874 [[package]] 5875 + name = "strum" 5876 + version = "0.28.0" 5877 + source = "registry+https://github.com/rust-lang/crates.io-index" 5878 + checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" 5879 + dependencies = [ 5880 + "strum_macros", 5881 + ] 5882 + 5883 + [[package]] 5884 + name = "strum_macros" 5885 + version = "0.28.0" 5886 + source = "registry+https://github.com/rust-lang/crates.io-index" 5887 + checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" 5888 + dependencies = [ 5889 + "heck", 5890 + "proc-macro2", 5891 + "quote", 5892 + "syn 2.0.117", 5893 + ] 5894 + 5895 + [[package]] 4198 5896 name = "subtle" 4199 5897 version = "2.6.1" 4200 5898 source = "registry+https://github.com/rust-lang/crates.io-index" 4201 5899 checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 4202 5900 4203 5901 [[package]] 5902 + name = "swarm-discovery" 5903 + version = "0.5.0" 5904 + source = "registry+https://github.com/rust-lang/crates.io-index" 5905 + checksum = "1a5ab62937edac8b23fa40e55a358ea1924245b17fc1eb20d14929c8f11be98d" 5906 + dependencies = [ 5907 + "acto", 5908 + "hickory-proto", 5909 + "rand 0.9.2", 5910 + "socket2 0.6.3", 5911 + "thiserror 2.0.18", 5912 + "tokio", 5913 + "tracing", 5914 + ] 5915 + 5916 + [[package]] 4204 5917 name = "syn" 4205 5918 version = "1.0.109" 4206 5919 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4264 5977 ] 4265 5978 4266 5979 [[package]] 5980 + name = "tagptr" 5981 + version = "0.2.0" 5982 + source = "registry+https://github.com/rust-lang/crates.io-index" 5983 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 5984 + 5985 + [[package]] 4267 5986 name = "tempfile" 4268 - version = "3.26.0" 5987 + version = "3.27.0" 4269 5988 source = "registry+https://github.com/rust-lang/crates.io-index" 4270 - checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" 5989 + checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" 4271 5990 dependencies = [ 4272 5991 "fastrand", 4273 - "getrandom 0.4.1", 5992 + "getrandom 0.4.2", 4274 5993 "once_cell", 4275 5994 "rustix", 4276 5995 "windows-sys 0.61.2", ··· 4353 6072 "anyhow", 4354 6073 "bon", 4355 6074 "dspy-rs", 4356 - "ed25519-dalek", 6075 + "ed25519-dalek 2.2.0", 4357 6076 "indexmap", 4358 6077 "keyring", 4359 6078 "nom 8.0.0", ··· 4365 6084 4366 6085 [[package]] 4367 6086 name = "tiles" 4368 - version = "0.4.4" 6087 + version = "0.4.5" 4369 6088 dependencies = [ 4370 6089 "anyhow", 4371 6090 "async-std", 4372 6091 "axum", 6092 + "axum-macros", 4373 6093 "clap", 6094 + "data-encoding", 4374 6095 "futures-util", 4375 6096 "hf-hub", 6097 + "iroh", 6098 + "iroh-gossip", 6099 + "iroh-ping", 6100 + "iroh-tickets", 4376 6101 "keyring", 4377 6102 "owo-colors", 6103 + "postcard", 4378 6104 "reqwest", 4379 6105 "rusqlite", 4380 6106 "rusqlite_migration", ··· 4383 6109 "serde", 4384 6110 "serde_json", 4385 6111 "serial_test", 6112 + "sha2 0.10.9", 4386 6113 "tempfile", 4387 6114 "tilekit", 4388 6115 "tokio", 4389 - "toml 1.0.3+spec-1.1.0", 6116 + "toml 1.0.7+spec-1.1.0", 4390 6117 "uuid", 4391 6118 "wiremock", 4392 6119 ] 4393 6120 4394 6121 [[package]] 6122 + name = "time" 6123 + version = "0.3.47" 6124 + source = "registry+https://github.com/rust-lang/crates.io-index" 6125 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 6126 + dependencies = [ 6127 + "deranged", 6128 + "itoa", 6129 + "js-sys", 6130 + "libc", 6131 + "num-conv", 6132 + "num_threads", 6133 + "powerfmt", 6134 + "serde_core", 6135 + "time-core", 6136 + "time-macros", 6137 + ] 6138 + 6139 + [[package]] 6140 + name = "time-core" 6141 + version = "0.1.8" 6142 + source = "registry+https://github.com/rust-lang/crates.io-index" 6143 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 6144 + 6145 + [[package]] 6146 + name = "time-macros" 6147 + version = "0.2.27" 6148 + source = "registry+https://github.com/rust-lang/crates.io-index" 6149 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" 6150 + dependencies = [ 6151 + "num-conv", 6152 + "time-core", 6153 + ] 6154 + 6155 + [[package]] 4395 6156 name = "tiny-keccak" 4396 6157 version = "2.0.2" 4397 6158 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4411 6172 ] 4412 6173 4413 6174 [[package]] 6175 + name = "tinyvec" 6176 + version = "1.11.0" 6177 + source = "registry+https://github.com/rust-lang/crates.io-index" 6178 + checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" 6179 + dependencies = [ 6180 + "tinyvec_macros", 6181 + ] 6182 + 6183 + [[package]] 6184 + name = "tinyvec_macros" 6185 + version = "0.1.1" 6186 + source = "registry+https://github.com/rust-lang/crates.io-index" 6187 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 6188 + 6189 + [[package]] 4414 6190 name = "tokio" 4415 - version = "1.49.0" 6191 + version = "1.50.0" 4416 6192 source = "registry+https://github.com/rust-lang/crates.io-index" 4417 - checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" 6193 + checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" 4418 6194 dependencies = [ 4419 6195 "bytes", 4420 6196 "libc", ··· 4422 6198 "parking_lot", 4423 6199 "pin-project-lite", 4424 6200 "signal-hook-registry", 4425 - "socket2", 6201 + "socket2 0.6.3", 4426 6202 "tokio-macros", 4427 6203 "windows-sys 0.61.2", 4428 6204 ] ··· 4459 6235 ] 4460 6236 4461 6237 [[package]] 6238 + name = "tokio-stream" 6239 + version = "0.1.18" 6240 + source = "registry+https://github.com/rust-lang/crates.io-index" 6241 + checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" 6242 + dependencies = [ 6243 + "futures-core", 6244 + "pin-project-lite", 6245 + "tokio", 6246 + "tokio-util", 6247 + ] 6248 + 6249 + [[package]] 4462 6250 name = "tokio-util" 4463 6251 version = "0.7.18" 4464 6252 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4467 6255 "bytes", 4468 6256 "futures-core", 4469 6257 "futures-sink", 6258 + "futures-util", 4470 6259 "pin-project-lite", 4471 6260 "tokio", 4472 6261 ] 4473 6262 4474 6263 [[package]] 6264 + name = "tokio-websockets" 6265 + version = "0.12.3" 6266 + source = "registry+https://github.com/rust-lang/crates.io-index" 6267 + checksum = "b1b6348ebfaaecd771cecb69e832961d277f59845d4220a584701f72728152b7" 6268 + dependencies = [ 6269 + "base64", 6270 + "bytes", 6271 + "futures-core", 6272 + "futures-sink", 6273 + "getrandom 0.3.4", 6274 + "http", 6275 + "httparse", 6276 + "rand 0.9.2", 6277 + "ring", 6278 + "rustls-pki-types", 6279 + "simdutf8", 6280 + "tokio", 6281 + "tokio-rustls", 6282 + "tokio-util", 6283 + ] 6284 + 6285 + [[package]] 4475 6286 name = "toml" 4476 6287 version = "0.9.12+spec-1.1.0" 4477 6288 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4483 6294 "toml_datetime 0.7.5+spec-1.1.0", 4484 6295 "toml_parser", 4485 6296 "toml_writer", 4486 - "winnow", 6297 + "winnow 0.7.15", 4487 6298 ] 4488 6299 4489 6300 [[package]] 4490 6301 name = "toml" 4491 - version = "1.0.3+spec-1.1.0" 6302 + version = "1.0.7+spec-1.1.0" 4492 6303 source = "registry+https://github.com/rust-lang/crates.io-index" 4493 - checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" 6304 + checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" 4494 6305 dependencies = [ 4495 6306 "indexmap", 4496 6307 "serde_core", 4497 6308 "serde_spanned", 4498 - "toml_datetime 1.0.0+spec-1.1.0", 6309 + "toml_datetime 1.0.1+spec-1.1.0", 4499 6310 "toml_parser", 4500 6311 "toml_writer", 4501 - "winnow", 6312 + "winnow 1.0.0", 4502 6313 ] 4503 6314 4504 6315 [[package]] ··· 4512 6323 4513 6324 [[package]] 4514 6325 name = "toml_datetime" 4515 - version = "1.0.0+spec-1.1.0" 6326 + version = "1.0.1+spec-1.1.0" 4516 6327 source = "registry+https://github.com/rust-lang/crates.io-index" 4517 - checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" 6328 + checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" 4518 6329 dependencies = [ 4519 6330 "serde_core", 4520 6331 ] 4521 6332 4522 6333 [[package]] 4523 6334 name = "toml_edit" 4524 - version = "0.23.10+spec-1.0.0" 6335 + version = "0.25.5+spec-1.1.0" 4525 6336 source = "registry+https://github.com/rust-lang/crates.io-index" 4526 - checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" 6337 + checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" 4527 6338 dependencies = [ 4528 6339 "indexmap", 4529 - "toml_datetime 0.7.5+spec-1.1.0", 6340 + "toml_datetime 1.0.1+spec-1.1.0", 4530 6341 "toml_parser", 4531 - "winnow", 6342 + "winnow 1.0.0", 4532 6343 ] 4533 6344 4534 6345 [[package]] 4535 6346 name = "toml_parser" 4536 - version = "1.0.9+spec-1.1.0" 6347 + version = "1.0.10+spec-1.1.0" 4537 6348 source = "registry+https://github.com/rust-lang/crates.io-index" 4538 - checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 6349 + checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" 4539 6350 dependencies = [ 4540 - "winnow", 6351 + "winnow 1.0.0", 4541 6352 ] 4542 6353 4543 6354 [[package]] 4544 6355 name = "toml_writer" 4545 - version = "1.0.6+spec-1.1.0" 6356 + version = "1.0.7+spec-1.1.0" 4546 6357 source = "registry+https://github.com/rust-lang/crates.io-index" 4547 - checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" 6358 + checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" 4548 6359 4549 6360 [[package]] 4550 6361 name = "tower" ··· 4650 6461 4651 6462 [[package]] 4652 6463 name = "tracing-subscriber" 4653 - version = "0.3.22" 6464 + version = "0.3.23" 4654 6465 source = "registry+https://github.com/rust-lang/crates.io-index" 4655 - checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 6466 + checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" 4656 6467 dependencies = [ 6468 + "matchers", 4657 6469 "nu-ansi-term", 6470 + "once_cell", 6471 + "regex-automata", 4658 6472 "sharded-slab", 4659 6473 "smallvec", 4660 6474 "thread_local", 6475 + "tracing", 4661 6476 "tracing-core", 4662 6477 "tracing-log", 4663 6478 ] ··· 4689 6504 source = "git+https://github.com/ucan-wg/rs-ucan.git?branch=main#c4d1cb7558582cbe0fe1f21b22026fe8303a0cab" 4690 6505 dependencies = [ 4691 6506 "base58", 4692 - "ed25519-dalek", 6507 + "ed25519-dalek 2.2.0", 4693 6508 "futures", 4694 6509 "getrandom 0.2.17", 4695 6510 "ipld-core", ··· 4701 6516 "serde-value", 4702 6517 "serde_bytes", 4703 6518 "serde_ipld_dagcbor", 4704 - "sha2", 4705 - "signature", 6519 + "sha2 0.10.9", 6520 + "signature 2.2.0", 4706 6521 "thiserror 1.0.69", 4707 6522 "tracing", 4708 6523 "varsig", ··· 4739 6554 checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 4740 6555 4741 6556 [[package]] 6557 + name = "universal-hash" 6558 + version = "0.5.1" 6559 + source = "registry+https://github.com/rust-lang/crates.io-index" 6560 + checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 6561 + dependencies = [ 6562 + "crypto-common 0.1.7", 6563 + "subtle", 6564 + ] 6565 + 6566 + [[package]] 4742 6567 name = "unsigned-varint" 4743 6568 version = "0.8.0" 4744 6569 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4780 6605 "idna", 4781 6606 "percent-encoding", 4782 6607 "serde", 6608 + "serde_derive", 4783 6609 ] 4784 6610 4785 6611 [[package]] ··· 4796 6622 4797 6623 [[package]] 4798 6624 name = "uuid" 4799 - version = "1.21.0" 6625 + version = "1.22.0" 4800 6626 source = "registry+https://github.com/rust-lang/crates.io-index" 4801 - checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" 6627 + checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" 4802 6628 dependencies = [ 4803 - "getrandom 0.4.1", 6629 + "getrandom 0.4.2", 4804 6630 "js-sys", 4805 6631 "wasm-bindgen", 4806 6632 ] ··· 4823 6649 source = "git+https://github.com/ucan-wg/rs-ucan.git?branch=main#c4d1cb7558582cbe0fe1f21b22026fe8303a0cab" 4824 6650 dependencies = [ 4825 6651 "async-signature", 4826 - "ed25519-dalek", 6652 + "ed25519-dalek 2.2.0", 4827 6653 "ipld-core", 4828 6654 "k256", 4829 6655 "leb128", ··· 4831 6657 "serde", 4832 6658 "serde_bytes", 4833 6659 "serde_ipld_dagcbor", 4834 - "signature", 6660 + "signature 2.2.0", 4835 6661 "thiserror 1.0.69", 4836 6662 "tracing", 4837 6663 ] ··· 4843 6669 checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 4844 6670 4845 6671 [[package]] 6672 + name = "vergen" 6673 + version = "9.1.0" 6674 + source = "registry+https://github.com/rust-lang/crates.io-index" 6675 + checksum = "b849a1f6d8639e8de261e81ee0fc881e3e3620db1af9f2e0da015d4382ceaf75" 6676 + dependencies = [ 6677 + "anyhow", 6678 + "derive_builder", 6679 + "rustversion", 6680 + "vergen-lib 9.1.0", 6681 + ] 6682 + 6683 + [[package]] 6684 + name = "vergen-gitcl" 6685 + version = "1.0.8" 6686 + source = "registry+https://github.com/rust-lang/crates.io-index" 6687 + checksum = "b9dfc1de6eb2e08a4ddf152f1b179529638bedc0ea95e6d667c014506377aefe" 6688 + dependencies = [ 6689 + "anyhow", 6690 + "derive_builder", 6691 + "rustversion", 6692 + "time", 6693 + "vergen", 6694 + "vergen-lib 0.1.6", 6695 + ] 6696 + 6697 + [[package]] 6698 + name = "vergen-lib" 6699 + version = "0.1.6" 6700 + source = "registry+https://github.com/rust-lang/crates.io-index" 6701 + checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" 6702 + dependencies = [ 6703 + "anyhow", 6704 + "derive_builder", 6705 + "rustversion", 6706 + ] 6707 + 6708 + [[package]] 6709 + name = "vergen-lib" 6710 + version = "9.1.0" 6711 + source = "registry+https://github.com/rust-lang/crates.io-index" 6712 + checksum = "b34a29ba7e9c59e62f229ae1932fb1b8fb8a6fdcc99215a641913f5f5a59a569" 6713 + dependencies = [ 6714 + "anyhow", 6715 + "derive_builder", 6716 + "rustversion", 6717 + ] 6718 + 6719 + [[package]] 4846 6720 name = "version_check" 4847 6721 version = "0.9.5" 4848 6722 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5026 6900 ] 5027 6901 5028 6902 [[package]] 6903 + name = "widestring" 6904 + version = "1.2.1" 6905 + source = "registry+https://github.com/rust-lang/crates.io-index" 6906 + checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" 6907 + 6908 + [[package]] 5029 6909 name = "winapi" 5030 6910 version = "0.3.9" 5031 6911 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5048 6928 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 5049 6929 5050 6930 [[package]] 6931 + name = "windows" 6932 + version = "0.62.2" 6933 + source = "registry+https://github.com/rust-lang/crates.io-index" 6934 + checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" 6935 + dependencies = [ 6936 + "windows-collections", 6937 + "windows-core", 6938 + "windows-future", 6939 + "windows-numerics", 6940 + ] 6941 + 6942 + [[package]] 6943 + name = "windows-collections" 6944 + version = "0.3.2" 6945 + source = "registry+https://github.com/rust-lang/crates.io-index" 6946 + checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" 6947 + dependencies = [ 6948 + "windows-core", 6949 + ] 6950 + 6951 + [[package]] 5051 6952 name = "windows-core" 5052 6953 version = "0.62.2" 5053 6954 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5058 6959 "windows-link", 5059 6960 "windows-result", 5060 6961 "windows-strings", 6962 + ] 6963 + 6964 + [[package]] 6965 + name = "windows-future" 6966 + version = "0.3.2" 6967 + source = "registry+https://github.com/rust-lang/crates.io-index" 6968 + checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" 6969 + dependencies = [ 6970 + "windows-core", 6971 + "windows-link", 6972 + "windows-threading", 5061 6973 ] 5062 6974 5063 6975 [[package]] ··· 5089 7001 checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 5090 7002 5091 7003 [[package]] 7004 + name = "windows-numerics" 7005 + version = "0.3.1" 7006 + source = "registry+https://github.com/rust-lang/crates.io-index" 7007 + checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" 7008 + dependencies = [ 7009 + "windows-core", 7010 + "windows-link", 7011 + ] 7012 + 7013 + [[package]] 5092 7014 name = "windows-registry" 5093 7015 version = "0.6.1" 5094 7016 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5119 7041 5120 7042 [[package]] 5121 7043 name = "windows-sys" 7044 + version = "0.48.0" 7045 + source = "registry+https://github.com/rust-lang/crates.io-index" 7046 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 7047 + dependencies = [ 7048 + "windows-targets 0.48.5", 7049 + ] 7050 + 7051 + [[package]] 7052 + name = "windows-sys" 5122 7053 version = "0.52.0" 5123 7054 source = "registry+https://github.com/rust-lang/crates.io-index" 5124 7055 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" ··· 5155 7086 5156 7087 [[package]] 5157 7088 name = "windows-targets" 7089 + version = "0.48.5" 7090 + source = "registry+https://github.com/rust-lang/crates.io-index" 7091 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 7092 + dependencies = [ 7093 + "windows_aarch64_gnullvm 0.48.5", 7094 + "windows_aarch64_msvc 0.48.5", 7095 + "windows_i686_gnu 0.48.5", 7096 + "windows_i686_msvc 0.48.5", 7097 + "windows_x86_64_gnu 0.48.5", 7098 + "windows_x86_64_gnullvm 0.48.5", 7099 + "windows_x86_64_msvc 0.48.5", 7100 + ] 7101 + 7102 + [[package]] 7103 + name = "windows-targets" 5158 7104 version = "0.52.6" 5159 7105 source = "registry+https://github.com/rust-lang/crates.io-index" 5160 7106 checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" ··· 5187 7133 ] 5188 7134 5189 7135 [[package]] 7136 + name = "windows-threading" 7137 + version = "0.2.1" 7138 + source = "registry+https://github.com/rust-lang/crates.io-index" 7139 + checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" 7140 + dependencies = [ 7141 + "windows-link", 7142 + ] 7143 + 7144 + [[package]] 7145 + name = "windows_aarch64_gnullvm" 7146 + version = "0.48.5" 7147 + source = "registry+https://github.com/rust-lang/crates.io-index" 7148 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 7149 + 7150 + [[package]] 5190 7151 name = "windows_aarch64_gnullvm" 5191 7152 version = "0.52.6" 5192 7153 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5197 7158 version = "0.53.1" 5198 7159 source = "registry+https://github.com/rust-lang/crates.io-index" 5199 7160 checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 7161 + 7162 + [[package]] 7163 + name = "windows_aarch64_msvc" 7164 + version = "0.48.5" 7165 + source = "registry+https://github.com/rust-lang/crates.io-index" 7166 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 5200 7167 5201 7168 [[package]] 5202 7169 name = "windows_aarch64_msvc" ··· 5212 7179 5213 7180 [[package]] 5214 7181 name = "windows_i686_gnu" 7182 + version = "0.48.5" 7183 + source = "registry+https://github.com/rust-lang/crates.io-index" 7184 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 7185 + 7186 + [[package]] 7187 + name = "windows_i686_gnu" 5215 7188 version = "0.52.6" 5216 7189 source = "registry+https://github.com/rust-lang/crates.io-index" 5217 7190 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" ··· 5236 7209 5237 7210 [[package]] 5238 7211 name = "windows_i686_msvc" 7212 + version = "0.48.5" 7213 + source = "registry+https://github.com/rust-lang/crates.io-index" 7214 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 7215 + 7216 + [[package]] 7217 + name = "windows_i686_msvc" 5239 7218 version = "0.52.6" 5240 7219 source = "registry+https://github.com/rust-lang/crates.io-index" 5241 7220 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" ··· 5245 7224 version = "0.53.1" 5246 7225 source = "registry+https://github.com/rust-lang/crates.io-index" 5247 7226 checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 7227 + 7228 + [[package]] 7229 + name = "windows_x86_64_gnu" 7230 + version = "0.48.5" 7231 + source = "registry+https://github.com/rust-lang/crates.io-index" 7232 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 5248 7233 5249 7234 [[package]] 5250 7235 name = "windows_x86_64_gnu" ··· 5260 7245 5261 7246 [[package]] 5262 7247 name = "windows_x86_64_gnullvm" 7248 + version = "0.48.5" 7249 + source = "registry+https://github.com/rust-lang/crates.io-index" 7250 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 7251 + 7252 + [[package]] 7253 + name = "windows_x86_64_gnullvm" 5263 7254 version = "0.52.6" 5264 7255 source = "registry+https://github.com/rust-lang/crates.io-index" 5265 7256 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" ··· 5272 7263 5273 7264 [[package]] 5274 7265 name = "windows_x86_64_msvc" 7266 + version = "0.48.5" 7267 + source = "registry+https://github.com/rust-lang/crates.io-index" 7268 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 7269 + 7270 + [[package]] 7271 + name = "windows_x86_64_msvc" 5275 7272 version = "0.52.6" 5276 7273 source = "registry+https://github.com/rust-lang/crates.io-index" 5277 7274 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" ··· 5284 7281 5285 7282 [[package]] 5286 7283 name = "winnow" 5287 - version = "0.7.14" 7284 + version = "0.7.15" 5288 7285 source = "registry+https://github.com/rust-lang/crates.io-index" 5289 - checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 7286 + checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" 7287 + 7288 + [[package]] 7289 + name = "winnow" 7290 + version = "1.0.0" 7291 + source = "registry+https://github.com/rust-lang/crates.io-index" 7292 + checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" 5290 7293 dependencies = [ 5291 7294 "memchr", 7295 + ] 7296 + 7297 + [[package]] 7298 + name = "winreg" 7299 + version = "0.50.0" 7300 + source = "registry+https://github.com/rust-lang/crates.io-index" 7301 + checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 7302 + dependencies = [ 7303 + "cfg-if", 7304 + "windows-sys 0.48.0", 5292 7305 ] 5293 7306 5294 7307 [[package]] ··· 5403 7416 ] 5404 7417 5405 7418 [[package]] 7419 + name = "wmi" 7420 + version = "0.18.3" 7421 + source = "registry+https://github.com/rust-lang/crates.io-index" 7422 + checksum = "003e65f4934cf9449b9ce913ad822cd054a5af669d24f93db101fdb02856bb23" 7423 + dependencies = [ 7424 + "chrono", 7425 + "futures", 7426 + "log", 7427 + "serde", 7428 + "thiserror 2.0.18", 7429 + "windows", 7430 + "windows-core", 7431 + ] 7432 + 7433 + [[package]] 5406 7434 name = "writeable" 5407 7435 version = "0.6.2" 5408 7436 source = "registry+https://github.com/rust-lang/crates.io-index" 5409 7437 checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 5410 7438 5411 7439 [[package]] 7440 + name = "ws_stream_wasm" 7441 + version = "0.7.5" 7442 + source = "registry+https://github.com/rust-lang/crates.io-index" 7443 + checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" 7444 + dependencies = [ 7445 + "async_io_stream", 7446 + "futures", 7447 + "js-sys", 7448 + "log", 7449 + "pharos", 7450 + "rustc_version", 7451 + "send_wrapper", 7452 + "thiserror 2.0.18", 7453 + "wasm-bindgen", 7454 + "wasm-bindgen-futures", 7455 + "web-sys", 7456 + ] 7457 + 7458 + [[package]] 7459 + name = "xml-rs" 7460 + version = "0.8.28" 7461 + source = "registry+https://github.com/rust-lang/crates.io-index" 7462 + checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" 7463 + 7464 + [[package]] 7465 + name = "xmltree" 7466 + version = "0.10.3" 7467 + source = "registry+https://github.com/rust-lang/crates.io-index" 7468 + checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" 7469 + dependencies = [ 7470 + "xml-rs", 7471 + ] 7472 + 7473 + [[package]] 5412 7474 name = "yoke" 5413 7475 version = "0.8.1" 5414 7476 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5432 7494 ] 5433 7495 5434 7496 [[package]] 7497 + name = "z32" 7498 + version = "1.3.0" 7499 + source = "registry+https://github.com/rust-lang/crates.io-index" 7500 + checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" 7501 + 7502 + [[package]] 5435 7503 name = "zerocopy" 5436 - version = "0.8.40" 7504 + version = "0.8.47" 5437 7505 source = "registry+https://github.com/rust-lang/crates.io-index" 5438 - checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" 7506 + checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" 5439 7507 dependencies = [ 5440 7508 "zerocopy-derive", 5441 7509 ] 5442 7510 5443 7511 [[package]] 5444 7512 name = "zerocopy-derive" 5445 - version = "0.8.40" 7513 + version = "0.8.47" 5446 7514 source = "registry+https://github.com/rust-lang/crates.io-index" 5447 - checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" 7515 + checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" 5448 7516 dependencies = [ 5449 7517 "proc-macro2", 5450 7518 "quote", ··· 5477 7545 version = "1.8.2" 5478 7546 source = "registry+https://github.com/rust-lang/crates.io-index" 5479 7547 checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 7548 + dependencies = [ 7549 + "zeroize_derive", 7550 + ] 7551 + 7552 + [[package]] 7553 + name = "zeroize_derive" 7554 + version = "1.4.3" 7555 + source = "registry+https://github.com/rust-lang/crates.io-index" 7556 + checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" 7557 + dependencies = [ 7558 + "proc-macro2", 7559 + "quote", 7560 + "syn 2.0.117", 7561 + ] 5480 7562 5481 7563 [[package]] 5482 7564 name = "zerotrie"
+3 -1
modelfiles/qwen
··· 1 - FROM mlx-community/Qwen3.5-4B-MLX-4bit 1 + FROM mlx-community/Qwen3.5-0.8B-8bit 2 + # FROM mlx-community/Qwen3.5-0.8B-MLX-8bit 3 + # FROM mlx-community/Qwen3.5-4B-MLX-4bit 2 4 # FROM mlx-community/Qwen3-0.6B-4bit
+1 -1
scripts/install.sh
··· 5 5 REPO="tilesprivacy/tiles" 6 6 # VERSION=$(grep '^version' tiles/Cargo.toml | head -1 | awk -F'"' '{print $2}') 7 7 8 - VERSION="0.4.4" 8 + VERSION="0.4.5" 9 9 INSTALL_DIR="/usr/local/bin" # CLI install location 10 10 11 11 SERVER_DIR="/usr/local/share/tiles/server" # Python server folder
+1 -1
server/stack/requirements/app-server/packages-app-server.txt
··· 23 23 packaging==26.0 24 24 pathspec==1.0.4 25 25 platformdirs==4.9.4 26 - protobuf==7.34.0 26 + protobuf==7.34.1 27 27 pydantic==2.12.5 28 28 pydantic-core==2.41.5 29 29 pytokens==0.4.1
+2 -2
server/stack/requirements/app-server/pylock.app-server.meta.json
··· 1 1 { 2 2 "lock_input_hash": "sha256:c836d5cfb697330a57241b2b8f275a804178488ec906b19866809ef33c95ba81", 3 3 "lock_version": 1, 4 - "locked_at": "2026-03-15T22:15:15.536434+00:00", 4 + "locked_at": "2026-03-22T21:45:51.270370+00:00", 5 5 "other_inputs_hash": "sha256:63b3c2cfe2ec414938e81dace7aac779c7b902bae681618cd8827e9f16880985", 6 - "requirements_hash": "sha256:71fb833c54864760da900c69c2a0829e19fef2c6b6e8c174162fdb7f021a4eb3", 6 + "requirements_hash": "sha256:167a9044a762af6b1b0b26589b77a245bf351a3b74860bc9f1bc6a07053a48a7", 7 7 "version_inputs_hash": "sha256:58db986b7cd72eeded675f7c9afd8138fe024fb51451131b5562922bbde3cf43" 8 8 }
+13 -13
server/stack/requirements/app-server/pylock.app-server.toml
··· 508 508 509 509 [[packages]] 510 510 name = "protobuf" 511 - version = "7.34.0" 511 + version = "7.34.1" 512 512 index = "https://pypi.org/simple" 513 513 514 514 [[packages.wheels]] 515 - url = "https://files.pythonhosted.org/packages/13/c4/6322ab5c8f279c4c358bc14eb8aefc0550b97222a39f04eb3c1af7a830fa/protobuf-7.34.0-cp310-abi3-macosx_10_9_universal2.whl" 516 - upload-time = 2026-02-27T00:30:14Z 517 - size = 429248 515 + url = "https://files.pythonhosted.org/packages/ec/11/3325d41e6ee15bf1125654301211247b042563bcc898784351252549a8ad/protobuf-7.34.1-cp310-abi3-macosx_10_9_universal2.whl" 516 + upload-time = 2026-03-20T17:34:37Z 517 + size = 429247 518 518 519 519 [packages.wheels.hashes] 520 - sha256 = "8e329966799f2c271d5e05e236459fe1cbfdb8755aaa3b0914fa60947ddea408" 520 + sha256 = "d8b2cc79c4d8f62b293ad9b11ec3aebce9af481fa73e64556969f7345ebf9fc7" 521 521 522 522 [[packages.wheels]] 523 - url = "https://files.pythonhosted.org/packages/b5/57/89727baef7578897af5ed166735ceb315819f1c184da8c3441271dbcfde7/protobuf-7.34.0-cp310-abi3-manylinux2014_x86_64.whl" 524 - upload-time = 2026-02-27T00:30:20Z 525 - size = 324268 523 + url = "https://files.pythonhosted.org/packages/53/1b/3b431694a4dc6d37b9f653f0c64b0a0d9ec074ee810710c0c3da21d67ba7/protobuf-7.34.1-cp310-abi3-manylinux2014_x86_64.whl" 524 + upload-time = 2026-03-20T17:34:41Z 525 + size = 324267 526 526 527 527 [packages.wheels.hashes] 528 - sha256 = "964cf977e07f479c0697964e83deda72bcbc75c3badab506fb061b352d991b01" 528 + sha256 = "8ff40ce8cd688f7265326b38d5a1bed9bfdf5e6723d49961432f83e21d5713e4" 529 529 530 530 [[packages.wheels]] 531 - url = "https://files.pythonhosted.org/packages/a4/e7/14dc9366696dcb53a413449881743426ed289d687bcf3d5aee4726c32ebb/protobuf-7.34.0-py3-none-any.whl" 532 - upload-time = 2026-02-27T00:30:23Z 533 - size = 170716 531 + url = "https://files.pythonhosted.org/packages/88/95/608f665226bca68b736b79e457fded9a2a38c4f4379a4a7614303d9db3bc/protobuf-7.34.1-py3-none-any.whl" 532 + upload-time = 2026-03-20T17:34:45Z 533 + size = 170715 534 534 535 535 [packages.wheels.hashes] 536 - sha256 = "e3b914dd77fa33fa06ab2baa97937746ab25695f389869afdf03e81f34e45dc7" 536 + sha256 = "bb3812cd53aefea2b028ef42bd780f5b96407247f20c6ef7c679807e9d188f11" 537 537 538 538 [[packages]] 539 539 name = "pydantic"
+47 -1
tilekit/src/accounts.rs
··· 1 1 //! Handles stuff related to accounts, identity etc.. 2 2 3 + use std::str::FromStr; 4 + 3 5 use anyhow::Result; 4 - use ed25519_dalek::{SigningKey, ed25519::signature::rand_core::OsRng}; 6 + use ed25519_dalek::{ 7 + SecretKey, SigningKey, VerifyingKey, 8 + ed25519::signature::rand_core::{OsRng, RngCore}, 9 + }; 5 10 use keyring::Entry; 6 11 use ucan::did::Ed25519Did; 7 12 ··· 22 27 let entry = Entry::new(app, &did)?; 23 28 entry.set_secret(&signing_key.to_keypair_bytes())?; 24 29 Ok(did) 30 + } 31 + 32 + /// Returns the `SecretKey` (ed25519_dalek type, but Private Key) 33 + /// 34 + /// # Arguments 35 + /// 36 + /// - `app`- The service for which Identity is made (for ex: tiles) 37 + /// - `did` - The `Identity` of the service 38 + pub fn get_secret_key(app: &str, did: &str) -> Result<SecretKey> { 39 + let entry = Entry::new(app, did)?; 40 + let mut bytes: [u8; 64] = [0u8; 64]; 41 + let secret_pair = entry.get_secret()?; 42 + 43 + bytes[..64].copy_from_slice(secret_pair.as_slice()); 44 + 45 + let signing_key = SigningKey::from_keypair_bytes(&bytes)?; 46 + Ok(signing_key.to_bytes()) 47 + } 48 + 49 + pub fn get_public_key_from_did(did: &str) -> Result<[u8; 32]> { 50 + let ed_did = Ed25519Did::from_str(did)?; 51 + Ok(ed_did.0.to_bytes()) 52 + } 53 + 54 + pub fn get_did_from_public_key(publick_key: &[u8; 32]) -> Result<String> { 55 + let verifying_key = VerifyingKey::from_bytes(publick_key)?; 56 + 57 + let ed_did = Ed25519Did::from(verifying_key); 58 + Ok(ed_did.to_string()) 59 + } 60 + 61 + pub fn get_random_bytes() -> [u8; 16] { 62 + let mut value = [0u8; 16]; 63 + OsRng.fill_bytes(&mut value); 64 + value 65 + } 66 + 67 + pub fn get_random_bytes_32() -> [u8; 32] { 68 + let mut value = [0u8; 32]; 69 + OsRng.fill_bytes(&mut value); 70 + value 25 71 } 26 72 27 73 #[cfg(test)]
+9 -1
tiles/Cargo.toml
··· 1 1 [package] 2 2 name = "tiles" 3 - version = "0.4.4" 3 + version = "0.4.5" 4 4 edition = "2024" 5 5 6 6 [dependencies] ··· 21 21 rusqlite_migration = "2.4.1" 22 22 uuid = {version = "1.21.0", features = ["v7"]} 23 23 axum = "0.8.8" 24 + iroh = {version = "0.97.0", features = ["address-lookup-mdns"]} 25 + iroh-ping = "0.9.0" 26 + iroh-tickets = "0.4.0" 27 + axum-macros = "0.5.0" 28 + iroh-gossip = "0.97.0" 29 + postcard = "1.1.3" 30 + data-encoding = "2.10.0" 31 + sha2 = "0.10.9" 24 32 25 33 [dev-dependencies] 26 34 tempfile = "3"
+26 -2
tiles/src/commands/mod.rs
··· 6 6 use owo_colors::OwoColorize; 7 7 use tiles::core; 8 8 use tiles::core::accounts::{ 9 - RootUser, create_root_account, get_root_user_details, save_root_account, set_nickname, 9 + RootUser, create_root_account, get_peer_list, get_root_user_details, save_root_account, 10 + set_nickname, unlink, 10 11 }; 12 + use tiles::core::storage::db::get_db_conn; 11 13 use tiles::runtime::Runtime; 12 14 use tiles::utils::config::{ 13 15 ConfigProvider, DefaultProvider, get_or_create_config, set_user_data_path, ··· 253 255 } 254 256 255 257 pub async fn run(runtime: &Runtime, run_args: RunArgs) -> Result<()> { 256 - core::init().inspect_err(|e| eprintln!("Tiles core init failed due to {:?}", e))?; 257 258 runtime.run(run_args).await 258 259 } 259 260 ··· 335 336 "Local Identity not created yet, use {}", 336 337 "tiles account create".yellow() 337 338 ) 339 + } 340 + 341 + pub fn show_peers() -> Result<()> { 342 + let db_conn = get_db_conn(core::storage::db::DBTYPE::COMMON)?; 343 + 344 + let peers = get_peer_list(&db_conn)?; 345 + 346 + println!("DID\tNickname\n"); 347 + for peer in peers { 348 + println!("{}\t{}", peer.user_id, peer.username) 349 + } 350 + Ok(()) 351 + } 352 + 353 + pub fn unlink_peer(user_id: &str) -> Result<()> { 354 + let db_conn = get_db_conn(core::storage::db::DBTYPE::COMMON)?; 355 + 356 + if let Err(err) = unlink(&db_conn, user_id) { 357 + println!("{:?}", err) 358 + } else { 359 + println!("Succesfully disabled the peer") 360 + } 361 + Ok(()) 338 362 } 339 363 340 364 #[cfg(test)]
+209 -7
tiles/src/core/accounts.rs
··· 1 1 //! Accounts 2 2 // Stuff related to account and identity system 3 3 use anyhow::{Result, anyhow}; 4 + use iroh::SecretKey; 4 5 use rusqlite::{Connection, types::FromSqlError}; 5 6 use std::{ 6 7 fmt::Display, 7 8 time::{SystemTime, UNIX_EPOCH}, 8 9 }; 9 - use tilekit::accounts::create_identity; 10 + use tilekit::accounts::{create_identity, get_secret_key}; 10 11 use toml::Table; 11 12 use uuid::Uuid; 12 13 ··· 23 24 pub nickname: String, 24 25 } 25 26 26 - #[derive(Debug)] 27 + // Type of User account 28 + #[derive(Debug, Clone)] 27 29 pub enum ACCOUNT { 30 + // root account, created in the system 28 31 LOCAL, 32 + 33 + // remote account 34 + PEER, 29 35 } 30 36 31 37 #[derive(Debug)] ··· 45 51 let value_lower = value.to_lowercase(); 46 52 match value_lower.as_str() { 47 53 "local" => Ok(ACCOUNT::LOCAL), 54 + "peer" => Ok(ACCOUNT::PEER), 48 55 _ => Err(AccountError { 49 56 error: "Invalid account type".to_owned(), 50 57 }), ··· 55 62 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 56 63 match self { 57 64 Self::LOCAL => write!(f, "{}", String::from("local")), 65 + Self::PEER => write!(f, "{}", String::from("peer")), 58 66 } 59 67 } 60 68 } 61 69 62 70 //TODO: add doc, mirrors user table schema 63 71 #[allow(dead_code)] 64 - #[derive(Debug)] 72 + #[derive(Debug, Clone)] 65 73 pub struct User { 66 74 pub id: uuid::Uuid, 67 75 pub user_id: String, ··· 218 226 }) 219 227 .map_err(<rusqlite::Error as Into<anyhow::Error>>::into) 220 228 } 221 - // TODO: when we support multiple accounts 222 - // make sure that there can't be multiple rows with 223 - // root true. 229 + 230 + pub fn get_user(conn: &Connection, did: &str) -> Result<User> { 231 + let mut fetch_current_user = conn.prepare("select id, user_id, username, account_type, active_profile, root, created_at, updated_at from users where user_id= ?1")?; 232 + 233 + fetch_current_user 234 + .query_one([did], |row| { 235 + let id: String = row.get(0)?; 236 + let account_type: String = row.get(3)?; 237 + let created_at: f64 = row.get(6)?; 238 + let updated_at: f64 = row.get(7)?; 239 + Ok(User { 240 + id: Uuid::try_parse(&id).map_err(FromSqlError::other)?, 241 + user_id: row.get(1)?, 242 + username: row.get(2)?, 243 + account_type: ACCOUNT::try_from(account_type).map_err(FromSqlError::other)?, 244 + active_profile: row.get(4)?, 245 + root: row.get(5)?, 246 + 247 + created_at: created_at as u64, 248 + updated_at: updated_at as u64, 249 + }) 250 + }) 251 + .map_err(<rusqlite::Error as Into<anyhow::Error>>::into) 252 + } 253 + 224 254 pub fn save_root_account_db() -> Result<()> { 225 255 let conn = get_db_conn(DBTYPE::COMMON)?; 226 256 let config = get_or_create_config()?; ··· 256 286 } 257 287 } 258 288 289 + // TODO: We could add unique user_id constraints, but 290 + // we will wait for it until we solve the sync part 291 + pub fn save_peer_account_db(db_conn: &Connection, user_id: &str, nickname: &str) -> Result<()> { 292 + let user = User { 293 + id: Uuid::now_v7(), 294 + user_id: String::from(user_id), 295 + username: String::from(nickname), 296 + account_type: ACCOUNT::PEER, 297 + active_profile: false, 298 + root: false, 299 + created_at: SystemTime::now() 300 + .duration_since(UNIX_EPOCH) 301 + .expect("time went backwards") 302 + .as_secs(), 303 + updated_at: SystemTime::now() 304 + .duration_since(UNIX_EPOCH) 305 + .expect("time went backwards") 306 + .as_secs(), 307 + }; 308 + db_conn.execute( 309 + "insert into users (id, user_id, username, active_profile, account_type, root) values 310 + (?1, ?2, ?3,?4, ?5, ?6)", 311 + ( 312 + &user.id.to_string(), 313 + &user.user_id, 314 + &user.username, 315 + &user.active_profile, 316 + user.account_type.to_string(), 317 + &user.root, 318 + ), 319 + )?; 320 + Ok(()) 321 + } 322 + 323 + pub fn get_user_by_user_id(conn: &Connection, user_id: String) -> Result<()> { 324 + let mut fetch_root_user = conn.prepare("select id from users where user_id = ?1")?; 325 + 326 + match fetch_root_user.query_one([user_id], |_row| Ok(())) { 327 + Ok(_) => Ok(()), 328 + Err(rusqlite::Error::QueryReturnedNoRows) => Err(anyhow!("User doesnt exist")), 329 + Err(_err) => Err(anyhow!("Fetching user from db failed")), 330 + } 331 + } 332 + 259 333 fn create_root_user(root_user_config: &Table, nickname: Option<String>) -> Result<Table> { 260 334 let mut root_user_table = root_user_config.clone(); 261 - match create_identity("tiles") { 335 + let app_name = if cfg!(debug_assertions) { 336 + "tiles_dev" 337 + } else { 338 + "tiles" 339 + }; 340 + match create_identity(app_name) { 262 341 Ok(did) => { 263 342 root_user_table.insert("id".to_owned(), toml::Value::String(did)); 264 343 if let Some(nickname) = nickname { ··· 270 349 } 271 350 } 272 351 352 + pub fn get_peer_list(db_conn: &Connection) -> Result<Vec<User>> { 353 + let mut stmt= db_conn.prepare("select id, user_id, username, account_type, active_profile, root, created_at, updated_at from users where account_type != \'local\'")?; 354 + 355 + let user_rows = stmt 356 + .query_map([], |row| { 357 + let id: String = row.get(0)?; 358 + let account_type: String = row.get(3)?; 359 + let created_at: f64 = row.get(6)?; 360 + let updated_at: f64 = row.get(7)?; 361 + Ok(User { 362 + id: Uuid::try_parse(&id).map_err(FromSqlError::other)?, 363 + user_id: row.get(1)?, 364 + username: row.get(2)?, 365 + account_type: ACCOUNT::try_from(account_type).map_err(FromSqlError::other)?, 366 + active_profile: row.get(4)?, 367 + root: row.get(5)?, 368 + 369 + created_at: created_at as u64, 370 + updated_at: updated_at as u64, 371 + }) 372 + }) 373 + .map_err(<rusqlite::Error as Into<anyhow::Error>>::into)?; 374 + 375 + let mut peer_list: Vec<User> = vec![]; 376 + 377 + for peer in user_rows { 378 + peer_list.push(peer?); 379 + } 380 + 381 + Ok(peer_list) 382 + } 383 + 384 + pub fn unlink(db_conn: &Connection, user_id: &str) -> Result<()> { 385 + let user = get_current_user(db_conn)?; 386 + if user.user_id == user_id { 387 + return Err(anyhow!("Cannot unlink yourself")); 388 + } 389 + 390 + match db_conn.execute( 391 + "delete from users where user_id = ?1 and account_type != \'local\'", 392 + [user_id], 393 + ) { 394 + Ok(0) => Err(anyhow!("A peer with DID {} doesn't exist", user_id)), 395 + Ok(_) => Ok(()), 396 + Err(err) => Err(anyhow!("Unable to unlink the peer due to {:?}", err)), 397 + } 398 + } 399 + 400 + pub fn get_app_secret_key(did: &str) -> Result<SecretKey> { 401 + let app_name = if cfg!(debug_assertions) { 402 + "tiles_dev" 403 + } else { 404 + "tiles" 405 + }; 406 + let signing_key = get_secret_key(app_name, did)?; 407 + Ok(SecretKey::from_bytes(&signing_key)) 408 + } 409 + 273 410 #[cfg(test)] 274 411 mod tests { 275 412 use super::*; ··· 617 754 .unwrap(); 618 755 619 756 assert!(get_current_user(&conn).is_err()); 757 + } 758 + 759 + fn create_user(conn: &Connection, account_type: ACCOUNT) -> User { 760 + let user = User { 761 + id: Uuid::now_v7(), 762 + user_id: String::from("did"), 763 + username: String::from("nickname"), 764 + account_type, 765 + active_profile: true, 766 + root: true, 767 + created_at: SystemTime::now() 768 + .duration_since(UNIX_EPOCH) 769 + .expect("time went backwards") 770 + .as_secs(), 771 + updated_at: SystemTime::now() 772 + .duration_since(UNIX_EPOCH) 773 + .expect("time went backwards") 774 + .as_secs(), 775 + }; 776 + 777 + conn.execute("insert into users (id, user_id, username, active_profile, account_type, root) values (?1, ?2, ?3,?4, ?5, ?6)", (&user.id.to_string(), &user.user_id, &user.username, &user.active_profile, 778 + user.account_type.to_string(), &user.root)).unwrap(); 779 + user 780 + } 781 + 782 + #[test] 783 + fn test_list_peers_with_atleast_0_peer() { 784 + let conn = setup_db_schema(); 785 + let _local_user = create_user(&conn, ACCOUNT::LOCAL); 786 + 787 + let user_list = get_peer_list(&conn).unwrap(); 788 + 789 + assert!(user_list.is_empty()) 790 + } 791 + 792 + #[test] 793 + fn test_list_peers_with_more_than_0_peer() { 794 + let conn = setup_db_schema(); 795 + let _local_user = create_user(&conn, ACCOUNT::LOCAL); 796 + save_peer_account_db(&conn, "did:jey:varathan", "varathan").unwrap(); 797 + let user_list = get_peer_list(&conn).unwrap(); 798 + 799 + assert!(!user_list.is_empty()) 800 + } 801 + 802 + #[test] 803 + fn test_unlink_valid_peer() { 804 + let conn = setup_db_schema(); 805 + let _local_user = create_user(&conn, ACCOUNT::LOCAL); 806 + save_peer_account_db(&conn, "did:jey:varathan", "varathan").unwrap(); 807 + let user_list = get_peer_list(&conn).unwrap(); 808 + 809 + assert!(!user_list.is_empty()); 810 + 811 + unlink(&conn, "did:jey:varathan").unwrap(); 812 + let user_list = get_peer_list(&conn).unwrap(); 813 + assert!(user_list.is_empty()); 814 + } 815 + 816 + #[test] 817 + fn test_try_unlink_local() { 818 + let conn = setup_db_schema(); 819 + let local_user = create_user(&conn, ACCOUNT::LOCAL); 820 + 821 + assert!(unlink(&conn, &local_user.user_id).is_err()) 620 822 } 621 823 }
+2
tiles/src/core/mod.rs
··· 10 10 pub mod accounts; 11 11 pub mod chats; 12 12 pub mod health; 13 + pub mod network; 13 14 pub mod storage; 15 + 14 16 // Entrypoint of the core 15 17 pub fn init() -> Result<()> { 16 18 init_db()?;
+467
tiles/src/core/network/mod.rs
··· 1 + //! The main module for networking 2 + 3 + pub mod ticket; 4 + use std::{ 5 + io, 6 + str::FromStr, 7 + sync::{Arc, Mutex}, 8 + time::Duration, 9 + }; 10 + 11 + use anyhow::Result; 12 + use futures_util::{StreamExt, TryStreamExt}; 13 + use iroh::{ 14 + Endpoint, EndpointId, NET_REPORT_TIMEOUT, PublicKey, 15 + address_lookup::{self, MdnsAddressLookup, mdns}, 16 + endpoint::{BindError, presets}, 17 + endpoint_info::UserData, 18 + protocol::Router, 19 + }; 20 + use iroh_gossip::{ 21 + Gossip, TopicId, 22 + api::{Event, GossipReceiver, GossipSender}, 23 + }; 24 + use iroh_ping::Ping; 25 + use iroh_tickets::endpoint::EndpointTicket; 26 + use rusqlite::Connection; 27 + use tilekit::accounts::{get_did_from_public_key, get_random_bytes, get_random_bytes_32}; 28 + use tokio::task::spawn_blocking; 29 + use uuid::Uuid; 30 + 31 + use crate::core::{ 32 + accounts::{ 33 + self, get_app_secret_key, get_current_user, get_user_by_user_id, save_peer_account_db, 34 + }, 35 + network::ticket::{EndpointUserData, LinkTicket}, 36 + storage::db::{DBTYPE, get_db_conn}, 37 + }; 38 + use sha2::{Digest, Sha256}; 39 + 40 + const DEVICE_LINK_LOCAL_TOPIC: &str = "com.tilesprivacy.tiles.link"; 41 + #[derive(serde::Serialize, serde::Deserialize)] 42 + struct NetworkMessage { 43 + from_did: String, 44 + from_nickname: String, 45 + is_online: bool, 46 + body: MessageBody, 47 + // to prevent iroh's deduplication on same msg 48 + nonce: [u8; 16], 49 + } 50 + 51 + impl NetworkMessage { 52 + fn new(user: &accounts::User, is_online: bool, body: MessageBody) -> Self { 53 + Self { 54 + from_did: user.user_id.clone(), 55 + from_nickname: user.username.clone(), 56 + is_online, 57 + body, 58 + nonce: get_random_bytes(), 59 + } 60 + } 61 + fn from_bytes(bytes: &[u8]) -> Result<Self> { 62 + postcard::from_bytes(bytes).map_err(Into::into) 63 + } 64 + fn to_bytes(&self) -> Vec<u8> { 65 + postcard::to_stdvec(&self).expect("Failed to convert to bytes w postcard") 66 + } 67 + } 68 + 69 + #[derive(serde::Serialize, serde::Deserialize)] 70 + #[allow(clippy::enum_variant_names)] 71 + enum MessageBody { 72 + LinkRequest { ticket: String }, 73 + LinkAccepted, 74 + LinkRejected { reason: String }, 75 + } 76 + 77 + // Entrypoint of network connection 78 + pub async fn init(ticket: Option<&str>) -> Result<()> { 79 + if let Some(ticket_addr) = ticket { 80 + let sender_endpoint = Endpoint::bind(presets::N0).await?; 81 + println!("{:?}", sender_endpoint.addr()); 82 + let se_clone = sender_endpoint.clone(); 83 + let send_pinger = Ping::new(); 84 + let rtt = send_pinger 85 + .ping( 86 + &sender_endpoint, 87 + EndpointTicket::from_str(ticket_addr)? 88 + .endpoint_addr() 89 + .clone(), 90 + ) 91 + .await?; 92 + 93 + println!("ping took: {:?} to complete", rtt); 94 + se_clone.close().await; 95 + } else { 96 + let endpoint = Endpoint::bind(presets::N0).await?; 97 + let ep = endpoint.clone(); 98 + let ep2 = endpoint.clone(); 99 + endpoint.online().await; 100 + 101 + let ping = Ping::new(); 102 + 103 + let ticket = EndpointTicket::new(endpoint.addr()); 104 + 105 + println!("ticket\n{:?}", ticket.to_string()); 106 + 107 + let recv_router = Router::builder(ep).accept(iroh_ping::ALPN, ping).spawn(); 108 + ep2.close().await; 109 + recv_router.shutdown().await?; 110 + } 111 + Ok(()) 112 + } 113 + 114 + pub async fn link(ticket: Option<String>) -> Result<()> { 115 + let user_db_conn = get_db_conn(DBTYPE::COMMON)?; 116 + let user = get_current_user(&user_db_conn)?; 117 + let endpoint = create_endpoint(&user).await?; 118 + let is_online = is_online(&endpoint).await; 119 + let mut bootstrap_ids: Vec<EndpointId> = vec![]; 120 + // if ticket's there, then this is link enable sender's command, e;se receiver end 121 + if let Some(ticket) = ticket { 122 + let (endpoint_id, mut did, mut nickname, topic_value) = parse_link_ticket(&ticket)?; 123 + 124 + let topic_id = if is_online { 125 + topic_value.expect("Expected topicId") 126 + } else { 127 + create_topic_id(DEVICE_LINK_LOCAL_TOPIC) 128 + }; 129 + 130 + if is_online { 131 + bootstrap_ids.push(endpoint_id.expect("Expected an EndpointId as bootstrapId ")) 132 + } else { 133 + println!("Searching for peers in the local network.."); 134 + let mdns = address_lookup::mdns::MdnsAddressLookup::builder().build(endpoint.id())?; 135 + let (new_bootstrap_ids, user_data) = 136 + find_offline_bootstrap_peers(&endpoint, mdns).await?; 137 + bootstrap_ids = new_bootstrap_ids; 138 + let endpoint_user_data = EndpointUserData::try_from(user_data.to_string())?; 139 + did = endpoint_user_data.did; 140 + nickname = endpoint_user_data.nickname; 141 + }; 142 + if get_user_by_user_id(&user_db_conn, did.to_owned()).is_ok() { 143 + println!("Device {}({}) already linked", nickname, did); 144 + return Ok(()); 145 + } 146 + let (sender, mut receiver, recv_router) = 147 + create_gossip_network(&endpoint, topic_id, bootstrap_ids).await?; 148 + 149 + println!("\nConnecting to {}({}).....", nickname, did); 150 + 151 + receiver.joined().await?; 152 + 153 + tokio::spawn(subsribe_loop( 154 + receiver, 155 + sender.clone(), 156 + user.clone(), 157 + user_db_conn, 158 + None, 159 + )); 160 + 161 + let link_req_msg = 162 + NetworkMessage::new(&user, is_online, MessageBody::LinkRequest { ticket }); 163 + sender.broadcast(link_req_msg.to_bytes().into()).await?; 164 + 165 + println!("\nSent link request to {}({})", nickname, did); 166 + 167 + println!("\nWaiting for response..."); 168 + 169 + tokio::signal::ctrl_c().await?; 170 + recv_router.shutdown().await?; 171 + } else { 172 + // RECEIVER BLOCK 173 + if !is_online { 174 + let mdns = address_lookup::mdns::MdnsAddressLookup::builder().build(endpoint.id())?; 175 + endpoint.address_lookup()?.add(mdns.clone()); 176 + } 177 + 178 + // Its better to have unique session'ed channels while 179 + // when the communication is over internet 180 + let topic_id = if is_online { 181 + TopicId::from_bytes(get_random_bytes_32()) 182 + } else { 183 + create_topic_id(DEVICE_LINK_LOCAL_TOPIC) 184 + }; 185 + 186 + let (sender, receiver, recv_router) = 187 + create_gossip_network(&endpoint, topic_id, bootstrap_ids).await?; 188 + 189 + let generated_ticket = if is_online { 190 + let ticket = LinkTicket::new( 191 + topic_id, 192 + endpoint.addr(), 193 + user.user_id.clone(), 194 + user.username.clone(), 195 + ); 196 + println!("Generated link ticket: \n{:?}\n", ticket.to_string()); 197 + 198 + println!( 199 + "Use this ticket with `tiles link enable <ticket>` on the system you want to connect to\n" 200 + ); 201 + ticket.to_string() 202 + } else { 203 + // generate a code 204 + let uuid = Uuid::new_v4().to_string(); 205 + 206 + let ticket = uuid.split('-').collect::<Vec<&str>>()[0]; 207 + 208 + println!("Generated link code: {}\n", ticket); 209 + 210 + println!( 211 + "Use this link code with `tiles link enable {}` on the system you want to connect to\n", 212 + ticket 213 + ); 214 + ticket.to_string() 215 + }; 216 + 217 + println!("Don't close this session until the link process is done\n"); 218 + 219 + tokio::spawn(subsribe_loop( 220 + receiver, 221 + sender.clone(), 222 + user.clone(), 223 + user_db_conn, 224 + Some(generated_ticket), 225 + )); 226 + 227 + // TODO: Maybe a better way is to use a oneshot channel to exit 228 + // the terminal instead of SIGINT 229 + tokio::signal::ctrl_c().await?; 230 + recv_router.shutdown().await?; 231 + } 232 + endpoint.close().await; 233 + Ok(()) 234 + } 235 + 236 + async fn subsribe_loop( 237 + mut receiver: GossipReceiver, 238 + sender: GossipSender, 239 + user: accounts::User, 240 + db_conn: Connection, 241 + generated_ticket: Option<String>, 242 + ) -> Result<()> { 243 + while let Some(event) = receiver.try_next().await? { 244 + if cfg!(debug_assertions) { 245 + println!("In {}:, some event {:?}", user.username, event); 246 + } 247 + if let Event::Received(msg) = event { 248 + let pub_key = msg.delivered_from; 249 + let msg = NetworkMessage::from_bytes(&msg.content)?; 250 + if !is_did_valid(&msg.from_did, pub_key)? { 251 + eprintln!( 252 + "Incoming peer DID {} invalid, blocking request", 253 + msg.from_did 254 + ); 255 + continue; 256 + } 257 + match msg.body { 258 + MessageBody::LinkRequest { ticket } => { 259 + println!( 260 + "Received link request from {}({}), Do you want to link Y/N ?", 261 + msg.from_nickname, msg.from_did 262 + ); 263 + let input: Arc<Mutex<String>> = Arc::new(Mutex::new(String::new())); 264 + 265 + let input_clone = input.clone(); 266 + let stdin = io::stdin(); 267 + spawn_blocking(move || { 268 + let mut input_clone = input_clone.lock().unwrap(); 269 + let _ = stdin.read_line(&mut input_clone); 270 + }) 271 + .await?; 272 + let input_resp = input.lock().unwrap().trim().to_owned(); 273 + 274 + let link_res_resp = if input_resp.to_lowercase() == "y" { 275 + if let Some(gen_ticket) = &generated_ticket 276 + && !msg.is_online 277 + && *gen_ticket != ticket.to_lowercase() 278 + { 279 + println!("\nVerifying code does not match, please try again"); 280 + let response = NetworkMessage::new( 281 + &user, 282 + msg.is_online, 283 + MessageBody::LinkRejected { 284 + reason: String::from("Link code mismatch"), 285 + }, 286 + ); 287 + sender.broadcast(response.to_bytes().into()).await?; 288 + continue; 289 + } 290 + 291 + if let Err(err) = 292 + save_peer_account_db(&db_conn, &msg.from_did, &msg.from_nickname) 293 + { 294 + println!("Failed to add the peer locally due to {:?}", err); 295 + 296 + continue; 297 + } 298 + 299 + println!( 300 + "Device {}({}) is now linked\nYou can exit now by ctrl-c", 301 + msg.from_nickname, msg.from_did 302 + ); 303 + NetworkMessage::new(&user, msg.is_online, MessageBody::LinkAccepted) 304 + } else { 305 + println!("You can exit now by ctrl-c"); 306 + NetworkMessage::new( 307 + &user, 308 + msg.is_online, 309 + MessageBody::LinkRejected { 310 + reason: String::from("Peer rejected the request"), 311 + }, 312 + ) 313 + }; 314 + input.lock().unwrap().clear(); 315 + 316 + sender.broadcast(link_res_resp.to_bytes().into()).await?; 317 + } 318 + MessageBody::LinkAccepted => { 319 + println!("\nLink accepted by {}({})", msg.from_nickname, msg.from_did); 320 + 321 + if let Err(err) = 322 + save_peer_account_db(&db_conn, &msg.from_did, &msg.from_nickname) 323 + { 324 + println!("Failed to add the peer locally due to {:?}", err); 325 + return Ok(()); 326 + } 327 + 328 + println!("\nYou can exit now by ctrl-c"); 329 + 330 + continue; 331 + } 332 + MessageBody::LinkRejected { reason } => { 333 + println!( 334 + "Oops looks like your link request has been rejected by {}({}),\nreason: {},\nexit (ctrl-c) and try again", 335 + msg.from_nickname, msg.from_did, reason 336 + ); 337 + } 338 + } 339 + } 340 + } 341 + Ok(()) 342 + } 343 + 344 + async fn create_endpoint(user: &accounts::User) -> Result<Endpoint> { 345 + // In release mode, we will build the endpoint using 346 + // tiles keypair in keychain 347 + let usr_data = EndpointUserData::new(&user.user_id, &user.username); 348 + if !cfg!(debug_assertions) { 349 + let secret_key = get_app_secret_key(&user.user_id)?; 350 + Endpoint::builder(presets::N0) 351 + .user_data_for_address_lookup(UserData::try_from(usr_data.to_string())?) 352 + .secret_key(secret_key) 353 + .bind() 354 + .await 355 + .map_err(<BindError as Into<anyhow::Error>>::into) 356 + } else { 357 + Endpoint::builder(presets::N0) 358 + .user_data_for_address_lookup(UserData::try_from(usr_data.to_string())?) 359 + .bind() 360 + .await 361 + .map_err(<BindError as Into<anyhow::Error>>::into) 362 + } 363 + } 364 + 365 + fn create_topic_id(topic_name: &str) -> TopicId { 366 + let mut hasher = Sha256::new(); 367 + hasher.update(topic_name.as_bytes()); 368 + let topic_id_bytes = hasher.finalize(); 369 + TopicId::from_bytes(topic_id_bytes.into()) 370 + } 371 + 372 + fn _get_did_from_endpoint(endpoint_id: EndpointId) -> Result<String> { 373 + get_did_from_public_key(endpoint_id.as_bytes()) 374 + } 375 + 376 + async fn is_online(endpoint: &Endpoint) -> bool { 377 + tokio::select! { 378 + _ = endpoint.online() => { 379 + true 380 + } 381 + _ = tokio::time::sleep(Duration::from_secs(NET_REPORT_TIMEOUT)) => { 382 + false 383 + } 384 + } 385 + } 386 + 387 + // As of now we exit asap when we see a peer. This is subjected to change 388 + // as the scale 389 + async fn find_offline_bootstrap_peers( 390 + endpoint: &Endpoint, 391 + mdns: MdnsAddressLookup, 392 + ) -> Result<(Vec<EndpointId>, UserData)> { 393 + let mut bootstrap_ids: Vec<EndpointId> = vec![]; 394 + endpoint.address_lookup()?.add(mdns.clone()); 395 + let mut mdns_event = mdns.subscribe().await; 396 + let mut user_data = UserData::from_str("")?; 397 + while let Some(event) = mdns_event.next().await { 398 + match event { 399 + mdns::DiscoveryEvent::Discovered { 400 + endpoint_info, 401 + last_updated: _, 402 + } => { 403 + if cfg!(debug_assertions) { 404 + println!("peer discoverd {:?}", endpoint_info); 405 + } 406 + bootstrap_ids.push(endpoint_info.endpoint_id); 407 + user_data = endpoint_info.user_data().unwrap().clone(); 408 + break; 409 + } 410 + mdns::DiscoveryEvent::Expired { endpoint_id } => { 411 + if cfg!(debug_assertions) { 412 + println!("peer left {:?}", endpoint_id) 413 + } 414 + } 415 + } 416 + } 417 + 418 + Ok((bootstrap_ids, user_data)) 419 + } 420 + 421 + async fn create_gossip_network( 422 + endpoint: &Endpoint, 423 + topic_id: TopicId, 424 + bootstrap_ids: Vec<iroh::PublicKey>, 425 + ) -> Result<(GossipSender, GossipReceiver, Router)> { 426 + let gossip = Gossip::builder().spawn(endpoint.clone()); 427 + let recv_router = Router::builder(endpoint.clone()) 428 + .accept(iroh_gossip::ALPN, gossip.clone()) 429 + .spawn(); 430 + 431 + let (goss_sender, goss_receiver) = gossip.subscribe(topic_id, bootstrap_ids).await?.split(); 432 + 433 + Ok((goss_sender, goss_receiver, recv_router)) 434 + } 435 + 436 + // We handle the parsing in this way since ticket can be an encoded `LinkTicket` 437 + // or just a 4 byte hex if linking over mDNS 438 + fn parse_link_ticket( 439 + ticket: &str, 440 + ) -> Result<(Option<EndpointId>, String, String, Option<TopicId>)> { 441 + if let Ok(parsed_ticket) = LinkTicket::from_str(ticket) { 442 + Ok(( 443 + Some(parsed_ticket.addr.id), 444 + parsed_ticket.did, 445 + parsed_ticket.nickname, 446 + Some(parsed_ticket.topic_id), 447 + )) 448 + } else if ticket.len() == 8 { 449 + // NOTE: We only have len check as a "parser" for the offline code 450 + // but this will surely change once we fix the code format 451 + Ok((None, String::from(""), String::from(""), None)) 452 + } else { 453 + Err(anyhow::anyhow!("Invalid Ticket")) 454 + } 455 + } 456 + 457 + fn is_did_valid(did: &str, pub_key: PublicKey) -> Result<bool> { 458 + // on debug mode, we skip the auth check, since we will be testing 459 + // with random endpoitns but w DID from config atp 460 + if cfg!(debug_assertions) { 461 + Ok(true) 462 + } else { 463 + Ok(get_did_from_public_key(&pub_key)? == did) 464 + } 465 + } 466 + // fn subsribe_mdns_events(mdns_events) {} 467 + //TODO: Add tests, can we get some from iroh reference?
+104
tiles/src/core/network/ticket.rs
··· 1 + //! Tickets for Networking 2 + use std::{fmt::Display, str::FromStr}; 3 + 4 + use iroh::EndpointAddr; 5 + use iroh_gossip::TopicId; 6 + use iroh_tickets::Ticket; 7 + 8 + //TODO: Add tests 9 + #[derive(serde::Serialize, serde::Deserialize, Debug)] 10 + pub struct LinkTicket { 11 + pub nickname: String, 12 + pub did: String, 13 + pub addr: EndpointAddr, 14 + pub topic_id: TopicId, 15 + } 16 + 17 + impl Ticket for LinkTicket { 18 + const KIND: &'static str = "link"; 19 + 20 + fn to_bytes(&self) -> Vec<u8> { 21 + postcard::to_stdvec(&self).expect("linkTicket to bytes couldnt be done") 22 + } 23 + 24 + fn from_bytes(bytes: &[u8]) -> Result<Self, iroh_tickets::ParseError> { 25 + postcard::from_bytes(bytes).map_err(Into::into) 26 + } 27 + } 28 + 29 + impl Display for LinkTicket { 30 + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 31 + let mut text = data_encoding::BASE32_NOPAD.encode(&self.to_bytes()[..]); 32 + text.make_ascii_lowercase(); 33 + write!(f, "{}", text) 34 + } 35 + } 36 + 37 + impl FromStr for LinkTicket { 38 + type Err = anyhow::Error; 39 + fn from_str(s: &str) -> Result<Self, Self::Err> { 40 + let ticket_bytes = data_encoding::BASE32_NOPAD.decode(s.to_uppercase().as_bytes())?; 41 + LinkTicket::from_bytes(&ticket_bytes).map_err(Into::into) 42 + } 43 + } 44 + 45 + impl LinkTicket { 46 + pub fn new(topic_id: TopicId, addr: EndpointAddr, did: String, nickname: String) -> Self { 47 + LinkTicket { 48 + addr, 49 + topic_id, 50 + did, 51 + nickname, 52 + } 53 + } 54 + } 55 + 56 + #[derive(serde::Serialize, serde::Deserialize, Debug)] 57 + pub struct EndpointUserData { 58 + pub did: String, 59 + pub nickname: String, 60 + } 61 + 62 + impl EndpointUserData { 63 + pub fn new(did: &str, nickname: &str) -> Self { 64 + Self { 65 + did: did.to_owned(), 66 + nickname: nickname.to_owned(), 67 + } 68 + } 69 + 70 + fn to_bytes(&self) -> Vec<u8> { 71 + postcard::to_stdvec(&self).expect("EndpointUserData to bytes couldnt be done") 72 + } 73 + } 74 + 75 + impl TryFrom<String> for EndpointUserData { 76 + type Error = anyhow::Error; 77 + fn try_from(value: String) -> Result<Self, Self::Error> { 78 + let data_bytes = data_encoding::BASE32_NOPAD.decode(value.to_uppercase().as_bytes())?; 79 + postcard::from_bytes(&data_bytes).map_err(Into::into) 80 + } 81 + } 82 + 83 + impl Display for EndpointUserData { 84 + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 85 + let mut text = data_encoding::BASE32_NOPAD.encode(&self.to_bytes()[..]); 86 + text.make_ascii_lowercase(); 87 + write!(f, "{}", text) 88 + } 89 + } 90 + 91 + #[cfg(test)] 92 + mod tests { 93 + use crate::core::network::ticket::EndpointUserData; 94 + 95 + #[test] 96 + fn test_basic_to_fro_userdata_conversion() { 97 + let user_data = EndpointUserData::new("did:key", "machine"); 98 + let usr_data_str = user_data.to_string(); 99 + let usr_data_struct = EndpointUserData::try_from(usr_data_str).unwrap(); 100 + 101 + assert_eq!(user_data.did, usr_data_struct.did); 102 + assert_eq!(user_data.nickname, usr_data_struct.nickname); 103 + } 104 + }
+57 -24
tiles/src/daemon.rs
··· 19 19 pub shutdown_sender: Mutex<Option<oneshot::Sender<bool>>>, 20 20 } 21 21 22 - pub async fn start_cmd() -> Result<()> { 22 + // #[derive(serde::Deserialize)] 23 + // pub struct SendParams { 24 + // ticket: String, 25 + // } 26 + 27 + const DEFAULT_PORT: u32 = 1729; 28 + pub async fn start_cmd(port: Option<u32>) -> Result<()> { 23 29 if cfg!(debug_assertions) { 24 - start_server().await 30 + start_server(port).await 25 31 } else { 26 - start_daemon().await 32 + start_daemon(port).await 27 33 } 28 34 } 29 35 30 36 pub async fn stop_cmd() -> Result<()> { 31 - stop_server().await 37 + stop_server(None).await 32 38 } 33 39 async fn root() -> &'static str { 34 40 "Its me luttappi" ··· 37 43 // allow zombie, since this process is expected to be 38 44 // running in background and have commands to stop if needed 39 45 #[allow(clippy::zombie_processes)] 40 - async fn start_daemon() -> Result<()> { 41 - if (ping().await).is_ok() { 46 + async fn start_daemon(port: Option<u32>) -> Result<()> { 47 + if (ping(port).await).is_ok() { 42 48 return Ok(()); 43 49 } 44 50 let data_dir = DefaultProvider.get_data_dir()?; ··· 59 65 .spawn() 60 66 .expect("Failed to start daemon"); 61 67 62 - wait_until_server_is_up().await 68 + wait_until_server_is_up(port).await 63 69 } 64 70 65 - pub async fn start_server() -> Result<()> { 71 + pub async fn start_server(port: Option<u32>) -> Result<()> { 72 + let dyn_port: u32 = get_port(port); 73 + 66 74 let (shutdown_tx, shutdown_rx) = oneshot::channel::<bool>(); 67 75 68 76 let state = AppState { ··· 74 82 .route("/shutdown", get(shutdown)) 75 83 .with_state(shared_state); 76 84 77 - let listener = tokio::net::TcpListener::bind("127.0.0.1:1729").await?; 85 + let addr = format!("127.0.0.1:{}", dyn_port); 86 + let listener = tokio::net::TcpListener::bind(addr).await?; 78 87 79 - println!("Daemon server started at 1729"); 88 + println!("Daemon server started at {}", dyn_port); 80 89 let _ = axum::serve(listener, app) 81 90 .with_graceful_shutdown(shutdown_signal(shutdown_rx)) 82 91 .await; ··· 95 104 let _ = sender_real.send(true); 96 105 } 97 106 98 - async fn stop_server() -> Result<()> { 107 + // #[debug_handler] 108 + // async fn send_ping(State(_state): State<Arc<AppState>>, Query(params): Query<SendParams>) { 109 + // println!("Trying to send ping"); 110 + // let _ = network::init(Some(&params.ticket)).await; 111 + // } 112 + 113 + // async fn receive_ping(State(_state): State<Arc<AppState>>) { 114 + // println!("Trying to receive ping"); 115 + // let _ = network::init(None).await; 116 + // } 117 + 118 + async fn stop_server(port: Option<u32>) -> Result<()> { 119 + let dyn_port = get_port(port); 99 120 let client = Client::new(); 100 - let res = client.get("http://127.0.0.1:1729/shutdown").send().await; 121 + let addr = format!("http://127.0.0.1:{}/shutdown", dyn_port); 122 + let res = client.get(addr).send().await; 101 123 102 124 match res { 103 125 Err(err) => Err(anyhow!("Daemon shutdown failed due to {:?}", err)), 104 126 _ => Ok(()), 105 127 } 106 128 } 107 - pub async fn ping() -> Result<(), String> { 129 + pub async fn ping(port: Option<u32>) -> Result<(), String> { 130 + let dyn_port = get_port(port); 108 131 let client = Client::new(); 109 - let res = client.get("http://127.0.0.1:1729").send().await; 132 + let addr = format!("http://127.0.0.1:{}", dyn_port); 133 + 134 + let res = client.get(addr).send().await; 110 135 111 136 match res { 112 137 Err(err) => Err(format!("Pong failed: {:?}", err)), ··· 114 139 } 115 140 } 116 141 117 - async fn wait_until_server_is_up() -> Result<()> { 142 + async fn wait_until_server_is_up(port: Option<u32>) -> Result<()> { 118 143 let mut retry_count = 5; 119 144 let mut error: String = String::new(); 120 145 loop { ··· 124 149 } 125 150 return Err(anyhow!(error)); 126 151 } 127 - match ping().await { 152 + match ping(port).await { 128 153 Ok(()) => return Ok(()), 129 154 Err(err) => { 130 155 retry_count -= 1; ··· 135 160 } 136 161 } 137 162 163 + fn get_port(port: Option<u32>) -> u32 { 164 + if let Some(port_number) = port { 165 + port_number 166 + } else { 167 + DEFAULT_PORT 168 + } 169 + } 170 + 138 171 #[cfg(test)] 139 172 mod tests { 140 173 use anyhow::Result; ··· 146 179 #[serial] 147 180 async fn test_sever_process_started_not_server() -> Result<()> { 148 181 tokio::spawn(async move { 149 - let _ = start_server().await; 182 + let _ = start_server(None).await; 150 183 }); 151 - assert!(ping().await.is_err()); 152 - stop_server().await 184 + assert!(ping(None).await.is_err()); 185 + stop_server(None).await 153 186 } 154 187 155 188 #[tokio::test] 156 189 #[serial] 157 190 async fn test_sever_process_and_server_started() -> Result<()> { 158 191 tokio::spawn(async move { 159 - let _ = start_server().await; 192 + let _ = start_server(None).await; 160 193 }); 161 - wait_until_server_is_up().await?; 162 - assert!(ping().await.is_ok()); 194 + wait_until_server_is_up(None).await?; 195 + assert!(ping(None).await.is_ok()); 163 196 164 - stop_server().await 197 + stop_server(None).await 165 198 } 166 199 167 200 #[tokio::test] 168 201 #[serial] 169 202 async fn stop_server_but_server_not_up() { 170 - assert!(stop_server().await.is_err()) 203 + assert!(stop_server(None).await.is_err()) 171 204 } 172 205 }
+52 -8
tiles/src/main.rs
··· 2 2 3 3 use clap::{Args, Parser, Subcommand}; 4 4 use tiles::{ 5 + core::{self, network::link}, 5 6 daemon::{start_cmd, start_server, stop_cmd}, 6 7 runtime::{RunArgs, build_runtime}, 7 8 utils::installer, 8 9 }; 10 + 11 + use crate::commands::{show_peers, unlink_peer}; 9 12 10 13 mod commands; 11 14 #[derive(Debug, Parser)] ··· 60 63 61 64 /// Daemon configurations 62 65 Daemon(DaemonArgs), 66 + 67 + /// Link with other devices p2p 68 + Link(LinkArgs), 63 69 } 64 70 65 71 #[derive(Debug, Args)] ··· 74 80 // Future flags go here: 75 81 // #[arg(long, default_value_t = 6969)] 76 82 // port: u16, 83 + 84 + // Don't go into the repl 85 + #[arg(short = 'x', long)] 86 + no_repl: bool, 77 87 } 78 88 79 89 #[derive(Debug, Args)] ··· 134 144 #[derive(Debug, Subcommand)] 135 145 enum DaemonCommands { 136 146 /// Start the daemon 137 - Start, 147 + Start { port: Option<u32> }, 138 148 139 149 /// Stops the daemon 140 150 Stop, 141 151 } 152 + 153 + #[derive(Debug, Args)] 154 + #[command(args_conflicts_with_subcommands = true)] 155 + #[command(flatten_help = true)] 156 + struct LinkArgs { 157 + #[command(subcommand)] 158 + command: LinkCommands, 159 + } 160 + 161 + #[derive(Debug, Subcommand)] 162 + enum LinkCommands { 163 + /// Produce link ticket and wait or send link request with ticket 164 + Enable { 165 + ticket: Option<String>, 166 + }, 167 + 168 + // Unlink give device 169 + Disable { 170 + did: String, 171 + }, 172 + /// Start the daemon 173 + ListPeers, 174 + } 142 175 #[tokio::main] 143 176 pub async fn main() -> Result<(), Box<dyn Error>> { 144 177 let cli = Cli::parse(); ··· 151 184 relay_count: cli.flags.relay_count, 152 185 memory: cli.flags.memory, 153 186 }; 187 + 154 188 commands::run_setup_for_ftue(&run_args) 155 189 .inspect_err(|e| eprintln!("Failed to setup Tiles due to {:?}", e))?; 156 190 let _ = commands::try_app_update().await; ··· 158 192 // trying to run the tiles daemon in background concurrently 159 193 if !cfg!(debug_assertions) { 160 194 tokio::spawn(async move { 161 - let _ = start_cmd().await; 195 + let _ = start_cmd(None).await; 162 196 }); 163 197 } 164 - 165 - commands::run(&runtime, run_args) 166 - .await 167 - .inspect_err(|e| eprintln!("Tiles failed to run due to {:?}", e))?; 198 + core::init().inspect_err(|e| eprintln!("Tiles core init failed due to {:?}", e))?; 199 + if !cli.flags.no_repl { 200 + commands::run(&runtime, run_args) 201 + .await 202 + .inspect_err(|e| eprintln!("Tiles failed to run due to {:?}", e))?; 203 + } 168 204 } 169 205 Some(Commands::Run { 170 206 modelfile_path, ··· 175 211 relay_count: flags.relay_count, 176 212 memory: flags.memory, 177 213 }; 214 + core::init().inspect_err(|e| eprintln!("Tiles core init failed due to {:?}", e))?; 178 215 commands::run(&runtime, run_args) 179 216 .await 180 217 .inspect_err(|e| eprintln!("Tiles failed to run due to {:?}", e))?; ··· 210 247 println!("{}", res); 211 248 } 212 249 Some(Commands::Daemon(daemon_args)) => match daemon_args.command { 213 - Some(DaemonCommands::Start) => start_cmd() 250 + Some(DaemonCommands::Start { port }) => start_cmd(port) 214 251 .await 215 252 .inspect_err(|e| eprintln!("Daemon starting failed, reason: {:?}", e))?, 216 253 Some(DaemonCommands::Stop) => stop_cmd() 217 254 .await 218 255 .inspect_err(|e| eprintln!("{:?}", e)) 219 256 .inspect(|_| println!("Daemon stopped successfully"))?, 220 - _ => start_server().await?, 257 + _ => start_server(None).await?, 258 + }, 259 + Some(Commands::Link(link_args)) => match link_args.command { 260 + LinkCommands::Enable { ticket } => link(ticket).await?, 261 + LinkCommands::Disable { did } => unlink_peer(&did)?, 262 + LinkCommands::ListPeers => { 263 + show_peers()?; 264 + } 221 265 }, 222 266 } 223 267 Ok(())