difftreelog
feat remowt integration
46 files changed
Cargo.lockdiffbeforeafterboth2# It is not intended for manual editing.2# It is not intended for manual editing.3version = 43version = 445[[package]]6name = "abort-on-drop"7version = "0.2.2"8source = "registry+https://github.com/rust-lang/crates.io-index"9checksum = "5dd6d700ad9af641490c1f7d67980d2de4d1433016e5b12f819448d3c832142a"10dependencies = [11 "tokio",12]13414[[package]]5[[package]]15name = "adler2"6name = "adler2"23source = "registry+https://github.com/rust-lang/crates.io-index"14source = "registry+https://github.com/rust-lang/crates.io-index"24checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"15checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"25dependencies = [16dependencies = [26 "crypto-common",17 "crypto-common 0.1.7",27 "generic-array",18 "generic-array 0.14.7",28]19]2021[[package]]22name = "aead"23version = "0.6.0"24source = "registry+https://github.com/rust-lang/crates.io-index"25checksum = "ef60ac202874e574ce7a7158cc8bca7313dd344322482e4fadee288bf4a306b8"26dependencies = [27 "crypto-common 0.2.2",28 "inout 0.2.2",29]293030[[package]]31[[package]]31name = "aes"32name = "aes"34checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"35checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"35dependencies = [36dependencies = [36 "cfg-if",37 "cfg-if",37 "cipher",38 "cipher 0.4.4",38 "cpufeatures 0.2.17",39 "cpufeatures 0.2.17",39]40]4142[[package]]43name = "aes"44version = "0.9.1"45source = "registry+https://github.com/rust-lang/crates.io-index"46checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138"47dependencies = [48 "cipher 0.5.2",49 "cpubits",50 "cpufeatures 0.3.0",51 "zeroize",52]405341[[package]]54[[package]]42name = "aes-gcm"55name = "aes-gcm"43version = "0.10.3"56version = "0.10.3"44source = "registry+https://github.com/rust-lang/crates.io-index"57source = "registry+https://github.com/rust-lang/crates.io-index"45checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1"58checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1"46dependencies = [59dependencies = [47 "aead",60 "aead 0.5.2",48 "aes",61 "aes 0.8.4",49 "cipher",62 "cipher 0.4.4",50 "ctr",63 "ctr 0.9.2",51 "ghash",64 "ghash 0.5.1",52 "subtle",65 "subtle",53]66]6768[[package]]69name = "aes-gcm"70version = "0.11.0-rc.4"71source = "registry+https://github.com/rust-lang/crates.io-index"72checksum = "da8c919c118108f144adecad74b425b804ad075580d605d9b33c2d6d1c62a2f8"73dependencies = [74 "aead 0.6.0",75 "aes 0.9.1",76 "cipher 0.5.2",77 "ctr 0.10.1",78 "ghash 0.6.0",79 "subtle",80 "zeroize",81]548255[[package]]83[[package]]56name = "age"84name = "age"57version = "0.11.2"85version = "0.11.3"58source = "registry+https://github.com/rust-lang/crates.io-index"86source = "registry+https://github.com/rust-lang/crates.io-index"59checksum = "bf640be7658959746f1f0f2faab798f6098a9436a8e18e148d18bc9875e13c4b"87checksum = "a07d86e4272c093c88caf7864a2d09af52a5159180848ca4832a3cdbd7d014d5"60dependencies = [88dependencies = [61 "aes",89 "aes 0.8.4",62 "aes-gcm",90 "aes-gcm 0.10.3",63 "age-core",91 "age-core",64 "base64 0.21.7",92 "base64 0.21.7",65 "bcrypt-pbkdf",93 "bcrypt-pbkdf 0.10.0",66 "bech32",94 "bech32",67 "cbc",95 "cbc 0.1.2",68 "chacha20poly1305",96 "chacha20poly1305",69 "cipher",97 "cipher 0.4.4",70 "cookie-factory",98 "cookie-factory",71 "ctr",99 "ctr 0.9.2",72 "curve25519-dalek",100 "curve25519-dalek 4.1.3",73 "hmac",101 "hmac 0.12.1",74 "i18n-embed",102 "i18n-embed",75 "i18n-embed-fl",103 "i18n-embed-fl",76 "lazy_static",104 "lazy_static",77 "nom 7.1.3",105 "nom 7.1.3",78 "num-traits",106 "num-traits",79 "pin-project",107 "pin-project",80 "rand 0.8.6",108 "rand 0.8.6",81 "rsa",109 "rsa 0.9.10",82 "rust-embed",110 "rust-embed",83 "scrypt",111 "scrypt 0.11.0",84 "sha2",112 "sha2 0.10.9",85 "subtle",113 "subtle",86 "which",114 "which",87 "wsl",115 "wsl",98 "base64 0.21.7",126 "base64 0.21.7",99 "chacha20poly1305",127 "chacha20poly1305",100 "cookie-factory",128 "cookie-factory",101 "hkdf",129 "hkdf 0.12.4",102 "io_tee",130 "io_tee",103 "nom 7.1.3",131 "nom 7.1.3",104 "rand 0.8.6",132 "rand 0.8.6",105 "secrecy",133 "secrecy",106 "sha2",134 "sha2 0.10.9",107 "tempfile",135 "tempfile",108]136]109137190 "rustversion",218 "rustversion",191]219]220221[[package]]222name = "argon2"223version = "0.6.0-rc.8"224source = "registry+https://github.com/rust-lang/crates.io-index"225checksum = "7af50940b73bf4e16c15c448a2b121c63f2d68e3e54b6a8731673cb4aa0cdff5"226dependencies = [227 "base64ct",228 "blake2",229 "cpufeatures 0.3.0",230 "password-hash",231]192232193[[package]]233[[package]]194name = "arrayvec"234name = "arrayvec"197checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"237checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"198238199[[package]]239[[package]]200name = "async-stream"240name = "async-broadcast"201version = "0.3.6"241version = "0.7.2"202source = "registry+https://github.com/rust-lang/crates.io-index"242source = "registry+https://github.com/rust-lang/crates.io-index"203checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"243checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"204dependencies = [244dependencies = [245 "event-listener",205 "async-stream-impl",246 "event-listener-strategy",206 "futures-core",247 "futures-core",207 "pin-project-lite",248 "pin-project-lite",208]249]250251[[package]]252name = "async-channel"253version = "2.5.0"254source = "registry+https://github.com/rust-lang/crates.io-index"255checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"256dependencies = [257 "concurrent-queue",258 "event-listener-strategy",259 "futures-core",260 "pin-project-lite",261]262263[[package]]264name = "async-executor"265version = "1.14.0"266source = "registry+https://github.com/rust-lang/crates.io-index"267checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a"268dependencies = [269 "async-task",270 "concurrent-queue",271 "fastrand",272 "futures-lite",273 "pin-project-lite",274 "slab",275]276277[[package]]278name = "async-io"279version = "2.6.0"280source = "registry+https://github.com/rust-lang/crates.io-index"281checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"282dependencies = [283 "autocfg",284 "cfg-if",285 "concurrent-queue",286 "futures-io",287 "futures-lite",288 "parking",289 "polling",290 "rustix 1.1.4",291 "slab",292 "windows-sys 0.61.2",293]294295[[package]]296name = "async-lock"297version = "3.4.2"298source = "registry+https://github.com/rust-lang/crates.io-index"299checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"300dependencies = [301 "event-listener",302 "event-listener-strategy",303 "pin-project-lite",304]305306[[package]]307name = "async-process"308version = "2.5.0"309source = "registry+https://github.com/rust-lang/crates.io-index"310checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"311dependencies = [312 "async-channel",313 "async-io",314 "async-lock",315 "async-signal",316 "async-task",317 "blocking",318 "cfg-if",319 "event-listener",320 "futures-lite",321 "rustix 1.1.4",322]209323210[[package]]324[[package]]211name = "async-stream-impl"325name = "async-recursion"212version = "0.3.6"326version = "1.1.1"213source = "registry+https://github.com/rust-lang/crates.io-index"327source = "registry+https://github.com/rust-lang/crates.io-index"214checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"328checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"215dependencies = [329dependencies = [216 "proc-macro2",330 "proc-macro2",217 "quote",331 "quote",218 "syn",332 "syn 2.0.117",219]333]334335[[package]]336name = "async-signal"337version = "0.2.14"338source = "registry+https://github.com/rust-lang/crates.io-index"339checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485"340dependencies = [341 "async-io",342 "async-lock",343 "atomic-waker",344 "cfg-if",345 "futures-core",346 "futures-io",347 "rustix 1.1.4",348 "signal-hook-registry",349 "slab",350 "windows-sys 0.61.2",351]352353[[package]]354name = "async-task"355version = "4.7.1"356source = "registry+https://github.com/rust-lang/crates.io-index"357checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"220358221[[package]]359[[package]]222name = "async-trait"360name = "async-trait"226dependencies = [364dependencies = [227 "proc-macro2",365 "proc-macro2",228 "quote",366 "quote",229 "syn",367 "syn 2.0.117",230]368]369370[[package]]371name = "async_fn_traits"372version = "0.1.1"373source = "registry+https://github.com/rust-lang/crates.io-index"374checksum = "bc58d489c5f2d2c5be31b9004cec7af25a70d23df4d8111715eee736234cf217"375dependencies = [376 "paste",377]231378232[[package]]379[[package]]233name = "atomic-waker"380name = "atomic-waker"237384238[[package]]385[[package]]239name = "autocfg"386name = "autocfg"240version = "1.5.0"387version = "1.5.1"241source = "registry+https://github.com/rust-lang/crates.io-index"388source = "registry+https://github.com/rust-lang/crates.io-index"242checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"389checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"243244[[package]]245name = "axum"246version = "0.7.9"247source = "registry+https://github.com/rust-lang/crates.io-index"248checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"249dependencies = [250 "async-trait",251 "axum-core",252 "bytes",253 "futures-util",254 "http",255 "http-body",256 "http-body-util",257 "itoa",258 "matchit",259 "memchr",260 "mime",261 "percent-encoding",262 "pin-project-lite",263 "rustversion",264 "serde",265 "sync_wrapper",266 "tower 0.5.3",267 "tower-layer",268 "tower-service",269]270390271[[package]]391[[package]]272name = "axum-core"392name = "base16ct"273version = "0.4.5"393version = "1.0.0"274source = "registry+https://github.com/rust-lang/crates.io-index"394source = "registry+https://github.com/rust-lang/crates.io-index"275checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"395checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6"276dependencies = [277 "async-trait",278 "bytes",279 "futures-util",280 "http",281 "http-body",282 "http-body-util",283 "mime",284 "pin-project-lite",285 "rustversion",286 "sync_wrapper",287 "tower-layer",288 "tower-service",289]290396291[[package]]397[[package]]292name = "base64"398name = "base64"321source = "registry+https://github.com/rust-lang/crates.io-index"427source = "registry+https://github.com/rust-lang/crates.io-index"322checksum = "6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2"428checksum = "6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2"323dependencies = [429dependencies = [324 "blowfish",430 "blowfish 0.9.1",325 "pbkdf2",431 "pbkdf2 0.12.2",326 "sha2",432 "sha2 0.10.9",327]433]434435[[package]]436name = "bcrypt-pbkdf"437version = "0.11.0"438source = "registry+https://github.com/rust-lang/crates.io-index"439checksum = "144e573728da132683b9488acd528274c790e07fc06ff81ee29f9d8f8b1041e0"440dependencies = [441 "blowfish 0.10.0",442 "pbkdf2 0.13.0",443 "sha2 0.11.0",444]328445329[[package]]446[[package]]330name = "bech32"447name = "bech32"333checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445"450checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445"334451335[[package]]452[[package]]336name = "better-command"453name = "bifrostlink"337version = "0.1.0"454version = "0.2.6"455source = "registry+https://github.com/rust-lang/crates.io-index"456checksum = "2fb01af731c11dd31b23783a83a36a29f644cc1972481f6fa4f4fabc709079eb"338dependencies = [457dependencies = [458 "async-trait",459 "async_fn_traits",460 "bifrostlink-macros",339 "regex",461 "bytes",462 "derivative",463 "futures",340 "serde",464 "serde",341 "serde_json",465 "serde_json",466 "tokio",342 "tracing",467 "tracing",343 "tracing-indicatif",468 "uuid",344]469]470471[[package]]472name = "bifrostlink-macros"473version = "0.2.6"474source = "registry+https://github.com/rust-lang/crates.io-index"475checksum = "8c4b7a5fb38b36bd81910c17ebf369f9296e508d92b1277a768a63c8a2254fdb"476dependencies = [477 "proc-macro2",478 "quote",479 "syn 2.0.117",480]481482[[package]]483name = "bifrostlink-ports"484version = "0.2.6"485source = "registry+https://github.com/rust-lang/crates.io-index"486checksum = "977acfcb8ed3c24ab7c2f76fb3eeebff1533c72708733ce6020f2501980b7cf2"487dependencies = [488 "bifrostlink",489 "bytes",490 "tokio",491 "tracing",492]345493346[[package]]494[[package]]347name = "bindgen"495name = "bindgen"359 "quote",507 "quote",360 "regex",508 "regex",361 "rustc-hash 2.1.2",509 "rustc-hash 2.1.2",362 "shlex",510 "shlex 1.3.0",363 "syn",511 "syn 2.0.117",364]512]365513366[[package]]514[[package]]367name = "bitflags"515name = "bitflags"368version = "2.11.1"516version = "2.13.0"369source = "registry+https://github.com/rust-lang/crates.io-index"517source = "registry+https://github.com/rust-lang/crates.io-index"370checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"518checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"519520[[package]]521name = "blake2"522version = "0.11.0-rc.6"523source = "registry+https://github.com/rust-lang/crates.io-index"524checksum = "061f1a09225e328e1ffbb378d2d49923c0ca5fee19fb5ac1cc9c1e9d52b93690"525dependencies = [526 "digest 0.11.3",527]371528372[[package]]529[[package]]373name = "block-buffer"530name = "block-buffer"374version = "0.10.4"531version = "0.10.4"375source = "registry+https://github.com/rust-lang/crates.io-index"532source = "registry+https://github.com/rust-lang/crates.io-index"376checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"533checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"377dependencies = [534dependencies = [378 "generic-array",535 "generic-array 0.14.7",379]536]537538[[package]]539name = "block-buffer"540version = "0.12.1"541source = "registry+https://github.com/rust-lang/crates.io-index"542checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa"543dependencies = [544 "hybrid-array",545 "zeroize",546]380547381[[package]]548[[package]]382name = "block-padding"549name = "block-padding"383version = "0.3.3"550version = "0.3.3"384source = "registry+https://github.com/rust-lang/crates.io-index"551source = "registry+https://github.com/rust-lang/crates.io-index"385checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"552checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"386dependencies = [553dependencies = [387 "generic-array",554 "generic-array 0.14.7",388]555]556557[[package]]558name = "block-padding"559version = "0.4.2"560source = "registry+https://github.com/rust-lang/crates.io-index"561checksum = "710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068b"562dependencies = [563 "hybrid-array",564]565566[[package]]567name = "blocking"568version = "1.6.2"569source = "registry+https://github.com/rust-lang/crates.io-index"570checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"571dependencies = [572 "async-channel",573 "async-task",574 "futures-io",575 "futures-lite",576 "piper",577]389578390[[package]]579[[package]]391name = "blowfish"580name = "blowfish"394checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7"583checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7"395dependencies = [584dependencies = [396 "byteorder",585 "byteorder",397 "cipher",586 "cipher 0.4.4",398]587]588589[[package]]590name = "blowfish"591version = "0.10.0"592source = "registry+https://github.com/rust-lang/crates.io-index"593checksum = "62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298"594dependencies = [595 "byteorder",596 "cipher 0.5.2",597]598599[[package]]600name = "bstr"601version = "1.12.1"602source = "registry+https://github.com/rust-lang/crates.io-index"603checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"604dependencies = [605 "memchr",606 "serde",607]399608400[[package]]609[[package]]401name = "bumpalo"610name = "bumpalo"402version = "3.20.2"611version = "3.20.3"403source = "registry+https://github.com/rust-lang/crates.io-index"612source = "registry+https://github.com/rust-lang/crates.io-index"404checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"613checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"405614406[[package]]615[[package]]407name = "bytecount"616name = "bytecount"421source = "registry+https://github.com/rust-lang/crates.io-index"630source = "registry+https://github.com/rust-lang/crates.io-index"422checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"631checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"632633[[package]]634name = "camino"635version = "1.2.2"636source = "registry+https://github.com/rust-lang/crates.io-index"637checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48"638dependencies = [639 "serde_core",640]423641424[[package]]642[[package]]425name = "cbc"643name = "cbc"426version = "0.1.2"644version = "0.1.2"427source = "registry+https://github.com/rust-lang/crates.io-index"645source = "registry+https://github.com/rust-lang/crates.io-index"428checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"646checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"429dependencies = [647dependencies = [430 "cipher",648 "cipher 0.4.4",431]649]650651[[package]]652name = "cbc"653version = "0.2.1"654source = "registry+https://github.com/rust-lang/crates.io-index"655checksum = "ce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896"656dependencies = [657 "cipher 0.5.2",658]432659433[[package]]660[[package]]434name = "cc"661name = "cc"435version = "1.2.60"662version = "1.2.64"436source = "registry+https://github.com/rust-lang/crates.io-index"663source = "registry+https://github.com/rust-lang/crates.io-index"437checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"664checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"438dependencies = [665dependencies = [439 "find-msvc-tools",666 "find-msvc-tools",440 "shlex",667 "shlex 2.0.1",441]668]442669443[[package]]670[[package]]468checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818"695checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818"469dependencies = [696dependencies = [470 "cfg-if",697 "cfg-if",471 "cipher",698 "cipher 0.4.4",472 "cpufeatures 0.2.17",699 "cpufeatures 0.2.17",473]700]474701479checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"706checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"480dependencies = [707dependencies = [481 "cfg-if",708 "cfg-if",709 "cipher 0.5.2",482 "cpufeatures 0.3.0",710 "cpufeatures 0.3.0",483 "rand_core 0.10.1",711 "rand_core 0.10.1",712 "zeroize",484]713]485714486[[package]]715[[package]]489source = "registry+https://github.com/rust-lang/crates.io-index"718source = "registry+https://github.com/rust-lang/crates.io-index"490checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"719checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"491dependencies = [720dependencies = [492 "aead",721 "aead 0.5.2",493 "chacha20 0.9.1",722 "chacha20 0.9.1",494 "cipher",723 "cipher 0.4.4",495 "poly1305",724 "poly1305 0.8.0",496 "zeroize",725 "zeroize",497]726]498727499[[package]]728[[package]]500name = "chrono"729name = "chrono"501version = "0.4.44"730version = "0.4.45"502source = "registry+https://github.com/rust-lang/crates.io-index"731source = "registry+https://github.com/rust-lang/crates.io-index"503checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"732checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"504dependencies = [733dependencies = [505 "iana-time-zone",734 "iana-time-zone",506 "js-sys",735 "js-sys",516source = "registry+https://github.com/rust-lang/crates.io-index"745source = "registry+https://github.com/rust-lang/crates.io-index"517checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"746checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"518dependencies = [747dependencies = [519 "crypto-common",748 "crypto-common 0.1.7",520 "inout",749 "inout 0.1.4",521 "zeroize",750 "zeroize",522]751]752753[[package]]754name = "cipher"755version = "0.5.2"756source = "registry+https://github.com/rust-lang/crates.io-index"757checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c"758dependencies = [759 "block-buffer 0.12.1",760 "crypto-common 0.2.2",761 "inout 0.2.2",762 "zeroize",763]523764524[[package]]765[[package]]525name = "clang-sys"766name = "clang-sys"559800560[[package]]801[[package]]561name = "clap_complete"802name = "clap_complete"562version = "4.6.2"803version = "4.6.5"563source = "registry+https://github.com/rust-lang/crates.io-index"804source = "registry+https://github.com/rust-lang/crates.io-index"564checksum = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb"805checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772"565dependencies = [806dependencies = [566 "clap",807 "clap",567]808]575 "heck",816 "heck",576 "proc-macro2",817 "proc-macro2",577 "quote",818 "quote",578 "syn",819 "syn 2.0.117",579]820]580821581[[package]]822[[package]]584source = "registry+https://github.com/rust-lang/crates.io-index"825source = "registry+https://github.com/rust-lang/crates.io-index"585checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"826checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"827828[[package]]829name = "cmov"830version = "0.5.4"831source = "registry+https://github.com/rust-lang/crates.io-index"832checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a"586833587[[package]]834[[package]]588name = "codespan-reporting"835name = "codespan-reporting"601source = "registry+https://github.com/rust-lang/crates.io-index"848source = "registry+https://github.com/rust-lang/crates.io-index"602checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"849checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"850851[[package]]852name = "concurrent-queue"853version = "2.5.0"854source = "registry+https://github.com/rust-lang/crates.io-index"855checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"856dependencies = [857 "crossbeam-utils",858]603859604[[package]]860[[package]]605name = "console"861name = "console"615871616[[package]]872[[package]]617name = "const-hex"873name = "const-hex"618version = "1.18.1"874version = "1.19.1"619source = "registry+https://github.com/rust-lang/crates.io-index"875source = "registry+https://github.com/rust-lang/crates.io-index"620checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b"876checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558"621dependencies = [877dependencies = [622 "cfg-if",878 "cfg-if",623 "cpufeatures 0.2.17",879 "cpufeatures 0.2.17",631source = "registry+https://github.com/rust-lang/crates.io-index"887source = "registry+https://github.com/rust-lang/crates.io-index"632checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"888checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"889890[[package]]891name = "const-oid"892version = "0.10.2"893source = "registry+https://github.com/rust-lang/crates.io-index"894checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"633895634[[package]]896[[package]]635name = "cookie-factory"897name = "cookie-factory"656source = "registry+https://github.com/rust-lang/crates.io-index"918source = "registry+https://github.com/rust-lang/crates.io-index"657checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"919checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"920921[[package]]922name = "cpubits"923version = "0.1.1"924source = "registry+https://github.com/rust-lang/crates.io-index"925checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae"658926659[[package]]927[[package]]660name = "cpufeatures"928name = "cpufeatures"683 "cfg-if",951 "cfg-if",684]952]953954[[package]]955name = "crossbeam-utils"956version = "0.8.21"957source = "registry+https://github.com/rust-lang/crates.io-index"958checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"959960[[package]]961name = "crypto-bigint"962version = "0.7.3"963source = "registry+https://github.com/rust-lang/crates.io-index"964checksum = "42a0d26b245348befa0c121944541476763dcc46ede886c88f9d12e1697d27c3"965dependencies = [966 "cpubits",967 "ctutils",968 "getrandom 0.4.2",969 "hybrid-array",970 "num-traits",971 "rand_core 0.10.1",972 "serdect",973 "subtle",974 "zeroize",975]685976686[[package]]977[[package]]687name = "crypto-common"978name = "crypto-common"688version = "0.1.7"979version = "0.1.7"689source = "registry+https://github.com/rust-lang/crates.io-index"980source = "registry+https://github.com/rust-lang/crates.io-index"690checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"981checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"691dependencies = [982dependencies = [692 "generic-array",983 "generic-array 0.14.7",693 "rand_core 0.6.4",984 "rand_core 0.6.4",694 "typenum",985 "typenum",695]986]987988[[package]]989name = "crypto-common"990version = "0.2.2"991source = "registry+https://github.com/rust-lang/crates.io-index"992checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453"993dependencies = [994 "getrandom 0.4.2",995 "hybrid-array",996 "rand_core 0.10.1",997]998999[[package]]1000name = "crypto-primes"1001version = "0.7.2"1002source = "registry+https://github.com/rust-lang/crates.io-index"1003checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f"1004dependencies = [1005 "crypto-bigint",1006 "rand_core 0.10.1",1007]6961008697[[package]]1009[[package]]698name = "ctr"1010name = "ctr"699version = "0.9.2"1011version = "0.9.2"700source = "registry+https://github.com/rust-lang/crates.io-index"1012source = "registry+https://github.com/rust-lang/crates.io-index"701checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835"1013checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835"702dependencies = [1014dependencies = [703 "cipher",1015 "cipher 0.4.4",704]1016]10171018[[package]]1019name = "ctr"1020version = "0.10.1"1021source = "registry+https://github.com/rust-lang/crates.io-index"1022checksum = "baaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21"1023dependencies = [1024 "cipher 0.5.2",1025]10261027[[package]]1028name = "ctutils"1029version = "0.4.2"1030source = "registry+https://github.com/rust-lang/crates.io-index"1031checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e"1032dependencies = [1033 "cmov",1034 "subtle",1035]7051036706[[package]]1037[[package]]707name = "cursor-icon"1038name = "cursor-icon"718 "cfg-if",1049 "cfg-if",719 "cpufeatures 0.2.17",1050 "cpufeatures 0.2.17",720 "curve25519-dalek-derive",1051 "curve25519-dalek-derive",721 "digest",1052 "digest 0.10.7",722 "fiat-crypto",1053 "fiat-crypto 0.2.9",723 "rustc_version",1054 "rustc_version",724 "subtle",1055 "subtle",725 "zeroize",1056 "zeroize",726]1057]10581059[[package]]1060name = "curve25519-dalek"1061version = "5.0.0-rc.0"1062source = "registry+https://github.com/rust-lang/crates.io-index"1063checksum = "4f359e08ca85e7bd759e1fd933ff2bccd81864c60a8fba0e259c7f822b0924bf"1064dependencies = [1065 "cfg-if",1066 "cpufeatures 0.3.0",1067 "curve25519-dalek-derive",1068 "digest 0.11.3",1069 "fiat-crypto 0.3.0",1070 "rustc_version",1071 "subtle",1072 "zeroize",1073]7271074728[[package]]1075[[package]]729name = "curve25519-dalek-derive"1076name = "curve25519-dalek-derive"733dependencies = [1080dependencies = [734 "proc-macro2",1081 "proc-macro2",735 "quote",1082 "quote",736 "syn",1083 "syn 2.0.117",737]1084]7381085739[[package]]1086[[package]]759dependencies = [1106dependencies = [760 "cc",1107 "cc",761 "codespan-reporting",1108 "codespan-reporting",762 "indexmap 2.14.0",1109 "indexmap",763 "proc-macro2",1110 "proc-macro2",764 "quote",1111 "quote",765 "scratch",1112 "scratch",766 "syn",1113 "syn 2.0.117",767]1114]7681115769[[package]]1116[[package]]774dependencies = [1121dependencies = [775 "clap",1122 "clap",776 "codespan-reporting",1123 "codespan-reporting",777 "indexmap 2.14.0",1124 "indexmap",778 "proc-macro2",1125 "proc-macro2",779 "quote",1126 "quote",780 "syn",1127 "syn 2.0.117",781]1128]7821129783[[package]]1130[[package]]792source = "registry+https://github.com/rust-lang/crates.io-index"1139source = "registry+https://github.com/rust-lang/crates.io-index"793checksum = "e6acc6b5822b9526adfb4fc377b67128fdd60aac757cc4a741a6278603f763cf"1140checksum = "e6acc6b5822b9526adfb4fc377b67128fdd60aac757cc4a741a6278603f763cf"794dependencies = [1141dependencies = [795 "indexmap 2.14.0",1142 "indexmap",796 "proc-macro2",1143 "proc-macro2",797 "quote",1144 "quote",798 "syn",1145 "syn 2.0.117",799]1146]11471148[[package]]1149name = "data-encoding"1150version = "2.11.0"1151source = "registry+https://github.com/rust-lang/crates.io-index"1152checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"11531154[[package]]1155name = "delegate"1156version = "0.13.5"1157source = "registry+https://github.com/rust-lang/crates.io-index"1158checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370"1159dependencies = [1160 "proc-macro2",1161 "quote",1162 "syn 2.0.117",1163]8001164801[[package]]1165[[package]]802name = "der"1166name = "der"803version = "0.7.10"1167version = "0.7.10"804source = "registry+https://github.com/rust-lang/crates.io-index"1168source = "registry+https://github.com/rust-lang/crates.io-index"805checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"1169checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"806dependencies = [1170dependencies = [807 "const-oid",1171 "const-oid 0.9.6",808 "zeroize",1172 "zeroize",809]1173]8101174811[[package]]1175[[package]]1176name = "der"1177version = "0.8.0"1178source = "registry+https://github.com/rust-lang/crates.io-index"1179checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b"1180dependencies = [1181 "const-oid 0.10.2",1182 "pem-rfc7468",1183 "zeroize",1184]11851186[[package]]812name = "deranged"1187name = "deranged"813version = "0.5.8"1188version = "0.5.8"814source = "registry+https://github.com/rust-lang/crates.io-index"1189source = "registry+https://github.com/rust-lang/crates.io-index"815checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"1190checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"11911192[[package]]1193name = "derivative"1194version = "2.2.0"1195source = "registry+https://github.com/rust-lang/crates.io-index"1196checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"816dependencies = [1197dependencies = [817 "powerfmt",1198 "proc-macro2",818 "serde_core",1199 "quote",1200 "syn 1.0.109",819]1201]12021203[[package]]1204name = "des"1205version = "0.9.0"1206source = "registry+https://github.com/rust-lang/crates.io-index"1207checksum = "916a94e407b54f9034d71dd748234cd1e516ced6284009906ae246f177eafe5a"1208dependencies = [1209 "cipher 0.5.2",1210]8201211821[[package]]1212[[package]]822name = "digest"1213name = "digest"823version = "0.10.7"1214version = "0.10.7"824source = "registry+https://github.com/rust-lang/crates.io-index"1215source = "registry+https://github.com/rust-lang/crates.io-index"825checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"1216checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"826dependencies = [1217dependencies = [827 "block-buffer",1218 "block-buffer 0.10.4",828 "const-oid",1219 "const-oid 0.9.6",829 "crypto-common",1220 "crypto-common 0.1.7",830 "subtle",1221 "subtle",831]1222]12231224[[package]]1225name = "digest"1226version = "0.11.3"1227source = "registry+https://github.com/rust-lang/crates.io-index"1228checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"1229dependencies = [1230 "block-buffer 0.12.1",1231 "const-oid 0.10.2",1232 "crypto-common 0.2.2",1233 "ctutils",1234]8321235833[[package]]1236[[package]]834name = "displaydoc"1237name = "displaydoc"835version = "0.2.5"1238version = "0.2.6"836source = "registry+https://github.com/rust-lang/crates.io-index"1239source = "registry+https://github.com/rust-lang/crates.io-index"837checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"1240checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"838dependencies = [1241dependencies = [839 "proc-macro2",1242 "proc-macro2",840 "quote",1243 "quote",841 "syn",1244 "syn 2.0.117",842]1245]12461247[[package]]1248name = "ecdsa"1249version = "0.17.0-rc.18"1250source = "registry+https://github.com/rust-lang/crates.io-index"1251checksum = "54fb064faabbee66e1fc8e5c5a9458d4269dc2d8b638fe86a425adb2510d1a96"1252dependencies = [1253 "der 0.8.0",1254 "digest 0.11.3",1255 "elliptic-curve",1256 "rfc6979",1257 "signature 3.0.0",1258 "spki 0.8.0",1259 "zeroize",1260]8431261844[[package]]1262[[package]]845name = "ed25519"1263name = "ed25519"846version = "2.2.3"1264version = "2.2.3"847source = "registry+https://github.com/rust-lang/crates.io-index"1265source = "registry+https://github.com/rust-lang/crates.io-index"848checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"1266checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"849dependencies = [1267dependencies = [850 "pkcs8",1268 "pkcs8 0.10.2",851 "signature",1269 "signature 2.2.0",852]1270]12711272[[package]]1273name = "ed25519"1274version = "3.0.0"1275source = "registry+https://github.com/rust-lang/crates.io-index"1276checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a"1277dependencies = [1278 "pkcs8 0.11.0",1279 "signature 3.0.0",1280]8531281854[[package]]1282[[package]]855name = "ed25519-dalek"1283name = "ed25519-dalek"856version = "2.2.0"1284version = "2.2.0"857source = "registry+https://github.com/rust-lang/crates.io-index"1285source = "registry+https://github.com/rust-lang/crates.io-index"858checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"1286checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"859dependencies = [1287dependencies = [860 "curve25519-dalek",1288 "curve25519-dalek 4.1.3",861 "ed25519",1289 "ed25519 2.2.3",862 "serde",1290 "serde",863 "sha2",1291 "sha2 0.10.9",864 "subtle",1292 "subtle",865 "zeroize",1293 "zeroize",866]1294]12951296[[package]]1297name = "ed25519-dalek"1298version = "3.0.0-rc.0"1299source = "registry+https://github.com/rust-lang/crates.io-index"1300checksum = "b011170fe4f04665565b4110afef66774fe9ffff278f3eb5b81cc73d26e27d60"1301dependencies = [1302 "curve25519-dalek 5.0.0-rc.0",1303 "ed25519 3.0.0",1304 "rand_core 0.10.1",1305 "serde",1306 "sha2 0.11.0",1307 "signature 3.0.0",1308 "subtle",1309 "zeroize",1310]8671311868[[package]]1312[[package]]869name = "either"1313name = "either"870version = "1.15.0"1314version = "1.16.0"871source = "registry+https://github.com/rust-lang/crates.io-index"1315source = "registry+https://github.com/rust-lang/crates.io-index"872checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"1316checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"13171318[[package]]1319name = "elliptic-curve"1320version = "0.14.0-rc.33"1321source = "registry+https://github.com/rust-lang/crates.io-index"1322checksum = "102d3643d30dd8b559613c5cced68317199597fffb278cdc88daa2ef7fafc935"1323dependencies = [1324 "base16ct",1325 "crypto-bigint",1326 "crypto-common 0.2.2",1327 "digest 0.11.3",1328 "ff",1329 "group",1330 "hkdf 0.13.0",1331 "hybrid-array",1332 "once_cell",1333 "pem-rfc7468",1334 "pkcs8 0.11.0",1335 "rand_core 0.10.1",1336 "sec1",1337 "subtle",1338 "zeroize",1339]8731340874[[package]]1341[[package]]875name = "encode_unicode"1342name = "encode_unicode"876version = "1.0.0"1343version = "1.0.0"877source = "registry+https://github.com/rust-lang/crates.io-index"1344source = "registry+https://github.com/rust-lang/crates.io-index"878checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"1345checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"13461347[[package]]1348name = "endi"1349version = "1.1.1"1350source = "registry+https://github.com/rust-lang/crates.io-index"1351checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"13521353[[package]]1354name = "enum_dispatch"1355version = "0.3.13"1356source = "registry+https://github.com/rust-lang/crates.io-index"1357checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd"1358dependencies = [1359 "once_cell",1360 "proc-macro2",1361 "quote",1362 "syn 2.0.117",1363]13641365[[package]]1366name = "enumflags2"1367version = "0.7.12"1368source = "registry+https://github.com/rust-lang/crates.io-index"1369checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"1370dependencies = [1371 "enumflags2_derive",1372 "serde",1373]13741375[[package]]1376name = "enumflags2_derive"1377version = "0.7.12"1378source = "registry+https://github.com/rust-lang/crates.io-index"1379checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"1380dependencies = [1381 "proc-macro2",1382 "quote",1383 "syn 2.0.117",1384]8791385880[[package]]1386[[package]]881name = "env_filter"1387name = "env_filter"914 "windows-sys 0.61.2",1420 "windows-sys 0.61.2",915]1421]14221423[[package]]1424name = "event-listener"1425version = "5.4.1"1426source = "registry+https://github.com/rust-lang/crates.io-index"1427checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"1428dependencies = [1429 "concurrent-queue",1430 "parking",1431 "pin-project-lite",1432]14331434[[package]]1435name = "event-listener-strategy"1436version = "0.5.4"1437source = "registry+https://github.com/rust-lang/crates.io-index"1438checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"1439dependencies = [1440 "event-listener",1441 "pin-project-lite",1442]9161443917[[package]]1444[[package]]918name = "fastrand"1445name = "fastrand"919version = "2.4.1"1446version = "2.4.1"920source = "registry+https://github.com/rust-lang/crates.io-index"1447source = "registry+https://github.com/rust-lang/crates.io-index"921checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"1448checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"14491450[[package]]1451name = "ff"1452version = "0.14.0"1453source = "registry+https://github.com/rust-lang/crates.io-index"1454checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f"1455dependencies = [1456 "rand_core 0.10.1",1457 "subtle",1458]9221459923[[package]]1460[[package]]924name = "fiat-crypto"1461name = "fiat-crypto"925version = "0.2.9"1462version = "0.2.9"926source = "registry+https://github.com/rust-lang/crates.io-index"1463source = "registry+https://github.com/rust-lang/crates.io-index"927checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"1464checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"14651466[[package]]1467name = "fiat-crypto"1468version = "0.3.0"1469source = "registry+https://github.com/rust-lang/crates.io-index"1470checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"9281471929[[package]]1472[[package]]930name = "find-crate"1473name = "find-crate"941source = "registry+https://github.com/rust-lang/crates.io-index"1484source = "registry+https://github.com/rust-lang/crates.io-index"942checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"1485checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"943944[[package]]945name = "fixedbitset"946version = "0.5.7"947source = "registry+https://github.com/rust-lang/crates.io-index"948checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"9491486950[[package]]1487[[package]]951name = "flate2"1488name = "flate2"961name = "fleet"1498name = "fleet"962version = "0.2.0"1499version = "0.2.0"963dependencies = [1500dependencies = [964 "abort-on-drop",965 "age",966 "age-core",967 "anyhow",1501 "anyhow",968 "async-trait",969 "base64 0.22.1",970 "better-command",971 "chrono",1502 "camino",972 "clap",1503 "clap",973 "clap_complete",1504 "clap_complete",974 "fleet-base",1505 "fleet-base",975 "fleet-shared",976 "futures",1506 "futures",977 "hostname",978 "human-repr",1507 "human-repr",979 "indicatif",1508 "indicatif",980 "itertools 0.14.0",1509 "itertools 0.14.0",981 "nix-eval",1510 "nix-eval",982 "nixlike",983 "nom 8.0.0",984 "openssh",985 "opentelemetry",1511 "opentelemetry",986 "opentelemetry-appender-tracing",1512 "opentelemetry-appender-tracing",987 "opentelemetry-exporter-env",1513 "opentelemetry-exporter-env",988 "opentelemetry_sdk",1514 "opentelemetry_sdk",989 "peg",990 "regex",1515 "remowt-fleet",991 "serde",1516 "serde",992 "serde_json",1517 "serde_json",993 "shlex",1518 "shlex 1.3.0",994 "tabled",1519 "tabled",995 "tempfile",1520 "tempfile",996 "thiserror 2.0.18",997 "time",998 "tokio",1521 "tokio",999 "tokio-util",1000 "tracing",1522 "tracing",1001 "tracing-indicatif",1523 "tracing-indicatif",1002 "tracing-opentelemetry",1524 "tracing-opentelemetry",1009dependencies = [1531dependencies = [1010 "age",1532 "age",1011 "anyhow",1533 "anyhow",1012 "better-command",1534 "camino",1013 "chrono",1535 "chrono",1014 "clap",1536 "clap",1015 "fleet-shared",1537 "fleet-shared",1020 "nix-eval",1542 "nix-eval",1021 "nixlike",1543 "nixlike",1022 "nom 8.0.0",1544 "nom 8.0.0",1023 "openssh",1024 "rand 0.10.1",1545 "rand 0.10.1",1546 "remowt-client",1547 "remowt-endpoints",1548 "remowt-fleet",1549 "remowt-link-shared",1550 "remowt-ui-prompt",1025 "serde",1551 "serde",1026 "serde_json",1552 "serde_json",1027 "tabled",1553 "tabled",1028 "tempfile",1554 "tempfile",1029 "thiserror 2.0.18",1030 "time",1555 "time",1031 "tokio",1556 "tokio",1032 "tokio-util",1033 "toml_edit",1034 "tracing",1557 "tracing",1035]1558]103615591042 "anyhow",1565 "anyhow",1043 "base64 0.22.1",1566 "base64 0.22.1",1044 "clap",1567 "clap",1045 "ed25519-dalek",1568 "ed25519-dalek 2.2.0",1046 "fleet-shared",1569 "fleet-shared",1047 "hex",1570 "hex",1048 "hmac",1571 "hmac 0.12.1",1049 "pbkdf2",1572 "pbkdf2 0.12.2",1050 "rand 0.10.1",1573 "rand 0.10.1",1051 "sha2",1574 "sha2 0.10.9",1052 "x25519-dalek",1575 "x25519-dalek",1053]1576]105415771196source = "registry+https://github.com/rust-lang/crates.io-index"1719source = "registry+https://github.com/rust-lang/crates.io-index"1197checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"1720checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"17211722[[package]]1723name = "futures-lite"1724version = "2.6.1"1725source = "registry+https://github.com/rust-lang/crates.io-index"1726checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"1727dependencies = [1728 "fastrand",1729 "futures-core",1730 "futures-io",1731 "parking",1732 "pin-project-lite",1733]119817341199[[package]]1735[[package]]1200name = "futures-macro"1736name = "futures-macro"1204dependencies = [1740dependencies = [1205 "proc-macro2",1741 "proc-macro2",1206 "quote",1742 "quote",1207 "syn",1743 "syn 2.0.117",1208]1744]120917451210[[package]]1746[[package]]1246 "version_check",1782 "version_check",1247]1783]17841785[[package]]1786name = "generic-array"1787version = "1.4.3"1788source = "registry+https://github.com/rust-lang/crates.io-index"1789checksum = "c2e55f16dcf0e9c00efbe2e655ffe45fc98e7066b52bc92f8a79e64060a79351"1790dependencies = [1791 "generic-array 0.14.7",1792 "rustversion",1793 "typenum",1794]124817951249[[package]]1796[[package]]1250name = "getrandom"1797name = "getrandom"1280checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"1827checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"1281dependencies = [1828dependencies = [1282 "cfg-if",1829 "cfg-if",1830 "js-sys",1283 "libc",1831 "libc",1284 "r-efi 6.0.0",1832 "r-efi 6.0.0",1285 "rand_core 0.10.1",1833 "rand_core 0.10.1",1286 "wasip2",1834 "wasip2",1287 "wasip3",1835 "wasip3",1836 "wasm-bindgen",1288]1837]128918381290[[package]]1839[[package]]1294checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1"1843checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1"1295dependencies = [1844dependencies = [1296 "opaque-debug",1845 "opaque-debug",1297 "polyval",1846 "polyval 0.6.2",1298]1847]18481849[[package]]1850name = "ghash"1851version = "0.6.0"1852source = "registry+https://github.com/rust-lang/crates.io-index"1853checksum = "2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5"1854dependencies = [1855 "polyval 0.7.1",1856]129918571300[[package]]1858[[package]]1301name = "glob"1859name = "glob"1304checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"1862checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"130518631306[[package]]1864[[package]]1307name = "h2"1865name = "globset"1308version = "0.4.13"1866version = "0.4.18"1309source = "registry+https://github.com/rust-lang/crates.io-index"1867source = "registry+https://github.com/rust-lang/crates.io-index"1310checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"1868checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"1311dependencies = [1869dependencies = [1312 "atomic-waker",1870 "aho-corasick",1313 "bytes",1871 "bstr",1314 "fnv",1315 "futures-core",1316 "futures-sink",1317 "http",1318 "indexmap 2.14.0",1319 "slab",1872 "log",1320 "tokio",1873 "regex-automata",1321 "tokio-util",1874 "regex-syntax",1322 "tracing",1323]1875]132418761325[[package]]1877[[package]]1326name = "hashbrown"1878name = "group"1327version = "0.12.3"1879version = "0.14.0"1328source = "registry+https://github.com/rust-lang/crates.io-index"1880source = "registry+https://github.com/rust-lang/crates.io-index"1329checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"1881checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4"1882dependencies = [1883 "ff",1884 "rand_core 0.10.1",1885 "subtle",1886]18871888[[package]]1889name = "h2"1890version = "0.4.14"1891source = "registry+https://github.com/rust-lang/crates.io-index"1892checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733"1893dependencies = [1894 "atomic-waker",1895 "bytes",1896 "fnv",1897 "futures-core",1898 "futures-sink",1899 "http",1900 "indexmap",1901 "slab",1902 "tokio",1903 "tokio-util",1904 "tracing",1905]133019061331[[package]]1907[[package]]1332name = "hashbrown"1908name = "hashbrown"133919151340[[package]]1916[[package]]1341name = "hashbrown"1917name = "hashbrown"1342version = "0.17.0"1918version = "0.17.1"1343source = "registry+https://github.com/rust-lang/crates.io-index"1919source = "registry+https://github.com/rust-lang/crates.io-index"1344checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"1920checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"134519211346[[package]]1922[[package]]1347name = "heck"1923name = "heck"1348version = "0.5.0"1924version = "0.5.0"1349source = "registry+https://github.com/rust-lang/crates.io-index"1925source = "registry+https://github.com/rust-lang/crates.io-index"1350checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"1926checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"19271928[[package]]1929name = "hermit-abi"1930version = "0.5.2"1931source = "registry+https://github.com/rust-lang/crates.io-index"1932checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"135119331352[[package]]1934[[package]]1353name = "hex"1935name = "hex"1354version = "0.4.3"1936version = "0.4.3"1355source = "registry+https://github.com/rust-lang/crates.io-index"1937source = "registry+https://github.com/rust-lang/crates.io-index"1356checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"1938checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"19391940[[package]]1941name = "hex-literal"1942version = "1.1.0"1943source = "registry+https://github.com/rust-lang/crates.io-index"1944checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1"135719451358[[package]]1946[[package]]1359name = "hkdf"1947name = "hkdf"1360version = "0.12.4"1948version = "0.12.4"1361source = "registry+https://github.com/rust-lang/crates.io-index"1949source = "registry+https://github.com/rust-lang/crates.io-index"1362checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"1950checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"1363dependencies = [1951dependencies = [1364 "hmac",1952 "hmac 0.12.1",1365]1953]19541955[[package]]1956name = "hkdf"1957version = "0.13.0"1958source = "registry+https://github.com/rust-lang/crates.io-index"1959checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018"1960dependencies = [1961 "hmac 0.13.0",1962]136619631367[[package]]1964[[package]]1368name = "hmac"1965name = "hmac"1369version = "0.12.1"1966version = "0.12.1"1370source = "registry+https://github.com/rust-lang/crates.io-index"1967source = "registry+https://github.com/rust-lang/crates.io-index"1371checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"1968checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"1372dependencies = [1969dependencies = [1373 "digest",1970 "digest 0.10.7",1374]1971]19721973[[package]]1974name = "hmac"1975version = "0.13.0"1976source = "registry+https://github.com/rust-lang/crates.io-index"1977checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f"1978dependencies = [1979 "digest 0.11.3",1980]137519811376[[package]]1982[[package]]1377name = "home"1983name = "home"139520011396[[package]]2002[[package]]1397name = "http"2003name = "http"1398version = "1.4.0"2004version = "1.4.2"1399source = "registry+https://github.com/rust-lang/crates.io-index"2005source = "registry+https://github.com/rust-lang/crates.io-index"1400checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"2006checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"1401dependencies = [2007dependencies = [1402 "bytes",2008 "bytes",1403 "itoa",2009 "itoa",1432source = "registry+https://github.com/rust-lang/crates.io-index"2038source = "registry+https://github.com/rust-lang/crates.io-index"1433checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"2039checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"14341435[[package]]1436name = "httpdate"1437version = "1.0.3"1438source = "registry+https://github.com/rust-lang/crates.io-index"1439checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"144020401441[[package]]2041[[package]]1442name = "human-repr"2042name = "human-repr"1443version = "1.1.0"2043version = "1.1.0"1444source = "registry+https://github.com/rust-lang/crates.io-index"2044source = "registry+https://github.com/rust-lang/crates.io-index"1445checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1"2045checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1"20462047[[package]]2048name = "hybrid-array"2049version = "0.4.12"2050source = "registry+https://github.com/rust-lang/crates.io-index"2051checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da"2052dependencies = [2053 "ctutils",2054 "subtle",2055 "typenum",2056 "zeroize",2057]144620581447[[package]]2059[[package]]1448name = "hyper"2060name = "hyper"1449version = "1.9.0"2061version = "1.10.1"1450source = "registry+https://github.com/rust-lang/crates.io-index"2062source = "registry+https://github.com/rust-lang/crates.io-index"1451checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"2063checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"1452dependencies = [2064dependencies = [1453 "atomic-waker",2065 "atomic-waker",1454 "bytes",2066 "bytes",1458 "http",2070 "http",1459 "http-body",2071 "http-body",1460 "httparse",2072 "httparse",1461 "httpdate",1462 "itoa",2073 "itoa",1463 "pin-project-lite",2074 "pin-project-lite",1464 "smallvec",2075 "smallvec",1512 "libc",2123 "libc",1513 "percent-encoding",2124 "percent-encoding",1514 "pin-project-lite",2125 "pin-project-lite",1515 "socket2 0.6.3",2126 "socket2",1516 "tokio",2127 "tokio",1517 "tower-service",2128 "tower-service",1518 "tracing",2129 "tracing",1567 "proc-macro2",2178 "proc-macro2",1568 "quote",2179 "quote",1569 "strsim",2180 "strsim",1570 "syn",2181 "syn 2.0.117",1571 "unic-langid",2182 "unic-langid",1572]2183]157321841581 "i18n-config",2192 "i18n-config",1582 "proc-macro2",2193 "proc-macro2",1583 "quote",2194 "quote",1584 "syn",2195 "syn 2.0.117",1585]2196]158621971587[[package]]2198[[package]]170923201710[[package]]2321[[package]]1711name = "idna_adapter"2322name = "idna_adapter"1712version = "1.2.1"2323version = "1.2.2"1713source = "registry+https://github.com/rust-lang/crates.io-index"2324source = "registry+https://github.com/rust-lang/crates.io-index"1714checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"2325checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"1715dependencies = [2326dependencies = [1716 "icu_normalizer",2327 "icu_normalizer",1717 "icu_properties",2328 "icu_properties",1718]2329]17191720[[package]]1721name = "indexmap"1722version = "1.9.3"1723source = "registry+https://github.com/rust-lang/crates.io-index"1724checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"1725dependencies = [1726 "autocfg",1727 "hashbrown 0.12.3",1728]172923301730[[package]]2331[[package]]1731name = "indexmap"2332name = "indexmap"1734checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"2335checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"1735dependencies = [2336dependencies = [1736 "equivalent",2337 "equivalent",1737 "hashbrown 0.17.0",2338 "hashbrown 0.17.1",1738 "serde",2339 "serde",1739 "serde_core",2340 "serde_core",1740]2341]1768source = "registry+https://github.com/rust-lang/crates.io-index"2369source = "registry+https://github.com/rust-lang/crates.io-index"1769checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"2370checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"1770dependencies = [2371dependencies = [1771 "block-padding",2372 "block-padding 0.3.3",1772 "generic-array",2373 "generic-array 0.14.7",1773]2374]23752376[[package]]2377name = "inout"2378version = "0.2.2"2379source = "registry+https://github.com/rust-lang/crates.io-index"2380checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7"2381dependencies = [2382 "block-padding 0.4.2",2383 "hybrid-array",2384]23852386[[package]]2387name = "internal-russh-num-bigint"2388version = "0.5.0"2389source = "registry+https://github.com/rust-lang/crates.io-index"2390checksum = "ae8e22120c32fb4d19ec55fba35015f57095cd95a2e3b732e44457f5915b2ee8"2391dependencies = [2392 "num-integer",2393 "num-traits",2394 "rand 0.10.1",2395 "rand_core 0.10.1",2396]177423971775[[package]]2398[[package]]1776name = "intl-memoizer"2399name = "intl-memoizer"1803source = "registry+https://github.com/rust-lang/crates.io-index"2426source = "registry+https://github.com/rust-lang/crates.io-index"1804checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"2427checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"18051806[[package]]1807name = "iri-string"1808version = "0.7.12"1809source = "registry+https://github.com/rust-lang/crates.io-index"1810checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20"1811dependencies = [1812 "memchr",1813 "serde",1814]181524281816[[package]]2429[[package]]1817name = "is_terminal_polyfill"2430name = "is_terminal_polyfill"184524581846[[package]]2459[[package]]1847name = "js-sys"2460name = "js-sys"1848version = "0.3.95"2461version = "0.3.102"1849source = "registry+https://github.com/rust-lang/crates.io-index"2462source = "registry+https://github.com/rust-lang/crates.io-index"1850checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"2463checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"1851dependencies = [2464dependencies = [1852 "cfg-if",2465 "cfg-if",1853 "futures-util",2466 "futures-util",1854 "once_cell",1855 "wasm-bindgen",2467 "wasm-bindgen",1856]2468]24692470[[package]]2471name = "keccak"2472version = "0.2.0"2473source = "registry+https://github.com/rust-lang/crates.io-index"2474checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa"2475dependencies = [2476 "cfg-if",2477 "cpufeatures 0.3.0",2478]24792480[[package]]2481name = "kem"2482version = "0.3.0"2483source = "registry+https://github.com/rust-lang/crates.io-index"2484checksum = "01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edd"2485dependencies = [2486 "crypto-common 0.2.2",2487 "rand_core 0.10.1",2488]185724891858[[package]]2490[[package]]1859name = "lazy_static"2491name = "lazy_static"187225041873[[package]]2505[[package]]1874name = "libc"2506name = "libc"1875version = "0.2.185"2507version = "0.2.186"1876source = "registry+https://github.com/rust-lang/crates.io-index"2508source = "registry+https://github.com/rust-lang/crates.io-index"1877checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"2509checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"187825101879[[package]]2511[[package]]1880name = "libloading"2512name = "libloading"1892source = "registry+https://github.com/rust-lang/crates.io-index"2524source = "registry+https://github.com/rust-lang/crates.io-index"1893checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"2525checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"25262527[[package]]2528name = "libredox"2529version = "0.1.17"2530source = "registry+https://github.com/rust-lang/crates.io-index"2531checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"2532dependencies = [2533 "bitflags",2534 "libc",2535 "plain",2536 "redox_syscall 0.8.1",2537]189425381895[[package]]2539[[package]]1896name = "link-cplusplus"2540name = "link-cplusplus"193625801937[[package]]2581[[package]]1938name = "log"2582name = "log"1939version = "0.4.29"2583version = "0.4.32"1940source = "registry+https://github.com/rust-lang/crates.io-index"2584source = "registry+https://github.com/rust-lang/crates.io-index"1941checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"2585checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"194225861943[[package]]2587[[package]]1944name = "lru-slab"2588name = "lru-slab"1956]2600]195726011958[[package]]2602[[package]]1959name = "matchit"2603name = "md5"1960version = "0.7.3"2604version = "0.8.0"1961source = "registry+https://github.com/rust-lang/crates.io-index"2605source = "registry+https://github.com/rust-lang/crates.io-index"1962checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"2606checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0"196326071964[[package]]2608[[package]]1965name = "memchr"2609name = "memchr"1966version = "2.8.0"2610version = "2.8.2"1967source = "registry+https://github.com/rust-lang/crates.io-index"2611source = "registry+https://github.com/rust-lang/crates.io-index"1968checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"2612checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"196926131970[[package]]2614[[package]]1971name = "mime"2615name = "memoffset"1972version = "0.3.17"2616version = "0.9.1"1973source = "registry+https://github.com/rust-lang/crates.io-index"2617source = "registry+https://github.com/rust-lang/crates.io-index"1974checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"2618checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"2619dependencies = [2620 "autocfg",2621]197526221976[[package]]2623[[package]]1977name = "minimal-lexical"2624name = "minimal-lexical"199126381992[[package]]2639[[package]]1993name = "mio"2640name = "mio"1994version = "1.2.0"2641version = "1.2.1"1995source = "registry+https://github.com/rust-lang/crates.io-index"2642source = "registry+https://github.com/rust-lang/crates.io-index"1996checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"2643checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"1997dependencies = [2644dependencies = [1998 "libc",2645 "libc",1999 "wasi",2646 "wasi",2000 "windows-sys 0.61.2",2647 "windows-sys 0.61.2",2001]2648]200226492003[[package]]2650[[package]]2004name = "multimap"2651name = "ml-kem"2005version = "0.10.1"2652version = "0.3.2"2006source = "registry+https://github.com/rust-lang/crates.io-index"2653source = "registry+https://github.com/rust-lang/crates.io-index"2007checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"2654checksum = "5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66"2655dependencies = [2656 "hybrid-array",2657 "kem",2658 "module-lattice",2659 "pkcs8 0.11.0",2660 "rand_core 0.10.1",2661 "sha3",2662]26632664[[package]]2665name = "module-lattice"2666version = "0.2.3"2667source = "registry+https://github.com/rust-lang/crates.io-index"2668checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe"2669dependencies = [2670 "ctutils",2671 "hybrid-array",2672 "num-traits",2673]200826742009[[package]]2675[[package]]2010name = "nix"2676name = "nix"2011version = "0.31.2"2677version = "0.31.3"2012source = "registry+https://github.com/rust-lang/crates.io-index"2678source = "registry+https://github.com/rust-lang/crates.io-index"2013checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3"2679checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"2014dependencies = [2680dependencies = [2015 "bitflags",2681 "bitflags",2016 "cfg-if",2682 "cfg-if",2024dependencies = [2690dependencies = [2025 "anyhow",2691 "anyhow",2026 "bindgen",2692 "bindgen",2693 "camino",2027 "cxx",2694 "cxx",2028 "cxx-build",2695 "cxx-build",2696 "futures",2029 "itertools 0.14.0",2697 "itertools 0.14.0",2030 "nixlike",2698 "nixlike",2031 "pkg-config",2699 "pkg-config",2032 "serde",2700 "serde",2033 "serde_json",2701 "serde_json",2034 "test-log",2702 "test-log",2035 "thiserror 2.0.18",2036 "tokio",2703 "tokio",2037 "tracing",2704 "tracing",2038 "tracing-indicatif",2705 "tracing-indicatif",2039 "vte",2706 "vte",2040]2707]27082709[[package]]2710name = "nix-plugin-fleet"2711version = "0.1.0"2712dependencies = [2713 "fleet-base",2714]204127152042[[package]]2716[[package]]2043name = "nixlike"2717name = "nixlike"2047 "linked-hash-map",2721 "linked-hash-map",2048 "peg",2722 "peg",2049 "serde",2723 "serde",2050 "serde-transcode",2051 "serde_json",2052 "thiserror 2.0.18",2724 "thiserror 2.0.18",2053]2725]205427262080 "windows-sys 0.61.2",2752 "windows-sys 0.61.2",2081]2753]27542755[[package]]2756name = "num-bigint"2757version = "0.4.6"2758source = "registry+https://github.com/rust-lang/crates.io-index"2759checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"2760dependencies = [2761 "num-integer",2762 "num-traits",2763]208227642083[[package]]2765[[package]]2084name = "num-bigint-dig"2766name = "num-bigint-dig"209827802099[[package]]2781[[package]]2100name = "num-conv"2782name = "num-conv"2101version = "0.2.1"2783version = "0.2.2"2102source = "registry+https://github.com/rust-lang/crates.io-index"2784source = "registry+https://github.com/rust-lang/crates.io-index"2103checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"2785checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"210427862105[[package]]2787[[package]]2106name = "num-integer"2788name = "num-integer"2150source = "registry+https://github.com/rust-lang/crates.io-index"2832source = "registry+https://github.com/rust-lang/crates.io-index"2151checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"2833checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"21522153[[package]]2154name = "openssh"2155version = "0.11.6"2156source = "registry+https://github.com/rust-lang/crates.io-index"2157checksum = "d534c4bfecb0ed71dea4db444a5922a294d15cf40e700548f27295e1feb0ef18"2158dependencies = [2159 "libc",2160 "once_cell",2161 "shell-escape",2162 "tempfile",2163 "thiserror 2.0.18",2164 "tokio",2165]216628342167[[package]]2835[[package]]2168name = "openssl-probe"2836name = "openssl-probe"2229 "opentelemetry-http",2897 "opentelemetry-http",2230 "opentelemetry-proto",2898 "opentelemetry-proto",2231 "opentelemetry_sdk",2899 "opentelemetry_sdk",2232 "prost 0.14.3",2900 "prost",2233 "reqwest",2901 "reqwest",2234 "serde_json",2902 "serde_json",2235 "thiserror 2.0.18",2903 "thiserror 2.0.18",2236 "tokio",2904 "tokio",2237 "tonic 0.14.5",2905 "tonic",2238 "tracing",2906 "tracing",2239]2907]224029082248 "const-hex",2916 "const-hex",2249 "opentelemetry",2917 "opentelemetry",2250 "opentelemetry_sdk",2918 "opentelemetry_sdk",2251 "prost 0.14.3",2919 "prost",2252 "serde",2920 "serde",2253 "serde_json",2921 "serde_json",2254 "tonic 0.14.5",2922 "tonic",2255 "tonic-prost",2923 "tonic-prost",2256]2924]225729252270 "thiserror 2.0.18",2938 "thiserror 2.0.18",2271]2939]29402941[[package]]2942name = "ordered-stream"2943version = "0.2.0"2944source = "registry+https://github.com/rust-lang/crates.io-index"2945checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"2946dependencies = [2947 "futures-core",2948 "pin-project-lite",2949]29502951[[package]]2952name = "p256"2953version = "0.14.0-rc.10"2954source = "registry+https://github.com/rust-lang/crates.io-index"2955checksum = "41adc63effe99d48837a8cc0e6d7a77e32ae6a07f6000df466178dbc2193093e"2956dependencies = [2957 "ecdsa",2958 "elliptic-curve",2959 "primefield",2960 "primeorder",2961 "sha2 0.11.0",2962]29632964[[package]]2965name = "p384"2966version = "0.14.0-rc.10"2967source = "registry+https://github.com/rust-lang/crates.io-index"2968checksum = "9bd5333afa5ae0347f39e6a0f2c9c155da431583fd71fe5555bd0521b4ccaf02"2969dependencies = [2970 "ecdsa",2971 "elliptic-curve",2972 "fiat-crypto 0.3.0",2973 "primefield",2974 "primeorder",2975 "sha2 0.11.0",2976]29772978[[package]]2979name = "p521"2980version = "0.14.0-rc.10"2981source = "registry+https://github.com/rust-lang/crates.io-index"2982checksum = "a3a5297f53dc16d35909060ba3032cff7867e8809f01e273ff325579d5f0ceae"2983dependencies = [2984 "base16ct",2985 "ecdsa",2986 "elliptic-curve",2987 "primefield",2988 "primeorder",2989 "sha2 0.11.0",2990]29912992[[package]]2993name = "pageant"2994version = "0.2.1"2995source = "registry+https://github.com/rust-lang/crates.io-index"2996checksum = "4f3a5ae18f65a85c67a77d18d42d3606c07948e3c17c1e5f74852b26589e88a5"2997dependencies = [2998 "base16ct",2999 "byteorder",3000 "bytes",3001 "delegate",3002 "futures",3003 "log",3004 "rand 0.10.1",3005 "sha2 0.11.0",3006 "thiserror 2.0.18",3007 "tokio",3008 "windows",3009 "windows-strings",3010]227230112273[[package]]3012[[package]]2274name = "papergrid"3013name = "papergrid"2281 "unicode-width",3020 "unicode-width",2282]3021]30223023[[package]]3024name = "parking"3025version = "2.2.1"3026source = "registry+https://github.com/rust-lang/crates.io-index"3027checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"228330282284[[package]]3029[[package]]2285name = "parking_lot"3030name = "parking_lot"2299dependencies = [3044dependencies = [2300 "cfg-if",3045 "cfg-if",2301 "libc",3046 "libc",2302 "redox_syscall",3047 "redox_syscall 0.5.18",2303 "smallvec",3048 "smallvec",2304 "windows-link",3049 "windows-link",2305]3050]30513052[[package]]3053name = "password-hash"3054version = "0.6.1"3055source = "registry+https://github.com/rust-lang/crates.io-index"3056checksum = "aab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723b"3057dependencies = [3058 "phc",3059]30603061[[package]]3062name = "paste"3063version = "1.0.15"3064source = "registry+https://github.com/rust-lang/crates.io-index"3065checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"230630662307[[package]]3067[[package]]2308name = "pbkdf2"3068name = "pbkdf2"2309version = "0.12.2"3069version = "0.12.2"2310source = "registry+https://github.com/rust-lang/crates.io-index"3070source = "registry+https://github.com/rust-lang/crates.io-index"2311checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"3071checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"2312dependencies = [3072dependencies = [2313 "digest",3073 "digest 0.10.7",2314 "hmac",3074 "hmac 0.12.1",2315]3075]30763077[[package]]3078name = "pbkdf2"3079version = "0.13.0"3080source = "registry+https://github.com/rust-lang/crates.io-index"3081checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629"3082dependencies = [3083 "digest 0.11.3",3084 "hmac 0.13.0",3085]231630862317[[package]]3087[[package]]2318name = "peg"3088name = "peg"2319version = "0.8.5"3089version = "0.8.6"2320source = "registry+https://github.com/rust-lang/crates.io-index"3090source = "registry+https://github.com/rust-lang/crates.io-index"2321checksum = "9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477"3091checksum = "0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773"2322dependencies = [3092dependencies = [2323 "peg-macros",3093 "peg-macros",2324 "peg-runtime",3094 "peg-runtime",2325]3095]232630962327[[package]]3097[[package]]2328name = "peg-macros"3098name = "peg-macros"2329version = "0.8.5"3099version = "0.8.6"2330source = "registry+https://github.com/rust-lang/crates.io-index"3100source = "registry+https://github.com/rust-lang/crates.io-index"2331checksum = "6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71"3101checksum = "ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee"2332dependencies = [3102dependencies = [2333 "peg-runtime",3103 "peg-runtime",2334 "proc-macro2",3104 "proc-macro2",233731072338[[package]]3108[[package]]2339name = "peg-runtime"3109name = "peg-runtime"2340version = "0.8.5"3110version = "0.8.6"2341source = "registry+https://github.com/rust-lang/crates.io-index"3111source = "registry+https://github.com/rust-lang/crates.io-index"2342checksum = "132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fca"3112checksum = "7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6"234331132344[[package]]3114[[package]]2345name = "pem"3115name = "pem-rfc7468"2346version = "3.0.6"3116version = "1.0.0"2347source = "registry+https://github.com/rust-lang/crates.io-index"3117source = "registry+https://github.com/rust-lang/crates.io-index"2348checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be"3118checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9"2349dependencies = [3119dependencies = [2350 "base64 0.22.1",3120 "base64ct",2351 "serde_core",2352]3121]235331222354[[package]]3123[[package]]2358checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"3127checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"235931282360[[package]]3129[[package]]2361name = "petgraph"3130name = "phc"2362version = "0.7.1"3131version = "0.6.1"2363source = "registry+https://github.com/rust-lang/crates.io-index"3132source = "registry+https://github.com/rust-lang/crates.io-index"2364checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772"3133checksum = "44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892"2365dependencies = [3134dependencies = [2366 "fixedbitset",3135 "base64ct",2367 "indexmap 2.14.0",3136 "ctutils",2368]3137]236931382370[[package]]3139[[package]]2371name = "pin-project"3140name = "pin-project"2372version = "1.1.11"3141version = "1.1.13"2373source = "registry+https://github.com/rust-lang/crates.io-index"3142source = "registry+https://github.com/rust-lang/crates.io-index"2374checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517"3143checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924"2375dependencies = [3144dependencies = [2376 "pin-project-internal",3145 "pin-project-internal",2377]3146]237831472379[[package]]3148[[package]]2380name = "pin-project-internal"3149name = "pin-project-internal"2381version = "1.1.11"3150version = "1.1.13"2382source = "registry+https://github.com/rust-lang/crates.io-index"3151source = "registry+https://github.com/rust-lang/crates.io-index"2383checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6"3152checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b"2384dependencies = [3153dependencies = [2385 "proc-macro2",3154 "proc-macro2",2386 "quote",3155 "quote",2387 "syn",3156 "syn 2.0.117",2388]3157]238931582390[[package]]3159[[package]]2393source = "registry+https://github.com/rust-lang/crates.io-index"3162source = "registry+https://github.com/rust-lang/crates.io-index"2394checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"3163checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"31643165[[package]]3166name = "piper"3167version = "0.2.5"3168source = "registry+https://github.com/rust-lang/crates.io-index"3169checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1"3170dependencies = [3171 "atomic-waker",3172 "fastrand",3173 "futures-io",3174]239531752396[[package]]3176[[package]]2397name = "pkcs1"3177name = "pkcs1"2398version = "0.7.5"3178version = "0.7.5"2399source = "registry+https://github.com/rust-lang/crates.io-index"3179source = "registry+https://github.com/rust-lang/crates.io-index"2400checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"3180checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"2401dependencies = [3181dependencies = [2402 "der",3182 "der 0.7.10",2403 "pkcs8",3183 "pkcs8 0.10.2",2404 "spki",3184 "spki 0.7.3",2405]3185]31863187[[package]]3188name = "pkcs1"3189version = "0.8.0-rc.4"3190source = "registry+https://github.com/rust-lang/crates.io-index"3191checksum = "986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088e"3192dependencies = [3193 "der 0.8.0",3194 "spki 0.8.0",3195]31963197[[package]]3198name = "pkcs5"3199version = "0.8.0"3200source = "registry+https://github.com/rust-lang/crates.io-index"3201checksum = "279a91971a1d8eb1260a30938eae3be9cb67b472dffecb222fbbbe2fd2dc1453"3202dependencies = [3203 "aes 0.9.1",3204 "cbc 0.2.1",3205 "der 0.8.0",3206 "pbkdf2 0.13.0",3207 "rand_core 0.10.1",3208 "scrypt 0.12.0",3209 "sha2 0.11.0",3210 "spki 0.8.0",3211]240632122407[[package]]3213[[package]]2408name = "pkcs8"3214name = "pkcs8"2409version = "0.10.2"3215version = "0.10.2"2410source = "registry+https://github.com/rust-lang/crates.io-index"3216source = "registry+https://github.com/rust-lang/crates.io-index"2411checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"3217checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"2412dependencies = [3218dependencies = [2413 "der",3219 "der 0.7.10",2414 "spki",3220 "spki 0.7.3",2415]3221]32223223[[package]]3224name = "pkcs8"3225version = "0.11.0"3226source = "registry+https://github.com/rust-lang/crates.io-index"3227checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7"3228dependencies = [3229 "der 0.8.0",3230 "pkcs5",3231 "rand_core 0.10.1",3232 "spki 0.8.0",3233]241632342417[[package]]3235[[package]]2418name = "pkg-config"3236name = "pkg-config"2419version = "0.3.33"3237version = "0.3.33"2420source = "registry+https://github.com/rust-lang/crates.io-index"3238source = "registry+https://github.com/rust-lang/crates.io-index"2421checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"3239checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"32403241[[package]]3242name = "plain"3243version = "0.2.3"3244source = "registry+https://github.com/rust-lang/crates.io-index"3245checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"32463247[[package]]3248name = "polling"3249version = "3.11.0"3250source = "registry+https://github.com/rust-lang/crates.io-index"3251checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"3252dependencies = [3253 "cfg-if",3254 "concurrent-queue",3255 "hermit-abi",3256 "pin-project-lite",3257 "rustix 1.1.4",3258 "windows-sys 0.61.2",3259]242232602423[[package]]3261[[package]]2424name = "poly1305"3262name = "poly1305"2428dependencies = [3266dependencies = [2429 "cpufeatures 0.2.17",3267 "cpufeatures 0.2.17",2430 "opaque-debug",3268 "opaque-debug",2431 "universal-hash",3269 "universal-hash 0.5.1",2432]3270]32713272[[package]]3273name = "poly1305"3274version = "0.9.0"3275source = "registry+https://github.com/rust-lang/crates.io-index"3276checksum = "a00baa632505d05512f48a963e16051c54fda9a95cc9acea1a4e3c90991c4a2e"3277dependencies = [3278 "cpufeatures 0.3.0",3279 "universal-hash 0.6.1",3280 "zeroize",3281]243332822434[[package]]3283[[package]]2435name = "polyval"3284name = "polyval"2440 "cfg-if",3289 "cfg-if",2441 "cpufeatures 0.2.17",3290 "cpufeatures 0.2.17",2442 "opaque-debug",3291 "opaque-debug",2443 "universal-hash",3292 "universal-hash 0.5.1",2444]3293]32943295[[package]]3296name = "polyval"3297version = "0.7.1"3298source = "registry+https://github.com/rust-lang/crates.io-index"3299checksum = "7dfc63250416fea14f5749b90725916a6c903f599d51cb635aa7a52bfd03eede"3300dependencies = [3301 "cpubits",3302 "cpufeatures 0.3.0",3303 "universal-hash 0.6.1",3304]244533052446[[package]]3306[[package]]2447name = "portable-atomic"3307name = "portable-atomic"2480checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"3340checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"2481dependencies = [3341dependencies = [2482 "proc-macro2",3342 "proc-macro2",2483 "syn",3343 "syn 2.0.117",2484]3344]33453346[[package]]3347name = "primefield"3348version = "0.14.0-rc.11"3349source = "registry+https://github.com/rust-lang/crates.io-index"3350checksum = "b1d7e42f46a29abc16fb621a3466ee453358ebaae48a9e515f287e0af052ed8f"3351dependencies = [3352 "crypto-bigint",3353 "crypto-common 0.2.2",3354 "ff",3355 "rand_core 0.10.1",3356 "subtle",3357 "zeroize",3358]33593360[[package]]3361name = "primeorder"3362version = "0.14.0-rc.10"3363source = "registry+https://github.com/rust-lang/crates.io-index"3364checksum = "7d2793f22b9b6fd11ef3ac1d59bf003c2573593e4968702341605c2748fd90bf"3365dependencies = [3366 "elliptic-curve",3367]33683369[[package]]3370name = "proc-macro-crate"3371version = "3.5.0"3372source = "registry+https://github.com/rust-lang/crates.io-index"3373checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"3374dependencies = [3375 "toml_edit",3376]248533772486[[package]]3378[[package]]2487name = "proc-macro-error-attr2"3379name = "proc-macro-error-attr2"2502 "proc-macro-error-attr2",3394 "proc-macro-error-attr2",2503 "proc-macro2",3395 "proc-macro2",2504 "quote",3396 "quote",2505 "syn",3397 "syn 2.0.117",2506]3398]250733992508[[package]]3400[[package]]2529 "unarray",3421 "unarray",2530]3422]25312532[[package]]2533name = "prost"2534version = "0.13.5"2535source = "registry+https://github.com/rust-lang/crates.io-index"2536checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"2537dependencies = [2538 "bytes",2539 "prost-derive 0.13.5",2540]254134232542[[package]]3424[[package]]2543name = "prost"3425name = "prost"2544version = "0.14.3"3426version = "0.14.4"2545source = "registry+https://github.com/rust-lang/crates.io-index"3427source = "registry+https://github.com/rust-lang/crates.io-index"2546checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"3428checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1"2547dependencies = [3429dependencies = [2548 "bytes",3430 "bytes",2549 "prost-derive 0.14.3",3431 "prost-derive",2550]3432]25512552[[package]]2553name = "prost-build"2554version = "0.13.5"2555source = "registry+https://github.com/rust-lang/crates.io-index"2556checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf"2557dependencies = [2558 "heck",2559 "itertools 0.14.0",2560 "log",2561 "multimap",2562 "once_cell",2563 "petgraph",2564 "prettyplease",2565 "prost 0.13.5",2566 "prost-types",2567 "regex",2568 "syn",2569 "tempfile",2570]25712572[[package]]2573name = "prost-derive"2574version = "0.13.5"2575source = "registry+https://github.com/rust-lang/crates.io-index"2576checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d"2577dependencies = [2578 "anyhow",2579 "itertools 0.14.0",2580 "proc-macro2",2581 "quote",2582 "syn",2583]258434332585[[package]]3434[[package]]2586name = "prost-derive"3435name = "prost-derive"2587version = "0.14.3"3436version = "0.14.4"2588source = "registry+https://github.com/rust-lang/crates.io-index"3437source = "registry+https://github.com/rust-lang/crates.io-index"2589checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"3438checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf"2590dependencies = [3439dependencies = [2591 "anyhow",3440 "anyhow",2592 "itertools 0.14.0",3441 "itertools 0.14.0",2593 "proc-macro2",3442 "proc-macro2",2594 "quote",3443 "quote",2595 "syn",3444 "syn 2.0.117",2596]3445]25972598[[package]]2599name = "prost-types"2600version = "0.13.5"2601source = "registry+https://github.com/rust-lang/crates.io-index"2602checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16"2603dependencies = [2604 "prost 0.13.5",2605]260634462607[[package]]3447[[package]]2608name = "quinn"3448name = "quinn"2617 "quinn-udp",3457 "quinn-udp",2618 "rustc-hash 2.1.2",3458 "rustc-hash 2.1.2",2619 "rustls",3459 "rustls",2620 "socket2 0.6.3",3460 "socket2",2621 "thiserror 2.0.18",3461 "thiserror 2.0.18",2622 "tokio",3462 "tokio",2623 "tracing",3463 "tracing",2654 "cfg_aliases",3494 "cfg_aliases",2655 "libc",3495 "libc",2656 "once_cell",3496 "once_cell",2657 "socket2 0.6.3",3497 "socket2",2658 "tracing",3498 "tracing",2659 "windows-sys 0.60.2",3499 "windows-sys 0.60.2",2660]3500]2765 "rand_core 0.9.5",3605 "rand_core 0.9.5",2766]3606]27672768[[package]]2769name = "rcgen"2770version = "0.13.2"2771source = "registry+https://github.com/rust-lang/crates.io-index"2772checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2"2773dependencies = [2774 "pem",2775 "ring",2776 "rustls-pki-types",2777 "time",2778 "yasna",2779]278036072781[[package]]3608[[package]]2782name = "redox_syscall"3609name = "redox_syscall"2787 "bitflags",3614 "bitflags",2788]3615]36163617[[package]]3618name = "redox_syscall"3619version = "0.8.1"3620source = "registry+https://github.com/rust-lang/crates.io-index"3621checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7"3622dependencies = [3623 "bitflags",3624]278936252790[[package]]3626[[package]]2791name = "regex"3627name = "regex"2792version = "1.12.3"3628version = "1.12.4"2793source = "registry+https://github.com/rust-lang/crates.io-index"3629source = "registry+https://github.com/rust-lang/crates.io-index"2794checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"3630checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"2795dependencies = [3631dependencies = [2796 "aho-corasick",3632 "aho-corasick",2797 "memchr",3633 "memchr",281236482813[[package]]3649[[package]]2814name = "regex-syntax"3650name = "regex-syntax"2815version = "0.8.10"3651version = "0.8.11"2816source = "registry+https://github.com/rust-lang/crates.io-index"3652source = "registry+https://github.com/rust-lang/crates.io-index"2817checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"3653checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"36543655[[package]]3656name = "remowt-client"3657version = "0.1.7"3658source = "registry+https://github.com/rust-lang/crates.io-index"3659checksum = "34d59c0ce311b4b3c094b0b196a1004aa438b9947c3eace2ca4d2a0ac08fac59"3660dependencies = [3661 "anyhow",3662 "bifrostlink",3663 "bifrostlink-ports",3664 "bytes",3665 "camino",3666 "futures",3667 "remowt-endpoints",3668 "remowt-link-shared",3669 "russh",3670 "russh-config",3671 "serde",3672 "serde_json",3673 "tempfile",3674 "tokio",3675 "tokio-util",3676 "tracing",3677 "uuid",3678]36793680[[package]]3681name = "remowt-endpoints"3682version = "0.1.7"3683source = "registry+https://github.com/rust-lang/crates.io-index"3684checksum = "cb203856cd5cff27504bd2023c59195b1f1ce1cf5d8ea836598993894eb1b9c0"3685dependencies = [3686 "anyhow",3687 "bifrostlink",3688 "bifrostlink-macros",3689 "camino",3690 "nix",3691 "serde",3692 "tempfile",3693 "thiserror 2.0.18",3694 "tokio",3695 "tracing",3696 "uuid",3697 "zbus",3698]36993700[[package]]3701name = "remowt-fleet"3702version = "0.1.0"3703dependencies = [3704 "anyhow",3705 "bifrostlink",3706 "camino",3707 "nix-eval",3708 "remowt-client",3709 "remowt-endpoints",3710 "serde",3711 "thiserror 2.0.18",3712 "tokio",3713 "tracing",3714 "uuid",3715]37163717[[package]]3718name = "remowt-link-shared"3719version = "0.1.7"3720source = "registry+https://github.com/rust-lang/crates.io-index"3721checksum = "98ebba5be028a2dfb7f1858bb0ff74037262753eaae4dc6e5d9ae241c4567668"3722dependencies = [3723 "bifrostlink",3724 "bytes",3725 "remowt-ui-prompt",3726 "serde",3727 "serde_json",3728 "thiserror 2.0.18",3729 "tokio",3730 "tracing",3731]37323733[[package]]3734name = "remowt-plugin"3735version = "0.1.7"3736source = "registry+https://github.com/rust-lang/crates.io-index"3737checksum = "ef73ef3eea5bb6152d01019b5062e51ef258a1ac1c7a6f8cdcdf6fe1eb192cdd"3738dependencies = [3739 "anyhow",3740 "bifrostlink",3741 "bifrostlink-ports",3742 "remowt-link-shared",3743 "serde_json",3744 "tokio",3745 "tracing",3746 "tracing-subscriber",3747]281837482819[[package]]3749[[package]]2820name = "repl-plugin-unstable"3750name = "remowt-plugin-fleet"2821version = "0.1.0"3751version = "0.1.0"2822dependencies = [3752dependencies = [3753 "anyhow",2823 "fleet-base",3754 "remowt-fleet",3755 "remowt-plugin",2824]3756]37573758[[package]]3759name = "remowt-ui-prompt"3760version = "0.1.7"3761source = "registry+https://github.com/rust-lang/crates.io-index"3762checksum = "acf28ba68e6f8087657157695e9ab42b82a21130e77f6dffd27781062109325d"3763dependencies = [3764 "anyhow",3765 "bifrostlink",3766 "bifrostlink-macros",3767 "serde",3768 "serde_json",3769 "thiserror 2.0.18",3770 "tokio",3771 "tracing",3772 "zbus",3773]282537742826[[package]]3775[[package]]2827name = "reqwest"3776name = "reqwest"2854 "sync_wrapper",3803 "sync_wrapper",2855 "tokio",3804 "tokio",2856 "tokio-rustls",3805 "tokio-rustls",2857 "tower 0.5.3",3806 "tower",2858 "tower-http 0.6.8",3807 "tower-http",2859 "tower-service",3808 "tower-service",2860 "url",3809 "url",2861 "wasm-bindgen",3810 "wasm-bindgen",2862 "wasm-bindgen-futures",3811 "wasm-bindgen-futures",2863 "web-sys",3812 "web-sys",2864]3813]38143815[[package]]3816name = "rfc6979"3817version = "0.5.0"3818source = "registry+https://github.com/rust-lang/crates.io-index"3819checksum = "5236ce872cac07e0fb3969b0cbf468c7d2f37d432f1b627dcb7b8d34563fb0c3"3820dependencies = [3821 "hmac 0.13.0",3822 "subtle",3823]286538242866[[package]]3825[[package]]2867name = "ring"3826name = "ring"2878]3837]287938382880[[package]]3839[[package]]2881name = "rmp"3840name = "rsa"2882version = "0.8.15"3841version = "0.9.10"2883source = "registry+https://github.com/rust-lang/crates.io-index"3842source = "registry+https://github.com/rust-lang/crates.io-index"2884checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c"3843checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"2885dependencies = [3844dependencies = [3845 "const-oid 0.9.6",3846 "digest 0.10.7",3847 "num-bigint-dig",3848 "num-integer",2886 "num-traits",3849 "num-traits",3850 "pkcs1 0.7.5",3851 "pkcs8 0.10.2",3852 "rand_core 0.6.4",3853 "signature 2.2.0",3854 "spki 0.7.3",3855 "subtle",3856 "zeroize",2887]3857]288838582889[[package]]3859[[package]]2890name = "rmp-serde"3860name = "rsa"2891version = "1.3.1"3861version = "0.10.0-rc.18"2892source = "registry+https://github.com/rust-lang/crates.io-index"3862source = "registry+https://github.com/rust-lang/crates.io-index"2893checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155"3863checksum = "30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3caf"2894dependencies = [3864dependencies = [3865 "const-oid 0.10.2",2895 "rmp",3866 "crypto-bigint",3867 "crypto-primes",3868 "digest 0.11.3",3869 "pkcs1 0.8.0-rc.4",3870 "pkcs8 0.11.0",3871 "rand_core 0.10.1",3872 "sha2 0.11.0",3873 "signature 3.0.0",3874 "spki 0.8.0",2896 "serde",3875 "zeroize",2897]3876]289838772899[[package]]3878[[package]]2900name = "rsa"3879name = "russh"2901version = "0.9.10"3880version = "0.61.2"2902source = "registry+https://github.com/rust-lang/crates.io-index"3881source = "registry+https://github.com/rust-lang/crates.io-index"2903checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"3882checksum = "bbf893f64684e58da8a68d56a5e84d1cf0440226274c515770fe267707a7d0b0"2904dependencies = [3883dependencies = [3884 "aes 0.9.1",3885 "bitflags",3886 "block-padding 0.4.2",3887 "byteorder",3888 "bytes",3889 "cbc 0.2.1",3890 "cipher 0.5.2",2905 "const-oid",3891 "crypto-bigint",3892 "ctr 0.10.1",3893 "curve25519-dalek 5.0.0-rc.0",3894 "data-encoding",3895 "delegate",3896 "der 0.8.0",2906 "digest",3897 "digest 0.11.3",3898 "ecdsa",3899 "ed25519-dalek 3.0.0-rc.0",3900 "elliptic-curve",2907 "num-bigint-dig",3901 "enum_dispatch",3902 "flate2",2908 "num-integer",3903 "futures",3904 "generic-array 1.4.3",3905 "getrandom 0.4.2",3906 "ghash 0.6.0",3907 "hex-literal",3908 "hmac 0.13.0",3909 "inout 0.2.2",3910 "internal-russh-num-bigint",3911 "keccak",3912 "log",3913 "md5",3914 "ml-kem",3915 "module-lattice",2909 "num-traits",3916 "num-bigint",3917 "p256",3918 "p384",2910 "pkcs1",3919 "p521",3920 "pageant",3921 "pbkdf2 0.13.0",3922 "pkcs1 0.8.0-rc.4",2911 "pkcs8",3923 "pkcs5",3924 "pkcs8 0.11.0",3925 "polyval 0.7.1",3926 "rand 0.10.1",2912 "rand_core 0.6.4",3927 "rand_core 0.10.1",3928 "ring",3929 "rsa 0.10.0-rc.18",3930 "russh-cryptovec",3931 "russh-util",3932 "salsa20 0.11.0",3933 "scrypt 0.12.0",3934 "sec1",3935 "sha1",3936 "sha2 0.11.0",3937 "sha3",2913 "signature",3938 "signature 3.0.0",2914 "spki",3939 "spki 0.8.0",3940 "ssh-encoding",3941 "ssh-key",2915 "subtle",3942 "subtle",3943 "thiserror 2.0.18",3944 "tokio",3945 "typenum",3946 "universal-hash 0.6.1",2916 "zeroize",3947 "zeroize",2917]3948]39493950[[package]]3951name = "russh-config"3952version = "0.58.0"3953source = "registry+https://github.com/rust-lang/crates.io-index"3954checksum = "993346101d4741a59c82bafc6b645c52ce3e7b0820f13e4b5d48cdb591e3d955"3955dependencies = [3956 "futures",3957 "globset",3958 "log",3959 "thiserror 2.0.18",3960 "tokio",3961 "whoami",3962]39633964[[package]]3965name = "russh-cryptovec"3966version = "0.61.0"3967source = "registry+https://github.com/rust-lang/crates.io-index"3968checksum = "443f6bbcfacb34a1aab2b12b99bf08e0c63abdc5a0db261901365df9d57fff51"3969dependencies = [3970 "log",3971 "nix",3972 "ssh-encoding",3973 "windows-sys 0.61.2",3974]39753976[[package]]3977name = "russh-util"3978version = "0.52.0"3979source = "registry+https://github.com/rust-lang/crates.io-index"3980checksum = "668424a5dde0bcb45b55ba7de8476b93831b4aa2fa6947e145f3b053e22c60b6"3981dependencies = [3982 "chrono",3983 "tokio",3984 "wasm-bindgen",3985 "wasm-bindgen-futures",3986]291839872919[[package]]3988[[package]]2920name = "rust-embed"3989name = "rust-embed"2936 "proc-macro2",4005 "proc-macro2",2937 "quote",4006 "quote",2938 "rust-embed-utils",4007 "rust-embed-utils",2939 "syn",4008 "syn 2.0.117",2940 "walkdir",4009 "walkdir",2941]4010]294240112946source = "registry+https://github.com/rust-lang/crates.io-index"4015source = "registry+https://github.com/rust-lang/crates.io-index"2947checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1"4016checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1"2948dependencies = [4017dependencies = [2949 "sha2",4018 "sha2 0.10.9",2950 "walkdir",4019 "walkdir",2951]4020]29524021299940683000[[package]]4069[[package]]3001name = "rustls"4070name = "rustls"3002version = "0.23.38"4071version = "0.23.40"3003source = "registry+https://github.com/rust-lang/crates.io-index"4072source = "registry+https://github.com/rust-lang/crates.io-index"3004checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21"4073checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"3005dependencies = [4074dependencies = [3006 "log",3007 "once_cell",4075 "once_cell",3008 "ring",4076 "ring",3009 "rustls-pki-types",4077 "rustls-pki-types",301440823015[[package]]4083[[package]]3016name = "rustls-native-certs"4084name = "rustls-native-certs"3017version = "0.8.3"4085version = "0.8.4"3018source = "registry+https://github.com/rust-lang/crates.io-index"4086source = "registry+https://github.com/rust-lang/crates.io-index"3019checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"4087checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"3020dependencies = [4088dependencies = [3021 "openssl-probe",4089 "openssl-probe",3022 "rustls-pki-types",4090 "rustls-pki-types",3023 "schannel",4091 "schannel",3024 "security-framework",4092 "security-framework",3025]4093]30263027[[package]]3028name = "rustls-pemfile"3029version = "2.2.0"3030source = "registry+https://github.com/rust-lang/crates.io-index"3031checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"3032dependencies = [3033 "rustls-pki-types",3034]303540943036[[package]]4095[[package]]3037name = "rustls-pki-types"4096name = "rustls-pki-types"3038version = "1.14.0"4097version = "1.14.1"3039source = "registry+https://github.com/rust-lang/crates.io-index"4098source = "registry+https://github.com/rust-lang/crates.io-index"3040checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"4099checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"3041dependencies = [4100dependencies = [3042 "web-time",4101 "web-time",3043 "zeroize",4102 "zeroize",3072source = "registry+https://github.com/rust-lang/crates.io-index"4131source = "registry+https://github.com/rust-lang/crates.io-index"3073checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"4132checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"3074dependencies = [4133dependencies = [3075 "cipher",4134 "cipher 0.4.4",3076]4135]41364137[[package]]4138name = "salsa20"4139version = "0.11.0"4140source = "registry+https://github.com/rust-lang/crates.io-index"4141checksum = "2f874456e72520ff1375a06c588eaf074b0f01f9e9e1aada45bd9b7954a6e42c"4142dependencies = [4143 "cfg-if",4144 "cipher 0.5.2",4145]307741463078[[package]]4147[[package]]3079name = "same-file"4148name = "same-file"3111source = "registry+https://github.com/rust-lang/crates.io-index"4180source = "registry+https://github.com/rust-lang/crates.io-index"3112checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"4181checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"3113dependencies = [4182dependencies = [3114 "pbkdf2",4183 "pbkdf2 0.12.2",3115 "salsa20",4184 "salsa20 0.10.2",3116 "sha2",4185 "sha2 0.10.9",3117]4186]41874188[[package]]4189name = "scrypt"4190version = "0.12.0"4191source = "registry+https://github.com/rust-lang/crates.io-index"4192checksum = "d87af57419b594aa23fa95f09f0e06d80d84ba01c26148c43844cad6ff4485f0"4193dependencies = [4194 "cfg-if",4195 "pbkdf2 0.13.0",4196 "salsa20 0.11.0",4197 "sha2 0.11.0",4198]41994200[[package]]4201name = "sec1"4202version = "0.8.1"4203source = "registry+https://github.com/rust-lang/crates.io-index"4204checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d"4205dependencies = [4206 "base16ct",4207 "ctutils",4208 "der 0.8.0",4209 "hybrid-array",4210 "subtle",4211 "zeroize",4212]311842133119[[package]]4214[[package]]3120name = "secrecy"4215name = "secrecy"3179 "serde_derive",4274 "serde_derive",3180]4275]31813182[[package]]3183name = "serde-transcode"3184version = "1.1.1"3185source = "registry+https://github.com/rust-lang/crates.io-index"3186checksum = "590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2"3187dependencies = [3188 "serde",3189]31903191[[package]]3192name = "serde_bytes"3193version = "0.11.19"3194source = "registry+https://github.com/rust-lang/crates.io-index"3195checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8"3196dependencies = [3197 "serde",3198 "serde_core",3199]320042763201[[package]]4277[[package]]3202name = "serde_core"4278name = "serde_core"3215dependencies = [4291dependencies = [3216 "proc-macro2",4292 "proc-macro2",3217 "quote",4293 "quote",3218 "syn",4294 "syn 2.0.117",3219]4295]322042963221[[package]]4297[[package]]3222name = "serde_json"4298name = "serde_json"3223version = "1.0.149"4299version = "1.0.150"3224source = "registry+https://github.com/rust-lang/crates.io-index"4300source = "registry+https://github.com/rust-lang/crates.io-index"3225checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"4301checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"3226dependencies = [4302dependencies = [3227 "itoa",4303 "itoa",3228 "memchr",4304 "memchr",3231 "zmij",4307 "zmij",3232]4308]43094310[[package]]4311name = "serde_repr"4312version = "0.1.20"4313source = "registry+https://github.com/rust-lang/crates.io-index"4314checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"4315dependencies = [4316 "proc-macro2",4317 "quote",4318 "syn 2.0.117",4319]323343203234[[package]]4321[[package]]3235name = "serde_urlencoded"4322name = "serde_urlencoded"3243 "serde",4330 "serde",3244]4331]43324333[[package]]4334name = "serdect"4335version = "0.4.3"4336source = "registry+https://github.com/rust-lang/crates.io-index"4337checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e"4338dependencies = [4339 "base16ct",4340 "serde",4341]43424343[[package]]4344name = "sha1"4345version = "0.11.0"4346source = "registry+https://github.com/rust-lang/crates.io-index"4347checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214"4348dependencies = [4349 "cfg-if",4350 "cpufeatures 0.3.0",4351 "digest 0.11.3",4352]324543533246[[package]]4354[[package]]3247name = "sha2"4355name = "sha2"3251dependencies = [4359dependencies = [3252 "cfg-if",4360 "cfg-if",3253 "cpufeatures 0.2.17",4361 "cpufeatures 0.2.17",3254 "digest",4362 "digest 0.10.7",3255]4363]43644365[[package]]4366name = "sha2"4367version = "0.11.0"4368source = "registry+https://github.com/rust-lang/crates.io-index"4369checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4"4370dependencies = [4371 "cfg-if",4372 "cpufeatures 0.3.0",4373 "digest 0.11.3",4374]43754376[[package]]4377name = "sha3"4378version = "0.11.0"4379source = "registry+https://github.com/rust-lang/crates.io-index"4380checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1"4381dependencies = [4382 "digest 0.11.3",4383 "keccak",4384]325643853257[[package]]4386[[package]]3258name = "sharded-slab"4387name = "sharded-slab"3263 "lazy_static",4392 "lazy_static",3264]4393]32653266[[package]]3267name = "shell-escape"3268version = "0.1.5"3269source = "registry+https://github.com/rust-lang/crates.io-index"3270checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"327143943272[[package]]4395[[package]]3273name = "shlex"4396name = "shlex"3274version = "1.3.0"4397version = "1.3.0"3275source = "registry+https://github.com/rust-lang/crates.io-index"4398source = "registry+https://github.com/rust-lang/crates.io-index"3276checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"4399checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"44004401[[package]]4402name = "shlex"4403version = "2.0.1"4404source = "registry+https://github.com/rust-lang/crates.io-index"4405checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"327744063278[[package]]4407[[package]]3279name = "signal-hook-registry"4408name = "signal-hook-registry"3291source = "registry+https://github.com/rust-lang/crates.io-index"4420source = "registry+https://github.com/rust-lang/crates.io-index"3292checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"4421checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"3293dependencies = [4422dependencies = [3294 "digest",4423 "digest 0.10.7",3295 "rand_core 0.6.4",4424 "rand_core 0.6.4",3296]4425]44264427[[package]]4428name = "signature"4429version = "3.0.0"4430source = "registry+https://github.com/rust-lang/crates.io-index"4431checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5"4432dependencies = [4433 "digest 0.11.3",4434 "rand_core 0.10.1",4435]329744363298[[package]]4437[[package]]3299name = "simd-adler32"4438name = "simd-adler32"330944483310[[package]]4449[[package]]3311name = "smallvec"4450name = "smallvec"3312version = "1.15.1"4451version = "1.15.2"3313source = "registry+https://github.com/rust-lang/crates.io-index"4452source = "registry+https://github.com/rust-lang/crates.io-index"3314checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"4453checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"33153316[[package]]3317name = "socket2"3318version = "0.5.10"3319source = "registry+https://github.com/rust-lang/crates.io-index"3320checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"3321dependencies = [3322 "libc",3323 "windows-sys 0.52.0",3324]332544543326[[package]]4455[[package]]3327name = "socket2"4456name = "socket2"3328version = "0.6.3"4457version = "0.6.4"3329source = "registry+https://github.com/rust-lang/crates.io-index"4458source = "registry+https://github.com/rust-lang/crates.io-index"3330checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"4459checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"3331dependencies = [4460dependencies = [3332 "libc",4461 "libc",3333 "windows-sys 0.61.2",4462 "windows-sys 0.61.2",3346checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"4475checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"3347dependencies = [4476dependencies = [3348 "base64ct",4477 "base64ct",3349 "der",4478 "der 0.7.10",3350]4479]44804481[[package]]4482name = "spki"4483version = "0.8.0"4484source = "registry+https://github.com/rust-lang/crates.io-index"4485checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f"4486dependencies = [4487 "base64ct",4488 "der 0.8.0",4489]44904491[[package]]4492name = "ssh-cipher"4493version = "0.3.0-rc.9"4494source = "registry+https://github.com/rust-lang/crates.io-index"4495checksum = "10db6f219196a8528f9ec904d9d45cdad692d65b0e57e72be4dedd1c5fddce36"4496dependencies = [4497 "aead 0.6.0",4498 "aes 0.9.1",4499 "aes-gcm 0.11.0-rc.4",4500 "cbc 0.2.1",4501 "chacha20 0.10.0",4502 "cipher 0.5.2",4503 "ctr 0.10.1",4504 "ctutils",4505 "des",4506 "poly1305 0.9.0",4507 "ssh-encoding",4508 "zeroize",4509]45104511[[package]]4512name = "ssh-encoding"4513version = "0.3.0-rc.9"4514source = "registry+https://github.com/rust-lang/crates.io-index"4515checksum = "7abf34aa716da5d5b4c496936d042ea282ab392092cd68a72ef6a8863ff8c96a"4516dependencies = [4517 "base64ct",4518 "bytes",4519 "crypto-bigint",4520 "ctutils",4521 "digest 0.11.3",4522 "pem-rfc7468",4523 "zeroize",4524]45254526[[package]]4527name = "ssh-key"4528version = "0.7.0-rc.10"4529source = "registry+https://github.com/rust-lang/crates.io-index"4530checksum = "45735ce3dea95690e4a9e414c4cfde7f79835063c3dcd35881df85a84118e74b"4531dependencies = [4532 "argon2",4533 "bcrypt-pbkdf 0.11.0",4534 "ctutils",4535 "ed25519-dalek 3.0.0-rc.0",4536 "hex",4537 "hmac 0.13.0",4538 "p256",4539 "p384",4540 "p521",4541 "rand_core 0.10.1",4542 "rsa 0.10.0-rc.18",4543 "sec1",4544 "sha1",4545 "sha2 0.11.0",4546 "signature 3.0.0",4547 "ssh-cipher",4548 "ssh-encoding",4549 "zeroize",4550]335145513352[[package]]4552[[package]]3353name = "stable_deref_trait"4553name = "stable_deref_trait"3367source = "registry+https://github.com/rust-lang/crates.io-index"4567source = "registry+https://github.com/rust-lang/crates.io-index"3368checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"4568checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"45694570[[package]]4571name = "syn"4572version = "1.0.109"4573source = "registry+https://github.com/rust-lang/crates.io-index"4574checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"4575dependencies = [4576 "proc-macro2",4577 "quote",4578 "unicode-ident",4579]336945803370[[package]]4581[[package]]3371name = "syn"4582name = "syn"3395dependencies = [4606dependencies = [3396 "proc-macro2",4607 "proc-macro2",3397 "quote",4608 "quote",3398 "syn",4609 "syn 2.0.117",3399]4610]340046113401[[package]]4612[[package]]3419 "proc-macro-error2",4630 "proc-macro-error2",3420 "proc-macro2",4631 "proc-macro2",3421 "quote",4632 "quote",3422 "syn",4633 "syn 2.0.117",3423]4634]342446353425[[package]]4636[[package]]3454 "windows-sys 0.61.2",4665 "windows-sys 0.61.2",3455]4666]34563457[[package]]3458name = "terraform-provider-fleet"3459version = "0.1.0"3460dependencies = [3461 "anyhow",3462 "async-trait",3463 "serde",3464 "tf-provider",3465 "tokio",3466]346746673468[[package]]4668[[package]]3469name = "test-log"4669name = "test-log"3470version = "0.2.20"4670version = "0.2.21"3471source = "registry+https://github.com/rust-lang/crates.io-index"4671source = "registry+https://github.com/rust-lang/crates.io-index"3472checksum = "2f46bf474f0a4afebf92f076d54fd5e63423d9438b8c278a3d2ccb0f47f7cdb3"4672checksum = "9b9c218384242b5c89b68303ab6f6fc53a312d923f0c14dc6bb860c6aeee40f1"3473dependencies = [4673dependencies = [3474 "env_logger",4674 "env_logger",3475 "test-log-macros",4675 "test-log-macros",347846783479[[package]]4679[[package]]3480name = "test-log-core"4680name = "test-log-core"3481version = "0.2.20"4681version = "0.2.21"3482source = "registry+https://github.com/rust-lang/crates.io-index"4682source = "registry+https://github.com/rust-lang/crates.io-index"3483checksum = "37d4d41320b48bc4a211a9021678fcc0c99569b594ea31c93735b8e517102b4c"4683checksum = "c26ef8b00e4d382e59f6a8ddb3cd790b3a5bb29f21a358a9a69ea2f29f13f27b"3484dependencies = [4684dependencies = [3485 "proc-macro2",4685 "proc-macro2",3486 "quote",4686 "quote",3487 "syn",4687 "syn 2.0.117",3488]4688]348946893490[[package]]4690[[package]]3491name = "test-log-macros"4691name = "test-log-macros"3492version = "0.2.20"4692version = "0.2.21"3493source = "registry+https://github.com/rust-lang/crates.io-index"4693source = "registry+https://github.com/rust-lang/crates.io-index"3494checksum = "9beb9249a81e430dffd42400a49019bcf548444f1968ff23080a625de0d4d320"4694checksum = "944ad38adcbb71eaa682c56bceeb079e4ca82b4b3edc2a0fde5cb297b77dac8d"3495dependencies = [4695dependencies = [3496 "syn",4696 "syn 2.0.117",3497 "test-log-core",4697 "test-log-core",3498]4698]349946993506 "unicode-width",4706 "unicode-width",3507]4707]35083509[[package]]3510name = "tf-provider"3511version = "0.2.2"3512source = "registry+https://github.com/rust-lang/crates.io-index"3513checksum = "d80ea2e5f9f54717952d199888aab7e607dc99275ec5221f1259ce7a5f55f5a6"3514dependencies = [3515 "anyhow",3516 "async-stream",3517 "async-trait",3518 "base64 0.22.1",3519 "futures",3520 "prost 0.13.5",3521 "rcgen",3522 "rmp-serde",3523 "serde",3524 "serde_bytes",3525 "serde_json",3526 "time",3527 "tokio",3528 "tokio-stream",3529 "tokio-util",3530 "tonic 0.12.3",3531 "tonic-build",3532 "tower-http 0.5.2",3533 "tracing",3534 "tracing-subscriber",3535]353647083537[[package]]4709[[package]]3538name = "thiserror"4710name = "thiserror"3560dependencies = [4732dependencies = [3561 "proc-macro2",4733 "proc-macro2",3562 "quote",4734 "quote",3563 "syn",4735 "syn 2.0.117",3564]4736]356547373566[[package]]4738[[package]]3571dependencies = [4743dependencies = [3572 "proc-macro2",4744 "proc-macro2",3573 "quote",4745 "quote",3574 "syn",4746 "syn 2.0.117",3575]4747]357647483577[[package]]4749[[package]]358547573586[[package]]4758[[package]]3587name = "time"4759name = "time"3588version = "0.3.47"4760version = "0.3.49"3589source = "registry+https://github.com/rust-lang/crates.io-index"4761source = "registry+https://github.com/rust-lang/crates.io-index"3590checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"4762checksum = "711a53c2d47bbd818258c498c8dbfe186a2526c631495cfe7e078567f86b8469"3591dependencies = [4763dependencies = [3592 "deranged",4764 "deranged",3593 "num-conv",4765 "num-conv",359947713600[[package]]4772[[package]]3601name = "time-core"4773name = "time-core"3602version = "0.1.8"4774version = "0.1.9"3603source = "registry+https://github.com/rust-lang/crates.io-index"4775source = "registry+https://github.com/rust-lang/crates.io-index"3604checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"4776checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"360547773606[[package]]4778[[package]]3607name = "time-macros"4779name = "time-macros"3608version = "0.2.27"4780version = "0.2.29"3609source = "registry+https://github.com/rust-lang/crates.io-index"4781source = "registry+https://github.com/rust-lang/crates.io-index"3610checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"4782checksum = "71c652a3727a9cbb9a02f707f530b618ce00d0ccd762009c8c23bd191df3c17d"3611dependencies = [4783dependencies = [3612 "num-conv",4784 "num-conv",3613 "time-core",4785 "time-core",364148133642[[package]]4814[[package]]3643name = "tokio"4815name = "tokio"3644version = "1.52.1"4816version = "1.52.3"3645source = "registry+https://github.com/rust-lang/crates.io-index"4817source = "registry+https://github.com/rust-lang/crates.io-index"3646checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"4818checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"3647dependencies = [4819dependencies = [3648 "bytes",4820 "bytes",3649 "libc",4821 "libc",3650 "mio",4822 "mio",3651 "pin-project-lite",4823 "pin-project-lite",3652 "signal-hook-registry",4824 "signal-hook-registry",3653 "socket2 0.6.3",4825 "socket2",3654 "tokio-macros",4826 "tokio-macros",3655 "windows-sys 0.61.2",4827 "windows-sys 0.61.2",3656]4828]3663dependencies = [4835dependencies = [3664 "proc-macro2",4836 "proc-macro2",3665 "quote",4837 "quote",3666 "syn",4838 "syn 2.0.117",3667]4839]366848403669[[package]]4841[[package]]3685 "futures-core",4857 "futures-core",3686 "pin-project-lite",4858 "pin-project-lite",3687 "tokio",4859 "tokio",3688 "tokio-util",3689]4860]369048613691[[package]]4862[[package]]371248833713[[package]]4884[[package]]3714name = "toml_datetime"4885name = "toml_datetime"3715version = "0.7.5+spec-1.1.0"4886version = "1.1.1+spec-1.1.0"3716source = "registry+https://github.com/rust-lang/crates.io-index"4887source = "registry+https://github.com/rust-lang/crates.io-index"3717checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"4888checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"3718dependencies = [4889dependencies = [3719 "serde_core",4890 "serde_core",3720]4891]372148923722[[package]]4893[[package]]3723name = "toml_edit"4894name = "toml_edit"3724version = "0.23.10+spec-1.0.0"4895version = "0.25.12+spec-1.1.0"3725source = "registry+https://github.com/rust-lang/crates.io-index"4896source = "registry+https://github.com/rust-lang/crates.io-index"3726checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"4897checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"3727dependencies = [4898dependencies = [3728 "indexmap 2.14.0",4899 "indexmap",3729 "toml_datetime",4900 "toml_datetime",3730 "toml_parser",4901 "toml_parser",3731 "toml_writer",3732 "winnow 0.7.15",4902 "winnow",3733]4903]373449043735[[package]]4905[[package]]3738source = "registry+https://github.com/rust-lang/crates.io-index"4908source = "registry+https://github.com/rust-lang/crates.io-index"3739checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"4909checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"3740dependencies = [4910dependencies = [3741 "winnow 1.0.2",4911 "winnow",3742]4912]37433744[[package]]3745name = "toml_writer"3746version = "1.1.1+spec-1.1.0"3747source = "registry+https://github.com/rust-lang/crates.io-index"3748checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"37493750[[package]]3751name = "tonic"3752version = "0.12.3"3753source = "registry+https://github.com/rust-lang/crates.io-index"3754checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52"3755dependencies = [3756 "async-stream",3757 "async-trait",3758 "axum",3759 "base64 0.22.1",3760 "bytes",3761 "h2",3762 "http",3763 "http-body",3764 "http-body-util",3765 "hyper",3766 "hyper-timeout",3767 "hyper-util",3768 "percent-encoding",3769 "pin-project",3770 "prost 0.13.5",3771 "rustls-pemfile",3772 "socket2 0.5.10",3773 "tokio",3774 "tokio-rustls",3775 "tokio-stream",3776 "tower 0.4.13",3777 "tower-layer",3778 "tower-service",3779 "tracing",3780]378149133782[[package]]4914[[package]]3783name = "tonic"4915name = "tonic"3784version = "0.14.5"4916version = "0.14.6"3785source = "registry+https://github.com/rust-lang/crates.io-index"4917source = "registry+https://github.com/rust-lang/crates.io-index"3786checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"4918checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef"3787dependencies = [4919dependencies = [3788 "async-trait",4920 "async-trait",3789 "base64 0.22.1",4921 "base64 0.22.1",3800 "sync_wrapper",4932 "sync_wrapper",3801 "tokio",4933 "tokio",3802 "tokio-stream",4934 "tokio-stream",3803 "tower 0.5.3",4935 "tower",3804 "tower-layer",4936 "tower-layer",3805 "tower-service",4937 "tower-service",3806 "tracing",4938 "tracing",3807]4939]38083809[[package]]3810name = "tonic-build"3811version = "0.12.3"3812source = "registry+https://github.com/rust-lang/crates.io-index"3813checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11"3814dependencies = [3815 "prettyplease",3816 "proc-macro2",3817 "prost-build",3818 "prost-types",3819 "quote",3820 "syn",3821]382249403823[[package]]4941[[package]]3824name = "tonic-prost"4942name = "tonic-prost"3825version = "0.14.5"4943version = "0.14.6"3826source = "registry+https://github.com/rust-lang/crates.io-index"4944source = "registry+https://github.com/rust-lang/crates.io-index"3827checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309"4945checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0"3828dependencies = [4946dependencies = [3829 "bytes",4947 "bytes",3830 "prost 0.14.3",4948 "prost",3831 "tonic 0.14.5",4949 "tonic",3832]4950]38333834[[package]]3835name = "tower"3836version = "0.4.13"3837source = "registry+https://github.com/rust-lang/crates.io-index"3838checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"3839dependencies = [3840 "futures-core",3841 "futures-util",3842 "indexmap 1.9.3",3843 "pin-project",3844 "pin-project-lite",3845 "rand 0.8.6",3846 "slab",3847 "tokio",3848 "tokio-util",3849 "tower-layer",3850 "tower-service",3851 "tracing",3852]385349513854[[package]]4952[[package]]3855name = "tower"4953name = "tower"3859dependencies = [4957dependencies = [3860 "futures-core",4958 "futures-core",3861 "futures-util",4959 "futures-util",3862 "indexmap 2.14.0",4960 "indexmap",3863 "pin-project-lite",4961 "pin-project-lite",3864 "slab",4962 "slab",3865 "sync_wrapper",4963 "sync_wrapper",3870 "tracing",4968 "tracing",3871]4969]38723873[[package]]3874name = "tower-http"3875version = "0.5.2"3876source = "registry+https://github.com/rust-lang/crates.io-index"3877checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"3878dependencies = [3879 "bitflags",3880 "bytes",3881 "http",3882 "http-body",3883 "http-body-util",3884 "pin-project-lite",3885 "tower-layer",3886 "tower-service",3887 "tracing",3888]388949703890[[package]]4971[[package]]3891name = "tower-http"4972name = "tower-http"3892version = "0.6.8"4973version = "0.6.11"3893source = "registry+https://github.com/rust-lang/crates.io-index"4974source = "registry+https://github.com/rust-lang/crates.io-index"3894checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"4975checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"3895dependencies = [4976dependencies = [3896 "bitflags",4977 "bitflags",3897 "bytes",4978 "bytes",3898 "futures-util",4979 "futures-util",3899 "http",4980 "http",3900 "http-body",4981 "http-body",3901 "iri-string",3902 "pin-project-lite",4982 "pin-project-lite",3903 "tower 0.5.3",4983 "tower",3904 "tower-layer",4984 "tower-layer",3905 "tower-service",4985 "tower-service",4986 "url",3906]4987]390749883908[[package]]4989[[package]]3936dependencies = [5017dependencies = [3937 "proc-macro2",5018 "proc-macro2",3938 "quote",5019 "quote",3939 "syn",5020 "syn 2.0.117",3940]5021]394150223942[[package]]5023[[package]]3988 "web-time",5069 "web-time",3989]5070]39903991[[package]]3992name = "tracing-serde"3993version = "0.2.0"3994source = "registry+https://github.com/rust-lang/crates.io-index"3995checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1"3996dependencies = [3997 "serde",3998 "tracing-core",3999]400050714001[[package]]5072[[package]]4002name = "tracing-subscriber"5073name = "tracing-subscriber"4008 "nu-ansi-term",5079 "nu-ansi-term",4009 "once_cell",5080 "once_cell",4010 "regex-automata",5081 "regex-automata",4011 "serde",4012 "serde_json",4013 "sharded-slab",5082 "sharded-slab",4014 "smallvec",5083 "smallvec",4015 "thread_local",5084 "thread_local",4016 "tracing",5085 "tracing",4017 "tracing-core",5086 "tracing-core",4018 "tracing-log",5087 "tracing-log",4019 "tracing-serde",4020]5088]402150894022[[package]]5090[[package]]403651044037[[package]]5105[[package]]4038name = "typenum"5106name = "typenum"4039version = "1.20.0"5107version = "1.20.1"4040source = "registry+https://github.com/rust-lang/crates.io-index"5108source = "registry+https://github.com/rust-lang/crates.io-index"4041checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"5109checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"51105111[[package]]5112name = "uds_windows"5113version = "1.2.1"5114source = "registry+https://github.com/rust-lang/crates.io-index"5115checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"5116dependencies = [5117 "memoffset",5118 "tempfile",5119 "windows-sys 0.61.2",5120]404251214043[[package]]5122[[package]]4044name = "unarray"5123name = "unarray"4107source = "registry+https://github.com/rust-lang/crates.io-index"5186source = "registry+https://github.com/rust-lang/crates.io-index"4108checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"5187checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"4109dependencies = [5188dependencies = [4110 "crypto-common",5189 "crypto-common 0.1.7",4111 "subtle",5190 "subtle",4112]5191]51925193[[package]]5194name = "universal-hash"5195version = "0.6.1"5196source = "registry+https://github.com/rust-lang/crates.io-index"5197checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96"5198dependencies = [5199 "crypto-common 0.2.2",5200 "ctutils",5201]411352024114[[package]]5203[[package]]4115name = "untrusted"5204name = "untrusted"4141source = "registry+https://github.com/rust-lang/crates.io-index"5230source = "registry+https://github.com/rust-lang/crates.io-index"4142checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"5231checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"52325233[[package]]5234name = "uuid"5235version = "1.23.3"5236source = "registry+https://github.com/rust-lang/crates.io-index"5237checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"5238dependencies = [5239 "getrandom 0.4.2",5240 "js-sys",5241 "serde_core",5242 "wasm-bindgen",5243]414352444144[[package]]5245[[package]]4145name = "valuable"5246name = "valuable"420453054205[[package]]5306[[package]]4206name = "wasip2"5307name = "wasip2"4207version = "1.0.3+wasi-0.2.9"5308version = "1.0.4+wasi-0.2.12"4208source = "registry+https://github.com/rust-lang/crates.io-index"5309source = "registry+https://github.com/rust-lang/crates.io-index"4209checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"5310checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"4210dependencies = [5311dependencies = [4211 "wit-bindgen 0.57.1",5312 "wit-bindgen 0.57.1",4212]5313]4220 "wit-bindgen 0.51.0",5321 "wit-bindgen 0.51.0",4221]5322]53235324[[package]]5325name = "wasite"5326version = "0.1.0"5327source = "registry+https://github.com/rust-lang/crates.io-index"5328checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"422253294223[[package]]5330[[package]]4224name = "wasm-bindgen"5331name = "wasm-bindgen"4225version = "0.2.118"5332version = "0.2.125"4226source = "registry+https://github.com/rust-lang/crates.io-index"5333source = "registry+https://github.com/rust-lang/crates.io-index"4227checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"5334checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"4228dependencies = [5335dependencies = [4229 "cfg-if",5336 "cfg-if",4230 "once_cell",5337 "once_cell",423553424236[[package]]5343[[package]]4237name = "wasm-bindgen-futures"5344name = "wasm-bindgen-futures"4238version = "0.4.68"5345version = "0.4.75"4239source = "registry+https://github.com/rust-lang/crates.io-index"5346source = "registry+https://github.com/rust-lang/crates.io-index"4240checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8"5347checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"4241dependencies = [5348dependencies = [4242 "js-sys",5349 "js-sys",4243 "wasm-bindgen",5350 "wasm-bindgen",4244]5351]424553524246[[package]]5353[[package]]4247name = "wasm-bindgen-macro"5354name = "wasm-bindgen-macro"4248version = "0.2.118"5355version = "0.2.125"4249source = "registry+https://github.com/rust-lang/crates.io-index"5356source = "registry+https://github.com/rust-lang/crates.io-index"4250checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"5357checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"4251dependencies = [5358dependencies = [4252 "quote",5359 "quote",4253 "wasm-bindgen-macro-support",5360 "wasm-bindgen-macro-support",4254]5361]425553624256[[package]]5363[[package]]4257name = "wasm-bindgen-macro-support"5364name = "wasm-bindgen-macro-support"4258version = "0.2.118"5365version = "0.2.125"4259source = "registry+https://github.com/rust-lang/crates.io-index"5366source = "registry+https://github.com/rust-lang/crates.io-index"4260checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"5367checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"4261dependencies = [5368dependencies = [4262 "bumpalo",5369 "bumpalo",4263 "proc-macro2",5370 "proc-macro2",4264 "quote",5371 "quote",4265 "syn",5372 "syn 2.0.117",4266 "wasm-bindgen-shared",5373 "wasm-bindgen-shared",4267]5374]426853754269[[package]]5376[[package]]4270name = "wasm-bindgen-shared"5377name = "wasm-bindgen-shared"4271version = "0.2.118"5378version = "0.2.125"4272source = "registry+https://github.com/rust-lang/crates.io-index"5379source = "registry+https://github.com/rust-lang/crates.io-index"4273checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"5380checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"4274dependencies = [5381dependencies = [4275 "unicode-ident",5382 "unicode-ident",4276]5383]4292checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"5399checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"4293dependencies = [5400dependencies = [4294 "anyhow",5401 "anyhow",4295 "indexmap 2.14.0",5402 "indexmap",4296 "wasm-encoder",5403 "wasm-encoder",4297 "wasmparser",5404 "wasmparser",4298]5405]4305dependencies = [5412dependencies = [4306 "bitflags",5413 "bitflags",4307 "hashbrown 0.15.5",5414 "hashbrown 0.15.5",4308 "indexmap 2.14.0",5415 "indexmap",4309 "semver",5416 "semver",4310]5417]431154184312[[package]]5419[[package]]4313name = "web-sys"5420name = "web-sys"4314version = "0.3.95"5421version = "0.3.102"4315source = "registry+https://github.com/rust-lang/crates.io-index"5422source = "registry+https://github.com/rust-lang/crates.io-index"4316checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d"5423checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"4317dependencies = [5424dependencies = [4318 "js-sys",5425 "js-sys",4319 "wasm-bindgen",5426 "wasm-bindgen",4341 "rustix 0.38.44",5448 "rustix 0.38.44",4342]5449]54505451[[package]]5452name = "whoami"5453version = "1.6.1"5454source = "registry+https://github.com/rust-lang/crates.io-index"5455checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d"5456dependencies = [5457 "libredox",5458 "wasite",5459 "web-sys",5460]434354614344[[package]]5462[[package]]4345name = "winapi-util"5463name = "winapi-util"4350 "windows-sys 0.61.2",5468 "windows-sys 0.61.2",4351]5469]54705471[[package]]5472name = "windows"5473version = "0.62.2"5474source = "registry+https://github.com/rust-lang/crates.io-index"5475checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"5476dependencies = [5477 "windows-collections",5478 "windows-core",5479 "windows-future",5480 "windows-numerics",5481]54825483[[package]]5484name = "windows-collections"5485version = "0.3.2"5486source = "registry+https://github.com/rust-lang/crates.io-index"5487checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"5488dependencies = [5489 "windows-core",5490]435254914353[[package]]5492[[package]]4354name = "windows-core"5493name = "windows-core"4363 "windows-strings",5502 "windows-strings",4364]5503]55045505[[package]]5506name = "windows-future"5507version = "0.3.2"5508source = "registry+https://github.com/rust-lang/crates.io-index"5509checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"5510dependencies = [5511 "windows-core",5512 "windows-link",5513 "windows-threading",5514]436555154366[[package]]5516[[package]]4367name = "windows-implement"5517name = "windows-implement"4371dependencies = [5521dependencies = [4372 "proc-macro2",5522 "proc-macro2",4373 "quote",5523 "quote",4374 "syn",5524 "syn 2.0.117",4375]5525]437655264377[[package]]5527[[package]]4382dependencies = [5532dependencies = [4383 "proc-macro2",5533 "proc-macro2",4384 "quote",5534 "quote",4385 "syn",5535 "syn 2.0.117",4386]5536]438755374388[[package]]5538[[package]]4391source = "registry+https://github.com/rust-lang/crates.io-index"5541source = "registry+https://github.com/rust-lang/crates.io-index"4392checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"5542checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"55435544[[package]]5545name = "windows-numerics"5546version = "0.3.1"5547source = "registry+https://github.com/rust-lang/crates.io-index"5548checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"5549dependencies = [5550 "windows-core",5551 "windows-link",5552]439355534394[[package]]5554[[package]]4395name = "windows-result"5555name = "windows-result"4478 "windows_x86_64_msvc 0.53.1",5638 "windows_x86_64_msvc 0.53.1",4479]5639]56405641[[package]]5642name = "windows-threading"5643version = "0.2.1"5644source = "registry+https://github.com/rust-lang/crates.io-index"5645checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"5646dependencies = [5647 "windows-link",5648]448056494481[[package]]5650[[package]]4482name = "windows_aarch64_gnullvm"5651name = "windows_aarch64_gnullvm"457657454577[[package]]5746[[package]]4578name = "winnow"5747name = "winnow"4579version = "0.7.15"5748version = "1.0.3"4580source = "registry+https://github.com/rust-lang/crates.io-index"5749source = "registry+https://github.com/rust-lang/crates.io-index"4581checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"5750checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"4582dependencies = [5751dependencies = [4583 "memchr",5752 "memchr",4584]5753]45854586[[package]]4587name = "winnow"4588version = "1.0.2"4589source = "registry+https://github.com/rust-lang/crates.io-index"4590checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"459157544592[[package]]5755[[package]]4593name = "wit-bindgen"5756name = "wit-bindgen"4623dependencies = [5786dependencies = [4624 "anyhow",5787 "anyhow",4625 "heck",5788 "heck",4626 "indexmap 2.14.0",5789 "indexmap",4627 "prettyplease",5790 "prettyplease",4628 "syn",5791 "syn 2.0.117",4629 "wasm-metadata",5792 "wasm-metadata",4630 "wit-bindgen-core",5793 "wit-bindgen-core",4631 "wit-component",5794 "wit-component",4641 "prettyplease",5804 "prettyplease",4642 "proc-macro2",5805 "proc-macro2",4643 "quote",5806 "quote",4644 "syn",5807 "syn 2.0.117",4645 "wit-bindgen-core",5808 "wit-bindgen-core",4646 "wit-bindgen-rust",5809 "wit-bindgen-rust",4647]5810]4654dependencies = [5817dependencies = [4655 "anyhow",5818 "anyhow",4656 "bitflags",5819 "bitflags",4657 "indexmap 2.14.0",5820 "indexmap",4658 "log",5821 "log",4659 "serde",5822 "serde",4660 "serde_derive",5823 "serde_derive",4673dependencies = [5836dependencies = [4674 "anyhow",5837 "anyhow",4675 "id-arena",5838 "id-arena",4676 "indexmap 2.14.0",5839 "indexmap",4677 "log",5840 "log",4678 "semver",5841 "semver",4679 "serde",5842 "serde",4701source = "registry+https://github.com/rust-lang/crates.io-index"5864source = "registry+https://github.com/rust-lang/crates.io-index"4702checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"5865checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"4703dependencies = [5866dependencies = [4704 "curve25519-dalek",5867 "curve25519-dalek 4.1.3",4705 "rand_core 0.6.4",5868 "rand_core 0.6.4",4706 "serde",5869 "serde",4707 "zeroize",5870 "zeroize",4708]5871]470958724710[[package]]5873[[package]]4711name = "yasna"5874name = "yoke"4712version = "0.5.2"5875version = "0.8.3"4713source = "registry+https://github.com/rust-lang/crates.io-index"5876source = "registry+https://github.com/rust-lang/crates.io-index"4714checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"5877checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"4715dependencies = [5878dependencies = [5879 "stable_deref_trait",4716 "time",5880 "yoke-derive",5881 "zerofrom",4717]5882]471858834719[[package]]5884[[package]]4720name = "yoke"5885name = "yoke-derive"4721version = "0.8.2"5886version = "0.8.2"4722source = "registry+https://github.com/rust-lang/crates.io-index"5887source = "registry+https://github.com/rust-lang/crates.io-index"4723checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"5888checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"4724dependencies = [5889dependencies = [4725 "stable_deref_trait",5890 "proc-macro2",4726 "yoke-derive",5891 "quote",5892 "syn 2.0.117",4727 "zerofrom",5893 "synstructure",4728]5894]58955896[[package]]5897name = "zbus"5898version = "5.16.0"5899source = "registry+https://github.com/rust-lang/crates.io-index"5900checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285"5901dependencies = [5902 "async-broadcast",5903 "async-executor",5904 "async-io",5905 "async-lock",5906 "async-process",5907 "async-recursion",5908 "async-task",5909 "async-trait",5910 "blocking",5911 "enumflags2",5912 "event-listener",5913 "futures-core",5914 "futures-lite",5915 "hex",5916 "libc",5917 "ordered-stream",5918 "rustix 1.1.4",5919 "serde",5920 "serde_repr",5921 "tracing",5922 "uds_windows",5923 "uuid",5924 "windows-sys 0.61.2",5925 "winnow",5926 "zbus_macros",5927 "zbus_names",5928 "zvariant",5929]472959304730[[package]]5931[[package]]4731name = "yoke-derive"5932name = "zbus_macros"4732version = "0.8.2"5933version = "5.16.0"4733source = "registry+https://github.com/rust-lang/crates.io-index"5934source = "registry+https://github.com/rust-lang/crates.io-index"4734checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"5935checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6"4735dependencies = [5936dependencies = [5937 "proc-macro-crate",4736 "proc-macro2",5938 "proc-macro2",4737 "quote",5939 "quote",4738 "syn",5940 "syn 2.0.117",5941 "zbus_names",5942 "zvariant",4739 "synstructure",5943 "zvariant_utils",4740]5944]59455946[[package]]5947name = "zbus_names"5948version = "4.3.2"5949source = "registry+https://github.com/rust-lang/crates.io-index"5950checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d"5951dependencies = [5952 "serde",5953 "winnow",5954 "zvariant",5955]474159564742[[package]]5957[[package]]4743name = "zerocopy"5958name = "zerocopy"4744version = "0.8.48"5959version = "0.8.52"4745source = "registry+https://github.com/rust-lang/crates.io-index"5960source = "registry+https://github.com/rust-lang/crates.io-index"4746checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"5961checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"4747dependencies = [5962dependencies = [4748 "zerocopy-derive",5963 "zerocopy-derive",4749]5964]475059654751[[package]]5966[[package]]4752name = "zerocopy-derive"5967name = "zerocopy-derive"4753version = "0.8.48"5968version = "0.8.52"4754source = "registry+https://github.com/rust-lang/crates.io-index"5969source = "registry+https://github.com/rust-lang/crates.io-index"4755checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"5970checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"4756dependencies = [5971dependencies = [4757 "proc-macro2",5972 "proc-macro2",4758 "quote",5973 "quote",4759 "syn",5974 "syn 2.0.117",4760]5975]476159764762[[package]]5977[[package]]4763name = "zerofrom"5978name = "zerofrom"4764version = "0.1.7"5979version = "0.1.8"4765source = "registry+https://github.com/rust-lang/crates.io-index"5980source = "registry+https://github.com/rust-lang/crates.io-index"4766checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"5981checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"4767dependencies = [5982dependencies = [4768 "zerofrom-derive",5983 "zerofrom-derive",4769]5984]4776dependencies = [5991dependencies = [4777 "proc-macro2",5992 "proc-macro2",4778 "quote",5993 "quote",4779 "syn",5994 "syn 2.0.117",4780 "synstructure",5995 "synstructure",4781]5996]478259974783[[package]]5998[[package]]4784name = "zeroize"5999name = "zeroize"4785version = "1.8.2"6000version = "1.9.0"4786source = "registry+https://github.com/rust-lang/crates.io-index"6001source = "registry+https://github.com/rust-lang/crates.io-index"4787checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"6002checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"4788dependencies = [6003dependencies = [4789 "zeroize_derive",6004 "zeroize_derive",4790]6005]479160064792[[package]]6007[[package]]4793name = "zeroize_derive"6008name = "zeroize_derive"4794version = "1.4.3"6009version = "1.5.0"4795source = "registry+https://github.com/rust-lang/crates.io-index"6010source = "registry+https://github.com/rust-lang/crates.io-index"4796checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"6011checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328"4797dependencies = [6012dependencies = [4798 "proc-macro2",6013 "proc-macro2",4799 "quote",6014 "quote",4800 "syn",6015 "syn 2.0.117",4801]6016]480260174803[[package]]6018[[package]]4831dependencies = [6046dependencies = [4832 "proc-macro2",6047 "proc-macro2",4833 "quote",6048 "quote",4834 "syn",6049 "syn 2.0.117",4835]6050]483660514837[[package]]6052[[package]]4840source = "registry+https://github.com/rust-lang/crates.io-index"6055source = "registry+https://github.com/rust-lang/crates.io-index"4841checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"6056checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"60576058[[package]]6059name = "zvariant"6060version = "5.12.0"6061source = "registry+https://github.com/rust-lang/crates.io-index"6062checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0"6063dependencies = [6064 "endi",6065 "enumflags2",6066 "serde",6067 "winnow",6068 "zvariant_derive",6069 "zvariant_utils",6070]60716072[[package]]6073name = "zvariant_derive"6074version = "5.12.0"6075source = "registry+https://github.com/rust-lang/crates.io-index"6076checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737"6077dependencies = [6078 "proc-macro-crate",6079 "proc-macro2",6080 "quote",6081 "syn 2.0.117",6082 "zvariant_utils",6083]60846085[[package]]6086name = "zvariant_utils"6087version = "3.4.0"6088source = "registry+https://github.com/rust-lang/crates.io-index"6089checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6"6090dependencies = [6091 "proc-macro2",6092 "quote",6093 "serde",6094 "syn 2.0.117",6095 "winnow",6096]48426097Cargo.tomldiffbeforeafterboth6package.rust-version = "1.89.0"6package.rust-version = "1.89.0"778[workspace.dependencies]8[workspace.dependencies]9better-command = { path = "./crates/better-command" }10fleet-base = { path = "./crates/fleet-base" }9fleet-base = { path = "./crates/fleet-base" }11fleet-shared = { path = "./crates/fleet-shared" }10fleet-shared = { path = "./crates/fleet-shared" }12nix-eval = { path = "./crates/nix-eval" }11nix-eval = { path = "./crates/nix-eval" }13nixlike = { path = "./crates/nixlike" }12nixlike = { path = "./crates/nixlike" }14opentelemetry-exporter-env = { path = "./crates/opentelemetry-exporter-env" }13opentelemetry-exporter-env = { path = "./crates/opentelemetry-exporter-env" }14remowt-fleet = { path = "./crates/remowt-fleet" }1516remowt-client = "0.1.3"17remowt-endpoints = "0.1.3"18remowt-link-shared = "0.1.3"19remowt-plugin = "0.1.3"20remowt-ui-prompt = "0.1.3"152116abort-on-drop = "0.2"22bifrostlink = "0.2.3"2324uuid = { version = "1", features = ["v4"] }2517age = { version = "0.11", features = ["plugin", "ssh"] }26age = { version = "0.11", features = ["plugin", "ssh"] }18age-core = "0.11"19anyhow = "1.0"27anyhow = "1.0"20async-trait = "0.1.88"21axum = { version = "0.8.7", features = ["http2", "macros", "ws"] }22axum-extra = { version = "0.12.2", features = ["typed-header"] }23base64 = "0.22.1"28base64 = "0.22.1"24bindgen = "0.72.0"29bindgen = "0.72.0"30camino = "1.2.2"25chrono = { version = "0.4.41", features = ["serde"] }31chrono = { version = "0.4.41", features = ["serde"] }26clap = { version = "4.5", features = ["derive", "env", "unicode", "wrap_help"] }32clap = { version = "4.5", features = ["derive", "env", "unicode", "wrap_help"] }27clap_complete = "4.5"33clap_complete = "4.5"28cxx = "1.0.168"34cxx = "1.0.168"29cxx-build = "1.0.168"35cxx-build = "1.0.168"30ed25519-dalek = "2.1"36ed25519-dalek = "2.1"31futures = "0.3.31"37futures = "0.3.31"32futures-util = { version = "0.3.31", features = ["sink"] }33hex = "0.4.3"38hex = "0.4.3"34hmac = "0.12"39hmac = "0.12"35hostname = "0.4.1"40hostname = "0.4.1"36human-repr = "1.1"41human-repr = "1.1"37hyper = "1.8.1"38indicatif = "0.18"42indicatif = "0.18"39indoc = "2.0.6"43indoc = "2.0.6"40itertools = "0.14.0"44itertools = "0.14.0"41linked-hash-map = "0.5.6"45linked-hash-map = "0.5.6"42nix = { version = "0.31.2", features = ["fs", "user"] }46nix = { version = "0.31.2", features = ["fs", "user"] }43nom = "8.0.0"47nom = "8.0.0"44openssh = "0.11.5"45opentelemetry = "0.31.0"48opentelemetry = "0.31.0"46opentelemetry-appender-tracing = "0.31.1"49opentelemetry-appender-tracing = "0.31.1"47opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic", "gzip-tonic", "http-json", "reqwest-rustls"] }50opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic", "gzip-tonic", "http-json", "reqwest-rustls"] }50peg = "0.8.5"53peg = "0.8.5"51pkg-config = "0.3.30"54pkg-config = "0.3.30"52rand = "0.10.0"55rand = "0.10.0"53regex = "1.11"54serde = { version = "1.0", features = ["derive"] }56serde = { version = "1.0", features = ["derive"] }55serde-transcode = "1.1.1"56serde_json = "1.0"57serde_json = "1.0"57sha2 = "0.10"58sha2 = "0.10"58shlex = "1.3"59shlex = "1.3"59tabled = "0.20.0"60tabled = "0.20.0"60tempfile = "3.20"61tempfile = "3.20"61test-log = { version = "0.2.19", features = ["trace"] }62test-log = { version = "0.2.19", features = ["trace"] }62tf-provider = "0.2.2"63thiserror = "2.0.12"63thiserror = "2.0.12"64time = "0.3.41"64time = "0.3.41"65tokio = { version = "1.45.1", features = ["fs", "macros", "rt", "rt-multi-thread", "sync", "time"] }65tokio = { version = "1.45.1", features = ["fs", "macros", "rt", "rt-multi-thread", "sync", "time"] }66tokio-util = "0.7.17"67toml_edit = "0.23.10"68tracing = "0.1"66tracing = "0.1"69tracing-indicatif = "0.3.13"67tracing-indicatif = "0.3.13"70tracing-opentelemetry = "0.32.1"68tracing-opentelemetry = "0.32.1"cmds/fleet/Cargo.tomldiffbeforeafterboth8default-run = "fleet"8default-run = "fleet"9910[dependencies]10[dependencies]11age = { workspace = true, features = ["armor"] }12anyhow.workspace = true11anyhow.workspace = true13better-command.workspace = true12camino.workspace = true14clap.workspace = true13clap.workspace = true15clap_complete.workspace = true14clap_complete.workspace = true16fleet-base.workspace = true15fleet-base.workspace = true17fleet-shared.workspace = true18nix-eval.workspace = true16nix-eval.workspace = true19nixlike.workspace = true17remowt-fleet.workspace = true20serde.workspace = true18serde.workspace = true21serde_json.workspace = true19serde_json.workspace = true22tempfile.workspace = true20tempfile.workspace = true23tokio.workspace = true21tokio.workspace = true24tracing.workspace = true22tracing.workspace = true25tracing-subscriber.workspace = true23tracing-subscriber.workspace = true262427abort-on-drop.workspace = true28age-core.workspace = true29async-trait.workspace = true30base64.workspace = true31chrono.workspace = true32futures.workspace = true25futures.workspace = true33hostname.workspace = true34itertools.workspace = true26itertools.workspace = true35openssh.workspace = true36peg.workspace = true37regex.workspace = true38shlex.workspace = true27shlex.workspace = true39tabled.workspace = true28tabled.workspace = true40time = { workspace = true, features = ["serde"] }41tokio-util = { workspace = true, features = ["codec"] }422943human-repr = { workspace = true, optional = true }30human-repr = { workspace = true, optional = true }44indicatif = { workspace = true, optional = true }31indicatif = { workspace = true, optional = true }45nom.workspace = true46opentelemetry.workspace = true32opentelemetry.workspace = true47opentelemetry-appender-tracing.workspace = true33opentelemetry-appender-tracing.workspace = true48opentelemetry-exporter-env.workspace = true34opentelemetry-exporter-env.workspace = true49opentelemetry_sdk.workspace = true35opentelemetry_sdk.workspace = true50thiserror.workspace = true51tracing-indicatif = { workspace = true, optional = true }36tracing-indicatif = { workspace = true, optional = true }52tracing-opentelemetry.workspace = true37tracing-opentelemetry.workspace = true533858 "dep:tracing-indicatif",43 "dep:tracing-indicatif",59 "dep:indicatif",44 "dep:indicatif",60 "dep:human-repr",45 "dep:human-repr",61 "better-command/indicatif",62 "nix-eval/indicatif",46 "nix-eval/indicatif",63]47]6448cmds/fleet/src/cmds/build_systems.rsdiffbeforeafterboth1use std::{env::current_dir, os::unix::fs::symlink, path::PathBuf};1use std::{env::current_dir, os::unix::fs::symlink, path::PathBuf};223use anyhow::Result;3use anyhow::Result;4use camino::Utf8PathBuf;4use clap::Parser;5use clap::Parser;5use fleet_base::{6use fleet_base::{6 deploy::{DeployAction, deploy_task, upload_task},7 deploy::{DeployAction, deploy_task, upload_task},29 build_attr: String,30 build_attr: String,30}31}313232async fn build_task(config: Config, hostname: String, build_attr: &str) -> Result<PathBuf> {33async fn build_task(config: Config, hostname: String, build_attr: &str) -> Result<Utf8PathBuf> {33 info!("building");34 info!("building");34 let host = config.host(&hostname)?;35 let host = config.host(&hostname)?;35 // let action = Action::from(self.subcommand.clone());36 // let action = Action::from(self.subcommand.clone());42 // We already have system profiles for backups.43 // We already have system profiles for backups.43 if !host.local {44 if !host.local {44 info!("adding gc root");45 info!("adding gc root");45 let mut cmd = config.local_host().cmd("nix").await?;46 let local = config.local_host();46 cmd.arg("build")47 let plugin_id = local.ensure_nix_plugin().await?;47 .comparg(48 let nix = local48 "--profile",49 .remowt()50 .await?51 .plugin_endpoints::<remowt_fleet::NixClient<_>>(plugin_id);49 format!(52 let profile = format!(50 "/nix/var/nix/profiles/{}-{hostname}",53 "/nix/var/nix/profiles/{}-{hostname}",51 config.data.gc_root_prefix54 config.data.gc_root_prefix52 ),55 );53 )54 .arg(&out_output);55 cmd.sudo().run_nix().await?;56 nix.switch_profile(profile, out_output.clone())57 .await58 .map_err(|e| anyhow::anyhow!("{e:?}"))?59 .map_err(|e| anyhow::anyhow!("{e}"))?;56 }60 }576158 Ok(out_output)62 Ok(out_output)cmds/fleet/src/cmds/tf.rsdiffbeforeafterboth1use std::{collections::BTreeMap, ffi::OsString, path::PathBuf};1use std::{collections::BTreeMap, ffi::OsString};223use anyhow::{Context, Result};3use anyhow::{Context, Result};4use camino::Utf8PathBuf;4use clap::Parser;5use clap::Parser;5use fleet_base::host::Config;6use fleet_base::host::Config;6use nix_eval::nix_go;7use nix_eval::nix_go;40 let system = &config.local_system;41 let system = &config.local_system;41 let config = &config.flake_outputs;42 let config = &config.flake_outputs;42 let data = nix_go!(config.tf({ system }));43 let data = nix_go!(config.tf({ system }));43 let data: PathBuf = spawn_blocking(move || data.build("out"))44 let data: Utf8PathBuf = spawn_blocking(move || data.build("out"))44 .await45 .await45 .expect("tf.json derivation should not fail")?;46 .expect("tf.json derivation should not fail")?;46 let data = fs::read(&data).await?;47 let data = fs::read(&data).await?;cmds/fleet/src/main.rsdiffbeforeafterboth4// pub(crate) mod command;4// pub(crate) mod command;5pub(crate) mod extra_args;5pub(crate) mod extra_args;667use std::{env, ffi::OsString, process::ExitCode, sync::Arc};7use std::{process::ExitCode, sync::Arc};889use anyhow::{Result, bail};9use anyhow::{Context as _, Result, bail};10use camino::Utf8PathBuf;10use clap::{CommandFactory, Parser};11use clap::{CommandFactory, Parser};11use cmds::{12use cmds::{12 build_systems::{BuildSystems, Deploy},13 build_systems::{BuildSystems, Deploy},23#[cfg(feature = "indicatif")]24#[cfg(feature = "indicatif")]24use indicatif::{ProgressState, ProgressStyle};25use indicatif::{ProgressState, ProgressStyle};25use nix_eval::{26use nix_eval::{26 gc_register_my_thread, gc_unregister_my_thread, init_libraries, init_tokio_for_nix,27 add_file_to_store, gc_register_my_thread, gc_unregister_my_thread, init_libraries,28 init_tokio_for_nix,27};29};28use opentelemetry::trace::TracerProvider;30use opentelemetry::trace::TracerProvider;48 }50 }49 let tasks = FuturesUnordered::new();51 let tasks = FuturesUnordered::new();50 for entry in std::fs::read_dir(&prefetch_dir)? {52 for entry in std::fs::read_dir(&prefetch_dir)? {51 tasks.push(async {52 let entry = entry?;53 let entry = entry?;53 if !entry.metadata()?.is_file() {54 if !entry.metadata()?.is_file() {54 bail!("only files should exist in prefetch directory");55 bail!("only files should exist in prefetch directory");55 }56 }56 let span = info_span!(57 let name = entry.file_name().to_string_lossy().into_owned();57 "prefetching",58 name = entry.file_name().to_string_lossy().as_ref()59 );60 let mut path = OsString::new();58 let path =59 Utf8PathBuf::try_from(entry.path()).context("prefetch path should be utf8")?;61 path.push("file://");60 let span = info_span!("prefetching", name = %name);62 path.push(entry.path());61 tasks.push(async move {6364 let mut status = config.local_host().cmd("nix").await?;62 let added = tokio::task::spawn_blocking(move || add_file_to_store(&name, &path))63 .instrument(span.clone())64 .await??;65 status.args(&config.nix_args);65 let _g = span.enter();66 status.arg("store").arg("prefetch-file").arg(path);66 info!("{} -> {}", added.hash, added.store_path);67 status.run_nix_string().instrument(span).await?;68 Ok(())67 anyhow::Ok(())69 });68 });70 }69 }71 tasks.try_collect::<Vec<()>>().await?;70 tasks.try_collect::<Vec<()>>().await?;72 Ok(())71 Ok(())181 let reg = tracing_subscriber::registry().with({180 let reg = tracing_subscriber::registry().with({182 let sub = tracing_subscriber::fmt::layer()181 let sub = tracing_subscriber::fmt::layer().without_time();183 .without_time()184 .with_target(false);185 #[cfg(feature = "indicatif")]182 #[cfg(feature = "indicatif")]186 let sub = sub.with_writer(indicatif_layer.get_stderr_writer());183 let sub = sub.with_writer(indicatif_layer.get_stderr_writer());187 sub.with_filter(filter) // .without,184 sub.with_filter(filter) // .without,262}259}263260264async fn main_real(opts: RootOpts) -> Result<()> {261async fn main_real(opts: RootOpts) -> Result<()> {265 let nix_args = std::env::var_os("NIX_ARGS")266 .map(|a| extra_args::parse_os(&a))267 .transpose()?268 .unwrap_or_default();269 let config = opts.fleet_opts.build(262 let config = opts.fleet_opts.build(matches!(270 nix_args,271 matches!(opts.command, Opts::Deploy(_) | Opts::BuildSystems(_)),263 opts.command,264 Opts::Deploy(_) | Opts::BuildSystems(_)272 )?;265 ))?;273266cmds/install-secrets/src/main.rsdiffbeforeafterboth227 .from_env_lossy(),227 .from_env_lossy(),228 )228 )229 .without_time()229 .without_time()230 .with_target(false)231 .init();230 .init();232231233 let opts = Opts::parse();232 let opts = Opts::parse();cmds/nix-plugin-fleet/Cargo.tomldiffbeforeafterbothno changes
cmds/nix-plugin-fleet/src/lib.rsdiffbeforeafterbothno changes
cmds/remowt-plugin-fleet/Cargo.tomldiffbeforeafterbothno changes
cmds/remowt-plugin-fleet/src/main.rsdiffbeforeafterbothno changes
cmds/repl-plugin-unstable/Cargo.tomldiffbeforeafterbothno changes
cmds/repl-plugin-unstable/src/lib.rsdiffbeforeafterbothno changes
cmds/terraform-provider-fleet/Cargo.tomldiffbeforeafterbothno changes
cmds/terraform-provider-fleet/src/main.rsdiffbeforeafterbothno changes
crates/better-command/Cargo.tomldiffbeforeafterbothno changes
crates/better-command/src/handler.rsdiffbeforeafterbothno changes
crates/better-command/src/lib.rsdiffbeforeafterbothno changes
crates/fleet-base/Cargo.tomldiffbeforeafterboth5rust-version.workspace = true5rust-version.workspace = true667[dependencies]7[dependencies]8remowt-client.workspace = true9remowt-endpoints.workspace = true10remowt-fleet.workspace = true11remowt-link-shared.workspace = true12remowt-ui-prompt.workspace = true138age.workspace = true14age.workspace = true9anyhow.workspace = true15anyhow.workspace = true10better-command.workspace = true16camino.workspace = true11chrono.workspace = true17chrono.workspace = true12clap = { workspace = true, features = ["derive"] }18clap = { workspace = true, features = ["derive"] }13fleet-shared.workspace = true19fleet-shared.workspace = true18nix-eval.workspace = true24nix-eval.workspace = true19nixlike.workspace = true25nixlike.workspace = true20nom.workspace = true26nom.workspace = true21openssh.workspace = true22rand.workspace = true27rand.workspace = true23serde.workspace = true28serde.workspace = true24serde_json.workspace = true29serde_json.workspace = true25tabled.workspace = true30tabled.workspace = true26tempfile.workspace = true31tempfile.workspace = true27thiserror.workspace = true28time = { workspace = true, features = ["parsing"] }32time = { workspace = true, features = ["parsing"] }29tokio.workspace = true33tokio.workspace = true30tokio-util = { workspace = true, features = ["codec"] }31toml_edit.workspace = true32tracing.workspace = true34tracing.workspace = true3335crates/fleet-base/src/command.rsdiffbeforeafterbothno changes
crates/fleet-base/src/deploy.rsdiffbeforeafterboth1use std::{path::PathBuf, time::Duration};1use std::time::Duration;223use anyhow::{Context as _, Result, anyhow, bail};3use anyhow::{Context as _, Result, anyhow, bail};4use camino::Utf8PathBuf;4use clap::ValueEnum;5use clap::ValueEnum;5use itertools::Itertools;6use itertools::Itertools;7use remowt_endpoints::fs::FsClient;8use remowt_endpoints::systemd::SystemdClient;9use remowt_fleet::NixClient;10use remowt_link_shared::BifConfig;6use tokio::time::sleep;11use tokio::time::sleep;7use tracing::{Instrument as _, error, info, info_span, warn};12use tracing::{Instrument as _, error, info, info_span, warn};81359pub async fn deploy_task(64pub async fn deploy_task(60 action: DeployAction,65 action: DeployAction,61 host: &ConfigHost,66 host: &ConfigHost,62 built: PathBuf,67 built: Utf8PathBuf,63 specialisation: Option<String>,68 specialisation: Option<String>,64 disable_rollback: bool,69 disable_rollback: bool,65) -> Result<()> {70) -> Result<()> {71 let remowt = host.remowt().await?;66 let deploy_kind = host.deploy_kind().await?;72 let deploy_kind = host.deploy_kind().await?;67 if (deploy_kind == DeployKind::NixosInstall || deploy_kind == DeployKind::NixosLustrate)73 if (deploy_kind == DeployKind::NixosInstall || deploy_kind == DeployKind::NixosLustrate)68 && !matches!(action, DeployAction::Boot | DeployAction::Upload)74 && !matches!(action, DeployAction::Boot | DeployAction::Upload)86 generation.id, generation.datetime92 generation.id, generation.datetime87 );93 );88 {94 {89 let mut cmd = host.cmd("sh").await?;95 let mut cmd = remowt.cmd("sh");90 cmd.arg("-c").arg(format!("mark=$(mktemp -p /etc -t fleet_rollback_marker.XXXXX) && echo -n {} > $mark && mv --no-clobber $mark /etc/fleet_rollback_marker", generation.id));96 cmd.arg("-c").arg(format!("mark=$(mktemp -p /etc -t fleet_rollback_marker.XXXXX) && echo -n {} > $mark && mv --no-clobber $mark /etc/fleet_rollback_marker", generation.id));91 if let Err(e) = cmd.sudo().run().await {97 if let Err(e) = cmd.sudo().run().await {92 error!("failed to set rollback marker: {e}");98 error!("failed to set rollback marker: {e}");104 // if we fail to perform generation switch in time, then we will still call the activation script, and this may break something.110 // if we fail to perform generation switch in time, then we will still call the activation script, and this may break something.105 // Anyway, reboot will still help in this case.111 // Anyway, reboot will still help in this case.106 if action.should_schedule_rollback_run() {112 if action.should_schedule_rollback_run() {107 let mut cmd = host.cmd("systemd-run").await?;113 let mut cmd = remowt.cmd("systemd-run");108 cmd.comparg("--on-active", "3min")114 cmd.comparg("--on-active", "3min")109 .comparg("--unit", "rollback-watchdog-run")115 .comparg("--unit", "rollback-watchdog-run")110 .arg("systemctl")116 .arg("systemctl")117 }123 }118 }124 }125126 let remowt = host.remowt().await?;127 let fs = remowt.endpoints::<FsClient<_>>();119 if deploy_kind == DeployKind::NixosLustrate {128 if deploy_kind == DeployKind::NixosLustrate {120 // Fleet could also create this file, but as this operation is potentially disruptive,129 // Fleet could also create this file, but as this operation is potentially disruptive,121 // make user do it themself.130 // make user do it themself.122 if !host.file_exists("/etc/NIXOS_LUSTRATE").await? {131 if !fs132 .file_exists(Utf8PathBuf::from("/etc/NIXOS_LUSTRATE"))133 .await?134 {123 bail!("/etc/NIXOS_LUSTRATE should be created on remote host");135 bail!("/etc/NIXOS_LUSTRATE should be created on remote host");124 }136 }125 // Wanted by NixOS to recognize the system as NixOS.137 // Wanted by NixOS to recognize the system as NixOS.126 let mut cmd = host.cmd("touch").await?;138 let mut cmd = remowt.cmd("touch");127 cmd.arg("/etc/NIXOS");139 cmd.arg("/etc/NIXOS");128 cmd.sudo().run().await.context("creating /etc/NIXOS")?;140 cmd.sudo().run().await.context("creating /etc/NIXOS")?;129 }141 }130 if deploy_kind == DeployKind::NixosInstall {142 if deploy_kind == DeployKind::NixosInstall {131 info!(143 info!(132 "running nixos-install to switch profile, install bootloader, and perform activation"144 "running nixos-install to switch profile, install bootloader, and perform activation"133 );145 );134 let mut cmd = host.cmd("nixos-install").await?;146 let mut cmd = remowt.cmd("nixos-install");135 cmd.arg("--system").arg(&built).args([147 cmd.arg("--system").arg(&built).args([136 // Channels here aren't fleet host system channels, but channels embedded in installation cd, which might be old.148 // Channels here aren't fleet host system channels, but channels embedded in installation cd, which might be old.137 // It is possible to copy host channels, but I would prefer non-flake nix just to be unsupported.149 // It is possible to copy host channels, but I would prefer non-flake nix just to be unsupported.147 if action.should_switch_profile() && !failed {159 if action.should_switch_profile() && !failed {148 info!("switching system profile generation");160 info!("switching system profile generation");149161162 match host.ensure_nix_plugin().await {163 Ok(plugin_id) => {164 let nix_elevated = remowt.plugin_endpoints::<NixClient<_>>(plugin_id);150 // To avoid even more problems, using nixos-install for now.165 // To avoid even more problems, using nixos-install for now.151 // // nix build is unable to work with --store argument for some reason, and nix until 2.26 didn't support copy with --profile argument,166 // // nix build is unable to work with --store argument for some reason, and nix until 2.26 didn't support copy with --profile argument,152 // // falling back to using nix-env command167 // // falling back to using nix-env command164 // error!("failed to switch system profile generation: {e}");179 // error!("failed to switch system profile generation: {e}");165 // failed = true;180 // failed = true;166 // }181 // }167 // It would also be possible to update profile atomically during copy:168 // https://github.com/NixOS/nix/pull/11657169 let mut cmd = host.nix_cmd().await?;170 cmd.arg("build");171 cmd.comparg("--profile", "/nix/var/nix/profiles/system");172 cmd.arg(&built);173 if let Err(e) = cmd.sudo().run_nix().await {182 if let Err(e) = nix_elevated183 .switch_profile("/nix/var/nix/profiles/system".to_owned(), built.clone())184 .await185 {174 error!("failed to switch system profile generation: {e}");186 error!("failed to switch system profile generation: {e}");175 failed = true;187 failed = true;176 }188 }189 }190 Err(e) => {191 failed = true;192 error!("failed to enable nix plugin: {e:?}");193 }194 }177 }195 }178196179 // FIXME: Connection might be disconnected after activation run197 // FIXME: Connection might be disconnected after activation run189 built.clone()207 built.clone()190 };208 };191 let switch_script = specialised.join("bin/switch-to-configuration");209 let switch_script = specialised.join("bin/switch-to-configuration");192 let mut cmd = host.cmd("systemd-run").in_current_span().await?;210 let mut cmd = remowt.cmd("systemd-run");193 if deploy_kind == DeployKind::NixosLustrate {211 if deploy_kind == DeployKind::NixosLustrate {194 cmd.arg("--setenv=NIXOS_INSTALL_BOOTLOADER=1");212 cmd.arg("--setenv=NIXOS_INSTALL_BOOTLOADER=1");195 }213 }209 }227 }210 }228 }211 if action.should_create_rollback_marker() {229 if action.should_create_rollback_marker() {230 let elevated_systemd = remowt.run0_endpoints::<SystemdClient<BifConfig>>().await?;231 let elevated_fs = remowt.run0_endpoints::<FsClient<BifConfig>>().await?;212 if !disable_rollback {232 if !disable_rollback {213 if failed {233 if failed {214 if action.should_schedule_rollback_run() {234 if action.should_schedule_rollback_run() {215 info!("executing rollback");235 info!("executing rollback");216 if let Err(e) = host236 if let Err(e) = elevated_systemd217 .systemctl_start("rollback-watchdog.service")237 .start("rollback-watchdog.service".to_owned())218 .instrument(info_span!("rollback"))238 .instrument(info_span!("rollback"))219 .await239 .await220 {240 {223 }243 }224 } else {244 } else {225 info!("trying to mark upgrade as successful");245 info!("trying to mark upgrade as successful");226 if let Err(e) = host246 if let Err(e) = elevated_fs227 .rm_file("/etc/fleet_rollback_marker", true)247 .rm_file(Utf8PathBuf::from("/etc/fleet_rollback_marker"))228 .in_current_span()248 .in_current_span()229 .await249 .await230 {250 {234 }254 }235 }255 }236 info!("disarming watchdog, just in case");256 info!("disarming watchdog, just in case");237 if let Err(_e) = host.systemctl_stop("rollback-watchdog.timer").await {257 if let Err(_e) = elevated_systemd258 .stop("rollback-watchdog.timer".to_owned())259 .await260 {238 // It is ok, if there was no reboot - then timer might not be running.261 // It is ok, if there was no reboot - then timer might not be running.239 }262 }240 if action.should_schedule_rollback_run() {263 if action.should_schedule_rollback_run() {241 if let Err(e) = host.systemctl_stop("rollback-watchdog-run.timer").await {264 if let Err(e) = elevated_systemd265 .stop("rollback-watchdog-run.timer".to_owned())266 .await267 {242 error!("failed to disarm rollback run: {e}");268 error!("failed to disarm rollback run: {e}");243 }269 }244 }270 }245 } else if let Err(_e) = host271 } else if let Err(_e) = elevated_fs246 .rm_file("/etc/fleet_rollback_marker", true)272 .rm_file(Utf8PathBuf::from("/etc/fleet_rollback_marker"))247 .in_current_span()273 .in_current_span()248 .await274 .await249 {275 {257 config: &Config,283 config: &Config,258 host: &ConfigHost,284 host: &ConfigHost,259 location: GenerationStorage,285 location: GenerationStorage,260 generation: PathBuf,286 generation: Utf8PathBuf,261) -> Result<PathBuf> {287) -> Result<Utf8PathBuf> {262 if matches!(location, GenerationStorage::Pusher) {288 if matches!(location, GenerationStorage::Pusher) {263 bail!("pusher is not enabled in this version of fleet");289 bail!("pusher is not enabled in this version of fleet");264 }290 }273 }299 }274 Err(e) if tries < 3 => {300 Err(e) if tries < 3 => {275 tries += 1;301 tries += 1;276 warn!("copy failure ({}/3): {}", tries, e);302 warn!("copy failure ({}/3): {:#}", tries, e);277 sleep(Duration::from_millis(5000)).await;303 sleep(Duration::from_millis(5000)).await;278 }304 }279 Err(e) => {305 Err(e) => {280 bail!("upload failed: {e}");306 bail!("upload failed: {e:#}");281 }307 }282 }308 }283 }309 }crates/fleet-base/src/fleetdata.rsdiffbeforeafterboth144 pub generation_data: Value,144 pub generation_data: Value,145}145}146147fn is_false(b: &bool) -> bool {148 *b == false149}150146151#[derive(Serialize, Deserialize, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]147#[derive(Serialize, Deserialize, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]152#[repr(transparent)]148#[repr(transparent)]291 }287 }292288293 // Which one is easier to access289 // Which one is easier to access294 return a.owners.len().cmp(&b.owners.len());290 a.owners.len().cmp(&b.owners.len())295}291}296292297impl FleetSecretDistributions {293impl FleetSecretDistributions {crates/fleet-base/src/host.rsdiffbeforeafterboth1use std::{1use std::{2 collections::{BTreeMap, BTreeSet, HashSet},2 collections::{BTreeMap, BTreeSet, HashSet},3 ffi::{OsStr, OsString},3 future::Future,4 fmt::Display,5 io::Write,4 io::Write,6 ops::Deref,5 ops::Deref,7 path::PathBuf,6 path::PathBuf,7 pin::Pin,8 str::FromStr,8 str::FromStr,9 sync::{Arc, Mutex, MutexGuard, OnceLock},9 sync::{Arc, OnceLock},10};10};111112use anyhow::{Context, Result, anyhow, bail, ensure};12use anyhow::{Context, Result, anyhow, bail, ensure};13use camino::{Utf8Path, Utf8PathBuf};13use chrono::{DateTime, Utc};14use chrono::{DateTime, Utc};14use fleet_shared::SecretData;15use fleet_shared::SecretData;15use nix_eval::{Value, nix_go, nix_go_json, util::assert_warn};16use nix_eval::{Store, Value, nix_go, nix_go_json, util::assert_warn};16use openssh::{ControlPersist, SessionBuilder};17use remowt_client::{AgentBundle, Remowt};17use serde::de::DeserializeOwned;18use remowt_endpoints::fs::FsClient;19use remowt_link_shared::Address;20use remowt_ui_prompt::auto::AutoPrompter;21use remowt_ui_prompt::bifrost::PromptEndpoints;22use remowt_ui_prompt::{PrependSourcePrompter, Source};18use tabled::Tabled;23use tabled::Tabled;19use tempfile::NamedTempFile;24use tempfile::NamedTempFile;20use time::{UtcDateTime, format_description};25use time::UtcDateTime;26use tokio::task::spawn_blocking;21use tracing::warn;27use tracing::{info, warn};222823use crate::{29use crate::fleetdata::{24 command::MyCommand,25 fleetdata::{26 FleetData, FleetSecretData, FleetSecretDistribution, FleetSecretPart, SecretOwner,30 FleetData, FleetSecretData, FleetSecretDistribution, FleetSecretPart, SecretOwner,27 },28};31};293230pub struct FleetConfigInternals {33pub struct FleetConfigInternals {36 /// builtins.currentSystem39 /// builtins.currentSystem37 pub local_system: String,40 pub local_system: String,38 pub data: Arc<FleetData>,41 pub data: Arc<FleetData>,39 pub nix_args: Vec<OsString>,40 /// fleet_config.config42 /// fleet_config.config41 pub config_field: Value,43 pub config_field: Value,42 /// flake.output44 /// flake.output48 pub default_pkgs: Value,50 pub default_pkgs: Value,49 /// inputs.nixpkgs51 /// inputs.nixpkgs50 pub nixpkgs: Value,52 pub nixpkgs: Value,5354 pub local_host: OnceLock<Arc<ConfigHost>>,51}55}525653// TODO: Make field not pub57// TODO: Make field not pub62 }66 }63}67}646865#[derive(Clone, Copy, Debug)]66pub enum EscalationStrategy {67 Sudo,68 Run0,69 Su,70}7172#[derive(Clone, PartialEq, Copy, Debug)]69#[derive(Clone, PartialEq, Copy, Debug)]73pub enum DeployKind {70pub enum DeployKind {74 /// NixOS => NixOS managed by fleet71 /// NixOS => NixOS managed by fleet115112116 // TODO: Move command helpers away with connectivity refactor113 // TODO: Move command helpers away with connectivity refactor117 pub local: bool,114 pub local: bool,118 pub session: OnceLock<Arc<openssh::Session>>,115 pub remowt: OnceLock<Remowt>,116 nix_store: OnceLock<Arc<Store>>,117 nix_plugin: tokio::sync::OnceCell<()>,119}118}120119120const NIX_PLUGIN_ID: u16 = 2;121122fn agents_dir() -> Result<PathBuf> {123 std::env::var_os("REMOWT_AGENTS_DIR")124 .map(PathBuf::from)125 .or_else(|| option_env!("REMOWT_AGENTS_DIR").map(PathBuf::from))126 .ok_or_else(|| {127 anyhow!("no remowt-agents bundle; set REMOWT_AGENTS_DIR to a remowt-agents output")128 })129}130131fn agent_bundle() -> Result<AgentBundle> {132 AgentBundle::from_dir(agents_dir()?)133}134121#[derive(Debug, Clone, Copy)]135#[derive(Debug, Clone, Copy)]122pub enum GenerationStorage {136pub enum GenerationStorage {123 Deployer,137 Deployer,143 #[tabled(rename = "Created at")]157 #[tabled(rename = "Created at")]144 pub datetime: UtcDateTime,158 pub datetime: UtcDateTime,145 #[tabled(format = "{:?}")]159 #[tabled(format = "{:?}")]146 pub store_path: PathBuf,160 pub store_path: Utf8PathBuf,147 #[tabled(skip)]161 #[tabled(skip)]148 pub location: GenerationStorage,162 pub location: GenerationStorage,149}163}153 }167 }154}168}155169156fn parse_generation_line(g: &str) -> Option<Generation> {157 let mut parts = g.split_whitespace();158 let id = parts.next()?;159 let id: u32 = id.parse().ok()?;160 let date = parts.next()?;161 let time = parts.next()?;162 let current = if let Some(current) = parts.next() {163 if current == "(current)" {164 Some(true)165 } else {166 None167 }168 } else {169 Some(false)170 };171 let current = current?;172 if parts.next().is_some() {173 warn!("unexpected text after generation: {g}");174 }175176 let format = format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second]")177 .expect("valid format");178 let datetime = UtcDateTime::parse(&format!("{date} {time}"), &format).ok()?;179180 Some(Generation {181 id,182 current,183 datetime,184 store_path: PathBuf::new(),185 location: GenerationStorage::Machine,186 })187}188// TODO: Move command helpers away with connectivity refactor189impl ConfigHost {170impl ConfigHost {190 pub async fn list_generations(&self, profile: &str) -> Result<Vec<Generation>> {171 pub async fn list_generations(&self, profile: &str) -> Result<Vec<Generation>> {191 let mut cmd = self.cmd("nix-env").await?;172 let plugin_id = self.ensure_nix_plugin().await?;192 cmd.comparg("--profile", format!("/nix/var/nix/profiles/{profile}"))173 let nix = self193 .arg("--list-generations")174 .remowt()194 .env("TZ", "UTC");175 .await?176 .plugin_endpoints::<remowt_fleet::NixClient<_>>(plugin_id);195 // Sudo is required because --list-generations tries to acquire profile lock177 let raw = nix196 let data = cmd.sudo().run_string().await?;178 .list_generations(profile.to_owned())197 let mut generations = data179 .await198 .split('\n')180 .map_err(|e| anyhow!("{e:?}"))?199 .map(|e| e.trim())181 .map_err(|e| anyhow!("{e}"))?;182 raw.into_iter()200 .filter(|&l| !l.is_empty())183 .map(|g| {184 let id: u32 =185 g.id.try_into()201 .filter_map(|g| {186 .with_context(|| format!("generation id {} doesn't fit in u32", g.id))?;202 let generation = parse_generation_line(g);187 let datetime = UtcDateTime::from_unix_timestamp(g.creation_time_unix)203 if generation.is_none() {188 .with_context(|| {204 warn!("bad generation: {g}");189 format!("invalid generation timestamp {}", g.creation_time_unix)205 };190 })?;206 generation191 Ok(Generation {192 id,193 current: g.current,194 datetime,195 store_path: g.store_path,196 location: GenerationStorage::Machine,197 })207 })198 })208 .collect::<Vec<_>>();199 .collect()209 for ele in generations.iter_mut() {210 let mut cmd = self.cmd("readlink").await?;211 cmd.arg("--")212 .arg(format!("/nix/var/nix/profiles/{profile}-{}-link", ele.id));213 let path = cmd.run_string().await?;214 ele.store_path = PathBuf::from(path.trim_end_matches("\n"));215 }216217 Ok(generations)218 }200 }219201220 pub fn set_session_destination(&self, dest: String) {202 pub fn set_session_destination(&self, dest: String) {236 if let Some(kind) = self.deploy_kind.get() {218 if let Some(kind) = self.deploy_kind.get() {237 return Ok(*kind);219 return Ok(*kind);238 }220 }239 let is_fleet_managed = match self.file_exists("/etc/FLEET_HOST").await {221 let remowt = self.remowt().await?;222 let fs = remowt.endpoints::<FsClient<_>>();223 let is_fleet_managed = match fs.file_exists(Utf8PathBuf::from("/etc/FLEET_HOST")).await {240 Ok(v) => v,224 Ok(v) => v,241 Err(e) => {225 Err(e) => {242 bail!("failed to query remote system kind: {e}");226 bail!("failed to query remote system kind: {e}");252 1. manually create /etc/FLEET_HOST file on the target host,236 1. manually create /etc/FLEET_HOST file on the target host,253 2. use ?deploy_kind=fleet host argument if you're upgrading from older version of fleet237 2. use ?deploy_kind=fleet host argument if you're upgrading from older version of fleet254 3. use ?deploy_kind=upgrade_to_fleet if you're upgrading from plain nixos to fleet-managed nixos238 3. use ?deploy_kind=upgrade_to_fleet if you're upgrading from plain nixos to fleet-managed nixos239 for installation use ?deploy_kind=nixos_install / ?deploy_kind=nixos_lustrate 255 "}240 "}256 );241 );257 }242 }258 // TOCTOU is possible243 // TOCTOU is possible259 let _ = self.deploy_kind.set(DeployKind::Fleet);244 let _ = self.deploy_kind.set(DeployKind::Fleet);260 Ok(*self.deploy_kind.get().expect("deploy kind is just set"))245 Ok(*self.deploy_kind.get().expect("deploy kind is just set"))261 }246 }262 pub async fn escalation_strategy(&self) -> Result<EscalationStrategy> {247 async fn connection(&self) -> Result<Remowt> {263 // Prefer sudo, as run0 has some gotchas with polkit248 if let Some(conn) = self.remowt.get() {264 // and too many repeating prompts.265 if (self.find_in_path("sudo").await).is_ok() {266 return Ok(EscalationStrategy::Sudo);249 return Ok(conn.clone());267 }250 }268 if (self.find_in_path("run0").await).is_ok() {251 let bundle = agent_bundle()?;252 let conn = if self.local {269 return Ok(EscalationStrategy::Run0);253 Remowt::connect_local(&bundle)270 }254 .await271 Ok(EscalationStrategy::Su)272 }255 .context("starting local remowt agent")?273 async fn open_session(&self) -> Result<Arc<openssh::Session>> {274 assert!(!self.local, "do not open ssh connection to local session");275 // FIXME: TOCTOU256 } else {276 if let Some(session) = &self.session.get() {257 let dest = self258 .session_destination259 .get()277 return Ok((*session).clone());260 .cloned()261 .unwrap_or_else(|| self.name.clone());262 Remowt::connect(&dest, &bundle)263 .await264 .map_err(|e| anyhow!("remowt error while connecting to {}: {e:#?}", self.name))?278 };265 };279 let mut session = SessionBuilder::default();266 PromptEndpoints(PrependSourcePrompter {267 prompter: AutoPrompter::new().await,268 source: if self.local {269 vec![]270 } else {271 vec![Source(std::borrow::Cow::Owned(format!(272 "ssh host: {}",273 self.name274 )))]275 },276 description: "".to_owned(),277 })278 .register_endpoints(&mut conn.rpc());280 session.control_persist(ControlPersist::ClosedAfterInitialConnection);279 let _ = self.remowt.set(conn);280 Ok(self.remowt.get().expect("just set").clone())281 }281282282 let dest = self.session_destination.get().unwrap_or(&self.name);283 /// Client for this host's unprivileged agent.283 let session = session284 .connect(&dest)285 .await284 pub async fn remowt(&self) -> Result<Remowt> {286 .map_err(|e| anyhow!("ssh error while connecting to {}: {e:#?}", self.name))?;287 let session = Arc::new(session);288 self.session.set(session.clone()).expect("TOCTOU happened");285 Ok(self.connection().await?)289 Ok(session)290 }286 }287291 pub async fn mktemp_dir(&self) -> Result<String> {288 pub fn ensure_nix_plugin(&self) -> Pin<Box<dyn Future<Output = Result<u16>> + Send + '_>> {292 let mut cmd = self.cmd("mktemp").await?;289 Box::pin(async {290 self.nix_plugin291 .get_or_try_init(|| async {292 let pkgs = self.pkgs()?;293 let name = "remowt-plugin-fleet";294 let plugin = nix_go!(pkgs[{ name }]);295 let built = plugin296 .build("out")297 .context("failed to build the fleet nix plugin")?;293 cmd.arg("-d");298 let copied = self299 .remote_derivation(&built)300 .await301 .context("failed to copy the fleet nix plugin to the host store")?;294 let path = cmd.run_string().await?;302 let bin = copied.join("bin/remowt-plugin-fleet");303 self.remowt()304 .await?305 .run0_load_plugin_path(NIX_PLUGIN_ID, bin.as_str())306 .await307 .context("failed to load the fleet nix plugin")?;295 Ok(path.trim_end().to_owned())308 self.remowt()309 .await?310 .rpc()311 .wait_for_connection_to(Address::Plugin(NIX_PLUGIN_ID))312 .await313 .map_err(|e| anyhow!("failed to wait for plugin"))?;314 anyhow::Ok(())315 })316 .await?;317 Ok(NIX_PLUGIN_ID)318 })296 }319 }297 pub async fn file_exists(&self, path: impl AsRef<OsStr>) -> Result<bool> {320298 let mut cmd = self.cmd("sh").await?;321 async fn nix_store(&self) -> Result<Arc<Store>> {299 cmd.arg("-c")300 .arg("test -e \"$1\" && echo true || echo false")301 .arg("_")302 .arg(path);303 cmd.run_value().await304 }305 pub async fn read_file_bin(&self, path: impl AsRef<OsStr>) -> Result<Vec<u8>> {306 let mut cmd = self.cmd("cat").await?;322 if let Some(store) = self.nix_store.get() {307 cmd.arg(path);308 cmd.run_bytes().await309 }310 pub async fn read_file_text(&self, path: impl AsRef<OsStr>) -> Result<String> {311 let mut cmd = self.cmd("cat").await?;312 cmd.arg(path);313 cmd.run_string().await314 }315 pub async fn read_dir(&self, path: impl AsRef<OsStr>) -> Result<Vec<String>> {316 let mut cmd = self.cmd("ls").await?;323 return Ok(store.clone());317 cmd.arg(path);318 let out = cmd.run_string().await?;319 let mut lines = out.split('\n');320 if let Some(last) = lines.next_back() {321 ensure!(last.is_empty(), "output of ls should end with newline");322 }324 }323 Ok(lines.map(ToOwned::to_owned).collect())325 let conn = self.connection().await?;326 let socket = match self.deploy_kind().await? {327 DeployKind::NixosInstall => {328 remowt_fleet::nix_store_socket(conn, "/mnt?require-sigs=false").await?329 }330 _ => remowt_fleet::nix_store_socket(conn, "auto").await?,331 };332 let uri = format!("unix://{}", socket.display());333 let store = Arc::new(Store::open(&uri)?);334 let _ = self.nix_store.set(store);335 Ok(self.nix_store.get().expect("just set").clone())324 }336 }325 #[allow(dead_code)]326 pub async fn read_file_json<D: DeserializeOwned>(&self, path: impl AsRef<OsStr>) -> Result<D> {327 let text = self.read_file_text(path).await?;328 Ok(serde_json::from_str(&text)?)329 }330 pub async fn read_env(&self, env: &str) -> Result<String> {331 let mut cmd = self.cmd("printenv").await?;332 cmd.arg(env);333 cmd.run_string().await334 }335 pub async fn find_in_path(&self, command: &str) -> Result<String> {336 // // `which` is not a part of coreutils, and it might not exist on machine.337 // let path = self.read_env("PATH").await?;338 // // Assuming delimiter is :, we don't work with windows host, this check will be much339 // // more sophisticated in remowt backend (and quicker, since actual PATH search will be done on remote machine)340 // for ele in path.split(':') {341 // let test_path = format!("{ele}/{cmd}");342 // test -x etc343 // }344 // let mut cmd = self.cmd("printenv").await?;345 // cmd.arg(env);346 // Ok(cmd.run_string().await?)347 // Assuming this is an environment issue if which doesn't exist, will be fixed with remowt.348 let mut cmd = self349 .cmd_escalation(350 // Not used351 EscalationStrategy::Su,352 "which",353 )354 .await?;355 cmd.arg(command);356 cmd.run_string().await357 }358 pub async fn read_file_value<D: FromStr>(&self, path: impl AsRef<OsStr>) -> Result<D>359 where360 <D as FromStr>::Err: Display,361 {362 let text = self.read_file_text(path).await?;363 D::from_str(&text).map_err(|e| anyhow!("failed to parse value: {e}"))364 }365 pub async fn cmd(&self, cmd: impl AsRef<OsStr>) -> Result<MyCommand> {366 self.cmd_escalation(self.escalation_strategy().await?, cmd)367 .await368 }369 pub async fn cmd_escalation(370 &self,371 escalation: EscalationStrategy,372 cmd: impl AsRef<OsStr>,373 ) -> Result<MyCommand> {374 if self.local {375 Ok(MyCommand::new(escalation, cmd))376 } else {377 let session = self.open_session().await?;378 Ok(MyCommand::new_on(escalation, cmd, session))379 }380 }381 pub async fn nix_cmd(&self) -> Result<MyCommand> {382 let mut nix = self.cmd("nix").await?;383 nix.args([384 "--extra-experimental-features",385 "nix-command",386 "--extra-experimental-features",387 "flakes",388 ]);389 Ok(nix)390 }391337392 pub async fn decrypt(&self, data: SecretData) -> Result<Vec<u8>> {338 pub async fn decrypt(&self, data: SecretData) -> Result<Vec<u8>> {393 ensure!(data.encrypted, "secret is not encrypted");339 ensure!(data.encrypted, "secret is not encrypted");394 let mut cmd = self.cmd("fleet-install-secrets").await?;340 let remowt = self.remowt().await?;341 let mut cmd = remowt.cmd("fleet-install-secrets");395 cmd.arg("decrypt").eqarg("--secret", data.to_string());342 cmd.arg("decrypt").eqarg("--secret", data.to_string());396 let encoded = cmd343 let encoded = cmd397 .sudo()344 .sudo()434 data: SecretData,381 data: SecretData,435 targets: BTreeSet<SecretOwner>,382 targets: BTreeSet<SecretOwner>,436 ) -> Result<SecretData> {383 ) -> Result<SecretData> {384 let remowt = self.remowt().await?;437 ensure!(data.encrypted, "secret is not encrypted");385 ensure!(data.encrypted, "secret is not encrypted");438 let mut cmd = self.cmd("fleet-install-secrets").await?;386 let mut cmd = remowt.cmd("fleet-install-secrets");439 cmd.arg("reencrypt").eqarg("--secret", data.to_string());387 cmd.arg("reencrypt").eqarg("--secret", data.to_string());440 for target in targets {388 for target in targets {441 let key = self.config.key(&target).await?;389 let key = self.config.key(&target).await?;451 Ok(data)399 Ok(data)452 }400 }453 /// Returns path for futureproofing, as path might change i.e on conversion to CA401 /// Returns path for futureproofing, as path might change i.e on conversion to CA454 pub async fn remote_derivation(&self, path: &PathBuf) -> Result<PathBuf> {402 pub async fn remote_derivation(&self, path: impl AsRef<Utf8Path>) -> Result<Utf8PathBuf> {403 let path = path.as_ref().to_owned();455 if self.local {404 if self.local {456 // Path is located locally, thus already trusted.405 // Path is located locally, thus already trusted.457 return Ok(path.to_owned());406 return Ok(path);458 }407 }459 let mut sign = MyCommand::new(408 let sign: Pin<Box<dyn Future<Output = Result<()>> + Send>> = {460 // TODO: Look at the current escalation strategy.409 let path = path.clone();461 // ... or switch to run0 right after polkit update410 Box::pin(async move {411 let local = self.config.local_host();412 let plugin_id = local.ensure_nix_plugin().await?;462 EscalationStrategy::Sudo,413 let nix = local463 "nix",414 .remowt()464 );465 sign.arg("store")415 .await?466 .arg("sign")416 .plugin_endpoints::<remowt_fleet::NixClient<_>>(plugin_id);467 .comparg("--key-file", "/etc/nix/private-key")417 nix.sign_closure(path, Utf8PathBuf::from("/etc/nix/private-key"))468 .arg("-r")418 .await419 .map_err(|e| anyhow!("{e:?}"))?469 .arg(&path);420 .map_err(|e| anyhow!("{e}"))?;470 if let Err(e) = sign.sudo().run_nix().await {421 Ok(())422 })423 };424 if let Err(e) = sign.await {471 warn!("failed to sign store paths: {e}");425 warn!("failed to sign store paths: {e}");472 }426 }473 let mut nix = MyCommand::new(427 let store = self.nix_store().await?;474 // Not used475 EscalationStrategy::Su,476 "nix",477 );478 nix.arg("copy").arg("--substitute-on-destination");479480 let proto = if self.legacy_ssh_store.get().cloned().unwrap_or(false) {428 {481 "ssh"429 let path = path.clone();482 } else {483 "ssh-ng"484 };485486 match self.deploy_kind().await? {487 DeployKind::Fleet | DeployKind::UpgradeToFleet | DeployKind::NixosLustrate => {430 spawn_blocking(move || nix_eval::copy_closure_to(&store, path.as_ref()))488 nix.comparg("--to", format!("{proto}://{}", self.name));489 }431 .await?490 DeployKind::NixosInstall => {491 nix492 // Signature checking makes no sense with remote-store store argument set, as we're not even interacting with remote nix daemon493 .arg("--no-check-sigs")494 .comparg(432 .context("copying closure to remote store")?;495 "--to",496 format!("{proto}://root@{}?remote-store=/mnt", self.name),497 );498 }499 }433 }500 nix.arg(path);434 Ok(path)501 nix.run_nix().await.context("nix copy")?;502 Ok(path.to_owned())503 }435 }504 pub async fn systemctl_stop(&self, name: &str) -> Result<()> {505 let mut cmd = self.cmd("systemctl").await?;506 cmd.arg("stop").arg(name);507 cmd.sudo().run().await508 }509 pub async fn systemctl_start(&self, name: &str) -> Result<()> {510 let mut cmd = self.cmd("systemctl").await?;511 cmd.arg("start").arg(name);512 cmd.sudo().run().await513 }514515 pub async fn rm_file(&self, path: impl AsRef<OsStr>, sudo: bool) -> Result<()> {516 let mut cmd = self.cmd("rm").await?;517 cmd.arg("-f").arg(path);518 if sudo {519 cmd = cmd.sudo()520 }521 cmd.run().await522 }523}436}524437525struct HostSecretDefinition(Value);438struct HostSecretDefinition(Value);630 }543 }631 Ok(out)544 Ok(out)632 }545 }633 pub fn local_host(&self) -> ConfigHost {546 pub fn local_host(&self) -> Arc<ConfigHost> {634 ConfigHost {547 self.local_host548 .get_or_init(|| {549 Arc::new(ConfigHost {635 config: self.clone(),550 config: self.clone(),636 name: "<virtual localhost>".to_owned(),551 name: "<virtual localhost>".to_owned(),637 host_config: None,552 host_config: None,638 nixos_config: OnceLock::new(),553 nixos_config: OnceLock::new(),639 nixos_unchecked_config: OnceLock::new(),554 nixos_unchecked_config: OnceLock::new(),640 groups: {555 groups: {641 let cell = OnceLock::new();556 let cell = OnceLock::new();642 let _ = cell.set(vec![]);557 let _ = cell.set(vec![]);643 cell558 cell644 },559 },645 pkgs_override: Some(self.default_pkgs.clone()),560 pkgs_override: Some(self.default_pkgs.clone()),646561647 local: true,562 local: true,648 session: OnceLock::new(),563 remowt: OnceLock::new(),649 deploy_kind: OnceLock::new(),564 nix_store: OnceLock::new(),565 nix_plugin: tokio::sync::OnceCell::new(),566 deploy_kind: OnceLock::new(),650 session_destination: OnceLock::new(),567 session_destination: OnceLock::new(),651 legacy_ssh_store: OnceLock::new(),568 legacy_ssh_store: OnceLock::new(),652 }569 })570 })571 .clone()653 }572 }654573655 pub fn preferred_hosts(574 pub fn preferred_hosts(684603685 // TODO: Remove with connectivit refactor604 // TODO: Remove with connectivit refactor686 local: self.localhost == name,605 local: self.localhost == name,687 session: OnceLock::new(),606 remowt: OnceLock::new(),607 nix_store: OnceLock::new(),608 nix_plugin: tokio::sync::OnceCell::new(),688 deploy_kind: OnceLock::new(),609 deploy_kind: OnceLock::new(),689 session_destination: OnceLock::new(),610 session_destination: OnceLock::new(),690 legacy_ssh_store: OnceLock::new(),611 legacy_ssh_store: OnceLock::new(),crates/fleet-base/src/keys.rsdiffbeforeafterboth31 } else {31 } else {32 warn!("Loading key for {}", host);32 warn!("Loading key for {}", host);33 let host = self.host(host)?;33 let host = self.host(host)?;34 let mut cmd = host.cmd("cat").await?;34 let remowt = host.remowt().await?;35 let mut cmd = remowt.cmd("cat");35 cmd.arg("/etc/ssh/ssh_host_ed25519_key.pub");36 cmd.arg("/etc/ssh/ssh_host_ed25519_key.pub");36 let key = cmd.run_string().await?;37 let key = cmd.run_string().await?;37 self.update_key(&host.name, key.clone());38 self.update_key(&host.name, key.clone());crates/fleet-base/src/lib.rsdiffbeforeafterboth1pub mod command;2pub mod deploy;1pub mod deploy;3pub mod fleetdata;2pub mod fleetdata;4pub mod host;3pub mod host;5mod keys;4mod keys;6pub mod opts;5pub mod opts;7pub mod primops;6pub mod primops;8pub mod secret_storage;97crates/fleet-base/src/opts.rsdiffbeforeafterboth1use std::{1use std::{2 collections::{BTreeMap, BTreeSet},2 collections::{BTreeMap, BTreeSet},3 env::current_dir,3 env::current_dir,4 ffi::OsString,5 str::FromStr,4 str::FromStr,6 sync::{Arc, Mutex},5 sync::{Arc, OnceLock},7};6};879use anyhow::{Context, Result, bail};8use anyhow::{Context, Result, bail};196 }195 }197196198 // TODO: Config should be detached from opts.197 // TODO: Config should be detached from opts.199 pub fn build(&self, nix_args: Vec<OsString>, assert: bool) -> Result<Config> {198 pub fn build(&self, assert: bool) -> Result<Config> {200 let cwd = current_dir()?;199 let cwd = current_dir()?;201 let mut directory = cwd.clone();200 let mut directory = cwd.clone();202 let mut fleet_data_path = directory.join("fleet.nix");201 let mut fleet_data_path = directory.join("fleet.nix");274 data,273 data,275 flake_outputs: flake,274 flake_outputs: flake,276 local_system: self.local_system.clone(),275 local_system: self.local_system.clone(),277 nix_args,278 config_field,276 config_field,279 default_pkgs,277 default_pkgs,280 nixpkgs,278 nixpkgs,281 localhost: self.localhost.to_owned(),279 localhost: self.localhost.to_owned(),280 local_host: OnceLock::new(),282 }));281 }));283282284 PRIMOPS_DATA283 PRIMOPS_DATAcrates/fleet-base/src/primops.rsdiffbeforeafterboth1use std::collections::{BTreeMap, BTreeSet, HashMap};1use std::collections::{BTreeMap, BTreeSet, HashMap};2use std::sync::OnceLock;2use std::sync::{Arc, OnceLock};334use anyhow::{Context, bail, ensure};4use anyhow::{Context, bail, ensure};5use fleet_shared::SecretData;5use fleet_shared::SecretData;6use itertools::Itertools;6use itertools::Itertools;7use nix_eval::{NativeFn, Value, await_in_nix, nix_go, nix_go_json};7use nix_eval::{NativeFn, Value, await_in_nix, nix_go, nix_go_json};8use remowt_endpoints::fs::FsClient;9use remowt_link_shared::BifConfig;8use serde::Deserialize;10use serde::Deserialize;9use tracing::{info, warn};11use tracing::{info, warn};101228 let pkgs = host_on.pkgs()?;30 let pkgs = host_on.pkgs()?;29 let default_mk_secret_generators = nix_go!(pkgs.mkSecretGenerators);31 let default_mk_secret_generators = nix_go!(pkgs.mkSecretGenerators);30 let generators = nix_go!(default_mk_secret_generators(Obj { recipients }));32 let generators = nix_go!(default_mk_secret_generators(Obj { recipients }));31 Ok(pkgs.clone().attrs_update(generators)?)33 pkgs.clone().attrs_update(generators)32}34}33pub fn get_default_pkgs_and_generators(config: &Config) -> Result<Value> {35pub fn get_default_pkgs_and_generators(config: &Config) -> Result<Value> {34 let host_on = config.local_host();36 let host_on = config.local_host();91 let impure_on: Option<String> = nix_go_json!(default_generator_drv.impureOn);93 let impure_on: Option<String> = nix_go_json!(default_generator_drv.impureOn);929493 let host_on = if let Some(on) = &impure_on {95 let host_on = if let Some(on) = &impure_on {96 Arc::new(94 config97 config95 .host(on)98 .host(on)96 .context("failed to get secret generation target host")?99 .context("failed to get secret generation target host")?,100 )97 } else {101 } else {98 config.local_host()102 config.local_host()99 };103 };104105 let remowt = host_on.remowt().await?;106 let fs = remowt.endpoints::<FsClient<BifConfig>>();107100 let mut recipients = Vec::new();108 let mut recipients = Vec::new();101 for owner in &expectations.owners {109 for owner in &expectations.owners {116 .context("failed to copy generator to target host")?;124 .context("failed to copy generator to target host")?;117125118 // TODO: Remove destdir after everything is done126 // TODO: Remove destdir after everything is done119 let out_parent = host_on127 let out_parent = fs120 .mktemp_dir()128 .mktemp_dir()129 .await121 .await130 .map_err(|e| anyhow!("{e:?}"))122 .context("failed to prepare generator output dir on target host")?;131 .context("failed to prepare generator output dir on target host")?;123 let out = format!("{out_parent}/out");132 let out = out_parent.join("out");124 let mut generator_cmd = host_on.cmd(generator).await?;133 let mut generator_cmd = remowt.cmd(generator);125 generator_cmd.env("out", &out);134 generator_cmd.env("out", &out);126 if impure_on.is_none() {135 if impure_on.is_none() {127 let project_path: String = config136 let project_path: String = config138 .context("failed to run impure generator")?;147 .context("failed to run impure generator")?;139148140 {149 {141 let marker = host_on.read_file_text(format!("{out}/marker")).await?;150 let marker = fs.read_file_text(out.join("marker")).await?;142 ensure!(151 ensure!(143 marker == "SUCCESS",152 marker == "SUCCESS",144 "impure generator ended prematurely, secret generation failed"153 "impure generator ended prematurely, secret generation failed"147156148 let mut missing_parts = expectations.parts.clone();157 let mut missing_parts = expectations.parts.clone();149 let mut parts = BTreeMap::new();158 let mut parts = BTreeMap::new();150 for part in host_on.read_dir(&out).await? {159 for part in fs.read_dir(&out).await? {160 let part = part.into_string();151 if part == "created_at" || part == "expires_at" || part == "marker" {161 if part == "created_at" || part == "expires_at" || part == "marker" {152 continue;162 continue;153 }163 }154 let Some(part_def) = missing_parts.remove(&part) else {164 let Some(part_def) = missing_parts.remove(&part) else {155 bail!("secret generator has produced an unexpected part: {part}");165 bail!("secret generator has produced an unexpected part: {part}");156 };166 };157 let contents: SecretData = host_on167 let contents: SecretData = fs158 .read_file_text(format!("{out}/{part}"))168 .read_file_text(out.join("part"))159 .await?169 .await?160 .parse()170 .parse()161 .map_err(|e| anyhow!("failed to decode secret {out:?} part {part:?}: {e}"))?;171 .map_err(|e| anyhow!("failed to decode secret {out:?} part {part:?}: {e}"))?;178 );188 );179 }189 }180190181 let created_at = host_on.read_file_value(format!("{out}/created_at")).await?;191 let created_at = fs.read_file_value(out.join("created_at")).await??;182 let expires_at = host_on192 let expires_at = match fs.read_file_value(out.join("expires_at")).await {183 .read_file_value(format!("{out}/expires_at"))193 Ok(v) => Some(v?),184 .await194 Err(remowt_endpoints::fs::Error::NotFound) => None,185 .ok();195 Err(e) => return Err(e.into()),196 };186197187 let new_data = FleetSecretData {198 let new_data = FleetSecretData {188 created_at,199 created_at,crates/fleet-base/src/secret_storage.rsdiffbeforeafterbothno changes
crates/nix-eval/Cargo.tomldiffbeforeafterboth10nixlike.workspace = true10nixlike.workspace = true11serde = { workspace = true, features = ["derive"] }11serde = { workspace = true, features = ["derive"] }12serde_json.workspace = true12serde_json.workspace = true13thiserror.workspace = true13tracing.workspace = true1414tracing.workspace = true15camino = { workspace = true, features = ["serde1"] }1516cxx.workspace = true16cxx.workspace = true17futures.workspace = true17itertools.workspace = true18itertools.workspace = true18test-log.workspace = true19test-log.workspace = true19tokio.workspace = true20tokio.workspace = truecrates/nix-eval/src/drv.rsdiffbeforeafterboth66#[derive(Debug, Deserialize)]66#[derive(Debug, Deserialize)]67pub struct DrvParsed {67pub struct DrvParsed {68 pub inputs: DrvInputs,68 pub inputs: DrvInputs,69 pub outputs: HashMap<String, serde_json::Value>,69 pub outputs: HashMap<String, DrvParsedOutput>,70}70}7172#[derive(Debug, Deserialize)]73pub struct DrvParsedOutput {74 #[serde(default)]75 pub path: Option<String>,76}717772#[derive(Debug, Deserialize)]78#[derive(Debug, Deserialize)]73pub struct DrvInputs {79pub struct DrvInputs {82 pub outputs: Vec<String>,88 pub outputs: Vec<String>,83}89}849085#[derive(Debug)]91#[derive(Debug, Clone)]86pub struct DrvGraph {92pub struct DrvGraph {87 pub root: String,93 pub root: String,88 pub nodes: HashMap<String, DrvNode>,94 pub nodes: HashMap<String, DrvNode>,89}95}909691#[derive(Debug)]97#[derive(Debug, Clone)]92pub struct DrvNode {98pub struct DrvNode {93 pub name: String,99 pub name: String,94 pub input_drvs: HashMap<String, Vec<String>>,100 pub input_drvs: HashMap<String, Vec<String>>,95 pub input_srcs: Vec<String>,101 pub input_srcs: Vec<String>,102 // TODO: CA outputs without a known paths are skipped96 pub outputs: Vec<String>,103 pub outputs: HashMap<String, String>,97}104}9810599impl DrvGraph {106impl DrvGraph {124 }131 }125 }132 }133134 let outputs: HashMap<String, String> = parsed135 .outputs136 .into_iter()137 .filter_map(|(name, out)| out.path.map(|p| (name, to_absolute_store_path(&sd, &p))))138 .collect();126139127 nodes.insert(140 nodes.insert(128 path.clone(),141 path.clone(),129 DrvNode {142 DrvNode {130 name: extract_drv_name(&path),143 name: extract_drv_name(&path),131 input_drvs,144 input_drvs,132 input_srcs: parsed.inputs.srcs,145 input_srcs: parsed.inputs.srcs,133 outputs: parsed.outputs.into_keys().collect(),146 outputs,134 },147 },135 );148 );136 }149 }137150138 Ok(Self { root, nodes })151 Ok(Self { root, nodes })139 }152 }153154 pub fn wanted_outputs(&self, root_outputs: &[String]) -> HashMap<String, Vec<String>> {155 let mut wanted: HashMap<String, HashSet<String>> = HashMap::new();156 wanted.insert(self.root.clone(), root_outputs.iter().cloned().collect());157158 let mut queue: VecDeque<String> = VecDeque::new();159 queue.push_back(self.root.clone());160 while let Some(path) = queue.pop_front() {161 let Some(node) = self.nodes.get(&path) else {162 continue;163 };164 for (dep_path, dep_outputs) in &node.input_drvs {165 let entry = wanted.entry(dep_path.clone()).or_default();166 let mut changed = false;167 for o in dep_outputs {168 if entry.insert(o.clone()) {169 changed = true;170 }171 }172 if changed {173 queue.push_back(dep_path.clone());174 }175 }176 }177178 wanted179 .into_iter()180 .map(|(k, v)| {181 let mut v: Vec<_> = v.into_iter().collect();182 v.sort();183 (k, v)184 })185 .collect()186 }140}187}141188142fn extract_drv_name(drv_path: &str) -> String {189fn extract_drv_name(drv_path: &str) -> String {crates/nix-eval/src/lib.ccdiffbeforeafterboth1#include "nix-eval/src/lib.rs"1#include "nix-eval/src/lib.rs"2#include "lib.hh"2#include "lib.hh"3#include <nix/fetchers/fetch-settings.hh>3#include <nix/fetchers/fetch-settings.hh>4#include <nix/store/build-result.hh>5#include <nix/store/content-address.hh>6#include <nix/store/derived-path.hh>7#include <nix/store/local-fs-store.hh>8#include <nix/store/outputs-spec.hh>9#include <nix/store/path-info.hh>10#include <nix/store/profiles.hh>11#include <nix/store/realisation.hh>12#include <nix/store/store-api.hh>13#include <nix/util/file-system.hh>14#include <nix/util/hash.hh>15#include <nix/util/posix-source-accessor.hh>4#include <nix/util/ref.hh>16#include <nix/util/ref.hh>17#include <nix/util/signature/local-keys.hh>18#include <nix/util/signature/signer.hh>19#include <nix/util/source-path.hh>5#include <nix_api_fetchers.h>20#include <nix_api_fetchers.h>21#include <nix_api_store_internal.h>22#include <sstream>6237struct nix_fetchers_settings {24struct nix_fetchers_settings {8 nix::ref<nix::fetchers::Settings> settings;25 nix::ref<nix::fetchers::Settings> settings;16}33}17}34}3536rust::String switch_profile(Store *store, rust::Str profile,37 rust::Str store_path) {38 try {39 auto nixStore = store->ptr;40 auto *lfs = dynamic_cast<nix::LocalFSStore *>(&*nixStore);41 if (!lfs)42 return rust::String("destination is not a local-fs store");43 auto path = nixStore->parseStorePath(std::string(store_path));44 std::filesystem::path prof = std::string(profile);45 auto gen = nix::createGeneration(*lfs, prof, path);46 nix::switchLink(prof, gen);47 return rust::String();48 } catch (const std::exception &e) {49 return rust::String(e.what());50 }51}5253rust::String sign_closure(Store *store, rust::Str store_path,54 rust::Str key_file) {55 try {56 auto nixStore = store->ptr;57 nix::LocalSigner signer(58 nix::SecretKey::parse(nix::readFile(std::string(key_file))));59 auto root = nixStore->parseStorePath(std::string(store_path));60 nix::StorePathSet closure;61 nixStore->computeFSClosure(root, closure);62 for (auto &p : closure) {63 auto info = nixStore->queryPathInfo(p);64 nix::ValidPathInfo info2(*info);65 info2.sign(*nixStore, signer);66 nixStore->addSignatures(p, info2.sigs);67 }68 return rust::String();69 } catch (const std::exception &e) {70 return rust::String(e.what());71 }72}7374CxxListGenerationsResult list_generations(rust::Str profile_path) {75 CxxListGenerationsResult out{rust::String(), {}};76 try {77 auto [gens, current] =78 nix::findGenerations(std::filesystem::path(std::string(profile_path)));79 for (auto &g : gens) {80 CxxProfileGeneration cg{};81 cg.id = g.number;82 cg.store_path = rust::String(g.path.string());83 cg.creation_time_unix = static_cast<int64_t>(g.creationTime);84 cg.current = current.has_value() && *current == g.number;85 out.generations.push_back(cg);86 }87 } catch (const std::exception &e) {88 out.error = rust::String(e.what());89 }90 return out;91}9293static std::vector<std::string> split_lines(rust::Str joined) {94 std::vector<std::string> out;95 std::string buf;96 std::istringstream iss((std::string(joined)));97 while (std::getline(iss, buf)) {98 if (!buf.empty())99 out.push_back(buf);100 }101 return out;102}103104CxxBuildResult build_drv_outputs(Store *store, rust::Str drv_path,105 // TODO: Vec<str>106 rust::Str output_names_joined) {107 CxxBuildResult res{rust::String(), {}};108 try {109 auto nixStore = store->ptr;110 auto sp = nixStore->parseStorePath(std::string(drv_path));111112 nix::DerivedPath::Built built{113 .drvPath = nix::makeConstantStorePathRef(sp),114 .outputs = nix::OutputsSpec{nix::OutputsSpec::All{}},115 };116 auto names = split_lines(output_names_joined);117 if (!names.empty()) {118 std::set<nix::OutputName, std::less<>> nameSet;119 for (auto &n : names)120 nameSet.insert(n);121 built.outputs =122 nix::OutputsSpec{nix::OutputsSpec::Names{std::move(nameSet)}};123 }124125 std::vector<nix::DerivedPath> reqs;126 reqs.push_back(built);127128 auto results = nixStore->buildPathsWithResults(reqs);129 for (auto &r : results) {130 if (auto *failure = r.tryGetFailure()) {131 res.error = rust::String(failure->what());132 return res;133 }134 }135 for (auto &r : results) {136 if (auto *success = r.tryGetSuccess()) {137 for (auto &[name, real] : success->builtOutputs) {138 res.outputs.push_back(139 rust::String(nixStore->printStorePath(real.outPath)));140 }141 }142 }143 } catch (const std::exception &e) {144 res.error = rust::String(e.what());145 }146 return res;147}148149CxxBuildResult substitute_paths(Store *store, rust::Str paths_joined) {150 CxxBuildResult res{rust::String(), {}};151 try {152 auto nixStore = store->ptr;153 auto paths = split_lines(paths_joined);154155 std::vector<nix::DerivedPath> reqs;156 reqs.reserve(paths.size());157 for (auto &p : paths) {158 reqs.push_back(nix::DerivedPath::Opaque{nixStore->parseStorePath(p)});159 }160161 // Substituter miss will cause scheduler to trigger build162 auto results = nixStore->buildPathsWithResults(reqs);163 for (auto &r : results) {164 if (r.tryGetSuccess() == nullptr)165 continue;166 if (auto *opaque = std::get_if<nix::DerivedPath::Opaque>(&r.path.raw())) {167 res.outputs.push_back(168 rust::String(nixStore->printStorePath(opaque->path)));169 }170 }171 } catch (const std::exception &e) {172 res.error = rust::String(e.what());173 }174 return res;175}176177bool is_valid_path(Store *store, rust::Str path) {178 try {179 auto nixStore = store->ptr;180 auto sp = nixStore->parseStorePath(std::string(path));181 return nixStore->isValidPath(sp);182 } catch (const std::exception &) {183 return false;184 }185}186187AddFileToStoreResult add_file_to_store(Store *store, rust::Str name,188 rust::Str path) {189 AddFileToStoreResult out{rust::String(), rust::String(), rust::String()};190 try {191 auto nixStore = store->ptr;192 auto src = nix::PosixSourceAccessor::createAtRoot(193 std::filesystem::path(std::string(path)));194 auto info = nixStore->addToStoreSlow(std::string(name), src,195 nix::ContentAddressMethod::Raw::Flat,196 nix::HashAlgorithm::SHA256);197 out.store_path = rust::String(nixStore->printStorePath(info.path));198 if (info.ca.has_value()) {199 out.hash =200 rust::String(info.ca->hash.to_string(nix::HashFormat::SRI, true));201 }202 } catch (const std::exception &e) {203 out.error = rust::String(e.what());204 }205 return out;206}18207crates/nix-eval/src/lib.hhdiffbeforeafterboth1#pragma once1#pragma once2#include "rust/cxx.h"2#include <nix_api_fetchers.h>3#include <nix_api_fetchers.h>45struct Store;67struct AddFileToStoreResult;8struct CxxBuildResult;394extern "C" {10extern "C" {5void set_fetcher_setting(nix_fetchers_settings *settings, const char *setting,11void set_fetcher_setting(nix_fetchers_settings *settings, const char *setting,6 const char *value);12 const char *value);7}13}1415rust::String switch_profile(Store *store, rust::Str profile,16 rust::Str store_path);1718rust::String sign_closure(Store *store, rust::Str store_path,19 rust::Str key_file);2021struct CxxListGenerationsResult;22CxxListGenerationsResult list_generations(rust::Str profile_path);2324AddFileToStoreResult add_file_to_store(Store *store, rust::Str name,25 rust::Str path);2627CxxBuildResult build_drv_outputs(Store *store, rust::Str drv_path,28 rust::Str output_names_joined);2930CxxBuildResult substitute_paths(Store *store, rust::Str paths_joined);3132bool is_valid_path(Store *store, rust::Str path);833crates/nix-eval/src/lib.rsdiffbeforeafterboth1use std::borrow::Cow;1use std::borrow::Cow;2use std::cell::RefCell;2use std::cell::RefCell;3use std::collections::HashMap;3use std::ffi::{CStr, CString, c_char, c_int, c_uint, c_void};4use std::ffi::{CStr, CString, c_char, c_int, c_uint, c_void};4use std::ptr::{null, null_mut};5use std::ptr::{null, null_mut};5use std::sync::{Arc, LazyLock, OnceLock};6use std::sync::{Arc, LazyLock, OnceLock};6use std::{array, fmt, slice};7use std::{array, fmt, slice};7use std::{collections::HashMap, path::PathBuf};889use anyhow::{Context, anyhow, bail};9use anyhow::{Context, anyhow, bail};10use camino::{Utf8Path, Utf8PathBuf};10use itertools::Itertools;11use itertools::Itertools;11use serde::Serialize;12use serde::Serialize;12use serde::de::DeserializeOwned;13use serde::de::DeserializeOwned;38 make_attrs, make_bindings_builder, make_list, make_list_builder, realised_string,39 make_attrs, make_bindings_builder, make_list, make_list_builder, realised_string,39 realised_string_free, realised_string_get_buffer_size, realised_string_get_buffer_start,40 realised_string_free, realised_string_get_buffer_size, realised_string_get_buffer_start,40 realised_string_get_store_path, realised_string_get_store_path_count, register_primop,41 realised_string_get_store_path, realised_string_get_store_path_count, register_primop,41 set_err_msg, setting_set, state_free, store_open, store_parse_path, store_path_free,42 set_err_msg, setting_set, state_free, store_copy_closure, store_free, store_open,42 store_path_name, string_realise, value, value_call, value_decref, value_force, value_incref,43 store_parse_path, store_path_free, store_path_name, string_realise, value, value_call,44 value_decref, value_force, value_incref,43};45};47pub mod logging;49pub mod logging;48#[doc(hidden)]50#[doc(hidden)]49pub mod macros;51pub mod macros;52pub mod scheduler;505351#[doc(hidden)]54#[doc(hidden)]52pub mod __macro_support {55pub mod __macro_support {68}71}69#[cxx::bridge]72#[cxx::bridge]70pub mod nix_cxx {73pub mod nix_cxx {74 struct AddFileToStoreResult {75 error: String,76 store_path: String,77 hash: String,78 }79 struct CxxProfileGeneration {80 id: u64,81 store_path: String,82 creation_time_unix: i64,83 current: bool,84 }85 struct CxxListGenerationsResult {86 error: String,87 generations: Vec<CxxProfileGeneration>,88 }89 struct CxxBuildResult {90 error: String,91 outputs: Vec<String>,92 }71 unsafe extern "C++" {93 unsafe extern "C++" {72 type nix_fetchers_settings;94 type nix_fetchers_settings;95 type Store;73 include!("nix-eval/src/lib.hh");96 include!("nix-eval/src/lib.hh");749775 #[allow(clippy::missing_safety_doc)]98 #[allow(clippy::missing_safety_doc)]79 value: *const c_char,102 value: *const c_char,80 );103 );104105 #[allow(clippy::missing_safety_doc)]106 unsafe fn switch_profile(store: *mut Store, profile: &str, store_path: &str) -> String;107108 #[allow(clippy::missing_safety_doc)]109 unsafe fn sign_closure(store: *mut Store, store_path: &str, key_file: &str) -> String;110111 #[allow(clippy::missing_safety_doc)]112 unsafe fn add_file_to_store(113 store: *mut Store,114 name: &str,115 path: &str,116 ) -> AddFileToStoreResult;117118 fn list_generations(profile_path: &str) -> CxxListGenerationsResult;119120 #[allow(clippy::missing_safety_doc)]121 unsafe fn build_drv_outputs(122 store: *mut Store,123 drv_path: &str,124 output_names_joined: &str,125 ) -> CxxBuildResult;126127 #[allow(clippy::missing_safety_doc)]128 unsafe fn substitute_paths(store: *mut Store, paths_joined: &str) -> CxxBuildResult;129130 #[allow(clippy::missing_safety_doc)]131 unsafe fn is_valid_path(store: *mut Store, path: &str) -> bool;81 }132 }82}133}83134186 unsafe { set_err_msg(self.0, err as c_int, msg.as_ptr()) };237 unsafe { set_err_msg(self.0, err as c_int, msg.as_ptr()) };187 }238 }188 pub fn set_err(&mut self, err: anyhow::Error) {239 pub fn set_err(&mut self, err: anyhow::Error) {189 let mut fmt = format!("{err:?}").replace("\0", "\\0");240 let fmt = format!("{err:?}").replace("\0", "\\0");190 self.set_err_raw(241 self.set_err_raw(191 NixErrorKind::Generic,242 NixErrorKind::Generic,192 &CString::new(fmt).expect("NUL bytes were just replaced"),243 &CString::new(fmt).expect("NUL bytes were just replaced"),352 with_default_context(|c, _| unsafe { setting_set(c, s.as_ptr(), v.as_ptr()) }).map(|_| ())403 with_default_context(|c, _| unsafe { setting_set(c, s.as_ptr(), v.as_ptr()) }).map(|_| ())353}404}405406#[instrument(skip(dst))]407pub fn copy_closure_to(dst: &Store, path: &Utf8Path) -> Result<()> {408 let path_c = CString::new(path.as_str())?;409 with_store_context(|c, src_store, _state| -> Result<()> {410 let sp = unsafe { store_parse_path(c, src_store, path_c.as_ptr()) };411 if sp.is_null() {412 bail!("failed to parse store path {path}");413 }414 let rc = unsafe { store_copy_closure(c, src_store, dst.0, sp) };415 unsafe { store_path_free(sp) };416 if rc != nix_raw::err_NIX_OK {417 bail!("store_copy_closure failed (code {rc})");418 }419 Ok(())420 })?421}422423#[instrument]424pub fn switch_profile(profile: &str, store_path: &Utf8Path) -> Result<()> {425 let msg = with_store_context(|_c, store, _state| unsafe {426 nix_cxx::switch_profile(store.cast(), profile, store_path.as_str())427 })?428 .to_string();429 if msg.is_empty() {430 Ok(())431 } else {432 bail!("failed to switch profile {profile}: {msg}");433 }434}435436// TODO: fleet operator-managed key file437#[instrument]438pub fn sign_closure(store_path: &str, key_file: &str) -> Result<()> {439 let msg = with_store_context(|_c, store, _state| unsafe {440 nix_cxx::sign_closure(store.cast(), store_path, key_file)441 })?442 .to_string();443 if msg.is_empty() {444 Ok(())445 } else {446 bail!("failed to sign {store_path}: {msg}");447 }448}449450#[derive(Debug)]451pub struct AddedFile {452 pub store_path: Utf8PathBuf,453 pub hash: String,454}455456#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]457pub struct ProfileGeneration {458 pub id: u64,459 pub store_path: Utf8PathBuf,460 pub creation_time_unix: i64,461 pub current: bool,462}463464#[instrument]465pub fn list_generations(profile_path: &str) -> Result<Vec<ProfileGeneration>> {466 let res = nix_cxx::list_generations(profile_path);467 if !res.error.is_empty() {468 bail!(469 "failed to list generations at {profile_path}: {}",470 res.error471 );472 }473 Ok(res474 .generations475 .into_iter()476 .map(|g| ProfileGeneration {477 id: g.id,478 store_path: Utf8PathBuf::from(g.store_path),479 creation_time_unix: g.creation_time_unix,480 current: g.current,481 })482 .collect())483}484485#[instrument]486pub fn add_file_to_store(name: &str, path: &Utf8Path) -> Result<AddedFile> {487 let res = with_store_context(|_c, store, _state| unsafe {488 nix_cxx::add_file_to_store(store.cast(), name, path.as_str())489 })?;490 if !res.error.is_empty() {491 bail!("failed to add {path} to store: {}", res.error);492 }493 Ok(AddedFile {494 store_path: Utf8PathBuf::from(res.store_path),495 hash: res.hash,496 })497}498499pub fn build_drv_outputs(drv_path: &str, output_names: &[String]) -> Result<Vec<String>> {500 let joined = output_names.join("\n");501 let res = with_store_context(|_c, store, _state| unsafe {502 nix_cxx::build_drv_outputs(store.cast(), drv_path, &joined)503 })?;504 if !res.error.is_empty() {505 bail!("build of {drv_path} failed: {}", res.error);506 }507 Ok(res.outputs)508}509510pub fn substitute_paths(paths: &[String]) -> Result<Vec<String>> {511 let joined = paths.join("\n");512 let res = with_store_context(|_c, store, _state| unsafe {513 nix_cxx::substitute_paths(store.cast(), &joined)514 })?;515 if !res.error.is_empty() {516 warn!("substitute_paths reported: {}", res.error);517 }518 Ok(res.outputs)519}520521pub fn is_valid_path(path: &str) -> Result<bool> {522 with_store_context(|_c, store, _state| unsafe { nix_cxx::is_valid_path(store.cast(), path) })523}354524355pub struct FetchSettings(*mut fetchers_settings);525pub struct FetchSettings(*mut fetchers_settings);356impl FetchSettings {526impl FetchSettings {450 unsafe { *user_data.cast::<String>() = s.to_owned() };620 unsafe { *user_data.cast::<String>() = s.to_owned() };451}621}452622453struct Store(*mut c_store);623pub struct Store(*mut c_store);454unsafe impl Send for Store {}624unsafe impl Send for Store {}455unsafe impl Sync for Store {}625unsafe impl Sync for Store {}456626457impl Store {627impl Store {628 pub fn open(uri: &str) -> Result<Self> {629 let uri = CString::new(uri)?;630 let ptr = with_default_context(|c, _| unsafe { store_open(c, uri.as_ptr(), null_mut()) })?;631 if ptr.is_null() {632 bail!("failed to open store");633 }634 Ok(Store(ptr))635 }636458 fn parse_path(&self, path: &CStr) -> Result<StorePath> {637 fn parse_path(&self, path: &CStr) -> Result<StorePath> {459 with_default_context(|c, _| {638 with_default_context(|c, _| {460 StorePath(unsafe { store_parse_path(c, self.0, path.as_ptr()) })639 StorePath(unsafe { store_parse_path(c, self.0, path.as_ptr()) })461 })640 })462 }641 }463}642}643impl Drop for Store {644 fn drop(&mut self) {645 unsafe { store_free(self.0) }646 }647}464648465#[repr(transparent)]649#[repr(transparent)]466pub struct EvalState(*mut c_eval_state);650pub struct EvalState(*mut c_eval_state);858 Ok(out)1042 Ok(out)859 }1043 }860 #[instrument(name = "build", skip(self), fields(output))]1044 #[instrument(name = "build", skip(self), fields(output))]861 pub fn build(&self, output: &str) -> Result<PathBuf> {1045 pub fn build(&self, output: &str) -> Result<Utf8PathBuf> {862 if !self.is_derivation() {1046 if !self.is_derivation() {863 bail!("expected derivation to build")1047 bail!("expected derivation to build")864 }1048 }880 .get_field("drvPath")1064 .get_field("drvPath")881 .context("getting drvPath")?1065 .context("getting drvPath")?882 .to_string()?;1066 .to_string()?;883 let graph = drv::DrvGraph::resolve(&drv_path)?;1067 let graph = Arc::new(drv::DrvGraph::resolve(&drv_path)?);884 let _guard = logging::register_build_graph(&Span::current(), &graph);1068 let _guard = logging::register_build_graph(&Span::current(), &graph);8851069886 // to_string here blocks until the path is built1070 scheduler::build_graph_sync(graph.clone(), vec![output.to_owned()])?;1071887 let s = v.builtin_to_string()?;1072 let s = v.builtin_to_string()?;888 let rs = s.to_realised_string()?;1073 let rs = s.to_realised_string()?;889 let out_path = rs.as_str().to_owned();1074 let out_path = rs.as_str().to_owned();890 Ok(PathBuf::from(out_path))1075 Ok(Utf8PathBuf::from(out_path))891 }1076 }892 pub fn as_json<T: DeserializeOwned>(&self) -> Result<T> {1077 pub fn as_json<T: DeserializeOwned>(&self) -> Result<T> {893 let to_json = Self::eval("builtins.toJSON")?;1078 let to_json = Self::eval("builtins.toJSON")?;crates/nix-eval/src/logging.ccdiffbeforeafterboth969697extern "C" {97extern "C" {98void apply_tracing_logger() {98void apply_tracing_logger() {99 auto old = logger;99 logger = std::make_unique<TracingLogger>();100 logger = new TracingLogger();101 delete old;100 // verbosity = lvlVomit;102 // verbosity = lvlVomit;101}103}102rust::Box<ErrorInfoBuilder>104rust::Box<ErrorInfoBuilder>crates/nix-eval/src/logging.rsdiffbeforeafterboth499 } else if level == Level::INFO {499 } else if level == Level::INFO {500 info!(target: "nix", "{}", s)500 info!(target: "nix", "{}", s)501 } else if level == Level::DEBUG {501 } else if level == Level::DEBUG {502 if s != "querying info about missing paths" {502 debug!(target: "nix", "{}", s)503 debug!(target: "nix", "{}", s)503 } else {504 }505 } else {504 trace!(target: "nix", "{}", s)506 trace!(target: "nix", "{}", s)505 }507 }583 } else if level == Level::INFO {585 } else if level == Level::INFO {584 info!(target: "nix", "{v}")586 info!(target: "nix", "{v}")585 } else if level == Level::DEBUG {587 } else if level == Level::DEBUG {588 if v != "querying info about missing paths" {586 debug!(target: "nix", "{v}")589 debug!(target: "nix", "{v}")587 } else {590 }591 } else {588 trace!(target: "nix", "{v}")592 trace!(target: "nix", "{v}")589 }593 }crates/nix-eval/src/scheduler.rsdiffbeforeafterbothno changes
crates/nixlike/Cargo.tomldiffbeforeafterboth11linked-hash-map.workspace = true11linked-hash-map.workspace = true12peg.workspace = true12peg.workspace = true13serde.workspace = true13serde.workspace = true14serde-transcode.workspace = true15serde_json.workspace = true1614crates/remowt-fleet/Cargo.tomldiffbeforeafterbothno changes
crates/remowt-fleet/src/lib.rsdiffbeforeafterbothno changes
flake.lockdiffbeforeafterboth2 "nodes": {2 "nodes": {3 "crane": {3 "crane": {4 "locked": {4 "locked": {5 "lastModified": 1773189535,5 "lastModified": 1780532242,6 "owner": "ipetkov",6 "owner": "ipetkov",7 "repo": "crane",7 "repo": "crane",8 "rev": "6fa2fb4cf4a89ba49fc9dd5a3eb6cde99d388269",8 "rev": "59a82a1222dd3b2080b5cc52a1a2e8d5f1b77f37",9 "type": "github"9 "type": "github"10 },10 },11 "original": {11 "original": {37 ]37 ]38 },38 },39 "locked": {39 "locked": {40 "lastModified": 1772408722,40 "lastModified": 1778716662,41 "owner": "hercules-ci",41 "owner": "hercules-ci",42 "repo": "flake-parts",42 "repo": "flake-parts",43 "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",43 "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",44 "type": "github"44 "type": "github"45 },45 },46 "original": {46 "original": {62 ]62 ]63 },63 },64 "locked": {64 "locked": {65 "lastModified": 1759080490,65 "lastModified": 1780160585,66 "owner": "CertainLach",66 "owner": "CertainLach",67 "repo": "fleet-tf",67 "repo": "fleet-tf",68 "rev": "878bd8c23933d628bf750378bbe527b841901c3d",68 "rev": "aa2200a3f8f93a8c0d3b87bb29f11d9d9b0a23e6",69 "type": "github"69 "type": "github"70 },70 },71 "original": {71 "original": {111 "nixpkgs-regression": "nixpkgs-regression"111 "nixpkgs-regression": "nixpkgs-regression"112 },112 },113 "locked": {113 "locked": {114 "lastModified": 1768702010,114 "lastModified": 1781448983,115 "owner": "deltarocks",115 "owner": "deltarocks",116 "repo": "nix",116 "repo": "nix",117 "rev": "b05b52670b9c7affff5b9be3edb539a1603c39e6",117 "rev": "bb8784f285658e77642437409824619f5c34a854",118 "type": "github"118 "type": "github"119 },119 },120 "original": {120 "original": {126 },126 },127 "nixpkgs": {127 "nixpkgs": {128 "locked": {128 "locked": {129 "lastModified": 1773268153,129 "lastModified": 1781402740,130 "owner": "nixos",130 "owner": "nixos",131 "repo": "nixpkgs",131 "repo": "nixpkgs",132 "rev": "63ca4f465b79edbaa9ff113ea7ff48fb49ea0db0",132 "rev": "49145c5aba740948d6da1265f584826bd27619ad",133 "type": "github"133 "type": "github"134 },134 },135 "original": {135 "original": {171 "type": "github"171 "type": "github"172 }172 }173 },173 },174 "remowt-agents": {175 "inputs": {176 "crane": [177 "crane"178 ],179 "flake-parts": [180 "flake-parts"181 ],182 "nixpkgs": [183 "nixpkgs"184 ],185 "rust-overlay": "rust-overlay",186 "shelly": [187 "shelly"188 ]189 },190 "locked": {191 "lastModified": 1781471358,192 "rev": "c69dddc33f8e2081ef685ae20a7278f92cfcd32e",193 "revCount": 37,194 "type": "git",195 "url": "file:/home/lach/build/remowt-agents"196 },197 "original": {198 "type": "git",199 "url": "file:/home/lach/build/remowt-agents"200 }201 },174 "root": {202 "root": {175 "inputs": {203 "inputs": {176 "crane": "crane",204 "crane": "crane",177 "flake-parts": "flake-parts",205 "flake-parts": "flake-parts",178 "fleet-tf": "fleet-tf",206 "fleet-tf": "fleet-tf",179 "nix": "nix",207 "nix": "nix",180 "nixpkgs": "nixpkgs",208 "nixpkgs": "nixpkgs",209 "remowt-agents": "remowt-agents",181 "rust-overlay": "rust-overlay",210 "rust-overlay": "rust-overlay_2",182 "shelly": "shelly",211 "shelly": "shelly",183 "treefmt-nix": "treefmt-nix"212 "treefmt-nix": "treefmt-nix"184 }213 }185 },214 },186 "rust-overlay": {215 "rust-overlay": {187 "inputs": {216 "inputs": {188 "nixpkgs": [217 "nixpkgs": [218 "remowt-agents",189 "nixpkgs"219 "nixpkgs"190 ]220 ]191 },221 },192 "locked": {222 "locked": {193 "lastModified": 1773216618,223 "lastModified": 1769309768,194 "owner": "oxalica",224 "owner": "oxalica",195 "repo": "rust-overlay",225 "repo": "rust-overlay",196 "rev": "07d7dc6fcc5eae76b4fb0e19d4afd939437bec97",226 "rev": "140c9dc582cb73ada2d63a2180524fcaa744fad5",197 "type": "github"227 "type": "github"198 },228 },199 "original": {229 "original": {202 "type": "github"232 "type": "github"203 }233 }204 },234 },235 "rust-overlay_2": {236 "inputs": {237 "nixpkgs": [238 "nixpkgs"239 ]240 },241 "locked": {242 "lastModified": 1781320681,243 "owner": "oxalica",244 "repo": "rust-overlay",245 "rev": "5b929d8c854149d926d05ea0cd6469bf4e54db27",246 "type": "github"247 },248 "original": {249 "owner": "oxalica",250 "repo": "rust-overlay",251 "type": "github"252 }253 },205 "shelly": {254 "shelly": {206 "locked": {255 "locked": {207 "lastModified": 1756323923,256 "lastModified": 1756323923,223 ]272 ]224 },273 },225 "locked": {274 "locked": {226 "lastModified": 1772660329,275 "lastModified": 1780220602,227 "owner": "numtide",276 "owner": "numtide",228 "repo": "treefmt-nix",277 "repo": "treefmt-nix",229 "rev": "3710e0e1218041bbad640352a0440114b1e10428",278 "rev": "db947814a175b7ca6ded66e21383d938df01c227",230 "type": "github"279 "type": "github"231 },280 },232 "original": {281 "original": {flake.nixdiffbeforeafterboth23 url = "github:numtide/treefmt-nix";23 url = "github:numtide/treefmt-nix";24 inputs.nixpkgs.follows = "nixpkgs";24 inputs.nixpkgs.follows = "nixpkgs";25 };25 };26 remowt-agents = {27 url = "git+file:/home/lach/build/remowt-agents";28 inputs.nixpkgs.follows = "nixpkgs";29 inputs.flake-parts.follows = "flake-parts";30 inputs.crane.follows = "crane";31 inputs.shelly.follows = "shelly";32 };26 # DeterminateSystem's nix fork is controversial, but I don't mind it,33 # DeterminateSystem's nix fork is controversial, but I don't mind it,27 # and it has lazy-trees support which is useful for fleet.34 # and it has lazy-trees support which is useful for fleet.28 nix = {35 nix = {147 packages = lib.mkIf deployerSystem (154 packages = lib.mkIf deployerSystem (148 let155 let149 packages = pkgs.callPackages ./pkgs {156 packages = pkgs.callPackages ./pkgs {150 inherit craneLib inputs';157 inherit craneLib inputs;151 };158 };152 in159 in153 packages // { default = packages.fleet; }160 packages // { default = packages.fleet; }lib/flakePart.nixdiffbeforeafterboth57 modules = (import ../modules/module-list.nix) ++ [57 modules = (import ../modules/module-list.nix) ++ [58 module58 module59 (59 (60 { inputs', ... }:60 { inputs, ... }:61 {61 {62 config = {62 config = {63 data = if isPath data then import data else data;63 data = if isPath data then import data else data;66 (final: prev: {66 (final: prev: {67 inherit67 inherit68 (import ../pkgs {68 (import ../pkgs {69 inherit (prev) callPackage;69 inherit (final) callPackage;70 inherit inputs';70 inherit inputs;71 craneLib = crane.mkLib prev;71 craneLib = crane.mkLib prev;72 })72 })73 fleet-install-secrets73 fleet-install-secrets74 fleet-generator-helper74 fleet-generator-helper75 remowt-plugin-fleet75 ;76 ;76 })77 })77 ];78 ];modules/nixpkgs.nixdiffbeforeafterboth43 defaultText = literalExpression "config.nixpkgs.buildUsing";43 defaultText = literalExpression "config.nixpkgs.buildUsing";44 };44 };45 config.nixos = {45 config.nixos =46 { inputs', ... }:47 {46 inherit _file;48 inherit _file;47 nixpkgs.overlays = config.nixpkgs.overlays;49 nixpkgs.overlays = config.nixpkgs.overlays;pkgs/default.nixdiffbeforeafterboth1{1{2 callPackage,2 callPackage,3 craneLib,3 craneLib,4 inputs',4 inputs,5}:5}:6{6{7 fleet = callPackage ./fleet.nix { inherit craneLib inputs'; };7 fleet = callPackage ./fleet.nix { inherit craneLib inputs; };8 remowt-plugin-fleet = callPackage ./remowt-plugin-fleet.nix { inherit craneLib inputs; };8 fleet-install-secrets = callPackage ./fleet-install-secrets.nix { inherit craneLib; };9 fleet-install-secrets = callPackage ./fleet-install-secrets.nix { inherit craneLib; };9 fleet-generator-helper = callPackage ./fleet-generator-helper.nix { inherit craneLib; };10 fleet-generator-helper = callPackage ./fleet-generator-helper.nix { inherit craneLib; };10}11}pkgs/fleet.nixdiffbeforeafterboth2 lib,2 lib,3 craneLib,3 craneLib,4 installShellFiles,4 installShellFiles,5 inputs',5 inputs,67 stdenv,6 pkg-config,8 pkg-config,7 rustPlatform,9 rustPlatform,10 rofi,8}:11}:12let13 system = stdenv.hostPlatform.system;14in9craneLib.buildPackage rec {15craneLib.buildPackage rec {10 pname = "fleet";16 pname = "fleet";11 src = lib.cleanSourceWith {17 src = lib.cleanSourceWith {202621 cargoExtraArgs = "--locked -p ${pname}";27 cargoExtraArgs = "--locked -p ${pname}";2829 REMOWT_AGENTS_DIR = "${inputs.remowt-agents.packages.${system}.remowt-agents}";30 # TODO: built-in fleet prompter should be a prodash widget, or it should require31 # tty remowt prompter running on host machine idk.32 ROFI = "${rofi}/bin/rofi";223323 buildInputs = [34 buildInputs = [24 inputs'.nix.packages.nix-expr-c35 inputs.nix.packages.${system}.nix-expr-c25 inputs'.nix.packages.nix-flake-c36 inputs.nix.packages.${system}.nix-flake-c26 inputs'.nix.packages.nix-fetchers-c37 inputs.nix.packages.${system}.nix-fetchers-c27 ];38 ];28 nativeBuildInputs = [39 nativeBuildInputs = [29 installShellFiles40 installShellFilespkgs/remowt-plugin-fleet.nixdiffbeforeafterbothno changes