ive harnessed the harness
0
fork

Configure Feed

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

init

dawn 510f04d6

+4851
+3
.cargo/config.toml
··· 1 + [target.x86_64-unknown-linux-gnu] 2 + linker = "clang" 3 + rustflags = ["-Clink-arg=--ld-path=wild"]
+1
.envrc
··· 1 + use flake
+3
.gitignore
··· 1 + /target 2 + /.direnv 3 +
+3476
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "KLBR" 7 + version = "0.0.0" 8 + dependencies = [ 9 + "anyhow", 10 + "crossterm", 11 + "dirs", 12 + "futures", 13 + "ratatui", 14 + "reqwest", 15 + "rusqlite", 16 + "serde", 17 + "serde_json", 18 + "tokio", 19 + "tracing", 20 + "tracing-subscriber", 21 + ] 22 + 23 + [[package]] 24 + name = "aho-corasick" 25 + version = "1.1.4" 26 + source = "registry+https://github.com/rust-lang/crates.io-index" 27 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 28 + dependencies = [ 29 + "memchr", 30 + ] 31 + 32 + [[package]] 33 + name = "allocator-api2" 34 + version = "0.2.21" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 37 + 38 + [[package]] 39 + name = "anyhow" 40 + version = "1.0.102" 41 + source = "registry+https://github.com/rust-lang/crates.io-index" 42 + checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 43 + 44 + [[package]] 45 + name = "atomic" 46 + version = "0.6.1" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" 49 + dependencies = [ 50 + "bytemuck", 51 + ] 52 + 53 + [[package]] 54 + name = "atomic-waker" 55 + version = "1.1.2" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 58 + 59 + [[package]] 60 + name = "autocfg" 61 + version = "1.5.0" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 64 + 65 + [[package]] 66 + name = "aws-lc-rs" 67 + version = "1.16.2" 68 + source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" 70 + dependencies = [ 71 + "aws-lc-sys", 72 + "zeroize", 73 + ] 74 + 75 + [[package]] 76 + name = "aws-lc-sys" 77 + version = "0.39.1" 78 + source = "registry+https://github.com/rust-lang/crates.io-index" 79 + checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" 80 + dependencies = [ 81 + "cc", 82 + "cmake", 83 + "dunce", 84 + "fs_extra", 85 + ] 86 + 87 + [[package]] 88 + name = "base64" 89 + version = "0.22.1" 90 + source = "registry+https://github.com/rust-lang/crates.io-index" 91 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 92 + 93 + [[package]] 94 + name = "bit-set" 95 + version = "0.5.3" 96 + source = "registry+https://github.com/rust-lang/crates.io-index" 97 + checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 98 + dependencies = [ 99 + "bit-vec", 100 + ] 101 + 102 + [[package]] 103 + name = "bit-vec" 104 + version = "0.6.3" 105 + source = "registry+https://github.com/rust-lang/crates.io-index" 106 + checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 107 + 108 + [[package]] 109 + name = "bitflags" 110 + version = "1.3.2" 111 + source = "registry+https://github.com/rust-lang/crates.io-index" 112 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 113 + 114 + [[package]] 115 + name = "bitflags" 116 + version = "2.11.0" 117 + source = "registry+https://github.com/rust-lang/crates.io-index" 118 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 119 + 120 + [[package]] 121 + name = "block-buffer" 122 + version = "0.10.4" 123 + source = "registry+https://github.com/rust-lang/crates.io-index" 124 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 125 + dependencies = [ 126 + "generic-array", 127 + ] 128 + 129 + [[package]] 130 + name = "bumpalo" 131 + version = "3.20.2" 132 + source = "registry+https://github.com/rust-lang/crates.io-index" 133 + checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" 134 + 135 + [[package]] 136 + name = "bytemuck" 137 + version = "1.25.0" 138 + source = "registry+https://github.com/rust-lang/crates.io-index" 139 + checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" 140 + 141 + [[package]] 142 + name = "bytes" 143 + version = "1.11.1" 144 + source = "registry+https://github.com/rust-lang/crates.io-index" 145 + checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 146 + 147 + [[package]] 148 + name = "castaway" 149 + version = "0.2.4" 150 + source = "registry+https://github.com/rust-lang/crates.io-index" 151 + checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" 152 + dependencies = [ 153 + "rustversion", 154 + ] 155 + 156 + [[package]] 157 + name = "cc" 158 + version = "1.2.59" 159 + source = "registry+https://github.com/rust-lang/crates.io-index" 160 + checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" 161 + dependencies = [ 162 + "find-msvc-tools", 163 + "jobserver", 164 + "libc", 165 + "shlex", 166 + ] 167 + 168 + [[package]] 169 + name = "cesu8" 170 + version = "1.1.0" 171 + source = "registry+https://github.com/rust-lang/crates.io-index" 172 + checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 173 + 174 + [[package]] 175 + name = "cfg-if" 176 + version = "1.0.4" 177 + source = "registry+https://github.com/rust-lang/crates.io-index" 178 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 179 + 180 + [[package]] 181 + name = "cfg_aliases" 182 + version = "0.2.1" 183 + source = "registry+https://github.com/rust-lang/crates.io-index" 184 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 185 + 186 + [[package]] 187 + name = "cmake" 188 + version = "0.1.58" 189 + source = "registry+https://github.com/rust-lang/crates.io-index" 190 + checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" 191 + dependencies = [ 192 + "cc", 193 + ] 194 + 195 + [[package]] 196 + name = "combine" 197 + version = "4.6.7" 198 + source = "registry+https://github.com/rust-lang/crates.io-index" 199 + checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 200 + dependencies = [ 201 + "bytes", 202 + "memchr", 203 + ] 204 + 205 + [[package]] 206 + name = "compact_str" 207 + version = "0.9.0" 208 + source = "registry+https://github.com/rust-lang/crates.io-index" 209 + checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" 210 + dependencies = [ 211 + "castaway", 212 + "cfg-if", 213 + "itoa", 214 + "rustversion", 215 + "ryu", 216 + "static_assertions", 217 + ] 218 + 219 + [[package]] 220 + name = "convert_case" 221 + version = "0.10.0" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" 224 + dependencies = [ 225 + "unicode-segmentation", 226 + ] 227 + 228 + [[package]] 229 + name = "core-foundation" 230 + version = "0.9.4" 231 + source = "registry+https://github.com/rust-lang/crates.io-index" 232 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 233 + dependencies = [ 234 + "core-foundation-sys", 235 + "libc", 236 + ] 237 + 238 + [[package]] 239 + name = "core-foundation" 240 + version = "0.10.1" 241 + source = "registry+https://github.com/rust-lang/crates.io-index" 242 + checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 243 + dependencies = [ 244 + "core-foundation-sys", 245 + "libc", 246 + ] 247 + 248 + [[package]] 249 + name = "core-foundation-sys" 250 + version = "0.8.7" 251 + source = "registry+https://github.com/rust-lang/crates.io-index" 252 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 253 + 254 + [[package]] 255 + name = "cpufeatures" 256 + version = "0.2.17" 257 + source = "registry+https://github.com/rust-lang/crates.io-index" 258 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 259 + dependencies = [ 260 + "libc", 261 + ] 262 + 263 + [[package]] 264 + name = "crossterm" 265 + version = "0.29.0" 266 + source = "registry+https://github.com/rust-lang/crates.io-index" 267 + checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" 268 + dependencies = [ 269 + "bitflags 2.11.0", 270 + "crossterm_winapi", 271 + "derive_more", 272 + "document-features", 273 + "futures-core", 274 + "mio", 275 + "parking_lot", 276 + "rustix", 277 + "signal-hook", 278 + "signal-hook-mio", 279 + "winapi", 280 + ] 281 + 282 + [[package]] 283 + name = "crossterm_winapi" 284 + version = "0.9.1" 285 + source = "registry+https://github.com/rust-lang/crates.io-index" 286 + checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 287 + dependencies = [ 288 + "winapi", 289 + ] 290 + 291 + [[package]] 292 + name = "crypto-common" 293 + version = "0.1.7" 294 + source = "registry+https://github.com/rust-lang/crates.io-index" 295 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 296 + dependencies = [ 297 + "generic-array", 298 + "typenum", 299 + ] 300 + 301 + [[package]] 302 + name = "csscolorparser" 303 + version = "0.6.2" 304 + source = "registry+https://github.com/rust-lang/crates.io-index" 305 + checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" 306 + dependencies = [ 307 + "lab", 308 + "phf", 309 + ] 310 + 311 + [[package]] 312 + name = "darling" 313 + version = "0.23.0" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" 316 + dependencies = [ 317 + "darling_core", 318 + "darling_macro", 319 + ] 320 + 321 + [[package]] 322 + name = "darling_core" 323 + version = "0.23.0" 324 + source = "registry+https://github.com/rust-lang/crates.io-index" 325 + checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" 326 + dependencies = [ 327 + "ident_case", 328 + "proc-macro2", 329 + "quote", 330 + "strsim", 331 + "syn 2.0.117", 332 + ] 333 + 334 + [[package]] 335 + name = "darling_macro" 336 + version = "0.23.0" 337 + source = "registry+https://github.com/rust-lang/crates.io-index" 338 + checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" 339 + dependencies = [ 340 + "darling_core", 341 + "quote", 342 + "syn 2.0.117", 343 + ] 344 + 345 + [[package]] 346 + name = "deltae" 347 + version = "0.3.2" 348 + source = "registry+https://github.com/rust-lang/crates.io-index" 349 + checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" 350 + 351 + [[package]] 352 + name = "deranged" 353 + version = "0.5.8" 354 + source = "registry+https://github.com/rust-lang/crates.io-index" 355 + checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" 356 + dependencies = [ 357 + "powerfmt", 358 + ] 359 + 360 + [[package]] 361 + name = "derive_more" 362 + version = "2.1.1" 363 + source = "registry+https://github.com/rust-lang/crates.io-index" 364 + checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" 365 + dependencies = [ 366 + "derive_more-impl", 367 + ] 368 + 369 + [[package]] 370 + name = "derive_more-impl" 371 + version = "2.1.1" 372 + source = "registry+https://github.com/rust-lang/crates.io-index" 373 + checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" 374 + dependencies = [ 375 + "convert_case", 376 + "proc-macro2", 377 + "quote", 378 + "rustc_version", 379 + "syn 2.0.117", 380 + ] 381 + 382 + [[package]] 383 + name = "digest" 384 + version = "0.10.7" 385 + source = "registry+https://github.com/rust-lang/crates.io-index" 386 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 387 + dependencies = [ 388 + "block-buffer", 389 + "crypto-common", 390 + ] 391 + 392 + [[package]] 393 + name = "dirs" 394 + version = "5.0.1" 395 + source = "registry+https://github.com/rust-lang/crates.io-index" 396 + checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 397 + dependencies = [ 398 + "dirs-sys", 399 + ] 400 + 401 + [[package]] 402 + name = "dirs-sys" 403 + version = "0.4.1" 404 + source = "registry+https://github.com/rust-lang/crates.io-index" 405 + checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 406 + dependencies = [ 407 + "libc", 408 + "option-ext", 409 + "redox_users", 410 + "windows-sys 0.48.0", 411 + ] 412 + 413 + [[package]] 414 + name = "displaydoc" 415 + version = "0.2.5" 416 + source = "registry+https://github.com/rust-lang/crates.io-index" 417 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 418 + dependencies = [ 419 + "proc-macro2", 420 + "quote", 421 + "syn 2.0.117", 422 + ] 423 + 424 + [[package]] 425 + name = "document-features" 426 + version = "0.2.12" 427 + source = "registry+https://github.com/rust-lang/crates.io-index" 428 + checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" 429 + dependencies = [ 430 + "litrs", 431 + ] 432 + 433 + [[package]] 434 + name = "dunce" 435 + version = "1.0.5" 436 + source = "registry+https://github.com/rust-lang/crates.io-index" 437 + checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 438 + 439 + [[package]] 440 + name = "either" 441 + version = "1.15.0" 442 + source = "registry+https://github.com/rust-lang/crates.io-index" 443 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 444 + 445 + [[package]] 446 + name = "encoding_rs" 447 + version = "0.8.35" 448 + source = "registry+https://github.com/rust-lang/crates.io-index" 449 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 450 + dependencies = [ 451 + "cfg-if", 452 + ] 453 + 454 + [[package]] 455 + name = "equivalent" 456 + version = "1.0.2" 457 + source = "registry+https://github.com/rust-lang/crates.io-index" 458 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 459 + 460 + [[package]] 461 + name = "errno" 462 + version = "0.3.14" 463 + source = "registry+https://github.com/rust-lang/crates.io-index" 464 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 465 + dependencies = [ 466 + "libc", 467 + "windows-sys 0.61.2", 468 + ] 469 + 470 + [[package]] 471 + name = "euclid" 472 + version = "0.22.14" 473 + source = "registry+https://github.com/rust-lang/crates.io-index" 474 + checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" 475 + dependencies = [ 476 + "num-traits", 477 + ] 478 + 479 + [[package]] 480 + name = "fallible-iterator" 481 + version = "0.3.0" 482 + source = "registry+https://github.com/rust-lang/crates.io-index" 483 + checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" 484 + 485 + [[package]] 486 + name = "fallible-streaming-iterator" 487 + version = "0.1.9" 488 + source = "registry+https://github.com/rust-lang/crates.io-index" 489 + checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 490 + 491 + [[package]] 492 + name = "fancy-regex" 493 + version = "0.11.0" 494 + source = "registry+https://github.com/rust-lang/crates.io-index" 495 + checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" 496 + dependencies = [ 497 + "bit-set", 498 + "regex", 499 + ] 500 + 501 + [[package]] 502 + name = "filedescriptor" 503 + version = "0.8.3" 504 + source = "registry+https://github.com/rust-lang/crates.io-index" 505 + checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" 506 + dependencies = [ 507 + "libc", 508 + "thiserror 1.0.69", 509 + "winapi", 510 + ] 511 + 512 + [[package]] 513 + name = "find-msvc-tools" 514 + version = "0.1.9" 515 + source = "registry+https://github.com/rust-lang/crates.io-index" 516 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 517 + 518 + [[package]] 519 + name = "finl_unicode" 520 + version = "1.4.0" 521 + source = "registry+https://github.com/rust-lang/crates.io-index" 522 + checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" 523 + 524 + [[package]] 525 + name = "fixedbitset" 526 + version = "0.4.2" 527 + source = "registry+https://github.com/rust-lang/crates.io-index" 528 + checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 529 + 530 + [[package]] 531 + name = "fnv" 532 + version = "1.0.7" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 535 + 536 + [[package]] 537 + name = "foldhash" 538 + version = "0.1.5" 539 + source = "registry+https://github.com/rust-lang/crates.io-index" 540 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 541 + 542 + [[package]] 543 + name = "foldhash" 544 + version = "0.2.0" 545 + source = "registry+https://github.com/rust-lang/crates.io-index" 546 + checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" 547 + 548 + [[package]] 549 + name = "form_urlencoded" 550 + version = "1.2.2" 551 + source = "registry+https://github.com/rust-lang/crates.io-index" 552 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 553 + dependencies = [ 554 + "percent-encoding", 555 + ] 556 + 557 + [[package]] 558 + name = "fs_extra" 559 + version = "1.3.0" 560 + source = "registry+https://github.com/rust-lang/crates.io-index" 561 + checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 562 + 563 + [[package]] 564 + name = "futures" 565 + version = "0.3.32" 566 + source = "registry+https://github.com/rust-lang/crates.io-index" 567 + checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" 568 + dependencies = [ 569 + "futures-channel", 570 + "futures-core", 571 + "futures-executor", 572 + "futures-io", 573 + "futures-sink", 574 + "futures-task", 575 + "futures-util", 576 + ] 577 + 578 + [[package]] 579 + name = "futures-channel" 580 + version = "0.3.32" 581 + source = "registry+https://github.com/rust-lang/crates.io-index" 582 + checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 583 + dependencies = [ 584 + "futures-core", 585 + "futures-sink", 586 + ] 587 + 588 + [[package]] 589 + name = "futures-core" 590 + version = "0.3.32" 591 + source = "registry+https://github.com/rust-lang/crates.io-index" 592 + checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 593 + 594 + [[package]] 595 + name = "futures-executor" 596 + version = "0.3.32" 597 + source = "registry+https://github.com/rust-lang/crates.io-index" 598 + checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" 599 + dependencies = [ 600 + "futures-core", 601 + "futures-task", 602 + "futures-util", 603 + ] 604 + 605 + [[package]] 606 + name = "futures-io" 607 + version = "0.3.32" 608 + source = "registry+https://github.com/rust-lang/crates.io-index" 609 + checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 610 + 611 + [[package]] 612 + name = "futures-macro" 613 + version = "0.3.32" 614 + source = "registry+https://github.com/rust-lang/crates.io-index" 615 + checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" 616 + dependencies = [ 617 + "proc-macro2", 618 + "quote", 619 + "syn 2.0.117", 620 + ] 621 + 622 + [[package]] 623 + name = "futures-sink" 624 + version = "0.3.32" 625 + source = "registry+https://github.com/rust-lang/crates.io-index" 626 + checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" 627 + 628 + [[package]] 629 + name = "futures-task" 630 + version = "0.3.32" 631 + source = "registry+https://github.com/rust-lang/crates.io-index" 632 + checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 633 + 634 + [[package]] 635 + name = "futures-util" 636 + version = "0.3.32" 637 + source = "registry+https://github.com/rust-lang/crates.io-index" 638 + checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 639 + dependencies = [ 640 + "futures-channel", 641 + "futures-core", 642 + "futures-io", 643 + "futures-macro", 644 + "futures-sink", 645 + "futures-task", 646 + "memchr", 647 + "pin-project-lite", 648 + "slab", 649 + ] 650 + 651 + [[package]] 652 + name = "generic-array" 653 + version = "0.14.7" 654 + source = "registry+https://github.com/rust-lang/crates.io-index" 655 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 656 + dependencies = [ 657 + "typenum", 658 + "version_check", 659 + ] 660 + 661 + [[package]] 662 + name = "getrandom" 663 + version = "0.2.17" 664 + source = "registry+https://github.com/rust-lang/crates.io-index" 665 + checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 666 + dependencies = [ 667 + "cfg-if", 668 + "js-sys", 669 + "libc", 670 + "wasi", 671 + "wasm-bindgen", 672 + ] 673 + 674 + [[package]] 675 + name = "getrandom" 676 + version = "0.3.4" 677 + source = "registry+https://github.com/rust-lang/crates.io-index" 678 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 679 + dependencies = [ 680 + "cfg-if", 681 + "js-sys", 682 + "libc", 683 + "r-efi 5.3.0", 684 + "wasip2", 685 + "wasm-bindgen", 686 + ] 687 + 688 + [[package]] 689 + name = "getrandom" 690 + version = "0.4.2" 691 + source = "registry+https://github.com/rust-lang/crates.io-index" 692 + checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 693 + dependencies = [ 694 + "cfg-if", 695 + "libc", 696 + "r-efi 6.0.0", 697 + "wasip2", 698 + "wasip3", 699 + ] 700 + 701 + [[package]] 702 + name = "h2" 703 + version = "0.4.13" 704 + source = "registry+https://github.com/rust-lang/crates.io-index" 705 + checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" 706 + dependencies = [ 707 + "atomic-waker", 708 + "bytes", 709 + "fnv", 710 + "futures-core", 711 + "futures-sink", 712 + "http", 713 + "indexmap", 714 + "slab", 715 + "tokio", 716 + "tokio-util", 717 + "tracing", 718 + ] 719 + 720 + [[package]] 721 + name = "hashbrown" 722 + version = "0.15.5" 723 + source = "registry+https://github.com/rust-lang/crates.io-index" 724 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 725 + dependencies = [ 726 + "foldhash 0.1.5", 727 + ] 728 + 729 + [[package]] 730 + name = "hashbrown" 731 + version = "0.16.1" 732 + source = "registry+https://github.com/rust-lang/crates.io-index" 733 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 734 + dependencies = [ 735 + "allocator-api2", 736 + "equivalent", 737 + "foldhash 0.2.0", 738 + ] 739 + 740 + [[package]] 741 + name = "hashlink" 742 + version = "0.11.0" 743 + source = "registry+https://github.com/rust-lang/crates.io-index" 744 + checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" 745 + dependencies = [ 746 + "hashbrown 0.16.1", 747 + ] 748 + 749 + [[package]] 750 + name = "heck" 751 + version = "0.5.0" 752 + source = "registry+https://github.com/rust-lang/crates.io-index" 753 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 754 + 755 + [[package]] 756 + name = "hex" 757 + version = "0.4.3" 758 + source = "registry+https://github.com/rust-lang/crates.io-index" 759 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 760 + 761 + [[package]] 762 + name = "http" 763 + version = "1.4.0" 764 + source = "registry+https://github.com/rust-lang/crates.io-index" 765 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 766 + dependencies = [ 767 + "bytes", 768 + "itoa", 769 + ] 770 + 771 + [[package]] 772 + name = "http-body" 773 + version = "1.0.1" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 776 + dependencies = [ 777 + "bytes", 778 + "http", 779 + ] 780 + 781 + [[package]] 782 + name = "http-body-util" 783 + version = "0.1.3" 784 + source = "registry+https://github.com/rust-lang/crates.io-index" 785 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 786 + dependencies = [ 787 + "bytes", 788 + "futures-core", 789 + "http", 790 + "http-body", 791 + "pin-project-lite", 792 + ] 793 + 794 + [[package]] 795 + name = "httparse" 796 + version = "1.10.1" 797 + source = "registry+https://github.com/rust-lang/crates.io-index" 798 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 799 + 800 + [[package]] 801 + name = "hyper" 802 + version = "1.9.0" 803 + source = "registry+https://github.com/rust-lang/crates.io-index" 804 + checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" 805 + dependencies = [ 806 + "atomic-waker", 807 + "bytes", 808 + "futures-channel", 809 + "futures-core", 810 + "h2", 811 + "http", 812 + "http-body", 813 + "httparse", 814 + "itoa", 815 + "pin-project-lite", 816 + "smallvec", 817 + "tokio", 818 + "want", 819 + ] 820 + 821 + [[package]] 822 + name = "hyper-rustls" 823 + version = "0.27.7" 824 + source = "registry+https://github.com/rust-lang/crates.io-index" 825 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 826 + dependencies = [ 827 + "http", 828 + "hyper", 829 + "hyper-util", 830 + "rustls", 831 + "rustls-pki-types", 832 + "tokio", 833 + "tokio-rustls", 834 + "tower-service", 835 + ] 836 + 837 + [[package]] 838 + name = "hyper-util" 839 + version = "0.1.20" 840 + source = "registry+https://github.com/rust-lang/crates.io-index" 841 + checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" 842 + dependencies = [ 843 + "base64", 844 + "bytes", 845 + "futures-channel", 846 + "futures-util", 847 + "http", 848 + "http-body", 849 + "hyper", 850 + "ipnet", 851 + "libc", 852 + "percent-encoding", 853 + "pin-project-lite", 854 + "socket2", 855 + "system-configuration", 856 + "tokio", 857 + "tower-service", 858 + "tracing", 859 + "windows-registry", 860 + ] 861 + 862 + [[package]] 863 + name = "icu_collections" 864 + version = "2.2.0" 865 + source = "registry+https://github.com/rust-lang/crates.io-index" 866 + checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" 867 + dependencies = [ 868 + "displaydoc", 869 + "potential_utf", 870 + "utf8_iter", 871 + "yoke", 872 + "zerofrom", 873 + "zerovec", 874 + ] 875 + 876 + [[package]] 877 + name = "icu_locale_core" 878 + version = "2.2.0" 879 + source = "registry+https://github.com/rust-lang/crates.io-index" 880 + checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" 881 + dependencies = [ 882 + "displaydoc", 883 + "litemap", 884 + "tinystr", 885 + "writeable", 886 + "zerovec", 887 + ] 888 + 889 + [[package]] 890 + name = "icu_normalizer" 891 + version = "2.2.0" 892 + source = "registry+https://github.com/rust-lang/crates.io-index" 893 + checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" 894 + dependencies = [ 895 + "icu_collections", 896 + "icu_normalizer_data", 897 + "icu_properties", 898 + "icu_provider", 899 + "smallvec", 900 + "zerovec", 901 + ] 902 + 903 + [[package]] 904 + name = "icu_normalizer_data" 905 + version = "2.2.0" 906 + source = "registry+https://github.com/rust-lang/crates.io-index" 907 + checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" 908 + 909 + [[package]] 910 + name = "icu_properties" 911 + version = "2.2.0" 912 + source = "registry+https://github.com/rust-lang/crates.io-index" 913 + checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" 914 + dependencies = [ 915 + "icu_collections", 916 + "icu_locale_core", 917 + "icu_properties_data", 918 + "icu_provider", 919 + "zerotrie", 920 + "zerovec", 921 + ] 922 + 923 + [[package]] 924 + name = "icu_properties_data" 925 + version = "2.2.0" 926 + source = "registry+https://github.com/rust-lang/crates.io-index" 927 + checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" 928 + 929 + [[package]] 930 + name = "icu_provider" 931 + version = "2.2.0" 932 + source = "registry+https://github.com/rust-lang/crates.io-index" 933 + checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" 934 + dependencies = [ 935 + "displaydoc", 936 + "icu_locale_core", 937 + "writeable", 938 + "yoke", 939 + "zerofrom", 940 + "zerotrie", 941 + "zerovec", 942 + ] 943 + 944 + [[package]] 945 + name = "id-arena" 946 + version = "2.3.0" 947 + source = "registry+https://github.com/rust-lang/crates.io-index" 948 + checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 949 + 950 + [[package]] 951 + name = "ident_case" 952 + version = "1.0.1" 953 + source = "registry+https://github.com/rust-lang/crates.io-index" 954 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 955 + 956 + [[package]] 957 + name = "idna" 958 + version = "1.1.0" 959 + source = "registry+https://github.com/rust-lang/crates.io-index" 960 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 961 + dependencies = [ 962 + "idna_adapter", 963 + "smallvec", 964 + "utf8_iter", 965 + ] 966 + 967 + [[package]] 968 + name = "idna_adapter" 969 + version = "1.2.1" 970 + source = "registry+https://github.com/rust-lang/crates.io-index" 971 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 972 + dependencies = [ 973 + "icu_normalizer", 974 + "icu_properties", 975 + ] 976 + 977 + [[package]] 978 + name = "indexmap" 979 + version = "2.13.1" 980 + source = "registry+https://github.com/rust-lang/crates.io-index" 981 + checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" 982 + dependencies = [ 983 + "equivalent", 984 + "hashbrown 0.16.1", 985 + "serde", 986 + "serde_core", 987 + ] 988 + 989 + [[package]] 990 + name = "indoc" 991 + version = "2.0.7" 992 + source = "registry+https://github.com/rust-lang/crates.io-index" 993 + checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" 994 + dependencies = [ 995 + "rustversion", 996 + ] 997 + 998 + [[package]] 999 + name = "instability" 1000 + version = "0.3.12" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" 1003 + dependencies = [ 1004 + "darling", 1005 + "indoc", 1006 + "proc-macro2", 1007 + "quote", 1008 + "syn 2.0.117", 1009 + ] 1010 + 1011 + [[package]] 1012 + name = "ipnet" 1013 + version = "2.12.0" 1014 + source = "registry+https://github.com/rust-lang/crates.io-index" 1015 + checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" 1016 + 1017 + [[package]] 1018 + name = "iri-string" 1019 + version = "0.7.12" 1020 + source = "registry+https://github.com/rust-lang/crates.io-index" 1021 + checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" 1022 + dependencies = [ 1023 + "memchr", 1024 + "serde", 1025 + ] 1026 + 1027 + [[package]] 1028 + name = "itertools" 1029 + version = "0.14.0" 1030 + source = "registry+https://github.com/rust-lang/crates.io-index" 1031 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1032 + dependencies = [ 1033 + "either", 1034 + ] 1035 + 1036 + [[package]] 1037 + name = "itoa" 1038 + version = "1.0.18" 1039 + source = "registry+https://github.com/rust-lang/crates.io-index" 1040 + checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" 1041 + 1042 + [[package]] 1043 + name = "jni" 1044 + version = "0.21.1" 1045 + source = "registry+https://github.com/rust-lang/crates.io-index" 1046 + checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 1047 + dependencies = [ 1048 + "cesu8", 1049 + "cfg-if", 1050 + "combine", 1051 + "jni-sys 0.3.1", 1052 + "log", 1053 + "thiserror 1.0.69", 1054 + "walkdir", 1055 + "windows-sys 0.45.0", 1056 + ] 1057 + 1058 + [[package]] 1059 + name = "jni-sys" 1060 + version = "0.3.1" 1061 + source = "registry+https://github.com/rust-lang/crates.io-index" 1062 + checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" 1063 + dependencies = [ 1064 + "jni-sys 0.4.1", 1065 + ] 1066 + 1067 + [[package]] 1068 + name = "jni-sys" 1069 + version = "0.4.1" 1070 + source = "registry+https://github.com/rust-lang/crates.io-index" 1071 + checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" 1072 + dependencies = [ 1073 + "jni-sys-macros", 1074 + ] 1075 + 1076 + [[package]] 1077 + name = "jni-sys-macros" 1078 + version = "0.4.1" 1079 + source = "registry+https://github.com/rust-lang/crates.io-index" 1080 + checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" 1081 + dependencies = [ 1082 + "quote", 1083 + "syn 2.0.117", 1084 + ] 1085 + 1086 + [[package]] 1087 + name = "jobserver" 1088 + version = "0.1.34" 1089 + source = "registry+https://github.com/rust-lang/crates.io-index" 1090 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1091 + dependencies = [ 1092 + "getrandom 0.3.4", 1093 + "libc", 1094 + ] 1095 + 1096 + [[package]] 1097 + name = "js-sys" 1098 + version = "0.3.94" 1099 + source = "registry+https://github.com/rust-lang/crates.io-index" 1100 + checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" 1101 + dependencies = [ 1102 + "cfg-if", 1103 + "futures-util", 1104 + "once_cell", 1105 + "wasm-bindgen", 1106 + ] 1107 + 1108 + [[package]] 1109 + name = "kasuari" 1110 + version = "0.4.12" 1111 + source = "registry+https://github.com/rust-lang/crates.io-index" 1112 + checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" 1113 + dependencies = [ 1114 + "hashbrown 0.16.1", 1115 + "portable-atomic", 1116 + "thiserror 2.0.18", 1117 + ] 1118 + 1119 + [[package]] 1120 + name = "lab" 1121 + version = "0.11.0" 1122 + source = "registry+https://github.com/rust-lang/crates.io-index" 1123 + checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" 1124 + 1125 + [[package]] 1126 + name = "lazy_static" 1127 + version = "1.5.0" 1128 + source = "registry+https://github.com/rust-lang/crates.io-index" 1129 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1130 + 1131 + [[package]] 1132 + name = "leb128fmt" 1133 + version = "0.1.0" 1134 + source = "registry+https://github.com/rust-lang/crates.io-index" 1135 + checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 1136 + 1137 + [[package]] 1138 + name = "libc" 1139 + version = "0.2.184" 1140 + source = "registry+https://github.com/rust-lang/crates.io-index" 1141 + checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" 1142 + 1143 + [[package]] 1144 + name = "libredox" 1145 + version = "0.1.15" 1146 + source = "registry+https://github.com/rust-lang/crates.io-index" 1147 + checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" 1148 + dependencies = [ 1149 + "libc", 1150 + ] 1151 + 1152 + [[package]] 1153 + name = "libsqlite3-sys" 1154 + version = "0.37.0" 1155 + source = "registry+https://github.com/rust-lang/crates.io-index" 1156 + checksum = "b1f111c8c41e7c61a49cd34e44c7619462967221a6443b0ec299e0ac30cfb9b1" 1157 + dependencies = [ 1158 + "cc", 1159 + "pkg-config", 1160 + "vcpkg", 1161 + ] 1162 + 1163 + [[package]] 1164 + name = "line-clipping" 1165 + version = "0.3.7" 1166 + source = "registry+https://github.com/rust-lang/crates.io-index" 1167 + checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" 1168 + dependencies = [ 1169 + "bitflags 2.11.0", 1170 + ] 1171 + 1172 + [[package]] 1173 + name = "linux-raw-sys" 1174 + version = "0.12.1" 1175 + source = "registry+https://github.com/rust-lang/crates.io-index" 1176 + checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" 1177 + 1178 + [[package]] 1179 + name = "litemap" 1180 + version = "0.8.2" 1181 + source = "registry+https://github.com/rust-lang/crates.io-index" 1182 + checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" 1183 + 1184 + [[package]] 1185 + name = "litrs" 1186 + version = "1.0.0" 1187 + source = "registry+https://github.com/rust-lang/crates.io-index" 1188 + checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" 1189 + 1190 + [[package]] 1191 + name = "lock_api" 1192 + version = "0.4.14" 1193 + source = "registry+https://github.com/rust-lang/crates.io-index" 1194 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1195 + dependencies = [ 1196 + "scopeguard", 1197 + ] 1198 + 1199 + [[package]] 1200 + name = "log" 1201 + version = "0.4.29" 1202 + source = "registry+https://github.com/rust-lang/crates.io-index" 1203 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 1204 + 1205 + [[package]] 1206 + name = "lru" 1207 + version = "0.16.3" 1208 + source = "registry+https://github.com/rust-lang/crates.io-index" 1209 + checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" 1210 + dependencies = [ 1211 + "hashbrown 0.16.1", 1212 + ] 1213 + 1214 + [[package]] 1215 + name = "lru-slab" 1216 + version = "0.1.2" 1217 + source = "registry+https://github.com/rust-lang/crates.io-index" 1218 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1219 + 1220 + [[package]] 1221 + name = "mac_address" 1222 + version = "1.1.8" 1223 + source = "registry+https://github.com/rust-lang/crates.io-index" 1224 + checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" 1225 + dependencies = [ 1226 + "nix", 1227 + "winapi", 1228 + ] 1229 + 1230 + [[package]] 1231 + name = "memchr" 1232 + version = "2.8.0" 1233 + source = "registry+https://github.com/rust-lang/crates.io-index" 1234 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 1235 + 1236 + [[package]] 1237 + name = "memmem" 1238 + version = "0.1.1" 1239 + source = "registry+https://github.com/rust-lang/crates.io-index" 1240 + checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" 1241 + 1242 + [[package]] 1243 + name = "memoffset" 1244 + version = "0.9.1" 1245 + source = "registry+https://github.com/rust-lang/crates.io-index" 1246 + checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 1247 + dependencies = [ 1248 + "autocfg", 1249 + ] 1250 + 1251 + [[package]] 1252 + name = "mime" 1253 + version = "0.3.17" 1254 + source = "registry+https://github.com/rust-lang/crates.io-index" 1255 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1256 + 1257 + [[package]] 1258 + name = "minimal-lexical" 1259 + version = "0.2.1" 1260 + source = "registry+https://github.com/rust-lang/crates.io-index" 1261 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1262 + 1263 + [[package]] 1264 + name = "mio" 1265 + version = "1.2.0" 1266 + source = "registry+https://github.com/rust-lang/crates.io-index" 1267 + checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" 1268 + dependencies = [ 1269 + "libc", 1270 + "log", 1271 + "wasi", 1272 + "windows-sys 0.61.2", 1273 + ] 1274 + 1275 + [[package]] 1276 + name = "nix" 1277 + version = "0.29.0" 1278 + source = "registry+https://github.com/rust-lang/crates.io-index" 1279 + checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 1280 + dependencies = [ 1281 + "bitflags 2.11.0", 1282 + "cfg-if", 1283 + "cfg_aliases", 1284 + "libc", 1285 + "memoffset", 1286 + ] 1287 + 1288 + [[package]] 1289 + name = "nom" 1290 + version = "7.1.3" 1291 + source = "registry+https://github.com/rust-lang/crates.io-index" 1292 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1293 + dependencies = [ 1294 + "memchr", 1295 + "minimal-lexical", 1296 + ] 1297 + 1298 + [[package]] 1299 + name = "nu-ansi-term" 1300 + version = "0.50.3" 1301 + source = "registry+https://github.com/rust-lang/crates.io-index" 1302 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 1303 + dependencies = [ 1304 + "windows-sys 0.61.2", 1305 + ] 1306 + 1307 + [[package]] 1308 + name = "num-conv" 1309 + version = "0.2.1" 1310 + source = "registry+https://github.com/rust-lang/crates.io-index" 1311 + checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" 1312 + 1313 + [[package]] 1314 + name = "num-derive" 1315 + version = "0.4.2" 1316 + source = "registry+https://github.com/rust-lang/crates.io-index" 1317 + checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 1318 + dependencies = [ 1319 + "proc-macro2", 1320 + "quote", 1321 + "syn 2.0.117", 1322 + ] 1323 + 1324 + [[package]] 1325 + name = "num-traits" 1326 + version = "0.2.19" 1327 + source = "registry+https://github.com/rust-lang/crates.io-index" 1328 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1329 + dependencies = [ 1330 + "autocfg", 1331 + ] 1332 + 1333 + [[package]] 1334 + name = "num_threads" 1335 + version = "0.1.7" 1336 + source = "registry+https://github.com/rust-lang/crates.io-index" 1337 + checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 1338 + dependencies = [ 1339 + "libc", 1340 + ] 1341 + 1342 + [[package]] 1343 + name = "once_cell" 1344 + version = "1.21.4" 1345 + source = "registry+https://github.com/rust-lang/crates.io-index" 1346 + checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" 1347 + 1348 + [[package]] 1349 + name = "openssl-probe" 1350 + version = "0.2.1" 1351 + source = "registry+https://github.com/rust-lang/crates.io-index" 1352 + checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" 1353 + 1354 + [[package]] 1355 + name = "option-ext" 1356 + version = "0.2.0" 1357 + source = "registry+https://github.com/rust-lang/crates.io-index" 1358 + checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1359 + 1360 + [[package]] 1361 + name = "ordered-float" 1362 + version = "4.6.0" 1363 + source = "registry+https://github.com/rust-lang/crates.io-index" 1364 + checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 1365 + dependencies = [ 1366 + "num-traits", 1367 + ] 1368 + 1369 + [[package]] 1370 + name = "parking_lot" 1371 + version = "0.12.5" 1372 + source = "registry+https://github.com/rust-lang/crates.io-index" 1373 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 1374 + dependencies = [ 1375 + "lock_api", 1376 + "parking_lot_core", 1377 + ] 1378 + 1379 + [[package]] 1380 + name = "parking_lot_core" 1381 + version = "0.9.12" 1382 + source = "registry+https://github.com/rust-lang/crates.io-index" 1383 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 1384 + dependencies = [ 1385 + "cfg-if", 1386 + "libc", 1387 + "redox_syscall", 1388 + "smallvec", 1389 + "windows-link", 1390 + ] 1391 + 1392 + [[package]] 1393 + name = "percent-encoding" 1394 + version = "2.3.2" 1395 + source = "registry+https://github.com/rust-lang/crates.io-index" 1396 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1397 + 1398 + [[package]] 1399 + name = "pest" 1400 + version = "2.8.6" 1401 + source = "registry+https://github.com/rust-lang/crates.io-index" 1402 + checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" 1403 + dependencies = [ 1404 + "memchr", 1405 + "ucd-trie", 1406 + ] 1407 + 1408 + [[package]] 1409 + name = "pest_derive" 1410 + version = "2.8.6" 1411 + source = "registry+https://github.com/rust-lang/crates.io-index" 1412 + checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" 1413 + dependencies = [ 1414 + "pest", 1415 + "pest_generator", 1416 + ] 1417 + 1418 + [[package]] 1419 + name = "pest_generator" 1420 + version = "2.8.6" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" 1423 + dependencies = [ 1424 + "pest", 1425 + "pest_meta", 1426 + "proc-macro2", 1427 + "quote", 1428 + "syn 2.0.117", 1429 + ] 1430 + 1431 + [[package]] 1432 + name = "pest_meta" 1433 + version = "2.8.6" 1434 + source = "registry+https://github.com/rust-lang/crates.io-index" 1435 + checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" 1436 + dependencies = [ 1437 + "pest", 1438 + "sha2", 1439 + ] 1440 + 1441 + [[package]] 1442 + name = "phf" 1443 + version = "0.11.3" 1444 + source = "registry+https://github.com/rust-lang/crates.io-index" 1445 + checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1446 + dependencies = [ 1447 + "phf_macros", 1448 + "phf_shared", 1449 + ] 1450 + 1451 + [[package]] 1452 + name = "phf_codegen" 1453 + version = "0.11.3" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" 1456 + dependencies = [ 1457 + "phf_generator", 1458 + "phf_shared", 1459 + ] 1460 + 1461 + [[package]] 1462 + name = "phf_generator" 1463 + version = "0.11.3" 1464 + source = "registry+https://github.com/rust-lang/crates.io-index" 1465 + checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 1466 + dependencies = [ 1467 + "phf_shared", 1468 + "rand 0.8.5", 1469 + ] 1470 + 1471 + [[package]] 1472 + name = "phf_macros" 1473 + version = "0.11.3" 1474 + source = "registry+https://github.com/rust-lang/crates.io-index" 1475 + checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" 1476 + dependencies = [ 1477 + "phf_generator", 1478 + "phf_shared", 1479 + "proc-macro2", 1480 + "quote", 1481 + "syn 2.0.117", 1482 + ] 1483 + 1484 + [[package]] 1485 + name = "phf_shared" 1486 + version = "0.11.3" 1487 + source = "registry+https://github.com/rust-lang/crates.io-index" 1488 + checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1489 + dependencies = [ 1490 + "siphasher", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "pin-project-lite" 1495 + version = "0.2.17" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" 1498 + 1499 + [[package]] 1500 + name = "pkg-config" 1501 + version = "0.3.32" 1502 + source = "registry+https://github.com/rust-lang/crates.io-index" 1503 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1504 + 1505 + [[package]] 1506 + name = "portable-atomic" 1507 + version = "1.13.1" 1508 + source = "registry+https://github.com/rust-lang/crates.io-index" 1509 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 1510 + 1511 + [[package]] 1512 + name = "potential_utf" 1513 + version = "0.1.5" 1514 + source = "registry+https://github.com/rust-lang/crates.io-index" 1515 + checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" 1516 + dependencies = [ 1517 + "zerovec", 1518 + ] 1519 + 1520 + [[package]] 1521 + name = "powerfmt" 1522 + version = "0.2.0" 1523 + source = "registry+https://github.com/rust-lang/crates.io-index" 1524 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1525 + 1526 + [[package]] 1527 + name = "ppv-lite86" 1528 + version = "0.2.21" 1529 + source = "registry+https://github.com/rust-lang/crates.io-index" 1530 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1531 + dependencies = [ 1532 + "zerocopy", 1533 + ] 1534 + 1535 + [[package]] 1536 + name = "prettyplease" 1537 + version = "0.2.37" 1538 + source = "registry+https://github.com/rust-lang/crates.io-index" 1539 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 1540 + dependencies = [ 1541 + "proc-macro2", 1542 + "syn 2.0.117", 1543 + ] 1544 + 1545 + [[package]] 1546 + name = "proc-macro2" 1547 + version = "1.0.106" 1548 + source = "registry+https://github.com/rust-lang/crates.io-index" 1549 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 1550 + dependencies = [ 1551 + "unicode-ident", 1552 + ] 1553 + 1554 + [[package]] 1555 + name = "quinn" 1556 + version = "0.11.9" 1557 + source = "registry+https://github.com/rust-lang/crates.io-index" 1558 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1559 + dependencies = [ 1560 + "bytes", 1561 + "cfg_aliases", 1562 + "pin-project-lite", 1563 + "quinn-proto", 1564 + "quinn-udp", 1565 + "rustc-hash", 1566 + "rustls", 1567 + "socket2", 1568 + "thiserror 2.0.18", 1569 + "tokio", 1570 + "tracing", 1571 + "web-time", 1572 + ] 1573 + 1574 + [[package]] 1575 + name = "quinn-proto" 1576 + version = "0.11.14" 1577 + source = "registry+https://github.com/rust-lang/crates.io-index" 1578 + checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" 1579 + dependencies = [ 1580 + "aws-lc-rs", 1581 + "bytes", 1582 + "getrandom 0.3.4", 1583 + "lru-slab", 1584 + "rand 0.9.2", 1585 + "ring", 1586 + "rustc-hash", 1587 + "rustls", 1588 + "rustls-pki-types", 1589 + "slab", 1590 + "thiserror 2.0.18", 1591 + "tinyvec", 1592 + "tracing", 1593 + "web-time", 1594 + ] 1595 + 1596 + [[package]] 1597 + name = "quinn-udp" 1598 + version = "0.5.14" 1599 + source = "registry+https://github.com/rust-lang/crates.io-index" 1600 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1601 + dependencies = [ 1602 + "cfg_aliases", 1603 + "libc", 1604 + "once_cell", 1605 + "socket2", 1606 + "tracing", 1607 + "windows-sys 0.59.0", 1608 + ] 1609 + 1610 + [[package]] 1611 + name = "quote" 1612 + version = "1.0.45" 1613 + source = "registry+https://github.com/rust-lang/crates.io-index" 1614 + checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" 1615 + dependencies = [ 1616 + "proc-macro2", 1617 + ] 1618 + 1619 + [[package]] 1620 + name = "r-efi" 1621 + version = "5.3.0" 1622 + source = "registry+https://github.com/rust-lang/crates.io-index" 1623 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1624 + 1625 + [[package]] 1626 + name = "r-efi" 1627 + version = "6.0.0" 1628 + source = "registry+https://github.com/rust-lang/crates.io-index" 1629 + checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" 1630 + 1631 + [[package]] 1632 + name = "rand" 1633 + version = "0.8.5" 1634 + source = "registry+https://github.com/rust-lang/crates.io-index" 1635 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1636 + dependencies = [ 1637 + "rand_core 0.6.4", 1638 + ] 1639 + 1640 + [[package]] 1641 + name = "rand" 1642 + version = "0.9.2" 1643 + source = "registry+https://github.com/rust-lang/crates.io-index" 1644 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1645 + dependencies = [ 1646 + "rand_chacha", 1647 + "rand_core 0.9.5", 1648 + ] 1649 + 1650 + [[package]] 1651 + name = "rand_chacha" 1652 + version = "0.9.0" 1653 + source = "registry+https://github.com/rust-lang/crates.io-index" 1654 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1655 + dependencies = [ 1656 + "ppv-lite86", 1657 + "rand_core 0.9.5", 1658 + ] 1659 + 1660 + [[package]] 1661 + name = "rand_core" 1662 + version = "0.6.4" 1663 + source = "registry+https://github.com/rust-lang/crates.io-index" 1664 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1665 + 1666 + [[package]] 1667 + name = "rand_core" 1668 + version = "0.9.5" 1669 + source = "registry+https://github.com/rust-lang/crates.io-index" 1670 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 1671 + dependencies = [ 1672 + "getrandom 0.3.4", 1673 + ] 1674 + 1675 + [[package]] 1676 + name = "ratatui" 1677 + version = "0.30.0" 1678 + source = "registry+https://github.com/rust-lang/crates.io-index" 1679 + checksum = "d1ce67fb8ba4446454d1c8dbaeda0557ff5e94d39d5e5ed7f10a65eb4c8266bc" 1680 + dependencies = [ 1681 + "instability", 1682 + "ratatui-core", 1683 + "ratatui-crossterm", 1684 + "ratatui-macros", 1685 + "ratatui-termwiz", 1686 + "ratatui-widgets", 1687 + ] 1688 + 1689 + [[package]] 1690 + name = "ratatui-core" 1691 + version = "0.1.0" 1692 + source = "registry+https://github.com/rust-lang/crates.io-index" 1693 + checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" 1694 + dependencies = [ 1695 + "bitflags 2.11.0", 1696 + "compact_str", 1697 + "hashbrown 0.16.1", 1698 + "indoc", 1699 + "itertools", 1700 + "kasuari", 1701 + "lru", 1702 + "strum", 1703 + "thiserror 2.0.18", 1704 + "unicode-segmentation", 1705 + "unicode-truncate", 1706 + "unicode-width", 1707 + ] 1708 + 1709 + [[package]] 1710 + name = "ratatui-crossterm" 1711 + version = "0.1.0" 1712 + source = "registry+https://github.com/rust-lang/crates.io-index" 1713 + checksum = "577c9b9f652b4c121fb25c6a391dd06406d3b092ba68827e6d2f09550edc54b3" 1714 + dependencies = [ 1715 + "cfg-if", 1716 + "crossterm", 1717 + "instability", 1718 + "ratatui-core", 1719 + ] 1720 + 1721 + [[package]] 1722 + name = "ratatui-macros" 1723 + version = "0.7.0" 1724 + source = "registry+https://github.com/rust-lang/crates.io-index" 1725 + checksum = "a7f1342a13e83e4bb9d0b793d0ea762be633f9582048c892ae9041ef39c936f4" 1726 + dependencies = [ 1727 + "ratatui-core", 1728 + "ratatui-widgets", 1729 + ] 1730 + 1731 + [[package]] 1732 + name = "ratatui-termwiz" 1733 + version = "0.1.0" 1734 + source = "registry+https://github.com/rust-lang/crates.io-index" 1735 + checksum = "0f76fe0bd0ed4295f0321b1676732e2454024c15a35d01904ddb315afd3d545c" 1736 + dependencies = [ 1737 + "ratatui-core", 1738 + "termwiz", 1739 + ] 1740 + 1741 + [[package]] 1742 + name = "ratatui-widgets" 1743 + version = "0.3.0" 1744 + source = "registry+https://github.com/rust-lang/crates.io-index" 1745 + checksum = "d7dbfa023cd4e604c2553483820c5fe8aa9d71a42eea5aa77c6e7f35756612db" 1746 + dependencies = [ 1747 + "bitflags 2.11.0", 1748 + "hashbrown 0.16.1", 1749 + "indoc", 1750 + "instability", 1751 + "itertools", 1752 + "line-clipping", 1753 + "ratatui-core", 1754 + "strum", 1755 + "time", 1756 + "unicode-segmentation", 1757 + "unicode-width", 1758 + ] 1759 + 1760 + [[package]] 1761 + name = "redox_syscall" 1762 + version = "0.5.18" 1763 + source = "registry+https://github.com/rust-lang/crates.io-index" 1764 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 1765 + dependencies = [ 1766 + "bitflags 2.11.0", 1767 + ] 1768 + 1769 + [[package]] 1770 + name = "redox_users" 1771 + version = "0.4.6" 1772 + source = "registry+https://github.com/rust-lang/crates.io-index" 1773 + checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1774 + dependencies = [ 1775 + "getrandom 0.2.17", 1776 + "libredox", 1777 + "thiserror 1.0.69", 1778 + ] 1779 + 1780 + [[package]] 1781 + name = "regex" 1782 + version = "1.12.3" 1783 + source = "registry+https://github.com/rust-lang/crates.io-index" 1784 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 1785 + dependencies = [ 1786 + "aho-corasick", 1787 + "memchr", 1788 + "regex-automata", 1789 + "regex-syntax", 1790 + ] 1791 + 1792 + [[package]] 1793 + name = "regex-automata" 1794 + version = "0.4.14" 1795 + source = "registry+https://github.com/rust-lang/crates.io-index" 1796 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 1797 + dependencies = [ 1798 + "aho-corasick", 1799 + "memchr", 1800 + "regex-syntax", 1801 + ] 1802 + 1803 + [[package]] 1804 + name = "regex-syntax" 1805 + version = "0.8.10" 1806 + source = "registry+https://github.com/rust-lang/crates.io-index" 1807 + checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" 1808 + 1809 + [[package]] 1810 + name = "reqwest" 1811 + version = "0.13.2" 1812 + source = "registry+https://github.com/rust-lang/crates.io-index" 1813 + checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" 1814 + dependencies = [ 1815 + "base64", 1816 + "bytes", 1817 + "encoding_rs", 1818 + "futures-core", 1819 + "futures-util", 1820 + "h2", 1821 + "http", 1822 + "http-body", 1823 + "http-body-util", 1824 + "hyper", 1825 + "hyper-rustls", 1826 + "hyper-util", 1827 + "js-sys", 1828 + "log", 1829 + "mime", 1830 + "percent-encoding", 1831 + "pin-project-lite", 1832 + "quinn", 1833 + "rustls", 1834 + "rustls-pki-types", 1835 + "rustls-platform-verifier", 1836 + "serde", 1837 + "serde_json", 1838 + "sync_wrapper", 1839 + "tokio", 1840 + "tokio-rustls", 1841 + "tokio-util", 1842 + "tower", 1843 + "tower-http", 1844 + "tower-service", 1845 + "url", 1846 + "wasm-bindgen", 1847 + "wasm-bindgen-futures", 1848 + "wasm-streams", 1849 + "web-sys", 1850 + ] 1851 + 1852 + [[package]] 1853 + name = "ring" 1854 + version = "0.17.14" 1855 + source = "registry+https://github.com/rust-lang/crates.io-index" 1856 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1857 + dependencies = [ 1858 + "cc", 1859 + "cfg-if", 1860 + "getrandom 0.2.17", 1861 + "libc", 1862 + "untrusted", 1863 + "windows-sys 0.52.0", 1864 + ] 1865 + 1866 + [[package]] 1867 + name = "rsqlite-vfs" 1868 + version = "0.1.0" 1869 + source = "registry+https://github.com/rust-lang/crates.io-index" 1870 + checksum = "a8a1f2315036ef6b1fbacd1972e8ee7688030b0a2121edfc2a6550febd41574d" 1871 + dependencies = [ 1872 + "hashbrown 0.16.1", 1873 + "thiserror 2.0.18", 1874 + ] 1875 + 1876 + [[package]] 1877 + name = "rusqlite" 1878 + version = "0.39.0" 1879 + source = "registry+https://github.com/rust-lang/crates.io-index" 1880 + checksum = "a0d2b0146dd9661bf67bb107c0bb2a55064d556eeb3fc314151b957f313bcd4e" 1881 + dependencies = [ 1882 + "bitflags 2.11.0", 1883 + "fallible-iterator", 1884 + "fallible-streaming-iterator", 1885 + "hashlink", 1886 + "libsqlite3-sys", 1887 + "smallvec", 1888 + "sqlite-wasm-rs", 1889 + ] 1890 + 1891 + [[package]] 1892 + name = "rustc-hash" 1893 + version = "2.1.2" 1894 + source = "registry+https://github.com/rust-lang/crates.io-index" 1895 + checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" 1896 + 1897 + [[package]] 1898 + name = "rustc_version" 1899 + version = "0.4.1" 1900 + source = "registry+https://github.com/rust-lang/crates.io-index" 1901 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 1902 + dependencies = [ 1903 + "semver", 1904 + ] 1905 + 1906 + [[package]] 1907 + name = "rustix" 1908 + version = "1.1.4" 1909 + source = "registry+https://github.com/rust-lang/crates.io-index" 1910 + checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" 1911 + dependencies = [ 1912 + "bitflags 2.11.0", 1913 + "errno", 1914 + "libc", 1915 + "linux-raw-sys", 1916 + "windows-sys 0.61.2", 1917 + ] 1918 + 1919 + [[package]] 1920 + name = "rustls" 1921 + version = "0.23.37" 1922 + source = "registry+https://github.com/rust-lang/crates.io-index" 1923 + checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" 1924 + dependencies = [ 1925 + "aws-lc-rs", 1926 + "once_cell", 1927 + "rustls-pki-types", 1928 + "rustls-webpki", 1929 + "subtle", 1930 + "zeroize", 1931 + ] 1932 + 1933 + [[package]] 1934 + name = "rustls-native-certs" 1935 + version = "0.8.3" 1936 + source = "registry+https://github.com/rust-lang/crates.io-index" 1937 + checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" 1938 + dependencies = [ 1939 + "openssl-probe", 1940 + "rustls-pki-types", 1941 + "schannel", 1942 + "security-framework", 1943 + ] 1944 + 1945 + [[package]] 1946 + name = "rustls-pki-types" 1947 + version = "1.14.0" 1948 + source = "registry+https://github.com/rust-lang/crates.io-index" 1949 + checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 1950 + dependencies = [ 1951 + "web-time", 1952 + "zeroize", 1953 + ] 1954 + 1955 + [[package]] 1956 + name = "rustls-platform-verifier" 1957 + version = "0.6.2" 1958 + source = "registry+https://github.com/rust-lang/crates.io-index" 1959 + checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" 1960 + dependencies = [ 1961 + "core-foundation 0.10.1", 1962 + "core-foundation-sys", 1963 + "jni", 1964 + "log", 1965 + "once_cell", 1966 + "rustls", 1967 + "rustls-native-certs", 1968 + "rustls-platform-verifier-android", 1969 + "rustls-webpki", 1970 + "security-framework", 1971 + "security-framework-sys", 1972 + "webpki-root-certs", 1973 + "windows-sys 0.61.2", 1974 + ] 1975 + 1976 + [[package]] 1977 + name = "rustls-platform-verifier-android" 1978 + version = "0.1.1" 1979 + source = "registry+https://github.com/rust-lang/crates.io-index" 1980 + checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" 1981 + 1982 + [[package]] 1983 + name = "rustls-webpki" 1984 + version = "0.103.10" 1985 + source = "registry+https://github.com/rust-lang/crates.io-index" 1986 + checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" 1987 + dependencies = [ 1988 + "aws-lc-rs", 1989 + "ring", 1990 + "rustls-pki-types", 1991 + "untrusted", 1992 + ] 1993 + 1994 + [[package]] 1995 + name = "rustversion" 1996 + version = "1.0.22" 1997 + source = "registry+https://github.com/rust-lang/crates.io-index" 1998 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1999 + 2000 + [[package]] 2001 + name = "ryu" 2002 + version = "1.0.23" 2003 + source = "registry+https://github.com/rust-lang/crates.io-index" 2004 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 2005 + 2006 + [[package]] 2007 + name = "same-file" 2008 + version = "1.0.6" 2009 + source = "registry+https://github.com/rust-lang/crates.io-index" 2010 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2011 + dependencies = [ 2012 + "winapi-util", 2013 + ] 2014 + 2015 + [[package]] 2016 + name = "schannel" 2017 + version = "0.1.29" 2018 + source = "registry+https://github.com/rust-lang/crates.io-index" 2019 + checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" 2020 + dependencies = [ 2021 + "windows-sys 0.61.2", 2022 + ] 2023 + 2024 + [[package]] 2025 + name = "scopeguard" 2026 + version = "1.2.0" 2027 + source = "registry+https://github.com/rust-lang/crates.io-index" 2028 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2029 + 2030 + [[package]] 2031 + name = "security-framework" 2032 + version = "3.7.0" 2033 + source = "registry+https://github.com/rust-lang/crates.io-index" 2034 + checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" 2035 + dependencies = [ 2036 + "bitflags 2.11.0", 2037 + "core-foundation 0.10.1", 2038 + "core-foundation-sys", 2039 + "libc", 2040 + "security-framework-sys", 2041 + ] 2042 + 2043 + [[package]] 2044 + name = "security-framework-sys" 2045 + version = "2.17.0" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" 2048 + dependencies = [ 2049 + "core-foundation-sys", 2050 + "libc", 2051 + ] 2052 + 2053 + [[package]] 2054 + name = "semver" 2055 + version = "1.0.28" 2056 + source = "registry+https://github.com/rust-lang/crates.io-index" 2057 + checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" 2058 + 2059 + [[package]] 2060 + name = "serde" 2061 + version = "1.0.228" 2062 + source = "registry+https://github.com/rust-lang/crates.io-index" 2063 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 2064 + dependencies = [ 2065 + "serde_core", 2066 + "serde_derive", 2067 + ] 2068 + 2069 + [[package]] 2070 + name = "serde_core" 2071 + version = "1.0.228" 2072 + source = "registry+https://github.com/rust-lang/crates.io-index" 2073 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 2074 + dependencies = [ 2075 + "serde_derive", 2076 + ] 2077 + 2078 + [[package]] 2079 + name = "serde_derive" 2080 + version = "1.0.228" 2081 + source = "registry+https://github.com/rust-lang/crates.io-index" 2082 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2083 + dependencies = [ 2084 + "proc-macro2", 2085 + "quote", 2086 + "syn 2.0.117", 2087 + ] 2088 + 2089 + [[package]] 2090 + name = "serde_json" 2091 + version = "1.0.149" 2092 + source = "registry+https://github.com/rust-lang/crates.io-index" 2093 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 2094 + dependencies = [ 2095 + "itoa", 2096 + "memchr", 2097 + "serde", 2098 + "serde_core", 2099 + "zmij", 2100 + ] 2101 + 2102 + [[package]] 2103 + name = "sha2" 2104 + version = "0.10.9" 2105 + source = "registry+https://github.com/rust-lang/crates.io-index" 2106 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 2107 + dependencies = [ 2108 + "cfg-if", 2109 + "cpufeatures", 2110 + "digest", 2111 + ] 2112 + 2113 + [[package]] 2114 + name = "sharded-slab" 2115 + version = "0.1.7" 2116 + source = "registry+https://github.com/rust-lang/crates.io-index" 2117 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2118 + dependencies = [ 2119 + "lazy_static", 2120 + ] 2121 + 2122 + [[package]] 2123 + name = "shlex" 2124 + version = "1.3.0" 2125 + source = "registry+https://github.com/rust-lang/crates.io-index" 2126 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2127 + 2128 + [[package]] 2129 + name = "signal-hook" 2130 + version = "0.3.18" 2131 + source = "registry+https://github.com/rust-lang/crates.io-index" 2132 + checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" 2133 + dependencies = [ 2134 + "libc", 2135 + "signal-hook-registry", 2136 + ] 2137 + 2138 + [[package]] 2139 + name = "signal-hook-mio" 2140 + version = "0.2.5" 2141 + source = "registry+https://github.com/rust-lang/crates.io-index" 2142 + checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" 2143 + dependencies = [ 2144 + "libc", 2145 + "mio", 2146 + "signal-hook", 2147 + ] 2148 + 2149 + [[package]] 2150 + name = "signal-hook-registry" 2151 + version = "1.4.8" 2152 + source = "registry+https://github.com/rust-lang/crates.io-index" 2153 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 2154 + dependencies = [ 2155 + "errno", 2156 + "libc", 2157 + ] 2158 + 2159 + [[package]] 2160 + name = "siphasher" 2161 + version = "1.0.2" 2162 + source = "registry+https://github.com/rust-lang/crates.io-index" 2163 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 2164 + 2165 + [[package]] 2166 + name = "slab" 2167 + version = "0.4.12" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 2170 + 2171 + [[package]] 2172 + name = "smallvec" 2173 + version = "1.15.1" 2174 + source = "registry+https://github.com/rust-lang/crates.io-index" 2175 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 2176 + 2177 + [[package]] 2178 + name = "socket2" 2179 + version = "0.6.3" 2180 + source = "registry+https://github.com/rust-lang/crates.io-index" 2181 + checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" 2182 + dependencies = [ 2183 + "libc", 2184 + "windows-sys 0.61.2", 2185 + ] 2186 + 2187 + [[package]] 2188 + name = "sqlite-wasm-rs" 2189 + version = "0.5.2" 2190 + source = "registry+https://github.com/rust-lang/crates.io-index" 2191 + checksum = "2f4206ed3a67690b9c29b77d728f6acc3ce78f16bf846d83c94f76400320181b" 2192 + dependencies = [ 2193 + "cc", 2194 + "js-sys", 2195 + "rsqlite-vfs", 2196 + "wasm-bindgen", 2197 + ] 2198 + 2199 + [[package]] 2200 + name = "stable_deref_trait" 2201 + version = "1.2.1" 2202 + source = "registry+https://github.com/rust-lang/crates.io-index" 2203 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 2204 + 2205 + [[package]] 2206 + name = "static_assertions" 2207 + version = "1.1.0" 2208 + source = "registry+https://github.com/rust-lang/crates.io-index" 2209 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2210 + 2211 + [[package]] 2212 + name = "strsim" 2213 + version = "0.11.1" 2214 + source = "registry+https://github.com/rust-lang/crates.io-index" 2215 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2216 + 2217 + [[package]] 2218 + name = "strum" 2219 + version = "0.27.2" 2220 + source = "registry+https://github.com/rust-lang/crates.io-index" 2221 + checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" 2222 + dependencies = [ 2223 + "strum_macros", 2224 + ] 2225 + 2226 + [[package]] 2227 + name = "strum_macros" 2228 + version = "0.27.2" 2229 + source = "registry+https://github.com/rust-lang/crates.io-index" 2230 + checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" 2231 + dependencies = [ 2232 + "heck", 2233 + "proc-macro2", 2234 + "quote", 2235 + "syn 2.0.117", 2236 + ] 2237 + 2238 + [[package]] 2239 + name = "subtle" 2240 + version = "2.6.1" 2241 + source = "registry+https://github.com/rust-lang/crates.io-index" 2242 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2243 + 2244 + [[package]] 2245 + name = "syn" 2246 + version = "1.0.109" 2247 + source = "registry+https://github.com/rust-lang/crates.io-index" 2248 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2249 + dependencies = [ 2250 + "proc-macro2", 2251 + "quote", 2252 + "unicode-ident", 2253 + ] 2254 + 2255 + [[package]] 2256 + name = "syn" 2257 + version = "2.0.117" 2258 + source = "registry+https://github.com/rust-lang/crates.io-index" 2259 + checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" 2260 + dependencies = [ 2261 + "proc-macro2", 2262 + "quote", 2263 + "unicode-ident", 2264 + ] 2265 + 2266 + [[package]] 2267 + name = "sync_wrapper" 2268 + version = "1.0.2" 2269 + source = "registry+https://github.com/rust-lang/crates.io-index" 2270 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2271 + dependencies = [ 2272 + "futures-core", 2273 + ] 2274 + 2275 + [[package]] 2276 + name = "synstructure" 2277 + version = "0.13.2" 2278 + source = "registry+https://github.com/rust-lang/crates.io-index" 2279 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2280 + dependencies = [ 2281 + "proc-macro2", 2282 + "quote", 2283 + "syn 2.0.117", 2284 + ] 2285 + 2286 + [[package]] 2287 + name = "system-configuration" 2288 + version = "0.7.0" 2289 + source = "registry+https://github.com/rust-lang/crates.io-index" 2290 + checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" 2291 + dependencies = [ 2292 + "bitflags 2.11.0", 2293 + "core-foundation 0.9.4", 2294 + "system-configuration-sys", 2295 + ] 2296 + 2297 + [[package]] 2298 + name = "system-configuration-sys" 2299 + version = "0.6.0" 2300 + source = "registry+https://github.com/rust-lang/crates.io-index" 2301 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 2302 + dependencies = [ 2303 + "core-foundation-sys", 2304 + "libc", 2305 + ] 2306 + 2307 + [[package]] 2308 + name = "terminfo" 2309 + version = "0.9.0" 2310 + source = "registry+https://github.com/rust-lang/crates.io-index" 2311 + checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" 2312 + dependencies = [ 2313 + "fnv", 2314 + "nom", 2315 + "phf", 2316 + "phf_codegen", 2317 + ] 2318 + 2319 + [[package]] 2320 + name = "termios" 2321 + version = "0.3.3" 2322 + source = "registry+https://github.com/rust-lang/crates.io-index" 2323 + checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" 2324 + dependencies = [ 2325 + "libc", 2326 + ] 2327 + 2328 + [[package]] 2329 + name = "termwiz" 2330 + version = "0.23.3" 2331 + source = "registry+https://github.com/rust-lang/crates.io-index" 2332 + checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" 2333 + dependencies = [ 2334 + "anyhow", 2335 + "base64", 2336 + "bitflags 2.11.0", 2337 + "fancy-regex", 2338 + "filedescriptor", 2339 + "finl_unicode", 2340 + "fixedbitset", 2341 + "hex", 2342 + "lazy_static", 2343 + "libc", 2344 + "log", 2345 + "memmem", 2346 + "nix", 2347 + "num-derive", 2348 + "num-traits", 2349 + "ordered-float", 2350 + "pest", 2351 + "pest_derive", 2352 + "phf", 2353 + "sha2", 2354 + "signal-hook", 2355 + "siphasher", 2356 + "terminfo", 2357 + "termios", 2358 + "thiserror 1.0.69", 2359 + "ucd-trie", 2360 + "unicode-segmentation", 2361 + "vtparse", 2362 + "wezterm-bidi", 2363 + "wezterm-blob-leases", 2364 + "wezterm-color-types", 2365 + "wezterm-dynamic", 2366 + "wezterm-input-types", 2367 + "winapi", 2368 + ] 2369 + 2370 + [[package]] 2371 + name = "thiserror" 2372 + version = "1.0.69" 2373 + source = "registry+https://github.com/rust-lang/crates.io-index" 2374 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2375 + dependencies = [ 2376 + "thiserror-impl 1.0.69", 2377 + ] 2378 + 2379 + [[package]] 2380 + name = "thiserror" 2381 + version = "2.0.18" 2382 + source = "registry+https://github.com/rust-lang/crates.io-index" 2383 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 2384 + dependencies = [ 2385 + "thiserror-impl 2.0.18", 2386 + ] 2387 + 2388 + [[package]] 2389 + name = "thiserror-impl" 2390 + version = "1.0.69" 2391 + source = "registry+https://github.com/rust-lang/crates.io-index" 2392 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2393 + dependencies = [ 2394 + "proc-macro2", 2395 + "quote", 2396 + "syn 2.0.117", 2397 + ] 2398 + 2399 + [[package]] 2400 + name = "thiserror-impl" 2401 + version = "2.0.18" 2402 + source = "registry+https://github.com/rust-lang/crates.io-index" 2403 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 2404 + dependencies = [ 2405 + "proc-macro2", 2406 + "quote", 2407 + "syn 2.0.117", 2408 + ] 2409 + 2410 + [[package]] 2411 + name = "thread_local" 2412 + version = "1.1.9" 2413 + source = "registry+https://github.com/rust-lang/crates.io-index" 2414 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 2415 + dependencies = [ 2416 + "cfg-if", 2417 + ] 2418 + 2419 + [[package]] 2420 + name = "time" 2421 + version = "0.3.47" 2422 + source = "registry+https://github.com/rust-lang/crates.io-index" 2423 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 2424 + dependencies = [ 2425 + "deranged", 2426 + "libc", 2427 + "num-conv", 2428 + "num_threads", 2429 + "powerfmt", 2430 + "serde_core", 2431 + "time-core", 2432 + ] 2433 + 2434 + [[package]] 2435 + name = "time-core" 2436 + version = "0.1.8" 2437 + source = "registry+https://github.com/rust-lang/crates.io-index" 2438 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 2439 + 2440 + [[package]] 2441 + name = "tinystr" 2442 + version = "0.8.3" 2443 + source = "registry+https://github.com/rust-lang/crates.io-index" 2444 + checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" 2445 + dependencies = [ 2446 + "displaydoc", 2447 + "zerovec", 2448 + ] 2449 + 2450 + [[package]] 2451 + name = "tinyvec" 2452 + version = "1.11.0" 2453 + source = "registry+https://github.com/rust-lang/crates.io-index" 2454 + checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" 2455 + dependencies = [ 2456 + "tinyvec_macros", 2457 + ] 2458 + 2459 + [[package]] 2460 + name = "tinyvec_macros" 2461 + version = "0.1.1" 2462 + source = "registry+https://github.com/rust-lang/crates.io-index" 2463 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2464 + 2465 + [[package]] 2466 + name = "tokio" 2467 + version = "1.51.0" 2468 + source = "registry+https://github.com/rust-lang/crates.io-index" 2469 + checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" 2470 + dependencies = [ 2471 + "bytes", 2472 + "libc", 2473 + "mio", 2474 + "parking_lot", 2475 + "pin-project-lite", 2476 + "signal-hook-registry", 2477 + "socket2", 2478 + "tokio-macros", 2479 + "windows-sys 0.61.2", 2480 + ] 2481 + 2482 + [[package]] 2483 + name = "tokio-macros" 2484 + version = "2.7.0" 2485 + source = "registry+https://github.com/rust-lang/crates.io-index" 2486 + checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" 2487 + dependencies = [ 2488 + "proc-macro2", 2489 + "quote", 2490 + "syn 2.0.117", 2491 + ] 2492 + 2493 + [[package]] 2494 + name = "tokio-rustls" 2495 + version = "0.26.4" 2496 + source = "registry+https://github.com/rust-lang/crates.io-index" 2497 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 2498 + dependencies = [ 2499 + "rustls", 2500 + "tokio", 2501 + ] 2502 + 2503 + [[package]] 2504 + name = "tokio-util" 2505 + version = "0.7.18" 2506 + source = "registry+https://github.com/rust-lang/crates.io-index" 2507 + checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" 2508 + dependencies = [ 2509 + "bytes", 2510 + "futures-core", 2511 + "futures-sink", 2512 + "pin-project-lite", 2513 + "tokio", 2514 + ] 2515 + 2516 + [[package]] 2517 + name = "tower" 2518 + version = "0.5.3" 2519 + source = "registry+https://github.com/rust-lang/crates.io-index" 2520 + checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 2521 + dependencies = [ 2522 + "futures-core", 2523 + "futures-util", 2524 + "pin-project-lite", 2525 + "sync_wrapper", 2526 + "tokio", 2527 + "tower-layer", 2528 + "tower-service", 2529 + ] 2530 + 2531 + [[package]] 2532 + name = "tower-http" 2533 + version = "0.6.8" 2534 + source = "registry+https://github.com/rust-lang/crates.io-index" 2535 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 2536 + dependencies = [ 2537 + "bitflags 2.11.0", 2538 + "bytes", 2539 + "futures-util", 2540 + "http", 2541 + "http-body", 2542 + "iri-string", 2543 + "pin-project-lite", 2544 + "tower", 2545 + "tower-layer", 2546 + "tower-service", 2547 + ] 2548 + 2549 + [[package]] 2550 + name = "tower-layer" 2551 + version = "0.3.3" 2552 + source = "registry+https://github.com/rust-lang/crates.io-index" 2553 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2554 + 2555 + [[package]] 2556 + name = "tower-service" 2557 + version = "0.3.3" 2558 + source = "registry+https://github.com/rust-lang/crates.io-index" 2559 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2560 + 2561 + [[package]] 2562 + name = "tracing" 2563 + version = "0.1.44" 2564 + source = "registry+https://github.com/rust-lang/crates.io-index" 2565 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 2566 + dependencies = [ 2567 + "pin-project-lite", 2568 + "tracing-attributes", 2569 + "tracing-core", 2570 + ] 2571 + 2572 + [[package]] 2573 + name = "tracing-attributes" 2574 + version = "0.1.31" 2575 + source = "registry+https://github.com/rust-lang/crates.io-index" 2576 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 2577 + dependencies = [ 2578 + "proc-macro2", 2579 + "quote", 2580 + "syn 2.0.117", 2581 + ] 2582 + 2583 + [[package]] 2584 + name = "tracing-core" 2585 + version = "0.1.36" 2586 + source = "registry+https://github.com/rust-lang/crates.io-index" 2587 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 2588 + dependencies = [ 2589 + "once_cell", 2590 + "valuable", 2591 + ] 2592 + 2593 + [[package]] 2594 + name = "tracing-log" 2595 + version = "0.2.0" 2596 + source = "registry+https://github.com/rust-lang/crates.io-index" 2597 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2598 + dependencies = [ 2599 + "log", 2600 + "once_cell", 2601 + "tracing-core", 2602 + ] 2603 + 2604 + [[package]] 2605 + name = "tracing-subscriber" 2606 + version = "0.3.23" 2607 + source = "registry+https://github.com/rust-lang/crates.io-index" 2608 + checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" 2609 + dependencies = [ 2610 + "nu-ansi-term", 2611 + "sharded-slab", 2612 + "smallvec", 2613 + "thread_local", 2614 + "tracing-core", 2615 + "tracing-log", 2616 + ] 2617 + 2618 + [[package]] 2619 + name = "try-lock" 2620 + version = "0.2.5" 2621 + source = "registry+https://github.com/rust-lang/crates.io-index" 2622 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2623 + 2624 + [[package]] 2625 + name = "typenum" 2626 + version = "1.19.0" 2627 + source = "registry+https://github.com/rust-lang/crates.io-index" 2628 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 2629 + 2630 + [[package]] 2631 + name = "ucd-trie" 2632 + version = "0.1.7" 2633 + source = "registry+https://github.com/rust-lang/crates.io-index" 2634 + checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2635 + 2636 + [[package]] 2637 + name = "unicode-ident" 2638 + version = "1.0.24" 2639 + source = "registry+https://github.com/rust-lang/crates.io-index" 2640 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 2641 + 2642 + [[package]] 2643 + name = "unicode-segmentation" 2644 + version = "1.13.2" 2645 + source = "registry+https://github.com/rust-lang/crates.io-index" 2646 + checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" 2647 + 2648 + [[package]] 2649 + name = "unicode-truncate" 2650 + version = "2.0.1" 2651 + source = "registry+https://github.com/rust-lang/crates.io-index" 2652 + checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" 2653 + dependencies = [ 2654 + "itertools", 2655 + "unicode-segmentation", 2656 + "unicode-width", 2657 + ] 2658 + 2659 + [[package]] 2660 + name = "unicode-width" 2661 + version = "0.2.2" 2662 + source = "registry+https://github.com/rust-lang/crates.io-index" 2663 + checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" 2664 + 2665 + [[package]] 2666 + name = "unicode-xid" 2667 + version = "0.2.6" 2668 + source = "registry+https://github.com/rust-lang/crates.io-index" 2669 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2670 + 2671 + [[package]] 2672 + name = "untrusted" 2673 + version = "0.9.0" 2674 + source = "registry+https://github.com/rust-lang/crates.io-index" 2675 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2676 + 2677 + [[package]] 2678 + name = "url" 2679 + version = "2.5.8" 2680 + source = "registry+https://github.com/rust-lang/crates.io-index" 2681 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 2682 + dependencies = [ 2683 + "form_urlencoded", 2684 + "idna", 2685 + "percent-encoding", 2686 + "serde", 2687 + ] 2688 + 2689 + [[package]] 2690 + name = "utf8_iter" 2691 + version = "1.0.4" 2692 + source = "registry+https://github.com/rust-lang/crates.io-index" 2693 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2694 + 2695 + [[package]] 2696 + name = "utf8parse" 2697 + version = "0.2.2" 2698 + source = "registry+https://github.com/rust-lang/crates.io-index" 2699 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2700 + 2701 + [[package]] 2702 + name = "uuid" 2703 + version = "1.23.0" 2704 + source = "registry+https://github.com/rust-lang/crates.io-index" 2705 + checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" 2706 + dependencies = [ 2707 + "atomic", 2708 + "getrandom 0.4.2", 2709 + "js-sys", 2710 + "wasm-bindgen", 2711 + ] 2712 + 2713 + [[package]] 2714 + name = "valuable" 2715 + version = "0.1.1" 2716 + source = "registry+https://github.com/rust-lang/crates.io-index" 2717 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2718 + 2719 + [[package]] 2720 + name = "vcpkg" 2721 + version = "0.2.15" 2722 + source = "registry+https://github.com/rust-lang/crates.io-index" 2723 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2724 + 2725 + [[package]] 2726 + name = "version_check" 2727 + version = "0.9.5" 2728 + source = "registry+https://github.com/rust-lang/crates.io-index" 2729 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2730 + 2731 + [[package]] 2732 + name = "vtparse" 2733 + version = "0.6.2" 2734 + source = "registry+https://github.com/rust-lang/crates.io-index" 2735 + checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" 2736 + dependencies = [ 2737 + "utf8parse", 2738 + ] 2739 + 2740 + [[package]] 2741 + name = "walkdir" 2742 + version = "2.5.0" 2743 + source = "registry+https://github.com/rust-lang/crates.io-index" 2744 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2745 + dependencies = [ 2746 + "same-file", 2747 + "winapi-util", 2748 + ] 2749 + 2750 + [[package]] 2751 + name = "want" 2752 + version = "0.3.1" 2753 + source = "registry+https://github.com/rust-lang/crates.io-index" 2754 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2755 + dependencies = [ 2756 + "try-lock", 2757 + ] 2758 + 2759 + [[package]] 2760 + name = "wasi" 2761 + version = "0.11.1+wasi-snapshot-preview1" 2762 + source = "registry+https://github.com/rust-lang/crates.io-index" 2763 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2764 + 2765 + [[package]] 2766 + name = "wasip2" 2767 + version = "1.0.2+wasi-0.2.9" 2768 + source = "registry+https://github.com/rust-lang/crates.io-index" 2769 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 2770 + dependencies = [ 2771 + "wit-bindgen", 2772 + ] 2773 + 2774 + [[package]] 2775 + name = "wasip3" 2776 + version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 2777 + source = "registry+https://github.com/rust-lang/crates.io-index" 2778 + checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 2779 + dependencies = [ 2780 + "wit-bindgen", 2781 + ] 2782 + 2783 + [[package]] 2784 + name = "wasm-bindgen" 2785 + version = "0.2.117" 2786 + source = "registry+https://github.com/rust-lang/crates.io-index" 2787 + checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" 2788 + dependencies = [ 2789 + "cfg-if", 2790 + "once_cell", 2791 + "rustversion", 2792 + "wasm-bindgen-macro", 2793 + "wasm-bindgen-shared", 2794 + ] 2795 + 2796 + [[package]] 2797 + name = "wasm-bindgen-futures" 2798 + version = "0.4.67" 2799 + source = "registry+https://github.com/rust-lang/crates.io-index" 2800 + checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" 2801 + dependencies = [ 2802 + "js-sys", 2803 + "wasm-bindgen", 2804 + ] 2805 + 2806 + [[package]] 2807 + name = "wasm-bindgen-macro" 2808 + version = "0.2.117" 2809 + source = "registry+https://github.com/rust-lang/crates.io-index" 2810 + checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" 2811 + dependencies = [ 2812 + "quote", 2813 + "wasm-bindgen-macro-support", 2814 + ] 2815 + 2816 + [[package]] 2817 + name = "wasm-bindgen-macro-support" 2818 + version = "0.2.117" 2819 + source = "registry+https://github.com/rust-lang/crates.io-index" 2820 + checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" 2821 + dependencies = [ 2822 + "bumpalo", 2823 + "proc-macro2", 2824 + "quote", 2825 + "syn 2.0.117", 2826 + "wasm-bindgen-shared", 2827 + ] 2828 + 2829 + [[package]] 2830 + name = "wasm-bindgen-shared" 2831 + version = "0.2.117" 2832 + source = "registry+https://github.com/rust-lang/crates.io-index" 2833 + checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" 2834 + dependencies = [ 2835 + "unicode-ident", 2836 + ] 2837 + 2838 + [[package]] 2839 + name = "wasm-encoder" 2840 + version = "0.244.0" 2841 + source = "registry+https://github.com/rust-lang/crates.io-index" 2842 + checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 2843 + dependencies = [ 2844 + "leb128fmt", 2845 + "wasmparser", 2846 + ] 2847 + 2848 + [[package]] 2849 + name = "wasm-metadata" 2850 + version = "0.244.0" 2851 + source = "registry+https://github.com/rust-lang/crates.io-index" 2852 + checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 2853 + dependencies = [ 2854 + "anyhow", 2855 + "indexmap", 2856 + "wasm-encoder", 2857 + "wasmparser", 2858 + ] 2859 + 2860 + [[package]] 2861 + name = "wasm-streams" 2862 + version = "0.5.0" 2863 + source = "registry+https://github.com/rust-lang/crates.io-index" 2864 + checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" 2865 + dependencies = [ 2866 + "futures-util", 2867 + "js-sys", 2868 + "wasm-bindgen", 2869 + "wasm-bindgen-futures", 2870 + "web-sys", 2871 + ] 2872 + 2873 + [[package]] 2874 + name = "wasmparser" 2875 + version = "0.244.0" 2876 + source = "registry+https://github.com/rust-lang/crates.io-index" 2877 + checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 2878 + dependencies = [ 2879 + "bitflags 2.11.0", 2880 + "hashbrown 0.15.5", 2881 + "indexmap", 2882 + "semver", 2883 + ] 2884 + 2885 + [[package]] 2886 + name = "web-sys" 2887 + version = "0.3.94" 2888 + source = "registry+https://github.com/rust-lang/crates.io-index" 2889 + checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" 2890 + dependencies = [ 2891 + "js-sys", 2892 + "wasm-bindgen", 2893 + ] 2894 + 2895 + [[package]] 2896 + name = "web-time" 2897 + version = "1.1.0" 2898 + source = "registry+https://github.com/rust-lang/crates.io-index" 2899 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2900 + dependencies = [ 2901 + "js-sys", 2902 + "wasm-bindgen", 2903 + ] 2904 + 2905 + [[package]] 2906 + name = "webpki-root-certs" 2907 + version = "1.0.6" 2908 + source = "registry+https://github.com/rust-lang/crates.io-index" 2909 + checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" 2910 + dependencies = [ 2911 + "rustls-pki-types", 2912 + ] 2913 + 2914 + [[package]] 2915 + name = "wezterm-bidi" 2916 + version = "0.2.3" 2917 + source = "registry+https://github.com/rust-lang/crates.io-index" 2918 + checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" 2919 + dependencies = [ 2920 + "log", 2921 + "wezterm-dynamic", 2922 + ] 2923 + 2924 + [[package]] 2925 + name = "wezterm-blob-leases" 2926 + version = "0.1.1" 2927 + source = "registry+https://github.com/rust-lang/crates.io-index" 2928 + checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" 2929 + dependencies = [ 2930 + "getrandom 0.3.4", 2931 + "mac_address", 2932 + "sha2", 2933 + "thiserror 1.0.69", 2934 + "uuid", 2935 + ] 2936 + 2937 + [[package]] 2938 + name = "wezterm-color-types" 2939 + version = "0.3.0" 2940 + source = "registry+https://github.com/rust-lang/crates.io-index" 2941 + checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" 2942 + dependencies = [ 2943 + "csscolorparser", 2944 + "deltae", 2945 + "lazy_static", 2946 + "wezterm-dynamic", 2947 + ] 2948 + 2949 + [[package]] 2950 + name = "wezterm-dynamic" 2951 + version = "0.2.1" 2952 + source = "registry+https://github.com/rust-lang/crates.io-index" 2953 + checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" 2954 + dependencies = [ 2955 + "log", 2956 + "ordered-float", 2957 + "strsim", 2958 + "thiserror 1.0.69", 2959 + "wezterm-dynamic-derive", 2960 + ] 2961 + 2962 + [[package]] 2963 + name = "wezterm-dynamic-derive" 2964 + version = "0.1.1" 2965 + source = "registry+https://github.com/rust-lang/crates.io-index" 2966 + checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" 2967 + dependencies = [ 2968 + "proc-macro2", 2969 + "quote", 2970 + "syn 1.0.109", 2971 + ] 2972 + 2973 + [[package]] 2974 + name = "wezterm-input-types" 2975 + version = "0.1.0" 2976 + source = "registry+https://github.com/rust-lang/crates.io-index" 2977 + checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" 2978 + dependencies = [ 2979 + "bitflags 1.3.2", 2980 + "euclid", 2981 + "lazy_static", 2982 + "serde", 2983 + "wezterm-dynamic", 2984 + ] 2985 + 2986 + [[package]] 2987 + name = "winapi" 2988 + version = "0.3.9" 2989 + source = "registry+https://github.com/rust-lang/crates.io-index" 2990 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2991 + dependencies = [ 2992 + "winapi-i686-pc-windows-gnu", 2993 + "winapi-x86_64-pc-windows-gnu", 2994 + ] 2995 + 2996 + [[package]] 2997 + name = "winapi-i686-pc-windows-gnu" 2998 + version = "0.4.0" 2999 + source = "registry+https://github.com/rust-lang/crates.io-index" 3000 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3001 + 3002 + [[package]] 3003 + name = "winapi-util" 3004 + version = "0.1.11" 3005 + source = "registry+https://github.com/rust-lang/crates.io-index" 3006 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 3007 + dependencies = [ 3008 + "windows-sys 0.61.2", 3009 + ] 3010 + 3011 + [[package]] 3012 + name = "winapi-x86_64-pc-windows-gnu" 3013 + version = "0.4.0" 3014 + source = "registry+https://github.com/rust-lang/crates.io-index" 3015 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3016 + 3017 + [[package]] 3018 + name = "windows-link" 3019 + version = "0.2.1" 3020 + source = "registry+https://github.com/rust-lang/crates.io-index" 3021 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 3022 + 3023 + [[package]] 3024 + name = "windows-registry" 3025 + version = "0.6.1" 3026 + source = "registry+https://github.com/rust-lang/crates.io-index" 3027 + checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" 3028 + dependencies = [ 3029 + "windows-link", 3030 + "windows-result", 3031 + "windows-strings", 3032 + ] 3033 + 3034 + [[package]] 3035 + name = "windows-result" 3036 + version = "0.4.1" 3037 + source = "registry+https://github.com/rust-lang/crates.io-index" 3038 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 3039 + dependencies = [ 3040 + "windows-link", 3041 + ] 3042 + 3043 + [[package]] 3044 + name = "windows-strings" 3045 + version = "0.5.1" 3046 + source = "registry+https://github.com/rust-lang/crates.io-index" 3047 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 3048 + dependencies = [ 3049 + "windows-link", 3050 + ] 3051 + 3052 + [[package]] 3053 + name = "windows-sys" 3054 + version = "0.45.0" 3055 + source = "registry+https://github.com/rust-lang/crates.io-index" 3056 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3057 + dependencies = [ 3058 + "windows-targets 0.42.2", 3059 + ] 3060 + 3061 + [[package]] 3062 + name = "windows-sys" 3063 + version = "0.48.0" 3064 + source = "registry+https://github.com/rust-lang/crates.io-index" 3065 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3066 + dependencies = [ 3067 + "windows-targets 0.48.5", 3068 + ] 3069 + 3070 + [[package]] 3071 + name = "windows-sys" 3072 + version = "0.52.0" 3073 + source = "registry+https://github.com/rust-lang/crates.io-index" 3074 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3075 + dependencies = [ 3076 + "windows-targets 0.52.6", 3077 + ] 3078 + 3079 + [[package]] 3080 + name = "windows-sys" 3081 + version = "0.59.0" 3082 + source = "registry+https://github.com/rust-lang/crates.io-index" 3083 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3084 + dependencies = [ 3085 + "windows-targets 0.52.6", 3086 + ] 3087 + 3088 + [[package]] 3089 + name = "windows-sys" 3090 + version = "0.61.2" 3091 + source = "registry+https://github.com/rust-lang/crates.io-index" 3092 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 3093 + dependencies = [ 3094 + "windows-link", 3095 + ] 3096 + 3097 + [[package]] 3098 + name = "windows-targets" 3099 + version = "0.42.2" 3100 + source = "registry+https://github.com/rust-lang/crates.io-index" 3101 + checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 3102 + dependencies = [ 3103 + "windows_aarch64_gnullvm 0.42.2", 3104 + "windows_aarch64_msvc 0.42.2", 3105 + "windows_i686_gnu 0.42.2", 3106 + "windows_i686_msvc 0.42.2", 3107 + "windows_x86_64_gnu 0.42.2", 3108 + "windows_x86_64_gnullvm 0.42.2", 3109 + "windows_x86_64_msvc 0.42.2", 3110 + ] 3111 + 3112 + [[package]] 3113 + name = "windows-targets" 3114 + version = "0.48.5" 3115 + source = "registry+https://github.com/rust-lang/crates.io-index" 3116 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3117 + dependencies = [ 3118 + "windows_aarch64_gnullvm 0.48.5", 3119 + "windows_aarch64_msvc 0.48.5", 3120 + "windows_i686_gnu 0.48.5", 3121 + "windows_i686_msvc 0.48.5", 3122 + "windows_x86_64_gnu 0.48.5", 3123 + "windows_x86_64_gnullvm 0.48.5", 3124 + "windows_x86_64_msvc 0.48.5", 3125 + ] 3126 + 3127 + [[package]] 3128 + name = "windows-targets" 3129 + version = "0.52.6" 3130 + source = "registry+https://github.com/rust-lang/crates.io-index" 3131 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3132 + dependencies = [ 3133 + "windows_aarch64_gnullvm 0.52.6", 3134 + "windows_aarch64_msvc 0.52.6", 3135 + "windows_i686_gnu 0.52.6", 3136 + "windows_i686_gnullvm", 3137 + "windows_i686_msvc 0.52.6", 3138 + "windows_x86_64_gnu 0.52.6", 3139 + "windows_x86_64_gnullvm 0.52.6", 3140 + "windows_x86_64_msvc 0.52.6", 3141 + ] 3142 + 3143 + [[package]] 3144 + name = "windows_aarch64_gnullvm" 3145 + version = "0.42.2" 3146 + source = "registry+https://github.com/rust-lang/crates.io-index" 3147 + checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3148 + 3149 + [[package]] 3150 + name = "windows_aarch64_gnullvm" 3151 + version = "0.48.5" 3152 + source = "registry+https://github.com/rust-lang/crates.io-index" 3153 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3154 + 3155 + [[package]] 3156 + name = "windows_aarch64_gnullvm" 3157 + version = "0.52.6" 3158 + source = "registry+https://github.com/rust-lang/crates.io-index" 3159 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3160 + 3161 + [[package]] 3162 + name = "windows_aarch64_msvc" 3163 + version = "0.42.2" 3164 + source = "registry+https://github.com/rust-lang/crates.io-index" 3165 + checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3166 + 3167 + [[package]] 3168 + name = "windows_aarch64_msvc" 3169 + version = "0.48.5" 3170 + source = "registry+https://github.com/rust-lang/crates.io-index" 3171 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3172 + 3173 + [[package]] 3174 + name = "windows_aarch64_msvc" 3175 + version = "0.52.6" 3176 + source = "registry+https://github.com/rust-lang/crates.io-index" 3177 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3178 + 3179 + [[package]] 3180 + name = "windows_i686_gnu" 3181 + version = "0.42.2" 3182 + source = "registry+https://github.com/rust-lang/crates.io-index" 3183 + checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3184 + 3185 + [[package]] 3186 + name = "windows_i686_gnu" 3187 + version = "0.48.5" 3188 + source = "registry+https://github.com/rust-lang/crates.io-index" 3189 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3190 + 3191 + [[package]] 3192 + name = "windows_i686_gnu" 3193 + version = "0.52.6" 3194 + source = "registry+https://github.com/rust-lang/crates.io-index" 3195 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3196 + 3197 + [[package]] 3198 + name = "windows_i686_gnullvm" 3199 + version = "0.52.6" 3200 + source = "registry+https://github.com/rust-lang/crates.io-index" 3201 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3202 + 3203 + [[package]] 3204 + name = "windows_i686_msvc" 3205 + version = "0.42.2" 3206 + source = "registry+https://github.com/rust-lang/crates.io-index" 3207 + checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3208 + 3209 + [[package]] 3210 + name = "windows_i686_msvc" 3211 + version = "0.48.5" 3212 + source = "registry+https://github.com/rust-lang/crates.io-index" 3213 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3214 + 3215 + [[package]] 3216 + name = "windows_i686_msvc" 3217 + version = "0.52.6" 3218 + source = "registry+https://github.com/rust-lang/crates.io-index" 3219 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3220 + 3221 + [[package]] 3222 + name = "windows_x86_64_gnu" 3223 + version = "0.42.2" 3224 + source = "registry+https://github.com/rust-lang/crates.io-index" 3225 + checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3226 + 3227 + [[package]] 3228 + name = "windows_x86_64_gnu" 3229 + version = "0.48.5" 3230 + source = "registry+https://github.com/rust-lang/crates.io-index" 3231 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3232 + 3233 + [[package]] 3234 + name = "windows_x86_64_gnu" 3235 + version = "0.52.6" 3236 + source = "registry+https://github.com/rust-lang/crates.io-index" 3237 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3238 + 3239 + [[package]] 3240 + name = "windows_x86_64_gnullvm" 3241 + version = "0.42.2" 3242 + source = "registry+https://github.com/rust-lang/crates.io-index" 3243 + checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3244 + 3245 + [[package]] 3246 + name = "windows_x86_64_gnullvm" 3247 + version = "0.48.5" 3248 + source = "registry+https://github.com/rust-lang/crates.io-index" 3249 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3250 + 3251 + [[package]] 3252 + name = "windows_x86_64_gnullvm" 3253 + version = "0.52.6" 3254 + source = "registry+https://github.com/rust-lang/crates.io-index" 3255 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3256 + 3257 + [[package]] 3258 + name = "windows_x86_64_msvc" 3259 + version = "0.42.2" 3260 + source = "registry+https://github.com/rust-lang/crates.io-index" 3261 + checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3262 + 3263 + [[package]] 3264 + name = "windows_x86_64_msvc" 3265 + version = "0.48.5" 3266 + source = "registry+https://github.com/rust-lang/crates.io-index" 3267 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3268 + 3269 + [[package]] 3270 + name = "windows_x86_64_msvc" 3271 + version = "0.52.6" 3272 + source = "registry+https://github.com/rust-lang/crates.io-index" 3273 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3274 + 3275 + [[package]] 3276 + name = "wit-bindgen" 3277 + version = "0.51.0" 3278 + source = "registry+https://github.com/rust-lang/crates.io-index" 3279 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 3280 + dependencies = [ 3281 + "wit-bindgen-rust-macro", 3282 + ] 3283 + 3284 + [[package]] 3285 + name = "wit-bindgen-core" 3286 + version = "0.51.0" 3287 + source = "registry+https://github.com/rust-lang/crates.io-index" 3288 + checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 3289 + dependencies = [ 3290 + "anyhow", 3291 + "heck", 3292 + "wit-parser", 3293 + ] 3294 + 3295 + [[package]] 3296 + name = "wit-bindgen-rust" 3297 + version = "0.51.0" 3298 + source = "registry+https://github.com/rust-lang/crates.io-index" 3299 + checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 3300 + dependencies = [ 3301 + "anyhow", 3302 + "heck", 3303 + "indexmap", 3304 + "prettyplease", 3305 + "syn 2.0.117", 3306 + "wasm-metadata", 3307 + "wit-bindgen-core", 3308 + "wit-component", 3309 + ] 3310 + 3311 + [[package]] 3312 + name = "wit-bindgen-rust-macro" 3313 + version = "0.51.0" 3314 + source = "registry+https://github.com/rust-lang/crates.io-index" 3315 + checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 3316 + dependencies = [ 3317 + "anyhow", 3318 + "prettyplease", 3319 + "proc-macro2", 3320 + "quote", 3321 + "syn 2.0.117", 3322 + "wit-bindgen-core", 3323 + "wit-bindgen-rust", 3324 + ] 3325 + 3326 + [[package]] 3327 + name = "wit-component" 3328 + version = "0.244.0" 3329 + source = "registry+https://github.com/rust-lang/crates.io-index" 3330 + checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 3331 + dependencies = [ 3332 + "anyhow", 3333 + "bitflags 2.11.0", 3334 + "indexmap", 3335 + "log", 3336 + "serde", 3337 + "serde_derive", 3338 + "serde_json", 3339 + "wasm-encoder", 3340 + "wasm-metadata", 3341 + "wasmparser", 3342 + "wit-parser", 3343 + ] 3344 + 3345 + [[package]] 3346 + name = "wit-parser" 3347 + version = "0.244.0" 3348 + source = "registry+https://github.com/rust-lang/crates.io-index" 3349 + checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 3350 + dependencies = [ 3351 + "anyhow", 3352 + "id-arena", 3353 + "indexmap", 3354 + "log", 3355 + "semver", 3356 + "serde", 3357 + "serde_derive", 3358 + "serde_json", 3359 + "unicode-xid", 3360 + "wasmparser", 3361 + ] 3362 + 3363 + [[package]] 3364 + name = "writeable" 3365 + version = "0.6.3" 3366 + source = "registry+https://github.com/rust-lang/crates.io-index" 3367 + checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" 3368 + 3369 + [[package]] 3370 + name = "yoke" 3371 + version = "0.8.2" 3372 + source = "registry+https://github.com/rust-lang/crates.io-index" 3373 + checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" 3374 + dependencies = [ 3375 + "stable_deref_trait", 3376 + "yoke-derive", 3377 + "zerofrom", 3378 + ] 3379 + 3380 + [[package]] 3381 + name = "yoke-derive" 3382 + version = "0.8.2" 3383 + source = "registry+https://github.com/rust-lang/crates.io-index" 3384 + checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" 3385 + dependencies = [ 3386 + "proc-macro2", 3387 + "quote", 3388 + "syn 2.0.117", 3389 + "synstructure", 3390 + ] 3391 + 3392 + [[package]] 3393 + name = "zerocopy" 3394 + version = "0.8.48" 3395 + source = "registry+https://github.com/rust-lang/crates.io-index" 3396 + checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" 3397 + dependencies = [ 3398 + "zerocopy-derive", 3399 + ] 3400 + 3401 + [[package]] 3402 + name = "zerocopy-derive" 3403 + version = "0.8.48" 3404 + source = "registry+https://github.com/rust-lang/crates.io-index" 3405 + checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" 3406 + dependencies = [ 3407 + "proc-macro2", 3408 + "quote", 3409 + "syn 2.0.117", 3410 + ] 3411 + 3412 + [[package]] 3413 + name = "zerofrom" 3414 + version = "0.1.7" 3415 + source = "registry+https://github.com/rust-lang/crates.io-index" 3416 + checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" 3417 + dependencies = [ 3418 + "zerofrom-derive", 3419 + ] 3420 + 3421 + [[package]] 3422 + name = "zerofrom-derive" 3423 + version = "0.1.7" 3424 + source = "registry+https://github.com/rust-lang/crates.io-index" 3425 + checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" 3426 + dependencies = [ 3427 + "proc-macro2", 3428 + "quote", 3429 + "syn 2.0.117", 3430 + "synstructure", 3431 + ] 3432 + 3433 + [[package]] 3434 + name = "zeroize" 3435 + version = "1.8.2" 3436 + source = "registry+https://github.com/rust-lang/crates.io-index" 3437 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 3438 + 3439 + [[package]] 3440 + name = "zerotrie" 3441 + version = "0.2.4" 3442 + source = "registry+https://github.com/rust-lang/crates.io-index" 3443 + checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" 3444 + dependencies = [ 3445 + "displaydoc", 3446 + "yoke", 3447 + "zerofrom", 3448 + ] 3449 + 3450 + [[package]] 3451 + name = "zerovec" 3452 + version = "0.11.6" 3453 + source = "registry+https://github.com/rust-lang/crates.io-index" 3454 + checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" 3455 + dependencies = [ 3456 + "yoke", 3457 + "zerofrom", 3458 + "zerovec-derive", 3459 + ] 3460 + 3461 + [[package]] 3462 + name = "zerovec-derive" 3463 + version = "0.11.3" 3464 + source = "registry+https://github.com/rust-lang/crates.io-index" 3465 + checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" 3466 + dependencies = [ 3467 + "proc-macro2", 3468 + "quote", 3469 + "syn 2.0.117", 3470 + ] 3471 + 3472 + [[package]] 3473 + name = "zmij" 3474 + version = "1.0.21" 3475 + source = "registry+https://github.com/rust-lang/crates.io-index" 3476 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+18
Cargo.toml
··· 1 + [package] 2 + name = "KLBR" 3 + # version = "C0001" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + tokio = { version = "1", features = ["full"] } 8 + rusqlite = { version = "0.39", features = ["bundled"] } 9 + reqwest = { version = "0.13", features = ["json", "stream", "rustls"] } 10 + serde = { version = "1", features = ["derive"] } 11 + serde_json = "1" 12 + anyhow = "1" 13 + ratatui = "0.30" 14 + crossterm = { version = "0.29", features = ["event-stream"] } 15 + futures = "0.3" 16 + dirs = "5" 17 + tracing = "0.1.44" 18 + tracing-subscriber = "0.3.23"
+61
flake.lock
··· 1 + { 2 + "nodes": { 3 + "nixpkgs": { 4 + "locked": { 5 + "lastModified": 1775403759, 6 + "narHash": "sha256-cGyKiTspHEUx3QwAnV3RfyT+VOXhHLs+NEr17HU34Wo=", 7 + "owner": "nixos", 8 + "repo": "nixpkgs", 9 + "rev": "5e11f7acce6c3469bef9df154d78534fa7ae8b6c", 10 + "type": "github" 11 + }, 12 + "original": { 13 + "owner": "nixos", 14 + "ref": "nixpkgs-unstable", 15 + "repo": "nixpkgs", 16 + "type": "github" 17 + } 18 + }, 19 + "nixpkgs-lib": { 20 + "locked": { 21 + "lastModified": 1774748309, 22 + "narHash": "sha256-+U7gF3qxzwD5TZuANzZPeJTZRHS29OFQgkQ2kiTJBIQ=", 23 + "owner": "nix-community", 24 + "repo": "nixpkgs.lib", 25 + "rev": "333c4e0545a6da976206c74db8773a1645b5870a", 26 + "type": "github" 27 + }, 28 + "original": { 29 + "owner": "nix-community", 30 + "repo": "nixpkgs.lib", 31 + "type": "github" 32 + } 33 + }, 34 + "parts": { 35 + "inputs": { 36 + "nixpkgs-lib": "nixpkgs-lib" 37 + }, 38 + "locked": { 39 + "lastModified": 1775087534, 40 + "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=", 41 + "owner": "hercules-ci", 42 + "repo": "flake-parts", 43 + "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b", 44 + "type": "github" 45 + }, 46 + "original": { 47 + "owner": "hercules-ci", 48 + "repo": "flake-parts", 49 + "type": "github" 50 + } 51 + }, 52 + "root": { 53 + "inputs": { 54 + "nixpkgs": "nixpkgs", 55 + "parts": "parts" 56 + } 57 + } 58 + }, 59 + "root": "root", 60 + "version": 7 61 + }
+33
flake.nix
··· 1 + { 2 + inputs.parts.url = "github:hercules-ci/flake-parts"; 3 + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; 4 + 5 + outputs = 6 + inp: 7 + inp.parts.lib.mkFlake { inputs = inp; } { 8 + systems = [ "x86_64-linux" ]; 9 + perSystem = 10 + { 11 + pkgs, 12 + config, 13 + ... 14 + }: 15 + { 16 + packages.default = pkgs.callPackage ./default.nix {}; 17 + devShells = { 18 + default = pkgs.mkShell { 19 + packages = with pkgs; [ 20 + rustPlatform.rustLibSrc 21 + rust-analyzer 22 + cargo 23 + cargo-outdated 24 + rustc 25 + rustfmt 26 + clang 27 + wild 28 + ]; 29 + }; 30 + }; 31 + }; 32 + }; 33 + }
+120
src/agent.rs
··· 1 + use anyhow::Result; 2 + use std::sync::Arc; 3 + use tokio::sync::{broadcast, mpsc, RwLock}; 4 + 5 + pub type MetricsSnapshot = Arc<RwLock<Option<crate::ipc::ServerMsg>>>; 6 + 7 + use crate::{ 8 + config::Config, 9 + context::Context, 10 + interrupt::Interrupt, 11 + ipc::ServerMsg, 12 + llm::{LlmClient, Message}, 13 + memory::MemoryStore, 14 + }; 15 + 16 + pub async fn run( 17 + config: Config, 18 + llm: LlmClient, 19 + memory: MemoryStore, 20 + mut rx: mpsc::Receiver<Interrupt>, 21 + output: broadcast::Sender<ServerMsg>, 22 + snapshot: MetricsSnapshot, 23 + ) -> Result<()> { 24 + let mut ctx = Context::new(&config.anchor); 25 + let mut turn_count = 0usize; 26 + 27 + while let Some(interrupt) = rx.recv().await { 28 + let text = interrupt.to_text().to_string(); 29 + let source = interrupt.source_tag().to_string(); 30 + 31 + let memories: Vec<String> = llm 32 + .embed(&text) 33 + .await 34 + .ok() 35 + .and_then(|emb| memory.retrieve(&emb, config.memory_top_k).ok()) 36 + .unwrap_or_default() 37 + .into_iter() 38 + .map(|m| m.content) 39 + .collect(); 40 + 41 + if !memories.is_empty() { 42 + let _ = output.send(ServerMsg::Status { 43 + content: format!( 44 + "recalled {} memor{}", 45 + memories.len(), 46 + if memories.len() == 1 { "y" } else { "ies" } 47 + ), 48 + }); 49 + } 50 + 51 + ctx.push_user(&source, &text, &memories); 52 + turn_count += 1; 53 + 54 + let (tok_tx, mut tok_rx) = mpsc::channel(256); 55 + let llm2 = llm.clone(); 56 + let msgs = ctx.as_messages(); 57 + tokio::spawn(async move { 58 + let _ = llm2.stream(&msgs, tok_tx).await; 59 + }); 60 + 61 + let mut response = String::new(); 62 + 63 + while let Some((is_think, tok)) = tok_rx.recv().await { 64 + if is_think { 65 + let _ = output.send(ServerMsg::ThinkToken { content: tok }); 66 + } else { 67 + response.push_str(&tok); 68 + let _ = output.send(ServerMsg::Token { content: tok }); 69 + } 70 + } 71 + 72 + ctx.push_assistant(&response); 73 + turn_count += 1; 74 + 75 + let _ = output.send(ServerMsg::Done); 76 + let metrics = ServerMsg::Metrics { 77 + turn_count, 78 + context_chars: ctx.char_count(), 79 + watermark: config.watermark_chars, 80 + }; 81 + *snapshot.write().await = Some(metrics.clone()); 82 + let _ = output.send(metrics); 83 + 84 + if ctx.char_count() > config.watermark_chars { 85 + let _ = output.send(ServerMsg::Status { 86 + content: "compacting...".into(), 87 + }); 88 + compact(&config, &llm, &memory, &mut ctx).await; 89 + // reset turn count after compaction since context was partially evicted 90 + turn_count = ctx.turn_count(); 91 + } 92 + } 93 + 94 + Ok(()) 95 + } 96 + 97 + async fn compact(config: &Config, llm: &LlmClient, memory: &MemoryStore, ctx: &mut Context) { 98 + let drained = ctx.drain_oldest(config.compaction_keep); 99 + if drained.is_empty() { 100 + return; 101 + } 102 + 103 + let turns_text = drained 104 + .iter() 105 + .map(|m| format!("{}: {}", m.role, m.content)) 106 + .collect::<Vec<_>>() 107 + .join("\n"); 108 + 109 + let prompt = vec![Message::user(format!( 110 + "summarize these conversation turns concisely, preserving key facts and topics:\n\n{turns_text}" 111 + ))]; 112 + 113 + let Ok(summary) = llm.complete(&prompt).await else { 114 + return; 115 + }; 116 + let Ok(emb) = llm.embed(&summary).await else { 117 + return; 118 + }; 119 + let _ = memory.store(&summary, &emb); 120 + }
+35
src/config.rs
··· 1 + #[derive(Clone)] 2 + pub struct Config { 3 + /// llama-server base url 4 + pub llm_url: String, 5 + /// embedding server base url 6 + pub embed_url: String, 7 + pub llm_model: String, 8 + pub embed_model: String, 9 + /// char count before context compaction fires 10 + pub watermark_chars: usize, 11 + /// how many recent turns to preserve during compaction 12 + pub compaction_keep: usize, 13 + /// memories to inject per turn 14 + pub memory_top_k: usize, 15 + pub db_path: String, 16 + pub anchor: String, 17 + } 18 + 19 + impl Default for Config { 20 + fn default() -> Self { 21 + Self { 22 + llm_url: "http://localhost:1234".into(), 23 + embed_url: "http://localhost:1234".into(), 24 + llm_model: "google/gemma-4-26b-a4b".into(), 25 + embed_model: "nomic-embed-text-v1.5".into(), 26 + watermark_chars: 48_000, 27 + compaction_keep: 10, 28 + memory_top_k: 3, 29 + db_path: "agent.db".into(), 30 + anchor: "you are a curious, direct presence running as a persistent daemon. \ 31 + you observe what the user is doing and engage naturally." 32 + .into(), 33 + } 34 + } 35 + }
+54
src/context.rs
··· 1 + use crate::llm::Message; 2 + 3 + pub struct Context { 4 + /// never evicted - system prompt etc. 5 + anchor: Vec<Message>, 6 + /// rolling conversation turns 7 + pub turns: Vec<Message>, 8 + } 9 + 10 + impl Context { 11 + pub fn new(anchor: &str) -> Self { 12 + Self { 13 + anchor: vec![Message::system(anchor)], 14 + turns: vec![], 15 + } 16 + } 17 + 18 + /// push a user turn, optionally prepending recalled memories 19 + pub fn push_user(&mut self, source: &str, content: &str, memories: &[String]) { 20 + let text = if memories.is_empty() { 21 + content.to_string() 22 + } else { 23 + format!( 24 + "[recalled context]\n{}\n\n[{source}] {content}", 25 + memories.join("\n---\n") 26 + ) 27 + }; 28 + self.turns.push(Message::user(text)); 29 + } 30 + 31 + pub fn push_assistant(&mut self, content: &str) { 32 + self.turns.push(Message::assistant(content.to_string())); 33 + } 34 + 35 + pub fn as_messages(&self) -> Vec<Message> { 36 + self.anchor.iter().chain(&self.turns).cloned().collect() 37 + } 38 + 39 + pub fn char_count(&self) -> usize { 40 + self.turns.iter().map(|m| m.content.len()).sum() 41 + } 42 + 43 + pub fn turn_count(&self) -> usize { 44 + self.turns.len() 45 + } 46 + 47 + /// drains oldest turns for compaction, preserving the `keep` most recent 48 + pub fn drain_oldest(&mut self, keep: usize) -> Vec<Message> { 49 + if self.turns.len() <= keep { 50 + return vec![]; 51 + } 52 + self.turns.drain(..self.turns.len() - keep).collect() 53 + } 54 + }
+87
src/daemon.rs
··· 1 + use anyhow::Result; 2 + use std::sync::Arc; 3 + use tokio::{ 4 + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, 5 + net::UnixListener, 6 + sync::{broadcast, mpsc, RwLock}, 7 + }; 8 + 9 + use crate::{ 10 + interrupt::Interrupt, 11 + ipc::{sock_path, ClientMsg, ServerMsg}, 12 + }; 13 + 14 + /// last known metrics snapshot, updated by agent, read on new client connect 15 + pub type MetricsSnapshot = Arc<RwLock<Option<ServerMsg>>>; 16 + 17 + pub async fn serve( 18 + interrupt_tx: mpsc::Sender<Interrupt>, 19 + output: broadcast::Sender<ServerMsg>, 20 + snapshot: MetricsSnapshot, 21 + ) -> Result<()> { 22 + let path = sock_path(); 23 + if path.exists() { 24 + let _ = std::fs::remove_file(&path); 25 + } 26 + 27 + let listener = UnixListener::bind(&path)?; 28 + tracing::info!(sock = ?path, "daemon listening"); 29 + 30 + loop { 31 + let (stream, _) = listener.accept().await?; 32 + let tx = interrupt_tx.clone(); 33 + let bcast = output.clone(); 34 + let snapshot = snapshot.clone(); 35 + 36 + tokio::spawn(async move { 37 + if let Err(e) = handle(stream, tx, bcast, snapshot).await { 38 + tracing::error!(err = %e, "client error"); 39 + } 40 + }); 41 + } 42 + } 43 + 44 + async fn handle( 45 + sock: tokio::net::UnixStream, 46 + interrupt_tx: mpsc::Sender<Interrupt>, 47 + output: broadcast::Sender<ServerMsg>, 48 + snapshot: MetricsSnapshot, 49 + ) -> Result<()> { 50 + let mut rx = output.subscribe(); 51 + let (sock_rx, mut sock_tx) = sock.into_split(); 52 + let mut sock_rx = BufReader::new(sock_rx).lines(); 53 + 54 + // send current metrics immediately so tui doesn't start blank 55 + if let Some(metrics) = snapshot.read().await.clone() { 56 + let mut line = serde_json::to_string(&metrics)?; 57 + line.push('\n'); 58 + sock_tx.write_all(line.as_bytes()).await?; 59 + } 60 + 61 + loop { 62 + tokio::select! { 63 + line = sock_rx.next_line() => { 64 + let Some(line) = line? else { break }; 65 + let msg: ClientMsg = serde_json::from_str(&line)?; 66 + match msg { 67 + ClientMsg::Message { source, content } => { 68 + let int = match source.as_str() { 69 + "user" => Interrupt::UserMessage(content), 70 + other => Interrupt::UserMessage(format!("[{other}] {content}")), 71 + }; 72 + interrupt_tx.send(int).await?; 73 + } 74 + } 75 + } 76 + msg = rx.recv() => { 77 + let msg = msg?; 78 + tracing::info!(msg = ?msg, "received message from agent"); 79 + let mut line = serde_json::to_string(&msg)?; 80 + line.push('\n'); 81 + sock_tx.write_all(line.as_bytes()).await?; 82 + } 83 + } 84 + } 85 + 86 + Ok(()) 87 + }
+52
src/interrupt.rs
··· 1 + use tokio::sync::mpsc; 2 + 3 + #[derive(Debug, Clone)] 4 + pub enum Interrupt { 5 + UserMessage(String), 6 + // add new sources here, e.g.: 7 + // BskyPost { author: String, content: String }, 8 + // FileChanged(std::path::PathBuf), 9 + // ShellCommand(String), 10 + } 11 + 12 + impl Interrupt { 13 + pub fn to_text(&self) -> &str { 14 + match self { 15 + Interrupt::UserMessage(s) => s, 16 + // Interrupt::BskyPost { author, content } => content, 17 + } 18 + } 19 + 20 + /// source tag shown in context, lets the model know where input came from 21 + pub fn source_tag(&self) -> &str { 22 + match self { 23 + Interrupt::UserMessage(_) => "user", 24 + // Interrupt::BskyPost { .. } => "bsky", 25 + } 26 + } 27 + } 28 + 29 + /// spawn an interrupt source as a background task. 30 + /// source just needs to send Interrupts to the shared channel. 31 + /// 32 + /// example usage: 33 + /// ``` 34 + /// spawn_source(tx.clone(), |tx| async move { 35 + /// loop { 36 + /// let post = bsky_client.next_notification().await?; 37 + /// tx.send(Interrupt::BskyPost { ... }).await?; 38 + /// } 39 + /// Ok(()) 40 + /// }); 41 + /// ``` 42 + pub fn spawn_source<F, Fut>(tx: mpsc::Sender<Interrupt>, f: F) 43 + where 44 + F: FnOnce(mpsc::Sender<Interrupt>) -> Fut + Send + 'static, 45 + Fut: std::future::Future<Output = anyhow::Result<()>> + Send, 46 + { 47 + tokio::spawn(async move { 48 + if let Err(e) = f(tx).await { 49 + eprintln!("interrupt source died: {e}"); 50 + } 51 + }); 52 + }
+38
src/ipc.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + use std::path::PathBuf; 3 + 4 + /// client → daemon 5 + #[derive(Debug, Serialize, Deserialize)] 6 + #[serde(tag = "type", rename_all = "snake_case")] 7 + pub enum ClientMsg { 8 + Message { source: String, content: String }, 9 + } 10 + 11 + /// daemon → client 12 + #[derive(Debug, Serialize, Deserialize, Clone)] 13 + #[serde(tag = "type", rename_all = "snake_case")] 14 + pub enum ServerMsg { 15 + Token { 16 + content: String, 17 + }, 18 + ThinkToken { 19 + content: String, 20 + }, 21 + Done, 22 + Status { 23 + content: String, 24 + }, 25 + /// sent after each Done with current agent stats 26 + Metrics { 27 + turn_count: usize, 28 + context_chars: usize, 29 + watermark: usize, 30 + }, 31 + } 32 + 33 + pub fn sock_path() -> PathBuf { 34 + dirs::runtime_dir() 35 + .or_else(|| dirs::home_dir().map(|h| h.join(".local/share"))) 36 + .unwrap_or_else(|| PathBuf::from("/tmp")) 37 + .join("agent.sock") 38 + }
+148
src/llm.rs
··· 1 + use anyhow::Result; 2 + use futures::StreamExt; 3 + use reqwest::Client; 4 + use serde::{Deserialize, Serialize}; 5 + use serde_json::{json, Value}; 6 + use tokio::sync::mpsc; 7 + 8 + use crate::config::Config; 9 + 10 + #[derive(Clone, Debug, Serialize, Deserialize)] 11 + pub struct Message { 12 + pub role: String, 13 + pub content: String, 14 + } 15 + 16 + impl Message { 17 + pub fn system(s: impl Into<String>) -> Self { 18 + Self { 19 + role: "system".into(), 20 + content: s.into(), 21 + } 22 + } 23 + pub fn user(s: impl Into<String>) -> Self { 24 + Self { 25 + role: "user".into(), 26 + content: s.into(), 27 + } 28 + } 29 + pub fn assistant(s: impl Into<String>) -> Self { 30 + Self { 31 + role: "assistant".into(), 32 + content: s.into(), 33 + } 34 + } 35 + } 36 + 37 + /// (is_think, token) - is_think=true means reasoning_content (thinking trace) 38 + pub type StreamChunk = (bool, String); 39 + 40 + #[derive(Clone)] 41 + pub struct LlmClient { 42 + client: Client, 43 + pub config: Config, 44 + } 45 + 46 + impl LlmClient { 47 + pub fn new(config: Config) -> Self { 48 + Self { 49 + client: Client::new(), 50 + config, 51 + } 52 + } 53 + 54 + pub async fn stream( 55 + &self, 56 + messages: &[Message], 57 + tok_tx: mpsc::Sender<StreamChunk>, 58 + ) -> Result<()> { 59 + let body = json!({ 60 + "model": self.config.llm_model, 61 + "messages": messages, 62 + "stream": true, 63 + }); 64 + 65 + let mut res = self 66 + .client 67 + .post(format!("{}/v1/chat/completions", self.config.llm_url)) 68 + .json(&body) 69 + .send() 70 + .await? 71 + .bytes_stream(); 72 + 73 + let mut buf = String::new(); 74 + 75 + while let Some(chunk) = res.next().await { 76 + buf.push_str(std::str::from_utf8(&chunk?).unwrap_or("")); 77 + while let Some(nl) = buf.find('\n') { 78 + let line = buf[..nl].trim().to_string(); 79 + buf = buf[nl + 1..].to_string(); 80 + 81 + let Some(data) = line.strip_prefix("data: ") else { 82 + continue; 83 + }; 84 + if data == "[DONE]" { 85 + return Ok(()); 86 + } 87 + 88 + let Ok(v) = serde_json::from_str::<Value>(data) else { 89 + continue; 90 + }; 91 + let delta = &v["choices"][0]["delta"]; 92 + 93 + // reasoning_content comes before content during thinking 94 + if let Some(t) = delta["reasoning_content"].as_str() { 95 + if !t.is_empty() && tok_tx.send((true, t.to_string())).await.is_err() { 96 + return Ok(()); 97 + } 98 + } 99 + if let Some(t) = delta["content"].as_str() { 100 + if !t.is_empty() && tok_tx.send((false, t.to_string())).await.is_err() { 101 + return Ok(()); 102 + } 103 + } 104 + } 105 + } 106 + 107 + Ok(()) 108 + } 109 + 110 + /// non-streaming, used for compaction summaries 111 + pub async fn complete(&self, messages: &[Message]) -> Result<String> { 112 + let body = json!({ 113 + "model": self.config.llm_model, 114 + "messages": messages, 115 + "stream": false, 116 + }); 117 + let v = self 118 + .client 119 + .post(format!("{}/v1/chat/completions", self.config.llm_url)) 120 + .json(&body) 121 + .send() 122 + .await? 123 + .json::<Value>() 124 + .await?; 125 + Ok(v["choices"][0]["message"]["content"] 126 + .as_str() 127 + .unwrap_or("") 128 + .to_string()) 129 + } 130 + 131 + pub async fn embed(&self, text: &str) -> Result<Vec<f32>> { 132 + let body = json!({ "model": self.config.embed_model, "input": text }); 133 + let v = self 134 + .client 135 + .post(format!("{}/v1/embeddings", self.config.embed_url)) 136 + .json(&body) 137 + .send() 138 + .await? 139 + .json::<Value>() 140 + .await?; 141 + v["data"][0]["embedding"] 142 + .as_array() 143 + .ok_or_else(|| anyhow::anyhow!("no embedding in response"))? 144 + .iter() 145 + .map(|x| Ok(x.as_f64().unwrap_or(0.0) as f32)) 146 + .collect() 147 + } 148 + }
+60
src/main.rs
··· 1 + mod agent; 2 + mod config; 3 + mod context; 4 + mod daemon; 5 + mod interrupt; 6 + mod ipc; 7 + mod llm; 8 + mod memory; 9 + mod tui; 10 + 11 + use anyhow::Result; 12 + use std::sync::Arc; 13 + use tokio::sync::{broadcast, mpsc, RwLock}; 14 + 15 + use config::Config; 16 + 17 + #[tokio::main] 18 + async fn main() -> Result<()> { 19 + match std::env::args().nth(1).as_deref() { 20 + Some("daemon") => run_daemon().await, 21 + Some(other) => { 22 + eprintln!("unknown subcommand: {other}\nusage: agent [daemon]"); 23 + std::process::exit(1); 24 + } 25 + None => tui::run().await, 26 + } 27 + } 28 + 29 + async fn run_daemon() -> Result<()> { 30 + tracing_subscriber::fmt().init(); 31 + 32 + let config = Config::default(); 33 + let memory = memory::MemoryStore::open(&config.db_path)?; 34 + let llm = llm::LlmClient::new(config.clone()); 35 + let snapshot = Arc::new(RwLock::new(None)); 36 + 37 + let (interrupt_tx, interrupt_rx) = mpsc::channel::<interrupt::Interrupt>(32); 38 + let (output_tx, _) = broadcast::channel::<ipc::ServerMsg>(256); 39 + 40 + // --- register extra interrupt sources here --- 41 + // interrupt::spawn_source(interrupt_tx.clone(), |tx| async move { 42 + // bsky::run(tx).await 43 + // }); 44 + 45 + let agent = tokio::spawn(agent::run( 46 + config, 47 + llm, 48 + memory, 49 + interrupt_rx, 50 + output_tx.clone(), 51 + snapshot.clone(), 52 + )); 53 + let sock = tokio::spawn(daemon::serve(interrupt_tx, output_tx, snapshot)); 54 + 55 + tokio::select! { 56 + r = agent => { r??; } 57 + r = sock => { r??; } 58 + } 59 + Ok(()) 60 + }
+104
src/memory.rs
··· 1 + use anyhow::Result; 2 + use rusqlite::{params, Connection}; 3 + use std::sync::{Arc, Mutex}; 4 + 5 + pub struct Memory { 6 + pub content: String, 7 + } 8 + 9 + /// sqlite-backed episodic memory store. 10 + /// embeddings stored as raw little-endian f32 blobs, 11 + /// retrieval does brute force cosine similarity (fast enough at personal scale). 12 + #[derive(Clone)] 13 + pub struct MemoryStore(Arc<Mutex<Connection>>); 14 + 15 + impl MemoryStore { 16 + pub fn open(path: &str) -> Result<Self> { 17 + let conn = Connection::open(path)?; 18 + conn.execute_batch( 19 + " 20 + CREATE TABLE IF NOT EXISTS memories ( 21 + id INTEGER PRIMARY KEY, 22 + content TEXT NOT NULL, 23 + emb BLOB NOT NULL, 24 + ts INTEGER NOT NULL DEFAULT (unixepoch()), 25 + hits INTEGER NOT NULL DEFAULT 0 26 + ); 27 + ", 28 + )?; 29 + Ok(Self(Arc::new(Mutex::new(conn)))) 30 + } 31 + 32 + pub fn store(&self, content: &str, emb: &[f32]) -> Result<()> { 33 + let blob = f32s_to_bytes(emb); 34 + self.0.lock().unwrap().execute( 35 + "INSERT INTO memories (content, emb) VALUES (?1, ?2)", 36 + params![content, blob], 37 + )?; 38 + Ok(()) 39 + } 40 + 41 + pub fn retrieve(&self, query: &[f32], k: usize) -> Result<Vec<Memory>> { 42 + let conn = self.0.lock().unwrap(); 43 + 44 + // load recent candidates (cap at 1000 to bound brute force cost) 45 + let mut stmt = 46 + conn.prepare("SELECT id, content, emb FROM memories ORDER BY ts DESC LIMIT 1000")?; 47 + 48 + let mut scored: Vec<(f32, i64, String)> = stmt 49 + .query_map([], |row| { 50 + Ok(( 51 + row.get::<_, i64>(0)?, 52 + row.get::<_, String>(1)?, 53 + row.get::<_, Vec<u8>>(2)?, 54 + )) 55 + })? 56 + .filter_map(|r| r.ok()) 57 + .map(|(id, content, blob)| { 58 + let score = cosine(query, &bytes_to_f32s(&blob)); 59 + (score, id, content) 60 + }) 61 + .collect(); 62 + 63 + scored.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal)); 64 + 65 + let results: Vec<Memory> = scored 66 + .into_iter() 67 + .take(k) 68 + .map(|(_, id, content)| { 69 + // bump hit count + recency for recalled memories 70 + let _ = conn.execute( 71 + "UPDATE memories SET hits = hits + 1, ts = unixepoch() WHERE id = ?1", 72 + params![id], 73 + ); 74 + Memory { content } 75 + }) 76 + .collect(); 77 + 78 + Ok(results) 79 + } 80 + } 81 + 82 + fn f32s_to_bytes(v: &[f32]) -> Vec<u8> { 83 + v.iter().flat_map(|f| f.to_le_bytes()).collect() 84 + } 85 + 86 + fn bytes_to_f32s(b: &[u8]) -> Vec<f32> { 87 + b.chunks_exact(4) 88 + .map(|c| f32::from_le_bytes(c.try_into().unwrap())) 89 + .collect() 90 + } 91 + 92 + fn cosine(a: &[f32], b: &[f32]) -> f32 { 93 + if a.len() != b.len() || a.is_empty() { 94 + return 0.0; 95 + } 96 + let dot: f32 = a.iter().zip(b).map(|(x, y)| x * y).sum(); 97 + let na: f32 = a.iter().map(|x| x * x).sum::<f32>().sqrt(); 98 + let nb: f32 = b.iter().map(|x| x * x).sum::<f32>().sqrt(); 99 + if na == 0.0 || nb == 0.0 { 100 + 0.0 101 + } else { 102 + dot / (na * nb) 103 + } 104 + }
+558
src/tui.rs
··· 1 + use anyhow::Result; 2 + use crossterm::{ 3 + event::{ 4 + DisableMouseCapture, EnableMouseCapture, Event, EventStream, KeyCode, KeyEventKind, 5 + KeyModifiers, MouseEventKind, 6 + }, 7 + execute, 8 + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, 9 + }; 10 + use futures::{FutureExt, StreamExt}; 11 + use ratatui::{ 12 + backend::CrosstermBackend, 13 + layout::{Constraint, Direction, Layout}, 14 + style::{Color, Modifier, Style}, 15 + text::{Line, Span}, 16 + widgets::{Block, Borders, Paragraph, Wrap}, 17 + Terminal, 18 + }; 19 + use std::{io, ops::Not, time::Instant}; 20 + use tokio::{ 21 + io::{AsyncBufReadExt, AsyncWrite, AsyncWriteExt, BufReader}, 22 + net::UnixStream, 23 + }; 24 + 25 + use crate::ipc::{sock_path, ClientMsg, ServerMsg}; 26 + 27 + // ── message model ──────────────────────────────────────────────────────────── 28 + 29 + #[derive(Default, Clone)] 30 + struct Reason { 31 + content: String, 32 + expanded: bool, 33 + done: bool, 34 + } 35 + 36 + #[derive(Clone)] 37 + enum Role { 38 + System, 39 + User, 40 + Assistant { reason: Option<Reason>, done: bool }, 41 + } 42 + 43 + impl Role { 44 + fn is_assistant(&self) -> bool { 45 + matches!(self, Self::Assistant { .. }) 46 + } 47 + 48 + fn if_assistant<F, T>(&mut self, f: F) -> Option<T> 49 + where 50 + F: FnOnce(&mut Option<Reason>, &mut bool) -> T, 51 + { 52 + match self { 53 + Role::Assistant { reason, done } => Some(f(reason, done)), 54 + _ => None, 55 + } 56 + } 57 + } 58 + 59 + #[derive(Clone)] 60 + struct ChatMsg { 61 + role: Role, 62 + content: String, 63 + expanded: bool, 64 + } 65 + 66 + impl ChatMsg { 67 + fn user(content: String) -> Self { 68 + Self { 69 + role: Role::User, 70 + content, 71 + expanded: true, 72 + } 73 + } 74 + 75 + fn system(content: String) -> Self { 76 + Self { 77 + role: Role::System, 78 + content, 79 + expanded: true, 80 + } 81 + } 82 + 83 + fn assistant() -> Self { 84 + Self { 85 + role: Role::Assistant { 86 + done: false, 87 + reason: None, 88 + }, 89 + content: String::new(), 90 + expanded: false, 91 + } 92 + } 93 + } 94 + 95 + // ── app state ──────────────────────────────────────────────────────────────── 96 + 97 + struct App { 98 + history: Vec<ChatMsg>, 99 + scroll: usize, 100 + input: String, 101 + cursor: usize, 102 + status: String, 103 + cmd_mode: bool, 104 + viewport_h: usize, 105 + 106 + // metrics 107 + turn_count: usize, 108 + context_chars: usize, 109 + watermark: usize, 110 + stream_start: Option<Instant>, 111 + stream_tokens: usize, 112 + last_tps: f64, 113 + } 114 + 115 + impl App { 116 + fn new() -> Self { 117 + Self { 118 + history: vec![], 119 + scroll: 0, 120 + input: String::new(), 121 + cursor: 0, 122 + status: String::new(), 123 + cmd_mode: false, 124 + viewport_h: 0, 125 + turn_count: 0, 126 + context_chars: 0, 127 + watermark: 0, 128 + stream_start: None, 129 + stream_tokens: 0, 130 + last_tps: 0.0, 131 + } 132 + } 133 + 134 + fn push_char(&mut self, c: char) { 135 + self.input.insert(self.cursor, c); 136 + self.cursor += c.len_utf8(); 137 + self.cmd_mode = self.input.starts_with('/'); 138 + } 139 + 140 + fn pop_char(&mut self) { 141 + if self.cursor == 0 { 142 + return; 143 + } 144 + let mut i = self.cursor - 1; 145 + while !self.input.is_char_boundary(i) { 146 + i -= 1; 147 + } 148 + self.input.remove(i); 149 + self.cursor = i; 150 + self.cmd_mode = self.input.starts_with('/'); 151 + } 152 + 153 + fn take_input(&mut self) -> String { 154 + self.cursor = 0; 155 + self.cmd_mode = false; 156 + std::mem::take(&mut self.input) 157 + } 158 + 159 + fn scroll_down(&mut self, lines: usize) { 160 + self.scroll = self.scroll.saturating_sub(lines); 161 + } 162 + 163 + fn scroll_up(&mut self, lines: usize) { 164 + self.scroll += lines; 165 + } 166 + 167 + // gets the last assistant message 168 + fn streaming_mut(&mut self) -> Option<&mut ChatMsg> { 169 + self.history 170 + .last_mut() 171 + .filter(|m| matches!(m.role, Role::Assistant { done: false, .. })) 172 + } 173 + 174 + fn toggle_last_think(&mut self) { 175 + let Some(m) = self 176 + .history 177 + .iter_mut() 178 + .rev() 179 + .find(|m| m.role.is_assistant()) 180 + else { 181 + return; 182 + }; 183 + 184 + m.role.if_assistant(|r, _| { 185 + if let Some(r) = r { 186 + r.expanded = !r.expanded; 187 + } 188 + }); 189 + } 190 + 191 + fn get_assistant_entry(&mut self) -> &mut ChatMsg { 192 + if self.streaming_mut().is_none() { 193 + self.history.push(ChatMsg::assistant()); 194 + self.stream_start = Some(Instant::now()); 195 + self.stream_tokens = 0; 196 + } 197 + self.stream_tokens += 1; 198 + if let Some(start) = self.stream_start { 199 + let secs = start.elapsed().as_secs_f64(); 200 + if secs > 0.1 { 201 + self.last_tps = self.stream_tokens as f64 / secs; 202 + } 203 + } 204 + self.streaming_mut() 205 + .expect("we inserted assistant message above") 206 + } 207 + } 208 + 209 + // ── command handling ───────────────────────────────────────────────────────── 210 + 211 + enum Cmd { 212 + Send(String), 213 + Clear, 214 + ToggleThink, 215 + Help, 216 + Unknown(String), 217 + } 218 + 219 + fn parse_cmd(raw: &str) -> Cmd { 220 + if !raw.starts_with('/') { 221 + return Cmd::Send(raw.to_string()); 222 + } 223 + match raw[1..].splitn(2, ' ').next().unwrap_or("") { 224 + "clear" | "c" => Cmd::Clear, 225 + "think" | "t" => Cmd::ToggleThink, 226 + "help" | "h" => Cmd::Help, 227 + other => Cmd::Unknown(other.to_string()), 228 + } 229 + } 230 + 231 + fn help_lines() -> &'static str { 232 + "/clear (/c) clear chat history\n\ 233 + /think (/t) toggle last reasoning trace\n\ 234 + /help (/h) show this help\n\ 235 + pgup/dn scroll history\n\ 236 + ctrl+c quit" 237 + } 238 + 239 + // ── rendering ──────────────────────────────────────────────────────────────── 240 + 241 + fn render_history<'a>(history: &'a [ChatMsg]) -> Vec<Line<'a>> { 242 + let mut lines: Vec<Line<'a>> = vec![]; 243 + let mut was_assistant = false; 244 + for msg in history { 245 + match &msg.role { 246 + Role::System => { 247 + for line in msg.content.lines() { 248 + lines.push(Line::from(vec![Span::styled( 249 + line, 250 + Style::default() 251 + .fg(Color::DarkGray) 252 + .add_modifier(Modifier::DIM), 253 + )])); 254 + } 255 + was_assistant = false; 256 + } 257 + Role::User => { 258 + if was_assistant { 259 + lines.push(Line::raw("")); 260 + } 261 + for (i, line) in msg.content.lines().enumerate() { 262 + let prefix = if i == 0 { "you " } else { "" }; 263 + lines.push(Line::from(vec![ 264 + Span::styled(prefix, Style::default().fg(Color::Cyan)), 265 + Span::raw(line), 266 + ])); 267 + } 268 + was_assistant = false; 269 + } 270 + Role::Assistant { reason, done } => { 271 + let think_expanded = if let Some(think) = reason { 272 + let think_token = think 273 + .done 274 + .then_some("has reasoned") 275 + .unwrap_or("is reasoning..."); 276 + let klbr_span = Span::styled( 277 + "klbr", 278 + Style::default() 279 + .fg(Color::Green) 280 + .add_modifier(Modifier::DIM), 281 + ); 282 + if think.expanded { 283 + lines.push(Line::from(vec![ 284 + klbr_span, 285 + Span::styled( 286 + format!(" {think_token} ▾"), 287 + Style::default() 288 + .fg(Color::DarkGray) 289 + .add_modifier(Modifier::DIM), 290 + ), 291 + ])); 292 + for line in think.content.lines() { 293 + lines.push(Line::from(vec![Span::styled( 294 + line, 295 + Style::default().fg(Color::DarkGray), 296 + )])); 297 + } 298 + } else { 299 + lines.push(Line::from(vec![ 300 + klbr_span, 301 + Span::styled( 302 + format!(" {think_token}"), 303 + Style::default() 304 + .fg(Color::DarkGray) 305 + .add_modifier(Modifier::DIM), 306 + ), 307 + ])); 308 + } 309 + think.expanded 310 + } else { 311 + false 312 + }; 313 + if think_expanded { 314 + lines.push(Line::default()); 315 + } 316 + for (i, line) in msg.content.lines().enumerate() { 317 + let prefix = if i == 0 { "klbr " } else { "" }; 318 + lines.push(Line::from(vec![ 319 + Span::styled(prefix, Style::default().fg(Color::Green)), 320 + Span::raw(line), 321 + ])); 322 + } 323 + was_assistant = true; 324 + } 325 + } 326 + } 327 + lines 328 + } 329 + 330 + // ── main ───────────────────────────────────────────────────────────────────── 331 + 332 + pub async fn run() -> Result<()> { 333 + let path = sock_path(); 334 + if !path.exists() { 335 + tracing::error!("daemon not running, start it with `agent daemon`"); 336 + std::process::exit(1); 337 + } 338 + 339 + let sock = UnixStream::connect(&path) 340 + .await 341 + .map_err(|e| anyhow::anyhow!("could not connect: {e}"))?; 342 + let (sock_rx, mut sock_tx) = sock.into_split(); 343 + let mut srv_lines = BufReader::new(sock_rx).lines(); 344 + 345 + enable_raw_mode()?; 346 + let mut stdout = io::stdout(); 347 + execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; 348 + let mut term = Terminal::new(CrosstermBackend::new(stdout))?; 349 + let mut app = App::new(); 350 + let mut events = EventStream::new(); 351 + 352 + let draw = |term: &mut Terminal<CrosstermBackend<io::Stdout>>, app: &mut App| -> Result<()> { 353 + term.draw(|f| { 354 + let area = f.area(); 355 + let chunks = Layout::default() 356 + .direction(Direction::Vertical) 357 + .constraints([ 358 + Constraint::Min(3), 359 + Constraint::Length(3), 360 + Constraint::Length(1), 361 + ]) 362 + .split(area); 363 + 364 + let all_lines = render_history(&app.history); 365 + let chat_h = chunks[0].height.saturating_sub(2) as usize; 366 + app.viewport_h = chat_h; 367 + let total = all_lines.len(); 368 + let max_scroll = total.saturating_sub(chat_h); 369 + app.scroll = app.scroll.min(max_scroll); 370 + let scroll_top = max_scroll.saturating_sub(app.scroll) as u16; 371 + 372 + f.render_widget( 373 + Paragraph::new(all_lines) 374 + .block(Block::default().borders(Borders::ALL)) 375 + .wrap(Wrap { trim: false }) 376 + .scroll((scroll_top, 0)), 377 + chunks[0], 378 + ); 379 + 380 + let input_style = app 381 + .cmd_mode 382 + .then(|| Style::default().fg(Color::Yellow)) 383 + .unwrap_or_default(); 384 + f.render_widget( 385 + Paragraph::new(app.input.as_str()).style(input_style).block( 386 + Block::default() 387 + .borders(Borders::ALL) 388 + .title("message (/help)"), 389 + ), 390 + chunks[1], 391 + ); 392 + 393 + // status bar: left = agent status, right = metrics 394 + let tps_str = (app.last_tps > 0.0) 395 + .then(|| format!("{:.1} tok/s", app.last_tps)) 396 + .unwrap_or_default(); 397 + 398 + let ctx_pct = (app.watermark > 0) 399 + .then(|| (app.context_chars as f64 / app.watermark as f64 * 100.0) as usize) 400 + .unwrap_or(0); 401 + 402 + let context_str = if app.watermark > 0 { 403 + let remaining = app.watermark.saturating_sub(app.context_chars); 404 + // rough estimate: ~4 chars per token average 405 + // todo: fix this 406 + let tokens_left = remaining / 4; 407 + format!("ctx {ctx_pct}% (~{tokens_left} tok until compact)") 408 + } else { 409 + String::new() 410 + }; 411 + 412 + let metrics = format!( 413 + "{}{}(turns: {}){}", 414 + tps_str 415 + .is_empty() 416 + .not() 417 + .then(|| format!("{tps_str} ")) 418 + .unwrap_or_default(), 419 + context_str 420 + .is_empty() 421 + .not() 422 + .then(|| format!("{context_str} ")) 423 + .unwrap_or_default(), 424 + app.turn_count, 425 + app.status 426 + .is_empty() 427 + .not() 428 + .then(|| format!(" {}", app.status)) 429 + .unwrap_or_default(), 430 + ); 431 + 432 + f.render_widget( 433 + Paragraph::new(metrics.as_str()).style(Style::default().fg(Color::DarkGray)), 434 + chunks[2], 435 + ); 436 + })?; 437 + Ok(()) 438 + }; 439 + 440 + draw(&mut term, &mut app)?; 441 + 442 + loop { 443 + tokio::select! { 444 + Some(ev) = events.next() => { 445 + if handle_event(&mut app, ev?, &mut sock_tx).await? { 446 + break; 447 + } 448 + }, 449 + Some(line) = srv_lines.next_line().map(|r| r.transpose()) 450 + => handle_message(&mut app, line?)?, 451 + } 452 + draw(&mut term, &mut app)?; 453 + } 454 + 455 + disable_raw_mode()?; 456 + execute!( 457 + term.backend_mut(), 458 + LeaveAlternateScreen, 459 + DisableMouseCapture 460 + )?; 461 + Ok(()) 462 + } 463 + 464 + async fn handle_event<Sock: AsyncWrite + Unpin>( 465 + app: &mut App, 466 + event: Event, 467 + sock_tx: &mut Sock, 468 + ) -> Result<bool> { 469 + match event { 470 + Event::Key(k) if k.kind == KeyEventKind::Press => match (k.code, k.modifiers) { 471 + (KeyCode::Char('c'), KeyModifiers::CONTROL) => return Ok(true), 472 + (KeyCode::PageUp, _) => app.scroll_up(app.viewport_h.saturating_sub(2)), 473 + (KeyCode::PageDown, _) => app.scroll_down(app.viewport_h.saturating_sub(2)), 474 + (KeyCode::Enter, _) => { 475 + let raw = app.take_input(); 476 + if raw.is_empty() { 477 + return Ok(false); 478 + } 479 + match parse_cmd(&raw) { 480 + Cmd::Clear => { 481 + app.history.clear(); 482 + app.scroll = 0; 483 + } 484 + Cmd::ToggleThink => app.toggle_last_think(), 485 + Cmd::Help => { 486 + app.history.push(ChatMsg::system(help_lines().to_string())); 487 + } 488 + Cmd::Unknown(c) => { 489 + app.status = format!("unknown command: /{c}"); 490 + } 491 + Cmd::Send(msg) => { 492 + app.history.push(ChatMsg::user(msg.clone())); 493 + app.scroll = 0; 494 + let payload = serde_json::to_string(&ClientMsg::Message { 495 + source: "user".into(), 496 + content: msg, 497 + })? + "\n"; 498 + sock_tx.write_all(payload.as_bytes()).await?; 499 + } 500 + } 501 + } 502 + (KeyCode::Backspace, _) => app.pop_char(), 503 + (KeyCode::Char(c), _) => app.push_char(c), 504 + _ => {} 505 + }, 506 + Event::Mouse(m) => match m.kind { 507 + MouseEventKind::ScrollUp => app.scroll_up(1), 508 + MouseEventKind::ScrollDown => app.scroll_down(1), 509 + _ => {} 510 + }, 511 + _ => {} 512 + } 513 + Ok(false) 514 + } 515 + 516 + fn handle_message(app: &mut App, line: String) -> Result<()> { 517 + let msg: ServerMsg = serde_json::from_str(&line)?; 518 + match msg { 519 + ServerMsg::Token { content } => { 520 + let entry = app.get_assistant_entry(); 521 + entry.content.push_str(&content); 522 + // mark reasoning as done 523 + entry.role.if_assistant(|r, _| { 524 + if let Some(r) = r { 525 + r.done = true; 526 + } 527 + }); 528 + } 529 + ServerMsg::ThinkToken { content } => { 530 + app.get_assistant_entry().role.if_assistant(|r, _| { 531 + r.get_or_insert_with(Reason::default) 532 + .content 533 + .push_str(&content) 534 + }); 535 + } 536 + ServerMsg::Done => { 537 + // mark assistant message as done 538 + app.get_assistant_entry() 539 + .role 540 + .if_assistant(|_, done| *done = true); 541 + app.status.clear(); 542 + app.stream_start = None; 543 + } 544 + ServerMsg::Status { content } => { 545 + app.status = content; 546 + } 547 + ServerMsg::Metrics { 548 + turn_count, 549 + context_chars, 550 + watermark, 551 + } => { 552 + app.turn_count = turn_count; 553 + app.context_chars = context_chars; 554 + app.watermark = watermark; 555 + } 556 + } 557 + Ok(()) 558 + }